bindkey
내 파일에 몇 가지 명령이 있는데.zshrc
예상대로 작동합니다.tmux
s를 포함하여 동일한.zshrc
작업을 실행하기 시작했지만bindkey
작동하지 않습니다.- 하지만 tmux 내의 명령 프롬프트에 수동으로 입력하면하다다시 작동합니다.
나는 빈 tmux.conf( tmux -L test -f /dev/null
)를 사용해 보았기 때문에 이것이 내 tmux conf가 아니라는 것을 알았습니다.
- zsh 5.8.1 (x86_64-ubuntu-linux-gnu)
- 멀티플렉서 3.2a
- Gnome 쉘(기본값 TERM=xterm-256color)
tmux가 어떻게든 키 바인딩을 재설정하는 것처럼뒤쪽에내 .zshrc를 실행하시겠습니까?
몇 가지 테스트를 거친 후 내 항목에서 이 줄을 제거하면 .zshrc
문제가 해결된다는 사실을 발견했습니다.
export EDITOR=`which vim`
왜?
답변1
다른 인기 있는 여러 셸과 마찬가지로 zsh는 Emacs 유사(모드리스) 및 Vi 유사(삽입 및 명령 모드 포함)의 두 가지 명령줄 편집 모드를 제공합니다. 다른 인기있는 쉘들과 달리,zsh는 Vi와 유사한 모드에서 시작됩니다.zsh가 환경 변수로 시작되거나 포함된 VISUAL
경우 EDITOR
.vi
EDITOR
환경 변수를 설정하고 있습니다 .zshrc
. 터미널을 열고 터미널 에뮬레이터 프로그램이 zsh를 시작하면 EDITOR
설정되지 않으므로 zsh는 Emacs 모드에서 시작됩니다. 이 셸 내부에서 tmux 세션을 시작하면 EDITOR
tmux 환경의 문자열을 포함하도록 설정되므로 tmux 창에서 zsh가 시작될 때 이미 설정되어 있습니다. vi
따라서 tmux 창 내에서 zsh는 Vi와 유사한 모드로 실행됩니다.
Vi와 유사한 작동 모드에는 삽입과 명령이라는 두 가지 편집 모드가 있습니다. 각각에는 고유한 키 바인딩이 있으며 bindkey
삽입 모드에서만 사용할 수 있는 옵션이 없습니다. 따라서 사용자 정의 바인딩은 명령 모드, 즉 를 누른 후에는 작동하지 않습니다 Escape. 대부분의 기본 바인딩도 작동하지 않습니다.
이를 방지하려면 Vi와 같은 모드를 원하지 않는 것 같으므로 bindkey
다음 명령을 다른 호출 앞에 배치하여 Emacs와 같은 모드를 명시적으로 선택하십시오 .zshrc
.
bindkey -e
EDITOR
진짜 문제는 잘못된 위치에 설정하고 있다는 것입니다 . 일반적으로 셸 초기화 파일( .bashrc
, .zshrc
)에 환경 변수를 설정하지 마세요. 환경 변수는 해당 셸에서 실행되는 프로그램 내에서만 적용되기 때문입니다. GUI 실행기에서 직접 실행되는 프로그램은 이러한 변수를 상속하지 않으므로 선호하는 편집기를 호출하지 않습니다. 대신, 예를 들어 로그인 세션이 시작될 때 읽혀지는 파일에 환경 변수를 설정하십시오 ~/.profile
(대부분의 X11 기반 설정을 포함하는 클래식 Unix 계열 세션의 경우).
답변2
글쎄, 내 생각에는 이것이 결국 지역 문제가 될 것 같지만, 내가 찾은 것은 다음과 같습니다.
- 내 .zshrc에 다음 줄이 포함되어 있습니다.
export EDITOR=`which vim`
- 이 명령은 실행 가능한 Neovim AppImage에 대한 파일 경로를 생성합니다.
- EDITOR를 파일로 설정한 후에는 아무 것도 작동하지 않습니다.
export
영향을 주지 않는 항목을 삭제합니다.- var가 다음과 같은 경우에만 설정되도록 코딩하세요.아니요tmux에서도 도움이 되지 않습니다.
이것이 버그인지 아니면 무엇(tmux? zsh? 내가 사용하고 있는 자동 완성 기능? gnome-terminal? neovim? 응용 프로그램 이미지의 깊은 커널에 관한 것)인지 알아내려고 노력할 필요는 없을 것 같습니다. )...
하지만 다른 사람이 영향을 받지 않도록 하기 위해 질문에 자세히 설명된 대로
https://github.com/marlonrichert/zsh-autocomplete/
작동하지 않는 바인딩 키(다른 키도 있을 수 있음, 확실하지 않음)
bindkey '\t' menu-select "$terminfo[kcbt]" menu-select
bindkey -M menuselect '\t' menu-complete "$terminfo[kcbt]" reverse-menu-complete