Emacsキーバインディングを使用してコマンドライン引数を置き換える方法は?

Emacsキーバインディングを使用してコマンドライン引数を置き換える方法は?

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-y2つの単語の位置が変わります。

スペースで区切られた単語を置き換えるためにキーをバインドする場合は、より複雑です。バラより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ではもっと簡単です...

おすすめ記事