Позиция курсора в аббревиатуре VIM

есть ли способ сказать VIM поместить курсор в какое-то положение после расширения аббревиатуры? Скажем, у вас есть что-то подобное в .gvimrc

iabberv <? <?=|?> 

и вы хотите поместить курсор, где символ трубы будет автоматически.

Ответ 1

Быстрое решение, которое я бы использовал в этом случае, это вставить некоторые нажатия клавиш в аббревиатуру:

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>

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

Ответ 2

Что вы хотите - это фрагменты. Я использую snipmate для этого.

Ответ 3

Это можно сделать с помощью lh-map-tools:

"
" in {rtp}/ftpluvin/vim/vim_snippets.vim
inoreab  <buffer> <silent> if    
      \ <C-R>=InsertSeq('if', 'if!cursorhere!\nendif!mark!')<CR>

Другие плагины предлагают аналогичную функцию.