한동안 저는 데스크탑과 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
거의 모든 곳에서 복사할 수 있습니다. 유일한 일반적인 예외는 터미널 프로그램입니다. 그러나 여기서 바로가기를 재정의할 수 있습니다.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대로) 특정 슈퍼 키 시퀀스는 일반적으로 시스템의 다른 슈퍼 키 사용에 영향을 주지 않고 잘라내기 및 붙여넣기로 매핑되며 XKB 확장만 사용하여 가능합니다. 아래 절차에서는 단계를 간략하게 설명하고 두 가지 다른 시작 키보드 설정에 대한 세부 정보에 대한 두 가지 다른 예를 제공합니다. 이것이 귀하의 시스템에 적응할 수 있는 충분한 정보를 제공할 수 있기를 바랍니다. ./usr/share/X11/xkb
XKB 구성 트리를 상주할 위치를 결정하십시오. 먼저 시스템을 찾으십시오. 일반적으로 /usr/share/X11/xkb에 있으며, 거기에 없으면 어떻게 찾는지 잘 모르겠습니다. 시스템에서 "xkb"라는 디렉토리를 검색하면 됩니다. 어쨌든, 일단 그것을 찾으면 시스템을 그 자리에서 수정하거나 원하는 디렉토리를 사용할 수 있습니다. 시스템 디렉터리를 사용하면 변경 사항을 훨씬 더 쉽게 호출할 수 있다는 장점이 있지만, 향후 시스템 업데이트가 변경 사항을 덮어쓸 수 있다는 단점이 있습니다(경고됨). 어쨌든, 이후에 언급되는 모든 파일 이름은 이 디렉토리에 상대적입니다. 필요한 경우 $XKBLOCAL$이라고 부르며, 모든 명령은 이것이 현재 디렉토리라고 가정합니다.
현재 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 또는 아래 명령의 다른 문자열로 바꿔야 합니다.
$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"; };
두 가지 작업을 수행하기 위해 파일 유형/잘라내기를 편집합니다. 적절한 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"'; }; };
두 번째 단계에서 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)] }; };
두 번째 예에서는 줄 길이를 약간 제어하기 위해 일부 (중요하지 않은) 공백도 압착했습니다.
XKB가 현재 사용하고 있는 규칙 세트의 이름을 찾으십시오. 쉽습니다. 의 결과에 표시되어 있습니다
setxkbmap -query
. 내 경우에는 "evdev"였습니다.rule/evdev의 시스템 버전(또는 규칙 세트의 이름이 무엇이든)을 $XKBLOCAL$/rules/evdev에 복사하고 우리가 만든 옵션을 가리키는 규칙을 추가합니다. 여기에는 두 가지 선택 사항이 있습니다. evdev 전체를 복사하거나 실제로 사용 중인 키보드 모델, 레이아웃, 변형 및 옵션을 언급하는 부분만 복사할 수 있습니다. 물론 시스템 파일을 제자리에서 수정하는 경우에는 복사할 필요 없이 편집만 하면 됩니다.
이 경우 초기 키보드 설정과 관계없이 추가되는 내용은 동일하므로 예시는 하나만 있습니다. 로 시작하는 규칙 파일의 섹션을 찾아 해당 섹션에
! option = symbols
줄을 추가하고cutpaste:super = +cutpaste
, 또한 로 시작하는 규칙 파일의 섹션! option = types
과 해당 섹션에 대한 줄cutpaste:super = +cutpaste
도 찾습니다.evdev.lst의 시스템 버전을 복사하고 새 옵션에 대한 줄을 추가합니다. 이 파일의 이름은 단순히 .lst가 추가된 규칙 파일의 이름에 해당합니다. 이전 단계와 마찬가지로 전체 파일을 복사하거나 사용 중인 모델, 레이아웃, 변형 및 옵션에서 참조하는 부분만 복사할 수 있습니다. 이 파일에서 다음과 같이 시작하는 섹션을 찾아 해당 섹션에
! option
다음과 같은 줄을 추가하면 됩니다 .cutpaste:super Add super equivalents of cut and paste operations
자, 이제 모든 구성 파일이 준비되었습니다. 시스템 파일을 수정한 경우 이제 를 사용하여 새 옵션을 호출할 수 있습니다
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'