複数候補を選択して補完できる動的略語展開 dabbrev-expand-multiple

これは, 動的略語展開の候補を複数表示して, その中から補完できるようにするものです.
とりあえず, 目的としていた機能の主要な部分の実装は終わりました.
まだまだ, バグを含んでいると思われ, 誤動作する可能性があると思います.
使ってみようという場合には, そこらへん了承の上お願いします.
# まだまだ大丈夫か不安・・・.

動作


関数の動作としては, 以下のようなものになります.

  • ある語について, dabbrev-expand-multiple を起動すると, まず, 通常の dabbrev-expand と同様に動作.
  • dabbrev-expand-multiple を起動したキー, もしくは, M-/ を押すと, 複数の補完候補があれば, それを表示する.
  • その後, M-/, SPC もしくは, dabbrev-expand-multiple を起動したキーを押すと, 次の補完候補(あれば)を表示する.
  • x もしくは, Backspace を押すと, 1つ前の補完候補を表示する.
  • それ以外のキーを押すと, 実行が終了する.

複数候補の表示は, tooltip とインライン表示の2つの方法で行われます.
デフォルトでは, tooltip での表示となります.
また, ミニバッファ上でこの関数を実行した場合, ミニバッファ全体に補完候補を表示します.
一度に表示される補完候補の数は, デフォルトで 3 つです.


現在分かっている問題点として, tooltip 使用時にあまりに速く, x や SPC を押して,
候補をサイクルさせると tooltip が表示されなくなるということがあります.
特に x で前の候補を見るときに問題が起きやすいみたいです. なんでだろう・・・.

設定例

このエントリ下部にある, コードを直接 .emacs に貼り付けて下さい.
# 300行越えてるから, provide 書いて, パッケージにした方が良かったかなあ・・・.
このエントリ下部, ソース項目にあるリンクより, dabbrev-expand-multiple.el パッケージをダウンロードして下さい.
あとは, 下に記述してあるように,
(require 'dabbrev-expand-multiple) として, 読み込み,
そして, 起動させたいキーに dabbrev-expand-multiple を割り当てれば, OK です.
既存の dabbrev-expand を潰してしまってもいいならば, 以下のようなになります.

(require 'dabbrev-expand-multiple)
(global-set-key "\M-/" 'dabbrev-expand-multiple)

細かな設定は, 以下のようになります.

;; 補完候補を一度に5つにする.
(setq dabbrev-expand-multiple-select-keys '("a" "s" "d" "f" "g"))
;; 複数候補表示に移るキーに m を足す.
(add-to-list 'dabbrev-expand-multiple-multi-selection-keys "m")
;; 複数候補表示時に次の候補表示に使用するキーに n を足す.
(add-to-list 'dabbrev-expand-multiple-next-keys "n")
;; 複数候補表示時に前の候補表示に使用するキーに p を足す.
(add-to-list 'dabbrev-expand-multiple-previous-keys "p")
;; ツールチップを表示する秒数.
(setq dabbrev-expand-multiple-tooltip-timeout 2000)
;; 10秒で消えるように設定する.
(setq dabbrev-expand-multiple-tooltip-timeout 10)
;; ツールチップの見た目の設定 M-x list-colors-display を参考に設定する.
(setq dabbrev-expand-multiple-tooltip-params
      '((foreground-color . "grey75")
        (background-color . "navy blue")
        (border-color . "black")))
;; 最初に展開した文字列に highlight をかける.
(setq dabbrev-expand-multiple-highlight-face 'highlight)
;; インライン表示のときに使用するフェイス.
(setq dabbrev-expand-multiple-inline-show-face 'underline)
;; インライン表示の見た目の変更 (アンダーラインをなしにする)
(setq dabbrev-expand-multiple-inline-show-face nil)
;; ツールチップを使用しない(インライン表示をする)
(setq dabbrev-expand-multiple-use-tooltip nil)

timeout は, ツールチップを表示する秒数です.
inline 表示にタイムアウトはありません.
dabbrev-expand-multiple-multi-selection-keys や dabbrev-expand-multiple-next-keys,
dabbrev-expand-multiple-previous-keys を nil に設定すると, キー設定が消えてしまうので注意して下さい.

やりたい事

  • 設定できる変数を defvar から, defcustom にする.(*完了しました*)
  • このページ( http://namazu.org/~tsuchiya/elisp/dabbrev-ja.el ) の設定を移植し, 日本語を含む文でも使い易くする.(*完了しました*)

あとは, dabbrev-highlight のように, 補完元を強調できれば面白いと思いますが, 実装するとしてもずっと先になりそうです.
また, パッケージ化したので, 頭の説明も書かないと. こっちが先かな.(*ほぼ完了しました*)

ソース

以下の URL よりダウンロードして下さい.

このソースの作成にあたって, 特に SKK を参考にさせて頂き, 一部の関数をほぼそのまま持ってこさせてもらいました.
また, dabbrev-ja.el の dabbrev-expand へのアドバイスも, dabbrev-expand-multiple へのアドバイスとしたのみで,
そのまま持ってこさせて頂きました.
これら, SKK は, SKKdabbrev-ja.el は, dabbrev-ja.el の作者さんに当然ですが, copyright があります.

コメント


最新版では, plus さん提供のパッチがあてられ, ソースコードの最適化が行われています.
これに伴い, 変数や関数の名前に変更があります. 詳しくは, 下の変更点の項目に書いてあります.

変更点

バージョン 1.0.1 から, バージョン 1.1.0 での主な変更点
  • dabbrev-expand-multiple-main 関数内で再帰処理していたのをwhileループに変換した.
バージョン 1.0.0 から, バージョン 1.0.1 での主な変更点
  • plus さんによるパッチを適用
    • キー設定で, "\M-/" のような文字列での設定だけでなく, ?\M-/, (meta /), [(meta /)] のようなイベント, リスト, ベクタでも設定できるようになった.
    • 上記の結果, Hyperキー Superキーを設定することも可能となっている.
バージョン番号なしから, バージョン 1.0.0 での主な変更点
  • plus さんによるパッチでの変更点
    • 変数名の変更, dabbrev-expand-multiple-select-key から dabbrev-expand-multiple-select-keys へ.
    • 変数名の変更, dabbrev-expand-multiple-to-multi-key から dabbrev-expand-multiple-multi-selection-keys へ.
    • 変数名の変更, dabbrev-expand-multiple-next-key から dabbrev-expand-multiple-next-keys へ.
    • 変数名の変更, dabbrev-expand-multiple-previous-key から dabbrev-expand-multiple-previous-keys へ.
    • 変数名の変更, dabbrev-expand-multiple-timeout から dabbrev-expand-multiple-tooltip-timeout へ.
    • 1つの略語の展開から, 複数候補選択を表示するのに, SPC も使えていたが, これを削除.
    • 新規略語を取得できなかったとき次候補を選択しても, 関数の実行が終了しなくなった.
  • khiker による変更点.
    • バージョン番号の付与. 1.0.0 とした.
    • ライブラリヘッダに説明文を付与した.
    • 一部コメントを下手な英語に翻訳した.

更新時刻

  • 1かいめ 2007年, 8月18日, 4:03
  • 2かいめ 2007年, 8月19日, 5:00
  • 3かいめ 2007年, 8月19日, 14:09
  • 4かいめ 2007年, 8月20日, 16:00