vim:将键映射到带有缩进的注释

vim:将键映射到带有缩进的注释,vim,comments,mapping,indentation,Vim,Comments,Mapping,Indentation,在.vimrc中使用“+”和“-”进行注释之前,代码已突出显示: noremap <silent>+ :s/^/\/\/ /<CR>:noh<CR> noremap <silent>- :s/^\/\/ //<CR>:noh<CR> 我想用缩进注释代码,如下所示: int main() { // int x = 0; // int y = 0; return x; } 但是,我尝试使用: nore

在.vimrc中使用“+”和“-”进行注释之前,代码已突出显示:

noremap <silent>+ :s/^/\/\/ /<CR>:noh<CR>
noremap <silent>- :s/^\/\/ //<CR>:noh<CR>
我想用缩进注释代码,如下所示:

int main() {
    // int x = 0;
    // int y = 0;
    return x;
}
但是,我尝试使用:

noremap <silent>+ :le<CR>:s/^/\/\/ /<CR>==:noh<CR>                              
noremap <silent>- :le<CR>:s/^\/\/ //<CR>==:noh<CR>
我想知道我的映射出了什么问题,以及如何修复它

此外,是否有一种“更聪明”的方法来做到这一点

(我愿意学习编写映射,而不是安装NERDcommenter之类的插件)

谢谢

更新: 也许我没有把我的问题说清楚,所以下面有一些答案没有明白我的意思

非常感谢所有试图回答我问题的人,我发现Ben的解决方案对于初学者来说是最容易理解的,rc0r的线条更少,而且它可以处理多层次的缩进(尽管我不知道它真正的作用,但我稍后会进行一些自学)

现在我使用的代码如下所示:

int main() {
    // int x = 0;
int y = 0;
    return x;
}
if has("autocmd")
    autocmd FileType c,cpp,java,verilog noremap <silent><Leader>. :s:^\(\s*\):\1// :<CR>:noh<CR>
    autocmd FileType c,cpp,java,verilog noremap <silent><Leader>, :s:^\(\s*\)// :\1:<CR>:noh<CR>
    autocmd FileType sh,zsh,python,perl,ruby noremap <silent><Leader>. :s:^\(\s*\):\1# :<CR>:noh<CR>
    autocmd FileType sh,zsh,python,perl,ruby noremap <silent><Leader>, :s:^\(\s*\)# :\1:<CR>:noh<CR>
    autocmd FileType vim noremap <silent><Leader>. :s:^\(\s*\):\1" :<CR>:noh<CR>
    autocmd FileType vim noremap <silent><Leader>, :s:^\(\s*\)" :\1:<CR>:noh<CR>
    autocmd FileType asm noremap <silent><Leader>. :s:^\(\s*\):\1; :<CR>:noh<CR>
    autocmd FileType asm noremap <silent><Leader>, :s:^\(\s*\); :\1:<CR>:noh<CR>
    autocmd FileType vhdl,sql noremap <silent><Leader>. :s:^\(\s*\):\1-- :<CR>:noh<CR>
    autocmd FileType vhdl,sql noremap <silent><Leader>, :s:^\(\s*\)-- :\1:<CR>:noh<CR>
endif
if有(“autocmd”)
autocmd文件类型c、cpp、java、verilog noremap.:s:^\(\s*\):\1/::noh
autocmd文件类型c,cpp,java,verilog noremap,:s:^\(\s*\)/:\1::noh
autocmd文件类型sh、zsh、python、perl、ruby noremap.:s:^\(\s*\):\1::不
autocmd文件类型sh、zsh、python、perl、ruby noremap、:s:^\(\s*\)\:\1::noh
autocmd文件类型vim noremap.:s:^\(\s*\):\1::不
autocmd文件类型vim noremap,:s:^\(\s*\)“:\1::noh
autocmd文件类型asm noremap.:s:^\(\s*\):\1;::诺
autocmd文件类型asm noremap,:s:^\(\s*\);:\1::noh
autocmd文件类型vhdl,sql noremap.:s:^\(\s*\):\1--::不
autocmd文件类型vhdl,sql noremap,:s:^\(\s*\)-:\1::noh
恩迪夫

这对我来说已经足够好了。

你说你在视觉选择上使用地图

因此,问题在于映射中的初始
:left
命令结束了视觉模式,因此下一个
:s
命令仅作用于当前行,而不是整个视觉选择

您有两个选择:

  • 使用
    gv
    在最后一次视觉选择时返回视觉模式

  • 使用
    :”毫无疑问有更好的方法:)但是

    noremap <silent>+ :le<CR>gv:'<,'>s/^\/\/ ../\/\/ /<CR>gv==:noh<CR>   
    


    没有时间解决取消注释的问题,也没有时间解决如何最好地不重复替换项中的位

    您的命令将
    /
    添加到行的开头,因为您忘记考虑空格:

    :s/^\s*/\/\/ /
    

    但是您应该使用插件。

    我不是设置vim地图的专家,但是通过稍微修改搜索和替换模式,您的初始地图应该可以做到:

    noremap <silent>+ :s:^\(\s*\):\1// :<CR>:noh<CR>
    noremap <silent>- :s:^\(\s*\)// :\1:<CR>:noh<CR>
    
    noremap+:s:^\(\s*\):\1/::noh
    noremap-:s:^\(\s*\)/:\1::noh
    

    上述用于注释的正则表达式在行首(
    ^\(\s*)
    )搜索可变数量的空格字符,并将找到的模式替换为自身(使用反向引用
    \1
    ),后跟注释字符(
    \1/
    )。上面显示的第二个正则表达式以类似的方式删除注释字符:搜索后跟注释字符(
    ^\(\s*\)/
    )的可变数量的空格,并将所有空格替换为空格(back reference
    \1
    )。

    这对您有用吗?每一行都将缩进,但不一定都在同一缩进级别。例如,使用像vim Commentation这样的插件获取有关vim正则表达式检查的更多信息。
    int main() {
        // int x = 0;
        // int y = 0;
        return 0;
    }
    
    :s/^\s*/\/\/ /
    
    noremap <silent>+ :s:^\(\s*\):\1// :<CR>:noh<CR>
    noremap <silent>- :s:^\(\s*\)// :\1:<CR>:noh<CR>