Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

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

$
0
0

動作環境

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


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>