Vim命令注解掉所选行?

p1iqtdky  于 2024-01-08  发布在  其他
关注(0)|答案(5)|浏览(228)

假设我有一堆台词:

  1. @Override
  2. public void draw(Graphics g) {
  3. g.setColor(Color.MAGENTA);
  4. g.fillRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
  5. g.setColor(Color.BLACK);
  6. g.drawRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
  7. }

字符串
当我想用//注解掉它们时(我更喜欢行注解而不是块注解),我所做的是:

  • 将光标放在@符号的前面
  • Ctrl-V:切换进入块选择模式
  • 使用j的多次命中选择列,直到}右括号
  • Shift-I:进入block-insert
  • 型号//
  • ESC要激发
  • Enter完成命令

-->这些行现在被注解掉了。
有没有更简单的方法可以让我不需要进行块选择?我发现我可以使用像:'<, '>s/^/\/\///g这样的替换,但这有两个问题:
1.它非常笨拙,容易出错(需要转义多个向前和向后斜杠)
1.它将注解符号(//)放在行的开头(位置0),而不是该行的第一个字符所在的位置(因此缩进丢失)。
如何使用Vi将//插入到选定行的每行第一个字符的位置?

o8x7eapl

o8x7eapl1#

如何使用Vi在选中的行中的第一个字符的位置插入//?
虽然,我同意其他人的观点,专用插件是必须的,但是,因为它是在OP中制定的,这是一个很容易的任务,可以实现为一行程序:

  1. vnoremap <silent>gc :call setline(".", printf("%*s" . &cms, indent("."), "", trim(getline("."))))<CR>

字符串
现在选择一些文本,按下“gc”,瞧,它工作了。要强制使用//而不是默认的/**/,请为您的缓冲区设置以下选项:setlocal cms=//\ %s。参见:h 'cms'

c9x0cxw0

c9x0cxw02#

“我有一个'切换评论功能',看起来像“参考:https://stackoverflow.com/a/24652257/2571881

  1. " these lines are needed for ToggleComment()
  2. " Reference: https://stackoverflow.com/a/24652257/2571881
  3. autocmd FileType c,cpp,java let b:comment_leader = '//'
  4. autocmd FileType arduino let b:comment_leader = '//'
  5. autocmd FileType sh,ruby,python let b:comment_leader = '#'
  6. autocmd FileType zsh let b:comment_leader = '#'
  7. autocmd FileType conf,fstab let b:comment_leader = '#'
  8. autocmd FileType matlab,tex let b:comment_leader = '%'
  9. autocmd FileType vim let b:comment_leader = '"'
  10. function! ToggleComment()
  11. if exists('b:comment_leader')
  12. let l:pos = col('.')
  13. let l:space = ( &ft =~ '\v(c|cpp|java|arduino)' ? '3' : '2' )
  14. if getline('.') =~ '\v(\s*|\t*)' .b:comment_leader
  15. let l:space -= ( getline('.') =~ '\v.*\zs' . b:comment_leader . '(\s+|\t+)@!' ? 1 : 0 )
  16. execute 'silent s,\v^(\s*|\t*)\zs' .b:comment_leader.'[ ]?,,g'
  17. let l:pos -= l:space
  18. else
  19. exec 'normal! 0i' .b:comment_leader .' '
  20. let l:pos += l:space
  21. endif
  22. call cursor(line("."), l:pos)
  23. else
  24. echo 'no comment leader found for filetype'
  25. end
  26. endfunction
  27. nnoremap <Leader>t :call ToggleComment()<CR>
  28. inoremap <Leader>t <C-o>:call ToggleComment()<CR>
  29. xnoremap <Leader>t :'<,'>call ToggleComment()<CR>
  30. " vnoremap <Leader>t :call ToggleComment()<CR>

字符串
所以,一旦你在~/.vimrc上有了这个函数,你就可以做:

  1. vip ...................... visual inner paragraph
  2. <leader>t ................ in order to call the function

展开查看全部
busg9geu

busg9geu3#

q创建一个宏,把它放入a缓冲区,在给定的行上点击qa。然后按I//跳转到行的开头,并注解掉它。点击ESC和q,现在你的宏完成了。这个宏将注解掉当前行。
完整的命令是qaI// ESC q
现在用V直观地选择一堆行,然后输入:norm!@a在这些行上运行a宏。这将注解掉一堆行。
录制另一个宏来执行与qb^xx相反的操作。
您可以将这些宏保存在.vimrc中,并将特定的宏Map到组合键,如果您想“保存”这些命令的话。

wgmfuz8q

wgmfuz8q4#

您可以为:substitute定义自定义Map或命令。
然而,有几个评论插件可以很好地做到这一点,并且这些插件是通用的(并且通常是可扩展的),因此它们适用于任何文件类型:

我强烈建议使用这些插件之一,而不是试图重新发明一个可怜的解决方案自己。

plupiseo

plupiseo5#

我用评论作为另一个答案,但一些想法:

  • <C-v>jjjjj可以是<C-v>}<C-v>/}<CR>
  • :substitute不必使用/作为分隔符::'<,'>s-^-//
  • 通过可视化选择,您还可以执行:'<,'>normal! I//

相关问题