Использование repeat.vim - правильный подход;он позволяет вам настраивать то, что повторяется, а также предлагает функцию повторения для случаев, не охватываемых встроенной командой .
. (И мой плагин visualrepeat расширяет это до повторов в визуальном режиме.)
Если я вас правильно понял, вы хотите пропустить пользовательский запрос и просто повторно использовать предыдущий ответ при повторении. Для этого вам нужно зарегистрировать другое <Plug>
отображение с repeat#set()
, чем то, которое используется для запуска вашего плагина. Обычно я бы выглядел следующим образом:
function! s:Impl()
let l:search = input(...)
" action here, using l:search
call repeat#set("\<Plug>PeculiarMapping")
endfunction
nnoremap <silent> <Plug>PeculiarMapping :<C-u>call <SID>Impl()<CR>
if ! hasmapto('<Plug>PeculiarMapping', 'n')
nmap <Leader>p <Plug>PeculiarMapping
endif
Чтобы повторно использовать запрашиваемый l:search
при повторении, параметризовать s:Impl()
с флагом, а затем либо сохранить ввод в локальной переменной сценария,или вспомнить это. Добавьте вариант <Plug>
-mapping для repeat, который устанавливает флаг isRepeat
:
let s:search = ''
function! s:Impl( isRepeat )
if ! a:isRepeat
let s:search = input(...)
endif
" action here, using s:search
call repeat#set("\<Plug>PeculiarRepeat") " Different repeat mapping
endfunction
nnoremap <silent> <Plug>PeculiarRepeat :<C-u>call <SID>Impl(1)<CR>
nnoremap <silent> <Plug>PeculiarMapping :<C-u>call <SID>Impl(0)<CR>
if ! hasmapto('<Plug>PeculiarMapping', 'n')
nmap <Leader>p <Plug>PeculiarMapping
endif
Дополнительные комментарии
Я стараюсь избегать использования input()
, поскольку это делает команду по своей сутиинтерактивный, поэтому он не может быть повторно использован для сценариев или даже легко вызван другим отображением. Если вам просто нужно сначала получить какой-либо параметр (ы) от пользователя, прежде чем выполнять работу, я предпочитаю пользовательский :command
, который принимает аргумент (ы). Для одного параметра это просто и не требует синтаксического анализа. Для нескольких параметров я стараюсь придерживаться соглашений существующих команд Ex (самые сложные, :substitute
занимает {pattern}
, {replacement}
, [flags]
и даже [count]
);различные флаги :command
предлагают множество вариантов, и вы можете дополнительно помочь пользователю с помощью пользовательской функции завершения.
С помощью специальной команды это можно повторить с помощью @:
или истории команд, ипользователь может решить, использовать ли аргументы повторно (полностью / частично). Если вы думаете, что ввод команды занимает слишком много времени, дополнительное отображение может войти в режим командной строки, поместить команду туда, возможно, даже добавить сценарий (например, разделители ///
в :substitute
) и расположить курсор, так чтопользователь просто должен заполнить параметры и нажать <Enter>
.