代码之家  ›  专栏  ›  技术社区  ›  Peter

在VIM缩写中使用反斜杠

vim
  •  9
  • Peter  · 技术社区  · 15 年前

    我想能写 \bit 把它扩展到vim中的某个地方。但是,如何在缩写词的左侧对反斜杠进行编码?

    我尝试了所有这些:

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

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

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

    5 回复  |  直到 6 年前
        1
  •  9
  •   Luc Hermitte    15 年前

    您可以在“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
    
        2
  •  2
  •   haridsv    15 年前

    我建议在两边使用反斜杠,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>
    
        3
  •  1
  •   michael    15 年前

    你可以

       inoremap \bit replacementtext
    

    另外,如果你不喜欢滞后,可以选择一个替代的领导者,比如“倒勾”(在我的标签上面)

       :iab `f foobar
    

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

        4
  •  0
  •   Andrew Aylett    15 年前

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

        5
  •  0
  •   Sterling Archer    6 年前
    :set iskeyword+=\
    

    在Vimrc中,Tex(或者只是Vimrc)工作得很好。