mag-menu 20150505.1150(in MELPA)
Intuitive keyboard-centric menu system

概要

<2016-09-21 Wed>今はmagit-popupパッケージとして本家がメニューライブラリとして独立させています。

MELPAダウンロードランキングNo.1は magit ですが、
なぜこんなに人気が高いのでしょうか?

その理由は、複雑きわまりないgitのほぼ全機能を
非常に使いやすいメニューインターフェースで扱えることです。

まだ使ったことのない人は使ってみてください。

メニューの出来に驚くはずです。

スイッチをonにしたら、そのスイッチの部分が
赤くなって有効になったことがわかります。

また、引数を入力したら、それがメニューに反映されます。

つまり、すべてのコマンドラインオプションをメニューで操作でき、
長いオプションも書いているからgitそのものも習得できるという
一石二鳥、最強のメニューインターフェースといえます。

20141220052055.png
Fig1: 本家magit logのメニュー

mag-menu.el はこの最強メニューインターフェースのみを
一般化して利用するためのライブラリです。

複雑なメニューを作る際には真っ先にこの mag-menu を思い出してください。

magとはmagitの略です。

ダウンロードランキングNo.1のエキスをあなたに!

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.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/")))

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

M-x package-install mag-menu

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

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

構成要素

mag-menuの構成要素はこうなっています。

  • アクション
  • オプション
    • スイッチ
    • 引数

スイッチはトグルするもので、引数は文字入力があるものです。

アクション、スイッチ、引数ともに複数持てます。

書式はこうなります。

(mag-menu
 '(名前
   (actions
    ("キー" "ラベル" アクション関数)
    ...)
   (switches
    ("短いオプション" "ラベル" "長いオプション")
    ...)
   (arguments
    ("短いオプション" "ラベル" "長いオプション" mag-menu-read-generic)
    ...))
 任意のデフォルトオプション)

よって、一番簡単なメニューは複数のアクションを選択するものです。

アクション関数は、オプションを引数にとります。

引数の mag-menu-read-generic はミニバッファで
引数を読み取るmag-menu側で用意されている関数なので、
簡単のためにそのまま使うことにします。

一番シンプルなメニュー 141220044506.mag-menu.simple.el(以下のコードと同一)

一番シンプルなメニューの実例を示します。

アクション関数は、引数を無視して単にメッセージを表示するだけです。

;;; 単にメッセージを表示するだけのシンプルなメニュー
(defun mag-menu-test ()
  (interactive)
  (mag-menu
   '(test
     (actions
      ("c" "Commit" mag-menu-test-commit)
      ("l" "Log" mag-menu-test-log)))))
(defun mag-menu-test-commit (options)
  (message "Commit"))
(defun mag-menu-test-log (options)
  (message "Log"))

20141220051408.png
Fig3: 2択メニュー

Google検索の実例 141220041140.mag-menu.google.el(以下のコードと同一)

オプションを加えたら、一気に複雑になります。

ここではGoogle検索をする例です。

M-x google-menuでクエリを入力したらメニューが出てきます。

(defun google-menu (query)
  "Google検索のメニュー"
  (interactive "sGoogle: ")
  (mag-menu
   '(google                             ;任意の名前
     (actions
      ("g" "検索!" google-menu-search) ;一番上はRETで実行可能
      ("u" "URLを見る" google-menu-show-url)
      ("o" "オプションを見る" google-menu-show-options))
     (switches
      ("j" "日本語のみ" "--only-japanese"))
     (arguments                         ;オプション名は=で終わる
      ("s" "期間" "--period=" mag-menu-read-generic)
      ("Q" "検索語" "--query=" mag-menu-read-generic)))
   `(("--only-japanese")
     ("--period" . "y5")                ;ここでは=はつけない
     ("--query" . ,query))))
(defun google-menu-search (options)
  "Google検索する"
  (interactive)
  (browse-url (google-menu-url options)))
(defun google-menu-show-url (options)
  "GoogleのURLを表示する"
  (interactive)
  (message "%s" (google-menu-url options)))
(defun google-menu-show-options (options)
  "オプションを表示する"
  (interactive)
  (message "%S" options))
(defun google-menu-url (options)
  "OPTIONSに応じてGooleのURLを求める"
  (format "http://www.google.co.jp/search?q=%s&hl=ja&as_qdr=%s%s"
          (url-hexify-string (assoc-default "--query" options))
          (assoc-default "--period" options)
          (if (assoc-default "--only-japanese" options)
              "&lr=lang_ja"
            "")))

20141220051733.png
Fig4: Google検索を実装

もっと複雑な例

もっと複雑な例はack-menuパッケージをインストールし、
M-x find-function ack-menu で読んでみてください。

ack-menuレビュー記事

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


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