UNIXでVIキーを使用してシェルコマンドを編集する


28

UNIXが本当に得意な同僚がいました。

彼は、Viキーバインディングを使用してシェルコマンドを編集する方法を示しました。

彼はコマンドを、私がログインするたびに実行されるファイルに入れました。

それ以来、私は別のプロジェクトに移りました。

残念ながら、これを設定する方法を覚えていません。

Viキーバインディングを使用して端末でコマンドを編集する方法を知っている人はいますか?

その設定を永続的にするにはどうすればよいですか?

回答:


31

あなたは今までで最高の機能について話している!

これを.bashrcファイルに追加することにより、viコマンドを使用してシェルコマンド(およびコマンド履歴)を編集できます。

set -o vi

コマンドラインからそのコマンドを実行して、現在のセッションのみに影響を与えることもできます。

bashを使用しない場合は、シェルの適切なrcファイルに置き換えてください。


これにより、viコマンドを使用してコマンドを編集できます...

jまたはkを使用して、履歴を移動することもできます(を押した後ESC)。

/(を押した後ESC)を使用して、古いコマンドを検索することもできます。

つまり、cp10分前に実行した超長コマンドを見つけるには:

ESC/cpENTER

そして、あなたがあなたの歴史の中で一致するすべてのコマンドを循環することができますnN

これにより、コマンドラインでの生産性が10兆倍向上しました!


4
さて、実際にはviを使用しているのではなく、行編集にviスタイルのキーボードコマンドを使用しています。

4
確かに...適切な用語は、vi bindings in the shellこれが今までに発明された最大の機能だと思います!
-jahroy

モードを表示する方法があれば、emacsバインディングからviバインディングに切り替えます。あなたはそれを行う方法を知っていますか?
iconoclast

彼らは、バインドする方法があるjjESC我々は通常のvimで行うように?
steveyang

@yangchenyun-たぶん、この質問はそれを助けるでしょう:stackoverflow.com/questions/844862 / ...私はコマンドを個人的にバインド/変更しません。
ジャロイ

12

bashを使用している場合、jahroyとevil ottoがすでに答えているので、使用できます

set -o vi

bashがviスタイルの編集コマンドを使用するようにします。

これが完了したらEsc v、現在のコマンドラインのコピーを含む一時ファイルを使用してviエディターを起動するように入力できます。コマンドを編集して、複数の行に置き換えることもできます。ファイルを保存すると(:wq)、シェルは編集されたコマンドを実行します。

ご希望の場合

set -o emacs

Ctl-XCtl-E同じことをするために使用できます。$EDITOR必ずしもemacsではなく、好みのエディターを使用します。

(個人的に、私はほとんどの編集にvi(実際にはvim)を使用set -o emacsしていますが、シェルでは好みです。挿入モードの切り替えはファイルの編集には最適ですが、インタラクティブなコマンドには扱いにくいです。YMMV。)


viスタイルを避けて通常の編集モードに戻る方法を知っていますか?Bl Numで成功したことを覚えていますが、今はもうありません。私は何が欠けていますか?
ピエトーニ

@piertoni:set -o emacsあなたがしたいことをしませんか?
キーストンプソン

はい、それは仕事をし、私は感謝、ポイントを逃した
piertoni

10

set -o vi@jahroyが投稿されたように行編集コマンドを変更するために使用できますが、fcコマンド(bashおよび私はkshで利用可能ですが、tcshではない可能性があります)を考えているかもしれません。おそらくvi)に設定し、エディターを終了するときにコマンドを実行します。マンページまたは詳細を参照するかhelp fc、試してみてください。


5
alias r='fc -e -'前のコマンドを再実行するための貴重なエイリアスです。 fcそれ自体がKornシェルに由来すると思います。コマンドを番号で指定できます(fc 123 129履歴内のコマンド番号123〜129を編集します)。相対番号を指定できます(fc -10 -1最後に入力した10個のコマンドを編集するため)。以前のコマンドはでリストできますfc -l。あなたは接頭辞でコマンドを指定することができますrエイリアス(r makeの最後の呼び出しを実行しますmake。そうr m、あなたが実行していませんでした場合はmv、あなたが最後に実行するので、コマンドをmake、など)。
ジョナサンレフラー

6

vimで最近使用したコマンドを編集し、エディターを保存して終了した後、編集したバージョンを呼び出すには、fc組み込みのシェルを使用します。引数なしで次を実行します。

  1. 一時ファイルを作成し、/tmp最後に入力したコマンドを使用してデータを取り込みます
  2. エディターが正常に終了すると(終了コード0で)、その一時ファイルで見つかったコマンドが実行され、このファイルが削除されます。編集されたバージョンは、通常のコマンドとして(少なくともzshで)履歴に保存されます。エディターがゼロ以外のコードで終了した場合、何も実行しません(vimでは、これを強制終了するか、を使用して実行できます:cquit)。

コマンドはbashとzshの両方で機能します。


5

実際、これは実際にこれまでで最大の機能です。しかし、もっとあります:

という名前のファイルを作成します

.editrc

行を含む

bind -v

Editlineは、readlineのようなサービスを提供するBSDライセンスバージョンライブラリです。その.editrcは、MySQLのコマンドラインシェル、またはreadlineを使用しないアプリケーションでキーバインディングをviモードに設定します。

私は年月を経ていくぶん忘れっぽくなったので、.zshrc はviモードのラッパーを提供し、コマンドラインでどのモードになっているかを示します。いいね。

私はzshであなたが入力できることを知っています

bindkey -L

キーバインドのリストを取得します。bashには同様のものが必要です。すべてのviキーがデフォルトでバインドされているわけではありません。あなたがどのようにフィットしているかを彼らにバインドし、レースに出かけましょう。


MySQLのviバインディングにこれを5回賛成できたらと思います!
jahroy

1

端末で、と入力し export EDITOR=viます。

この設定を保存するには。この行をファイル〜/ .profileに入れます


5
それは(コマンドの注意を払うようにあなたのデフォルトのエディタ設定$EDITORにします)vivi(少なくとも直接ではなく)でシェルコマンドを編集することはできません。
キーストンプソン

2
@KeithThompson Zshは、を$EDITOR含む場合、デフォルトでvi編集モードになりますvi。これを行う唯一のシェルだと思います。
ジル「SO-悪であるのをやめる」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.