- mag-menu 20150505.1150(in MELPA)
- Intuitive keyboard-centric menu system
概要
MELPAダウンロードランキングNo.1は magit ですが、
なぜこんなに人気が高いのでしょうか?
その理由は、複雑きわまりないgitのほぼ全機能を
非常に使いやすいメニューインターフェースで扱えることです。
まだ使ったことのない人は使ってみてください。
メニューの出来に驚くはずです。
スイッチをonにしたら、そのスイッチの部分が
赤くなって有効になったことがわかります。
また、引数を入力したら、それがメニューに反映されます。
つまり、すべてのコマンドラインオプションをメニューで操作でき、
長いオプションも書いているからgitそのものも習得できるという
一石二鳥、最強のメニューインターフェースといえます。
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"))
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" "")))
Fig4: Google検索を実装
もっと複雑な例
もっと複雑な例はack-menuパッケージをインストールし、
M-x find-function ack-menu で読んでみてください。
本サイト内の関連パッケージ
- google-this - A set of functions and bindings to google under point.
- ack-menu - A menu-based front-end for ack
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。