LoginSignup
1
1

More than 5 years have passed since last update.

TabとCtrl-iどちらを入力されたか区別する(Linux限定)

Posted at

動作環境

  • 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で確認できます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1