zsh
"모든 명령에 대해 실행할 수 있습니다 " 에서 Esc h명령에 대한 매뉴얼 페이지를 가져오고 매뉴얼 페이지를 종료한 후 모든 인수가 포함된 명령을 가져옵니다. 예를 들어 내 셸에 다음을 입력합니다.
zsh# tar -czvf docs.tgz docs
커서를 아무데나 놓으면 tar
man 을 호출 할 수 있습니다 .Esc h
이제 나는 똑같은 것을 원하지만 bash를 원합니다. 가능한 해결 방법 중 하나가 아래에 표시되어 있지만 다른 해결 방법도 있는지 알고 싶습니다.
bind '"\eh": "\C-a\ef\C-k\C-f\C^Cman \C-y\C-m\C-y\C-y\ey"'
답변1
명령줄 작업에 관해 이야기할 때 실제로는 readline 라이브러리에 대해 이야기하는 것입니다. readline 바인딩 업데이트는 예제에서와 같이 명령줄에서 readline의 기본 초기화 파일 /etc/inputrc
( 확인 echo $INPUTRC
)에서 수행하거나 계정에 대한 로컬 초기화를 생성하여 수행 할 수 있습니다 ~/.inputrc
. 아직 GNU readline 라이브러리를 찾지 않았다면(여기에서 시도해 보세요)
문제에 대한 몇 가지 제안 사항은 다음과 같습니다.
제안 1
\eh
zsh readline을 사용하면 zsh를 사용하여 계정에서 ESC-h( )에 대한 키 바인딩을 확인하고 bash를 사용하여 해당 바인딩을 계정에 복사할 수 있습니다. 매우 똑똑한 몇몇 사람들은 이러한 바인딩을 결합하여 아무런 조정 없이 작동합니다.- zsh 계정에서 바인딩 명령(
bind -P
[원시 바인딩 출력에 소문자 p 스위치 사용])을 사용하여 zsh 계정의 활성 바인딩을 확인합니다. - 바인딩 출력에서 실제 코드를 함께 모아야 할 수도 있습니다.
- bash 계정의 바인딩에 전체 줄을 추가하세요(위에서 시도한 것처럼).
- zsh 계정에서 바인딩 명령(
제안 2
- 위 예시의 경로를 따라가세요
이 시점에서는 위의 예가 작동하지만 약간의 조정이 필요합니다. 이것은 나에게 효과적입니다
"\eh": "\C-a\C-kman \e1\e.\C-m\C-y\M-y"
바인딩을 /etc/inputrc.conf에 넣었습니다. 명령줄에서 키 시퀀스를 사용하여 inputrc를 다시 읽어야 합니다 ctrl+x ctrl+r
.
그러나 귀하의 질문은 커서 아래에 있는 단어에 대해 이 작업을 수행하는 방법입니다. 이것은 나에게 효과적입니다.
"\eh": "\ef\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d"
간단히 말해서 다음과 같이 작동합니다.
키 시퀀스의 경우 \eh
(ESC+h)
- 먼저 단어의 끝을 찾은 다음 시작(
\ef\eb
) 을 찾으세요. - 현재 단어(관심있는 단어)를 삭제하고 다시 넣으세요(
\ed\C-y
). 이를 종료 버퍼에 넣어야 합니다. - 전체 명령줄을 주석 처리하고 새 프롬프트(
\e#
) 로 이동합니다. - 명령줄에 "man"을 입력합니다(공백에 주의하세요).
- 관심 있는 명령을 명령줄에 붙여넣고 실행합니다(
\C-y\C-m
). - 명령 기록( )에서 두 번째(이전) 항목("man", 그 다음 원래 명령)을 찾습니다
\C-p\C-p
. - 줄의 시작 부분으로 이동하여 주석 문자(
\C-a\C-d
) 를 제거합니다.
제안 3
- emacs 및 vi 모드를 사용하도록 readline을 설정하십시오. 여러분이 즐겨 사용하는 매우 강력한 편집기 명령 대부분을 키 바인딩에서 사용할 수 있습니다.
참고: 이전에는 이 옵션을 바인딩으로 구현해 본 적이 없지만 명령줄에서는 사용합니다. inputrc 파일이나 bashrc를 통해 이를 설정할 수 있습니다.
- 입력 rc에서:
set editing-mode vi
- .bashrc에서:
set -o vi
바인딩을 수행하는 프로세스는 기본 readline 키 시퀀스와 유사한 것으로 보입니다. 그러나 제안 2의 예를 보면 올바른 방향으로 나아갈 수 있습니다.