[Mew-dist 08030] completion

Ken-ichi Yamamoto ( 山本 賢一 ) yamamoto at example.com
1999年 3月 12日 (金) 03:19:53 JST


やまもと@コナミです。
不採用になりかけているのに、長文になってしまいました。

in [Mew-dist 07911]
    > コンプリーション
    > ----------------
    >     3つのトリガ C-n, TAB, コンマ が考えられる。
    >     C-n: circulateする方法が好みでないという意見があった。
in [Mew-dist 08007]
    > * ","、"C-n"、"M->" などで展開すべきか?
    >     → やらない方がよい
    >     → やりたい人は自分でプログラムを書いてね
    >     → 部分文字列の候補がある場合は、
    >         「"@" を入力すると展開できるよ」
    >         とメッセージを出す。

以下は私の意見です。

C-n, ',', M-> (以後「展開コマンド」と呼びます)では、circulate しません。
もともと、部分文字列の候補がある場合に、@ TAB で展開させるのは直観的でないと
の理由から、mail-abbrev モードを参考に提案した機能です。

ですから、別名定義に
     mine:  m-sakura at example.com 
     mineo: mineo at example.com
とあった場合、mine[展開コマンド] は前者の m-sakura… に展開されます。(その後、
そのキーがもともと持っている機能、例えば一行下への移動や , の入力が行われま
す。)
"mine" まで打った後、その文字列で展開しろという意味で C-n や , を入力したと
考えられるからです。


ここまでは問題ないと思います。さて、別名に一致しない場合はどうするか。

ここから先は以下の別名定義(だけ)があるものとして話を進めます。
     mine:  m-sakura at example.com 
     mineo: mineo at example.com
     naomi: kiyota at example.com 
     naoko: tanaka at example.com
     yama:  yamamoto at example.com

(0) まず、全くその文字列で始まる別名定義がない場合

特にウォーニングを出すでもなく、そのキーの本来の機能を実行します(next-line 
や , の挿入です)。
(変化がないのですから、別名展開を期待していた入力者は、自分の間違いに気付く
でしょう)


(1) 展開コマンドを入力した時点で、その文字列で始まる別名定義が *単独* で存在
    した場合 (ya[展開コマンド]とした場合)。

まずコンプリーションを行い、その結果が他の別名の部分文字列でなければ(つまり 
ya で始まる候補が他にない時)、そのコンプリーション結果を元に別名展開を行います。
ya → (yama) → yamamoto at example.com


(2) その文字列で始まる別名定義が *複数* あった場合
    (na[展開コマンド]とした場合)

コンプリーションによって文字列を補完し na を nao にするだけで、next-line や , 
の挿入を行います。    na → nao
期待した別名展開が行われなかったことに気付いた入力者は、文字列の直後に戻って 
TAB を入力し、候補を調べるでしょう。


(3) 最後にコンプリーション結果が、ひとつの別名定義に一致しつつ、ほかの別名定
    義の部分文字列だった場合。(mi[展開コマンド]とした時です)

ここが少し悩み所でして、
  (a) (2) と同様に振る舞う。つまりコンプリーションによって文字列を補完し
      mi を mine にするだけで、next-line や , の挿入を行います。
          mi → mine
  (b) mine を得た時点で、それを元に別名展開を行います。
          mi → (mine) → m-sakura at example.com
の 2 通りが考えられます。

(a) の場合、展開コマンドに ',' を使ったとして mine, となってしまったのを 
m-sakura… に展開する為にはポイントを mine の直後(,の上)に置いて(ここで TAB 
で候補を確認するかも知れません) , を削除してもう一度 , を入力し直すという変
な手順を強いられます。(あくまでも @TAB は使わないとして)
(展開コマンドに C-n を使った場合はポイントを mine の直後にまで持ってきて再度 
C-n を入力という、これもまた変な手順になります)

(b) の場合は、入力者が mine ではなく mineo からの展開を期待していた場合不都
合が起こります。期待しない展開になっていることに気付かないかも知れませんし、
気付いたとしても、その修正は、C-_(undo) TAB(候補を確認) o(mineoの最後のo)
[展開コマンド] となるでしょう。undo を使うことに気が付かなければ(初心者にあ
りがちです) ^?(delete-backward-char) などで全部消してやり直しをするかも知れ
ません。

私は、どちらかというと (b) が良いように思います。(a) の修正手順にはどうも違
和感を覚えます。(b) の「期待しない展開に気付かないかも知れない」という問題点
は、*Mew completions* を開き mine と mineo を表示することでコンプリーション
過程を入力者に知らせ、候補が 2 つあったことを示すことで回避できるのではない
かと思います。
----------------------------------------------------------------

C-n, ',', M-> の展開に際して、問題となるのは (3) のケースだけだと思いますの
で、そこが違和感のない動作になるのであれば、実装して頂いたほうが幸せになれる
人が増えるのではないでしょうか。
(TAB を入力することなく、エイリアスの一部と「展開コマンド」を入力するだけで
すばやくアドレスを入力することが出来ます)

  この実装を個人でプログラムを書くのは少し酷なような気がします。
(ちょっと考えてみましたが、関数の組み合わせでどうにかなるような動作ではない
です)

なんとか、採用して頂きたく、みなさんのご意見をお待ちしております。

=========================  KONAMI Co.,Ltd. =========================
  「そこからがおもしろいんだよ」  山本 賢一 yamamoto_kenichi at example.com
================      Ken'ichi Yamamoto driving CEFIRO     ===============



Mew-dist メーリングリストの案内