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ではもっと簡単です...

答え2

カーソルがある場合:

vimdiff projectOne/Vagrantfile projectTwo/Vagrantfile
                              ^

Alt+BTTBBTFTBBTT を押します。


または簡単に:

Ctrl+ WCtrl+を押してEスペースを挿入し、Ctrl+を押します。Y

答え3

迅速で簡単な解決策のために、以下をinputrcに追加してください(自分に適したキーを選択してください)。

"\e\C-b": shell-backward-kill-word
"\eh": shell-backward-word
"\e\C-f": shell-forward-word
# Swap the preceding two arguments (control + alt + t)
"\e\C-t": "\e\C-b\eh\C-y"
# Swap the preceding argument with the next (control + alt + p)
"\e\C-p": "\e\C-b\e\C-f\C-y"

shell-*これらの機能のバージョンがある場合単語は引用符で囲まれていないシェルメタ文字で区切られます。

メタ文字

引用符がない場合、単語を区切るために使用される文字です。メタ文字は、スペース、タブ、改行、または"|"、"&"、";"、"("、")"、"<"または">"文字のいずれかです。

Ctrl注:+を押すAlt前に、カーソルは2番目のパラメータの後ろにある必要があるため、カーソルのt前のパラメータを行の先頭に効果的にスライドさせます。

$ true foo/bar.xyz even/without\ quotes.ok "too/too far.away"
                                                             ^
$ true foo/bar.xyz "too/too far.away" even/without\ quotes.ok
                                     ^
$ true "too/too far.away" foo/bar.xyz even/without\ quotes.ok
                         ^

Ctrl注:+を押すAlt前に、カーソルは最初の引数の後にある必要があるため、カーソルの前の引数を行のp末尾に効果的に引き出します。

$ true "too/too far.away" foo/bar.xyz even/without\ quotes.ok
                         ^
$ true foo/bar.xyz "too/too far.away" even/without\ quotes.ok
                                     ^
$ true foo/bar.xyz even/without\ quotes.ok "too/too far.away"
                                                             ^

答え4

BTTBBTシングルの代わりにを押す必要がありますT

関連情報