선행 공백 없이 vi 모드에서 bash의 마지막 인수 삽입

선행 공백 없이 vi 모드에서 bash의 마지막 인수 삽입

기본(emacs) 모드에서 bash를 사용하여 을 클릭하면 다음 동작이 발생합니다 Esc. .

$ echo hello
hello
$ hello  # I hit `<ESC>.` to insert this

을 클릭하면  hello삽입된 단어 앞에 공백이 없습니다.Esc.

vi 모드로 전환하고 구성하면 .앞에 공백이 생깁니다.

$ set -o vi
$ bind -m vi-command ".":yank-last-arg
$ echo hello
hello
$  hello  # I hit `<ESC>.` to insert this. Note the leading space.

이러한 선행 공백을 피하기 위해 bash/readline을 구성하는 방법이 있습니까?

답변1

이것은 버그처럼 보이지만 실제로 Bash는 단지 따라가려고 할 뿐입니다.POSIX 지정의 행동 _,

[count] _
현재 문자 위치 뒤에 <space>를 추가하고, <space> 뒤에 이전 입력 줄의 마지막 빅워드를 추가합니다. 그런 다음 방금 추가한 마지막 문자 다음에 삽입 모드로 들어갑니다. 번호를 가지고계산, 추가의계산이전 줄의 첫 번째 큰 단어입니다.

해결 방법으로 이를 에 추가하세요 ~/.inputrc. 필요한 경우 바인딩되지 않은 다른 키로 \M-h변경할 .

set editing-mode vi
set keymap vi-command
"\M-h":history-expand-line
".":"a!$\e\M-hA"

이제 새 터미널을 엽니다. .일반 모드에서 탭하면

  • !$명령줄에 삽입됩니다.
  • \e( 표시 Esc) 일반 모드로 돌아갑니다.
  • \M-h마지막 인수의 값으로 history-expand-line확장되는 작업을 트리거합니다 .$!
  • A줄 끝으로 이동하여 삽입 모드로 들어갑니다.
$ echo "X Y Z"
X Y Z
$ "X Y Z" #<ESC>. inserts this
$ echo "X Y Z"
X Y Z
$ cat "X Y Z" #cat <ESC>. inserts this

답변2

무언가를 삽입한 후 명령 모드에 들어가면 커서가 왼쪽으로 이동합니다.마치마지막으로 입력한 단어 뒤의 공백을 없애는데, 편집 모드로 다시 들어가서 다른 것을 삽입하면 이전에 삽입한 단어의 마지막 문자 뒤의 공백이 복원됩니다.

수동으로 공백을 추가하면 이중 공백이 생성됩니다.

관련 정보