vim-jp / vimdoc-ja / usr_04

usr_04 - Vim日本語ドキュメント

メインヘルプファイルに戻る English | 日本語 | 編集
usr_04.txt    For Vim バージョン 9.1.  Last change: 2021 Feb 22

                     VIM USER MANUAL - by Bram Moolenaar

                                  簡単な編集


本章では、テキストの修正方法や他の場所への移動方法をいくつか説明します。テキス
トを変更するための三つの基本操作方法 (オペレータとモーション、ビジュアルモー
ド、テキストオブジェクト) についても説明します。

04.1  オペレータとモーション
04.2  テキストの変更
04.3  変更の繰り返し
04.4  ビジュアルモード
04.5  テキストの移動
04.6  テキストのコピー
04.7  クリップボード
04.8  テキストオブジェクト
04.9  置換モード
04.10 終わりに

次章: usr_05.txt  設定の変更
前章: usr_03.txt  カーソルの移動
目次: usr_toc.txt

==============================================================================
04.1  オペレータとモーション

二章で学んだように、"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. ~

モーションコマンドでカーソルが移動した場所までが削除されます。移動先の単語の先
頭文字が削除されないのは、そのほうが便利だからです。しかし、"e" コマンドで単語
の末尾まで移動した場合は、末尾の文字も削除したほうが便利ですよね:

        To err is human. you need a computer. ~
                        -------->
                           d2e

        To err is human. a computer. ~

カーソル下の文字が範囲に含まれるかどうかは、移動に使ったコマンドによって異なり
ます。リファレンスマニュアルでは、移動先の文字が含まれないことを "exclusive"
(排他的)、含まれることを "inclusive" (包括的) と呼んでいます。

"$" コマンドで行末まで移動できます。"d$" コマンドならカーソル位置から行末まで
が削除されます。これは包括的モーションなので行末の文字は削除処理の対象となりま
す。

        To err is human. a computer. ~
                       ------------>
                            d$

        To err is human ~

オペレータとモーションを組み合わせるときは、最初にオペレータコマンドを入力しま
す。例えば、"d" は削除オペレータです。次に "4l" や "w" といったモーションコマ
ンドを入力します。この方法ならテキストのどんな範囲でも操作できます。

==============================================================================
04.2  テキストの変更

"c" は「変更」オペレータです。"d" オペレータと同じように使えますが、挿入モード
に入る点が違います。例えば、"cw" は単語を変更します。正確に言うと、単語を削除
してから挿入モードに入ります。

        To err is human ~
           ------->
             c2wbe<Esc>

        To be human ~

"c2wbe<Esc>" は次の部分から成ります:

        c       変更オペレータ
        2w      2 単語進む (単語が削除され、挿入モードに入る)
        be      この文字列を挿入する
        <Esc>   ノーマルモードに戻る

ちょっと変だと感じるかも知れません。"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" コマンドはオペレータではありません。文字が入力されるまで待機し、入力された
文字で、カーソル下の文字を置き換えます。"cl" や "s" でも同じ事ができますが、
"r" の場合は <Esc> を押して挿入モードを終了する必要はありません。

        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<Enter>" を使います。1 文字削除され、改行が挿
入されます。ただし、改行に対してカウンタは適用されません。削除する文字にのみ適
用されます。"4r<Enter>" は 4 文字削除し、1 つの改行を挿入します。

==============================================================================
04.3  変更の繰り返し

"." コマンドはもっともシンプルでありながらパワフルなコマンドの一つです。これは
直前の変更コマンドを繰り返します。例えば、HTMLファイルの編集中に、全ての<B>
グを削除するとしましょう。カーソルを最初の "<" に移動し、"df>" コマンドで<B>
削除します。次に</B>の "<" を探し、それを削除するのに "." コマンドを使いま
す。"." コマンドは直前の変更コマンド(この場合なら "df>")を実行します。他のタグ
の削除がしたければ、カーソルを "<" の上に置いて、"." を打てばよいのです。

                              To <B>generate</B> a table of <B>contents ~
        f<   最初の < を検索  --->
        df>  > まで削除          -->
        f<   次の < を検索         --------->
        .    df> を繰り返し                 --->
        f<   次の < を検索                     ------------->
        .    df> を繰り返し                                 -->

"." コマンドではすべての変更を繰り返すことができますが、"u" (undo)、CTRL-R
(redo)、先頭が ":" のコマンド、は繰り返せません。

例2: 文中に何度も出てくる単語 "four" を "five" に変更したいとします。次の手順
     で変更できます。

        /four<Enter>    最初の "four" を探す。
        cwfive<Esc>     その単語を "five" に変更する。
        n               次の "four" を探す
        .               直前の "five" への変更を繰り返す。
        n               次の "four" を探す
        .               直前の変更を繰り返す。
                        以下繰り返し。

==============================================================================
04.4  ビジュアルモード

単純なものならオペレータ-モーション方式で簡単に変更できますが、変更する範囲に
適したコマンドを選択するのが難しいこともあります。そんなときはビジュアルモード
を使ってください。

ビジュアルモードに入るには "v" を押します。そしてカーソルを動かして変更したい
領域を選択します。選択中はその領域が強調表示されます。最後にオペレータコマンド
を入力します。
例えば、単語の途中から次の単語の途中までを削除するには、次のようにします。

                This is an examination sample of visual mode ~
                               ---------->
                                 velllld

                This is an example of visual mode ~

この方法なら、"l" を何回押せば目的の場所まで移動できるか? などと考える必要が
全くありません。削除する範囲を確認してから "d" を押すことができます。

選択した範囲を変更したくなくなった場合は <Esc> キーを押してください。ビジュア
ルモードが終了し、何も変更されません。


行選択

行全体を選択するには "V" コマンドでビジュアルモードを開始します。行全体が選択
されます。左右に移動しても選択範囲は変更されません。上下に移動すると、選択範囲
が行単位で拡張されます。
例えば、"Vjj" で 3 行を選択してみましょう。

                          +------------------------+
                          | text more text         |
                       >> | more text more text    | |
          選択された行 >> | text text text         | | Vjj
                       >> | text more              | V
                          | more text more         |
                          +------------------------+


ブロック選択

四角いブロック (矩形、くけい) の範囲を変更したい場合は CTRL-V でビジュアルモー
ドを開始します。このモードは表を編集するような場合に非常に便利です。

                name            Q1      Q2      Q3
                pierre          123     455     234
                john            0       90      39
                steve           392     63      334

例えば、中央の Q2 の列を削除するには、カーソルを "Q2" の "Q" に移動します。
CTRL-V を押し、矩形ビジュアルモードに入ります。次にカーソルを "3j" で 3 行下に
動かし、"w" を押して 1 単語分右に移動します。この状態では、最後の列の先頭が範
囲に含まれているので、"h" でそれをはずします。"d" を押すと、選択範囲が削除され
ます。


反対側に移動

ビジュアルモードで選択中に、選択範囲の反対側(始点)にカーソルを動かしたいとき
は、"o" を押します (o は "other end" の意味です)。カーソルは始点に動き、始点
を自由に変更できるようになります。もう一度 "o" を押すと、元の終点側に戻ります。

矩形選択のときは 4 隅が存在します。"o" は始点と終点を斜めに動くだけです。同じ
行の反対側に移動するには "O" を使ってください。

Note: ビジュアルモードの "o" と "O" はノーマルモードのコマンドとはまったく違う
動作なので注意してください。ノーマルモードではカーソル行の上や下に空行を作る機
能です。

==============================================================================
04.5  テキストの移動

"d" や "x" または別のコマンドで何かを削除すると、そのテキストは記録されます。"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" コマ
ンドで行を削除したなら、カーソルの上にその行がプットされます。"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" キーを覚えやすくするた
めにコピー操作をヤンク (yank) と読んでいます。

"y" はオペレータなので、"yw" とすれば単語をヤンクできます。カウンタも当然指定
できます。2 単語をヤンクするには、"y2w" とします。例を示しましょう。

        let sqr = LongVariable * ~
                 -------------->
                       y2w

        let sqr = LongVariable * ~
                               p

        let sqr = LongVariable * LongVariable ~

"yw" は単語の後の空白まで含まれるので注意してください。それが嫌なら、"ye" を
使ってください。

"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) を使っている場合は、[編集] メニューに [コピー] コマンドがあ
ります。ビジュアルモードで文字列を選択してから、メニューの [編集]-[コピー] を
使ってください。選択文字列がクリップボードにコピーされるので、それを他のプログ
ラムにペーストできます。もちろん Vim 自身でも使えます。

他のアプリケーションでクリップボードに文字列をコピーすれば、Vim の [編集]-[貼
り付け] メニューでそれをペーストできます。これはノーマルモードでも挿入モードで
も機能します。ビジュアルモードでは、選択文字列がペーストされた文字列に置換され
ます。

メニューの [編集]-[切り取り] はクリップボードにプットする前に文字列が削除され
ます。[コピー]、[切り取り]、[貼り付け] の 3 つはポップアップメニューでも使えま
す (ポップアップメニューが利用可能な場合のみ)。ツールバーが利用可能なら、そこ
にも同じ項目があるはずです。

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" という意味になります。正確に
は、単語の後の空白も削除されます (単語が行末にある場合は、行末までのすべての空
白が削除されます)。

テキストオブジェクトは基本操作方法の一つです。オペレータ-モーション方式とビジュ
アルモードは既に述べました。そこにオペレータ + テキストオブジェクト方式が加わ
ります。
これはオペレータ-モーション方式と非常に似ていますが、オペレータ-モーション方式
では移動コマンドの前と後のカーソル位置がオペレータの範囲となっていたのに対し、
テキストオブジェクトではオブジェクト全体を対象とします。オブジェクトのどこに
カーソルがあっても構いません。

文全体を変更するのは "cis" です。次の文を使いましょう:

        Hello there.  This ~
        is an example.  Just ~
        some text. ~

2 行目の先頭、"is an" の上に移動し、"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" を使えばよいでしょう。

テキストオブジェクトはビジュアルモードでも使えます。テキストオブジェクトを選択
範囲に含めることができます。テキストオブジェクトを指定してもビジュアルモードは
終了しないので、何度でもテキストオブジェクトを使えます。例えば、"v" でビジュア
ルモードを開始して、"as" で文を選択した後に、"as" を繰り返してたくさんの文を追
加できます。最後にオペレータを使って、選択した文を対象として、何らかの処理を行
います。

テキストオブジェクトの機能一覧は text-objects を参照してください。

==============================================================================
04.9  置換モード

"R" コマンドを使うと置換モードに入ります。このモードでは、入力した文字が、カー
ソル下の文字を置き換えます。このモードは <Esc> を押すまで続きます。
例えば、"text" の 1 つ目の "t" で置換モードを開始したとします:

        This is text. ~
                Rinteresting.<Esc>

        This is interesting. ~

末尾の 5 文字が 12 文字の他の文字に置き換えられています。"R" コマンドは置換す
る文字がなくなると自動的に行末をずらします。次の行へ移動したりはしません。

<Insert> キーで挿入モードと置換モードを切り換えることができます。

<BS> キーで修正をしようとすると、元の文字が復元されます。直前に打った文字を
undo するような働きをします。

==============================================================================
04.10 終わりに

オペレータ、移動コマンド、テキストオブジェクトを組み合せると、とてつもない数
のコンビネーションを生み出すことができます。N 個のオペレータと M 個の移動コマ
ンドを組み合わせれば N * M 個のコマンドが作れるのです!

オペレータの一覧は operator を参照してください。

テキストの一部を削除するには数多くの方法があります。ほんの一部ですが、一般的な
ものを挙げておきましょう。

x       カーソル位置の文字を削除 ("dl" と同じ)
X       カーソル位置の直前の文字を削除 ("dh" と同じ)
D       カーソル位置から行末までを削除 ("d$" と同じ)
dw      カーソル位置から次の単語の先頭までを削除
db      カーソル位置から直前の単語の先頭までを削除
diw     カーソル位置の単語を削除 (文の後の空白は除く)
daw     カーソル位置の単語を削除 (文の後の空白を含む)
dG      ファイルの末尾まで削除
dgg     ファイルの先頭まで削除

"d" の代わりに "c" を使うと削除ではなく、変更コマンドになります。"y" にすれ
ばヤンクコマンドです。他のオペレータも同様です。


他の章では特に説明されない雑多な変更コマンドをいくつか挙げておきます:

        ~       カーソル位置の大文字/小文字を変更し、カーソルを次に進めます。
                これは('tildeop' がオフの場合は)オペレータではありません。つま
                りモーションコマンドと組み合わせることができません。ビジュアル
                モードで使うと選択範囲のテキスト全体が変更されます。

        I       (大文字の "i" です) カーソルを行の最初の非空白文字に移動して
                挿入モードを開始します。

        A       行末にカーソルを動かして、挿入モードを開始します。

==============================================================================

次章: usr_05.txt  設定の変更

Copyright: see manual-copyright  vim:tw=78:ts=8:noet:ft=help:norl: