재귀 기록 검색을 잃지 않고 명령 줄에서 Vim 편집 모드를 사용할 수 있습니까?


8

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

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


어려운 선택입니다! garyjohnVim 방법을 JdeBP보여 주며 Ctrl + R의 키 바인딩을 얻는 방법을 보여줍니다! 두 가지 방법을 모두 사용하고 나중에 답변을 수락하겠습니다. 나는 1) 나에게 더 쉬운 방법과 2) 더 많은 공감을 얻는 방법에 따라 결정할 것이다. 둘 다 감사합니다!
Nathan Long

답변:


6

물론 더 이상 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경고음이 발생하고 무시됩니다.

내 근육 기억은 당신을 축복합니다!
Nathan Long

4

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


1
하지만 흥미 롭습니다. Vim에서는 검색을 자주 사용합니다. 검색 기록에 고정되어 있기 때문에 현재 편집중인 명령 내에서 이동하는 데 사용할 수 없습니다.
Nathan Long

권리. 그러나 (적어도 bash에서는) f, F, t, T, ';'를 사용할 수 있습니다. (세미콜론) 및 ','(쉼표) 명령은 줄의 특정 문자로 앞뒤로 이동합니다.
garyjohn

1

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.