zsh에서 올바른 제어 키를 바인딩하는 방법은 무엇입니까?

zsh에서 올바른 제어 키를 바인딩하는 방법은 무엇입니까?

인터넷에 검색해보니 이런 질문을 하시는 분이 없더군요. 오른쪽으로 이동과 자동 완성이 autosuggest-accept동일한 키 바인딩이라는 점이 짜증스럽습니다 . 내 최종 추측은

bindkey -v '<C-Right>' autosuggest-accept

그리고

bindkey '\xffe4' autosuggest-accept  

그러나 그들은 직업이 없습니다. 이 작업을 수행하는 방법을 알아 보려면 어떻게 해야 합니까?

답변1

간단히 말해서: 당신은 아마도 할 수 없을 것입니다

더 길다 : 당신이 말하는 것은 0xffe4다음과 같습니다 <X11/keysymdef.h>:

/* Modifiers */

#define XK_Shift_L                       0xffe1  /* Left shift */
#define XK_Shift_R                       0xffe2  /* Right shift */
#define XK_Control_L                     0xffe3  /* Left control */
#define XK_Control_R                     0xffe4  /* Right control */
#define XK_Caps_Lock                     0xffe5  /* Caps lock */
#define XK_Shift_Lock                    0xffe6  /* Shift lock */

하지만 이것만은 주의해주세요수정자. 일반적으로 이 키만조정X의 다른 키 바인딩은 단독으로 작동하지 않습니다. zsh, bash 또는 기타 쉘의 경우 별도로 실행할 무언가가 필요합니다. 사용하거나 xmodmap패치 할 수 있습니다.xkb, 키가 하나 이상의 문자를 보내도록 하는 방법을 발명했지만 이것이 없으면 쉘은 아무것도 볼 수 없습니다.

답변2

내 생각엔 이건 할 수 없을 것 같아모든 소프트웨어/프로그램을 포함하여 터미널 내에서 실행합니다 zsh.

또는 적어도 어떤 소프트웨어에서도 Right Ctrl (alone)무언가에 바인딩하거나 바인딩하는 방법이 매뉴얼에 설명되어 있거나 Left CtrlRight Ctrl. 이 옵션이 있는(모든 터미널에서 작동하는) 소프트웨어를 알고 있다면 알려주시기 바랍니다. 내가 구성한 소프트웨어에는 , , , , , , , 및 가
포함되어 있으며 그 중 어느 것도 원하는 것을 말하지 않습니다. 따라서 일부 소프트웨어가 터미널에서 이 작업을 수행할 수 있다면 이는 최소한 극히 드뭅니다. 내가 본 것과 비슷한 것은 누르는 것에 관한 것입니다. 즉, 일반 키보드에 위/아래 키가 없는 경우도 있습니다.vimzshlffzftmuxhtoplessmostvisidata

C-Left, C-Rightman tmuxany Ctrlleft or right arrowLeft or Right CtrlC-Up, C-DownCtrl


할 수 없습니다 zsh( zsh설명서가 정확하다고 가정).
검색 후 man zshall( man zsh불완전) 바로가기가 있는 것을 확인했습니다 Ctrl + v.

quoted-insert (^V) (unbound) (unbound)
Insert the next character typed into the buffer literally.  An interrupt character will not be inserted.

이제 , any Ctrl + vLeft Ctrl + a또는 any Ctrl + vRight Ctrl + a, 둘 다 표시해 봅니다 ^A. 이는 둘 다 동일한 문자를 입력한다는 의미입니다(확인 vim하고 를 누르면 값이 있는 ga두 번째 문자임을 알 수 있습니다 ). 따라서 와 사이에는 아무런 차이가 없을 수도 있습니다.ascii0x01zshLeft CtrlRight Ctrl

을 누르면 any Ctrl + vRight Ctrl (alone)아무 일도 일어나지 않습니다.
둘 다 나에게 같은 말을 vim한다 : 그들은 언제 키가 없는 키를 눌렀는지 zsh모르고 , 특이한 키 (적어도 터미널에서는 흔하지 않음)가 나에게 with 또는 with 를 제공한다 . 터미널을 사용하여 의미를 식별할 수 있습니다.Ctrl
Ctrl + vF1^[OPzsh<F1>vimF1


이와 같은 셸은 zsh내부적으로 실행될 수 tmux있으며 tmux함수와 send-keys. 이는 일반적으로 원하는 것을 할 수 없다는 것을 의미합니다.Left CtrlRight Ctrl

확실히, 나는 또한 tmux소스 코드(내가 사용한 git clone tmux)를 검색하고 키 rgrep -i "ctrl\|control" | grep -i "right\|ctrl.\?r\|r.\ctrl"에 대해 이야기할 때마다 어떤 일이 일어나는지 확인하려고 노력했으며 Right Ctrl내가 찾은 내용은 다음과 같습니다.

tty-keys.c:134: { "\033Oc", KEYC_RIGHT|KEYC_CTRL },
tty-keys.c:405: { TTYC_KRIT5, KEYC_RIGHT|KEYC_CTRL },
tty-keys.c:406: { TTYC_KRIT6, KEYC_RIGHT|KEYC_SHIFT|KEYC_CTRL },
tty-keys.c:407: { TTYC_KRIT7, KEYC_RIGHT|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL },
CHANGES:2395:  control the maximum length of left and right components of the 
status bar.
CHANGES:2550:  C- for ctrl keys (^ is still accepted as an alternative).
status.c:1168:  case KEYC_RIGHT|KEYC_CTRL:

따라서 대부분의 내용이 논의 Ctrl + Right되고 나머지는 관련이 없습니다.


일부 터미널에서는 다음과 같습니다.잉시(모든 키를 구성할 수 있음) 위에 config.h다음과 같은 코드가 표시됩니다.

{ XK_KP_End,        ControlMask,    "\033[1;5F",    +1,    0},
{ XK_KP_End,        ShiftMask,      "\033[K",       -1,    0},

Ctrl + End를 누르거나 무언가가 완료되면 Shift + Endleft 또는 right 사이에 아무런 차이가 없음을 의미합니다 Ctrl. 단 하나의 ControlMask, 오직 하나만 있습니다 ShiftMask(따라서 키에 관한 것이라면 내 대답은 동일할 것입니다 Shift).

또한 소스 코드 rgrep에 대해 명령을 시도했지만 st다시 Ctrl + Right.


다른 터미널 에뮬레이터에서도 이 작업을 수행할 수 있습니다. 일반적인 경우에는 할 수 없다는 점을 고려하면 충분하다고 생각합니다. 실제로 이 동작을 달성하고 켜는 방법이 있지만 zsh매우 어렵습니다. 편집기의 소스 코드 zsh, 터미널 에뮬레이터의 소스 코드 및 xorg.


Right Ctrl동작을 변경하려면 Right Ctrl각 소프트웨어에 대한 바인딩이 필요합니다. 키보드 구성에 대한 자세한 내용 은 및 를
참조하십시오 man xmodmap.man setxkbmapman xkeyboard-config

일반적으로 Ctrl키는 수정자입니다. 이는 다른 키와 함께 누를 때만 특정 작업을 수행해야 함을 의미합니다.

노트:드문 경우지만 키가 수정자 또는 키 역할을 할 수 있습니다. 예를 들면 다음과 같습니다.

  • 일부 소프트웨어( 포함 libreoffice)에서는 키를 누르면 밑줄이 그어진 문자가 표시됩니다 Alt.
  • xev는 이벤트 테스트를 위한 도구이므로 아무 키나 누르는 것을 포함하여 모든 것을 인식합니다.
  • 이중 기능 키는 다음에서 나옵니다.QMK특정 키를 빠르게 입력하면 "일반 키"처럼 작동하고 다른 키를 누르면 수정자 키처럼 작동하도록 허용합니다.
  • emacs하나 있다튜닝 코드특징. 이는 공식적인 수정자( Shift또는 Control등 ) 에 관한 것이 아니지만 Alt, 다른 키와 함께 특정 지연 시간 내에 누르면 일반 키가 수정자 역할을 하게 만들 수 있습니다. emacs터미널 외부에서 실행될 수 있고 emacs. 따라서 다음을 수행할 수 있습니다.
    • 어디에서나 키를 Right Ctrl무언가(우리가 부르는 foo)에 사용하거나 다시 매핑합니다.setxkbmapxmodmap
    • 내부에서는 일부 부품 에 사용하기 위해 emacs다시 매핑 하지만 실행 중인 위치에는 사용할 수 없습니다 .fooright controlkey-chordzsh
    • 제가 이것을 테스트하지는 않았으며 가능하다면 간단하지 않을 수도 있지만 emacs제가 아는 유일한 "터미널 에뮬레이터"입니다(실제로는 텍스트 편집기라고 되어 있지만 많은 기능이 있습니다) , 쉘 실행 포함)은 "수정자 키이자 일반 키인 것"에 가까운 기능을 가지고 있습니다.

관련 정보