저는 ubuntu 16.04와 bash 쉘을 새로 설치하고 있습니다. 나는 두 가지 일을 하고 싶다:
- 터미널에서 vim과 유사한 작업을 수행할 수 있도록 vi 모드를 설정합니다.
- 다음을 입력하여 삽입 모드를 종료하세요.
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는 zsh
through와 유사한 기능을 가지고 있지만 .bindkey
bind
vi
zsh
set -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
에뮬레이트할 뿐입니다 . 모든 힘을 갖고 있지 않은 경우에도 마찬가지입니다 .vi
vim
-o emacs
emacs
zsh 지원
zsh
지도 시간 초과는 실제로 지원됩니다. 다음을 사용하여 매핑할 수 jk
있습니다 <esc>
.
bindkey -v # instead of set -o vi
bindkey -e jk \\e
~/.zshrc
(이것은 없이 진행되어야 합니다 ~/.bashrc
)
그러나 나는 이렇게 하지 않는 것이 좋습니다. 나는 대부분의 시간에 을 사용합니다 vim
. 위의 조합을 사용해 보았습니다 zsh
. 사용할 때 인쇄하는 데 너무 오래 기다리면 짜증이 납니다 .inoremap jk <esc>
vimrc
bindkey
zsh
j
배쉬 지원
bash
지원됨 컴파일 없이 컴파일된다고 readline
bind
생각하므로 bash를 지원하지 않는 드문 시스템이 있을 수 있습니다 (주의하세요). 수행 해야 할 작업 을 매핑하려면 다음을 수행하세요 .bash
readilne
bind
jk
<esc>
bash
set -o vi
bind '"jk":"\e"'
(예, 이는 이중 수준 참조이므로 필수입니다.)
다시 말하지만, 이것은 타이핑을 j
매우 짜증나게 만듭니다. 그러나 내 컴퓨터의 솔루션보다 덜 짜증스럽습니다 zsh
(아마도 기본 시간 초과가 더 짧을 것입니다).
해결 방법(bash 및 zsh가 아닌 쉘의 경우)
키를 다시 매핑하는 이유 Esc는 키보드와 꽤 멀리 떨어져 있고 타이핑하는 데 시간이 걸리기 때문입니다. 이 사람들에게서 빌릴 수 있는 한 가지 비결은 어차피 쓸모없는 키이기 때문에 emacs
다시 매핑하는 것입니다 . 사람들은 그것을 에 다시 매핑 하지만 우리는 에 다시 매핑할 것입니다 .CapsLockemacs
CtrlEsc
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