Вопрос или проблема
В настоящее время я работаю над простым плагином проверки орфографии для Vim. У меня возникли трудности с тем, как отобразить варианты исправлений в окне быстрого исправления.
Возможно ли отобразить параметры проверки орфографии Vim z=
там?
То, что вы спрашиваете, конкретно, невозможно. Тем не менее, вы можете эмулировать нужное вам поведение, открыв собственное окно со временным буфером и заполнив его выводом spellsuggest()
.
Вам также потребуется создать ряд локальных подключений буфера для обработки взаимодействия с пользователем.
Смотрите:
:help special-buffers
:help map-local
:help spellsuggest()
Я поддерживаю этот плагин проверки орфографии для Vim более десяти лет: http://www.vim.org/scripts/script.php?script_id=135
У него всё еще есть несколько функций, которые никогда не были интегрированы в Vim.
- Он не использует окно быстрого исправления, вместо этого используется временный буфер.
- Заменяемые слова, как правило, получают более высокий рейтинг при следующем запросе предложений.
- Он использует aspell или ispell для проверки орфографии.
Если вы хотите захватить вывод Vim, вы можете использовать :redir
:
function! ShowSpell() abort
" Резервное копирование регистра назначения, чтобы пользователь никогда не заметил, что мы с ним что-то сделали.
let c_bak = @c
redir @c
silent norm! z=
redir END
let items = split(@c, "\n")
" Преобразуйте каждое предложение в элемент быстрого исправления и уберите индекс.
let items = items->map({_,v -> {'text': substitute(v, '\v.*"(.*)".*', '\1', "")}})
call setqflist(items)
let @c = c_bak
endf
:redir
часто хорошо сочетается с lazyredraw
, чтобы избежать отображения вывода, но, похоже, это не обязательно здесь с :silent
.
Хотя эта функция работает, вы можете увидеть, что она гораздо проще с spellsuggest()
:
function! ShowSpell() abort
let items = spellsuggest(expand(""))
let items = items->map({_,v -> {'text': v}})
call setqflist(items)
endf
Ответ или решение
Да, ваше желание отобразить варианты исправлений для проверки орфографии Vim в окне быстрой коррекции (quickfix) напрямую не может быть реализовано. Однако вы можете эмулировать это поведение, открыв собственное окно с буфером для заметок (scratch buffer) и заполнив его выводом функции spellsuggest()
.
Для этого вам потребуется создать несколько локальных привязок клавиш для обработки взаимодействия с пользователем. Ниже представлены некоторые шаги и примеры кода, которые могут вам помочь.
-
Использование
spellsuggest()
: Для получения предложений по исправлению орфографии используйте функциюspellsuggest()
, которая возвращает список возможных исправлений для текущего слова. -
Создание пользовательской функции: Вы можете создать специальную функцию, которая заполняет окно вашей собственной реализации списка исправлений и устанавливает его в качестве списка быстрого исправления. Вот пример такой функции:
function! ShowSpell() abort
" Получаем предложения для текущего слова
let items = spellsuggest(expand("<cword>"))
" Преобразуем каждое предложение в необходимый формат для quickfix
let items = items->map({_, v -> {'text': v}})
" Устанавливаем список быстрого исправления
call setqflist(items)
" Открываем окно быстрого исправления
copen
endf
- Маппинг клавиш: Для того чтобы пользователи могли взаимодействовать с вашими предложениями, создайте локальные маппинги клавиш, которые будут позволять им выбирать исправления.
function! SetupSpellMappings()
nnoremap <silent> <Leader>ss :call ShowSpell()<CR>
" Можно добавить другие комбинации для выбора и применения исправлений
endfunction
augroup SpellMappings
autocmd!
autocmd FileType * call SetupSpellMappings()
augroup END
- Дополнительные ссылки на документацию: Полезные команды и темы в Vim, которые могут помочь вам в разработке:
:help special-buffers
:help map-local
:help spellsuggest()
- Обратите внимание на производительность: Если вы собираетесь использовать внешние программы для проверки орфографии, такие как
aspell
илиispell
, убедитесь, что ваши маппинги не блокируют основной поток редактирования и не приводят к задержкам.
Таким образом, хотя вы и не сможете напрямую использовать окно быстрой коррекции для отображения предложений по исправлениям, вы можете элегантно обойти это ограничение, предоставив пользователю альтернативный интерфейс для работы с предложениями.