vim 04

文字/単語単位でヤンク

これまでのレッスンでは、コピペなどの操作を行単位で行っていました。

今回は文字単位、単語単位でコピペしてみます。

文字単位、単語単位なんていわれると、「文字と単語をそんな厳密に分けて考える必要あるのかな?」って思うかもしれません。

たしかに。人間のアタマの中では、文字も単語もそんなに厳密に考えて、文章を操ったりしていない。かもしれません。

扱う言語によっても違うと思います。日本語と英語じゃ文字数の数え方と単語数の数え方は違いますよね?

たとえば、「This is a pen.」という文章があったとして、これの文字数と単語数を数えるのは、英語なので簡単そうです。

日本語に翻訳して「これはりんごです。」ってなると、文字数は簡単に答えられるけど、単語数ってなるとちょっと面倒ですよね?

機械(vim)も同じです。

たとえば「これはリンゴです。」とか、「これは林檎です。」のようにカタカナや漢字を混じえてくれれば、少しマシにはなるけれど・・・・。英語のように単語と単語の間に境界線(スペース)がない日本語は、文字単位、単語単位をvimに伝えるのがホネです。

なんだか冒頭から言い訳がましくなっていますが、今回のレッスンでは英語に対する編集がメインになります。理由はvimの操作を覚えるのに簡単な道だからです。

まずは簡単な道から体験して、vimの基本操作を覚えてしまいましょう。

文字単位でヤンク

それでは練習用のファイルfile_001.txt を開いて文字/単語単位でヤンクしてみましょう。

file_001.txt は今、こんな状態になっていると思います。

photo.1

それでは文字単位でヤンクしてみましょう。

カーソル位置にある1文字を削除するには、ノーマルモードでx を打ちます。

するとappleという単語のaという1文字が削除されます。

そうしたら前回レッスン同様、レジスタをチェックしてみましょう。

ノーマルモードで:reg と打ってレジスタを開いてみると、x で削除したa が、" に格納されて、ちゃんとヤンクできていることがわかります。

photo.2

x で1文字を削除。わかりやすいですね。

前回レッスンで複数行を行数指定で削除できることを覚えました。

x も同様に削除する文字数(削除する回数)を指定できます。

それでは回数を指定して4文字消してみましょう。キー操作は4x です。そしてまたレジスタをチェックしてみます。

photo.3

'pple'の4文字が消えて、レジスタの" にヤンクされました。

そして最初にx で消した'a'の1文字はレジスタからも消えて、'pple' に置き換わっているのがわかると思います。

レジスタの" は、「無名レジスタ(Unnamed register)」という格納先で、直前の操作を記憶してくれます。

前回レッスンで行を削除したりコピーしたりしましたが、dd で1行を消したときも、2yy で2行をコピーしたときも、" の無名レジスタに直前の操作として格納されていました。

文字単位の場合も同様に、直前の操作を無名レジスタが覚えていてくれます。

さて、これで文字単位のヤンクについては、だいたいわかったと思います。簡単ですよね?

1文字を消したいときはx を打って、10文字消したければ10x と回数を指定してxを打てばいいのです。

それよりも恐らく今、興味はレジスタの役割のほうに移っているのではないでしょうか?

レジスタをもっと理解する

直前の操作を記憶する無名レジスタは、直前の操作ですから、コピーしたり削除すれば直ちに入れ替わってしまいます。

vim の操作に慣れて、グイグイ書いたり編集できる頃には、まだあるかな??って:reg をみてみたら、もうそこにない。って感じになるでしょう。

さて、無名レジスタは前の前のことはすぐ忘れてしまうけれど、その下にある0~9の番号付きレジスタ(Numbered registers)は、もうちょっと長い間覚えていてくれます。

何度もコピーしたり削除したりと忙しく作業を続けても、レジスタ1の内容はレジスタ2に、レジスタ2の内容はレジスタ3にというように、自動的に記憶する場所を移してくれます。

残念ながらレジスタ9の内容は、押し出されて消えてしまいますが、無名レジスタに比べたら消えてしまうまでの時間的な猶予が違います。

無名レジスタも番号付きレジスタも、こちらが意図せずとも自動的に覚えてくれる。つまり勝手に覚えていてくれる。ってトコがミソです。

意図的に覚えさせる

忘れてほしくないことを意図的にレジスタに覚えさせることも可能です。

やり方は前回レッスンでレジスタから呼び出してペーストした操作の逆をやればよいだけです。

さっそくやってみましょう。

今回のレッスンのテーマは、文字単位/単語単位で操作することでしたから、単語単位でレジスタに格納してみます。

0~9の番号付きレジスタは、9までくればいつかは忘れてしまうので、あまり意味はないカモですが、そこにも意図的に覚えさせられます。

では、4番に'lemon'という単語を覚えてもらいましょう。

file_001.txt は今、こんな状態になっていますから、'lemon' のところまでカーソルを移動させます。

photo.4

矢印キーを叩き続けて、lemonのところまで移動させてもいいですが、スゴク面倒ですよね?

カーソル移動も単語単位で

なので移動も単語単位でやります。ノーマルモードでw を叩いてください。w はwordの頭文字です。

するとカーソルは単語単位で移動します。5回叩けばlemonのところまでたどり着くでしょう。

「え?5回も??」って印象を受けてると思います。単語と単語の間にある,(カンマ)も単語として認識しているため、5回も?って感じになりますが、もっとよい方法も当然あるのでご安心を。

とりあえず今は単語単位でカーソルを移動させます。

lemon の l のところまできたら、次のように操作してレジスタの4番に覚えさせます。

レジスタの4番にヤンク
"4yw

"4 でレジスタの4番を指定。yw でカーソル下の単語を1つヤンク。と命令しています。

レジスタが覚えてくれたかどうか、:reg で確かめてみます。
photo.5

ちゃんと4番に入りましたよね?。

さて、おそらくみなさんのレジスタはphoto.5 のとおりにはなっていないでしょう。

4番にlemonは入ったけど、その他の番号にもイロイロと意図せず自動的に単語や文字が格納されて、0~9番までギッシリ埋まっていると思います。

photo.5はわかりやすいように、番号付きレジスタの値をすべてクリアしてから4番にlemonを入れています。

ちなみに、今はyw つまりコピーするつもりでヤンクしましたが、これをdw とすればdelete で番号付きレジスタにヤンクできます。

しかし、期待した4番には'lemon'は入らず、1番と5番に入るでしょう。

番号付きレジスタは意図せず自動的に格納してくれますから、delete の場合は直前の操作を1番にも入れるので1つズレて5番に入ります。

なにしろ自動ですからね。刻々と変わります。

そして9番まで来たらいつか'lemon'は消えてしまいます。それじゃぁ困る!ってケースも当然ありますよね?

名前付きレジスタでずっと覚えてもらう

photo.5 をもう一度みてください。番号付きレジスタの下に"a ,"b ,"c となにやら利用できそうなレジスタがあります。

無名レジスタというワードを聞いて、カンのいいヒトは「もしかしたら有名レジスタもあるのでは?」なんて思ったかもしれません。

そうなんです。有名とは呼ばないけれど「名前付きレジスタ」というものがvimには存在します。

なんと!26個も格納できるレジスタがあるのです。26個っていうのはアルファベットの数です。

a~zのレジスタはあなたが意図して上書きしない限り、ずっと覚えていてくれます。

たとえばレモンを英語で書かなければならないとき、remon だったっけ?それともlemmon ??などとスペルに自信が持てないとき正しい綴りのレモンをずっとvimに覚えさせることもできるのです。

さっそくやってみましょう!

やりかたは番号付きレジスタのときとまったく同じです。覚えさせたいレジスタをアルファベットで指定すればよいだけです。

名前付きレジスタa に格納
"ayw

この場合は"ayw でも"adw でもレジスタa に入ります。そして上書きしない限りずっと覚えています。

取り出し方は大丈夫ですか??

前回レッスンでやったとおりの操作でペーストできますよ。

レジスタa をペースト
"ap <-- カーソルの隣にペースト
"aP <-- カーソル位置にペースト

前回レッスンは行単位のコピペでしたから、小文字のp はカーソルの下。大文字のPはカーソル位置でしたね。

今回は単語単位ですから、小文字のpはカーソルの隣、大文字のPはカーソル位置に貼り付けられます。

さて、今回のレッスンでは文字単位/単語単位でのコピペ操作を覚えました。

でも、これがすべてじゃ当然ありません。

lemon のlまでカーソルを移動させるのに5回もwキーを押さねばなりませんでしたよね?

次回はもっと効率よくカーソルを移動させる手法について触れたいと思います。