Bashを使用してemacsキーバインディングを設定すると、単語キーバインディングの転置(M-t
)は引数を転置しませんが、「単語」を独自の単語定義に従って転置します。
だから私がこれを持っているなら:
vimdiff project-number-One/Vagrantfile project-number-Two/Vagrantfile.old
入力すると、カーソルが最初のパラメータと2番目のパラメータの間にあり、optiont結果は次のようになります。
vimdiff project-number-One/project Vagrantfile-number-Two/Vagrantfile.old
これは明らかに私が望むものではありません。パラメータをどのように転置できますか?
ベストアンサー1
Bashでは、コマンドごとに単語の概念が異なります。C-w
前のスペースを取り除きますが、他のほとんどのコマンドには句読点M-t
で区切られた単語が含まれます。
最初の引数と2番目の引数の間にカーソルを置くと、C-w C-e SPC C-y
2つの単語の位置が変わります。
スペースで区切られた単語を置き換えるためにキーをバインドする場合は、より複雑です。バラより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ではもっと簡単です...