post

Vim ja:同時編集

Contents

はじめに

この章では、1つのファイルの異なる場所や、異なるファイル、そして異なる「ウィンドウ」や異なるタブを同時に扱う方法を見ていきます。編集を効率的にするためには、このようなファイルの扱いも大切な要素です。

折り畳んで複数のセクションを閲覧

長い文書を編集するとき、セクションを全て「閉じて」、1つのセクションだけに集中できれば便利だと思いませんか?

これは、Vim で「折り畳み」と呼ばれるものです。

あなたの文書において、構造が1段階が深くなるごとにインデントも1段階深くなっているとしましょう。たとえば、次のようにです。

   Book I

       The Shadow of the Past

           Three Rings for the Elven-kings under the sky,
           Seven for the Dwarf-lords in their halls of stone,
           Nine for Mortal Men doomed to die,
           One for the Dark Lord on his dark throne
           In the Land of Mordor where the Shadows lie.
           One Ring to rule them all, One Ring to find them,
           One Ring to bring them all and in the darkness bind them
           In the Land of Mordor where the Shadows lie.

       Three is Company

           The Road goes ever on and on
           Down from the door where it began.
           Now far ahead the Road has gone,
           And I must follow, if I can,
           Pursuing it with weary feet,
           Until it joins some larger way,
           Where many paths and errands meet.
           And whither then? I cannot say.
注意:このテキストは、WikiQuote から引用しました。

この文章を書いた後、:set foldmethod=indent を実行し、カーソルをインデントしたい場所に置いて、zc と入力しましょう。テキストが折り畳まれます。zo を入力すれば、折り畳んだものを開けます。

個人的には、スペースバーを、折り畳みを開けるにも閉じるにも使うショートカットが好みです。そうするには、vimrc ファイルに次のように書きます:

折り畳みを開閉するには、それぞれ zo および zc を使うのが基本的ですが、開閉の状態を入れ替える (‘a’lternate) ために za が使えます。そこで、ノーマルモードでスペースバーを、この機能に割り当てるために、

:nnoremap <space> za

としましょう。

折り畳みは大きなトピックで、ほかにも折り畳む方法がいくつか(手動、マーカー、表現)あり、いろいろな階層の折り畳みを開閉する方法などもあります。詳しくは :help folding をご覧ください。

複数のバッファ

同じ Vim で、複数のファイルを同時に編集するには、どうすればよいのでしょうか。

ファイルは、Vim のバッファに読み込まれます。そして Vim は、複数のバッファを同時に読み込むことができます。従って、複数のファイルを同時に開き、それらの間を行き来することができるのです。

2つのファイル part1.txtpart2.txt があるとしましょう。

part1.txt
   I have coined a phrase for myself - 'CUT to the G':

   1. Concentrate
   2. Understand
   3. Think
   4. Get Things Done
part2.txt
   Step 4 is eventually what gets you moving, but Steps 2 and 3 are equally
   important. As Abraham Lincoln once said "If I had eight hours to chop down a
   tree, I'd spend six hours sharpening my axe." And to get to this stage, you need
   to do Step 1 which boils down to one thing - It's all in the mind. That's why
   it's so hard.

では、:e part1.txt を実行し、次に :e part2.txt を実行しましょう。今、2つめのファイルが開かれ、編集可能になっているはずです。1つめのファイルにはどうやって戻るのでしょうか。この場合は、単に :b 1 を実行すれば、’1′ 番目のバッファ (‘b’uffer) に戻れます。他にも、:e part1.txt を実行して、既存のバッファを表示することもできます。

どのバッファが読み込まれ、どのファイルが編集中なのか、:buffer もしくは :ls (‘l’i’s’t buffers) を実行することで確認できます。

バッファは、Vim を終了すると自動的に閉じられるので、ファイルを保存さえすれば、特に意識する必要はありません。しかし、(メモリの節約などの理由で)本当にバッファだけを閉じたいのなら、たとえば :bd 1 を用いれば ‘1’ 番のバッファ (‘b’uffer) を削除 (‘d’elete) できます。

バッファを用いてできることが、:help buffer-list にたくさん書かれています。

複数のウィンドウ

同時に複数のファイルを編集する方法は分かりましたが、同時に複数のファイルを閲覧したい場合はどうでしょうか。たとえば、執筆中の本の2つの章を同時に開き、第2の章を第1の章と用語/説明を合わせて書き勧めたい場合です。もしくは、1つめのファイルの内容の一部を2つめのファイルにコピー/ペーストしたい場合。

前のセクションで、複数のバッファを編集するのに同じ「画面」を使いました。Vim ではこの「画面」をウィンドウと呼びます。この「ウィンドウ」という言葉を、デスクトップアプリケーションのウィンドウ、つまりアプリケーション自身をさす言葉と混同してはいけません。「ウィンドウ」とは、単に異なるファイルを見る「画面」だと考えてください。

前セクションと同じファイル、part1.txtpart2.txt を使って説明します。

まず、:e part1.txt を実行して part1.txt を開きます。そして、新しいウィンドウを作って新しいバッファを開くため、:new を実行します。これで、新しいウィンドウの新しいバッファで通常の編集ができます。但し、このバッファにはファイル名が関連付けられてないので、保存ができません。保存するには、:w test.txt を実行します。

Multiple windows.png

2つのウィンドウを行き来するにはどうすればよいでしょうか。ctrl-w <motion key> を用います。ここで、モーションキーは h, j, k, l か矢印キーです(この例では、上下のキーしか意味をなしません)。ctrl-w という操作がウィンドウ (‘w’indow) に働くものであるわけです。

簡単なショートカットとしては、ctrl-w を2回、つまり ctrl-w ctrl-w を入力すれば、全ての開いているウィンドウの間を循環できます。

複数のウィンドウを使うのが便利な状況のひとつは、同時に同じファイルの異なる部分を表示する場合です。:sp を実行すれば、ウィンドウを分割 (‘sp’lit) すると、各ウィンドウの中でスクロールさせ、異なる場所を表示して編集を続けられます。これらは同じバッファに対する「ウィンドウ」なので、1つのウィンドウでの変更は即座にほかのウィンドウにも反映されます。:sp のかわりに、ctrl-w s を使うこともできます。

垂直方向に分割するには、:vspctrl-w v を用います。ウィンドウを閉じるには、いつもどおり :q を実行します。

これで複数のウィンドウを開いて使う方法が分かったので、ほかの操作も学んでみましょう。

  • 2つのウィンドウを開いているとき、それらを入れ替えることで、視線をずっとスクリーンの上半分か下半分に固定しておきたいとしましょう。そのときは ctrl-w r を実行するとウィンドウを巡回 (‘r’otate) できます。
  • 現在のウィンドウを最上部に動かすには、ctrl-w K を入力します。
  • ウィンドウを、より小さく、または大きくリサイズするにはどうするのでしょうか。たとえば :resize 10 を実行すると、表示領域が 10 行分になります。
  • 現在のウィンドウに集中できるよう、できるだけ大きくするには?ctrl-w _ を使います。このアンダーバー ‘_’ は、ほかのウィンドウをできるだけ小さくするという意味だと覚えましょう。
  • ウィンドウの高さを揃えるには、ctrl-w = と入力します。

ウィンドウの操作について、詳しくは :help windows をご覧ください。

複数のタブ

Firefox をお使いなら、タブ機能を使って複数のウェブサイトを、1つのウィンドウで開いたことがあると思います。それによって、ウィンドウを切り替えること無く、ウェブサイトを切り替えられるわけです。Vim でも、全く同様にタブが機能します。但し、Vim では「タブページ」と呼ばれています。

Multiple tabs.png

:tabnew を実行して新しいタブを、新しいバッファとともに開きます(:new と似ています)。タブを切り替えるには、gt を入力して次のタブに行き (‘g’o to the next ‘t’ab)、gT を入力して反対方向、つまり前のタブに移ります。

個人的には、alt-jalt-k でタブ移動するのが好みです。ちょうど jk で文字間を移動、もしくは ctrl-w jctrl-w k が(水平方向に分割された)ウィンドウ間を移動するようにです。そのために、vimrc ファイルに次のように書いておきます。

" Shortcuts for moving between tabs.
" Alt-j to move to the tab to the left
noremap <A-j> gT
" Alt-k to move to the tab to the right
noremap <A-k> gt

タブを閉じる (‘c’lose a ‘tab’) には、:tabcq を実行します。

新しいウィンドウにファイルを開くかわりに、新しいタブに開くこともできます。たとえば :help tabpage を実行すると、ヘルプが分割されたウィンドウに開かれますが、これを新しいタブで見るには、:tab help tabpage を用います。

タブの順序を変えたいときは、:tabmove を用います。たとえば、現在のタブを1番目に動かすには、:tabmove 0 を実行する、という感じです。

:help tabpage には、タブページに関する詳細や、ほかの操作について記載されています。たとえば、開いている各タブに作用する :tabdo や、タブページのタイトルをカスタマイズする方法(:help setting-guitablabel)等です。

おわりに

Vim には、複数のファイルを同時に編集するための方法がいくつか用意されています。バッファ、ウィンドウ、そしてタブです。好みによって使い分けてください。たとえば、タブを使うと決めたら、複数のウィンドウの編集は不要になるかもしれません。あなたにとって最も便利で、快適なものを使うことが大切です。


Advertisements