Vim命令注解掉所选行?

p1iqtdky  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(161)

假设我有一堆台词:

@Override
public void draw(Graphics g) {
    g.setColor(Color.MAGENTA);
    g.fillRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
    g.setColor(Color.BLACK);
    g.drawRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
}

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

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

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

o8x7eapl

o8x7eapl1#

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

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

" these lines are needed for ToggleComment()
" Reference: https://stackoverflow.com/a/24652257/2571881
autocmd FileType c,cpp,java      let b:comment_leader = '//'
autocmd FileType arduino         let b:comment_leader = '//'
autocmd FileType sh,ruby,python  let b:comment_leader = '#'
autocmd FileType zsh             let b:comment_leader = '#'
autocmd FileType conf,fstab      let b:comment_leader = '#'
autocmd FileType matlab,tex      let b:comment_leader = '%'
autocmd FileType vim             let b:comment_leader = '"'

function! ToggleComment()
    if exists('b:comment_leader')
        let l:pos = col('.')
        let l:space = ( &ft =~ '\v(c|cpp|java|arduino)' ? '3' : '2' )
        if getline('.') =~ '\v(\s*|\t*)' .b:comment_leader
            let l:space -= ( getline('.') =~ '\v.*\zs' . b:comment_leader . '(\s+|\t+)@!' ?  1 : 0 )
            execute 'silent s,\v^(\s*|\t*)\zs' .b:comment_leader.'[ ]?,,g'
            let l:pos -= l:space
        else
            exec 'normal! 0i' .b:comment_leader .' '
            let l:pos += l:space
        endif
        call cursor(line("."), l:pos)
    else
        echo 'no comment leader found for filetype'
    end
endfunction
nnoremap <Leader>t :call ToggleComment()<CR>
inoremap <Leader>t <C-o>:call ToggleComment()<CR>
xnoremap <Leader>t :'<,'>call ToggleComment()<CR>
" vnoremap <Leader>t :call ToggleComment()<CR>

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

vip ...................... visual inner paragraph
<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//

相关问题