修正する

修正する

zshキーの組み合わせAlt+がに.バインドされると、insert-last-word現在のコマンドラインに前のコマンドの最後の引数が挿入されます。

前のコマンドのすべての引数をコマンドラインに貼り付けることを除いて、Alt+に似たキーバインド/ショートカットを探しています。.

私はこれを入力できることを知っており、!*zshはこれを「前のコマンドのすべての引数を再利用する」と解釈します。しかし、それは私が望むものではありません。また、パラメータを実際に貼り付けることはできません。zshはパラメータをそのように解釈します!*。クリックTabして展開できますが、これは別の必須コマンドです。

「!*」と入力してTabを押すよりもAlt+と同じキーの組み合わせを好みます。something

どうすればいいですか?

修正する

数年間ウィジェットを広く使用した後、私は私を悩ませていることを発見しました:(ウィジェットをAlt+にバインドしました/

  1. 一度はうまくいきますが、もう一度繰り返すと、ファイルの先頭からzshの履歴を繰り返します.zsh_history

代わりに、ウィジェットが最近の履歴から最初に戻ることを望んでいます。

  1. 繰り返しますが、zshレコードの先頭から繰り返すと、コマンドと完了するパラメーターの間のスペースが削除されます。

つまり:

パラメータとともにいくつかのコマンドを入力します。

echo 111 222 333

ウィジェットを使用して前のコマンドのパラメータを完成させます。

printf <WIDGET>
printf 111 222 333

上記は期待どおりに機能します。しかし、WIDGETをもう一度押すと、突然次のように動作します。

printf <WIDGET>
printf111 222 333

つまり、コマンドとパラメーターの間のスペースは削除されます。

  1. Alt最後に、+などの他のキーをバインドして反対の操作を実行し、+を押しすぎた\ときに後退するようにしたいと思います。Alt/

答え1

最初の項目を除くすべてを挿入言葉以前の履歴エントリの場合は、次のカスタムウィジェットを定義できます。

insert-last-words() {
  emulate -L zsh
  set -o extendedglob # for the # wildcard operator

  local direction
  case $WIDGET in
    (*-reverse) direction=-1;;
    (*) direction=1;;
  esac

  if [[ ${WIDGET%-reverse} = ${LASTWIDGET%-reverse} ]]; then
    # subsequent invocations go further back in history like
    # insert-last-word

    (($+INSERT_LAST_WORDS_SKIP_UNDO)) ||
      NUMERIC=1 zle undo # previous invocation

    # we honour $NUMERIC for Alt+4 Alt+/ to go back 4 in history
    ((INSERT_LAST_WORDS_INDEX += ${NUMERIC-1} * direction))
  else
    # head of history upon first invocation
    INSERT_LAST_WORDS_INDEX=0
  fi
  unset INSERT_LAST_WORDS_SKIP_UNDO

  local lastwords
  local cmd=${history:$INSERT_LAST_WORDS_INDEX:1}

  # cmdline split according to zsh tokenisation rules
  lastwords=(${(z)cmd})

  if (($#lastwords <= 1)); then
    # return failure (causing beep or visual indication) when the
    # corresponding cmd had no arguments. We also need to remember
    # not to undo next time.
    INSERT_LAST_WORDS_SKIP_UNDO=1
    return 1
  fi

  # remove first word (preserving spacing between the remaining
  # words).
  cmd=${cmd##[[:space:]]#$lastwords[1][[:space:]]#}
  LBUFFER+=$cmd
}

zle -N insert-last-words
zle -N insert-last-words-reverse insert-last-words
bindkey '\e/' insert-last-words
bindkey '\e\\' insert-last-words-reverse

関連情報