zsh ESC-Del でパス全体ではなくパスのコンポーネントを削除するようにする

zsh ESC-Del でパス全体ではなくパスのコンポーネントを削除するようにする

私は bash から zsh に移行しています。bash では、esc-del でパス名のコンポーネントが削除されましたが、zsh ではパス名全体が削除されます。

つまり、次のように入力した場合:

cat /usr/local/bin/foobar

そして ESC-DEL を押すと、bash では次のようになりました:

cat /usr/local/bin

そして、zsh を使用すると次のようになります:

cat

それは私が望んでいることではありません!

この動作を変更するにはどうすればよいですか?

答え1

この機能を使う

function kill-path-word()
{
  local words word spaces
   zle set-mark-command                 # save current cursor position ("mark")
   while [[ $LBUFFER[-1] == "/" ]] {
     (( CURSOR -= 1 ))                  # consume all trailing slashes
  }
  words=("${(s:/:)LBUFFER/\~/_}")       # split command line at "/" after "~" is replaced by "_" to prevent FILENAME EXPANSION messing things up
  word=$words[-1]                       # this is the portion from cursor back to previous "/"
  (( CURSOR -= $#word ))                # then, jump to the previous "/"
  zle exchange-point-and-mark           # swap "mark" and "cursor"
  zle kill-region                       # delete marked region
}
zle -N kill-path-word

さて、この関数をESC+Del例えば次のようにバインドすることができます。

bindkey "^[^[[3~" kill-path-word

両方のスニペットを~/.zshrcファイルに入れて再起動します翻訳then はuponfoo/bar/baz////に短縮されます。foo/bar/ESC+Del

トレーニング スラッシュも削除したい場合 (例のように)、while ...の前に同じループを追加しますzle exchange-point-and-mark

答え2

mpy の回答を拡張すると、これは最後の 'cat /usr' をすべて一緒に消費するのではなく、'/usr' を削除してから 'cat ' を削除するバージョンです。$LBUFFER 変数を正規表現で分割します。これは、単一のスラッシュ文字よりも柔軟性があります。

function kill-path-word()
{
  local words word spaces
  zle set-mark-command                 # save current cursor position ("mark")
  words=($(grep -Eo '(/?[a-zA-Z1-9]+[\\ /]*)|([^a-zA-Z0-9])' <<< "$LBUFFER"))
  word=$words[-1]                       # this is the portion from cursor back to previous "/"
  while [[ $LBUFFER[-1] == " " ]] {
    (( CURSOR -= 1 ))                   # consume all trailing spaces - they don't get into the $word variable
  }
  (( CURSOR -= $#word ))                # then, jump to the previous "/"
  zle exchange-point-and-mark           # swap "mark" and "cursor"
  zle kill-region                       # delete marked region
}
zle -N kill-path-word
bindkey "^[^?" kill-path-word

関連情報