如何在VIM中使用Snip()函数

时间:2013-01-14 15:24:10

标签: vim

我想如何使用下面描述的latex包中的imaps.vim插件中包含的snip()函数:

Snip:在文本块{{{的上方和下方放置一个剪刀字符串  说明:

这会在视觉上方和下方放置一个字符串“--------%< ---------”    选定的一行。 “撕裂”字符串的长度取决于    所选范围内的最大字符串长度。这在美学上更多    令人愉快的替代品,而不是硬编码长度。

function! <SID>Snip() range
    let i = a:firstline
    let maxlen = -2
    " find out the maximum virtual length of each line.
    while i <= a:lastline
      exe i
      let length = virtcol('$')
      let maxlen = (length > maxlen ? length : maxlen)
      let i = i + 1
    endwhile
    let maxlen = (maxlen > &tw && &tw != 0 ? &tw : maxlen)
    let half = maxlen/2
    exe a:lastline
    " put a string below
    exe "norm! o\<esc>".(half - 1)."a-\<esc>A%<\<esc>".(half - 1)."a-"
    " and above. its necessary to put the string below the block of lines
    " first because that way the first line number doesnt change...
    exe a:firstline
    exe "norm! O\<esc>".(half - 1)."a-\<esc>A%<\<esc>".(half - 1)."a-"
endfuntion

1 个答案:

答案 0 :(得分:0)

请参阅Snip()imaps.vim定义后面的行:

com! -nargs=0 -range Snip :<line1>,<line2>call <SID>Snip()

这定义了命令Snip,可以在任何范围内调用。在可视模式下,当您输入命令时,vim会自动插入范围'<,'>,因此键入:然后Snip,结果为:'<,'>Snip,将调用该函数目前的选择。

请注意,您也可以手动指定范围。例如,:1,5 Snip将剪切第1行到第5行,:'m,'n Snip将从标记m剪切为标记n,而:Snip将仅应用于当前行

为了避免每次都输入:Snip,您可以将此命令映射到您选择的键。例如,您可以在可视模式下映射z以在当前选择上调用Snip,如下所示:

vnoremap z :Snip<CR>