Info file: skk.info,    -*-Text-*-
produced by `texinfo-format-buffer'
from file `skk.texi'
using `texinfmt.el' version 2.37 of 24 May 1997.






File: skk.info, Node: ■モードにおける文字入力, Next: ポイントを戻して▽モードへ, Prev: 入力モードの一時変更, Up: 便利な応用機能とユーザーオプション

■モードにおける文字入力
========================

* Menu:

* かなモード/カナモードにおける入力::  
* 全英モードにおける入力::      
* 1回のadvertised-undo(undo)の対象::  
* 対になる文字列の一括入力::    



File: skk.info, Node: かなモード/カナモードにおける入力, Next: 全英モードにおける入力, Prev: ■モードにおける文字入力, Up: ■モードにおける文字入力

かなモード/カナモードにおける入力
---------------------------------

* Menu:

* ローマ字仮名変換ルール::      
* 有限状態オートマトンを用いた変換::  
* 数字や記号文字の入力::        



File: skk.info, Node: ローマ字仮名変換ルール, Next: 有限状態オートマトンを用いた変換, Prev: かなモード/カナモードにおける入力, Up: かなモード/カナモードにおける入力

ローマ字仮名変換ルール
......................

SKKでは、`skk-roma-kana-a', `skk-roma-kana-i', `skk-roma-kana-u',
`skk-roma-kana-e', `skk-roma-kana-o' という5つの連想リストを持ち、母音が
入力された時点で対応する連想リストを走査して入力すべきかな/カナ文字を決
定する。

例えば、`skk-roma-kana-i' の値は、下記のようになっている。

     '(("" . ("い" . "イ"))
       ("b" . ("び" . "ビ")) ("by" . ("びぃ" . "ビィ"))
       ("ch" . ("ち" . "チ")) ("cy" . ("ちぃ" . "チィ"))
       ("d" . ("ぢ" . "ヂ")) ("dh" . ("でぃ" . "ディ"))
       ("dy" . ("ぢぃ" . "ヂィ"))
       ("f" . ("ふぃ" . "フィ")) ("fy" . ("ふぃ" . "フィ"))
       ("g" . ("ぎ" . "ギ")) ("gy" . ("ぎぃ" . "ギィ"))
       ("h" . ("ひ" . "ヒ")) ("hy" . ("ひぃ" . "ヒィ"))
       ("j" . ("じ" . "ジ")) ("jy" . ("じぃ" . "ジィ"))
       ("k" . ("き" . "キ")) ("ky" . ("きぃ" . "キィ"))
       ("m" . ("み" . "ミ")) ("my" . ("みぃ" . "ミィ"))
       ("n" . ("に" . "ニ")) ("ny" . ("にぃ" . "ニィ"))
       ("p" . ("ぴ" . "ピ")) ("py" . ("ぴぃ" . "ピィ"))
       ("r" . ("り" . "リ")) ("ry" . ("りぃ" . "リィ"))
       ("s" . ("し" . "シ")) ("sh" . ("し" . "シ"))
       ("sy" . ("しぃ" . "シィ"))
       ("t" . ("ち" . "チ")) ("th" . ("てぃ" . "ティ"))
       ("ty" . ("ちぃ" . "チィ"))
       ("v" . ("う゛ぃ" . "ヴィ")) ("w" . ("うぃ" . "ウィ"))
       ("x" . ("ぃ" . "ィ")) ("xw" . ("ゐ" . "ヰ"))
       ("z" . ("じ" . "ジ")) ("zy" . ("じぃ" . "ジィ")) )

`ち'を挿入すべく `t i' という入力を行なったとすると、最後の母音である 
`i' の入力時点で、`skk-roma-kana-i' を走査することが決定される。この連想
リストの走査キーは、入力される仮名文字のローマ字プレフィックス (1) で、
この例では "t" となる。走査結果は、

     ("t" . ("ち" . "チ"))

となる。かなモードのときは、この結果から `cadr' (2) の"ち"を、カナモード
のときは、`cddr' (3) の"チ"を取り出し、カレントバッファに挿入する。


`ch' や `f' などヘボン式でしか使用しないキーの割付けをやめたいときは、
`~/.emacs' や `~/.skk' に不要なセルを除いた `skk-roma-kana-i' を直接書く
か、`skk-load-hook' を利用して、下記のように書く。

     (add-hook 'skk-load-hook
               (function
                (lambda ()
                  (setq skk-roma-kana-i
                        (delq (assoc "ch" skk-roma-kana-i) skk-roma-kana-i)
                        skk-roma-kana-i
                        (delq (assoc "f" skk-roma-kana-i) skk-roma-kana-i) ))))

上記の

     (assoc "ch" skk-roma-kana-i)

の代りに

     ("ch". ("ち" . "チ"))

と書いても良いが、その場合は、`delq' の代りに `delete' を使用すること。

旧バージョンのSKKでは長さ2以上のプレフィックスについて 
`skk-roma-kana-[aiueo]' を変更したら、対応して `skk-prefix-list' も変更
する必要があったが、バージョン9.6ではこれを内部変数 (4) として、SKKモー
ドを起動する毎に自動計算するようになった。既にSKKモードになっているバッ
ファで `skk-roma-kana-[aiueo]' を変更した場合は、`C-x C-j' もしくは `C-x
j' を2度タイプして `skk-mode' もしくは `skk-auto-fill-mode' を起動し直す
必要があるので注意すること。`skk-roma-kana-[aiueo]' がユーザー変数である
ために、SKK起動後にこれらの変数が変更される可能性があるので毎度計算し直
すように設計されている。


--------- Footnotes ---------

(1)  *Note ローマ字プレフィックス: 辞書の形式.

(2) `cdr' の `car'。

(3) `cdr' の `cdr'。

(4) 改名されて `skk-prefix-tree' という変数になった。ElibのAVL木パッ
     ケージを利用したAVL木構造となっている。`skk-prefix-list' の長
     さは24と結構長く、`skk-kana-input' で頻繁に参照、走査されるの
     で `member' による逐次走査よりもAVL木を利用したバイナリーサー
     チの方が有利と判断した。



File: skk.info, Node: 有限状態オートマトンを用いた変換, Next: 数字や記号文字の入力, Prev: ローマ字仮名変換ルール, Up: かなモード/カナモードにおける入力

有限状態オートマトンを用いた変換
................................

ローマ字かな変換は、`skk-roma-kana-a', `skk-roma-kana-i',
`skk-roma-kana-u', `skk-roma-kana-e', `skk-roma-kana-o' という5つの連想
リストに従い行われることは前節で述べた通りだが、`skk-rom-kana-rule-list' 
により表現される有限状態オートマトンを用いた変換も併用される (1) 。この
リストのディフォルト値は、下記の通りである。

     '(("nn" nil ("ン" . "ん"))
       ("n'" nil ("ン" . "ん")) )

リストの各要素は、オートマトンの状態遷移規則:

     <現在の状態, 入力, 次の状態, 出力>

を

     (現在の状態@入力 次の状態 出力)

という形のリストで表現したものである。ここで`状態'とは変換される前のロー
マ字の文字列であり、`入力'は今タイプされた文字を長さ1の文字列とみなした
ものである。`@' は文字列の連接を表わす。`出力'は次の状態に遷移するときに
バッファに挿入される文字列のリストであり、かなモードでは当該リストの 
`car'、カナモードでは `cdr' がバッファに挿入される。「次の状態」が `nil' 
のときには最終状態に遷移し、ローマ字かな変換を終了する。

従い、上記のディフォルト値は、`nn' または `n'' をタイプすると、かなモー
ドでは`ん'が、カナモードでは`ン'がカレントバッファに挿入されることを示し
ている。また、

     (setq skk-rom-kana-rule-list
           '(("nn" "n" ("ン" . "ん"))
             ("n'" nil ("ン" . "ん")) ))

とすれば、

     hannou ==> はんのう
     han'ou ==> はんおう

のようにローマ字かな変換が行われる。ところで、

     ohsaka ==> おおさか
     ohta ==> おおた
     ohhira ==> おおひら

のように `oh' は特別に処理される。従い、`ohhonn' とタイプすると`おおほん'
となり`おっほん'とはならない。

     ohhonn ==> おっほん

のように変換したければ、規則


     ("oh" "h" ("" . ""))

を追加する。

この他、

     tp ==> 東北大学
     skk ==> skk
     skK ==> SKK

といった変換も、


     ("tp" nil ("東北大学" . "東北大学"))
     ("sk" "sk" ("" . ""))
     ("skk" nil ("skk" . "skk"))
     ("skK" nil ("SKK" . "SKK"))

のような規則を追加すれば可能である。自分の名前を入力することはよくあるの
で、適当な省略形を用いて、このリストに追加しておくと便利かもしれない。

更に `skk-rom-kana-rule-list' を用いればT-codeやTUT-codeによる日本語入力
を実現することもできる。この場合はルールの数が数千になり、このままではル
ールへのアクセスに多くの時間を要するようになる。このようにルールの数が多
いときは、以下のようにしてあらかじめルールのリストを木の形にコンパイルし
ておくと効率が良い。

  1. まず、`.emacs' などに下記のフォームを追加する。


          (setq skk-rom-kana-rule-tree
                (skk-compile-rule-list skk-rom-kana-rule-list) )


  2. このままではSKKを起動するときに毎回 `skk-compile-rule-list' を計算
     することになるので、うまくゆくことが分れば、上記のフォームに代えて、


          (skk-compile-rule-list skk-rom-kana-rule-list)


     の値を直に `~/.emacs' などに書いておく。

--------- Footnotes ---------

(1)  順序としては、オートマトンの状態遷移規則を用いたリストが先に参照され、そこに該当の規則がなければ、次に上記5リストが参照される。



File: skk.info, Node: 数字や記号文字の入力, Prev: 有限状態オートマトンを用いた変換, Up: かなモード/カナモードにおける入力

数字や記号文字の入力
....................

かなモード/カナモードにおける次のキーは、`skk-self-insert' 関数にバイン
ドされている。

     !  #  %  &  '  *  +

     -  0  1  2  3  4  5

     6  7  8  9  :  ;  <

     =  >  ?  "  (  )  [

     ]  {  }  ^  _  `  |

     ~

これらの数字や記号文字のキーに対応し挿入される文字は、ベクトル
`skk-input-vector' の値により決定される。`skk-input-vector' のディフォル
ト値は、下記の通り。

     [nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  "！" nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  "、" "ー" "。" nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  "：" "；" nil  nil  nil  "？"
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  "「" nil  "」" nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil]

このベクトルは、キーのアスキーコード順に対応する文字列を並べたものである。
例えば `!' のアスキーコードは33で (1) 、このベクトルの33番目 (2) の要素
には全角文字の`！'が割り振られているので、`!'のキー入力に対し、全角文字
である`！'がバッファに挿入される。


要素が `nil' のところは使用されないか、または入力キーがそのまま挿入され
ることを示している。具体例を言えば、▽モードへ入るキーの1つに `A' がある
が、このキーは、`skk-set-henkan-point' に割り付けられており (3) 、
`skk-input-vector' では参照されないので、`A' のアスキーコードである65番
目の要素は `nil' である。また、`*' は、前述の通り `skk-self-insert' に割
り付けられているが、そのアスキーコードは42であり、`skk-input-vector' の
42番目の要素は `nil' なので、そのまま `*' が挿入される。

あるインデックスに対するベクトルの要素を簡単に調べるには、Emacsの組み込
み関数である `aref' を使い、

     (aref skk-input-vector 33)

のようにする。返り値が対応する値である。

かなモード/カナモードで `*' にて対応し全角文字の`＊'を入力したければ、
`~/.skk' `~/.emacs' に42番目の要素が全角文字の"＊"であるような 
`skk-input-vector' を直接書いておくか、 `~/.skk' や `skk-load-hook' を利
用して下記のような式を評価する (4) 。

     (aset skk-input-vector 42 "＊")

バッファに依存して異なる `skk-input-vector' を用いるには、バッファローカ
ルな同名の変数を作り、その変数の値の設定を変更すればよい (5) 。例えば、
下記の関数をあるバッファで実行すれば、そのバッファでは区切記号 `!', `,',
`.', `:', `;', `?' の各キー入力に対して、対応するアスキー文字をそのまま
入力できるようになる (6) 。

     (defun skk-ascii-punc ()
       "use ascii punctuation marks."
       (interactive)      
       (make-local-variable 'skk-input-vector)
       (setq skk-input-vector
             (copy-sequence (default-value 'skk-input-vector)))
       (aset skk-input-vector ?! nil)
       (aset skk-input-vector ?, nil)
       (aset skk-input-vector ?. nil)
       (aset skk-input-vector ?: nil)
       (aset skk-input-vector ?; nil)
       (aset skk-input-vector ?? nil) )

Emacsのモード固有のフックなどを利用して上記のような関数を実行すれば、モ
ードに依存して自動的に `skk-input-vector' をカスタム化できる。

`skk-self-insert' は、Emacsのオリジナル関数である `self-insert-command' 
をエミュレートしているので、引数を渡すことにより同じ文字を複数、一度に挿
入することが可能である (7) 。


     C-u 2 !

     ------ Buffer: foo ------
     ！！
     ------ Buffer: foo ------

--------- Footnotes ---------

(1)  `!' をEmacsのchartypeで表現した `?!' をEmacsの `lisp-interaction-mode' で評価すると33が返ってくる。

(2) 0から数える。

(3) `A'をタイプすると`あ'を挿入する他、▽モードに入る、という
     仕事をしなければならないので、`skk-self-insert' ではなく、
     `skk-set-henkan-point' に割り付けられている。

(4) `aset' の第2引数の42の代りに `?*' のように `*' のchar
     type表現をそのまま書いても良い。`aset' を使って 
     `skk-input-vector' の値を変更するのは、`skk.el' のロード
     後でなければならないので、この式を `.emacs' などで設定してはな
     らない

(5) `skk-input-vector' が元々グローバル変数であることに注意。

(6) 初期値が `nil' でないバッファローカル値に破壊的関数を使用すると、
カレントバッファだけでなく、他のバッファから見える値まで変更されてしまう。
詳細については、`skk.el' の `skk-make-henkan-marker'関数のコメ
ントを参照願いたい。`skk-ascii-punc' では、初期値が`nil'でない 
`skk-input-vector' をバッファローカル化し、`aset' で直接書換え
するので、予め `copy-sequence' で複写し、バッファローカル化された 
`skk-input-vector' が指す実体をグローバル変数 
`skk-input-vector' の指すものから変更している。

(7) 残念ながら、`あ'などを入力する `skk-insert-[aiue]' や 
     `▽あ' などを入力する `skk-set-henkan-point' では引数渡し
     できない。



File: skk.info, Node: 全英モードにおける入力, Next: 1回のadvertised-undo(undo)の対象, Prev: かなモード/カナモードにおける入力, Up: ■モードにおける文字入力

全英モードにおける入力
----------------------

全英モードにおける印字可能な全てのキーは `skk-zenkaku-insert' に割り付け
られており `skk-zenkaku-vector' の値により挿入される文字が決定される。
`skk-zenkaku-vector' のディフォルト値は、下記の通り。

     [nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      nil  nil  nil  nil  nil  nil  nil  nil
      "　"  "！" "”" "＃" "＄" "％" "＆" "’"
      "（" "）" "＊" "＋" "，" "−" "．" "／"
      "０" "１" "２" "３" "４" "５" "６" "７"
      "８" "９" "：" "；" "＜" "＝" "＞" "？"
      "＠" "Ａ" "Ｂ" "Ｃ" "Ｄ" "Ｅ" "Ｆ" "Ｇ"
      "Ｈ" "Ｉ" "Ｊ" "Ｋ" "Ｌ" "Ｍ" "Ｎ" "Ｏ"
      "Ｐ" "Ｑ" "Ｒ" "Ｓ" "Ｔ" "Ｕ" "Ｖ" "Ｗ"
      "Ｘ" "Ｙ" "Ｚ" "［" "＼" "］" "＾" "＿"
      "‘" "ａ" "ｂ" "ｃ" "ｄ" "ｅ" "ｆ" "ｇ"
      "ｈ" "ｉ" "ｊ" "ｋ" "ｌ" "ｍ" "ｎ" "ｏ"
      "ｐ" "ｑ" "ｒ" "ｓ" "ｔ" "ｕ" "ｖ" "ｗ"
      "ｘ" "ｙ" "ｚ" "｛" "｜" "｝" "〜" nil]

挿入される文字の変更方法等については、*Note 数字や記号文字の入力:: を参
照のこと。

`skk-zenkaku-insert' もEmacsオリジナルの関数 `self-insert-command' をエ
ミュレートしている関係から、引数を渡すことにより同じ文字を複数、一度に挿
入することができる。`skk-self-insert' における動作と同じであるので、前述
した例をご参照いただきたい。*Note 数字や記号文字の入力::.



File: skk.info, Node: 1回のadvertised-undo(undo)の対象, Next: 対になる文字列の一括入力, Prev: 全英モードにおける入力, Up: ■モードにおける文字入力

1回のadvertised-undo(undo)の対象
--------------------------------

SKKモードになっていないEmacsオリジナルバッファでは、連続する20文字の挿入
が一度のアンドゥの対象となっている。かな・カナ・全英モードにおける入力も、
このオリジナルの動作をエミュレートしている (1) 。正確に言えば、
`skk-insert-[aiue]', `skk-insert-comma', `skk-insert-period',
`skk-kana-input', `skk-self-insert', `skk-set-henkan-point',
`skk-zenkaku-insert' (2) の各関数にバインドされたキー入力については、連
続して入力された20文字を1つのアンドゥの対象としている (3) 。但し、上記の
SKKの関数とEmacsのオリジナルの`self-insert-command' を織り混ぜてキー入力
した場合 (4) は、このエミュレート機能は正常に働かないので注意すること。
このエミューレート機能は、Mule-2.3添付の `egg.el' を参考にした。


     a i u e o k a k i k u k e k o s a s i s u s e s o t a t i t u t e t o

     ------------------------- Buffer: foo -------------------------
     あいうえおかきくけこさしすせそたちつてと ; 連続する20文字。
     ------------------------- Buffer: foo -------------------------

     C-_

     ------------------------- Buffer: foo -------------------------
                            ; 20文字全てがアンドゥの対象となる。
     ------------------------- Buffer: foo -------------------------

     a i u e o k a k i k u k e k o s a s i s u s e s o t a t i t u t e t o n a

     -------------------------- Buffer: foo --------------------------
     あいうえおかきくけこさしすせそたちつてとな ; 連続する21文字。
     -------------------------- Buffer: foo --------------------------

     C-x u

     -------------------------- Buffer: foo --------------------------
     あいうえおかきくけこさしすせそたちつてとな ; 最後の1文字のみがアンドゥの対象となる。
     -------------------------- Buffer: foo --------------------------

--------- Footnotes ---------

(1)  `buffer-undo-list' にEmacsが挿入したアンドゥの境目の目印を取り除く方法でエミュレートしている。

(2) SKK abbrevモードでは、アスキー文字入力がEmacsオリジナルの
`self-insert-command' により行なわれているので、エミュレートのため
の内部変数である `skk-self-insert-non-undo-count' をインクリメント
することができず、アンドゥをエミュレートできない。しかも、カンマやピリオ
ドを挿入した時点で、`skk-abbrev-comma' や `skk-abbrev-period' 
を使うことになるので、オリジナルのアンドゥの機能も損なってしまう。ただ、
現実問題としては、元来SKK abbrevモードは省略形としての見出し語を挿入する
ためのモードであるので、長い見出し語を挿入することはあまりなく、問題も小
さいと考えられる。

(3) `20'はEmacsのソースファイルの一部である `keyboard.c' に定められ
たマジックナンバーと一致する。

(4) かなモードでの入力中、アスキーモードに移行してタイプした場合などがこ
れにあたるであろう。



File: skk.info, Node: 対になる文字列の一括入力, Prev: 1回のadvertised-undo(undo)の対象, Up: ■モードにおける文字入力

対になる文字列の一括入力
------------------------

例えば、`「' を入力したら、必ずと言って良いほど `」' を後で入力する必要
がでてくる。`「' の入力時点で、対になる文字を自動挿入してくれるとタイプ
数を減らすことができ、入力忘れの防止にもなる。`skk-auto-insert-paren' の
値を `non-nil' にすると、上記の自動挿入を行なう。

     ------ Buffer: foo ------
     彼はこう言った-!-
     ------ Buffer: foo ------

     [

     ------ Buffer: foo ------
     彼はこう言った「-!-」
     ------ Buffer: foo ------

上記のように `「' の入力時点で対となる`」'を自動挿入し、`「'と`」'の間に
ポイントを再配置するので、その位置からかぎかっこに囲まれた文字列を即始め
ることができる。

自動挿入すべきペア文字列は、`skk-auto-paren-string-alist' で指定する。そ
のディフォルト値は下記の通り。

     '(("「" . "」") ("『" . "』") ("(" . ")") ("（" . "）") ("{" . "}")
       ("｛" . "｝") ("〈" . "〉") ("《" . "》") ("[" . "]") ("［" . "］")
       ("〔" . "〕") ("【" . "】") ("\"" . "\"") ("“" . "”") )

各リストの `car' に指定された文字列を挿入すると、`cdr' に指定された文字
列を自動挿入する。このリストの各要素の `car' に指定された文字列は、対に
なる文字列の自動挿入のために、例えアスキー文字であっても 
`skk-input-vector' に指定する必要があるが、この処理はSKKが内部で自動的に
行なっているので、ユーザーが行なう必要はない。既にSKKモードになっている
バッファで `skk-auto-paren-string-alist' を変更した場合は、`C-x C-j' も
しくは `C-x j' を2度タイプして `skk-mode' もしくは `skk-auto-fill-mode' 
を起動し直す必要があるので注意すること。

キーとなる文字の挿入が行なわれても、その挿入後のポイントに自動挿入すべき
文字が既に存在している場合には、自動挿入は行なわれない。

     ------ Buffer: foo ------
     -!-」
     ------ Buffer: foo ------

     [

     ------ Buffer: foo ------
     「-!-」
     ------ Buffer: foo ------


対になる文字を複数挿入したい場合は、引数を渡して文字を指定する。具体例を
述べる。


     C-u 2 [

     ------ Buffer: foo ------
     「「-!-」」
     ------ Buffer: foo ------

このような場合、最初のかぎかっこに対する文章から書き始めることが多いと考
えられるので、ポイントは`「「-!-」」'ではなくて、`「-!-「」」'に再配置さ
れるべきかもしれない。将来のバージョンにて検討する。*Note 拡張アイディ
ア::.

`yatex-mode' など、既に同種の機能が付いているモードがある。そのようなモ
ードにおいてもこの自動挿入の機能が邪魔になることはないと考えるが、そのモ
ードにおいてのみこの機能をオフにしたい場合は、該当のモードに入ったときに
コールされるフックを利用して設定を行なうことができる。

     (add-hook 'yatex-mode-hook
               (function
                (lambda ()
                  (if skk-auto-insert-paren
                      (set (make-local-variable 'skk-auto-insert-paren) nil)))))

特定のモードにおいて、自動挿入すべき文字を変更したい場合にも同様にフック
を用いて操作できる。

     (add-hook 'tex-mode-hook
               (function
                (lambda ()
                  (if skk-auto-insert-paren
                      (progn
                        (make-local-variable 'skk-auto-paren-string-alist)
                        (setq skk-auto-paren-string-alist
                              (cons '("$" . "$") skk-auto-paren-string-alist) ))))))

特定のペアを削除したい場合は、例えば下記のように設定する (1) 。
     (add-hook 'tex-mode-hook
               (function
                (lambda ()
                  (if skk-auto-insert-paren
                      (progn
                        (make-local-variable 'skk-auto-paren-string-alist)
                        (setq skk-auto-paren-string-alist
                              (delete
                               '("$" . "$")
                               (copy-sequence skk-auto-paren-string-alist) )))))))

--------- Footnotes ---------

(1)  何故
`copy-sequence' を使用するのかについては、
*Note 数字や記号文字の入力:: を参照。



File: skk.info, Node: ポイントを戻して▽モードへ, Next: 確定変換とそのアンドゥ, Prev: ■モードにおける文字入力, Up: 便利な応用機能とユーザーオプション

ポイントを戻して▽モードへ
==========================

見出し語の入力を大文字で開始することを忘れた場合の▽マークの付け方につい
ては前述したが (1) 、これを簡略化し、ワンアクションで行なう方法について
説明する。

`M-Q' (2) とタイプするとポイントの直前の文字列について走査し、同種の文字 
(3) が続く限りbackward方向にポイントを戻して▽モードに入り、またポイント
を`M-Q' 入力時の地点に戻す。

     k a n j i

     ------ Buffer: foo ------
     かんじ-!-
     ------ Buffer: foo ------

     M-Q

     ------ Buffer: foo ------
     ▽かんじ-!-
     ------ Buffer: foo ------

変換開始ポイントの走査時には、スペース文字、タブ文字、長音を表わす`ー'は
無条件にスキップされる。但し、ひらがなの場合は`を'の直前で、カタカナの場
合は`ヲ'の直前で変換開始ポイントの走査を止め、▽モードに入る。変換開始ポ
イントを`を'、`ヲ'の直前で止めるのは、文章が`事情を考慮する'のように`×
××を○○○'の形態になっており、`○○○'のみを変換の対象としたい場合が
圧倒的に多いからである。

無引数で `M-Q' を実行した場合は上記のように文字の種類によりポイントを必
要数のみbackward方向へ戻すが、明示的に戻す文字数を指定するには `C-u 5
M-Q' のように引数を渡して実行する。この場合は文字種別を問わず、与えられ
た文字数だけ無条件にポイントを戻す。

なお、backward方向にポイントを戻す途中で行頭に到達した場合は、更に上の行
について行末の文字列から同様の走査を行ない、必要があれば更にポイントを戻
す。`skk-allow-spaces-newlines-and-tabs' の値を `nil' にすることで、行を
超えての走査をやめることができる。

--------- Footnotes ---------

(1)  *Note ▽マークの付け忘れ: ▽モード.

(2) `Q' は大文字で入力する必要がある。

(3) ひらがな、カタカナ、全角アルファベット、アルファベットの4種類のいず
れか。



File: skk.info, Node: 確定変換とそのアンドゥ, Next: 確定アンドゥ, Prev: ポイントを戻して▽モードへ, Up: 便利な応用機能とユーザーオプション

確定変換とそのアンドゥ
======================

確定変換を行なうプログラム `skk-search-kakutei-jisyo-file' と 確定辞書 
`skk-kakutei-jisyo' については前節で述べたが、ここではその動作について具
体的に説明する。例えば、

     せつめい /説明/

というエントリが確定辞書にあったとすると、

     S e t u m e i

     ------ Buffer: foo ------
     ▽せつめい
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     説明
     ------ Buffer: foo ------

のように確定動作をすることなしに(暗黙の確定もなく) いきなり確定する。仮
に確定辞書に

     じしょ /辞書/

というエントリを挿入してしまったが、`自署'に変換したい場合は、確定直後に 
`x' をタイプすることにより確定変換をアンドゥして▽モードに戻ることができ、
次に SPC をタイプしたときは、確定辞書は検索を行なわないので、個人辞書、
あるいは共有辞書に

     じしょ /自署/

のエントリがあれば`自署'への変換を行なうことができる。


     Z i s y o SPC

     ------ Buffer: foo ------
     辞書
     ------ Buffer: foo ------

     x

     ------ Buffer: foo ------
     ▽じしょ
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼自署
     ------ Buffer: foo ------




File: skk.info, Node: 確定アンドゥ, Next: 見出し語関連, Prev: 確定変換とそのアンドゥ, Up: 便利な応用機能とユーザーオプション

確定アンドゥ
============

一番最後に行なった変換についての確定をアンドゥして、再変換を行なうことが
できる。これを「確定アンドゥ」という。確定変換のアンドゥと混同しないこと。

下記に例を示す。辞書エントリが

     こうこう /高校/孝行/航行/

のようになっているとする。

     K o u k o u SPC

     ------ Buffer: foo ------
     ▼高校
     ------ Buffer: foo ------

     s u r u

     ------ Buffer: foo ------
     高校する-!-
     ------ Buffer: foo ------

     M-x skk-undo-kakutei

     ------ Buffer: foo ------
     ▼孝行-!-する
     ------ Buffer: foo ------

`高校'の確定についてアンドゥしたので、辞書の第一候補である`高校'をスキッ
プして、次候補である`孝行'の変換を行なっている。候補`孝行'について▼モー
ドに入ったところで、▼モードにおいて通常の変換で`孝行'を得た時点と全く同
一の状態にあるので、更に SPC を押してこの例での次候補である`航行'を変換
により求めたり、更にもう一度 SPC を押して辞書登録モードに入ることもでき
る。

確定した直後(上記の例では、送り仮名である`する'の入力のための `s' の入力
前) でなくともアンドゥが可能である。より正確には、次の新たな確定 (1) を
行なうまではアンドゥに関する情報が保持されているので、アンドゥが可能であ
る。

変換、確定に関連しない文字列は、確定アンドゥを行なっても削除されない。上
記の例では、`する'がそのままカレントバッファに残っていることに注意。

--------- Footnotes ---------

(1)  `C-j' をタイプして明示的に確定した場合は勿論、
暗黙の確定を行なった場合も同様である。



File: skk.info, Node: 見出し語関連, Next: 送り仮名関連, Prev: 確定アンドゥ, Up: 便利な応用機能とユーザーオプション

見出し語関連
============

* Menu:

* 見出し語の補完::              
* 見出し語を補完しながら▼モードへ::  
* 空白・改行・タブを含んだ見出し語の変換::  
* カタカナの見出し語::          



File: skk.info, Node: 見出し語の補完, Next: 見出し語を補完しながら▼モードへ, Prev: 見出し語関連, Up: 見出し語関連

見出し語の補完
--------------

▽モードで TAB を押すと、見出し語(▽モードにおける入力文字列)に対する補
完が行われる。TAB を押す直前に▽モードで入力された文字列をσとすると、個
人辞書 (1) の送りなしエントリの中で、先頭がσと一致し長さがσよりも長い
見出し語を捜して、そのようなτがもしあれば、σの代わりにτが表示される。
見出し語の補完を上手に利用することで、タイプ数を減らすことができる。


▼モードで変換を行なった語の見出し語について、時間的に新しいものから先に
補完が行なわれる。例えば、`斉藤'、`佐藤'の順で変換した後、`さ'をキーにし
て見出し語の補完を行なうと、最初に`さとう'が、その次に`さいとう'が補完さ
れる。補完が意図したものでなかったときには TAB の直後に `.' (ピリオド)を
タイプすると2番目の見出し語が表示される。以下同様に `.' を続けてタイプす
ると、見出し語の候補が順次表示される。意図した見出し語を通りすぎたときは 
`,' (コンマ)で前の候補に戻る。

     S a t o u SPC C-j

     ------ Buffer: foo ------
     佐藤
     ------ Buffer: foo ------

     S a

     ------ Buffer: foo ------
     ▽さ
     ------ Buffer: foo ------

     TAB

     ------ Buffer: foo ------
     ▽さとう
     ------ Buffer: foo ------

     `.'

     ------ Buffer: foo ------▽さいとう (2) ------ Buffer: foo ------

     `,'

     ------ Buffer: foo ------
     ▽さとう
     ------ Buffer: foo ------

     SPC

     ------ Buffer: foo ------
     ▼佐藤
     ------ Buffer: foo ------

     C-j

     ------ Buffer: foo ------
     佐藤
     ------ Buffer: foo ------

なお、個人辞書の検索は、見出し語を得るために行なわれるので、一旦 SPC を
タイプして▼モードに入れば `skk-search-prog-list' の順に候補が検索される
(`skk-search-prog-list' で個人辞書の前に検索を行なうように設定されている
検索もスキップせずに行なう)。例えば、`skk-search-prog-list' で確定変換を
行なう設定を行なっており、確定辞書にその見出し語があれば、見出し語を補完
した際にも確定変換が行なわれる。

`skk-dabbrev-like-completion' の値を `non-nil' にすることで、`.' で2番目
以降の補完を行なったときに、最初に補完された語について補完が行われる。つ
まり上記の例では`さ'に対し、最初に補完された語は、`さとう'であるので、以
後の補完は、`さとう'を含む語(例えば、`さとうせんせい'など) について行な
われる。

--------- Footnotes ---------

(1)  共有辞書はサーチされない。共有辞書では一般
的に先頭の文字を共通にする見出し語が多すぎて、望みの補完が行なえる可能性
が低いからである。

(2) `さとう'の次に補完される見出し語は、個人辞書の内容に依存す
る。



File: skk.info, Node: 見出し語を補完しながら▼モードへ, Next: 空白・改行・タブを含んだ見出し語の変換, Prev: 見出し語の補完, Up: 見出し語関連

見出し語を補完しながら▼モードへ
--------------------------------

前節で見出し語の補完について述べたが、その見出し語の補完動作を行なった後、
SPC をタイプし、▼モードに入るまでの動作をワンアクションで行なうことがで
きる。補完される見出し語が予め把握できている状況では、キータイプがワンア
クション省略できる。長い見出し語の専門用語を連続して入力する場合などに威
力を発揮する。

     K a s i t a n n p o s e k i n i n n

     ------ Buffer: foo ------
     ▽かしたんぽせきにん
     ------ Buffer: foo ------

     SPC, RET

     ------ Buffer: foo ------
     瑕疵担保責任
     ------ Buffer: foo ------

     K a

     ------ Buffer: foo ------
     ▽か
     ------ Buffer: foo ------

     M-SPC

     ------ Buffer: foo ------
     ▼瑕疵担保責任
     ------ Buffer: foo ------




File: skk.info, Node: 空白・改行・タブを含んだ見出し語の変換, Next: カタカナの見出し語, Prev: 見出し語を補完しながら▼モードへ, Up: 見出し語関連

空白・改行・タブを含んだ見出し語の変換
--------------------------------------

下記のようにオートフィルモードで折り返された文字列に対し、折り返された状
態のまま変換を行なうことができる。

     ---------------- Buffer: foo ------------------
     仮名漢字変換プログラムをさ
     くせいしました。-!-
     ---------------- Buffer: foo ------------------

     C-u 10 C-b Q

     ---------------- Buffer: foo ------------------
     仮名漢字変換プログラムを▽-!-さ
     くせいしました。
     ---------------- Buffer: foo ------------------

     C-u 5 C-f

     ---------------- Buffer: foo ------------------
     仮名漢字変換プログラムを▽さ
     くせい-!-しました。
     ---------------- Buffer: foo ------------------

     SPC

     ---------------- Buffer: foo ------------------
     仮名漢字変換プログラムを▼作成-!-しました。
     ---------------- Buffer: foo ------------------

上記の例では改行だが、空白、タブ文字を中間に含む文字列に対しても変換を行
なうことができる。`skk-allow-spaces-newlines-and-tabs' の値を `nil' にす
ることで2行以上にまたがる文字列に対する変換を禁止することができる。



File: skk.info, Node: カタカナの見出し語, Prev: 空白・改行・タブを含んだ見出し語の変換, Up: 見出し語関連

カタカナの見出し語
------------------

`q' によりかなモード、カナモードを度々切り替えて入力を続けていると、カナ
モードで誤って▼モードに入ってしまうことがあるので、カナモードで▼モード
に入ろうとすると、まず見出し語をひらがなに変換するように設計されている。

更に、送りあり変換で、送り仮名もカタカナにしたい場合については、*Note カ
ナモードでの変換の送り仮名の処理:: を参照のこと。

あまりないケースだとは思うが、見出し語をカタカナのまま残して変換を行ない
たい場合には SPC に代えて `C-u SPC' のように `SPC' に数値引数を渡せば良
い。



File: skk.info, Node: 送り仮名関連, Next: 自動変換開始, Prev: 見出し語関連, Up: 便利な応用機能とユーザーオプション

送り仮名関連
============

* Menu:

* 送り仮名の厳密なマッチ::      
* 送り仮名の自動処理::          
* 送りあり変換の変換開始のタイミング::  
* カナモードでの変換の送り仮名の処理::  



File: skk.info, Node: 送り仮名の厳密なマッチ, Next: 送り仮名の自動処理, Prev: 送り仮名関連, Up: 送り仮名関連

送り仮名の厳密なマッチ
----------------------

例えば、個人辞書に

     おおk /大/多/[く/多/]/[き/大/]/

という送りありエントリがあれば `O o K i i SPC' とタイプした場合、標準で
は`大きい'と`多きい'という 2 通りの候補が出力可能であるが、この内`多きい'
を選択することは有り得ない。送りあり変換で、見出し語が同じ文字列であって
も選択する可能性のある候補とない候補が混在している場合が多く、更に候補の
絞り込みをしたいという要請が出てくる。

変数 `skk-henkan-okuri-strictly' の値を `non-nil' にすると、見出し語がマッ
チするかどうかのチェックの上に、送り仮名がマッチするかどうかのチェックが
行なわれ、送り仮名がマッチしない候補を出力しない。上記の場合では、送り仮
名`き'がマッチする`大きい'のみを出力し、`多きい'を出力しない。個人辞書の
送りありエントリが充実しておれば、標準の設定よりも候補が絞り込まれるので
変換効率がアップするが、個人辞書の送りありエントリが充実していなければ、
すぐに辞書登録モードに入ってしまい逆効果となる。

このユーザーオプションは `skk-process-okuri-early' の値を `non-nil' にし
た状態と共存できない。詳細は*Note 送りあり変換の変換開始のタイミング:: 
を参照のこと。メニューバーを使用してこのユーザーオプションをオンにすると、
自動的に `skk-process-okuri-early' の値を `nil' にすることができる。

変数 `skk-henkan-okuri-strictly' の値を `non-nil' にすると、辞書登録モー
ドに入っても送り仮名のマッチが厳密に行なわれるので、辞書登録時に漢字を得
るのに一苦労する羽目になる。下記のようにフックを設定することで辞書登録時
のみ、一時的に送り仮名の厳密なマッチをしないようにすることができる (1) 
。

     (add-hook 'minibuffer-setup-hook
               (function
                (lambda ()
                  (if (and (boundp 'skk-henkan-okuri-strictly)
                           skk-henkan-okuri-strictly
                           (not (eq last-command 'skk-purge-jisyo)) )
                      (progn
                        (setq skk-henkan-okuri-strictly nil)
                        (put 'skk-henkan-okuri-strictly 'temporary-nil t) )))))

     (add-hook 'minibuffer-exit-hook
               (function
                (lambda ()
                  (if (get 'skk-henkan-okuri-strictly 'temporary-nil)
                      (progn
                        (put 'skk-henkan-okuri-strictly 'temporary-nil nil)
                        (setq skk-henkan-okuri-strictly t) )))))

下記のように設定できればもっと簡潔なのだが、`skk-henkan-okuri-strictly' 
の値は辞書バッファで参照されるために、ミニバッファのバッファローカル値を
変更しても狙った効果は得られないので注意すること。

     (add-hook 'minibuffer-setup-hook
               (function
                (lambda ()
                  (if (and (boundp 'skk-henkan-okuri-strictly)
                           skk-henkan-okuri-strictly )
                      (set (make-local-variable 'skk-henkan-okuri-strictly)
                           nil )))))

将来のバージョンでは、これを改良し、辞書バッファでの動作に影響するユーザ
ー変数をバッファローカル化できるようにする予定である。*Note 拡張アイディ
ア::.

--------- Footnotes ---------

(1)  `minibuffer-setup-hook' と 
`minibuffer-exit-hook' はEmacs 19でのみ使用可能なフック



File: skk.info, Node: 送り仮名の自動処理, Next: 送りあり変換の変換開始のタイミング, Prev: 送り仮名の厳密なマッチ, Up: 送り仮名関連

送り仮名の自動処理
------------------

* Menu:

* どのように変換されるか::      
* 辞書登録の際に注意すべきこと::  



File: skk.info, Node: どのように変換されるか, Next: 辞書登録の際に注意すべきこと, Prev: 送り仮名の自動処理, Up: 送り仮名の自動処理

どのように変換されるか
......................

変数 `skk-auto-okuri-process' を `non-nil' にセットすると、文法的な知識
を用いない送り仮名の自動処理が行なわれる。送り仮名の最初のローマ字表現を
大文字で始める必要がない (1) という利点があるが、同時にユーザがシステム
に与える情報が少なくなるので、意図しない変換をされる割合が増えるという欠
点がある。また下記に述べるようにこの自動処理は個人辞書に依存しているので、
個人辞書の送りありエントリが貧弱な場合は、自動処理ができない可能性が高い。
ただ、`skk-auto-okuri-process' を `non-nil' にセットしていても、送り仮名
の開始位置を大文字のキーをタイプして明示的に指定することも可能であり、か
つ、送り仮名を明示した場合の変換には影響を与えないので、送りなし変換で意
図しないものまで拾う可能性がある他はデメリットもなく、むしろ送り仮名を正
確に思い出せない場合に送り仮名を指定しなくとも変換できるメリットがあるの
で、この変数の値を常に `non-nil' にするのも良い選択かもしれない (2) 。


例えば、 `T a t i a g e r u SPC' とタイプした場合、`たちあげる'という見
出し語に対し、送り仮名を明示されていないので、まず送りなし変換として扱い
辞書を検索する。このときは、通常の変換同様、個人辞書及び指定された共有辞
書他を検索する。通常はそのような見出し語はないので、今度は個人辞書のみを
検索の対象として、見出し語を最後尾から1文字づつ切り詰め、「切り詰めの結
果残った文字列」と、「切り捨てられた先頭の文字のローマ字プレフィックス」
を連結した文字列を送りあり変換の見出し語として、検索する。この例において
検索される見出し語の変化を追うと、

     `たちあげる' => `たちあげr' => `たちあg'
     => `たちa' => `たt'

のようになる。仮に個人辞書エントリが、

     たちあg /立ち上/[げ/立ち上/]/[が/立ち上/]/
     たt /建/断/経/立/[つ/建/断/経/立/]/[ち/建/断/経/立/]/[て/経/立/建/]/

の2つのエントリを含むとすると、見出し語を後方から順に切り詰める過程で`た
ちあg'と`たt'の2つの見出し語の検索時にこれらの辞書エントリがマッチする。

次に、マッチしたエントリの各候補に対し、切り捨てられた先頭の文字を送り仮
名として取るかどうかをチェックする。`たちあg'の場合の送り仮名チェックの
対象は、切り捨てられた最初の文字の`げ'であるので、

     [げ/立ち上/]

の部分のみに注目する。また、`たt'の場合の送り仮名チェックの対象は、`ち'
であるので、

     [ち/建/断/経/立/]

のみに注目する。もうお分りのように、マッチする見出し語に対しチェックする
のは送り仮名ブロック部分だけであり、送り仮名に対応していない全候補を含む
部分(`たt' の場合は、候補の最初の `/建/断/経/立/' の部分)は単に無視され
る。

送り仮名がマッチする候補`立ち上'、`建'、`断'、`経'、`立'の5つを文字列の
長さ順に昇順にソートし、それぞれの候補と該当の見出し語から切り捨てられた
文字列と連結したもの(「該当の見出し語から切り捨てられた文字列」を送り仮
名とみなして処理している。)を、送り仮名の自動処理の最終候補として返す。
上記の例では、`立ち上げる'、`建ちあげる'、`断ちあげる'、`経ちあげる'、
`立ちあげる' の5つが最終候補である。長さ順にソートするのは、変換された部
分がより長い候補を先順位として出力するためである。上記の例の`立ち上げる'
と`建ちあげる'とでは、`立ち上げる'の方が変換された部分が長いので、`立ち
上げる'を`建ちあげる'より先順位で出力する。

--------- Footnotes ---------

(1)  *Note 送り仮名の入力: ▼モード.

(2) 専ら補完的に自動送り処理を利用するのであれば、
`(skk-okuri-search)' を`skk-search-prog-list' の最後にもってく
るのが良いであろう。



File: skk.info, Node: 辞書登録の際に注意すべきこと, Prev: どのように変換されるか, Up: 送り仮名の自動処理

辞書登録の際に注意すべきこと
............................

個人辞書に見出し語`わたs'についてのエントリが全くない場合、あるいは個人
辞書のエントリが

     わたs /渡/[し/渡/]/

のような送り仮名のブロックを持たない場合、`W a t a s i t a SPC' とタイプ
すると、送り仮名のマッチができないので、候補の選定ができず辞書登録モード
に入る。

     W a t a s i t a SPC 

     ------ Buffer: foo ------
     ▼わたした
     ------ Buffer: foo ------

     ------ Minibuffer -------
     わたした-!-
     ------ Minibuffer -------

辞書登録モードで `W a t a S i t a RET' と送り仮名を明示的にタイプし、`渡
した'と変換し登録する。この場合、登録する語の最後が平仮名で終るので、そ
の最後の平仮名の文字列(上記の例では、`した')が見出し語の最後と一致するか
を調べ、一致する場合には、辞書の登録を送りありエントリとして行なうのかど
うかの確認を求めてエコーエリアにプロンプトを出す (1) 。

     W a t a S i t a 
     ------ Minibuffer -------
     わたした 渡した
     ------ Minibuffer -------

     RET

     -------------------------- Echo Area --------------------------
     Shall I register this as okuri-ari entry: わたs /渡/ ? (y or n)
     -------------------------- Echo Area --------------------------

プロンプトに対し、 `y' と回答した場合は、

     わたs /渡/[し/渡/]/

という辞書エントリが個人辞書の送りありエントリに書き込まれる。`n' で回答
した場合は、個人辞書の送りなしエントリに

     わたした /渡した/

というエントリが書き込まれてしまうので、この例では適当でない。

送り仮名部分をローマ字プレフィックスに分解する際には、ユーザー変数 
`skk-kana-rom-vector' の値が参照される。この変数のディフォルト値は、下記
の通り。

     ["x" "a" "x" "i" "x" "u" "x" "e" "x" "o" "k" "g" "k" "g" "k" "g"
      "k" "g" "k" "g" "s" "z" "s" "j" "s" "z" "s" "z" "s" "z" "t" "d"
      "t" "d" "x" "t" "d" "t" "d" "t" "d" "n" "n" "n" "n" "n" "h" "b"
      "p" "h" "b" "p" "h" "b" "p" "h" "b" "p" "h" "b" "p" "m" "m" "m"
      "m" "m" "x" "y" "x" "y" "x" "y" "r" "r" "r" "r" "r" "x" "w" "x"
      "x" "w" "n"]

このベクトルは、それぞれ下記のかな文字をそのローマ字プレフィックスで現わ
したものである。

     ぁ  あ  ぃ  い  ぅ  う  ぇ  え  ぉ  お  か  が  き  ぎ  く  ぐ
     け  げ  こ  ご  さ  ざ  し  じ  す  ず  せ  ぜ  そ  ぞ  た  だ
     ち  ぢ  っ  つ  づ  て  で  と  ど  な  に  ぬ  ね  の  は  ば
     ぱ  ひ  び  ぴ  ふ  ぶ  ぷ  へ  べ  ぺ  ほ  ぼ  ぽ  ま  み  む
     め  も  ゃ  や  ゅ  ゆ  ょ  よ  ら  り  る  れ  ろ  ゎ  わ  ゐ
     ゑ  を  ん

従い、ディフォルトでは、例えば見出し語中の送り仮名の`じ'は、`j' に、`ち'
は、`t' に、`ふ'は、`h' のローマ字プレフィックスに分解される。これらの送
り仮名のローマ字プレフィックスをそれぞれ `z'、`c'、`f' に変更したい場合
は、該当の個所を "z"、"c"、"f" とするようなベクトルを `.emacs' や `.skk' 
に書いておく。

`ありがさつき'に対し`有賀さつき'を登録したい場合は、上記と同様に辞書登録
をし、

     Shall I register this as okuri-ari entry: ありがs /有賀/ ? (y or n)

のプロンプトに対し `n' と回答する。この結果、個人辞書の送りなしエントリ
には、

     ありがさつき /有賀さつき/

というエントリが書き込まれる。

--------- Footnotes ---------

(1)  `y-or-no-p' はミニバッファを使用しているのではなく、エコー
エリアにプロンプトを表示して次の1文字を待っている。`yes-or-no-p' は
ミニバッファを使用している。



