join to the world

vim の textwidth オプション、および gq コマンドまわりに対応するものを実装したい(vi の wrapmargin はたぶん作らない)。まずは、とりあえずその前フリとして、J コマンド(と :join)と Unicode の関係を考える。おそらく gq の処理を行う過程で join を何度も呼び出すことになるので。

J コマンドは、カーソル行と次の行を連結する。このとき、以下のプロセスで連結が行われる:

  1. 連結される行の先行する空白文字を削除する
  2. 連結される行の現在の状態が空行ならば、以下の 3. ~ 5. の処理を飛ばす
  3. カーソル行の末尾が空白文字であるか、または、連結される行の最初の文字が ‘)’ であるならば、何の加工もせずに 2 行を連結する
  4. そうではなく、カーソル行の末尾が ‘.’ であるならば、2 行の間に 2 つの空白文字を挟んで連結する
  5. そうではない場合は、2 行の間に 1 つの空白文字を挟んで連結する

wasavi では、3. が ‘)}]’ のいずれか、4. が ‘.!?’ のいずれか……に拡張してあるほかは、この通りの動作をする。これ、Unicode のさまざまな文字について考えるとどうなんですかね。Unicode な文字で考えると 3. はむしろ一般カテゴリ Pe (a closing punctuation mark) に属する文字、というのがふさわしいだろう。Pe に属する文字は Unicode 6.2.0 で 71 字。

一方 4. は、つまり文の終わりを示す約物ということになる。これは Unicode でいうと LineBreak.txt で STerm (Sentence Terminator) と定義されている文字に対応する。こちらは 83文字。

それから、空白を挟んで連結するかどうかは、言語(というより書記法的なもの?)によると思う。例えば漢字とその亜種(ひらがな、カタカナ、あるいはボポモフォみたいなの)どうしが隣り合う場合、空白は不要だ。おそらく隣り合う両方ではなく、片方だけが漢字とその亜種だったとしても不要だ。ところで「漢字とその亜種」っていう種別は Unicode にはない気がする。East Asian Scripts としてまとめられてるもの(漢字、ひらがな、カタカナ、注音符号、および全角・半角形あたり)を全部突っ込めばいいのかな。

 * * *

上記の修正を行った。漢字部分は、

'\u3100-\u312F', // Bopomofo
'\u31A0-\u31BF', // Bopomofo Extended
'\u4E00-\u9FCF', // CJK Unified Ideographs (Han)
'\u3400-\u4DBF', // CJK Extension-A
//'\u20000-\u2A6DF', // CJK Extension-B
//'\u2A700-\u2B73F', // CJK Extension-C
//'\u2B740-\u2B81F', // CJK Extension-D
'\uF900-\uFAFF', // CJK Compatibility Ideographs
//'\u2F800-\u2FA1F', // CJK Compatibility Ideographs Supplement
'\u2F00-\u2FDF', // CJK Radicals / KangXi Radicals
'\u2E80-\u2EFF', // CJK Radicals Supplement
'\u31C0-\u31EF', // CJK Strokes
'\u2FF0-\u2FFF', // Ideographic Description Characters

/* Korean */
'\u1100-\u11FF', // Hangul Jamo
'\uA960-\uA97F', // Hangul Jamo Extended-A
'\uD7B0-\uD7FF', // Hangul Jamo Extended-B
'\u3130-\u318F', // Hangul Compatibility Jamo
'\uFFA0-\uFFDC', // Halfwidth Jamo
'\uAC00-\uD7AF', // Hangul Syllables

/* Japanese */
'\u3040-\u309F', // Hiragana
'\u30A0-\u30FF', // Katakana
'\u31F0-\u31FF', // Katakana Phonetic Extensions
//'\u1B000-\u1B0FF', // Kana Supplement
'\uFF65-\uFF9F', // Halfwidth Katakana
'\u3190-\u319F', // Kanbun

/* Lisu */
//'\uA4D0-\uA4FF', // Lisu

/* Miao */
//'\u16F00-\u16F9F', // Miao

/* Yi */
'\uA000-\uA48F', // Yi Syllables
'\uA490-\uA4CF', // Yi Radicals

という感じ。LisuMiao は、Latin 文字ベースの中国語? という不思議なソレなのでよくわからないがとりあえず対象外。ところでハングルはどうなんだろう。単語間にスペース入れて記述するような気がするけど。

次は textwidth。

Leave a Reply

Your email address will not be published. Required fields are marked *