Bash

如何使用 emacs 鍵綁定轉置命令行參數?

  • February 27, 2019

使用 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-wM-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 中更容易……

引用自:https://unix.stackexchange.com/questions/162559