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.h있으며 xev키 시퀀스가 ​​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거의 모든 곳에서 복사할 수 있습니다. 유일한 일반적인 예외는 터미널 프로그램입니다. 그러나 여기서 바로가기를 재정의할 수 있습니다.CtrlSuper-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대로) 특정 슈퍼 키 시퀀스는 일반적으로 시스템의 다른 슈퍼 키 사용에 영향을 주지 않고 잘라내기 및 붙여넣기로 매핑되며 XKB 확장만 사용하여 가능합니다. 아래 절차에서는 단계를 간략하게 설명하고 두 가지 다른 시작 키보드 설정에 대한 세부 정보에 대한 두 가지 다른 예를 제공합니다. 이것이 귀하의 시스템에 적응할 수 있는 충분한 정보를 제공할 수 있기를 바랍니다. ./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"인 반면 두 번째 예에서는 "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. 두 가지 작업을 수행하기 위해 파일 유형/잘라내기를 편집합니다. 적절한 XKB 절로 만드는 서문과 후문을 추가하고, 유형 이름과 유형 정의를 변경하여 Super에 해당하는 수정자에 의해 생성된 레벨을 하나 더 추가합니다. 시스템에 해당 수정자가 무엇인지 확인해야 합니다. 아래에 사용된 Mod4일 가능성이 높습니다. 필요한 수정 사항은 type/cutpaste의 두 가지 최종 버전 예에서 분명해야 합니다. 즉,

    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. 두 번째 단계에서 grep에 의해 출력된 키 기호 정의를 두 번째 새 파일 기호/잘라내기에 복사하고 유사한 프리앰블과 포스트앰블을 추가하고 정의를 수정하여 새로운 유형을 사용하고 정의에 작업을 추가하여 원하는 키를 처리합니다. Super 버전으로 제작되었습니다. 두 가지 예의 결과는 다음과 같습니다.

    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)]
        };
    };
    

    두 번째 예에서는 줄 길이를 약간 제어하기 위해 일부 (중요하지 않은) 공백도 압착했습니다.

  6. XKB가 현재 사용하고 있는 규칙 세트의 이름을 찾으십시오. 쉽습니다. 의 결과에 표시되어 있습니다 setxkbmap -query. 내 경우에는 "evdev"였습니다.

  7. rule/evdev의 시스템 버전(또는 규칙 세트의 이름이 무엇이든)을 $XKBLOCAL$/rules/evdev에 복사하고 우리가 만든 옵션을 가리키는 규칙을 추가합니다. 여기에는 두 가지 선택 사항이 있습니다. evdev 전체를 복사하거나 실제로 사용 중인 키보드 모델, 레이아웃, 변형 및 옵션을 언급하는 부분만 복사할 수 있습니다. 물론 시스템 파일을 제자리에서 수정하는 경우에는 복사할 필요 없이 편집만 하면 됩니다.

    이 경우 초기 키보드 설정과 관계없이 추가되는 내용은 동일하므로 예시는 하나만 있습니다. 로 시작하는 규칙 파일의 섹션을 찾아 해당 섹션에 ! option = symbols줄을 추가하고 cutpaste:super = +cutpaste, 또한 로 시작하는 규칙 파일의 섹션 ! option = types과 해당 섹션에 대한 줄 cutpaste:super = +cutpaste도 찾습니다.

  8. evdev.lst의 시스템 버전을 복사하고 새 옵션에 대한 줄을 추가합니다. 이 파일의 이름은 단순히 .lst가 추가된 규칙 파일의 이름에 해당합니다. 이전 단계와 마찬가지로 전체 파일을 복사하거나 사용 중인 모델, 레이아웃, 변형 및 옵션에서 참조하는 부분만 복사할 수 있습니다. 이 파일에서 다음과 같이 시작하는 섹션을 찾아 해당 섹션에 ! option다음과 같은 줄을 추가하면 됩니다 .cutpaste:super Add super equivalents of cut and paste operations

  9. 자, 이제 모든 구성 파일이 준비되었습니다. 시스템 파일을 수정한 경우 이제 를 사용하여 새 옵션을 호출할 수 있습니다 setxkbmap -option cutpaste:super. 반면에 그렇지 않은 경우 $XKBLOCAL$ 디렉토리가 어디에 있는지 setxkbmap에 알려야 합니다. 더 나쁜 것은 서버도 해당 디렉토리가 어디에 있는지 모르고 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 터미널 설정을 사용하여 바로 가기를 변경한 다음 선택적으로 한 줄의 echo 명령을 사용하여 stty와의 충돌을 해결하는 것만큼 간단합니다. 아주 간단하고 필요한 거의 모든 것을 다룹니다.

답변4

아마도 Windows 키는 수정자 키일 것입니다. 이것을 실행하고 다시 시도하십시오:

xmodmap -e 'remove Mod4 = Super_L'

관련 정보