カーソル - みる会図書館


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

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

TlP34 : 履歴からコマンドを呼び戻すく コマンドラインウインドウは、一般的な Vim のバッフアに似ていて、各行には履歴 に含まれる各要素が表示される。第キーと」キーで履歴を前後に移動できるし、 Vim の 検索機能を使ってコマンド履歴の検索もできる。 CR > キーを押せば、カーソル行の内 容が Ex コマンドとして実行される。 Vim にはモードがあり、その編集機能は強力だ。そして、コマンドラインウインド ウを使うと、この強力な編集機能をフルに活用してコマンド履歴に手を加えることが できる。これが、コマンドラインウインドウの利点だ。ノーマルモードで使い込んだ モーションコマンドを何でも使って行を移動できるし、ビジュアルモードで選択した範 囲に対して何かをしたり、挿入モードに切り替えたりもできる。コマンドラインウィ ンドウの内容に対して、 Ex コマンドを実行することだってできるんだ ! 虹を押してコマンドラインウインドウを召喚したら、さっきの問題は以下のように して解決できるだろう。 キーストロークバッフアの内容 {start} U<Esc> urite ! ruby % write ! ruby % write ー !ruby % date ー ! ruby % : s/write/update fC を押すと、「 :update ー !ruby % 」コマンドがコマンドラインに入力されたかの ように、実行されるだろう。 コマンドラインウインドウが表示されている間は、カーソルは常にそこに存在する。 つまり、コマンドラインウインドウを閉じる以外には、他のウインドウに切り替えるこ とはできない。コマンドラインウインドウを閉じるには : q コマンドを実行するか ( こ れは、通常の Vim ウインドウと同じ ) 、を押すだけだ。 コマンドラインウインドウでく CR> を押すと、アクテイプなウインドウの内容に対し てコマンドが実行されることには注意しよう。ここでいう「アクテイプなウインドウ」 とは、コマンドラインウインドウが召喚される前にアクテイプだったウインドウのこと だ。コマンドラインウインドウが表示される前に、どのウインドウがアクテイプだっ たかを Vim は教えてくれたりはしないから、分割ウインドウを使っているときには、 どれがアクテイプだったかに注意すること。 103

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

TlP30 : 選択範囲に対してノーマルモードのコマンドを実行するく 「 : , く ,'>normal . 」コマンドは次のように読める。「 For eachline ⅲ the visual selec tion. execute the Normal mode ー command 」 ( ピジュアルモードで選択した各行に対 して、ノーマルモードの : コマンドを実行 ) 。この方法は、相手にするのが 5 行でも 50 行でも同じように働く。これがホントに美しいのは、行数を数える必要すらないとこ ろだ。ビジュアルモードで選択すればいいのだから。 こでは、 : normal を使ってドットコマンドを実行していたが、ノ ードの ーマルモ コマンドならどれでも同じように使える。たとえば、以下のコマンドー発でも、 この 問題は解決できていただろう。 → : %normal A ; % 記号はファイル全体を表すのに使われる。ということは、「 :%normal A; 」は「ファ イルのすべての行の行末にセミコロンを追加しろ」と Vim に伝えている。この変更に は挿入モードへの切り替えが必要だが、 Vim はそのあとで自動的にノーマルモードに 復帰してくれる。 指定したノーマルモードコマンドを各行に対して実行する前に、 Vim はカーソルを その行の先頭に移動する。そのため、コマンドを実行するときにカーソルがどこにあ るかを考える必要がない。以下のコマンドなら、 JavaScript コードを含むファイルの すべての行をコメントアウトできる。 : %normal i// : normal はノーマルモードコマンドと組み合わせられるが、 Vim の繰り返しコマ ンドと組み合わせて使うのが最強だと筆者は悟った。その繰り返しコマンドとは、 「 :normal . 」 ( 単純な繰り返し ) か、「・ •normal @q」 ( もっと複雑な処理 ) だ。これら の例については TIP67 ( 219 ページ ) 、 TIP69 ( 225 ページ ) を参照してほしい。 「 Ex コマンドの射程は広範囲」 ( 84 ページ ) では「 Ex コマンドは複数行を一度に変 更する」といった。 : normal コマンドを使うと、 Vim のノーマルコマンドが持つ高い 己述性と、 Ex コマンドの長射程を組み合わせられる。これが合体の力だ ! こで見た問題を解決する方法はまだまだあるので、 TIP26 ( 78 ページ ) も参照し てほしい。 95

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

TlP49 : 文字を検索く ことに筆者は気づいた。文字 d までを削除するのは、一般的なパターンではない。 方、センテンスの最後の句を削除するのは、けっこうよくあることなので、毎 : を指 先マクロとするのに十分だ。 通常は、筆者としては、現在行でカーソルをサクサクと移動させたいときにはよ く気品とをノーマルモードで使う。一方、言 ) コマンドとテなコ マンドは、四第 9 もしくは可島と組み合わせて使うことが多い。言い方を変 えると、まとはノーマルモードで、第とテはオペレータ待機モードで使う。詳細につい ては、 51 ページの TIP12 ( および 54 ページの「オペレータ待機モード」 ) を参照され スクラブルゲームみたいに考えよう 文字検索コマンドはキーストロークの面で非常に効率的だが、どのくらい効率的か は何を検索するかによって変わってくる。スクラブルゲーム , 4 で遊べばわかるように 他の文字よりも出現率が高い文字というものがある。 ) コマンドに使う文字と して出現率が低いものを選ぶ癖をつけると、一度のモーションで目的の文字に直接移 動できる確率が高くなる。 以下のセンテンスから形容詞 (adjective) だけを削除したいとしよう。 amprove your writing by deleting excellent adj ectives. カーソルを「 excellent 」に移動させるには、どんなモーションを使うべきだろう か。を押して最初の文字に移動するとしたら、のあとにまを続けて、そこまでに ある邪魔者をパスしなければならない。のほうがよい選択だろう。これなら、一発 で「 excellent 」の x まで移動できる。そこからは、 4 コマンドで単語を削除すれば いい ( の詳細については 171 ページの TIP52 を参照してほしい ) 。 「 Take a 100k at the text that you're reading. 」 ( いま読んでいるテキストを見てみよ う ) 。ほとんどが小文字だ。大文字が出てくるのはまれだ。句読点も少ない。文字検索 コマンドを使うときには、出現率の低いものを移動先の文字としたほうがよい。実際 に使っていくことで、どんな文字を選べばよいかが体得できるだろう。 * 4. 訳注 : スクラフルゲ - ム ()c 「 abble PIaye 「 ) は、文字を組み合わせて単語を作り上けるポードゲーム。 163

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

TlP46 : 自分の指はホームボジションから外さないく くと、矢印キーにべッタリのテキストエデイタを使っていると「矢印キーなんて何で いままでガマンして使っていたんだろう」と不思議に思うことだろう ! 右手はあるべき位置に置いておく QWERTY キーポードでは、」キー、第キー、一キーは右手の人差し指、中指、薬指が そのまま置かれる場所だ。人差し指はキーを押すのに使うけど、それには指を動かさ なきゃいけない。これを問題だと思う人もいて、そういう人たちは解決策として右手 をまるごと左に 1 文字分すらすことを勧めてくる。そうすれば、 4 本の指でふ第新 ↓のそれぞれを担当できるようになるから。でも、そんなことはしないでほしい。 これから先を読んでいくとわかるが、 Vim にはカーソルをもっと素早く移動するた めの方法がたくさん用意されている。 1 行のなかで日キーを 3 回以上叩いているのなら、 それはキーストロークを無駄遣いしている。 1 行の中を左右に移動するのなら、単語レ ベルのモーションか文字検索モーションを使ったほうが簡単だ ( 156 ページの TIP48 、 159 ページの TIP49 を参照のこと ) 。 筆者は、カーソル移動をほんのちょっとミスったり、 1 文字分ずれたりしたときに しか日キーと↓キーを使わない。それ以外のときには、ほとんどこれらのキーには触ら ない。トキーをほとんど使わないのだから、 QWERTY キーポードだと、このキーにわ ざわざ指を移動する必要があるというのも喜んで受け入れようじゃないか。トキーを 使わない代わりに、筆者は文字検索コマンドをよく使う ( 159 ページの TIP49)0 だか ら、小指の下に一キーが鎮座しているのもうれしいことなんだ。 矢印キーに指を伸ばすクセをやめる 矢印キーについつい指を伸ばしてしまうクセをやめるのが難しいと感じるなら、 これは矢印キーが何もしないようするマッピングだ。矢印キーに指を伸ばすたび noremap く Right> く Nop> noremap く Left> く Nop> noremap く Down> く NOP> noremap <Up> く Nop> motions/disable-arrowkeys. vim 以下を vimrc ファイルに書いてみよう。 153

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

第 13 章検索 最初のマッチの先頭の文字に移動する。 次の g リ / / e く CR > がポイントだ。「 //e く CR> 」をモーションとして使うのだ。これはマッ チの先頭から末尾までをその範囲とする。マッチが 3 文字か (xml) 、 5 文字か (Xhtm1) はどうでもよい。 / / CR > モーションはマッチ全体を処理の対象とする。 でも、これには問題がある。キーを押すと、直前の検索が繰り返される。これに は //e く CR> オフセットが含まれる。これだと、次のマッチの先頭にジャンプするので はなく、キーにより、マッチの末尾に移動してしまう。先頭に移動するには、 / / く c としてオフセットなしで検索を繰り返さなければならない。 これはちょっとめんどうだ。よいことがあるとすれば、それはドットコマンドは直 前の変更、つまり、 / / e く CR > を繰り返してくれることだ。問題なのは、 / / 59 で次 のマッチの先頭にジャンプしなければならないところ。理想的なドットの公式はだ。 でも、 / / 5 でガマンしなければならない。以下の「マッチを表すテキストオプジェ クト」では、もっと理想的な解法について話をしよう。ただし、これにはプラグイン が必要だ。 この例には別の解法、があることに気がついているかもしれない。モーショ ンはマッチの先頭から、次の文字「 1 」までの範囲にジャンプをする。そして、「 xml 」 も「 Xhtm1 」もこの同じ文字で終わっているので、これはどちらの場合もうまくいくは すだ。 この例を考えたときには、筆者はこの方法を思いつかなかったが、これはなかなか 考えさせてくれるものだ。大文字の存在感は、小文字の存在感よりも大きい。狙いを 定めやすいし、それゆえにヒットもしやすい ( 163 ページの「スクラブルゲームみたい に考えよう」を参照 ) 。「 MixedCase 」という単語を操作する場合、次の大文字の直前 まで ( を 0 を狙うほうが、その直前にある小文字 ( ) を狙うよりも簡単だ。 マッチを表すテキストオブジェクト 理想的なドットの公式ではカーソル移動にキーストロークを 1 つ、変更を実行 するのにキーストロークを 1 つが要求される。 TIP84 ( 268 ページ ) の例では、 カーソルを移動するだけに 3 つのキーストロークを使っている ()/ く CR>)O これ は理想にはちょっと足りていない。マッチを扱うのに、これ以上に便利な組み込 みのモーションが Vim にはないというのは驚きだ。 Vim スクリプトを巧妙に使うことで、この機能を \/im に追加できる。筆者とし 270

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

第 11 章マクロ Oacros/mixed-lines. txt 1 . One 2 . Two 3 . three 4 . four すでに大文字になっている行もあるし、小文字のままの行もある。さっきのマクロ では一コマンドを使っていた。これは、カーソル位置にある文字の大文字 / 小文字を トグルする ( → :h ~ ◎◎ ) 。ーを使わずに、を使うようにマクロを変更してみよう。 はカーソル位置にある文字を大文字にするコマンドだ ( →山 v-UOO)0 マクロ内のキーコード この例では、わりとシンプルなシンプルなレジスタを使っている。でも、もっと 大規模なマクロを編集するときには、これほど話は簡単じゃないかもしれない。 たとえば、羽 P69 ( 225 ページ ) で記録したマクロを見てみよう、 5 。 ¯> : reg a ( ーーーレジスタ Registers "a gg/c1assAMOmouI く 80>kb く 80>kbdu1e RankA [j>GGoen& [ 何かおかしなところに気がついたかな。まず、がいくつかある。く Esc > を押し たかく c ー [ > を押したかに関係なく、 Vim は匡キーをこのように表現する。 もっとおかしいのはく 80 > kb という記号だ。これは巨キーを表している。 キーストロークを分析してみよう。このマクロを記録したとき、筆者は「 m 。 ul 」 と始めてしまった。ミスタイプに気づいて、〔自巨キーを何度か叩いて、続き の「 dule 」を入力したんだ。 現実的には、この操作は無意味だ。上記のキーストロークを再生すると、 Vim は 間違いとその修正も再生するだろう。最終的な結果は正しいものになる。でも、 レジスタは読みにくくなるし、その編集もめんどうくさくなる。 * 5. 訳注 : レジスタ a の値は、原書では「 Om 。 ul く 80 > kb く 80 > kbdule R に [j>GGoendA [ 」となっていましたが、マ クロ記録時、最初にファイルの先頭に移動して ( ) 、 class を検索している (/classkc+) ので、実際には 「 gg/c1ass*MOmou1 く 80>kb く 80>kbdu1e RankA [j>GGoendA[ 」などのようになります。これに従って、訳書では 出力を差し替えています。 234

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

TlP5 : 手作業での検索と置換く てフレーズができる。これは意味不明だ。 なんでこんな問題が起こるかといえば、「 content 」という単語には 2 つの意味がある からだ。 1 つは「 c 叩 y 」と似た意味で ( 発音は content) 、もう 1 つは「 happy 」と似た意 味になる ( こちらは content という発音 ) 。技術的には、同形異音異義語 (heteronym : 綴りは同じだが、発音と意味が違う ) となるが、まあ、これは実際には問題ではない。 重要なのは、検索と置換の 1 つ 1 つを注視しないといけない点だ。 「 content 」があるところを有無をいわさず「 copy 」で置き換えるのは無理だ。 1 つ 1 つ目で確認して、この「 content 」は置換すべきかという問いに「イエス」か「ノー」 の答えを出さなければいけない。置換コマンドでもこれは可能だ。その方法について は TIP89 ( 283 ページ ) で説明する。でも、とりあえずここでは、本章のテーマにあっ た別の方法を見ていくことにしよう。 めんどくさがりになろう : 入力しないで検索する ドットコマンドは、 Vim の機能を呼び出す 1 キーコマンドのなかで筆者の一番のお 気に入りといえるかもしれない。 2 番目に好きなのは第コマンドだ。このコマンドは、 その時点でそのカーソル位置にある単語を検索する ()h * ◎◎ ) 。 「 content 」という単語は、検索用のプロンプトを表示して、この単語のフルスペル ーを叩いてもよい。以下のような作 キーストロークバッフアの内容 業手順について考えてみよう。 単にカーソルをこの単語の上に移動させて第キ → /content を指定しても検索できる。 {start} éycopy く Esc> . We're waiting for content before the site can go 1ive. . If you are ontent with this, let's go ahead with it . . We ' 11 launch as soon as we have the content . . we're waiting for éonten before the site can go 1ive. . If you are 第 9 with this, let's go ahead with it. . We ' 11 launch as soon as we have the onten . We're waiting for onten before the site can go 1ive . . If you are vonten with this , let ' s go ahead with it. . We ' 11 launch as soon as we have the cop% 35

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

第 12 章パター ンとリテラルのマッチ 検索フィールドの終端文字 検索フィールドでは何かの文字を終端文字として扱わなければならないのはなぜ か、不思議に思うかもしれない。検索プロンプトのあとに入力されたものすべて を検索のマッチに含めるわけにはいかないのだろうか。 Vim の検索コマンドの挙 動は、何らかのフラグを検索フィールドの終端文字に付加することでカスタマイ ズできる。たとえば、「 /vim/e く CR> 」コマンドを実行すると、カーソルが移動する 先は、マッチしたものの先頭ではなく末尾となる。羽 P83 ( 266 ページ ) では、 この機能に我々が使われるのではなく、我々がこの機能を使いこなす方法を説明 しよう。 検索フィールドの終端文字のことを考慮する必要なしに、バターンを入力する方法 が 1 つある。 :promptfind コマンドを使うのだ ( → :h :promptfind ◎◎ ) 。た だし、使えるのは GVim だけだ。これにより、 [ 検索 ] などとタイトルのついた GUI のダイアログボックスが表示される。ここに前方検索 / 後方検索を行う文字 を入力できる。このとき、これらをエスケープする必要はない。ただし、 \ と改行 文字だけは問題が残る。 258

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

TlP67 : 連続する行に対して変更を繰り返すく モーションを使うことで安全装置も追加される。現在の行に文字「 . 」がなけれ ば、コマンドはエラーとなり、マクロの実行が中断される。このことをあとで活用 するので、ちょっと覚えておこう。 マクロを直列に実行する を押せば、いま記録したマクロを実行できる。これは次の処理を順次実行してい く。まず、現在の行にある最初の「 . 」までジャンプする。次に、これを「 ) 」に変更 する。そして、次の単語の先頭の文字を大文字にして、最後に次の行にカーソルを移 動する。 コマンドを 3 回実行しても仕事は完了するが、 3 朝のほうが簡単だ。 キーストロークバッフアの内容 {start} 1 ) 2 . 3 . 4 . 1 ) 2 ) 3 ) 4 ) Three Two One f our three t 0 One こで問題をもう 1 つ追加しよう。マクロを適用したい行の間に、以下のように なぜかコメントが入り込んでいるとする。 ac 「 os/broke -lines. tx 1 . one 2 . tWO / / break up the monotony 3 . three 4 . four 221 ( 表 1 1 ー 2 ) 。 このファイルに対して、同じマクロを実行しようとするとどうなるかを見てみよう

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

第 8 章モーションによるファイル内の移動 考察 これらのコマンドで必要になるのはいすれも、わすか 3 回のキーストロークだけだ。 そのうえ、無愛想な見た目とは裏腹に、その動作は優雅ときたもんだ。これらのコマ ンドは自己記述的であるといいたいくらいだ。そうなっているのは、これらのコマン ドが Vim のシンプルな構文に従っているからだ ( Vim の構文については 51 ページの TIP12 で述べた ) 。 TIP49 ( 159 ページ ) と TIP50 ( 164 ページ ) では、狙ったところにカーソルを移動させ るのに使えるテクニックを見た。まなで 1 文字検索をしているか、 /target く CR> で 複数の文字を検索しているかによらす、その使い方は同じだ。適切な移動先を見定め て発射するんだ ! うまくいけば、一発で移動先に到着する。この強力な移動手段を 使えば、わすかな労力で広い範囲を移動できるようになる。 次のレベルがテキストオプジェクトだ。コマンドと /pattern<CR コマンド は頭に跳び蹴りをかますようなもので、テキストオプジェクトは一動作で 2 つの目標 を撃破するシザースキックみたいなものだ ( 図 8 ー 1 ) 。 図 8 ー 1 Vim の強力な移動手段は致死レベルの正確性で目標に到達する 170