在vim缩写中使用反斜杠

时间:2009-11-05 00:17:18

标签: vim

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

我尝试了所有这些:

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

但所有这些都获得E474: Invalid argument

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

5 个答案:

答案 0 :(得分:9)

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

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 :(得分:2)

我建议双方使用反斜杠,vim很高兴:

inoreabbr \bit\ replacement_text

请注意,我正在使用abbr的“nore”版本,如果您不打算进行递归扩展,最好清楚。我长期使用以下缩写并且效果很好:

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

答案 2 :(得分:1)

你可以

   inoremap \bit replacementtext

此外,如果你不喜欢滞后一个替代的领导者,比如backtick`(在我的标签上方)

   :iab `f foobar

如果您不经常在代码中使用它们

答案 3 :(得分:0)

如果缩写后面只有一个字符,则只能使用反斜杠作为缩写的前缀,因此:iab \b replacementtext将起作用。

答案 4 :(得分:0)

:set iskeyword+=\

在vimrc_tex(或只是vimrc)中效果很好。