재귀 기록 검색을 잃지 않고 명령 줄에서 Vim 편집 모드를 사용할 수 있습니까? cd대신 결정하려는 경우 Esc

zsh를 사용하고 있으며 열렬한 Vim 사용자이기 때문에 명령 줄에서 Vim 스타일 편집을 사용하기로 전환했습니다. (즉, 입력 ls foo/bar하고 cd대신 결정하려는 경우 Esc ^, 처음으로 되돌아 가서 cw cd로 변경할 lscd있습니다.

그것은 모두 멋지지만 문제는 더 이상 Ctrl+R재귀 기록 검색을 수행 하는 데 사용할 수 없다는 것 입니다. 다른 방법이 있습니까? 아니면 Vim 키 바인딩을 재정 의하여 다시 가져올 수 있습니까?



답변

물론 더 이상 Ctrl+를 사용할 수 없습니다 R. Z Shell 매뉴얼을 참고 history-incremental-search-backward하면 emacs키맵에 위젯에 대한 키 바인딩 만 있다는 것을 알 수 있습니다 . vi 키맵에는 키 바인딩이 없습니다.

그러나 설명서를 읽으면 (18 장 참조), 키 바인딩을 추가하는 것은 bindkey명령을 사용할 때 매우 간단한 연습입니다 .

bindkey "^R" history-incremental-search-backward

zle표준 위젯이므로 명령 을 사용하여 위젯을 쉘 함수에 맵핑 할 필요도 없습니다 .

당신이 상담하는 경우 는 Z 쉘 위키에이 같은 질문에 대한 답변을 , 당신은 특히 VI “명령”과 “삽입 모드”키맵이를 추가하는 명령을 볼 수 있습니다 :

bindkey -M viins '^R' history-incremental-search-backward
bindkey -M vicmd '^R' history-incremental-search-backward

또한 garyjohn이 지적한 것처럼 vi “command”키맵에서 /캐릭터는 vi-history-search-backward위젯에 바인딩됩니다 . 이 위젯과 위젯의 차이점은 히스토리 검색 모드 history-incremental-search-backward 있는 위젯 동작입니다 . 다음은 몇 가지 차이점입니다.

  • vi 모드 전환 :
    • 검색 모드는 여전히 검색 모드를 유지하면서 위젯을 호출 할 때 및 키맵 history-incremental-search-backward사이 를 전환 합니다. 즉에서 모드 누르는 것이 키 또는 + + 키 사이의 검색 모드 전환 및 키맵을. (호출 로부터 키맵하면 바인드 뭔가하지 않는 한에 따라서 번거로운 에서 뿐만 아니라 키맵.)mainvicmdvi-cmd-modeemacsEscCtrlXCtrlVemacsvicmdhistory-incremental-search-backwardvicmdvi-cmd-modevicmd
    • 의 검색 모드 vi-history-search-backwardvi-cmd-mode위젯을 처리하고 accept-line검색을 종료 한 후 검색을 입력 한 명령 모드로 다시 들어갑니다. 즉, (기본 바인딩으로) /명령 모드에서 검색 모드로 들어가서 명령 모드 Esc로 돌아갑니다.
  • 검색 반복
    • 에서 history-incremental-search-backward, 양쪽 history-incremental-search-backwardvi-rev-repeat-search위젯이 인식됩니다. 즉 (위와 같이 바인딩을 변경했다고 가정) Ctrl+ RN이전의 일치하는 줄을 검색합니다.
    • 에서 vi-history-search-backwardvi-rev-repeat-search위젯은 인정된다. 즉 (위와 같이 바인딩을 변경했다고 가정) Ctrl+ R경고음이 발생하고 무시됩니다.

답변

bash의 vi 모드에서을 입력 <Esc>/<string><Enter>하면 명령 기록을 검색합니다 <string>. n역사에서 다시 검색합니다. N앞으로 검색합니다. zshell은 동일 할 수 있습니다.


답변

나는 사용하는 것을 선호합니다 :

bindkey -M vicmd '/' history-incremental-search-backward

이렇게 ESC /text하면 명령 줄을 입력 하고 볼 수 있습니다 . 다음 경기에 가고 싶다면ESC n