Mac OS XなどのLinuxキーボードショートカットをカスタマイズする



以前は、端末とブラウザーなどで同時に作業をしているときに、このような状況が頻繁に発生しました。

数時間の作業の後、混乱するようになり、ターミナルで[Ctrl] + [Shift] + [C]の代わりに、ブラウザーで[Ctrl] + [C]を押します。 その結果、ターミナルでは割り込みが発生し、ブラウザでは予想される効果の代わりに、デバッガーがゆっくりと読み込まれます。

ある時点で、それは私を悩ませ、私は何かを変える時だと決めました...



実稼働マシンのLinuxにOSXを再インストールする前に、キーボードショートカットの非常に優れた実装に慣れました。 より正確には、 CutCopyPasteなどのすべての基本操作では、すべて[Ctrl]ではなく[Cmd]ボタン(PCの[Win]ボタンに相当)を使用します。 LinuxおよびWindowsではデフォルトで。 繰り返しますが、ターミナルで頻繁に作業する場合、他のすべてのアプリケーションと同じキーボードショートカットがあり、割り込みは常に[Ctrl] + [C]のままです。

タイルウィンドウマネージャーを使用すると、この方法からも利益を得ることができます。 ほとんどの場合、標準操作を使用してタグ/ウィンドウを切り替えるには、modkeyから指を離す必要はありません。



もちろん、特定の各アプリケーションの設定でキーボードショートカットを設定できますが、これはあまり便利ではなく、すべてのアプリケーションがこの設定をサポートしているわけではありません。 そのため、標準のキーボードショートカットを必要なショートカットに単純にバインドすることにしました。

つまり [Win] + [C]を押すと、端末は[Ctrl] + [Shift] + [C]、および[Ctrl] + [C]を含む他のすべてのアプリケーションを押したと見なします。



計画を実行するには、 xbindkeysなどのキーストロークを追跡するプログラムが必要です。または、ウィンドウマネージャーの通常の機能とキーストロークエミュレーターを使用できます。それらのいくつかがあります: xdotoolxtexvkbd



確かに、最初の2つで最も興味深い不具合がありました。たとえば、[Win] + [A]を押すと、エミュレーターは[Ctrl] + [A]をアプリケーションに忠実に渡し、アプリケーションは3つのキーすべてが[Win] + [Ctrl ] + [A]このような組み合わせは処理しません。 xdotoolの--clearmodifiersオプションも役に立たなかったため、この不快なバグは簡単に検出できませんでした。 xkdbbでは、このような動作は確認されませんでした。



xbindkeysから始めましょう。 すべてのCapsLock、NumLockおよびその他の修飾子を無効にし、次を実行します。

$ xbindkeys -k
      
      





ウィンドウが開き、ウィンドウで[Win] + [A]の組み合わせを押すと、ターミナルで次の出力が表示されます。

 "(Scheme function)" m:0x40 + c:38 Mod4 + a
      
      





Mod4は[Win]キーです。 同じことがxbindkeys設定を書くために使用できます:



〜/ .xbindkeysrcを開いて書き込みます:

 "xvkbd -xsendevent -text '\[Control_L]a'" Mod4 + a
      
      



xdotoolおよびxteのオプション
xdotool

 "xdotool key --delay 0 --clearmodifiers ctrl+a" Mod4 + a
      
      





xte

 "xte 'keydown Control_L' 'key A' 'keyup Control_L'" Mod4 + a
      
      









次に、xbindkeysを実行します。

 $ xbindkeys
      
      





[Win] + [A]を押してみると、[Ctrl] + [A]を押した場合と同じ効果が得られます



すべてが機能することを確認したら、kofigの編集を続行できますが、次の開始前に、前のxbindkeysプロセスを最初から完了する必要があります。

 $ pkill xbindkeys
      
      







わかりましたが、作業しているプログラムによっては、同じボタンを押したときに異なるキーボードショートカットをどのように渡すのですか?

同じxdotoolxpropが助けになり、その助けを借りて、アクティブウィンドウが端末かどうかを判断します。



簡単なスクリプトを書いて/bin/copypaste.shに入れましょう:

 #!/bin/bash W=`xdotool getactivewindow` S1=`xprop -id ${W} |awk '/WM_CLASS/{print $4}'` S2='"URxvt"' #   S3='"XTerm"' #   if [ $1 = "copy" ]; then #    copy if [ $S1 = $S2 ] || [ $S1 = $S3 ]; then #    xvkbd -xsendevent -text '\[Control_L]\[Shift_L]\[C]' #  [Ctrl]+[Shift]+[C] else #   xvkbd -xsendevent -text '\[Control_L]c' #  [Ctrl]+[C] fi fi if [ $1 = "paste" ]; then #     paste if [ $S1 = $S2 ] || [ $S1 = $S3 ]; then xvkbd -xsendevent -text '\[Control_L]\[Shift_L]\[V]' else xvkbd -xsendevent -text '\[Control_L]v' fi fi
      
      





プログラムが使用するクラスがわからない場合は、 xpropを使用します。

 xprop
      
      



ウィンドウをクリックします



スクリプトを実行可能にすることを忘れないでください:

 # chmod +x /bin/copypaste.sh
      
      





次のように機能します。

 $ copypaste.sh copy $ copypaste.sh paste
      
      





これを〜/ .xbindkeysrc configに追加します:

 "xvkbd -xsendevent -text '\[Control_L]a'" Mod4 + a "copypaste.sh copy" Mod4 + c "copypaste.sh paste" Mod4 + v
      
      







同様に、残りのキーの組み合わせを構成します。



準備ができた設定:

xbindkeysの場合
〜/ .xbindkeysrc

 "copypaste.sh copy" Mod4 + c "copypaste.sh paste" Mod4 + v "/usr/bin/xvkbd -xsendevent -text '\[Control_L]x'" Mod4 + x "/usr/bin/xvkbd -xsendevent -text '\[Control_L]z'" Mod4 + z "xvkbd -xsendevent -text '\\[Control_L]\\[Shift_L]\\[Z]'" Shift+Mod4 + z "/usr/bin/xvkbd -xsendevent -text '\[Control_L]q'" Mod4 + q "/usr/bin/xvkbd -xsendevent -text '\[Control_L]y'" Mod4 + y "/usr/bin/xvkbd -xsendevent -text '\[Control_L]a'" Mod4 + a "/usr/bin/xvkbd -xsendevent -text '\[Control_L]s'" Mod4 + s "/usr/bin/xvkbd -xsendevent -text '\[Control_L]o'" Mod4 + o "/usr/bin/xvkbd -xsendevent -text '\[Control_L]f'" Mod4 + f
      
      



素晴らしい3.5
 awful.key({ modkey, }, "c", function () awful.util.spawn("copypaste.sh copy") end), awful.key({ modkey, }, "v", function () awful.util.spawn("copypaste.sh paste") end), awful.key({ modkey, }, "x", function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]x") end), awful.key({ modkey, }, "z", function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]z'") end), awful.key({ modkey, "Shift" }, "z", function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]\\[Shift_L]\\[Z]'") end), awful.key({ modkey, }, "y", function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]y'") end), awful.key({ modkey, }, "a", function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]a'") end), awful.key({ modkey, }, "s", function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]s'") end), awful.key({ modkey, }, "o", function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]o'") end), awful.key({ modkey, }, "f", function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]f'") end),
      
      






All Articles