動作環境
- Debian
- Vim 7.4.1944 (+python/dynと+python3/dynが有効)
- Python 2.7
- Python 3.5
X11の機能を利用します。
WindowsとMacでは動作未確認です。
ノーマルモードでtabを押したらTab()を実行し、Ctrl-iを押したらCtrli()を実行するサンプルを書きました。
できない方法
sample1.vim
function! Tab()
echo 'Key:tab'endfunctionfunction! Ctrli()
echo 'Key:Ctrl-i'endfunctionnnoremap<buffer><tab> :<C-u>call Tab()<CR>nnoremap<buffer><C-i> :<C-u>call Ctrli()<CR>
tabを押してもCtrl-iを押してもCtrli()が呼び出されてKey:Ctrl-iと出力されました。
このやり方ではtabとCtrl-iを区別できませんでした。
できた方法
X11の機能を利用して入力したキーを判断しています。
sample2.py
# -*- coding: utf-8 -*-deftab_ctrli():importvimimportctypesfromctypes.utilimportfind_libraryx11=ctypes.cdll.LoadLibrary(find_library('X11'))display=x11.XOpenDisplay(None)keymap=(ctypes.c_char*32)()keys_tab=[0]*2+[128]+[0]*29keys_ctrli=[0]*3+[128,32]+[0]*27whileTrue:x11.XQueryKeymap(display,keymap)keys=[ord(x)forxinkeymap]ifkeys_tab==keys:vim.command('call Tab()')x11.XCloseDisplay(display)breakifkeys_ctrli==keys:vim.command('call Ctrli()')x11.XCloseDisplay(display)breaktab_ctrli()
sample2.vim
function! Tab()
echo 'Key:tab'endfunctionfunction! Ctrli()
echo 'Key:Ctrl-i'endfunctionfunction! Main()pyfile sample2.pyendfunctionnnoremap<buffer><tab> :<C-u>call Main()<CR>
tabを押したらTab()が実行され、Ctrl-iを押したらCtrli()が実行されました。
その他
tabとCtrl-iのように、異なるキーだけど同じキーのように扱われるキーの一覧は:h key-notationで確認できます。