2009-11-05 103 views
9

我希望能够编写\bit并将其扩展为vim中的某些内容。但是,如何在缩写的左侧对反斜线进行编码?在vim缩写中使用反斜杠

我尝试了所有的这些:

:iab \bit replacement_text 
:iab <Bslash>bit replacement_text 
:iab <bs>bit replacement_text 

,但得到E474: Invalid argument所有这些。

map_backslash帮助主题建议<Bslash>,但这似乎不起作用。

+0

Aaarrgghh!这是一个饼干。我了解到,你的是一个{rhs}的东西。在{lhs}中,“\ b”(w/o引号)起作用,但当第二个字符被添加“\ bi”时,E474在那里。 “\\”和“\\ b”是可以接受的,但“\\ bi”不是。 ''\ bit“'(没有外部单引号)可以工作,但双引号是ab的一部分。就像我说的,“Aaarrgghh!” +1 – 2009-11-05 01:45:29

+0

如果你坚持这个答案@Ewan我可以投票,这将是更容易看到报价。这是有趣的东西... – Peter 2009-11-05 06:45:59

回答

9

您可以在“位”上定义您的缩写,然后测试它是否以“\”开头,如果是,则返回新文本,否则返回“位”。

function! s:Expr(default, repl) 
    if getline('.')[col('.')-2]=='\' 
    return "\<bs>".a:repl 
    else 
    return a:default 
    endif 
endfunction 

:inoreab bit <c-r>=<sid>Expr('bit', 'foobar')<cr> 

这是我在MapNoContext()中使用的那种技巧。

编辑:请参阅:h abbreviations为什么你问的问题不能直接实现。

EDIT2:它可以很容易地封装这样:

function! s:DefIab(nore, ...) 
    let opt = '' 
    let i = 0 
    while i != len(a:000) 
    let arg = a:000[i] 
    if arg !~? '<buffer>\|<silent>' 
     break 
    endif 
    let opt .= ' '.arg 
    let i += 1 
    endwhile 

    if i+2 != len(a:000) 
    throw "Invalid number of arguments" 
    endif 
    let lhs = a:000[i] 
    let rhs = a:000[i+1] 

    exe 'i'.a:nore.'ab'.opt.' '.lhs.' <c-r>=<sid>Expr('.string(lhs).', '.string(rhs).')<cr>' 
endfunction 

command! -nargs=+ InoreabBSlash call s:DefIab('nore', <f-args>) 

而且具有使用简单:

InoreabBSlash <buffer> locbit foobar 

InoreabBSlash bit foobar 
1

你可以

inoremap \bit replacementtext 

此外,如果你不喜欢的滞后像反引号`替代的领导者(标签上面对我来说)

:iab `f foobar 

,如果你不使用它们在你的代码往往

+0

这将工作,但不完全一样的方式。每等待其余的时间都会有一段烦人的停顿。尽管如此,我还是不太明白。 – sykora 2009-11-05 00:54:57

+0

是的,我自己尝试过 - 不喜欢它。 – Peter 2009-11-05 01:04:35

+0

我有这个几个IMAP(使用 =一些函数处理),你得到了暂停(它迫使你输入更快:) – michael 2009-11-05 02:03:02

0

您只能使用一个反斜杠作为前缀为缩写,如果它只有一个字符后面,那么:iab \b replacementtext将工作。

2

我建议使用两面反斜杠,VIM是高兴道:

inoreabbr \bit\ replacement_text 

请注意,我用的缩写的“诺尔”的版本,更好的是明确的,如果你不打算递归扩张。我一直使用下面的缩写很长一段时间,他们的工作很好:

inoreabbr \time\ <C-R>=strftime("%d-%b-%Y @ %H:%M")<CR> 
inoreabbr \date\ <C-R>=strftime("%d-%b-%Y")<CR> 
+0

有创意的替代品。尾部反斜杠将其转换为允许的_non-id_缩写。 – 2012-09-25 20:45:37