Bash vi 모드에서 jk를 매핑하여 삽입 모드를 종료합니다.

Bash vi 모드에서 jk를 매핑하여 삽입 모드를 종료합니다.

저는 ubuntu 16.04와 bash 쉘을 새로 설치하고 있습니다. 나는 두 가지 일을 하고 싶다:

  1. 터미널에서 vim과 유사한 작업을 수행할 수 있도록 vi 모드를 설정합니다.
  2. 다음을 입력하여 삽입 모드를 종료하세요.jk

나는 읽었다다른 게시물어떻게 해야 하나요 zsh? 어떻게 해야 하나요 bash?

너무 길어요.

bind '"jk":vi-movement-mode'그런 다음 파일 .bashrc에 넣으십시오 set -o vi:)

server@thinkpad:~$ tail -n 2 .bashrc
set -o vi
bind '"jk":vi-movement-mode'

자세한 설명은 @grochmal의 답변을 참조하세요.

답변1

긴 이야기 짧게

Bash는 zshthrough와 유사한 기능을 가지고 있지만 .bindkeybindvizshset -o vi

bind '"jk":vi-movement-mode'

이는 다음 zsh과 같습니다.bindkey -M <all vi modes> jk vi-movement-mode

이러한 vi-movement-mode함수는 다음에서 제공됩니다 inputrc( /etc/inputrc목록은 참고자료 참조).

전문

Stephen Harris가 댓글에서 지적했듯이:

  • .bashrc항상 호출됩니다 bash(특히 다른 쉘에서는 호출되지 않음).

  • .bash_profile로그인 쉘에서만 호출됩니다(다시 말하지만, bash에서만 호출됩니다).

여러 배포판에는 .bash_profile다음과 같은 프레임워크가 함께 제공됩니다.

# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc

.bash_profile존재한다는 사실을 잊어버릴 수 있기 때문에 이는 훌륭한 콘텐츠입니다 .

이제 쉘 세션 jk에 매핑하는 것은 사실상 불가능합니다. Esc이 작업을 수행할 때:

inoremap jk <esc>

Vim에서 를 입력한 후 Vim은 다음 입력이 매핑을 호출해야 하는지(또는 다른 키를 입력하면 매핑이 트리거되지 않아야 하는지) j확인하기 위해 잠시 기다려야 한다는 것을 알고 있습니다 . k부록으로 이는 :set timeoutlen=<miliseconds>Vim에 의해 제어됩니다(참고자료 참조 :h timeoutlen).

일부 쉘 또는 X11에는 이러한 시간 초과 제어 기능이 없으며 다중 문자 매핑을 허용하지 않습니다. 단일 키에 대한 매핑만 허용됩니다(그러나 아래 지원 참고 사항 참조).

set -o vi

를 읽지 못하고 쉘에서 사용할 수 있는 일부 (심지어 ) 키 조합을 .vimrc에뮬레이트할 뿐입니다 . 모든 힘을 갖고 있지 않은 경우에도 마찬가지입니다 .vivim-o emacsemacs


zsh 지원

zsh지도 시간 초과는 실제로 지원됩니다. 다음을 사용하여 매핑할 수 jk있습니다 <esc>.

bindkey -v  # instead of set -o vi
bindkey -e jk \\e

~/.zshrc(이것은 없이 진행되어야 합니다 ~/.bashrc)

그러나 나는 이렇게 하지 않는 것이 좋습니다. 나는 대부분의 시간에 을 사용합니다 vim. 위의 조합을 사용해 보았습니다 zsh. 사용할 때 인쇄하는 데 너무 오래 기다리면 짜증이 납니다 .inoremap jk <esc>vimrcbindkeyzshj


배쉬 지원

bash지원됨 컴파일 없이 컴파일된다고 readline bind생각하므로 bash를 지원하지 않는 드문 시스템이 있을 수 있습니다 (주의하세요). 수행 해야 할 작업 을 매핑하려면 다음을 수행하세요 .bashreadilnebindjk<esc>bash

set -o vi
bind '"jk":"\e"'

(예, 이는 이중 수준 참조이므로 필수입니다.)

다시 말하지만, 이것은 타이핑을 j매우 짜증나게 만듭니다. 그러나 내 컴퓨터의 솔루션보다 덜 짜증스럽습니다 zsh(아마도 기본 시간 초과가 더 짧을 것입니다).


해결 방법(bash 및 zsh가 아닌 쉘의 경우)

키를 다시 매핑하는 이유 Esc는 키보드와 꽤 멀리 떨어져 있고 타이핑하는 데 시간이 걸리기 때문입니다. 이 사람들에게서 빌릴 수 있는 한 가지 비결은 어차피 쓸모없는 키이기 때문에 emacs다시 매핑하는 것입니다 . 사람들은 그것을 에 다시 매핑 하지만 우리는 에 다시 매핑할 것입니다 .CapsLockemacsCtrlEsc

xev -event keyboard이것을 사용하여 키 코드를 확인 합시다 CapsLock:

KeyPress event, serial 25, synthetic NO, window 0x1c00001,
    root 0x496, subw 0x0, time 8609026, (764,557), root:(765,576),
    state 0x0, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

그리고 다음 기능을 확인하십시오 Esc.

KeyPress event, serial 25, synthetic NO, window 0x1c00001,
    root 0x496, subw 0x0, time 9488531, (571,525), root:(572,544),
    state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
    XLookupString gives 1 bytes: (1b) "
    XmbLookupString gives 1 bytes: (1b) "
    XFilterEvent returns: False

좋습니다. CapsLock키 코드는 66이고 Esc기능은 "Escape"입니다. 이제 우리는 이것을 할 수 있습니다:

# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"

~ 위에~ 해야 하다이 순서대로 완료하세요. 이제 누를 때마다 CapsLock열쇠처럼 작동합니다 Esc.


까다로운 부분은 어디에 설정해야 하는가입니다. ~/.Xmodmap다음을 포함하는 파일:

remove lock = Caps_Lock
keycode 66 = Escape

~/X*대부분의 배포판(실제로는 디스플레이 관리자이지만 단순화를 위해 배포판에 대해 이야기하고 있음)에서 존중해야 하지만 여러 파일을 존중하지 않는 일부 배포판을 본 적이 있습니다 . 이러한 배포판의 경우 다음을 시도해 볼 수 있습니다.

if [ "x" != "x$DISPLAY" ]; then
    xmodmap -e "remove lock = Caps_Lock"
    xmodmap -e "keycode 66 = Escape"
fi

당신의 .bashrc.

(이론적으로는 이것이 더 좋지만 ~/.xinitrc디스플레이 관리자가 이를 존중하지 않으면 .Xmodmap확실히 존중하지 않을 것입니다 ~/.xnintrc.)

추가 참고 사항: 이는 X11 세션 내에서만 다시 매핑되므로 CapsLock매핑 Esc은 터미널 에뮬레이터에서만 작동합니다. 실제로 tty지도를 볼 수는 없습니다.

참고자료 및 추가 자료:

답변2

이전 답변에 감사드립니다.~/.zshrc내 터미널에서 vi와 같은 단축키를 사용하세요. 다른 사람들에게도 도움이 되기를 바랍니다.

bindkey -v
bindkey 'jk' vi-cmd-mode

관련 정보