在Vim

时间:2016-09-22 15:06:06

标签: vim commenting ascii-art

是否可以在代码块周围创建ASCII注释框?

  • ASCII框应足够智能以扩展框周围 最大代码宽度。但它也应该清除任何尾随空格。
  • 请注意,它不应该在代码的开头有一个列行。
  • 在下面显示的代码中,;是注释字符。
  • 代码块可能包含注释行。
  • 工作流程可能是
    1. 以可视模式选择代码块
    2. 应用更改。

这是一个例子。

之前

  ; Convert to radians          
  theta45 = (theta + 45.)/!RADEG
  theta90 = (theta + 90.)/!RADEG
  theta   = theta / !RADEG      
  Ey = Ey * normal              

  ; Engineering shear strain    
  Gxy = shear * Exy             

; -----------------------------------------;
  ; Convert to radians                     ;
  theta45 = (theta + 45.)/!RADEG           ;
  theta90 = (theta + 90.)/!RADEG           ;
  theta   = theta / !RADEG                 ;
  Ey = Ey * normal                         ;
                                           ;
  ; Engineering shear strain               ;
  Gxy = shear * Exy                        ;
; -----------------------------------------;

到目前为止我尝试了什么

'<,'>s/^\(\s*\)\(.*\)$/\=join([submatch(1), ';', submatch(2), repeat('-', 50-len(submatch(1)) - len(submatch(2))), ';'], '')

注意我首先选择了一个视觉块。

有关的问题

  • 它为每一行添加' - '字符,而不是第一行和最后一行
  • 从第一行开始到最后一行结束,我更喜欢在所选行之前和之后有一个块。
  • 不删除尾随空格。
  • 由于我启用了搜索高亮显示,因此在操作后会突出显示整个视觉块。

以下是它的外观:

  ;; Convert to radians          ------------------;
  ;theta45 = (theta + 45.)/!RADEG------------------;
  ;theta90 = (theta + 90.)/!RADEG------------------;
  ;theta   = theta / !RADEG      ------------------;
  ;Ey = Ey * normal              ------------------;
;--------------------------------------------------;
  ;; Engineering shear strain    ------------------;
  ;Gxy = shear * Exy       ------------------------;

虽然它与我想要得到的并不是很接近。我只能做到这一点!

感谢您的阅读和帮助。

2 个答案:

答案 0 :(得分:1)

这个怎么样:

<esc>'>o;<esc>'<O;<esc>v'>j:norm 51A <C-v><esc>51|Dr;<cr>:'<s/ /-/g<cr>:'>&&<cr>

说明:

首先,我们需要添加额外的行。所以我们<esc>视觉模式,跳到我们之前选择的结尾并添加一个带分号的换行符。 '>o;<esc>。然后,跳回上一个选择的开头,并向上添加一个带分号的换行符'<O;<esc>。现在,我们需要在此行上启动可视模式,跳转到上一行,再添加一行v'>j。现在,缓冲区看起来像这样:

;
Here
are
a whole bunch of
uneven
lines
;

并且它都是视觉选择的。然后,我们需要将每一行填充到50个空格。所以,

:norm 51A <C-v><esc>51Dr;

首先添加51个空格,然后跳转到第51列,删除到最后,并用分号替换第50个。现在我们的缓冲区看起来像这样:

;                                                ;
Here                                             ;
are                                              ;
a whole bunch of                                 ;
uneven                                           ;
lines                                            ;
;                                                ;

现在,我们只是在选择的开头用空格代替短划线:

:'<s/ /-/g<cr>

并在选择结尾处执行相同的替换:

:'>&&<cr>

现在缓冲区看起来像这样:

;-------------------------------------------------;
;Here                                             ;
;are                                              ;
;a whole bunch of                                 ;
;uneven                                           ;
;lines                                            ;
;-------------------------------------------------;

显然,为方便起见,您可能希望将其包装在映射,函数或宏中。

答案 1 :(得分:0)

这是一个改进(分为几行以便于阅读):

:'<,'>s/.*/\=submatch(0) . repeat(' ', 50-len(submatch(0)) + 2) . ';'/ |
\   '>put ='; ' . repeat('-', 50) . ';' |
\   '<put! ='; ' . repeat('-', 50) . ';' |
\   nohlsearch
  • 要添加块的行,请使用单独的命令(:put);您可以使用视觉选择标记('<'>)来解决选择的边界问题。表达式寄存器=允许生成行。
  • :nohlsearch清除搜索突出显示

结果如下:

; --------------------------------------------------;
  ; Convert to radians                              ;
  theta45 = (theta + 45.)/!RADEG                    ;
  theta90 = (theta + 90.)/!RADEG                    ;
  theta   = theta / !RADEG                          ;
  Ey = Ey * normal                                  ;
                                                    ;
  ; Engineering shear strain                        ;
  Gxy = shear * Exy                                 ;
; --------------------------------------------------;

仍有一些问题:

  • 长度计算仅适用于可打印的非Tab ASCII字符。
  • 宽度是硬编码的。最好先确定块的最大长度。

如果您真的想进一步发展,我建议的第一步是将所有命令放入:function

您可能还想查看我的AlignFromCursor plugin,它解决了类似的问题(如果只是为了实现问题的完全复杂性: - )。

最后,我要提一下,这种基于对齐的格式化是高维护的(也可以考虑一下可能需要编辑的非Vim同事),最好避免使用。