Ответ 1
Возможно, это не тот ответ, который вы ищете, но я не мог удержаться от написания VIM script для этого. Я положил его в свой .vimrc, и он работает для меня:
map ; :call Semicolon()<CR>
function Semicolon()
let s:pos1 = getpos(".")
normal! ;
let s:pos2 = getpos(".")
if s:pos1 == s:pos2
normal! 2;
endif
endfunction
Основная идея состоит в том, что ;
не будет перемещаться в следующее совпадение, но 2;
будет (если есть совпадение). script поддерживает ;
после любого из tTfF
. Самый простой способ реализовать команду ,
- написать для нее аналогичную функцию.
ИЗМЕНИТЬ Изменено script после прекрасного предложения Люка
EDIT2
Хорошо, эти вещи всегда сложнее, чем я изначально думал. Текущее отображение имеет следующие проблемы:
- Предположим, что вы выполнили поиск, например
tr
. Теперь что делатьd;
илиc;
? Насколько мне известно, они должны удалить или изменить до первогоr
не второго. Это можно решить, выполнив только отображение для нормального и визуального режима, а не для режима ожидания оператора. - Текущее отображение не работает в визуальном режиме. то есть, если вы наберете
v;;;;
после первого;
, редактор больше не будет в визуальном режиме (из-за:call
). Это можно решить, вызвав функцию, используя@=
вместо:call
.
Итак, теперь я получаю следующее в моем .vimrc(я также сделал одну функцию для ,
и ;
):
" Remap ; and , commands so they also work after t and T
" Only do the remapping for normal and visual mode, not operator pending
" Use @= instead of :call to prevent leaving visual mode
nmap ; @=FixCommaAndSemicolon(";")<CR>
nmap , @=FixCommaAndSemicolon(",")<CR>
vmap ; @=FixCommaAndSemicolon(";")<CR>
vmap , @=FixCommaAndSemicolon(",")<CR>
function FixCommaAndSemicolon(command)
let s:pos1 = getpos(".")
execute "normal! " . a:command
let s:pos2 = getpos(".")
if s:pos1 == s:pos2
execute "normal! 2" . a:command
endif
return ""
endfunction