web-dev-qa-db-ja.com

シェルが「vi」モードまたは「emacs」モードにあるとはどういう意味ですか?

この質問は 答え から直接続きます。この場合、私は特に言う部分を理解することができません:

その点で、その動作はbash(readline)/ ksh/zsh emacsモードの場合よりもemacsに近いですが、ターミナルドライバの埋め込みラインエディタ(標準モード)からは外れます。 Ctrl-W 以前のWordを削除します(Werase、viでも)。

ここでは、2つの完全に異なるプログラムであるエディターではなく、シェルについて説明しています。シェルが一部のエディターモードであるとはどういう意味ですか?

PS:シェルとは何か、基本的な編集にvimを使用する方法を理解しているという前提に基づいて、答えを出すことができます。

32
Geek

「vi」モードでは、viエディターの行のように現在のシェルプロンプトを編集/ナビゲートできます。 1行のテキストファイルのように見ることができます。同様に「emacs」モードでは、Emacsのショートカットの(一部)を使用して現在のコマンドラインを編集/ナビゲートできます。

たとえば、viモードでは(bashで)次のようなことができます。

$ set -o vi
$ ls hello world
<ESC>
bbdw # results in
$ ls world

Emacs-modeでは、たとえば、 Ctrl+A 行頭でジャンプする(vi: Ctrl+[、  または ESC)。 emacsモードはset -o emacs(bash、ksh、zshなど)でオンにできます。

読み込まれた行

多くの対話型コマンドラインプログラム( bash を含む)は readline ライブラリを使用します。したがって、使用する入力モード(viまたはemacs)と他のオプションを1か所で構成して、readlineを使用するすべてのプログラムがまったく同じ編集/ナビゲートインターフェースを持つようにすることができます。

たとえば、私のreadline構成は次のようになります。

$ cat ~/.inputrc 
set editing-mode vi
set blink-matching-paren on

たとえば、 zsh / ksh は、私が知る限りreadlineを使用していませんが、bash/readlineによく似たvi/emacsモードもサポートしています。

もちろん、コマンドラインシェルのvi/emacsモードは、完全なエディター機能セットのサブセットにすぎません。コマンドラインシェルではすべての機能が意味をなすわけではなく、一部の機能は他の機能よりもサポートが複雑です。

正規モード

対話型コマンドラインシェルのvi/emacsモードが「発明された」以前は、シェルは端末の canonical mode を使用するだけであり、限定された編集コマンドのセットしか提供しませんでした(たとえば、 Ctrl+W 最後の単語を削除します。

27
maxschlepzig