「vi」と入力したが「cd」と入力したことを自動的に検出しますか?


21

1日に約5回、「cd」を意味するときに「vi」と入力し、viでディレクトリを開くことになります。それは私をNUTSにしている。「vi +ディレクトリ」と入力し、それを自動的に「cd +ディレクトリ」に変更する方法を検出する方法があるはずです。考え?


1
私はあなたが同様に興味深いものを見つけるかもしれない代替案を与えました^^(それまであなたがイライラしないようにしながら問題の原因を修正できるもの^^)
Olivier Dulac


1
Enterキーと矢印キーを使用してフォルダ内のファイルに移動できることを発見するまで、それは非常にイライラしました。実行中にEnterをクリックすると開きます。
nuoritoveri

1
ほんの少しのファセット性で:zshに変更します。ディレクトリ名を入力すると、そのディレクトリに変更されるように設定します。サフィックスエイリアスを使用して、*。sh、*。c、*。configと入力すると、viで関連ファイルが開かれるようにします。ここでの注意点は、もちろん、なじみのないシェルで「vi」または「cd」を省略していることに気付くことでしょう。
mkingston 14年

3
これはどのように起こりますか?
JFA 14年

回答:


38

あなたが呼び出すという仮定で viディレクトリを最後の引数としてと:

vi() {
    if [[ -d ${!#} ]]; then
        cd "$@"
    else 
        command vi "$@"
    fi
}

2
@Alexこれは両方とも「cd」ではなく「vi」を間違って入力したまれなケースに最適ですが、同時に「vi」を常に入力するように教えます;)[つまり、頻繁にストレスを軽減するために、その機能が存在しない別のサーバー/マシンを使用する必要があります...] [ただし、その答えに対して+1。ただし、「$ { 1}」[その後、「$ {!#}」の代わりにcd「$ {1}」] ...]
オリビエデュラック14年

5
@OlivierDulac合意-同様に危険なのは、多くのディストリビューションのデフォルトであるrmへのエイリアスrm -iです。一般的に、問題を解決する最善の方法は、ユーザーを回避するのではなく、ユーザーを解決することだと思います。
クリスダウン14年

3
エイリアシング@OlivierDulac rmするrm -iあなたにいくつかの過去のトラブルかもしれませんが、保存(おそらくます)...将来的にはより多くのトラブルにあなたを得るかもしれません
jlliagre

1
@Alexさて、あなたが言ったvi質問で...
クリス・ダウン

2
@crisron:${!#}最終引数を間接的に参照し、commandこのインスタンスで関数の再帰を回避するためにのみ必要です。
クリスダウン14年

4

@ChrisDownの答えとは別に、別のアプローチがあります:ディレクトリをバイパスする

このアプローチでは、次のことができます。

vi ./*

また、サブディレクトリが含まれている場合でも、現在のディレクトリ内のすべてのファイルでviを起動し、それらのサブディレクトリをバイパスします

vi() {
  for arg do
    [ -d "$arg" ] || set -- "$@" "$arg"
    shift
  done
  [ "$#" -gt 0 ] && command vi "$@"
}

これは、ディレクトリではない引数に対してviを実行するだけです。したがって、「cd」に「vi」を使用することを教えません。

そして、vi somedirectory(つまり、cdの代わりにviを誤って入力した)の場合は、viを呼び出しません。ただし、その場合は自動的にcdされないため、cdと入力する必要があることを覚えています^^

引数リストを変更するために「互換性のある」方法を使用したため、多くのプラットフォームに移植可能です。


1
注::command something"something"というエイリアスまたは関数の代わりに、 "something"コマンド(つまり、$ PATHを使用して見つかった "something"の最初の出現)を開始します。 \somethingエイリアスのみをバイパスしますが、存在する場合は関数を使用します(そして、ここでは、関数 "vi"が自分自身を呼び出してループすることを意味します)。
オリビエデュラック14年

@ChrisDown:私たちはユーザーへの援助を話しているが、自分自身をハックしようとしないことを願っている^^。そして、その評価は、新しい引数セット(set-...)を設定することなので、それ自体はそれほど危険ではありません
オリヴィエデュラック14年

@StephaneChazelas:編集ありがとうございます!そのように書き込もうとしましたが、無限にループすることを心配していました[しかし、ループしないと信じています!'for arg'は内部処理が始まる前に評価されているため、その「$ @」リストは「保存」されて繰り返され、内部処理が「$ @」を変更しても変更されませんか?]
Olivier Dulac

1

1つの解決策は、使用をcd完全に停止することです。入れてshopt -s autocd、あなたに.bashrcまたはsetopt autocdあなたに.zshrc。次に、別のディレクトリに変更するには、コマンドなしでディレクトリ名を入力します。

入力することを忘れないでください viファイルを編集する場合はすることを。

単一のコマンドでディレクトリに変更するか、ファイルを編集する場合は、それを関数にすることができます。

vi () {
  if [ $# -eq 1 ] && [ -d "$1" ]; then
    cd -- "$1"
  else
    command vi "$@"
  fi
}

-6

Unixでエイリアス機能を使用します。cdをviにエイリアスすると、問題は解決します。


5
...これはvi、エイリアスを手動で上書きしないと使用できないことを意味し、非常に望ましくないと思われます。
クリスダウン14年

3
この答えは、ややトロリーと思われます。それはない OPは、ファイル上の彼らがこれまでに必要なVIを指定しなかったとして、元の質問に答えます。答えは、いくぶん楽しいですが、確かに役に立ちません。
ゲリット14年

1
@ChrisDownまたは、これはvim代わりに適切なものを使用することを教えます。
ケビン14年

@Kevin vimはviよりも「適切」ではありません。多くのシステムでは、viだけが利用可能です。
クリスダウン14年

1
@ChrisDown何を期待するのかを知る方がいいと主張します。vim機能を使用する場合は、を使用しますvim。利用できない場合viは、より限定された機能セットを使用し、期待してください。
ケビン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.