从VIM插件中检测文件类型?

时间:2010-01-28 01:32:46

标签: vim

我有一个vim插件,它定义了一堆键映射。

我正在试图弄清楚如何根据文件类型更改键映射的定义。

例如:

如果文件是* .py:则将密钥映射到X. 如果文件是* .php:那么将键映射到Y

谢谢!

3 个答案:

答案 0 :(得分:2)

是。一种方法是使用autocmd来调用设置地图的自定义函数。它看起来像粗略,如下所示(可能会破坏语法,所以这不是真正的复制和可接受的):

augroup foo
autocmd!
autocmd FileType python call MyPythonSettings()
augroup end

function !MyPythonSettings() set noai " set mappings... endfunction

答案 1 :(得分:1)

当需要定义特定的命令/缩写/映射时,我总是将我的插件分成几个文件:

  • 进入自动加载插件的核心功能
  • 进入“普通”插件的全局映射/命令/缩写
  • 进入ftplugins的文件类型特定内容。

无用的例子:

自动加载插件

" autoload/lh/ThePlugin.vim
let g:multby = 42
function lh#ThePlugin#fn(arg)
    return a:arg * g:multby
endfunction
function lh#ThePlugin#inc_mult()
    let g:multby += 1
endfunction

“普通”插件

" plugin/ThePlugin.vim
if exist('g:ThePlugin_loaded') | finish | endif
let g:ThePlugin_loaded = '1.0.0'
nnoremap £ :call lh#ThePlugin#inc_mult()

一个ftplugin

" ftplugin/cpp/cpp_ThePlugin.vim
if exist('b:ThePlugin_loaded') | finish | endif
let b:ThePlugin_loaded = '1.0.0'
inoremap <buffer> µ <c-r>=lh#ThePlugin#fn(12)<cr>

PS:请注意<buffer>的使用,以便不会使用无意义的映射污染其他文件类型,也不会覆盖以前定义的(和特定的)有意义的映射。

答案 2 :(得分:0)

当用户打开要编辑的文件时,会触发FileType事件。但是,这要求用户在:filetype on(或手动)中启用vimrc,无论是针对这些特定扩展还是全局扩展。

如果用户正在编辑新文件,那么在他们第一次保存缓冲区或执行:setf autohotkey :setf sql等之前,您将无法获得该文件。