cmd - みる会図書館


検索対象: 実践Vim : 思考のスピードで編集しよう!
20件見つかりました。

1. 実践Vim : 思考のスピードで編集しよう!

TIPI 00 : CSS ファイル中のルールのプロバティをアルファベット順に並べ替えるく 最終的には以下のような結果になるはすだ。 html { border : 0 ; font—size: 100 % ; font : inherit ; margin : 0 ; padding: 0 ; vertical—align: baseline ; body { background : white ; C010r : black; line—height: 1 . 5 ; : s 。 rt コマンドは、各ルールの { } プロック内を対象として実行される。このサンプ ルのスタイルシートにはたかだか 10 行程度の行しかないが、この方法はもっとサイズ の大きな css でもうまくいくだろう。 このコマンドは複雑だけれども、これがどのように機能するかを理解すると、 :global コマンドが非常にパワフルなコマンドであると実感する助けになる。このコマンドは 一般に以下のような形態を取る。 : g/{pattern}/ Ccmd] Ex コマンドは常にそれ自体が範囲を受け取れることを思い出そう ( これについては 85 ページの TIP28 で説明した ) 。このことは、 : gl 。 bal コマンドのコンテキストにお ける [cmd] についても真だ。ということは、上記のテンプレートは以下のように展開 できる。 : g/{pattern}/ Crange] [cmd] 上の [cmd] の [range] は、 : g / { patter Ⅱ } のマッチを参照ポイントとして使用する ことで直接設定が可能だ。「 . 」というアドレスは通常、カーソルがある行を示すが、 : gl 。 bal コマンドのコンテキストでは、これは指定された { pattern } にマッチする各 行を示す。 313

2. 実践Vim : 思考のスピードで編集しよう!

TlP35 : シェルでコマンドを実行く !{cmd} 」はこれとは逆のことをする。つまり、これは指定した { cmd } の標準入力にバッ フアの内容を使用する ( → :h :write-cOO)0 この機能の使用例については TIP45 ( 145 ページ ) を参照してほしい。 コマンドライン中でビックリマークを使う位置によって、この記号の意味は変わっ てくる。以下のコマンドについて考えてみよう。 ー + :write !Sh ー→ :write ! Sh -- + :write! Sh 最初の 2 つのコマンドはバッフアの内容を、外部の sh コマンドの標準入力に渡す。 最後のコマンドは : write ! コマンドを呼び出して、バッフアの内容を sh というファイ ルに書き込んでいる。この場合、ビックリマークにより「既存の sh ファイルを上書き しろ」と Vim に伝えている。見てのとおり、ビックリマークの位置で、その結果は大 きく変わる。この手のコマンドを記述するときにはご用心 ! :write ! sh コマンドを実行すると、現在のバッフアの各行がシェルで実行される。 :h rename-fi1esOO では、このコマンドのナイスな使い方が例示されているので参 考にしてほしい。 外部のコマンドを介してバッフアの内容をフィルタリングする 範囲を指定して : ! {cmd} コマンドを実行するとその意味合いが違うものになる。 [range] で指定された行が { cmd } の標準入力に渡され、 { cmd } からの出力で [range] のもともとの内容が上書きされる。指定した {cmd} によって [range] がフィルタリン グされるともいえる ( → :h :range!OO)0 Vim ではフィルタを「テキストを標準入 力として受け付け、それを何らかの方法で変更し、標準出力に送るもの」と定義して いる。 例として、外部コマンドの sort を使って、以下の CSV ファイルのレコードを並べ 替えてみよう。 €Gode/emails. csv first name , last name ,email john, smith, john@example . com drew,neil .drew@vimcasts . org jane ,doe , Jane@examp1e . com 107

3. 実践Vim : 思考のスピードで編集しよう!

第 5 章コマンドラインモード foobar . 」 s shopping-list . t0d0 history—scrollers . vim $ exit exit コマンドでシェルが終了して、 Vim に復帰する。 Vim をバックグラウンドに Vim には、対話シェルを起動するのに使える : shell コマンドという機能がある。 だが、 Vim をそもそもターミナル上で実行しているのなら、組み込みのシェルコ マンドにアクセスできる。たとえば、 bash ではジョブコントロールを行えるので、 これを使えば、ジョブをバックグラウンドにしておいて、あとからそれをフォア グラウンドに戻して作業に戻ることができる。 ここで、 bash シェルから Vim を実行していて、シェルコマンドをいくつか実行 したくなったとしよう。 ct て 1 ー z を押すと、 Vim を実行しているプロセスが一時停 止され、制御が bash に戻る。 Vim プロセスはバックグラウンドでアイドル状態 となり、いつもと同じように bash セッションで操作をできるようになる。実行 中のジョブの一覧を知るには以下のコマンドを実行しよう。 $ jobs [ 1 ] + Stopped ( [ 1 ] + 停止 V1m bash では、 fg コマンドを使えば一時停止状態のジョブをフォアグラウンドにし て、作業に復帰できる。これにより、さっきまでの状態とまったく変わらないま ま、 Vim に復帰する。 Vim が提供する : shell コマンドと exit コマンドでも同様 のことを行えるが、 ctrl マコマンドと fg コマンドのほうが簡単で手早い。詳細 については、 man bash を実行してジョブコントロールの節を読んでみてほしい。 バッフアの内容を標準入力 / 標準出力に接続する : ! { cmd } 構文を使うと、 Vim は { cmd } の出力をエコーする。コマンドの出力がちょっ とだったり出力がないときにはこれは問題ない。しかし、コマンドの出力が多いと、 これでは使いものにならない。別の方法としては、「 : read ! {cmd} 」コマンドを使え る。これは、 { cmd } からの出力を現在のバッフアに挿入する ( → :h read! ◎◎ ) 。 「 :read !{cmd} 」コマンドを使うと、標準出力を直接バッフアに送り込める。「 :write 106

4. 実践Vim : 思考のスピードで編集しよう!

TlP38 : 隠しファイルの管理く Vim が終了する。 保存されていない変更を確認せずに Vim を終了するのなら、 : qall ! コマンドを実行 するだけでよい。あるいは、 1 つ 1 つ確認せずに、変更されたバッフアをファイルに 書き出すのなら、 : wall コマンドが使える。表 6 ー 1 にこれらをまとめておこう。 表 6 ー 1 Vim 終了時の隠しバッフアの取り扱い コマンド :w[rite] :e [dit] ! :qa[ll] ! : wa [ 11 ] 動作 バッフアの内容をディスクに書き込む ファイルをバッフアに読み込む ( つまり、変更を取り消す ) 警告なしですべての変更を捨て、ウインドウを閉じる 変更されたバッフアをすべてディスクに書き込む 「 :argdo 」や「 :bufdo 」を実行する前に「 hidden 」設 定を有効にする デフォルトでは、 Vim は変更されたバッフアを捨てないようになっている。 :next! 、 :cnext! 、あるいは同様なコマンドのいずれを使おうが、最後のビックリマー : bnext ! 、 クをつけ忘れると、 Vim は「 No write since last change 」 ( 最後の変更が保存され ていません ) と文句をつけてくる。ほとんどの場合は、「ああ、忘れていた」と思い出 させてくれるので便利ではあるのだが、これがうるさい場合が 1 つある。 : argdo コマンドと : bufdo コマンドについて考えてみよう。 :argdo { cmd } コマンド は次のような感じに働いてくれる。 :first → : {cmd} - → : next : {cmd} 、一 etC . { cmd } に指定したコマンドが最初のバッフアを変更すると、 : Ⅱ ext は失敗する。最初 の要素を保存するまでは、引数リスト中の 2 つめの要素に移動させてくれないのだ。 これは使えない ! 123

5. 実践Vim : 思考のスピードで編集しよう!

TP100 : CSS ファイル中のルールのプロバティをアルファベット順に並べ替えるく run the specified [cmd] 」 ({start} で始まり { fi Ⅱ ish } で終わる行範囲について、指定 された [cmd] を実行せよ ) となる。 任意の Ex コマンドと組み合わせるときには、 : gl 。 bal コマンドと同じ形式を使え る。たとえば、指定した範囲をインデントしたいとしよう。以下のように「 : > 」 Ex コ マンドを使うことで、これを行える ( → :h : > ◎① ) 。 6 lines >ed 1 time 3 lines >ed 1 time ( 6 行が > で 1 回処理されました ) ( 3 行が > で 1 回処理されました ) : > コマンドは、それが呼び出されるたびに、メッセージをエコーするが、 : sort は メッセージをエコーしたりしないことには注意しよう。これらのメッセージは [cmd] に : sile Ⅱ t を前置することで抑制できる ( → :h : sil ①◎ ) 。 : g / { pattern } が大量の行にマッチする場合に、このテクニックがとくに役立つ。 315

6. 実践Vim : 思考のスピードで編集しよう!

第 15 章 グローノヾルコマンド 305 ンにマッチしない各行について [cmd] を実行するように Vim に伝える。次の TIP で :global コマンドの挙動を反転 (invert) できる。これらは、 Vim に指定したパター : global ! もしくは : vglobal ( ニーモニック :v は invert の v) を実行することで、 と、 Vim は : pri Ⅱ t をデフォルトで使用する。 ンドが最も便利なことがわかっている ( 82 ページの表 5 ー 1 を参照 ) 。 [cmd] を省略する 指定することはできない。実際には、ドキュメント中のテキストを操作する Ex コマ ーこに : global コマンドをもう 1 つ [cmd] には任意の Ex コマンドを指定できるが、 しておくと、 Vim は自動的に現在の検索パターンを使う。 {pattern} フィールドは検索履歴を統合している。つまり、このフィールドを空に きく異なる点だ。後者のデフォルトの範囲はカーソル行である (. ) 。 、 : substitute 、 :normal など ) で : 大 マンドと他のほとんどの Ex コマンド ( : delete :global コマンドのデフォルトの範囲はファイル全体だ ( % ) 。これは、 :global コ : [range] global [ ! ] /{pattern}/ [cmd] :global コマンドは以下のような形式を取る ( → :h : g ◎① ) 。 ドを実行できる。ますは、その構文から見ていくことにしよう。 :global コマンドを使うと、特定のパターンにマッチした各行に、 Ex コマン 引 P97 : グローバルコマンドとは 行うための、 Vim の強力なツールなのだ。 る。ドットの公式やマクロと並んで、 : gl 。 bal コマンドは、繰り返し作業を効率的に する。これを使って、指定したパターンにマッチする各行に、 Ex コマンドを実行でき : global コマンドは、 Ex コマンドのパワーと Vim のパターンマッチ機能とを結合

7. 実践Vim : 思考のスピードで編集しよう!

: [range] write ! {cmd} : [range] !{filter} TlP35 : シェルでコマンドを実行く [range] で指定された行を標準入力として、シェルで { cmd } を 実行する 外部プログラム { filter } で、指定した [range] をフィルタリ ングする 特別扱いされているコマンドもいくつかある。たとえば、 m e と grep にはそのラッ パーとなるコマンドが用意されている。これらは Vim 内部から簡単に実行できるだけ ではなく、その出力はパースされて quickfix リストにも挿入される。これらのコマン ドについては、第 17 章「 quick ⅱ x リストを使って、コードのコンパイルとエラー発生 箇所への移動を行う」 ( 331 ページ ) と第 18 章「 grep/vimgrep などを使ってプロジェ クト全体を検索する」 ( 345 ページ ) で詳しく取り上げよう。 109

8. 実践Vim : 思考のスピードで編集しよう!

第 5 章コマンドラインモード 2 つめのフィールド、 last Ⅱ e を基準にソートしよう。フィールドがカンマで区切 られていると sort コマンドに伝えるには、 -t ) , , オプションが使える。また、ソート の基準として 2 つめのフィールドを使用するよう指定するには、一 k2 フラグが使える。 このファイルの先頭行はヘッダ情報なので、これはファイルの先頭に残しておきた ' —k2 : 2 , $ ! sort —t ' る。これを実行してくれるコマンドラインは以下のようになる。 い。そこで、 2 , $ という範囲を指定して、これをソート処理の対象とはしないようす john, smith, john@example. com drew,neil .drew@vimcasts . org Jane ,doe .jane@example. com first name , last name , email はすだ。 この CSV ファイルの内容は、 last name を基準に並べ替えられ、以下のようになる に便利なショートカットが用意されている。 ! {motion} オペレータコマンドを実行す こで見たような「 : [range] !{filter} 」コマンドの範囲を設定するの Vim には、 ンドを呼び出すときに使える超便利なコマンドをいくつか抜粋して以下の表にまとめ Ⅵ m では、ほんのいくつかのキーを叩くだけでシェルにアクセスできる。外部コマ 考察 る。残る { filter } コマンドは自分で入力しなければいけないが、ちょっとオトクだ。 すると、 Vim は「 : . , $ ! 」と [ r ge ] の設定を行ったうえでプロンプトを表示してくれ の部分に入力される ( → :h ! ①◎ ) 。たとえば、カーソルを 2 行目に置き、起を実行 ると、コマンドラインに切り替わり、指定した { m 。 ti 。 n } の対象となった行が [range] ておこつ。 コマンド :shell : read ! {cmd} 108 効果 シェルを開始する (exit で Vim に戻る ) シェルで { cmd } を実行する シェルで { cmd } を実行し、その標準出力をカーソル行の下に挿 入する

9. 実践Vim : 思考のスピードで編集しよう!

第 5 章コマンドラインモード もコマンドラインモードが有効になる ( 60 ページの TIP16 を参照 ) 。本章のテクニ クのなかには、これらのように、プロンプトが異なる状態でも使えるものもある。け れども、基本的には Ex コマンドに焦点を絞ろう。 ツ 表 5 ー 1 バッフア内のテキストに作用する Ex コマンド のなかでもとくに便利なものを表 5 ー 1 に示す。 本章では、主にテキスト編集に使えるいくつかの Ex コマンドに注目していく。そ られているのだ ( 全コマンドは次を参照→ : h ex-cmd-indexOO)0 も使える。実際、 Vim にはほとんどすべてのことをするためのコマンドが取りそろえ 扱ったり (:prev 、 :next) ノヾッファリストを扱ったり (:bprev 、 :bnext) するために したり (:tabnew) ウインドウを分割したり (:split) するためにも、引数リストを Ex コマンドは、ファイルを読み書きするためにも (:edit 、 :write) 、タブを作成 コマンド : [range] delete [x] : Crange] substitute/{pattern}/{string}/ [flags] : [range] yank : [line] put Cx] : [range] copy {address} : [range] move {address} : [range] join : [range] normal {commands} : [range] global/{pattern}/ [cmd] 動作 指定した行を削除 ( してレジスタ x に登録 ) 指定した行を ( レジスタに ) ヤ ンク 指定した行のあとにレジスタ x か らテキストをブット 指定した行を、 {address} で指定さ れる行の下にコピー 指定した行を、 {address} で指定さ れる行の下に移動 指定した行を連結 指定した各行に対してノーマルモー ドの { c 。 mm ds } を実行 指定した各行で、 {pattern} があれ ばそれを { string } に置換 指定した行のうち、 {pattern} がマ ッチするすべての行で、 Ex コマン ド [cmd] を実行 これらのコマンドのほとんどには範囲を指定できる。これがどういうことかについ ては TIP28 ( 85 ページ ) で取り上げよう。 : c 。 py コマンドは、「「 : t 」コマンドで行をコ ピー』 ( 91 ページ ) で見るように行をチャッチャッとコピーするのに便利だ 0 : normal コマンドは、指定した範囲の行に対して同じ内容の変更を適用するのに便利に使える 82

10. 実践Vim : 思考のスピードで編集しよう!

第 7 章ファイルのオープンとディスクへの保存 ー→ :write E45 : 'readonly' option is set (add ! tO override) ( E45 : 'readonly' オプションが設定されています ( ! を追加で上書き ) ) メッセージに従って、もう一度コマンドを実行してみよう。今度は最後にビックリ マークっきだ ( このビックリマークは「今度はやってやるよ ! 」と読む ) 。 :write! t'/etc/hosts" E212 : Can't open file for writing ("/etc/hosts" E212 : 書込み用にファイルを開けません ) こでの問題は、 / etc / h 。 sts ファイルに書き込みを行うパー、ツションを持ってい ないことだ。思い出してみよう。「これは r 。。 t が所有していて、ユーザ—drew とし てⅥ m を起動したのだった。解決策は、以下に示すちょっとヘンなコマンドだ、 7 。 → : w ! sudO tee % > /dev/null 、一 Password: W12 : Warning : Fi1e "hosts" has changed and the buffer was changed in Vim as well [O]k, (L)oad FiIe, Load ( A ) 11 , (l)gnore A11 : ( 続けるには ENTER を押すかコマンドを入力してください ) ( W12 : 警告 : ファイル "/etc/hosts" が変更され Vim のバッフアも変更されました ) ( 詳細は ":help W12 " を参照してください ) ( [ 0 ] K , ファイル読込 ( (L) ) : Vim はこちらに 2 つの入力を要求する。まず、ユーザー drew のパスワードを入力 しなければならない ( 入力している間は、こっちを見ないでね ) 。すると、 Vim はファ こでは、↓を押し イルが変更されていることを警告し、取り得る選択肢を表示する。 て、ファイルをバッフアに読み込み直すことをお勧めしておく。 何が起こっているのだろう。「 :write ! { cmd } 」コマンドは、バッフアの内容を、指定し た { cmd } の標準入力に送る。この { cmd } は外部プログラムなら何でもよい ( → : h :write-c ①◎ ) 。 Vim は依然としてユーザー drew として実行されているが、外部プロセスに はスーパーユーザーとして動作しろと伝えることができるのだ。 こでは、 tee ユー ティリティが sudo パーミッションで実行される。これはつまり、 /etc/hsots ファイ ルに書き込めるということだ。 Vim のコマンドラインでは % 記号は特殊な意味を持つ。これは展開されて、現在のバッ * 7. 訳注 : 実際に表示される出力は例とは異なる場合があります。なお、カッコ内に示しているのは Ubuntu Desktop 13.04 にインストールした Vim 7.3.547 の出力例です。 146