我在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(-#)。
我个人不喜欢注释“切换”功能,因为它会破坏代码中已经包含的注释。此外,我希望注释字符始终显示在最左边,这样我可以很容易地看到注释块。此外,我希望这是嵌套的(如果我首先注释掉一个块,然后是一个封闭块)。因此,我稍微改变了其中一个解决方案。我使用F5注释,使用Shift-F5取消注释。此外,我在s/命令末尾添加了/g:
autocmd FileType c,cpp,java,scala let b:comment_leader = '//'
autocmd FileType sh,ruby,python let b:comment_leader = '#'
autocmd FileType conf,fstab let b:comment_leader = '#'
autocmd FileType tex let b:comment_leader = '%'
autocmd FileType mail let b:comment_leader = '>'
autocmd FileType vim let b:comment_leader = '"'
autocmd FileType nasm let b:comment_leader = ';'
function! CommentLine()
execute ':silent! s/^\(.*\)/' . b:comment_leader . ' \1/g'
endfunction
function! UncommentLine()
execute ':silent! s/^' . b:comment_leader . ' //g'
endfunction
map <F5> :call CommentLine()<CR>
map <S-F5> :call UncommentLine()<CR>
从这里的答案中的想法开始,我开始了自己的评论功能。它可以打开和关闭评论。它可以处理//打印(“蓝色”)等事情//这个东西是蓝色的,只是切换第一条评论。此外,它在第一个非空白处添加注释和一个空格,而不是在行的开头。另外,在注释和缩进行时,它不会不必要地复制空白,而是使用缩放(:h\zs表示帮助)来避免这种额外的工作。希望它能帮助一些极简主义者。欢迎提出建议。
" these lines are needed for ToggleComment()
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 = '"'
" l:pos --> cursor position
" l:space --> how many spaces we will use 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>
我喜欢简短的、综合的、令人难忘的方法,不依赖于外部脚本——一种花哨的小题大做。。。
TLDR:按gI(大写i)将光标置于插入模式下的行首(无论是空格还是非空格字符,并防止自动缩进)
使用此选项可快速注释(例如)非连续行,注释符号(例如#或//)为第一个字符,不带缩进,方法是按。(点)-->,但如果仍有自动缩进机制,则在插入模式下按和以更正缩进,操作后退出到正常模式。现在可用于注释行。。。
长:我现在(几年后)意识到,按gI(大写I)会将光标置于插入模式下的第1列(意思是:无论是单词还是非单词字符,都在行的开头)。
插入注释符号(如#)并按escape-现在可以在只按的同时注释单个非连续行(注释符号作为第一个字符,没有缩进)。(点)。
与按0i或仅按I相反,它将注释符号放在第一个单词字符处,部分还带有不需要的缩进
一些常规的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的注释代码教程