【问题标题】:Vim - Visual Block : Delete rather than insertVim - 视觉块:删除而不是插入
【发布时间】:2011-09-28 01:42:32
【问题描述】:

我经常使用可视块然后在多行上插入,例如注释掉很多代码。这非常适合在多行的同一位置插入文本,但我不知道以后如何使用可视块模式删除此文本,Backspace、Del 和 d 都不起作用。我正在使用 MacVim。

【问题讨论】:

  • 虽然接受的答案是正确的,但我只想指出一个重要的命令,您可以将其与它结合使用以使其更易于使用。点命令!进入块可视模式,选择多行,点击 x,现在可以根据需要多次按 .

标签: vim vi macvim


【解决方案1】:

您正在寻找 x

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh

然后是视觉块选择,x:

root:/root:/bin/bash
daeaemon:/usr/sbin:/bin/sh
bin/bin:/bin/sh
sys/dev:/bin/sh

我经常使用它,原因完全相同——注释和取消注释大块代码。

【讨论】:

  • 谢谢,太好了,有没有办法让它保持可视块模式并做多个 x?
  • @beck:据我所知,您不能保持视觉模式。但是,您可以在 x 前面加上一个数字;例如3x 删除三个字符,这可能是你想要的。
  • @beck:您也可以使用gv 命令重新突出显示同一块。
  • 谢谢,@herbert 我记得遇到过,但完全忘记了,谢谢。
  • 谢谢@Herbert,你成就了我的一天。
【解决方案2】:

这不是直接回答问题(sarnold 已经这样做了),但我建议有更有效的方法来(取消)注释代码块。我有一个 CommentToggle 函数,它可以对当前行进行 cmets 或 uncmets,具体取决于它是否以“comchar”开头。

function! CommentToggle(comchar)
    let firstchar = matchstr(getline("."),"[^ ]")
    if firstchar == a:comchar
        sil exe 'normal ^xx'
    else 
        sil exe 'normal ^i' . a:comchar . ' '
    endif
endfunction

所以,对于 perl 文件,您可以映射:

nnoremap <silent> <leader>c :call CommentToggle('#')<CR>

然后按 3 \ c(取消)从光标位置移开三行。

您还可以编写视觉模式映射:

vnoremap <silent> <leader>c :call CommentToggle('#')<CR>

允许您选择一个可视区域并按 \c 以(取消)全部注释。

这个特定的函数只适用于单字符的 cmets(“#”、“%”等),但可以直接将其扩展到更长的字符串(例如“//”),甚至更复杂的替换,比如 HTML cmets。

希望这会有所帮助。

【讨论】:

  • 我同意“更好的方法” 但是,还有更好的方法:专用于 cmets 的插件 toggling -> EnhancedCommentify、NERDCommenter、tComment(我不确定最后一个;我已经使用第一个十年了)
【解决方案3】:

古拉什王子的回答与前导标签不一致。

我更改了它,将制表符添加到模式中,尽管在注释和取消注释后行会失去缩进。

function! CommentToggle( comchar )
        let firstchar = matchstr( getline( "." ), "[^ \t]" )
        if firstchar == a:comchar
                sil exe 'normal ^2x'
        else
                sil exe 'normal ^i' . a:comchar . ' '
        endif
endfunction

我更喜欢将注释字符添加到行中的第一个位置,这个修改 Prince Goulash 的函数就可以了:

function! CommentToggle( comchar )
        let firstchar = matchstr( getline( "." ), "[^ \t]" )
        if firstchar == a:comchar
                sil exe 'normal ^2x'
        else
                sil exe 'normal gI' . a:comchar . ' '
        endif
endfunction

【讨论】:

  • 谨慎回复带有进一步答案的答案——一旦有人注意到,他们通常会在几分钟内消失:)——但这是一个很好的答案,因为它不那么针对炖牛肉王子更多的是针对解决贝克的问题。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
相关资源
最近更新 更多