以前は、端末とブラウザーなどで同時に作業をしているときに、このような状況が頻繁に発生しました。
数時間の作業の後、混乱するようになり、ターミナルで[Ctrl] + [Shift] + [C]の代わりに、ブラウザーで[Ctrl] + [C]を押します。 その結果、ターミナルでは割り込みが発生し、ブラウザでは予想される効果の代わりに、デバッガーがゆっくりと読み込まれます。
ある時点で、それは私を悩ませ、私は何かを変える時だと決めました...
実稼働マシンのLinuxにOSXを再インストールする前に、キーボードショートカットの非常に優れた実装に慣れました。 より正確には、 Cut 、 Copy 、 Pasteなどのすべての基本操作では、すべて[Ctrl]ではなく[Cmd]ボタン(PCの[Win]ボタンに相当)を使用します。 LinuxおよびWindowsではデフォルトで。 繰り返しますが、ターミナルで頻繁に作業する場合、他のすべてのアプリケーションと同じキーボードショートカットがあり、割り込みは常に[Ctrl] + [C]のままです。
タイルウィンドウマネージャーを使用すると、この方法からも利益を得ることができます。 ほとんどの場合、標準操作を使用してタグ/ウィンドウを切り替えるには、modkeyから指を離す必要はありません。
もちろん、特定の各アプリケーションの設定でキーボードショートカットを設定できますが、これはあまり便利ではなく、すべてのアプリケーションがこの設定をサポートしているわけではありません。 そのため、標準のキーボードショートカットを必要なショートカットに単純にバインドすることにしました。
つまり [Win] + [C]を押すと、端末は[Ctrl] + [Shift] + [C]、および[Ctrl] + [C]を含む他のすべてのアプリケーションを押したと見なします。
計画を実行するには、 xbindkeysなどのキーストロークを追跡するプログラムが必要です。または、ウィンドウマネージャーの通常の機能とキーストロークエミュレーターを使用できます。それらのいくつかがあります: xdotool 、 xte 、 xvkbd 。
確かに、最初の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
xte
"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
わかりましたが、作業しているプログラムによっては、同じボタンを押したときに異なるキーボードショートカットをどのように渡すのですか?
同じxdotoolとxpropが助けになり、その助けを借りて、アクティブウィンドウが端末かどうかを判断します。
簡単なスクリプトを書いて/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),