VIMのwordについての一考察

  • 追記(2009-04-16): word, WORDの定義の解説を完全なものにした。

vimにおけるwordの定義を、ヘルプファイルの記述から改めて考えてみたい。ついでにWORDも。ポイントとなるのは、wordの区切られ方は、ホワイトスペースによるものだけではないということ。

定義再考

*word*
A word consists of a sequence of letters, digits and underscores, or a
sequence of other non-blank characters, separated with white space (spaces,
tabs, ). This can be changed with the 'iskeyword' option. An empty line
is also considered to be a word.

*WORD*
A WORD consists of a sequence of non-blank characters, separated with white
space. An empty line is also considered to be a WORD.

Vim documentation: motion

つまり、


word:

  • 「アルファベット、数字、アンダースコアのいずれかが並んだもの」または「その三種類以外の非空白文字が並んだもの」がwordである。wordとwordとはホワイトスペースで区切られる
  • wordの定義(wordに使える文字)は'iskeyword'オプションで変更できる
  • 空行も一つのwordである

WORD:

  • 「非空白文字が並んだもの」がWORDである。WORDとWORDとはホワイトスペースで区切られる
  • 空行も一つのWORDである


となる。

wordの定義の重要な点は、「文字、数字、アンダースコアのいずれかが並んだもの」と「その三種類以外の非空白文字が並んだもの」とが隣り合っている場合、両者は別々のwordとみなされる、ということだ*1

ここがwordの定義の肝で、これにより、いわゆる「単語」を認識できるのである。

事例研究

function(_arg1, _arg2)

というテキストに対して、ノーマルモードでwを押していけば、"function", "(", "_arg1", ",", "_arg2", ")" という順に移動できる。"function(_arg1"という文字列は3つに分解され、"function"と"_arg1"は各々独立した「単語」として扱われているわけだ。

一方、Wならば、"function(_arg1,", "_arg2)" という順の移動となる。"function"と"_arg1"は別々の「単語」とはみなされない。

*1:マニュアルの日本語訳だと、そこが微妙にわかりにくくなっている。そのことが、この記事を書くきっかけになった。