Bash
如何使用 emacs 鍵綁定轉置命令行參數?
使用 Bash,並設置了 emacs 鍵綁定,transpose-words 鍵綁定 (
M-t
) 不會轉置參數,而是“單詞”(通過其自己的單詞定義)。所以如果我有這個:
vimdiff project-number-One/Vagrantfile project-number-Two/Vagrantfile.old
當我輸入時
option``t
,我的游標在第一個和第二個參數之間,我最終得到vimdiff project-number-One/project Vagrantfile-number-Two/Vagrantfile.old
這顯然不是我想要的。我怎樣才能轉置論點?
在 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 中更容易……