在Vim中可以有文件类型特定的键绑定吗?


79

在我的.vimrc文件中,我有一个用于注释掉的键绑定,该键绑定//在行的开头插入双斜杠():

" the mappings below are for commenting blocks of text
:map <C-G> :s/^/\/\//<Esc><Esc>
:map <C-T> :s/\/\/// <Esc><Esc>

但是,当我编辑Python脚本时,我想将其更改# 为注释符号

我的Python.vim文件.vim/ftdetect夹中有一个文件,其中也有制表符宽度等设置。如果可能的话,什么是覆盖键绑定的代码,所以我可以使用Python:

" the mappings below are for commenting blocks of text
:map <C-G> :s/^/#/<Esc><Esc>
:map <C-T> :s/#/ <Esc><Esc>

Answers:


64

ftdetect文件夹用于文件类型检测的脚本。文件类型插件必须位于ftplugin文件夹中。该文件类型必须以以下三种形式之一包含在文件名中:

  • .../ftplugin/<filetype>.vim
  • .../ftplugin/<filetype>_foo.vim
  • .../ftplugin/<filetype>/foo.vim

例如,您可以映射cpp文件类型的注释,将以下内容放入.../ftplugin/cpp_mine.vim

:map <buffer> <C-G> :s/^/\/\//<Esc><Esc>
:map <buffer> <C-T> :s/\/\/// <Esc><Esc>

6
你忘了那<buffer>部分。
卢克·赫米特

1
您的答案解决了我的两个问题,每个文件类型的映射以及如何用映射注释当前行。大!
伦顿

83

您可以用来:map <buffer> ...仅对活动缓冲区进行本地映射。这要求您的Vim使用编译+localmap

所以你可以做类似的事情

autocmd FileType python map <buffer> <C-G> ...

9

我更喜欢将配置放在单个文件中,所以我使用autocmd方法。

augroup pscbindings
  autocmd! pscbindings
  autocmd Filetype purescript nmap <buffer> <silent> K :Ptype<CR>
  autocmd Filetype purescript nmap <buffer> <silent> <leader>pr :Prebuild!<CR>
augroup end

当您获取源代码时,Vim不会清除set autocmds vimrc,因此启动vim,更改您的内容vimrc并运行:so ~/.vimrc会定义两次autocmds。这就是为什么将绑定分组并用清除的原因autocmd! group_name。您可以在这里阅读更多内容

由于默认情况下映射应用于每个缓冲区,并且您只想更改与文件类型匹配的缓冲区<buffer>的映射,因此其中存在修饰符,从而将映射限制为本地缓冲区。


4

顺便说一句...如果您的主要问题是关于注释...,则应查看“ nerdcommenter”插件,它是在Java / C / C ++ / Python / Dos_batch_file / etc等中注释/取消注释代码的最快方法。


1
我对YAATPP *感到非常满意* github.com/tpope/vim-commentary *->另一个令人惊叹的Tim Pope插件
patrickdavey


-1

对于来到这里的人很难使任何ftplugin脚本正常工作,这只是部分答案,但是请记住,您的.vimrc(或其来源的文件)应包含

filetype plugin on

要么

:filetype plugin on

用于在加载给定类型的文件时执行filetype-plugins。


刚注意到一些选票。很
乐意
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.