Super + C Super + Vをコピーアンドペーストにバインド


23

しばらくの間、デスクトップ上の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はまったく機能しないようです。これらはリストされており、キーシーケンスがXによってXF86PasteおよびXF86Copyとして解釈されていること/usr/include/X11/XF86keysym.hxev示していますが、これらのシンボルは実際に機能しますか?アプリケーションレベルのサポートが必要ですか?

回答:


18

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特殊キーシンボルには特定の問題があると思います。


3
残念ながら、SuperをCtrlにバインドしても、Ctrl / Super + Shift + Cを使用してターミナル内でコピーアンドペーストする必要があります。これは主なインセンティブです。XF86キーが機能しないことを確認していただきありがとうございます。
ソロ

どの端末プログラムを使用していますか?少なくともgnome-terminalで動作するソリューションを追加しました。そして、他の人にも似ているはずです。
zpea

4
メタへのコントロールのバインドは、コピー/貼り付けのショートカットをMeta + c / vに変更することとは異なります。LinuxでMacOに似たkboardショートカットを作りたいので、この答えは素晴らしいものではありません
...-Sonique

1
Shift + ctrl + cまたは不格好で、SuperをCtrlに再バインドするだけで、Super + cでkillシグナルが送信されるため、それほど多くは解決しません
rien333

最初のステップは、スーパー/コマンドをコントロールに変えるために私がしたこととほぼ同じです。これでほとんどの問題は解決しますが、cmdが別の場所でctrlを意味する場合でも、cmd-cとctrl-cに異なる機能を持たせたいと思います。xmodmapと端末固有のショートカットを使用してこれを実行できるかどうかはわかりません。
tedder42

9

たとえば、Super + x、Super + c、Super + vの形式のいくつかのシーケンスをCtrl + x、Ctrl + c、Ctrl + vなどの他のシーケンスにバインドする場合、(OPとして)これらが特定のスーパーキーシーケンスは通常、システム上のスーパーキーの他の使用に影響を与えることなく、カットアンドペーストにマッピングされます。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";
    };
    

    他の例では、コンテンツを取得します

    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. ファイルタイプ/カットペーストを編集して、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番目の新しいファイルシンボル/カットペーストにコピーし、同様のプリアンブルとポストアンブルを追加し、定義を変更して新しいタイプを使用し、目的のキーを処理するアクションを定義に追加しますスーパーバージョンによって生成されます。この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 = symbolscutpaste:super = +cutpasteを追加します。また、ルールファイルのセクションで始まり、そのセクションへ! option = typesの行も見つけcutpaste:super = +cutpasteます。

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

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

良い決定的なXKBのドキュメント/参照が不足しているので、これが誰かの助け/興味を引くことを願っています。非常に役立つリファレンスの1つはhttp://madduck.net/docs/extending-xkb/でした。


素晴らしい答え。これは17.10で機能しました
blockloop

これは、Ubuntu 18.04では機能しませんでした。その結果、「c」、「x」、「v」キーが機能しなくなりました。私はそれらを再び動作させることができましたsetxkbmap -option。ローカル設定は、部分シンボルファイルから除外したいくつかのGroup2、Group3シンボルを除いて、FOUR_LEVELの例とほとんど同じでした。そのため、ファイルは例と同じに見えました。
JinnKo

2

これが私がやることです。それは究極の解決策ではありませんが、私は究極の解決策を達成しようとしましたが、多くの努力を払ってそこに到達することができませんでした。だから私はシンプルで、必要なものの90%以上で機能する何かに落ち着きました。数分で、私が行くコンピューター(または新しいLinuxインストール)にそれを実装できます。とても簡単です。

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

端末のコピーと貼り付けのショートカットが端末のコマンドと競合する場合は、簡単な修正方法もあります。たとえば、誰かがコピーにCTRL-Cを使用したい場合(X端末がCUA標準に準拠する場合)はどうでしょうか?

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

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

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

全体の解決策は、X端末設定を使用してショートカットを変更し、オプションで、1行のechoコマンドでsttyとの競合を解決するのと同じくらい簡単です。完全にシンプルで、必要なほぼすべてをカバーしています。


0

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

xmodmap -e 'remove Mod4 = Super_L'

ありがとう、しかしトリックをしません。xevがXF86イベントを報告するため、マッピングが機能することを知っています。
ソロ

私の最初の投稿(xmodmap -e 'remove Mod1 = Meta_L'コマンドの実行と試行)はうまくいきました。
ソ連邦

1
@soloは、動作するかどうかについて、すべてのデスクトップ環境またはアプリケーションがそれらをサポートするとは限りません。実際に機能するかどうかを確認するには、たとえばFirefoxで使用してください。Xキーバインディングをサポート(リッスン)します。
ソ連邦

0

Glen Whitneyが言ったことの一部を取り上げ、その知識を使用して、macOSからの単語の悪い動作やテキスト操作の動作をカスタムキーマップにマッピングすることに成功しました。

その特定のソリューションを使用せずに、Ctrlとスーパーコピーアンドペーストの問題をすでに解決しましたが、先ほど言ったように、他のことには非常に役立ちました。また、ある時点でWaylandを完全にサポートすることを目指しているため、xmodmapなどのことも避けました。Kintoはネイティブのxkbを使用し、端末の動作のような予想されるmacOSを尊重します。

https://github.com/rbreaves/kinto

https://medium.com/@benreaves/kinto-a-mac-inspired-keyboard-mapping-for-linux-58f731817c0

ここにも要点があります。すべての核心にあるものを見たいだけなら、必要なときにキーマップを変更しません。Gistには、Cmdと矢印キーを使用するmacOSスタイルのカーソル/ワード単位の操作をセットアップするカスタムxkbキーマップファイルも含まれていません。

https://gist.github.com/rbreaves/f4cf8a991eaeea893999964f5e83eebb

要旨

# permanent apple keyboard keyswap
echo "options hid_apple swap_opt_cmd=1" | sudo tee -a /etc/modprobe.d/hid_apple.conf
update-initramfs -u -k all

# Temporary & instant apple keyboard keyswap
echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd

# Windows and Mac keyboards - GUI (Physical Alt is Ctrl, Physical Super is Alt, Physical Ctrl is Super)
setxkbmap -option;setxkbmap -option altwin:ctrl_alt_win

# Windows and Mac keyboards - Terminal Apps (Physical Alt is Super, Physical Super is Alt, Physical Ctrl is Ctrl)
setxkbmap -option;setxkbmap -option altwin:swap_alt_win

# If the hid_apple driver is not loaded for Apple keyboards, which can be found out
# by the lsmod command then the above setxkbmap commands will not work
# Use the following commands for Apple style keyboards without an hid_apple driver
#
# Note: this could also apply to hid_apple driver as well 
# if this option is set to 0 inside swap_opt_cmd
#
lsmod | grep hid_apple

# Apple keyboard without hid_apple - GUI
setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl,ctrl:swap_rwin_rctl

# Apple keyboard without hid_apple - Terminal
setxkbmap -option;setxkbmap -option altwin:alt_super_win

#
# If you want a systemd service and bash script to help toggle between
# GUI and Terminal applications then look at project Kinto.
# https://github.com/rbreaves/kinto
#
# Note: The above may not work for Chromebooks running Linux, please look
# at project Kinto for that.
#
# If anyone would like to contribute to the project then please do!
#
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.