在vim缩写中使用反斜杠

Pet*_*ter 9 vim

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

我尝试了所有这些:

:iab \bit replacement_text
:iab <Bslash>bit replacement_text
:iab <bs>bit replacement_text
Run Code Online (Sandbox Code Playgroud)

但得到E474: Invalid argument了所有这些.

map_backslash求助主题建议<Bslash>,但这似乎并没有工作.

Luc*_*tte 10

你可以在"位"来定义的缩写,然后测试,如果它是由"\"开头,如果是的话,返回新文本,或"位",否则.

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>
Run Code Online (Sandbox Code Playgroud)

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

编辑:看:h缩写为什么你问的原因不能直接实现.

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>)
Run Code Online (Sandbox Code Playgroud)

并使用简单:

InoreabBSlash <buffer> locbit foobar
Run Code Online (Sandbox Code Playgroud)

要么

InoreabBSlash bit foobar
Run Code Online (Sandbox Code Playgroud)