Super を Ctrl にバインドする

Super を Ctrl にバインドする

しばらくの間、私は、デスクトップと MacBook 間の利便性と一貫性以外の理由もなく、キーボードの Windows キー (Super_L) をコピーと貼り付けに割り当てることに興味を持っていました。

xmodmap について読み、以下を実行した後、近づいたと思いました。

$ # re-map Super_L to Mode_switch, the 3rd col in keymap table `xmodmap -pke`
$ xmodmap -e "keycode  133 = Mode_switch"

$ # map Mode_switch+c to copy
$ xmodmap -e "keycode  54 = c C XF86_Copy C"

$ # map Mode_switch+v to paste
$ xmodmap -e "keycode  55 = v V XF86_Paste V"

残念ながら、XF86Copy と XF86Paste はまったく機能しないようです。これらは にリストされており/usr/include/X11/XF86keysym.hxevキー シーケンスが X によって XF86Paste および XF86Copy として解釈されていることを示していますが、これらのシンボルは実際に機能しますか? アプリケーション レベルのサポートが必要ですか?

答え1

Super を Ctrl にバインドする

Windows/Logo/Super左のキーを別のキーとして動作するようにバインドするのはどうでしょうかCtrl?

これは次の xmodmap コマンドで実現できます。

remove mod4 = Super_L
keysym Super_L = Control_L
add Control = Control_L

上記の行を保存したと仮定すると、super_as_ctrl.xmodmap実行することで効果をテストできます。

xmodmap super_as_ctrl.xmodmap

変更を永続的にするには(再ログイン/再起動後も変更が維持されるようにするには)、.Xmodmapホーム フォルダー内のファイルの名前を に変更します。

(上記は Ubuntu 11.10 ライブ システムでテストされましたが、他の Linux ディストリビューションでも同様です)


ターミナルプログラムのコピー/貼り付けショートカットの調整

Superバインドすると、ほぼどこにでもコピーできるCtrlようになりますSuper-C。唯一の例外はターミナル プログラムです。ただし、そこでショートカットを再定義できます。

今では、このオプションもあることがわかりましたgnome-terminal(慣れるまでは、私もそのオプションはありませんでしたCtrl-Shift-C)。そのオプションを使用する場合は、Edit / Keyboard Shortcuts...メニューで に移動し、Ctrl-Cコピーと貼り付けを割り当てます。などCtrl-Vについても同様です。konsole

心配しないでください。ショートカットを使用してプログラムを終了する機能は失われません。ターミナルのコピー ショートカットを再バインドした後は、以前とCtrl-Shift-C同じように使用できますCtrl-C。ターミナルは、Shift キーが押されているかどうかを区別しません。また、コピーのショートカットはキャッチされなくなります。代わりに、MountainX が回答で提案しているように、終了を別のショートカットに再バインドします。


XF86Copyなどが動作しない

コピーと貼り付けのキー シンボルについて: どうやら効果がないようです。コピー アクションを Shift-ScrollLock に割り当てて簡単にテストしました (未使用だったので、非修飾キーでテストしたかったのです):

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'

これを押しても、XF86AudioMute でも効果はありませんでした。ただし、文字「a」を割り当てると機能しました。したがって、これらの XF86 特殊キー シンボルに特定の問題があると思われます。

答え2

たとえば、Super+x、Super+c、Super+v という形式のシーケンスをいくつか、Ctrl+x、Ctrl+c、Ctrl+v などの他のシーケンスにバインドして、(OP が希望するように) これらの特定の Super キー シーケンスが、システム上の他の Super キーの使用に影響を与えることなく、一般的にカット アンド ペーストにマップされるようにしたい場合は、XKB 拡張機能を使用するだけで可能です。以下の手順では、手順の概要を示し、2 つの異なる初期キーボード設定の詳細例を 2 つ示します。これで、システムに適応するのに十分な情報が得られることを願っています。システム上のファイル ( などのシステムの場所にあるファイルを含む) の作成と編集に慣れていることを前提としています/usr/share/X11/xkb

  1. XKB 構成ツリーを配置する場所を決めます。まず、システム ディレクトリを探します。通常は /usr/share/X11/xkb にありますが、そこにない場合はどうやって見つけるかはよくわかりません。システムで "xkb" という名前のディレクトリを検索するだけです。いずれにしても、システム ディレクトリを見つけたら、その場でシステム ディレクトリを変更するか、任意のディレクトリを使用することができます。システム ディレクトリを使用する利点は、変更を簡単に呼び出せることですが、欠点は、将来のシステム更新によって変更が上書きされる可能性があることです (警告されています)。いずれにせよ、これ以降に説明するファイル名はすべてこのディレクトリを基準にしています。このディレクトリは、必要に応じて $XKBLOCAL$ として参照します。すべてのコマンドは、このディレクトリが現在のディレクトリであると想定します。

  2. 現在の x、c、v キーがどの XKB「タイプ」のキーであるかを判断します。これを行う最も簡単な方法は、コマンドを使用することですxkbcomp -a $DISPLAY - | grep -C 6 c,(パターンには意図的にコンマが含まれていることに注意してください)。私の最初のサンプル設定では、次の結果が生成されます。

    key <AB02> {
        type= "ALPHABETIC",
        symbols[Group1]= [               x,               X ]
    };
    key <AB03> {
        type= "ALPHABETIC",
        symbols[Group1]= [               c,               C ]
    };
    key <AB04> {
        type= "ALPHABETIC",
        symbols[Group1]= [               v,               V ]
    };
    key <AB05> {
    

    一方、私の他の例の設定では、

    key <AB02> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               x,               X, approxeq,     dead_ogonek ]
    };
    key <AB03> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               c,               C, ccedilla,        Ccedilla ]
    };
    key <AB04> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               v,               V, squareroot,           U25CA ]
    };
    key <AB05> {
    

    結局、最初の例では、関連するキーのタイプは「ALPHABETIC」ですが、2 番目の例では「FOUR_LEVEL」です。キーボードの設定によっては、まったく別のタイプになる場合があります。以下では、タイプは $TYPE$ として参照されますが、これは、以下のコマンド内の実際の文字列 ALPHABETIC などに置き換える必要があります。

  3. $TYPE$ の定義を見つけて、それを $XKBLOCAL$/types ディレクトリの新しいファイルにコピーします。これを行うコマンドは次のとおりです。xkbcomp -a $DISPLAY - | grep -z -o 'type "$TYPE$" {[^}]*};' > types/cutpaste私が選択したファイルの名前「cutpaste」は任意です。好きな名前を使用してください。ただし、後の手順でこのファイルを一貫して参照する必要があることに注意してください。最初のセットアップでは、このファイルの内容を取得します。

    type "ALPHABETIC" {
        modifiers= Shift+Lock;
        map[Shift]= Level2;
        map[Lock]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Caps";
    };
    

    そしてもう1つの例では、コンテンツを取得します

    type "FOUR_LEVEL" {
        modifiers= Shift+LevelThree;
        map[Shift]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
    };
    
  4. ファイル types/cutpaste を編集して、次の 2 つの操作を行います。適切な XKB 句となるようにプリアンブルとポストアンブルを追加し、型名と型定義を変更して、Super に対応する修飾子によって生成されるレベルをもう 1 つ追加します。システム上の修飾子が何であるかを確認する必要があります。以下で使用されているように、Mod4 である可能性があります。必要な変更は、types/cutpaste の 2 つの最終バージョンの例から明らかです。

    default partial xkb_types "addsuper" {
        type "ALPHABETIC_SUPER" {
            modifiers= Shift+Lock+Mod4;
            map[Shift]= Level2;
            map[Lock]= Level2;
            map[Mod4]= Level3;
            map[Shift+Mod4]= Level3;
            map[Lock+Mod4]= Level3;
            level_name[Level1]= "Base";
            level_name[Level2]= "Caps";
            level_name[Level3]= "With Super";
        };
    };
    

    そして

    default partial xkb_types "addsuper" {
        type "FOUR_LEVEL_SUPER" {
            modifiers= Shift+LevelThree+Mod4;
            map[Shift]= Level2;
            map[LevelThree]= Level3;
            map[Shift+LevelThree]= Level4;
            map[Mod4]= Level5;
            map[Shift+Mod4] = Level5;
            map[LevelThree+Mod4] = Level5;
            map[Shift+LevelThree+Mod4] = Level5;
            level_name[Level1]= "Base";
            level_name[Level2]= "Shift";
            level_name[Level3]= "Alt Base";
            level_name[Level4]= "Shift Alt";
            level_name[Level5]= "With Super"';
       };
    };
    
  5. 2 番目のステップで grep によって出力されたキー シンボル定義を 2 番目の新しいファイル symbols/cutpaste にコピーし、同様のプリアンブルとポストアンブルを追加し、新しいタイプを使用するように定義を変更し、Super バージョンによって生成された目的のキーを処理するためのアクションを定義に追加します。この 2 つの例の結果は次のとおりです。

    default partial xkb_symbols "superversions" {
        replace key <AB02> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               x,               X, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatX>,mods=Control,clearmods=Super)]
        };
        replace key <AB03> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               c,               C, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatC>,mods=Control,clearmods=Super)]
        };
        replace key <AB04> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               v,               V, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatV>,mods=Control,clearmods=Super)]
        };
    };
    

    そして

    default partial xkb_symbols "superversions" {
        replace key <AB02> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [x,X,approxeq,dead_ogonek,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatX>,mods=Control,clearmods=Super)]
        };
        replace key <AB03> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [c,C,ccedilla,Ccedilla,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatC>,mods=Control,clearmods=Super)]
        };
        replace key <AB04> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [v,V,squareroot,U25CA,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatV>,mods=Control,clearmods=Super)]
        };
    };
    

    2 番目の例では、行の長さを少し制御できるように、(重要でない) 空白もいくつか削除していることに注意してください。

  6. XKB が現在使用しているルール セットの名前を見つけます。これは簡単です。 の結果に表示されますsetxkbmap -query。私の場合は、「evdev」でした。

  7. システム バージョンの rules/evdev (またはルール セットの名前) を $XKBLOCAL$/rules/evdev にコピーし、作成したオプションを指すルールを追加します。ここでは 2 つの選択肢があります。evdev 全体をコピーするか、実際に使用しているキーボード モデル、レイアウト、バリアント、およびオプションを示す部分だけをコピーすることができます。もちろん、システム ファイルをその場で変更する場合は、コピーする必要はなく、編集するだけで済みます。

    この場合、キーボードの初期設定に関係なく、追加される内容は同じなので、例は 1 つだけです。ルール ファイルの で始まるセクションを見つけて! option = symbols、そのセクションに 1 行追加します。cutpaste:super = +cutpasteまた、ルール ファイルの で始まるセクションを見つけて、そのセクションにも! option = types1 行追加します。cutpaste:super = +cutpaste

  8. evdev.lst のシステム バージョンをコピーし、新しいオプションの行を追加します。このファイルの名前は、ルール ファイルの名前に .lst が追加された名前に一致することに注意してください。前の手順と同様に、ファイル全体をコピーすることも、使用しているモデル、レイアウト、バリアント、およびオプションによって参照される部分だけをコピーすることもできます。このファイルの で始まるセクションを見つけて! option、そのセクションに次のような行を追加するだけですcutpaste:super Add super equivalents of cut and paste operations

  9. これで、すべての設定ファイルが配置されました。システム ファイルを変更した場合は、 で新しいオプションを呼び出すことができますsetxkbmap -option cutpaste:super。一方、変更していない場合は、setxkbmap に $XKBLOCAL$ ディレクトリの場所を知らせる必要があります。さらに悪いことに、サーバーもそのディレクトリの場所を知らず、setxkbmap もそれを知らせません (または、サーバーが別のマシンで実行されている可能性があるため、おそらく知らせることができません)。そのため、setxkbmap の出力を xkbcomp にパイプし、そのコマンドに $XKBLOCAL ディレクトリの場所を知らせる必要があります。したがって、完全なコマンド ラインは ですsetxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY

XKBに関する優れたドキュメントや参考資料は少ないので、これが誰かの役に立ったり興味を引いたりすることを願っています。非常に役立つ参考資料はhttp://madduck.net/docs/extending-xkb/

答え3

私がやっていることは次のとおりです。これは究極の解決策ではありませんが、究極の解決策を実現しようと努力しましたが、多大な努力の末にそこに到達できませんでした。そこで、シンプルで、必要なことの 90% 以上に対応できるものに落ち着きました。これは、私が使用しているどのコンピューター (または新しい Linux インストール) でも、ほんの数分で実装できます。非常に簡単です。

X ターミナル アプリケーションで、ショートカットの設定を行います。私は Gnome と KDE の両方でこれを行ないました。たとえば、Konsole では、[メニュー] > [設定] > [ショートカットの設定] に移動します。Gnome X ターミナルにも同様のメニューがあります。ショートカット (例: [コピー]) を選択し、必要なキー シーケンスを入力するだけです。

ターミナルのコピー & 貼り付けショートカットがターミナルコマンドと競合する場合でも、簡単に修正できます。たとえば、コピーに CTRL-C を使用したい場合 (X ターミナルが CUA 標準に準拠するため) はどうすればよいのでしょうか。

その場合、stty キーの割り当ては簡単に変更できます (.bashrc 内)。コピーの CTRL-C の例を続けて、割り込みキーを CTRL-b (「break」) にしたいとします。これにより、次のことが実現されます。

echo "stty intr \^b" >> ~/.bashrc 

次に、.bashrc をソースします。

全体的な解決策は、X 端末設定を使用してショートカットを変更し、オプションで 1 行の echo コマンドを使用して stty との競合を解決するというシンプルなものです。非常にシンプルで、必要なことがほぼすべてカバーされています。

答え4

おそらく Windows キーは修飾キーです。これを実行してもう一度試してください:

xmodmap -e 'remove Mod4 = Super_L'

関連情報