在vim缩写中使用反斜杠

13
我希望能够在vim中键入\bit并将其扩展为其他内容。但是,如何在缩写的左侧编码反斜杠?我已经尝试了所有以下方法:
:iab \bit replacement_text
:iab <Bslash>bit replacement_text
:iab <bs>bit replacement_text

但是对于所有这些内容,我得到了E474:无效参数

map_backslash帮助主题建议使用<Bslash>,但似乎没有起作用。


啊啊啊!这是个棘手的问题。我了解到,你的<Bslash>是一个{rhs}的东西。在{lhs}中,"\b"(不带引号)可以工作,但是当第二个字符添加"\bi"时会出现E474。 "\"和"\b"是可以接受的,但"\bi"不行。'"\bit"'(不带外部单引号)可以工作,但双引号是ab的一部分。就像我说的,"啊啊啊!"+1 - Ewan Todd
如果你把这个放在一个回答里,@Ewan,我可以投票支持它,这样引用就更容易看到了。这是有趣的东西... - Peter
6个回答

13
你可以在“bit”上定义缩写,然后测试它是否被“”所跟随,如果是,则返回新文本,否则返回“bit”。
function! s:Expr(default, repl) expr
  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,了解为什么无法直接实现你所要求的内容。

编辑2:可以通过以下方式轻松封装:

function! s:DefIab(nore, ...) abort
  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

3
:set iskeyword+=\

在 vimrc_tex(或仅 vimrc)中运作得非常完美。

这个完美运行!它会在其他地方引起任何问题吗? - ahelwer
这会产生副作用,因此请参阅 :help 'isk' 以确定是否适合您。 - haridsv

3

我建议在两侧使用反斜杠,这样vim会更加愉快:

inoreabbr \bit\ replacement_text

请注意,我正在使用缩写的“nore”版本,如果您不打算进行递归扩展,则最好明确。 我已经使用以下缩写很长时间了,它们非常有效:

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

创新的替代方案。尾部反斜杠将其转换为允许的非标识符缩写。 - Ingo Karkat

1

你可以

   inoremap \bit replacementtext

如果您不喜欢延迟,可以选择另一种领导者,例如反引号 `(对我来说在制表符上方)

   :iab `f foobar

如果你的代码中并不经常使用它们


这样做是可行的,但效果不完全一样。每个 \ 后都会有一个烦人的暂停等待其余部分。虽然我还没有看到解决方法。 - sykora
我有这个用于一些imap(使用<cr>进行某些函数处理),你可以通过暂停来克服它(它会强迫你更快地输入 :))。 - michael

1

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


0
我尝试了几种转义序列,试图在我的缩写前面添加逗号,但都没有成功(\,,<,>,),以便得到类似于:iab ,myabbr的结果。有人提出的解决方案是在字符串末尾添加两个逗号,但我觉得这种方法不够自然。
这可能不是一个"编程"解决方案,但最终给我带来了心灵的平静,即在开头添加一个代表逗号的c,就像这样:iab cmyabbr。这种方法保留了我的思维过程,对我来说在操作系统的其他应用程序中保持文本替换的一致性非常重要,比如使用,myabbr。
如果这种简单的方法对您有用,我建议您添加类似于:iab bsmyabbr的内容,其中bs是所需反斜杠的助记符。幸运的是,如果您偶然遇到包含该缩写的字符串,它不会触发该缩写,它只会在完全匹配时扩展,避免了之前在:h abbreviations中解释的限制。
希望对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接