Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim-可视块:删除而不是插入_Vim_Vi_Macvim - Fatal编程技术网

Vim-可视块:删除而不是插入

Vim-可视块:删除而不是插入,vim,vi,macvim,Vim,Vi,Macvim,例如,在注释大量代码时,我经常使用可视块插入多行。这非常适合在多行的同一位置插入文本,但我不知道以后如何使用可视块模式删除此文本,Backspace、Del和d都不起作用。我正在使用MacVim。您正在寻找x: 然后选择视觉块,x: 我经常使用它,原因完全相同-注释和取消注释大块代码。这并不是直接回答sarnold已经这样做的问题,但我建议有更有效的方法取消注释代码块。我有一个CommentToggle函数,可以注释或取消注释当前行,这取决于它是否以comchar开头 function! Com

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

您正在寻找x:

然后选择视觉块,x:


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

这并不是直接回答sarnold已经这样做的问题,但我建议有更有效的方法取消注释代码块。我有一个CommentToggle函数,可以注释或取消注释当前行,这取决于它是否以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取消对它们的注释

此特定函数仅适用于单字符注释、%等,但可以直接将其扩展到更长的字符串,例如//,甚至更复杂的替换,例如HTML注释


希望这能有所帮助。

古拉什王子的答案与前面的标签不符

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

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

谢谢,那太好了,有没有办法让它保持在视觉块模式并执行多个x?贝克:据我所知,你不能保持在视觉模式。但是,可以在x前面加一个数字;e、 g.3x删除了三个字符,这可能就是你想要的。@beck:你也可以使用gv命令再次高亮显示同一块。谢谢,@herbert我记得遇到过,但完全忘记了,谢谢。谢谢@herbert,你让我开心了。请小心用更多的答案回答问题-一旦有人注意到,它们通常在几分钟内就消失了:-但这是一个很好的答案,因为它不是针对古拉什王子,而是针对解决贝克的问题我同意更好的方法,但是,还有更好的方法:专门用于注释切换的插件->增强注释,NERDCommenter,t注释我不确定最后一种方法;十年来我一直在使用第一个命令,虽然公认的答案是正确的,但我只想指出一个重要的命令,您可以将其与之结合使用,以使其更易于使用。点命令!进入块视觉模式,选择多行,点击x,现在按。需要多少次就多少次。
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
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