我在.vimrc文件中添加了一个简单的插件,它工作得很好,可以很容易地扩展。您只需向comment_map及其注释引线添加一个新的文件类型。
我添加了一个普通模式和视觉模式的映射,但您可以重新映射到任何您喜欢的模式。我只希望有一个“切换”样式的函数。一个熊具有多个映射等。
let s:comment_map = {
\ "c": '\/\/',
\ "cpp": '\/\/',
\ "go": '\/\/',
\ "java": '\/\/',
\ "javascript": '\/\/',
\ "lua": '--',
\ "scala": '\/\/',
\ "php": '\/\/',
\ "python": '#',
\ "ruby": '#',
\ "rust": '\/\/',
\ "sh": '#',
\ "desktop": '#',
\ "fstab": '#',
\ "conf": '#',
\ "profile": '#',
\ "bashrc": '#',
\ "bash_profile": '#',
\ "mail": '>',
\ "eml": '>',
\ "bat": 'REM',
\ "ahk": ';',
\ "vim": '"',
\ "tex": '%',
\ }
function! ToggleComment()
if has_key(s:comment_map, &filetype)
let comment_leader = s:comment_map[&filetype]
if getline('.') =~ "^\\s*" . comment_leader . " "
" Uncomment the line
execute "silent s/^\\(\\s*\\)" . comment_leader . " /\\1/"
else
if getline('.') =~ "^\\s*" . comment_leader
" Uncomment the line
execute "silent s/^\\(\\s*\\)" . comment_leader . "/\\1/"
else
" Comment the line
execute "silent s/^\\(\\s*\\)/\\1" . comment_leader . " /"
end
end
else
echo "No comment leader found for filetype"
end
endfunction
nnoremap <leader><Space> :call ToggleComment()<cr>
vnoremap <leader><Space> :call ToggleComment()<cr>
注:
我没有对文件类型/加载使用任何回调或挂钩,因为我发现它们比.vimrc静态函数/map更慢Vim的启动速度,但这只是我的偏好。我也试图保持它的简单和性能。如果确实使用了自动命令,则需要确保将它们放入自动命令组中,否则每次加载文件时,回调都会多次添加到文件类型中,从而导致性能下降。