'iskeyword'とは何なのか
Vimには'iskeyword'というオプションがあり、バインドw b eなどでのカーソルの動きや* ^]でのジャンプの際の単語の認識に利用されている。
個人的にはw b eでのカーソル移動と* ^]でのキーワードジャンプは全く用途が違うので別のオプションに分けておいてほしいものだが。
カーソル移動の際は細かく動いてほしいが、キーワードジャンプの場合は大まかに認識してほしい。
それはともかくとして、オプションの説明にこんなものがある。
(MS-DOSとWin32でのVimの既定値:
"@,48-57,_,128-167,224-235"
それ以外のシステムでのVimの既定値:
"@,48-57,_,192-255"
Viの既定値: "@,48-57,_")
C言語プログラムには "a-z,A-Z,48-57,_,.,-,>" が使えるだろう。
ヘルプファイルでは、このオプションは '*', '"', '|' と空白の仲間を除いた全ての printable な文字 (訳注: 文書先頭を参照) に設定される (コマンド上で CTRL-] を入力したときにそのコマンドについてのヘルプにジャンプできるようにするため)。
ファイルタイプによってwordとして認識する区切りを変えるためにこのオプションは変更されるようだ。
たとえばhelpファイルでは
iskeyword=!-~,^*,^|,^",192-255
になっている。
@とは何なのか
文字として '@' を指定すると、関数 isalpha() で TRUE が返るような文字
てが含まれる。普通、それは a から z と A から Z の文字と、それらにア
セントのついたものである。文字 '@' 自身を値に含みたいときは、"@-@"
すること。
48-57とか、192-255というのは、つまり何か
ASCIIコードにおいて、
48から57までというのはつまり数字0から9までを指す。
ちなみにアルファベットは大文字A-Zが65-90、小文字a-zが97-122
helpファイルでは!-~というのはASCIIコードでいうと33-126で、すなわちこれはアルファベットも数字も記号も、半角文字で印字可能なものは全て含むということだが、後から^*,^|,^"で*|"を除外している。
どうやら^の後に文字列を置くとそれを除外できるらしい。
そして…
128-167とか224-235とか192-255とかあるが、それらは日本語のコードでは文字コードがあてられていなかったり、半角カナの一部分を中途半端に指していたりして、少なくとも日本で使うにはまともに機能してはいないと思う。
ちょっと調べてみると、Extended ASCII charactersというもののための設定っぽい。しかも、OSによってコードが異なるので切り分けているらしい。
- コマンド ASCII コード
- Ascii Tabelle : Codes 192 - 255
- The complete table of ASCII characters, codes, symbols and signs, tabla con los codigos ASCII completos, caracteres simbolos letras ascii, ascii, characters, codes, tables, symbols, list, alt, keys, keyboard, ascii, asci, asccii, asqui, askii, aski, aschi, aschii, control, printable, extended, letters, epistles, handwriting, scripts, lettering, majuscules, capitals, minuscules, lower, case, small, acute, accent, sharp, engrave, diaresis, circumflex, tilde, cedilla, anillo, circlet , eñe, enie, arroba, pound, sterling, cent, type, write, spell, spanish, English, notebooks, laptops,20121230
- http://www.4d.com/docs/CMU/CMU10120.HTM
しかしとりあえずこれらのコードは日本人は絶対使わないだろうから無視していて構わないと分かった。ずっと疑問だったのが解決した。
実験
試しにiskeywordを空っぽにしてみたところ、空白文字を区切りとして、何でも認識するようになってしまった。
今度はiskeyword=_にしてみた。
すると"_"がカーソル行にある場合はそれを真っ先に認識し、カーソル行にそれが見当たらない場合は空白を区切りとして何でも認識した。