Как использовать сокращения в Vim с аргументами? - PullRequest
3 голосов
/ 24 июня 2010

В Vim вы можете сделать так, чтобы каждый раз, когда вы пишете «FF» при изменении режима вставки для некоторого кода, используйте:

:iab FF for ( int i = 0 ; i < n ; i++ )

Но есть ли способ использовать это с аргументами?Что-то вроде C's #defines, поэтому, если я напишу

FF(e, 10)

, оно становится:

for ( int e = 0 ; e < 10 ; e++ )

Ответы [ 4 ]

7 голосов
/ 24 июня 2010

Взгляните на SnipMate (плагин vim).Вы не получите аргументы, но при расширении аббревиатуры это позволяет вам перемещаться по изменяемым областям.В примере for вы сначала попадете на i, можете изменить его на e, и он изменит его на e во всех областях объявления for.Затем просто перейдите к следующей области, которую вы хотите изменить.

Из документов:

snipMate.vim призван стать ненавязчивым, лаконичным vim-скриптом, который реализует некоторые из TextMateфрагменты функций в Vim.Фрагмент - это фрагмент часто набираемого текста, который вы можете вставить в документ, используя триггерное слово, за которым следует.

Например, в файле C с использованием установки по умолчанию snipMate.vim, если вы наберете«for» в режиме вставки расширяет типичный цикл for в C:

for (i = 0; i < count; i++) {

}

Чтобы перейти к следующему элементу в цикле, просто перейдите к нему;если есть повторяющийся код, такой как переменная «i» в этом примере, вы можете просто начать печатать, как только он выделен, и все совпадения, указанные во фрагменте, будут обновлены.

Ниже приведено хорошее полезное изменение переназначения tab и s-tab на c-d и c-a, если вы не хотите потерять функциональность tab~/.vim/after/plugin/snipMate.vim):

"""ino <silent> <tab> <c-r>=TriggerSnippet()<cr>
"""snor <silent> <tab> <esc>i<right><c-r>=TriggerSnippet()<cr>
"""ino <silent> <s-tab> <c-r>=BackwardsSnippet()<cr>
"""snor <silent> <s-tab> <esc>i<right><c-r>=BackwardsSnippet()<cr>
"""ino <silent> <c-r><tab> <c-r>=ShowAvailableSnips()<cr>
ino <silent> <c-d> <c-r>=TriggerSnippet()<cr>
snor <silent> <c-d> <esc>i<right><c-r>=TriggerSnippet()<cr>
ino <silent> <c-a> <c-r>=BackwardsSnippet()<cr>
snor <silent> <c-a> <esc>i<right><c-r>=BackwardsSnippet()<cr>
ino <silent> <c-r><tab> <c-r>=ShowAvailableSnips()<cr>
2 голосов
/ 24 июня 2010

Вы можете включить определения функций в сокращения, но они не могут принимать аргументы.Это пример из vimdocs:

func Eatchar(pat)
   let c = nr2char(getchar(0))
   return (c =~ a:pat) ? '' : c
endfunc
iabbr <silent> if if ()<Left><C-R>=Eatchar('\s')<CR>

Полагаю, вы могли бы проанализировать выражение аббревиатуры в функции, но я не уверен, что вы можете также включить такие символы, как скобки, в аббревиатуру.Может быть, что-то здесь даст вам представление.

Edit: Вы всегда можете сделать что-то вроде этого:

:iab for() for(int i = 0; i < ; i++)<C-o>T<

Что не имеет аргументаавтозаполнение, конечно, но позволяет сразу же начать его набирать.

1 голос
/ 14 января 2019

у меня сработало:

iab FF <c-o>:FF
com -nargs=* FF call s:FF(<f-args>)
fu s:FF(i, n)
    let t = "for (int a = 0; a < b; ++a) {\e"
    let t1 = substitute(t, 'a', a:i, 'g')
    exe 'normal! A'.substitute(t1, 'b', a:x, 'g')
    exe "normal o\<space>\<BS>\e"
endf

в режиме вставки FF e 10<cr> будет for (int e = 0; e < 10; ++e) {<cr>.

0 голосов
/ 25 июня 2010

mu-template поддержка интерактивных шаблонов.С его помощью вы можете либо что-то спросить у пользователя, либо повторно использовать любую переменную, применить к ней вычисления, если вы что (обнаружение того, что i уже используется в текущей области действия выполнимо), и использовать результат в тексте, который вы будетерасширить.

...