Bashで `...`を `../..`でエイリアスを指定するには?

Bashで `...`を `../..`でエイリアスを指定するには?

Bashで...エイリアスを使用する方法は../..

私は他の答えがこれを許可することを知っていますが、alias '...'='cd ../..'別のコマンドを使用してディレクトリを最大2レベルまでアドレス指定できるようにしたいと思います。

cd ...
ls ...
realpath ...

私はこれを試しましたが、alias '...'='../..'それを使用しようとすると、次のような結果が得られます。

$ alias '...'='../..'
$ type ...
... is aliased to '../..'
$ cd ...
bash: cd: ...: No such file or directory

エイリアスはコマンド用であることを知っています。この場合、パスに対して同じ機能を達成する方法はありますか?

ベストアンサー1

zshに切り替えるオプションがある場合は、そこでグローバルエイリアスを使用できます。

alias -g ...=../..

しかし、それにもかかわらず、...それ自体が完全な区切り文字として認識される場合にのみ拡張されます。echo ...または、またはではecho ...> file拡張されますが、または、または(echo ...)では拡張されません。)echo .../xecho ~/...echo "..."

bashでもzshでも、通常のcshスタイルのエイリアスは、コマンド位置にある間、またはスペース文字で終わる別のエイリアスが拡張された後にのみ拡張されます。ただし、zshではこのオプションを設定するとautocd入力や他のディレクトリになるため、../..コマンド名はcd ../..

$ set -o autocd
$ alias ...=../.. ....=../../..
$ ...

cdに入る道だろうが../..、また、alias ...='cd ../..'または...() cd ../..

より良い方法は何年も使ってきました。カーソルの左側の内容が終わるかどうかではなく、.挿入された内容にキーをバインドすることです。/.....

magic-dot() {
  if [[ $LBUFFER = (|*[[:blank:]/]).. ]]; then
    repeat ${NUMERIC-1} LBUFFER+=/..
  else
    zle self-insert
  fi
}
zle -N magic-dot
bindkey . magic-dot

入力は...すぐに視覚的にに変換され../..、もう一度押す.とに変わります../../..emacsモードにある場合は、+の後..に一般的な例方法を使用します(4回追加)。Alt4.../../../../../..数字プレフィックス処理。

以前は、埋め込まれた内容をコピー/貼り付ける際に邪魔になる場合がありましたが、...今は角かっこ貼り付け機能が導入され、これ以上問題になりません。テキストを入力するには、...3文字目の前に+を押すCtrlか、カーソルの左(上)が、、...で終わらないようにバックスラッシュ、引用符などを使用できます。v.$LBUFFER<blanks-or-slash>...\....\.whatever/'...'

上記の意図的な制限は、たとえばから拡張されないことsort -o...です...。代わりに使用してくださいsort -o ...cd '.../***'->同じだcd ...'/***'。より多くのコンテキストに拡張さ[[ $LBUFFER = (|*[^.]).. ]]れるように上記のテストを変更できます。ただし、これにより不要な位置に拡張される可能性が高くなります。...../..

たとえば、最大4つのレベル(拡張)を許可して、数値引数処理をより便利にすることができます。cd Alt+4.cd../../../..

magic-dot() {
  if (( NUMERIC )) && [[ $LBUFFER = (|*[[:blank:]/:]) ]]; then
    LBUFFER+=..
    (( NUMERIC-- ))
  fi
    
  if [[ $LBUFFER = (|*[[:blank:]/]).. ]]; then
    repeat ${NUMERIC-1} LBUFFER+=/..
  else
    zle self-insert
  fi
}
zle -N magic-dot
bindkey . magic-dot

@Gillesがコメントで述べたように、最新バージョンのbashには、キーにバインドされたコマンドでラインバッファを編集するための制限されたサポートが追加されているため、次のようなことができます。

insert_before_cursor() {
  # for the equivalent of zsh's repeat $1 LBUFFER+=$2
  local i
  for (( i = 0; i < $1; i++ )); do
    READLINE_LINE=${READLINE_LINE:0:READLINE_POINT}$2${READLINE_LINE:READLINE_POINT}
    (( READLINE_POINT += ${#2} ))
  done
}

magic-dot() {
  (( ${READLINE_ARGUMENT-1} > 0 )) || return
  if [[ -v READLINE_ARGUMENT && ${READLINE_LINE:0:READLINE_POINT} = ?(*[[:blank:]/]) ]]; then
    insert_before_cursor 1 ..
    (( READLINE_ARGUMENT-- ))
  fi

  if [[ ${READLINE_LINE:0:READLINE_POINT} = ?(*[[:blank:]/]).. ]]; then
    insert_before_cursor "${READLINE_ARGUMENT-1}" /..
  else
    insert_before_cursor "${READLINE_ARGUMENT-1}" .
  fi
}
bind -x '".":magic-dot'

# work around a bug in current versions of bash for the numeric
# argument to work properly, that means however that you lose the
# insert-last-argument normally bound to Meta-. (also on Meta-_)
bind -x '"\e.":magic-dot'

前述のとおり、まだ機能していませんが、bash 4.0以降$READLINE_LINE$READLINE_LINE_BUFFER一部の文書のスペルが間違っている場合とは異なり)と$READLINE_POINT5.2以降が必要です。$READLINE_ARGUMENT

おすすめ記事