我在vi中打开了一个Ruby代码文件,其中有行注释为#:

class Search < ActiveRecord::Migration
  def self.up
    # create_table :searches do |t|
    #   t.integer :user_id
    #   t.string :name
    #   t.string :all_of
    #   t.string :any_of
    #   t.string :none_of
    #   t.string :exact_phrase
    # 
    #   t.timestamps
    # end
  end

  def self.down
    # drop_table :searches
  end
end

假设我想取消注释第一个定义中的所有行。。。端部。在Vim中有什么有效的方法可以做到这一点?

总的来说,我正在寻找一种简单、流畅的方式来注释和取消注释行。这里我处理的是Ruby代码,但可能是JavaScript(//)或Haml(-#)。


当前回答

一些常规的Vim命令不适用于我在Windows上的设置。Ctrl+v和Ctrl+q是其中的一些。后来我发现以下方法可以取消注释行。

鉴于

一些缩进的注释

   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim

以下方法删除#符号并保留缩进。

方法

将光标移动到第一条注释(箭头或h、j、k、l)。然后应用以下技术之一:

视觉块模式(更快)

Ctrl+Shift+v进入视觉块模式js来选择垂直线。l包括水平字符(可选)x删除块

搜索/替换+Regex

选择具有常规视觉模式的文本,即Shift+v类型:。您将得到提示“<,”>。键入regex,例如s/#//将哈希值替换为空。(可选:键入s/#//以包含空格)。进来

:norm命令

选择具有常规视觉模式的文本,即Shift+v类型:。您将得到提示“<,”>。发出命令。键入:norm ^x以删除第一个非空白字符和下一个字符。(可选:如果不缩进,请尝试:norm x,或:norm ^xx以包含空格)。进来

g模式

选择具有常规视觉模式的文本,即Shift+v类型:。您将得到提示“<,”>。发出命令。键入g/#/nom^x。(可选:键入g/#/nom!^xx以包含空格)。进来

后果

    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim

另请参见

关于删除缩进的评论的帖子关于如何快速评论Vim的帖子Primagen的g命令教程。VimTrick的注释代码教程

其他回答

我喜欢简短的、综合的、令人难忘的方法,不依赖于外部脚本——一种花哨的小题大做。。。

TLDR:按gI(大写i)将光标置于插入模式下的行首(无论是空格还是非空格字符,并防止自动缩进)

使用此选项可快速注释(例如)非连续行,注释符号(例如#或//)为第一个字符,不带缩进,方法是按。(点)-->,但如果仍有自动缩进机制,则在插入模式下按和以更正缩进,操作后退出到正常模式。现在可用于注释行。。。

长:我现在(几年后)意识到,按gI(大写I)会将光标置于插入模式下的第1列(意思是:无论是单词还是非单词字符,都在行的开头)。

插入注释符号(如#)并按escape-现在可以在只按的同时注释单个非连续行(注释符号作为第一个字符,没有缩进)。(点)。

与按0i或仅按I相反,它将注释符号放在第一个单词字符处,部分还带有不需要的缩进

指定要在vim中注释的行:

显示行号:

:set number

然后

:5,17s/^/#/     this will comment out line 5-17

或者:

:%s/^/#/        will comment out all lines in file

这是一个基于C-v的基本单线图,然后是上面概述的I方法。

此命令(:Comment)将所选字符串添加到任何选定行的开头。

command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"

将这一行添加到.vimrc中,以创建一个接受单个参数的命令,并将该参数放置在当前选择的每一行的开头。

例如,如果选择了以下文本:

1
2

然后运行this::Comment//,结果将是:

//1
//2

有时我会被推到一个远程盒子里,我的插件和.vimrc无法帮助我,或者有时NerdCommenter会出错(例如嵌入HTML中的JavaScript)。

在这些情况下,一种低技术的替代方法是内置的norm命令,它只在指定范围内的每一行运行任意vim命令。例如:

评论#:

1. visually select the text rows (using V as usual)
2. :norm i#

这将在每行的开头插入“#”。请注意,当您键入:范围将被填充,因此它看起来真的像:'<,'>norm i#

取消注释#:

1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x

这将删除每行的第一个字符。如果我使用了一个2个字符的注释,比如//,那么我只需要:norm xx来删除这两个字符。

如果注释如OP问题中那样缩进,那么您可以这样锚定删除:

:norm ^x

意思是“转到第一个非空格字符,然后删除一个字符”。请注意,与块选择不同,即使注释有不均匀的缩进,此技术也有效!

注意:由于norm实际上只是执行常规的vim命令,所以您不限于注释,还可以对每一行进行一些复杂的编辑。如果需要将转义符作为命令序列的一部分,请键入ctrl-v,然后按转义键(或者更简单,只需录制一个快速宏,然后使用norm在每行上执行该宏)。

注2:如果您发现自己经常使用规范,当然也可以添加映射。例如,在~/.vimrc中放入以下行可以让您在进行视觉选择后键入ctrl-n而不是:norm

vnoremap <C-n> :norm

注意3:裸骨vim有时没有编译规范命令,因此请确保使用增强版本,即通常为/usr/bin/vim,而不是/bin/vi

(感谢@Manbroski和@rakslice对本答案的改进)

视觉和Shift-I不适合我。

在没有任何插件的情况下工作最简单的是


选择块-V,然后选择j或k或任何相关运动(不要使用箭头键):)然后点击:它提示命令:“<,”>至注释使用#-`s/^/#/`使用`//`-`s/^/\/\//`取消注释使用#-`s/^#//`使用`//`-`s/^\/\//`


再平面化-

“<,”>-应用于视觉块

s-替代品

^-以开头

在/add字符#之后,在这种情况下,\/\/转义为//


使现代化

我编写了一个函数,用<Space><Space>注释和取消注释当前行

适用于接下来的10行,例如10<Space><Space>

将其粘贴到.vimrc

function CommentUncomment()
  let line = getline('.')
  if line[:1] == "//"
      norm ^2x
  else 
      norm I//
  endif
endfunction

nnoremap <Space><Space> :call CommentUncomment()<CR>