=============================================================================== = V I M 教 本 (チュートリアル) へ よ う こ そ - Version 1.7 = =============================================================================== = 第 2 章 = =============================================================================== Hic Sunt Dracones (危険な領域): もしこれがあなたにとって vim に初めて 触れる機会であり、入門の章を利用したいのであれば、どうか :q! を タイプして終了し、第 1 章のために vimtutor を実行してください。 この章を完了するのに必要な時間は、覚えたコマンドを試すのにどれだけ時間を 使うのかにもよりますが、およそ 8-10 分です。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lesson 2.1.1: テキストオブジェクトの習得 ** テキストオブジェクトを使って論理テキストブロックを正確に操作します ** 1. 単語の操作を練習しましょう: - カーソルを下の(---> と示された)行の何れかの単語の上に乗せましょう - diw とタイプして単語を囲むスペースを含まずに消しましょう (INNER) - daw とタイプして単語に続くスペースを合わせて消しましょう (A WORD) - 他のオペレータも試しましょう: ciw (変更), yiw (ヤンク), gqiw (フォーマット) ---> 練習用テキスト: "Vim's", (text_object), and 'powerful' words here. 2. 括弧で囲まれた内容を操作してみましょう: - カーソルを下の(---> と示された)行の、いずれかの () {} [] <> のペアの 内側に合わせましょう - di( または dib をタイプしましょう (ブラケットの内側が消えます) - da( または dab をタイプしましょう (ブラケットごと消えます) - クォートには i"/a" で、HTML/XMLのタグには it/at で同じことを試してみ ましょう ---> テストケース: {curly}, [square], , and "quoted" items. 3. 段落と文を操作してみましょう: - 段落の内側を消すには dip を使います (カーソルは段落のどこでもOK) - 段落全体を選択するには vap を使います - 文を消す das を試してみましょう (ここで言う文とは .!? という区切り文字の間のことです) 4. 高度に組み合わせてみましょう: - ciwnew - 現在の単語を "new" に変更します - ciw"-" - 現在の単語をクォートで囲みます - gUit - HTMLタグの内容を大文字に書き換えます - va"p - クォートされたテキストを選択し、上書きペーストします ---> 最後の訓練: (Modify "this" text) by [applying {various} operations]< ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lesson 2.1.2: 名前付きレジスタ ** ヤンク(コピー)した 2 つの単語を同時に保存し、それらをペーストします ** 1. 以下の ---> と示された行にカーソルを移動しましょう。 2. 単語 'Edward' 内のどこかに移動し "ayiw とタイプしましょう。 覚え方: into register(") named (a) (y)ank (i)nner (w)ord {訳: レジスタ(")へ (a)という名前の (y)ヤンク (i)内部 (w)単語} 3. 単語 'cookie' に進んで (fk や 3fc や $2b や /co)、 "byiw とタイプしましょう。 4. 単語 'Vince' 内のどこかに移動し ciwa とタイプしましょう。 覚え方: (c)hange (i)nner (w)ord with named (a) {訳: (c)変更する (i)内部 (w)単語 <(r)レジスタの内容>で (a)という名前の} 5. 単語 'cake' 内のどこかに移動し ciwb とタイプしましょう。 ---> a) Edward will henceforth be in charge of the cookie rations b) In this capacity, Vince will have sole cake discretionary powers NOTE: レジスタへの削除も動作します。すなわち "sdiw はカーソル位置の単語を削除 し、レジスタ s に格納します。 REFERENCE: レジスタ :h registers 名前付きレジスタ :h quotea カーソル移動 :h motion.txt /inner CTRL-R :h insert /CTRL-R ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lesson 2.1.3: EXPRESSION レジスタ ** 計算の結果をその場で挿入します ** 1. 以下の ---> と示された行にカーソルを移動しましょう。 2. 行内の数字のどこかにカーソルを移動しましょう。 3. 次のようにタイプしましょう。 ciw=60*60*24 4. 次の行で挿入モードに入り、次の操作で今日の日付を挿入しましょう。 =system('date') NOTE: すべてのシステムへの呼び出しは OS 依存です。例えば Windows では system('date /t') または :r!date /t を使います。 ---> 1 日の正確な秒数を忘れてしまいました。 84600 でしょうか? 今日の日付は: NOTE: 同じことは :pu=system('date') あるいは、より少ないキーストロークで :r!date でも達成できます。 REFERENCE: Expression レジスタ :h quote= ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lesson 2.1.4: 番号付きレジスタ ** yy と dd を押してレジスタに対する効果を目撃します ** 1. 以下の ---> と示された行にカーソルを移動しましょう。 2. 0 番目の行をヤンクし、それから :reg でレジスタを検査しましょう。 3. "cdd で行 0 を削除し、それからレジスタを検査しましょう。 (行 0 はどこにあると思いますか?) 4. 残りの行もそれぞれ続けて削除して、都度 :reg で検査しましょう。 NOTE: 新しい行全体削除が追加されると、古い行全体削除はリストの下に移動すること に気づいたでしょう。 5. 次に以下のレジスタを順にペースト(p)しましょう: c, 7, 4, 8, 2。例 "7p ---> 0. This 9. wobble 8. secret 7. is 6. on 5. axis 4. a 3. war 2. message 1. tribute NOTE: 行全体削除(dd)は、行全体ヤンクや小さな移動による削除に比べると長い期間 番号付きレジスタに残ります。 REFERENCE: 番号付きレジスタ :h quote0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lesson 2.1.5: 特殊レジスタ ** 高度な編集にはシステムクリップボードとブラックホールレジスタを使います ** Note: クリップボードを使用するには、Linux システムでは X11/Wayland ライブラリ と、 "+clipboard" でビルドされた Vim (通常は Huge ビルド) が必要です。 ":version" と "echo has('clipboard_working')" で確認してください。 1. クリップボードレジスタ + 及び * : - "+y - システムクリップボードにヤンクします (例: "+yy は現在行) - "+p - システムクリップボードからペーストします - "* は X11 のプライマリセレクション(中クリック)で、 "+ はクリップボードで す。 ---> 試そう: "+yy し他のアプリケーションで Ctrl-V または Cmd+V でペーストしま しょう 2. テキストを捨てるブラックホールレジスタ _ : - "_daw - レジスタに保存せずに単語を消します - デフォルトの " レジスタを上書きしたくない時に便利です - これは前のレッスンで紹介した "a Word" テキストオブジェクトを使っているこ とに注意してください - "_dd - 保存せずに行を削除します - "_dap - 保存せずに段落を削除します - カウントと組み合わせることができます: 3"_dw ---> 練習: 何かの単語の上で "_diw でヤンク履歴に影響を与えずに消しましょう 3. ビジュアル選択と組み合わせることができます: - V でテキストを選択してから "+y でヤンクします - 挿入モードでクリップボードからペーストするには: + - 他のアプリケーションを開いて、クリップボードからペーストしてみましょう 4. 覚えてください: - クリップボードレジスタは異なるVimインスタンスを越えて働きます - クリップボードレジスタは常に働くとは限りません - ブラックホールレジスタは不意にレジスタを上書きすることを防ぎます - デフォルトの " レジスタは通常のヤンク/ペーストに利用できます - 名前付きレジスタ (a-z) は個々のVimセッション毎に独立して使えます 5. クリップボードのトラブルシューティング: - :echo has('clipboard_working') で Vim がクリップボードをサポートしている かを確認できます - 1 は利用可能を、0 はコンパイルされていないことを意味しています - Linuxでは vim-gtk や vim-x11 パッケージが必要になるかもしれません (:version の出力をチェックしてみてください) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lesson 2.1.6: マークの美しさ ** コードモンキーの算術の回避 ** NOTE: コーディングの際の共通の難問は大きなコードの塊を動かすことです。 以下の技術は、操作に関連付けられた行数の計算、例えば "a147d や :945,1091d a や、さらに悪いことにまず i=1091-945 を 使うようなことを避けることを助けます。 1. 以下の ---> と示された行にカーソルを移動しましょう。 2. 関数の最初の行に移動し ma でマークしましょう。 NOTE: 行内の正確な位置は重要ではありません! 3. 行の最後に移動しそれからコードブロックの末尾に移動しましょう。 $% 4. ブロックをレジスタ a に削除しましょう。 "ad'a 覚え方: into register(") named (a) put the (d)eletion from the cursor to the LINE containing mark(') (a) {訳: レジスタ(")へ格納 (a)という名前の (d)削除を カーソルからマーク(')(a) を含む行まで} 5. ブロックを BBB と CCC の間にペーストしましょう。 "ap NOTE: 慣れるまで何度もこの操作を練習しましょう。 ma$%"ad'a ---> AAA function itGotRealBigRealFast() { if ( somethingIsTrue ) { doIt() } // 私たちの関数の分類法が変更され、現在の位置では // アルファベットの意味がなくなりました // 何百行ものコードを想像してください // 素朴に、最初と最後に移動して、各行番号を記録または記憶する // こともできます } BBB CCC NOTE: マークとレジスタは名前空間を共有しません。そのため、レジスタ a は完全に マーク a とは独立しています。これはレジスタとマクロについては当てはまり ません。 REFERENCE: マーク :h marks マークによる移動 :h mark-motions (' と ` の違いについて) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lesson 2.1 要約 1. テキストオブジェクトは精密な編集を提供します: - iw/aw - inner/around word {訳: 単語の内側/周囲} - i[/a[ - inner/around bracket {訳: 角カッコ内側/周囲} - i"/a" - inner/around quotes {訳: クォートの内側/周囲} - it/at - inner/around tag {訳: タグの内側/周囲} - ip/ap - inner/around paragraph {訳: 段落の内側/周囲} - is/as - inner/around sentence {訳: 文の内側/周囲} 2. テキストを格納 (ヤンク、削除) したり、取得 (ペースト) するレジスタが 全部で 26 個 (a-z) あります。 3. 単語全体をヤンクするには単語内のどこかで: yiw 4. 単語全体を変更するには単語内のどこかで: ciw 5. 挿入モードで直接レジスタからテキストを挿入するには: a 6. 単純な算術演算の結果を挿入するには: 挿入モードで =60*60 7. システムコールの結果を挿入するには: 挿入モードで =system('ls -1') 8. レジスタを検査するには :reg 9. 行全体削除の最終宛先を学びました。dd は番号付きレジスタへ、すなわち レジスタ 1 - 9 に降順になります。行全体削除は他の操作より長く番号付き レジスタに保持されることを理解しました 10. 番号付きレジスタにおけるすべてのヤンクの最終宛先と、それらはどれほど儚い ものなのかを学びました 11. コマンドモードでマークを設定するには m[a-zA-Z0-9] 12. マークへ行単位で移動するには ' 13. 特殊レジスタ: - "+/"* - システムのクリップボード (OS依存) - "_ - ブラックホール (消したりヤンクしたりしたテキストを捨てる) - "= - 式レジスタ - "- - 小さい削除レジスタ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ これにて Vim のチュートリアルの第 2 章を終わります。これは作業中です。 この章は Paul D. Parker と Christian Brabandt によって書かれました。 日本語訳 vim-jpチーム ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~