VIM脚本:用注释字符包围多行注释

4

在我工作的地方,对于头部注释样式(包括文件内的主要新代码段),我们采用以下标准:

##################################
# This is a multiline comment    #
# and we've surrounded it by the #
# comment symbol.                #
##################################

当注释十分冗长(通常在描述头部中),这会花费很长时间。我希望自动化这么一个微不足道的任务。我的目标是编写一个脚本,允许我选择一段范围(在视觉模式下),输入命令和注释字符,然后将选定行封装在框中,如上所示。我尝试过编写VIM脚本,但老实说,由于我以前从未编写过VIM脚本,我的代码一塌糊涂,因此我认为发布它实际上会有害于这个项目。

您有任何建议如何构建这个功能吗?


1
那个“公司标准”很难维护;即使在非常强大的Vim中,你需要一个复杂的函数来完成这个任务,在其他编辑器中也不会更容易/自动化。至少要删除尾部对齐的#字符;这样格式化就会变得更容易。 - Ingo Karkat
@alaprise FYI: https://github.com/sk1418/blockit :) - Kent
2个回答

9

您不需要“分钟”来完成这项工作。使用vim的ctrl-v块选择,再结合I或cr(替换),您可以轻松完成此操作。但是,如果您每天需要执行100次此操作,则可以使用以下小函数:

let g:wrap_char = '#'
function! WrapThem() range
    let lines = getline(a:firstline,a:lastline)
    let maxl = 0
    for l in lines
        let maxl = len(l)>maxl? len(l):maxl
    endfor
    let h = repeat(g:wrap_char, maxl+4)
    for i in range(len(lines))
        let ll = len(lines[i])
        let lines[i] = g:wrap_char . ' ' . lines[i] . repeat(' ', maxl-ll) . ' ' . g:wrap_char
    endfor  
    let result = [h]
    call extend(result, lines)
    call add(result,h)
    execute a:firstline.','.a:lastline . ' d'
    let s = a:firstline-1<0?0:a:firstline-1
    call append(s, result)
endfunction

在获取该文件时,请注意:

  • g:wrap_char 可以设置任何字符作为边框,这里我使用了 #.
  • 您可以选择需要包裹的行并用该字符进行包裹
  • 您可以通过调用函数在命令行中给定范围
  • 您可以创建自己的命令作为该函数的包装器或者创建映射

下面是一个小演示:

enter image description here


你使用什么来创建GIF?这太棒了! - alfredodeza
这太棒了,我在查看您的源代码时学到了很多。非常感谢您为我准备这个! - Andrew LaPrise
需要注意的是,这仅适用于可打印的ASCII字符。制表符或任何非ASCII字符都会破坏右对齐。len()是字节长度;您需要使用strdisplaywidth()代替! - Ingo Karkat
@IngoKarkat,你说得完全正确。非常感谢你指出来。 - Kent
@alfredodeza 这是 Byzanz,使用了我自己的包装器:https://github.com/sk1418/myScripts/blob/master/shell/recWin.sh - Kent

0

如果这些插件已经具备所需的功能,我建议您深入研究NERDcommentertcomment。如果没有,它们的源代码可以作为一个很好的起点。


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