Можно ли использовать в 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>
Джеймс
источник

Ответы:

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>
Freitass
источник
6
Вы забыли <buffer>роль.
Люк Эрмитт
1
Ваш ответ решает две из моих проблем: сопоставления для каждого типа файла и то, как прокомментировать текущую строку с сопоставлением. Большой!
Рендон
84

Вы можете использовать :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 не сбрасывает автоматические команды при vimrcзапуске, поэтому при запуске vim, изменении чего-либо в вашем vimrcи запуске :so ~/.vimrcautocmds будут определены дважды. Вот почему привязки сгруппированы и очищены с помощью autocmd! group_name. Вы можете узнать больше здесь .

Поскольку сопоставления применяются к каждому буферу по умолчанию, и вы хотите изменить их для буферов, соответствующих только типу файла, <buffer>модификатор находится там, ограничивая сопоставления локальным буфером.

алекс
источник
4

Кстати ... если ваша основная проблема связана с комментированием ... вам следует проверить плагин 'nerdcommenter', это самый быстрый способ прокомментировать / раскомментировать ваш код в java / c / c ++ / python / dos_batch_file / etc и т. Д.

ТИК Так
источник
1
Я был очень доволен YAATPP * github.com/tpope/vim-commentary * -> Еще один удивительный плагин Tim Pope
patrickdavey
0

Я рекомендую .../ftplugin/<filetype>.vimподход, который предлагает freitass, но в вашем конкретном случае Vim Commentary решит все это за вас.

Финлей Макафи
источник
-1

Это лишь частичный ответ для людей, которые приезжают сюда и испытывают трудности с работой каких- либо скриптов ftplugin, но помните, что ваш .vimrc (или исходный файл) должен содержать

filetype plugin on

или же

:filetype plugin on

для плагинов типа файла, которые будут выполняться при загрузке файла данного типа.

Koyae
источник
Только что заметил несколько голосов против. Рад редактировать или удалять соответственно, но сначала мне нужно узнать причину: /
koyae 02