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*
Vim documentation: motion
A WORD consists of a sequence of non-blank characters, separated with white
space. An empty line is also considered to be a WORD.
つまり、
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:マニュアルの日本語訳だと、そこが微妙にわかりにくくなっている。そのことが、この記事を書くきっかけになった。