Emacs 키 바인딩을 사용하여 명령줄 인수를 바꾸는 방법은 무엇입니까?

Emacs 키 바인딩을 사용하여 명령줄 인수를 바꾸는 방법은 무엇입니까?

Bash를 사용하고 emacs 키 바인딩을 설정하면 단어 키 바인딩 전치( M-t)는 인수를 전치하지 않지만 "단어"를 자체 단어 정의에 따라 전치합니다.

그래서 내가 이것을 가지고 있다면 :

vimdiff project-number-One/Vagrantfile project-number-Two/Vagrantfile.old

입력할 때 커서가 첫 번째 매개변수와 두 번째 매개변수 사이에 있고 optiont결과는 다음과 같습니다.

vimdiff project-number-One/project Vagrantfile-number-Two/Vagrantfile.old

이것은 분명히 내가 원하는 것이 아닙니다. 매개변수를 어떻게 전치할 수 있나요?

답변1

Bash에서는 명령마다 단어 개념이 다릅니다.C-w앞의 공백을 없애지만 대부분의 다른 명령에는 M-t구두점으로 구분된 단어가 포함됩니다.

첫 번째 인수와 두 번째 인수 사이에 커서를 놓으면 C-w C-e SPC C-y두 단어의 위치가 바뀝니다.

공백으로 구분된 단어를 바꾸기 위해 키를 바인딩하려는 경우 더 복잡합니다. 바라보다Bash에서 Emacs 스타일 키 바인딩의 혼란스러운 동작. 다음은 최소한으로 테스트된 코드입니다.

transpose_whitespace_words () {
  local prefix=${READLINE_LINE:0:$READLINE_POINT} suffix=${READLINE_LINE:$READLINE_POINT}
  if [[ $suffix =~ ^[^[:space:]] ]] && [[ $prefix =~ [^[:space:]]+$ ]]; then
    prefix=${prefix%${BASH_REMATCH[0]}}
    suffix=${BASH_REMATCH[0]}${suffix}
  fi
  if [[ $suffix =~ ^[[:space:]]+ ]]; then
    prefix=${prefix}${BASH_REMATCH[0]}
    suffix=${suffix#${BASH_REMATCH[0]}}
  fi
  if [[ $prefix =~ ([^[:space:]]+)([[:space:]]+)$ ]]; then
    local word1=${BASH_REMATCH[1]} space=${BASH_REMATCH[2]}
    prefix=${prefix%${BASH_REMATCH[0]}}
    if [[ $suffix =~ [^[:space:]]+ ]]; then
      suffix=${suffix#${BASH_REMATCH[0]}}
      READLINE_LINE=${prefix}${BASH_REMATCH[0]}$space$word1$suffix
      READLINE_POINT=$((${#READLINE_LINE} - ${#suffix}))
    fi
  fi
}
bind -x '"\e\C-t": transpose_whitespace_words'

zsh에서는 더 쉽습니다 ...

답변2

커서가 있는 경우:

vimdiff projectOne/Vagrantfile projectTwo/Vagrantfile
                              ^

Alt+BTTBBTFTBBTT를 누릅니다.


또는 간단하게:

Ctrl+ W, Ctrl+를 누르고 E공백을 삽입한 다음 Ctrl+를 누릅니다.Y

답변3

빠르고 쉬운 해결 방법을 위해 다음을 inputrc에 추가하세요(자신에게 적합한 키 선택).

"\e\C-b": shell-backward-kill-word
"\eh": shell-backward-word
"\e\C-f": shell-forward-word
# Swap the preceding two arguments (control + alt + t)
"\e\C-t": "\e\C-b\eh\C-y"
# Swap the preceding argument with the next (control + alt + p)
"\e\C-p": "\e\C-b\e\C-f\C-y"

shell-*이러한 기능의 버전이 있는 경우단어는 인용되지 않은 쉘 메타 문자로 구분됩니다..

메타 문자

인용되지 않은 경우 단어를 구분하는 데 사용되는 문자입니다. 메타 문자는 공백, 탭, 줄 바꿈 또는 "|", "&", ";", "(", ")", "<" 또는 ">" 문자 중 하나입니다.

Ctrl참고: +를 누르기 Alt전에 커서는 두 번째 매개변수 뒤에 있어야 하므로 t커서 앞의 매개변수를 줄의 시작 부분으로 효과적으로 밀어넣습니다.

$ true foo/bar.xyz even/without\ quotes.ok "too/too far.away"
                                                             ^
$ true foo/bar.xyz "too/too far.away" even/without\ quotes.ok
                                     ^
$ true "too/too far.away" foo/bar.xyz even/without\ quotes.ok
                         ^

Ctrl참고: + 를 누르기 Alt전에 커서는 첫 번째 인수 뒤에 있어야 하므로 p커서 앞의 인수를 줄 끝쪽으로 효과적으로 끌어당깁니다.

$ true "too/too far.away" foo/bar.xyz even/without\ quotes.ok
                         ^
$ true foo/bar.xyz "too/too far.away" even/without\ quotes.ok
                                     ^
$ true foo/bar.xyz even/without\ quotes.ok "too/too far.away"
                                                             ^

답변4

BTTBBT싱글 대신에 를 눌러야 합니다 T.

관련 정보