0

部分是为了练习,部分是为了个人使用,我希望能够进入可视模式,选择一些行,然后点击“,”,然后切换评论。(我知道 NerdCommenter 存在,但我想要一些简单的东西,没有什么花哨的 - 再说一遍,这也是练习。)

我了解到您可以使用 '&filetype' 来访问文件类型,而 '.' 连接字符串,==# 是区分大小写的字符串比较,=~ 是正则表达式匹配。我还了解到 getline('.') 获取视觉模式突出显示的行(如果多行突出显示,则每行)。

这是我的(有缺陷的)

.vimrc

vnoremap , :call ToggleComment()<CR>
function! ToggleComment()
  "Choose comment string based on filetype.
  let comment_string = ''
  if &filetype ==# 'vim'
    let comment_string = '"'
  elseif &filetype ==# 'cpp'
    let comment_string = '\/\/'
  endif

  let line = getline('.')
  if line =~ '^' . comment_string
    "Comment.
    " How could I do the equivalent of "shift-I to go to the beginning of the
    " line, then enter comment_string"?
  else
    "Uncomment. This is flawed too. Maybe I should just go to the beginning of
    "the line and delete a number of characters over?
    execute 's/^' . comment_string . '//'
  endif
endfunction

对于取消注释的情况,我得到的一件事是,无论该行是否被注释,是

Pattern not found: ^"

(我在我的 vimrc 文件上进行了测试。)

建议赞赏 - 我觉得这不应该太复杂。

4

2 回答 2

2

您可以range在 function declatarion 之后使用该选项,它允许您使用两个包含范围开头和结尾的变量,a:firstline以及a:lastline.

execute指令中将它们添加到替换命令之前,以仅在该范围内执行它。在删除时应用于escape()变量以避免正斜杠的冲突:

function! ToggleComment() range
    let comment_string = ''
    if &filetype ==# 'vim'
        let comment_string = '"' 
    elseif &filetype ==# 'cpp'
        let comment_string = '//'
    endif
    let line = getline('.')
    if line =~ '^' . comment_string
        execute a:firstline . "," . a:lastline . 's/^' . escape(comment_string, '/') . '//'
    else
        execute a:firstline . "," . a:lastline . 's/^/\=printf( "%s", comment_string )/'
    endif
endfunction

更新:要在第一个非空白字符之前添加和删除注释,您必须在行首的零宽度断言之后添加可选空格。这是改变的部分。\s*如果该行中存在注释并在替换的替换部分添加\1或添加,请注意我如何添加到比较中:submatch(1)

if line =~? '^\s*' . comment_string
    execute a:firstline . "," . a:lastline . 's/^\(\s*\)' . escape(comment_string, '/') . '/\1/'
else
    execute a:firstline . "," . a:lastline . 's/^\(\s*\)/\=submatch(1) . printf( "%s", comment_string )/'
endif
于 2013-09-27T21:27:37.760 回答
0

这可能会失败,因为您的:s命令找不到注释字符串。您可能应该在命令中使用该e标志:s(另请参见 参考资料:h s_flags)。

此外,我认为您想在行开头和注释字符串之间添加可变数量的空格,例如if line =~ '^\s*'.comment,它确实可以正确捕获:

#This is a comment
     #This is a comment

等等,你会明白的。

于 2013-09-27T21:06:19.257 回答