COREYJA — Предложения по правописанию VIM с fzf

Используйте fzf, чтобы показать варианты правописания VIM и переопределить встроенный z= ярлык

function! FzfSpellSink(word) exe 'normal! "_ciw'.a:word
endfunction
function! FzfSpell() let suggestions = spellsuggest(expand("<cword>")) return fzf#run({'source': suggestions, 'sink': function("FzfSpellSink"), 'down': 10 })
endfunction
nnoremap z= :call FzfSpell()<CR>

Фон

Недавно я хотел добавить проверку орфографии в VIM и наткнулся на эту замечательную статью ThoughtBot: Проверка орфографии Vim это заставило меня начать. Эта статья показала мне, как включить проверку орфографии, а также включить ее для определенных файлов. Вот фрагменты из .vimrc которые непосредственно вдохновлены этим сообщением в блоге.

autocmd BufRead,BufNewFile *.md setlocal spell spelllang=en_us
autocmd FileType gitcommit setlocal spell spelllang=en_us
set complete+=kspell

Проблема

Это хорошо служило мне некоторое время, но когда я сталкивался со словами с ошибками, мне часто приходилось искать лучший способ их заменить.

VIM имеет встроенное решение для этого в виде z= Сочетание клавиш. Это берет текущее слово под курсором и показывает предложения по написанию, где выбор выбора заменит текущее слово. Это функциональность, которую я хотел сохранить, но мне не понравился интерфейс, в котором появлялись предложения. Они занимают весь экран VIM и заставляют вас выбирать, вводя число, соответствующее нужному слову. я большой поклонник фзфи я хотел использовать это для предложений по правописанию!

Решение

Первое, что мне понадобилось, это список вариантов написания слова под текущим курсором. Получить текущее слово достаточно просто с помощью expand('<cword>') так что теперь мне просто нужно было получить предложения по правописанию для него. После небольшого копания 1 Я нашел функцию VIM spellsuggest. Эта функция принимает слово, для которого мы хотим получить предложения, в качестве своих первых аргументов. Он также принимает необязательные второй и третий аргументы, которые мы в настоящее время не используем. Второй аргумент — это количество возвращаемых предложений, по умолчанию — 25. Третий аргумент — это флаг, указывающий, следует ли фильтровать только слова, написанные с заглавной буквы.

spellsuggest(expand('<cword>'))

Так что теперь я мог использовать приведенную выше команду, чтобы получить список вариантов правописания VIM. Следующим шагом было заставить fzf позволить мне выбрать вариант из этого списка.

В репозитории fzf есть Прочти меня в котором подробно описано, как использовать fzf в VIM. Больше всего меня интересовало, как использовать fzf#run функция, которая является основной функцией для вызова fzf. Это может принимать список VIM в качестве входных данных, поэтому он очень хорошо сочетается со списком вариантов правописания, которые мы уже создали. Мы передаем это как source к fzf#run. Другим важным параметром является sink который сообщает fzf, что делать после того, как мы выбрали предложение. Теперь пришло время заменить слово под курсором на наше предложение! Один из принятых типов для sink является ссылкой на функцию VIM, поэтому мне нужна была еще одна функция для вызова в качестве обратного вызова, которая будет отвечать за фактическую замену слова под курсором. Пока имеем следующее

function! FzfSpell() let suggestions = spellsuggest(expand("<cword>")) return fzf#run({'source': suggestions, 'sink': function("FzfSpellSink"), 'down': 10 })
endfunction

Для этого мы можем использовать команду VIM ciw изменить текущее слово на то, что мы выбрали. Чтобы выполнить это из vimscript, мы используем exe а также normal! дает нам следующее. Здесь используется обычный режим ciw и отправляет старое значение в регистр черной дыры "_затем вставляется новое слово.

function! FzfSpellSink(word) exe 'normal! "_ciw'.a:word
endfunction

Последнее, что нам нужно, это сочетание клавиш, чтобы я мог быстро получить к нему доступ. Я хочу использовать это вместо значения по умолчанию z= поведение, поэтому я решил просто переназначить этот ярлык

nnoremap z= :call FzfSpell()<CR>

И, наконец, собрав все воедино, мы имеем… :drumroll:

function! FzfSpellSink(word) exe 'normal! "_ciw'.a:word
endfunction
function! FzfSpell() let suggestions = spellsuggest(expand("<cword>")) return fzf#run({'source': suggestions, 'sink': function("FzfSpellSink"), 'down': 10 })
endfunction
nnoremap z= :call FzfSpell()<CR>

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *