答案 0 :(得分:1)
我假设您在键入iff
后使用空格键?如果是这样,那是因为<left>
。这是将光标定位在左侧,即f和&#34;之间:&#34;。接受空格键后,光标位于两个字符之间,因此它们之间会留一个空格。您可以在没有<left>
的情况下尝试该命令,看看是否符合您的要求。如果没有,您需要让我们确切地知道您正在寻找我们能够帮助您的输出。如果您还没有,请参阅::help abbrev
。
答案 1 :(得分:1)
缩写由非关键字(例如.
,<cr>
,<space>
等),<esc>
或<c-]>
触发。单独键入iff
将不足以扩展缩写。您输入的iff<space>
足以扩展缩写,将<space>
放入您的扩展缩写中。您可以使用<c-]>
扩展缩写而不插入任何额外字符。例如iff<c-]>
然而,我发现使用<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 - 仅在<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>
有时缩写太简单或太棘手,无法维持多行扩展。如果是这种情况,我建议你寻找一个好的代码片段插件。好的选择是UltiSnips或vim-snipmate。查看有关如何扩展和创建自己的代码段的文档。
:h Abbreviations
:helpg Eatchar