추가 읽기

추가 읽기

Ctrl+LeftArrow를 터미널의 이전 단어(XWindowSystem 없음)에 바인딩해 보았습니다.

그러나 Ctrl+LeftArrow 및 LeftArrow가 터미널에서 동일한 이스케이프 시퀀스를 생성하는 것을 관찰했습니다.

  1. 나는 Ctrl+V를 누른다
  2. 나는 왼쪽 화살표를 누른다
  3. 나는 받았다^[[D
  4. 나는 Ctrl+V를 누른다
  5. Ctrl+왼쪽 화살표를 누릅니다
  6. 나는 받았다^[[D

Ctrl+오른쪽 화살표에도 같은 문제가 있습니다. 어떻게 해결할 수 있나요?

(데비안: 리눅스 v4.19.0-8-amd64)

답변1

^[[D왼쪽 화살표로 얻었습니다 .

Ctrl-왼쪽은 Linux VC 및 xterm에 ^[[151제공됩니다 .^[[1;5D


man keymaps가지다:

 Which  of  the actions bound to a given key is taken when it is pressed depends on what
   modifiers are in effect at that moment.  The  keyboard  driver  supports  9  modifiers.
   These  modifiers  are  labeled  (completely  arbitrarily)  Shift,  AltGr, Control, Alt,
   ShiftL, ShiftR, CtrlL, CtrlR and CapsShift.  Each of these modifiers has an  associated
   weight of power of two according to the following table:

          modifier            weight

          Shift                  1
          AltGr                  2
          Control                4
          Alt                    8
          ShiftL                16
          ShiftR                32
          CtrlL                 64
          CtrlR                128
          CapsShift            256

Shift 및 Control과 마찬가지로 두 개의 "Alt" 키가 동일한 작업을 수행하도록 변경했습니다.

예: 키맵 파일 loadkeys:

# three modifiers -> 8 cols. (AltGr missing):
#
keymaps 0-1,4-5,8-9,12-13

그런 다음:

# left modifiers
keycode  42 = Shift
keycode  29 = Control
keycode  56 = Alt
keycode  58 = Caps_Lock
# right side...just Alt
keycode  54 = Shift
keycode  97 = Control
keycode 100 = Alt

일반적으로 100=AltGr입니다.

그런 다음 기본 "왼쪽" 뒤에 두 가지 추가 작업을 추가했습니다.

keycode 105 = Left F150 F151
  string F150 = "\033[150"
  string F151 = "\033[151"

이는 2단계 프로세스여야 합니다. "F150"은 수정된 키를 문자열과 연결하는 데 사용되는 레이블일 뿐입니다.

이제 화살표 키(105)는 이전과 같이 "왼쪽"을 생성하지만 Shift 및 Control은 선택된 이스케이프 시퀀스를 생성합니다.

그런 다음 ~/.inputrc:

# Moving - modif. L+R Arrows in linux VC
# ascii codes in X / evdev / xterm
#
"\e[150":  backward-word
"\e[1;2D": backward-word
"\e[154":   forward-word
"\e[1;2C":  forward-word

"\e[151":  shell-backward-word
"\e[1;5D": shell-backward-word
"\e[155":   shell-forward-word
"\e[1;5C":  shell-forward-word

1;2D돌이켜보면 X가 만든 걸 선택했어야 했는데 . 이것은 일부 inputrc 라인을 저장합니다. 하지만 이러한 이스케이프 시퀀스는 나에게 다소 불투명해 보였으므로 나만의 이스케이프 시퀀스를 정의했습니다.


수정자 매핑을 설명하려면 다음을 수행하십시오.

# "Print Screen Sys Rq" is Nr 99
#
keycode 99 =  F91 F92 F93 nul F95 F96
 string F91 = " --help\n"
 string F92 = " |less"
 string F93 = " |grep "
 string F95 = "()\033[D"
 string F96 = "echo \'\033[4~\'"

--help이제 이전에 사용하지 않은 "인쇄" 키를 눌러 plus 를 쓸 수 있습니다 Enter. X가 "인쇄" 키도 무시하기 때문에 이것은 Linux VC에서만 작동하며 XKB에서는 이를 활성화하는 방법을 찾지 못했습니다.

"nul" 항목은 "Shift+Control"의 위치이며 전달됩니다.무게"Alt" 앞에 나타납니다.

keymaps 0-1,4-5,8-9,12-13:숫자 "0,1,4,5,8"은 "F95"가 있는 다섯 번째 위치에 가중치 "8"을 넣습니다. "8"은 "Alt"로 정의됩니다. 값 2의 AltGr 가중치를 건너뛰고 싶기 때문에 2,3,6,7이 누락되었습니다.


10개의 F 키와 Shift, Control, Alt(왼쪽이나 오른쪽 없음)의 8가지 조합을 결합하면 원하는 경우 80가지의 다양한 키 기능을 얻을 수 있습니다. 하지만 Shift+Control-F6을 사용하여 한 가지 작업을 수행하고 Control+Alt-F9를 사용하여 다른 작업을 수행하려는 사람은 누구입니까?

답변2

이 기능을 추가하기 위해 Linux에 내장된 터미널 에뮬레이터 프로그램을 다시 작성했습니다.

내장 터미널 에뮬레이터제어 시퀀스에 수정자 정보를 전혀 포함하지 않습니다.. 특히 일부 GUI 터미널 에뮬레이터처럼 커서 키보드의 제어 순서에 수정자 정보가 포함되지 않습니다.

GUI 터미널 에뮬레이터 및 실제 터미널과 비교할 때 운영 체제 커널(예: Linux 및 BSD 커널)에 내장된 터미널 에뮬레이터 프로그램에는 완료할 수 없는 많은 기능이 있다는 것을 알 수 있습니다. (NetBSD 및 OpenBSD 사용자 매뉴얼에는 wscons실제 DEC VT가 수행하는 작업과 수행하지 않는 작업이 자세히 설명되어 있습니다. Linux doco는 그다지 유용하지 않습니다.)

키맵을 사용하여 커서 키를 (높은 번호의) 프로그래밍 가능한 기능 키로 정의하고, 가능한 각 수정자 조합에 대해 다른 기능 키를 사용하고, 모든 기능 키 문자열을 적절한 제어 순서로 수동으로 코딩하면 됩니다. 이것은 지루하고 터무니없는 일이며 DECCKM의 시작이 중단됩니다(Linux 내장 터미널 에뮬레이터는 실제로 커서 키보드 키로 지정된 키맵의 키에만 DECCKM을 적용하기 때문입니다).

몇 개 있어요사용자 공간X용 터미널 에뮬레이터는 필요하지 않습니다. 다른 사람들을 확인하지 않았기 때문에 말할 수는 없지만 제어 순서에 수정자 정보를 제공합니다. 언급한 코드는 다음과 같습니다.

%고양이-V
^[[D^[[C^[[A^[[B^[[1;5D^[[1;5C^[[1;5A^[[1;5B]
^[[D^[[C^[[A^[[B^[[1;5D^[[1;5C^[[1;5A^[[1;5B]
%콘솔 디코딩 ecma48--입력
^[[D^[[C^[[A^[[B^[[1;5D^[[1;5C^[[1;5A^[[1;5B]
견습생
CUF
CUU
CUD
컨트롤+컵 1
컨트롤+CUF 1
컨트롤+CUU 1
컨트롤+CUD 1
만약에
%setterm --appcursorkeys on; 콘솔 디코딩 ecma48--input
^[OD^[OC^[OA^[OB^[[1;5D^[[1;5C^[[1;5A^[[1;5B]
SS3 '디'
SS3 'ㄷ'
SS3 '에이'
SS3 '비'
컨트롤+컵 1
컨트롤+CUF 1
컨트롤+CUU 1
컨트롤+CUD 1
만약에
%

추가 읽기

관련 정보