해결책을 찾기 위해 머리를 쓸 수가 없어요단순한Readline에서 작업 편집. 큰 단어가 끝날 때까지, 즉 다음 공백 문자( dE
vim에서)까지 문자를 삭제하고 싶습니다.
특히, 특정 키 시퀀스를 눌렀을 때,
> 2234I567.890 32345678
될 것입니다
> 2234I 32345678
여기서 커서 위치는 으로 표시됩니다 I
.
~/.inputrc
이를 달성하기 위해 추가하려고 한 내용은 다음과 같습니다.
첫 시도:
"\eF": vi-fWord "\eD": "\eF\C-w"
이렇게 하면 앞으로 큰 단어가 삭제되지만 커서를 놓으면 제대로 작동하지 않습니다.존재하다단어. 이 경우 전체 단어가 삭제됩니다.
두 번째 시도:
"\eF": vi-fWord "\C-x1": kill-region "\eD": "\C-@\eF\C-x1 "
이것~해야 한다이미 작동하고 있지 않나요? 적어도 \C-@\eF\C-x1
명령줄에서 수동으로 전체 키 시퀀스를 삭제하면 작동합니다. 그런데 이상한 점은 \eD
키를 눌러도 아무 일도 일어나지 않는다는 것입니다.
- 나는 또한 vi 모드 명령
vi-delete-to
등을 사용하는 것을 고려했지만 Readline vi 모드와 관련된 문서가 전혀 없기 때문에 어떻게 해야 할지 잘 모르겠습니다.
그래서 도움을 청하러 여기까지 왔습니다.
답변1
좋아, 드디어 성공했어.
set-mark
함수를 다른 키 시퀀스(예: )로 다시 매핑하고 \C-x2
기본값을 이 새 매핑으로 바꾸면 됩니다 . \C-@
그러면 모든 것이 괜찮습니다.
아마도 이것은 버그일 수 있으며 \C-@
Readline 매크로의 RHS에 나타나면 예상대로 실행되지 않습니다.
Alt다음은 + D삭제 입력을 다음 공백이나 큰 단어(vim 용어)로 전달 하는 설정입니다 .
"\C-x0": vi-eWord
"\C-x1": kill-region
"\C-x2": set-mark
"\eF": "\C-x0\C-f"
"\eD": "\C-x2\eF\C-x1"
예를 들어 쉘 특정 Readline 기능을 사용하지 않기 때문에 shell-forward-word
키 바인딩은 bash, (i)python 등과 같이 Readline 라이브러리를 사용하는 모든 응용 프로그램에 적용됩니다.
답변2
실제로 대답은 제대로 문서화되지 않은 vi-delete-to(기본적으로 "d"에 매핑됨)에 있습니다. 이 기능은 후속 이동 명령 앞에 숫자가 붙는 경우에만 작동합니다. 기본 매핑은 dE
암시적으로 개수 1을 사용하지만 이동 명령을 다시 매핑하려면 명시적인 개수가 필요합니다.
예를 들어, 귀하의 경우 키 시퀀스 "d1\C-x0"은 단어를 삭제합니다. 1개의 단어를 제거하기 위해 단어 수/번호를 지정할 필요가 없도록 시퀀스를 매핑할 수 있습니다.
"d\C-x0": "d1\C-x0"
여러 단어를 삭제해도 여전히 작동합니다.
이는 모든 작업에 적용됩니다. 예를 들어, d1fe
첫 번째 문자 "e"는 제거(포함)되고 c2to
두 번째 문자 "o"는 (제외)로 변경됩니다. vi/vim처럼 "."을 사용하여 이러한 모든 작업을 반복할 수 있습니다.
귀하의 솔루션에 관해서는
vi 기능을 사용하고 있으므로 vi 편집 모드를 사용하고 있다고 가정합니다. C-@는 emacs 맵이므로 이전처럼 함수를 명시적으로 매핑해야 합니다. 이는 버그가 아닙니다.
"Cf"를 "x"(커서 기능에서 삭제)로 바꿀 수 있으므로 명령이 줄 끝에서 중단되지 않습니다(커서가 앞으로 이동할 수 없으므로).
"\C-x0": vi-eWord "\C-x1": kill-region "\C-x2": set-mark "\eD": "\C-x2\C-x0x\C-x1"
불행하게도 이/귀하의 솔루션의 단점은 한 번에 여러 단어를 제거하기 위해 "vi-arg-digit" 접두사를 붙일 수 없다는 것입니다.