2010-01-28 61 views
2

我有一个vim插件,它定义了一堆键映射。从VIM插件中检测文件类型?

我想弄清楚如何改变基于文件类型的键映射的定义。

例如:

如果该文件是一个*的.py:然后映射键X 如果该文件是一个* .PHP:那么键映射为Y

谢谢!

回答

2

是。一种方法是使用autocmd来调用设置地图的自定义函数。它看起来大致如下内容(可能已经毁损了语法,所以这是不是真的复制& pastable):

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

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

0

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

如果用户正在编辑一个新的文件,你就无法得到那个,直到他们先保存缓冲区或做:setf autohotkey:setf sql

1

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

  • 的核心功能是进入自动加载插件(S)
  • 全球映射/命令/缩写是进入一个“普通”插件
  • 文件类型特定ST这是进入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/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>为了不污染其他具有没有意义的映射的文件类型,也不会覆盖以前定义的(和特定的)映射,这些映射确实有意义。