zsh 키 바인딩: 전체 인용 문자열에 대한 작업을 종료하는 LookBehind를 만듭니다.

zsh 키 바인딩: 전체 인용 문자열에 대한 작업을 종료하는 LookBehind를 만듭니다.

Ctrl+w또는 Alt+Backspace키보드 단축키를 사용하여 Alt+d단어를 뒤로/앞으로 삭제할 때 WORDCHARS 문자를 정의할 수 있다는 것을 알고 있습니다 .

WORDCHARS='~!#$%^&*(){}[]<>?.+;-'

예를 들어, Ctrl+w문자열 끝에서 를 사용하면 각 단어가 연속해서 제거됩니다.

echo aaa bbb ccc ddd eee

하지만 인용된 문자열이 있는 경우 인용된 전체 블록을 하나의 엔터티로 어떻게 처리할 수 있습니까?

echo 'aaa bbb ccc' 'ddd eee fff'

따라서 Ctrl+w"ddd eee fff" 전체를 한꺼번에 삭제해야 합니다. 큰따옴표로 묶인 문자열에 대해서도 동일한 동작이 있어야 합니다."

답변1

이것shell폰트그것이 바로 그것이 하는 일입니다.

autoload -U select-word-style
select-word-style shell

답변2

공백이 있어야 한다고 생각하는데 WORDCHARS, 공백 사용 규칙을 정의할 수 있는 방법이 없는 것 같습니다. 이를 달성할 수 있는 방법이 있는지 잘 모르겠습니다. 어쩌면 명령줄에서 참조할 수 있는 사용자 정의 Emacs 매크로를 정의하는 방법이 있을 수도 있습니다. 제가 익숙하지 않은 두 가지 방법을 모두 수행할 수 있는 방법이 있다면 알고 있는 사람의 의견을 듣고 싶습니다.

원하시는 답변은 아닙니다

이것은 질문에 대한 직접적인 대답은 아니지만,무엇내장된 함수를 사용하여 설명하는 대로 수행할 수 있습니다(다음 참고 사항).

라인 편집기 방법을 다음으로 변경하십시오.vi

set -o vi

그런 다음 이 작은 아름다움을 입력하는 것을 기억해 보세요.

Esc2dF"x 또는 Esc2dF'x사용된 견적 가격을 기준으로 합니다.

실제로 손가락이 굴러가지는 않지만 .원하는 경우 적어도 반복을 누를 수 있습니다.

지침

주어진 참조의 인스턴스를 뒤로 두 번 검색하고 (구문, 컨텍스트 등에 관계없이) 방해가 되는 모든 항목을 제거합니다. 이것이 명령줄이고 커서가 끝에 있다는 점을 고려하면 다음과 같습니다.

echo "foo bar" baz

당신은 결국 얻을 것이다

echo<space>

아니면 시작한다면

echo "foo bar" baz "boz

결국 같은 결과를 얻게 될 것이다정확히 내가 원하는 건 아니야

echo "foo bar

입력을 시작하기 전에 모드에 있어야 하므로 vi프로필 등에서 설정해야 합니다.

명령줄에서 vi편집 하는 것은 패러다임의 전환이며 근육 기억 문제로 어려움을 겪을 수 있습니다. 실제로는 그다지 재미있어 보이지 않습니다.

그래서...

CtrlW나는 그것을 몇 번이나 부수고 싶어 할 수도 있습니다 .

실수로 과도하게 작업한 경우 언제든지 취소할 수 있습니다 Ctrl_.

답변3

Giles가 설명한 글쓰기 스타일은 실제로 이를 수행하는 올바른 방법입니다. 그러나 그의 조언을 따른다면 모든 단어 기반 키가 이러한 동작을 보일 것입니다. 따라서 M+는 f단어 단위로 앞으로 이동하는 것을 멈추고 [A-Za-z0-9]하나의 완전한 쉘 인수 앞으로 이동합니다.

전체 셸 인수를 한 번에 제거하는 방법을 요청했지만 다른 동작은 언급하지 않았으므로 다음을 수행할 수 있습니다.

autoload -U select-word-style
select-word-style normal

zle -N backward-kill-shell-word backward-kill-word-match
zstyle :zle:backward-kill-shell-word word-style shell

bindkey '^w'  backward-kill-shell-word

그러면 새로 생성된 zsh 위젯에 Ctrl+가 바인딩 됩니다 . 분명히, 이에 대해 다른 단축키를 사용하려면 바인딩키의 첫 번째 매개변수를 조정해야 합니다. 바라보다Wbackward-kill-shell-wordzsh 문서더 알아보기.

참고: 서로 다른 터미널 에뮬레이터는 동일한 키 입력에 대해 서로 다른 16진수 코드/이스케이프 시퀀스를 보냅니다. 내 경우에는 실제로 Ctrl+ ( BackspaceMac에서는 Ctrl+ )를 사용하고 싶었습니다 Delete.이것은 사소한 것이 아니다, Ctrl+ Backspace특별한걱정이 가득합니다. 내 경우(macOS의 iTerm2)에는 실제로 필요했습니다.합성 이스케이프 시퀀스 생성 및 보내기for Ctrl+는 Delete내가 원하는 동작을 얻습니다. 그럼 내 ^[[27;6;8~마음대로 해 .bindkey.zshrc

나는 이 질문에 답하기 위해 내가 사용한 세 가지 대답이 모두 인간 중의 거인인 자일스로부터 나왔다는 점을 지적하고 싶습니다. 감사합니다!

관련 정보