No bash, diferentes comandos possuem diferentes noções de palavras. C-w
mata para o espaço em branco anterior, mas a maioria dos outros comandos, incluindo M-t
usa palavras delimitadas por pontuação.
Com o cursor entre o primeiro e o segundo argumento, C-w C-e SPC C-y
transpõe as duas palavras.
Se você quiser vincular uma chave à transposição de palavras delimitadas por espaços em branco, é mais complicado. Veja comportamento confuso de atalhos de estilo no estilo emacs no bash . Aqui está um código minimamente testado.
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'
Isso tudo é mais fácil em zsh…