Exモードには実用的な用途がありますか?


115

Vimには、を入力することで入力できるExモードQと、で入力できるコマンドラインモードがありますq:。新しいvimユーザーの間でよくある不満は、vimを終了しようとしたときに誤ってこれらのモードに入ることです。そのため、私はこれらのキーを無効にして、~/.vimrc誤って(特にq:)ヒットしないようにします。

map q: <Nop>
nnoremap Q <nop>

Exvimのドキュメントを読んで中程度の経験を持つVimユーザーであり、その背後にある基本的なアイデアを理解していますが、それでも日常のvimの使用でその使用を見つけるのに苦労しています。一般に:、変更はすぐには反映されないため、接頭辞が付いた標準のvimコマンドラインコマンドを入力するよりも有用ではないようです。

Exには、現代のVimでの実用的な日常使用がありますか Exモードでは、標準コマンドよりも簡単にできることはありますか?コマンドラインモードとexモードの違いは何ですか?


13
Qq:はまったく異なります。あなたはQ正しいことだけを言っていますか?
ジェームスサン

@jamessan、実は、私にはわかりませんでした...あなたは正しいです、彼らは基本的に同じであると仮定していましたが、彼らは異なることをするようです。この質問に答えると、明らかに混乱するので、そこを明確にするのに役立つかもしれません。
アンドリューフェリエ

この質問はMeta議論されています。
200_success

1
@AndrewFerrier q:具体的に質問し、2つのキーシーケンスの中で、最も問題の多いシーケンスとして言及しました。そして、ここでの答えのうちの2つは、正しい用語で検索している人に役立つかもしれません。
Random832

4
q/q:して何をするかを学ぶとき、おそらくVimで最も便利なコマンドのいくつかを検討するでしょう。そして、はい、あなたはすでにそれらの使い方を知ってます、あなたはまだ彼らが何をするのかまだ知りません。見るこのスクリーンキャストを見つけるために。
佐藤桂

回答:


81

Qあなたが見つけたように、元モードです。対話的に使用することは完全に有用ではありませんが、Vimを使用して古いexバイナリをエミュレートできるため、存在します。実際、多くのシステムは、exコマンドをにシンボリックリンクするだけでコマンドを提供しvimます。

q:、または:<C-f>、代わりにコマンドライン履歴を閲覧し、通常のバッファのように編集する方法を提供します。これにより、実行した前のコマンドを簡単に見つけて、通常のVimコマンドで編集し、変更したコマンドを実行できます。q/そしてq?コマンドは、検索履歴に同じ機能を提供するために存在します。


64

ExモードのVimは、次の場合に便利です。

  • (スクリプトの一部として)非インタラクティブに(複数の)ファイルを編集する必要があります。
  • 接続が非常に遅いか、操作後に画面が更新されません。
  • マッピングと略語は無効です。
  • Escapeまたはなどの共通キーControlは正常に機能しません。

基本的にviは視覚モードであるためex、Vim Ex Modeは単なるエミュレーションでありex(同じコードを引き続き実行します)、exviからコマンドモードに、またはその逆からコマンドモードに切り替えることができます。実際には2つのモードがあります。Exモード(vim -e)と、vi互換のExモード(vim -E)よりも高度なコマンドを可能にする改良されたExモードです。参照:Exモードと改良されたExモードの違いは何ですか?

Exが編集者の家族のルートですeditexvi。Exはのスーパーセットでed、最も注目に値する拡張機能はディスプレイ編集機能です。ex(1)

編集は、非対話的にファイルと同様の方法でそれを使用する最も一般的な使用法と人々であるsedawk、しかし、彼らは指向よりストリームされている-彼らは唯一の(それらが複数行で動作するように設計されていない最初から最後まで前方にファイルを読み込みます)vimバッファ指向です-ファイル内を好きなように前後に移動できるため、非常に強力です。

基本的に:

sedあるSの treamのEDの itor、ないファイルエディタ。

それにもかかわらず、人々はファイルを編集しようとするためにそれを乱用するようであり、真実はファイルを編集しないということです。次に、インプレース(-i)などのオプションは非標準のFreeBSD拡張機能であり、他のオペレーティングシステムでは利用できない場合があります。あなたが使用する必要があるので、あなたは移植不可能コードを避けたい場合は、I / Oのオーバーヘッドと(例えばシンボリックリンクを破壊するような)悪い副作用ex(と一緒に標準のUNIXコマンドベースのエディタであるedBashFAQ


Exモードで役立つその他のことは、python多くのコマンドを連続して実行したり、正規表現を操作/デバッグしたり、vim設定を確認したり、外部コマンドを実行したり、レジスタを操作したりできるプレイグラウンド(コンソールに似ています)として使用することです。

例えば:

let @d = '<td></td>'
let @r = '<tr>' . repeat(@d, 5) . '</tr>'
echo @r
let @t = '<table>' . repeat(@r, 5) . '</table>'
reg

これは、Exモードでは通常モード(最後のコマンドのみが表示される)よりも簡単です。


実用的な使用法

に次のエイリアスがあります.bash_aliases

alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"

注:using bufdoexPOSIX準拠の方法ではないため(マニュアルによる)、find代わりに使用することを検討できます。!(そうでない場合は警告が生成される)保存せずにバッファを切り替える強制するために使用されます。

すべてのソースファイルの末尾のスペースをトリミングするために使用している最初のもの、たとえば:

trim **/*.php

2番目のものは、すべてのタブをスペースに(再帰的に)変換ます。例:

retab **/*.php

私にとっては使用retabするだけで十分ですが、ここで説明するいくつかの欠点があります-V冗長出力を増やすために追加します。

上記の例はzshの/ bash4を使用していることに注意してくださいグロブ**)ので、必ずお使いのシェルがそれをサポートし、それが有効になっています。

より実用的な例(htmlファイルの解析など)については、以下を確認してください。

Ex-modeの詳細については、以下をご覧ください。


あなたが達成することは単純ではあるオペレーション「の編集(複数)が非対話的にファイル」の一例投稿してくださいすることができex、それはであるよりもedsed、またはをawk
佐藤桂

1
@SatoKatsuraは、複数のファイルを扱う2つの実用的な使用法を追加しました。
ケノーブ

exモードをよりよく把握するために、ドキュメントを掘り下げてきました。alias コマンドにバング(!)が含まれている理由がわかりません。それは、最後のファイルを除くすべてのファイルのすべての変更を放棄しないのですか?そうでない場合は、なぜですか?trimbufdo
ワイルドカード

@Wildcard Withoutは!基本的に機能しません。バッファが切り替えられるたびに、ex保存されていない変更について文句を言うでしょう(そして最後にで変更を保存していますxa)。警告は無効にできますが、追加する方がはるかに簡単!です。
ケノーブ

なるほど...ドキュメントを読み間違えていると思います。それがあることを指定せずに!バッファが放棄することができない場合、コマンドは失敗しますが、それは明示的に指定していない!バッファがするようになりますではないので、「落下意味、この場合には「捨てられた」ん....捨てられます、ディスクに書き込まれていないものが含まれていないため」または何?(私は見ています:help bufdo
ワイルドカード

18

私はめったに元モードを使用しませんが、必要なときは、その存在に感謝しています。

私は時々VPN経由でssh経由でシステムにアクセスしますが、これらの接続は時々遅くなることがあります。問題を悪化させているのは、リモート側でファイルを編集する必要があることです。これは、sshとVPNの背後にあることに加えて、低速のシリアル接続(9600ボーと多くのネットワーク遅延)を介しています。

このように、視覚的なフィードバックと画面の更新は、見ているものが遅れるため、より邪魔になります(効果は、マイクに向かって話しているようなものですが、スポーツスタジアムのように遠く離れたスピーカーで話しているようなものです。フィードバックの遅れにより混乱する場合があります)。

この場合、変更がエコーバックされないことは、画面の更新を待たずに短時間でより多くの作業を行えるため、便利な利点です。

編集が完了したら、視覚モードに戻って1回だけ画面を更新し、作業を確認します。その後、元のモードに戻るか、完了したため保存できます。


13

コマンドラインウィンドウは、長く複雑なコマンドを書き出すのに便利です。コマンド履歴はウィンドウとして開くので、vimナビゲーションまたは編集コマンド/マッピングを使用できます。

一度実行したが間違えた長い置換コマンドを編集するとします。

:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c

検索文字列を変更するにbは、Ex行のようなvimモーションを使用してナビゲートすることはできません(ただし、このナビゲーションにはキーマッピングがあると思います)。代わりに、ほとんどの人が左矢印キーを何度も押します。

より良い方法:q:コマンドラインウィンドウkに移動して最後のコマンドに移動し、変更したいコマンドの部分に通常の動きで移動します。単語全体を変更したい、問題ありません:ciw


はい、ありがとう。Exコマンドラインq: 確かですか?ヘルプは、によって起動されたモードに対して「Ex」というフレーズのみを使用しQますがq:、これは、参照している標準のvim編集をサポートしていません- ヘルプは単に「コマンドラインモード」を呼び出します。最初はこの2つを混同していたことは知っていますが、おそらくここでの区別について明確にする必要があります。
アンドリューフェリエ

1
:help q:そのフレーズを使用することに決めた前に検索しましたが、用語について混乱するかもしれません。
bsmith89

1
私もこの用語について混乱しています。私は通常、Exコマンドを次のよう:に入力することについて話しますが、間違っている可能性があります。
bsmith89

3
回答の内容はすべて正しいですが、用語の使用方法は(私にとって)少しわかりにくいです。ドキュメントを少し間違って解釈していると思います。q:Exコマンドラインを開きません。コマンド履歴ウィンドウが開き、現在および以前のExコマンドを編集できます。Exコマンドラインは:、通常モードでを押したときに表示されるものです。
リッチ

3
FWIW Vimのドキュメントも少し混乱していると思い:ます。すべてのコマンドを「Ex」コマンドとして参照している場所があるからです。私見では、実際にExで実際に使用できるコマンドのみをExコマンドと見なす必要があります。
リッチ

6

私は失明している部分的な視力のある人から、彼がexに切り替えていると言われました。私自身はviよりもかなり年上で、ずっと前にedからexに切り替えました(はい、「edは標準エディターです」)。私がviモードで行うことは、Lispコードを記述するときに括弧に一致するように%バウンスすることだけです。


このインタビューを思い出します。ex特に言及されたかどうかは覚えていません。
マーティントゥルノイ

優れた洞察力、私はこれを考えたことがなかったでしょう。本当にありがとうございました。
アンドリューフェリエ

2

ここですでに述べた使用方法とは別に、exは、たまたまS / 390プラットフォーム上であり、コンソールが画面指向ではなく行指向である場合、Linuxコンソールでファイルを編集する方法でもあります。


0

Exモードには実用的な用途がありますか?

おそらくない。ただし、Exモードに入るのはあまり便利ではありませんが、特にExコマンドを:g/グローバルコマンドとともに使用して一致する行を操作するため、Exコマンドを学習することは依然として有用です。


-1

元の「ex」は、Unixの「ed」テキストエディタのアップグレードバージョンでした。2BSDでは視覚モードが追加され、新しいエディターは「vi」と呼ばれました。

exコマンドラインを使用する場合は、「:」キーを使用してコマンドモードに切り替えます。したがって、私の最善の理解では、exは実際にはノスタルジーのためではなく、コマンドモードを提供する部分です。

また、挿入モードに入ることもできます

 :i 

「Enter」を押してテキストを入力します。^ cで終了します。または、次のように1つのコマンドラインですべて入力します

 :i my multiline text \with a second line.^c

1
Ex-modeCommand-line-modeとまったく同じではないことを考えると、これは質問に答えていないようです。また、補足的な注意事項として、コマンドモードは、コマンドラインモードではなく、通常モードの残念な同義語です。
8bittree

「コマンドモード」ポイントが取られました。言い訳だけに、新しい追加をviに変更したとき、「コマンド」ではなく「ビジュアル」(現在のvimビジュアルモードではない)になりました。一方、コマンドラインはexと同じdo_cmdline()を呼び出すようです。私が認める「実用的」を示唆するものではありません。
if2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.