2010-01-28 30 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>爲了不污染其他具有沒有意義的映射的文件類型,也不會覆蓋以前定義的(和特定的)映射,這些映射確實有意義。