avy-menu 20170518.2245(in MELPA)
Library providing avy-powered popup menu

概要

<2016-10-19 Wed>キーを設定する方法を追記

候補選択インターフェースはたくさんありますが、
少数の候補を選択する場合にhelm等は大袈裟ではないでしょうか。
かといってダイアログボックスが好きなEmacsユーザはそんなにいないと思います。
キーボード操作が主体のEmacsにおいては、やはりキーボード選択メニューが好まれます。

キーボード選択メニューは、one-key.elや123-menu.elなどがありましたが、
今ならばこのavy-menu.elがいい感じです。
avy.elはace-jump-mode.elの後継として汎用的に使えるように再設計されました。

エントリポイントはavy-menu関数です。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてavy-menuを使う方は
以下のコマンドを実行します。

M-x package-install avy-menu

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name avy-menu

シンプルな使用例 161018111644.avy-menu-1.el(以下のコードと同一)

(defun avy-menu-1 ()
  (interactive)
  (message "Answer: %d"
           (avy-menu "*avy-menu-1*"     ;バッファ名
                     '("メニュー"       ;メニューの名前
                       (""      ;セクション名(1つならば空文字列でよい)
                        ;; 表示文字列と値のペア…
                        ("Print one" . 1)
                        ("Print two" . 2))))))

20161018112138.png
Fig1: M-x avy-menu-1

20161018112142.png
Fig2: aを押して選択した結果

ちょっと複雑な使用例 161018112241.avy-menu-2.el(以下のコードと同一)

(defun avy-menu-2 ()
  (interactive)
  (eval (avy-menu
         "*avy-menu-2*"
         '("メニュー"
           ("ファイル・ディレクトリを開く"
            ;; 値にS式を指定してevalで評価させる
            ("find init.el" . (find-file "~/.emacs.d/init.el"))
            ("open home directory" . (find-file "~/")))
           ("メッセージを表示する"
            ("message" . (message "ok"))))
         ;; 第3引数をtにすることでセクション名も表示する
         t)))

20161018112517.png
Fig3: M-x avy-menu-2

<2016-10-19 Wed>メニューごとにキーを設定する 161019135329.avy-menu-3.el(以下のコードと同一)

現時点のavy-menuには、メニューごとにキーを設定する機能が存在しません。
その代わりavyそのものの変数avy-keysをローカル変数にすることでそれが可能になります。

avy-keysは文字のリストを指定しますが、appendに文字列とnilを渡して作成する方法もあります。

(append "12" nil)                       ; => (49 50)
'(?1 ?2)                                ; => (49 50)
(defun avy-menu-3 ()
  (interactive)
  ;; 1,2をキーにする
  (let ((avy-keys (append "12" nil)))
    (message "Answer: %d"
             (avy-menu "*avy-menu-3*"
                       '("メニュー"
                         (""
                          ("Print one" . 1)
                          ("Print two" . 2)))))))

20161019135816.png
Fig4: M-x avy-menu-3

実行方法

$ wget http://rubikitch.com/f/161019135329.avy-menu-3.el
$ emacs -Q -f package-initialize -l 161019135329.avy-menu-3.el

本サイト内の関連パッケージ


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。