*usr_04.txt* For Vim version 6.0. Last change: 2001 Sep 03 日本語訳:2002/03/26 清水 俊彦 VIM USER MANUAL - by Bram Moolenaar ちょっとした変更 本章では、 文の修正方法や他の場所への移動方法の一部を述べます。 また、変更する範囲を選択する3つ(カーソルモーション、Visualモード、テキスト オブジェクト)の基本的な繰作方法についても説明します。 |04.1| オペレータとモーション |04.2| 文字列の変更 |04.3| 変更の繰り返し |04.4| Visualモード |04.5| 文の移動 |04.6| 文の複写 |04.7| クリップボードの利用 |04.8| テキストオブジェクト |04.9| 置換モード |04.10| 終わりに Next chapter: |usr_05.txt| 自分用の設定 Previous chapter: |usr_03.txt| 動いてみる Table of contents: |usr_toc.txt| ============================================================================== *04.1* オペレータとモーション 2章で学んだように、"x"は1文字削除コマンドです。カウンタを使って、"4x"とす れば4文字を削除します。 "dw"コマンドは単語を削除します。"w"が単語単位で移動するコマンドであることを 思い出してください。実際、"d"コマンドには何らかのモーション(移動)コマンドを 付けることができます。それによって、現在の場所から、モーションコマンドで移動 する場所までを削除するわけです。 例えば、"4w"コマンドはカーソルを4単語分、動かします。ということは、"d4w"は 4つの単語を削除するコマンドなわけです。 To err is human. To really foul up you need a computer. ~ ------------------> d4w To err is human. you need a computer. ~ vimではモーションコマンドでカーソルが動く範囲を削除します。というのは、モー ションで動いた先の(5つ目の)単語の先頭文字を削除したくはないだろうと判断す るためです。逆に"e"コマンドで単語の末尾までを範囲とした場合には、vimは移動 先の文字も含めたいだろう、と推測します。 To err is human. you need a computer. ~ --------> d2e To err is human. a computer. ~ カーソル下の文字を含めるかどうかは使ったコマンドによって異なります。リファ レンスマニュアルではその文字が含まれない場合には"exclusive"、含む場合には "inclusive"と呼んでいます。 "$"コマンドは行末まで移動します。"d$"コマンドはカーソル位置から、行末まで を削除します。これはinclusiveモーションなので行末の文字は削除処理の対象と なります。 To err is human. a computer. ~ ------------> d$ To err is human ~ オペレータ->モーションというパターンがあります。最初にオペレータコマンドを 入力します。例えば、"d"は削除オペレータです。次に"4l"や"w"といったモーション コマンドを入力します。この方法なら、動ける範囲のどんな文章でも操作ができます。 ============================================================================== *04.2* 文字列の変更 もう一つのオペレータは"C"、変更です。これも"d"オペレータと同じように動きま す。違うのは挿入モードに遷移する点です。例えば、"cw"は単語を変更します。 もっと厳密に言えば、単語を削除してから、挿入モードに遷移するのです。 To err is human ~ -------> c2wbe To be human ~ "c2wbe" には次の成分が含まれます。 c 変更オペレータ 2w 2単語進む(これは削除され、挿入モードに遷移する) be この文字列を挿入する 通常モードに戻る 勘のいい人なら、ちょっと変だと感じるかも知れません。"human"の前の空白が削除 されていないのです。"どんな問題に関しても単純で、明解で、間違った答えがある" という格言があります。この"cw"コマンドを使った例が正にそういった場合です。 "c"オペレータは"d"オペレータと全く同じように動きます。"cw"はその例外なので す。実際にはこれは"ce"と同じく、単語末までを変更します。ですから、単語の後ろ の空白は含まれないのです。これはかつてのviまでさかのぼる例外です。多くの人々 がこれを使っていますので、vimでも不本意ながら残してあるのです。 その他の変更コマンド -------------------- "dd"が行を削除したのと同じように、"cc"は行全体を変更します。ただし、インデン ト(行頭の空白類)は残しています。 "d$"が行末まで削除するのと同じように、"c$"は行末までを変更します。この機能は "d$"で行末まで削除した上で、"a"で挿入モードに入り、文を追加するのと同じです。 ショートカット -------------- 以下に述べるようなコマンドは、頻繁に使うため1文字コマンドとして用意してい ます。 x は dl (カーソル位置の文字を削除) の意味です。 X は dh (カーソルの左側の文字を削除) の意味です。 D は d$ (行末まで削除) の意味です。 C は c$ (行末まで変更) の意味です。 s は cl (1文字変更) の意味です。 S は cc (1行変更) の意味です。 カウンタの使い方 ---------------- "3dw"も"d3w"も3つの単語を削除するコマンドです。細かいことが気になる方のため に補足しておくと、最初の例(3dw)は1単語削除を3回実行し、2つ目の例(d3w)は 3単語の削除を1度だけ実行します。2つの違いは区別できません。やろうと思えば、 カウンタを2個所で指定できます。例えば、"3d2w"は2単語の削除を3回繰り返し、 結果として、6単語を削除します。 1文字の置き換え ---------------- "r"コマンドはオペレータではありません。1文字の入力を待ち、カーソル位置の文 字を入力された文字に置き換えます。同じことは"cl"とか"s"でもできますが、"r" の場合は最後にを押す必要はありません。 there is somerhing grong here ~ rT rt rw There is something wrong here ~ "r"にカウンタを使うとその数分の文字を指定の文字に置き換えます。 There is something wrong here ~ 5rx There is something xxxxx here ~ 文字を改行に置き換えたければ、"r"を使います。1文字を削除した上で、 改行を挿入します。ただし、改行に対してはカウンタは無効で、削除する文字にのみ 有効となります。"4r"は4文字削除し、1つの改行を挿入します。 ============================================================================== *04.3* 変更を繰り返す "."コマンドはvimで一番単純でありながら、一番パワフルなコマンドです。これは 直前の変更コマンドを繰り返します。HTMLファイルの編集中に、全てのタグを削 除するとしましょう。カーソルを最初の"<"に移動し、"df>"コマンドでを削除し ます。次にの"<"を探し、それを削除するのに"."コマンドを使います。"."コ マンドは直前の変更コマンド(この場合なら"df>")を実行します。他のタグの削除し たければ、カーソルを"<"の上に置いて、"."を打てばよいのです。 To generate a table of contents ~ f< find first < ---> df> delete to > --> f< find next < ---------> . repeat df> ---> f< find next < -------------> . repeat df> --> "."コマンドは"u"(アンドゥ)、CTRL-R(リドゥ)、先頭が":"のコマンド以外は全部で 使えます。 例2:文中に何度も出てくる単語"four"を"five"に変更したいとします。 次に示した手順でそれができます。 /four 最初の"four"を探す。 cwfive その単語を"five"に変更する。 n 次の"four"を探す . 直前の変更を繰り返す。 n 次の"four"を探す . 直前の変更を繰り返す。 以下同文。 ============================================================================== *04.4* visualモード 単純なパターンであれば、オペレータ=モーション方式は何の問題もなく動きます。 しかしどのコマンドを使えば目的の範囲を選択できるかは、そう簡単に決められる ことではありません。こんな時はvisualモードです。 visualモードに入るには、"v"を押します。ここでカーソルを動かして対象としたい 領域を選択します。選択中はその領域がハイライト表示になります。最後にオペ レータコマンドを入力します。 例えば、単語の途中から、次の単語の途中までを削除するには、次のようにします。 This is an examination sample of visual mode ~ ----------> velllld This is an example of visual mode ~ この方法だと、"l"を何回押せば目的の場所まで移動できるか?などと考える必要が 全くありません。その場で削除の範囲を確認してから、"d"を押すことができるので す。 ハイライト表示になっている範囲に対して何もしたくなければ、キーを押しま す。すると何もせずにvisualモードから通常モードに戻ります。 行を選択 -------- 行全体を対象としたければ、"V"コマンドでvisualモードを開始します。するといき なり行末までがハイライト表示となります。ここで左右に移動しても何も起こりま せん。上下に移動するとその行全体が選択範囲に入ります。 例えば、"Vjj"で3行を選択してみましょう。 +------------------------+ | text more text | >> | more text more text | | selected lines >> | text text text | | Vjj >> | text more | V | more text more | +------------------------+ ブロック選択 ------------ 四角いブロック(矩形)の処理を行いたければ、CTRL-Vでvisualモードを開始します。 このモードは表を編集するような場合に非常に便利です。 name Q1 Q2 Q3 pierre 123 455 234 john 0 90 39 steve 392 63 334 例えば、上図の中央のQ2(第2四半期)の列を削除するには、カーソルを"Q1"と"Q2" の間に置いてCTRL-Vを押し、ブロック選択のvisualモードに入ります。次にカーソ ルを"3j"で3行下に動かし、"w"を押して1単語分右に移動します。この状態では、 最後の列の先頭を範囲に含んでいますので、"h"でそれをはずします。これでOK なので"d"を押します。すると、選択してあった範囲は削除されます。 反対側に移動 ------------ visualモードで選択中に範囲の反対側(始点)にカーソルを動かしたい時は、"o"を押 します(oは"other end"の意味です)。カーソルは始点に動き、始点を自由に変更 できるようになります。もう一度"o"を押すと、元の終点側に戻ります。 ブロック指向選択時は4隅が存在します。"o"は始点と終点を斜めに動くだけです。 "O"を使うと、同じ行の反対側に移動します。 Note: visualモードの"o"と"O"は通常モードの場合とかけ離れています。これは通常 モードではカーソル行の上や下に空行を作る機能です。 ============================================================================== *04.5* 文を移動する "d"や"x"などを使って何かを削除しても、その内容はvimが保持しています。"p"コ マンドを使えば、この内容をペースト(vimではこれをプットと呼びます)すること ができます。 どのように動くかを見てみましょう。まず、削除したい行にカーソルを移動し、"dd" コマンドでその行全体を削除します。次にカーソルをプットしたい場所に動かして "p"を押します。先ほど削除した行の内容がカーソルの下の行に挿入されます。 最初 削除後 プット後 a line a line a line line 2 dd line 3 p line 3 line 3 line 2 行全体を削除した時にその内容を保存していたので、"p"コマンドを使った時にその 内容がカーソルの下の行にプットされたわけです。行の一部(単語など)を削除した 場合は、"p"コマンドはカーソルの直後にそれをプットします。 Some more boring try text to out commands. ~ ----> dw Some more boring text to out commands. ~ --------> welp Some more boring text to try out commands. ~ その他のプット -------------- "P"コマンドは"p"と同じですが、カーソルの前にプットします。直前に"dd"コマン ドで削除をしていれば、"P"はカーソルの上にその行をプットします。"dw"で単語を 削除した場合は、カーソルの直前にプットします。 プットは何回でも好きなだけ繰り返しできます。同じ文が毎回使われます。 "p"も"P"もカウンタが指定できます。指定しただけ、プット処理を繰り返します。 ですから、"dd"をして、"3p"とすると、削除した行のコピーが3つプットされます。 2文字の入れ換え ---------------- 入力している時には、指が頭を追い越してしまう場合がしばしばあります。その結果 は、"the"が"teh"になるといった類のタイポ(打ち間違い)です。vimはこの種の間違 いを簡単に修正できます。カーソルを"teh"の"e"の上に置いて、"xp"と打てばよいの です。これは、"x"で"e"の文字を削除してレジスタに入れ、"p"でカーソル("h"の上 にある)の後ろにレジスタ内容をプットするのです。 teh th the~ x p ============================================================================== *04.6* テキストの複写 文字列をある場所から別の場所に複写する時はどうしましょう。最初に削除して、 "u"でそれを取り消し、"p"で別の場所にプットするのもひとつの方法です。でももっ と簡単な方法があります。ヤンク(yank)です。"y"オペレータは文字列をレジスタに コピーします。そして"p"を使ってプットするのです。 コピーのことをvimではヤンクと呼びます。上で説明した変更オペレータの"c"と同 じように"y"オペレータも使えます。ヤンクの"y"ですので、キー操作も覚えやすい でしょう。 "y"はオペレータなので、"yw"とすれば単語のヤンクができます。カウンタも当然 指定可能です。2単語をヤンクするには、"y2w"とします。例を示しましょう。 let sqr = LongVariable * ~ --------------> y2w let sqr = LongVariable * ~ p let sqr = LongVariable * LongVariable ~ "yw"は単語の後の空白まで含みますので気をつけてください。それが嫌ならば、"ye" っ使ってください。 JP: 上の例はあまり良くないですが、間違ってはいません。y2wでは実際には2単語 JP: はヤンクされず、前後に空白文示を付けた" LongVariable "という文字列がヤン JP: クされます。|04.2|をよく読んでみてください。 "yy"コマンドは"dd"が行削除するのと同様に、行全体をヤンクします。ただ、"D"は 行末まで削除するのに対して、"Y"は"yy"と同じ動きになります。この点は気をつけ てください。行末までヤンクしたい時には"y$"を使ってください。 a text line yy a text line a text line line 2 line 2 p line 2 last line last line a text line last line ============================================================================== *04.7* クリップボードの利用 GUIバージョンのvim(gvim)を使っている場合は、[編集]メニューに[コピー]コマンド があります。最初にvisualモードで文字列を選択し、次にこの [編集]-[コピー]を使 います。 選択した文字列はクリップボードにコピーされます。これを他のプログラムにペースト できます。もちろんvim自身でも使えます。 他のアプリケーションでクリップボードに文字列をコピーしておけば、vimで[編集]- [貼り付け]コマンドでそれをペーストできます。これは通常モードでも挿入モードで も動きます。visualモードでは選択中の文字列はペーストされる文字列に置き換わり ます。 メニューの[編集]-[切り取り]はクリップボードにプットする前に文字列を削除しま す。[コピー]、[切り取り]、[貼り付け]の3つはポップアップメニューでも(ポップ アップメニューが出る時だけですよ、当り前ですが)使えます。お使いのvimにツール バーがあれば、そこにも同じ項目があるはずです。 GUIを使っていない場合やメニューを使うのが嫌いな場合は他の方法を使うしかあり ません。普通の"y"や"p"コマンドを使う前に"* (ダブルクオート+アステリスク)を 指定するのです。行を丸ごとクリップボードに入れるには次のようにします。 > "*yy クリップボードを経由でプットするのは、こうです。 > "*p この機能はクリップボードをサポートしたvimでのみ動きます。クリップボードにつ いての詳細は|09.3|章 と |clipboard|をご覧ください。 ============================================================================== *04.8* テキストオブジェクト 単語の真ん中にカーソルがあり、その単語を削除したい場合、カーソルを戻してから "dw"をすることになります。でももっと簡単な方法があります。 "daw"です。 this is some example text. ~ daw this is some text. ~ "daw"の"d"は削除オペレータです。"aw"はテキストオブジェクトです。("aw"は "a word"の意味です。ですから、"daw"は"delete a word"という意味です。) テキストオブジェクトの利用はvimでの第3の変更方法です。オペレータ+モーション 方式とvisualモードは既に述べました。そこにオペレータ+テキストオブジェクト方 式を追加します。 これはオペレータ+モーション方式と非常に似ています。ただオペレータ+モーション 方式では移動コマンドの前と後のカーソル位置がオペレータの範囲となっていたのに 対し、テキストオブジェクトではオブジェクト全体を対象とします。必ずしもカー ソル位置のオブジェクトというわけではありませんが。 文全体を変更するのは"cis"です。次の文を使いましょう。 Hello there. aaaaa Just ~ some text. ~ 2行目の先頭に移動し、"cis"を実行します。 Hello there. Just ~ some text. ~ カーソルは1行目の空白の間にあります。ここで新たな文 "Another line."を打ち ます。 Hello there. Another line. Just ~ some text. ~ "cis"は変更オペレータの"c"と、テキストオブジェクトの"is"に分けられます。"is" は"Inner Sentence"の意味です。"as"(a sentence)オブジェクトもよく似ています。 違うのは"as"では文の後の空白類を含むのに対して、"is"では含みません。 文を削除する時に、前後の空白も同時に消したければ、"das"を使います。文の修正す るため、空白を残しておいて欲しい場合は、"cis"を使えばよいでしょう。 テキストオブジェクトはvisualモードでも使えます。選択範囲の中にテキストオブ ジェクトを追加することができます。この場合でもvisualモードは終わりませんか ら、何度でもテキストオブジェクトを使えます。例えば"v"でvisualモードを開始し、 "as"で文を選択した後に、"as"を繰り返してたくさんの文を追加できます。最後に オペレータを使って、選択した文を対象として、何らかの処理を行います。 テキストオブジェクトの機能一覧は |text-objects| をご覧ください。 ============================================================================== *04.9* 置き換えモード "R"コマンドを使うと置き換えモードに入ります。このモードでは、カーソル位置の 文字が入力した文字に置き換わります。このモードはを押すまで続きます。 次の例では、"text"の1つ目の"t"で置き換えモードを開始します。 This is text. ~ Rinteresting. This is interesting. ~ 上の例では末尾の5文字を別の12文字に置き換えています。"R"コマンドは置き換 えるべき文字がなくなると自動的に行末をずらします。ただし改行した次の行には影 響を与えません。 キーで挿入モードと置き換えモードを切り換えることができます。 キーで修正をしようとすると、元の文字が復元されます。直前に打った文字を アンドゥした時のような動きとなります。 ============================================================================== *04.10* 最後に オペレータ、移動コマンド、テキストオブジェクトを組み合せると、とてつもない数 のコンビネーションを生み出すことができます。既に説明したように、N個のオペ レータとM個の移動コマンドを使えば、N*M個のコマンドが作れるのです! オペレータの一覧を探すのなら |operator| をご覧ください。 テキストの一部を削除するには数多くの方法があります。ほんの一部ですが、よく使 うものを挙げておきましょう。 x カーソル位置の文字を削除("dl"と同じ) X カーソル位置の直前の文字を削除("dh"と同じ) D カーソル位置から行末までを削除("d$"と同じ) dw カーソル位置から次の単語の先頭までを削除 db カーソル位置から直前の単語の先頭までを削除 diw カーソル位置の単語を削除(文の後の空白は除く) daw カーソル位置の単語を削除(文の後の空白を含む) dG ファイルの末尾まで削除 dgg ファイルの先頭まで削除 "d"の代わりに"c"を使うと削除ではなく、変更コマンドとなります。"y"にすれば、 ヤンクコマンドです。他のオペレータも同様です。 他の章では触れる機会のない変更コマンドをいくつか挙げておきます。 ~ カーソル位置の大文字/小文字を変更し、カーソルを次に進めます。 これは('tildeop'をセットしない限り)オペレータではありません。 つまりモーションコマンドを使うことはできません。visualモード で選択した文字列については全体が対象となります。 I (大文字の"i"です)カーソルを行の最初の非空白文字に移動して 挿入モードを開始します。 A 行末にカーソルを動かして、挿入モードを開始します。 ============================================================================== Next chapter: |usr_05.txt| 自分用の設定 Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl: