理解:iabbrev <buffer> iff if:<left>

时间:2016-04-18 19:09:13

标签: vim

我输入了:autocmd FileType python :iabbrev <buffer> iff if:<left> tutorial告诉我。

输出

  

如果:

为什么if和“:”之间有空格?

2 个答案:

答案 0 :(得分:1)

我假设您在键入iff后使用空格键?如果是这样,那是因为<left>。这是将光标定位在左侧,即f和&#34;之间:&#34;。接受空格键后,光标位于两个字符之间,因此它们之间会留一个空格。您可以在没有<left>的情况下尝试该命令,看看是否符合您的要求。如果没有,您需要让我们确切地知道您正在寻找我们能够帮助您的输出。如果您还没有,请参阅::help abbrev

答案 1 :(得分:1)

缩写由非关键字(例如.<cr><space>等),<esc><c-]>触发。单独键入iff将不足以扩展缩写。您输入的iff<space>足以扩展缩写<space>放入您的扩展缩写中。您可以使用<c-]>扩展缩写而不插入任何额外字符。例如iff<c-]>

Eatchar

然而,我发现使用<c-]>没有吸引力。 Vim的文档为我们提供了另一种选择,Eatchar函数。此函数将使用匹配某些模式的键而不输出它。

function! Eatchar(pat)
  let c = nr2char(getchar(0))
  return (c =~ a:pat) ? '' : c
endfunction

iabbr <buffer> iff if:<left><c-r>=Eatchar('\s')<cr>

Rails.vim喜欢缩写

您可以更进一步,并制作Rails.vim - 仅在<tab>或提供的模式上展开的esque缩写。可以将它们视为轻量级代码段。

function! RailsExpand(root, good, ...)
  let c = nr2char(getchar(0))
  if c == "" || c =~ (a:0 ? a:1 : "\t")
    return a:good
  else
    return a:root . c
  endif
endfunction

iabbr <buffer> iff <c-r>=RailsExpand('iff', "if:\<left>")<cr>

现在iff<tab>会正常展开。但是,定义这样的缩写是一团糟。

function! Railsabbrev(root, good)
  let good = substitute(a:good, '[\"|]', '\\&', "g")
  let good = substitute(good, '<', '\\<lt>', "g")
  let root = substitute(a:root, '[\"|]', '\\&', "g")
  let root = substitute(root, '<', '\\<lt>', "g")
  execute "iabbr <buffer> " . a:root . " <c-r>=RailsExpand(\"" . root . "\", \"" . good . "\")<cr>"
endfunction
command! -nargs=* Railsabbrev call Railsabbrev(<f-args>)

现在,您可以使用:Railsabbrev来定义<tab>扩展缩写。例如:

Railsabbrev iff if:<left>

片段

有时缩写太简单或太棘手,无法维持多行扩展。如果是这种情况,我建议你寻找一个好的代码片段插件。好的选择是UltiSnipsvim-snipmate。查看有关如何扩展和创建自己的代码段的文档。

更多帮助

:h Abbreviations
:helpg Eatchar