есть ли способ сказать VIM поместить курсор в какое-то положение после расширения аббревиатуры? Скажем, у вас есть что-то подобное в .gvimrc
iabberv <? <?=|?>
и вы хотите поместить курсор, где символ трубы будет автоматически.
есть ли способ сказать VIM поместить курсор в какое-то положение после расширения аббревиатуры? Скажем, у вас есть что-то подобное в .gvimrc
iabberv <? <?=|?>
и вы хотите поместить курсор, где символ трубы будет автоматически.
Быстрое решение, которое я бы использовал в этом случае, это вставить некоторые нажатия клавиш в аббревиатуру:
iabbrev <? <?=?><Left><Left>
Поместите курсор на два места слева, после =
.
Таким образом, вы можете использовать различные клавиши перемещения, такие как <End>
, <Home>
, или даже вернуться в обычный режим с помощью <Esc>
и командовать обычными командами обычного режима. Тогда пример будет
iabbrev <? <?=?><Esc>hha
и он делает то же, что и в первом примере. Если вы расширите аббревиатуру с пробелом, у нее будет дополнительное пространство. , с которым вы можете избавиться, используя сокращение Или раскройте с помощью <BS>
(backspace) в аббревиатуре.<C-]>
, который не оставит места.
Исправление: поскольку аббревиатура сначала расширена, и после этого вставленное пространство вам понадобится небольшая функция, найденная в справке (map.txt):
func Eatchar(pat)
let c = nr2char(getchar(0))
return (c =~ a:pat) ? '' : c
endfunc
Это лучше всего положить в .vimrc
. Теперь следующая аббревиатура будет работать полностью, как предполагалось:
:iabbrev <silent> <? <?=?><Left><Left><C-R>=Eatchar('\s')<CR>
Это немного грязно, но имеет внешний вызов функции, который удаляет пустое пространство, и оно должно работать хорошо.
Что вы хотите - это фрагменты. Я использую snipmate для этого.
Это можно сделать с помощью lh-map-tools:
"
" in {rtp}/ftpluvin/vim/vim_snippets.vim
inoreab <buffer> <silent> if
\ <C-R>=InsertSeq('if', 'if!cursorhere!\nendif!mark!')<CR>
Другие плагины предлагают аналогичную функцию.