動作環境
- 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'
endfunction
function! Ctrli()
echo 'Key:Ctrl-i'
endfunction
nnoremap <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 -*-
def tab_ctrli():
import vim
import ctypes
from ctypes.util import find_library
x11 = ctypes.cdll.LoadLibrary(find_library('X11'))
display = x11.XOpenDisplay(None)
keymap = (ctypes.c_char * 32)()
keys_tab = [0] * 2 + [128] + [0] * 29
keys_ctrli = [0] * 3 + [128, 32] + [0] * 27
while True:
x11.XQueryKeymap(display, keymap)
keys = [ord(x) for x in keymap]
if keys_tab == keys:
vim.command('call Tab()')
x11.XCloseDisplay(display)
break
if keys_ctrli == keys:
vim.command('call Ctrli()')
x11.XCloseDisplay(display)
break
tab_ctrli()
sample2.vim
function! Tab()
echo 'Key:tab'
endfunction
function! Ctrli()
echo 'Key:Ctrl-i'
endfunction
function! Main()
pyfile sample2.py
endfunction
nnoremap <buffer> <tab> :<C-u>call Main()<CR>
tabを押したらTab()が実行され、Ctrl-iを押したらCtrli()が実行されました。
その他
tabとCtrl-iのように、異なるキーだけど同じキーのように扱われるキーの一覧は**:h key-notation**で確認できます。