我在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(-#)。
视觉和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>
是的,这个问题已经有33个(大部分是重复的)答案。
下面是另一种在Vim中注释行的方法:运动。基本思想是使用与键入yip删除段落或键入dj删除2行相同的方法注释或取消注释行。
这种方法可以让您执行以下操作:
ccj注释接下来的2行,cuk取消注释;cci{注释一个块,cui{取消注释;ccip注释整个段落,cuip取消注释。ccG将所有内容注释到最后一行,cugg将所有内容取消注释到第一行。
您只需要2个对运动进行操作的函数,以及每个函数的2个映射。首先,映射:
nnoremap <silent> cc :set opfunc=CommentOut<cr>g@
vnoremap <silent> cc :<c-u>call CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu :set opfunc=Uncomment<cr>g@
vnoremap <silent> cu :<c-u>call Uncomment(visualmode(), 1)<cr>
(请参阅有关g@运算符和operatorfunc变量的手册。)
现在功能如下:
function! CommentOut(type, ...)
if a:0
silent exe "normal! :'<,'>s/^/#/\<cr>`<"
else
silent exe "normal! :'[,']s/^/#/\<cr>'["
endif
endfunction
function! Uncomment(type, ...)
if a:0
silent exe "normal! :'<,'>s/^\\(\\s*\\)#/\\1/\<cr>`<"
else
silent exe "normal! :'[,']s/^\\(\\s*\\)#/\\1/\<cr>`["
endif
endfunction
修改上面的正则表达式以适合您的口味,即#应该在哪里:
" comments
augroup comment_like_a_boss
autocmd!
autocmd FileType c,cpp,go let b:comment_leader = '// '
autocmd FileType ruby,python let b:comment_leader = '# '
autocmd FileType conf,fstab,sh,bash,tmux 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 = '" '
augroup END
noremap <silent> ,cc :<C-b>silent <C-e>norm ^i<C-r>=b:comment_leader<CR><CR>
noremap <silent> ,uc :<C-b>silent <C-e>norm ^xx<CR>