最新情報

2015年2月2日Emacs
emacs helmにアクション・キーバインドを超簡単に追加する方法!
2015年2月2日Emacs
emacs nyan-mode.el : 【ぬこin Emacs】かわいい猫がバッファの相対位置を教えてくれる | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット
2015年2月1日Emacs
【Windowsで展開するだけでCygwin Emacs】gnupack 12.03-2015.02.01出ました!
2015年2月1日Emacs
emacs symon.el : アイドル時にミニバッファにメモリ使用量・CPU使用率・バッテリ残量を表示するシステムモニター | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット
2015年1月31日Emacs
emacs flex-isearch.el : 【安定】ido的あいまいインクリメンタルサーチ | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

emacs helmにアクション・キーバインドを超簡単に追加する方法!

helm はEmacsにオブジェクト指向化をもたらす偉大なるパッケージです。

候補の集合とアクションが独立しているため、
組み合わせによってはコマンドでは用意されていないことも
できるようになります。

helmの強さは複数の情報源と複数のアクション、
そしてそれらを絞り込み検索できるところです。

helmはデフォルトの状態でもたくさんのアクションが用意されていますが、
ユーザ側で簡単に追加できるようになっていないのが残念です。

そこで、簡単にアクションとキーバインドを追加できるような
elispを書いてみました。

EIEIO化された情報源

数ヶ月前から EIEIO (Emacs LispによるCLOS風オブジェクト指向)
で書かれるようになったため、情報源の定義がかなり複雑になりました。

いまや情報源は2種類の表現方法があります。

  • EIEIOのクラス
  • anything時代から使われている従来の連想リスト

今ではEIEIOのクラスを定義し、
helm-make-source 関数にて連想リスト形式に変換するようになっています。

そのせいでユーザ観点ではいたずらに複雑になってしまいました。

情報源クラスの定義をユーザが変更するには
helm-setup-user-source メソッドを定義します。

アクションを追加するにはその中で
helm-source-add-action-to-source-if を使います。

そのため、ロードの順番によっては
再び情報源の変数をセットする必要があったりと
かなりやっかいなことになってしまいました。

普通のEmacsユーザは絶対ハマッてしまいます。

というか、たかだかアクションを追加したいだけの
普通の人にEIEIOを強要させるのもアレですね。

一方で、連想リストによる情報源については
helm-add-action-to-source
helm-add-action-to-source-if を使います。

もうぐちゃぐちゃですよね。

単一情報源についてはrequire→helm-add-action-to-source

結論を言うと、単一情報源のアクションを追加するには、
requireで情報源の定義をロードした上で
helm-add-action-to-source で追加するのが楽です。

(require 'helm)
;;; お試し情報源
(defvar helm-source-test
  '((name . "test")
    (candidates "aaa" "bbb")
    (action ("foo" . foo))))
;;; アクションbarを追加
(helm-add-action-to-source "bar" 'bar helm-source-test)
;;; 実際にhelmで実行させる。
;;; TABを押せば確かにbarが追加されていることがわかる
(helm :sources 'helm-source-test)

そもそも条件を満たさない限りアクションは使わないので、
helm-add-action-to-source-if で除外するよりも
無条件に追加した方が動作確認が楽だと思います。

typeに対応するアクションは mylisp-helm-add-actions.el を使う

helmでアクションを追加したい場合、
たいていの場合はtype(型)について追加したいでしょう。

そうすることで共通してオレオレアクションが使えるのですから!

しかし、<2015-02-02 Mon>現在のhelmは
typeのアクションに対し helm-setup-user-source
呼んでくれない不具合があります。

おまけに、 helm-type-attributes を変更しても
情報源に反映されないようになってしまいました。

せめて連想リストにtypeを吐き出してくれたら、
アクションを追加するプラグインを書けるのですが、
それすらできないなんて、本当に迷惑この上ないです。

そこをなんとか読み解き、ユーザ側でアクションを追加できるようにしました。

キーバインドを簡単に設定

helmは情報源ごとにキーマップを設定できるようになっていますが、
現状のhelmでは気楽にアクションのキーバインドを設定できません。

このように、いたずらに冗長かつ無駄な記述にあふれています。

(defvar helm-find-files-map
  (let ((map (make-sparse-keymap)))
    (set-keymap-parent map helm-map)
    ;; 
    (define-key map (kbd "C-c @")         'helm-ff-run-insert-org-link)
    (define-key map (kbd "C-c r")         'helm-ff-run-find-file-as-root)
    ;; 
    map))
;;; helm-files.elだけでこれらのコマンドが30近く並んでいる
;;; helm全体では60個も…
(defun helm-ff-run-insert-org-link ()
  (interactive)
  (with-helm-alive-p
    (helm-quit-and-execute-action 'helm-files-insert-as-org-link)))
(defun helm-ff-run-find-file-as-root ()
  (interactive)
  (with-helm-alive-p
    (helm-quit-and-execute-action 'helm-find-file-as-root)))

それならば単純にアクションをそのままキーに
割り当てるという発想ができないのでしょうか?

(helm-define-action-key helm-find-files-map (kbd "C-c @") 'helm-files-insert-as-org-link)
(helm-define-action-key helm-find-files-map (kbd "C-c r") 'helm-find-file-as-root)

このようにたった2行で済むんですから。

ちょっとは冗長性を排除するように努力しましょうよ、ねぇ?

mylisp-helm-add-actions.el(以下のコードと同一)

;;; -*- lexical-binding: t -*-
(require 'helm)
;;; それぞれの型に対する追加アクション
(defvar helm-user-actions-type-file nil)
(defvar helm-user-actions-type-buffer nil)
(defvar helm-user-actions-type-command nil)
(defvar helm-user-actions-type-function nil)
(defun helm-source-add-user-actions (source user-actions)
  (oset source :action
        (append (oref source :action)
                (cl-loop with orig = (oref source :action)
                         for (name . action) in helm-user-actions-type-file
                         unless (member name orig)
                         append (helm-make-actions name action)))))
(defmethod helm-setup-user-source ((source helm-type-file))
  (helm-source-add-user-actions source (helm-user-actions-type 'file)))
(defmethod helm-setup-user-source ((source helm-type-buffer))
  (helm-source-add-user-actions source (helm-user-actions-type 'buffer)))
(defmethod helm-setup-user-source ((source helm-type-command))
  (helm-source-add-user-actions source (helm-user-actions-type 'command)))
(defmethod helm-setup-user-source ((source helm-type-function))
  (helm-source-add-user-actions source (helm-user-actions-type 'function)))
;;; 型に対して追加アクションを読まないバグを修正!
(dolist (type '(file buffer function command))
  (advice-add (intern (format "helm-actions-from-type-%s" type))
              :around `(lambda (&rest them)
                        (append (apply them)
                                (helm-user-actions-type ',type)))))
(defun helm-user-actions-type (type)
  (symbol-value (intern (format "helm-user-actions-type-%s" type))))

;;; キーバインドの設定
(defun helm-define-action-key (keymap key def)
  "アクションをキーバインドに設定"
  (define-key keymap key
    (lambda ()
      (interactive)
      (with-helm-alive-p
        (helm-quit-and-execute-action def)))))

(provide 'mylisp-helm-add-actions)

type:fileに対しアクション「Stat」を追加する例 150202071912.helm-add-actions.stat.el(以下のコードと同一)

file型に対してstatを実行するアクションを追加し、
C-c C-sでも実行できるようにする例です。

helm-filesを読み込むタイミングに注意です。

強引なEIEIO化の弊害です(泣)

(require 'mylisp-helm-add-actions)

(defun file-do-stat (filename)
  (interactive "FStat File: ")
  (shell-command (format "stat %s" (shell-quote-argument filename))
                 "*Stat*"))
;;; helm-files.elロード前に設定を行う必要がある
(setq helm-user-actions-type-file
      '(("Stat" . file-do-stat)))
;;; helm-generic-files-mapを変更するためにhelm-files.el
;;; (実際はhelm-locate.el)をロードする
(require 'helm-files)
(helm-define-action-key helm-generic-files-map (kbd "C-c C-s") 'file-do-stat)

実行方法

$ wget http://rubikitch.com/f/150202071912.helm-add-actions.stat.el http://rubikitch.com/f/mylisp-helm-add-actions.el
$ emacs -Q -f package-initialize -l mylisp-helm-add-actions.el -l 150202071912.helm-add-actions.stat.el

M-x helm-mini とか M-x helm-recentf の後に
TABなりC-c C-sなり押すことで確認できます。

タグ

emacs nyan-mode.el : 【ぬこin Emacs】かわいい猫がバッファの相対位置を教えてくれる | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 nyan-mode
概要(原文) Nyan Cat shows position in current buffer in mode-line.
リポジトリ MELPA
取得先 https://github.com/TeMPOraL/nyan-mode
バージョン 20150128.1218
関連記事 package:nyan-mode package:sml-modeline package:yascroll

nyan-mode.el は、モードラインにてかわいい猫ちゃんが
バッファの大まかな位置を知らせてくれます。

モードラインに居座るかわいいスクロールバーみたいなものです。

ただ、大画面で使っていると猫の画像が小さくてわかりにくいかも…

拡大できれば言うことなしなんですけどねー。

猫の画像はxpmフォーマットなので、
Emacsを野良ビルドする際の configureオプション
–without-xpm を付けていると動作しません。

Cannot display image: (Invalid image type `xpm')

と怒られます。

萌え要素はなくなりますが、 sml-modeline.el
モードラインにて大まかな位置をお知らせしてくれます。

20150202032059.png
Fig1: バッファの先頭

20150202032115.png
Fig2: バッファの真ん中あたり

20150202032137.png
Fig3: バッファの末尾

20150202033433.png
Fig4: 拡大したところ

nyan-mode インストール

このパッケージはmelpaにあるので パッケージの初期設定 を行ってください。

M-x package-refresh-contents
M-x package-install nyan-mode

実行方法

$ wget http://rubikitch.com/f/150202031428.nyan-mode.1.el
$ emacs -Q -f package-initialize -l 150202031428.nyan-mode.1.el

タグ

2015/02/02 | コメント/トラックバック(0) |

カテゴリー:Emacs

【Windowsで展開するだけでCygwin Emacs】gnupack 12.03-2015.02.01出ました!

http://d.hatena.ne.jp/ksugita0510/20150201/p1

Windows 環境で展開するだけで CygwinEmacs24.4
使えるようになるgnupackの新バージョンが登場しました。

emacs未実行でもemacsclientでファイルオープンできるよう機能改修

emacsclientを使うには、事前にemacsを実行する必要がありました。
本バージョンのemacsclientではemacsの実行有無を判断し、
emacs未実行時はemacsを起動するように作りこみました。

つまり、emacsclientだけでemacsが起動しようとしてまいと
直接Emacsにファイルを送り込むことができるようになります。

悪いことは言わないのでbasicではなくてdevelを選んでください。

gnupackについて詳しく知るには
gnupackカテゴリ の一連の記事を読んでください。

タグ

emacs symon.el : アイドル時にミニバッファにメモリ使用量・CPU使用率・バッテリ残量を表示するシステムモニター | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 symon
概要(原文) tiny graphical system monitor
リポジトリ MELPA
サイト http://qiita.com/zk_phi/items/9576874a35a2affbefa8
取得先 https://github.com/zk-phi/symon
バージョン 20150131.1121
関連記事 package:symon

symon.el はEmacsで動くシステムモニターです。

GNU/LinuxとWindowsとCygwinに対応しています。

現時点ではMac未対応ですが、
コードを読めば対応できるようになっています。

一定時間Emacsを操作しないと、図のように
メモリ使用量CPU使用率バッテリ残量
を表示します。

デフォルトでは2秒間(symon-delay)操作しない場合に
3秒間隔(symon-refresh-rate)で表示します。

20150201084451.png
Fig1: _

symon インストール

このパッケージはmelpaにあるので パッケージの初期設定 を行ってください。

M-x package-refresh-contents
M-x package-install symon

実行方法

$ wget http://rubikitch.com/f/150201084404.symon.el
$ emacs -Q -f package-initialize -l 150201084404.symon.el

他のシステムに対応させるには

(defcustom symon-fetcher
  (cl-case system-type
    ((windows-nt) 'symon-default-windows-fetcher)
    ((gnu/linux cygwin) 'symon-default-linux-fetcher))
  略)

Macにも対応させるには、
symon-default-darwin-fetcher 関数を定義し、
symon-fetcher 変数に

((darwin) 'symon-default-darwin-fetcher)

の項目を書き加えます。

fetcherは、 define-symon-fetcher マクロで定義します。

GNU/Linuxの場合はこうなっています。

(define-symon-fetcher symon-default-linux-fetcher
  :setup (setq symon--default-linux-last-cpu-ticks nil
               symon--default-linux-timer-object
               (run-with-timer 0 symon-refresh-rate 'symon--default-linux-update-function))
  :cleanup (cancel-timer symon--default-linux-timer-object))

「:setup」はsymon-modeを有効にしたとき、
「:cleanup」は無効にしたときに実行されます。

読んでわかるように、タイマーを設定・解除しています。

おそらく、そのままlinuxをdarwinに置き換えればよいでしょう。

あとは、 symon–default-linux-update-function を元に
symon–default-darwin-update-function を定義してください。

他の情報も表示したい

システムモニターといえば、他の情報も表示したくなるかもしれません。

symon–default-linux-update-function を読めば
symon-commit-status 関数を呼んで
現在値を登録していることがわかります。


(symon-commit-status 'cpu nil)

では、現在時刻なども表示したいと思ったら、
カスタム化された update-function を定義すればいいかと思いましたが、
残念ながら表示内容は symon–display で固定されています。

messageconcat ではなく、
format-spec 関数を使ってformat、format-time-stringのような
%指定で表示内容をカスタマイズできるようにすればよいと思います。

現状で他の情報も表示させたいならば、

  1. symon–default-linux(windows)-update-function のafterアドバイスを定義
  2. symon–display関数を再定義

する必要があります。

タグ

2015/02/01 | コメント/トラックバック(0) |

カテゴリー:Emacs

emacs flex-isearch.el : 【安定】ido的あいまいインクリメンタルサーチ | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 flex-isearch
概要(原文) Flex matching (like ido) in isearch.
リポジトリ MELPA
取得先 https://bitbucket.org/jpkotta/flex-isearch
バージョン 20130508.1503
関連記事 package:flex-isearch package:flx-ido package:isearch-dabbrev package:ace-jump-mode package:flx-isearch

flex-isearch.el昨日のflx-isearch.el に引き続き、
あいまい検索を行うisearchです。

両者を使ってみたところ、こちらの方が安定して動作します。

あいまいisearchとは、文字と文字の間に任意の文字が入ることを許可し、
isearchの打鍵数を減らすことができます。

idoのflex matchと似たようなものです。

たとえば「fisrh」でflex-isearchにマッチします。

本設定ではC-M-s/C-M-rに割り当てています。

正規表現isearchはC-u C-s/C-u C-rを使ってください。

M-x global-flex-isearch-mode でマイナーモードを有効にすると、
C-u C-u C-s/C-u C-u C-rであいまいisearchになります。

あいまい検索はおもしろい機能ですが、臨機応変に使い分けてください。

画面内での移動ならばace-jump-mode.el(レビュー) が便利ですし、
isearchの検索文字列をdabbrevするisearch-dabbrev.el(レビュー) もあります。

flex-isearch インストール

このパッケージはmelpaにあるので パッケージの初期設定 を行ってください。

M-x package-refresh-contents
M-x package-install flex-isearch

設定 150131085109.flex-isearch.el(以下のコードと同一)

(global-flex-isearch-mode 1)
(global-set-key (kbd "C-M-s") 'flex-isearch-forward)
(global-set-key (kbd "C-M-r") 'flex-isearch-backward)

実行方法

$ wget http://rubikitch.com/f/150131085109.flex-isearch.el
$ emacs -Q -f package-initialize -l 150131085109.flex-isearch.el

20150131085908.png
Fig1: cinbでcandidates-in-bufferにマッチ!

タグ

2015/01/31 | コメント/トラックバック(1) |

カテゴリー:Emacs

magitのログで、コミット日時を時刻で表示させる設定

magit.elgit をとても使いやすくしてくれます。

しかし、 magit-log にてコミット日時が「1 year」などと
大まかにしか見られないのが不満でなりません。

Twitterのツイート日時もそうなんですが、
なんで厳密に時刻を表示しないのか疑問でなりません。

時刻を表示することで、いつのコミットなのかが厳密にわかります。

なぜかこのようにカスタマイズする変数が存在しないので、
関数再定義adviceで強引に設定しました。

20150130145101.png
Fig1: 時刻表示!

(require 'magit)
(defun magit-format-duration--format-date (duration spec width)
  (format-time-string "%y-%m-%dT%H:%M:%S"
                      (seconds-to-time (- (float-time) duration))))
(advice-add 'magit-format-duration :override
            'magit-format-duration--format-date)
(defun magit-log-margin-set-timeunit-width--fixed ()
  (setq magit-log-margin-timeunit-width 12))
(advice-add 'magit-log-margin-set-timeunit-width :override
            'magit-log-margin-set-timeunit-width--fixed)
(setq magit-log-margin-spec '(33 nil magit-duration-spec))

タグ

2015/01/30 | コメント/トラックバック(0) |

カテゴリー:Emacs

【isearchでdabbrev風】インクリメンタルサーチにマッチした部分(シンボル、行)を挿入する

たった今思い付いたコードです。

バッファ内の特定の行やシンボルをコピーするときどうしますか?

行の場合は、

  1. isearchなどでターゲットの行へジャンプ
  2. C-a C-SPC C-n M-wでその行をコピー
  3. C-u C-SPCで元の位置に戻る
  4. C-yで貼り付け

と、isearch後に7ストロークも必要とします。

シンボルの場合は dabbrev-expand (M-/) や
hippie-expand が使えるのでまだマシですが、
Emacs Lispのシンボルは共通のprefixなので、
いまいち使いづらいです。

シンボル名の途中ならば

  1. isearchなどでターゲットのシンボルへジャンプ
  2. C-M-b C-M-SPC M-wでそのシンボルをコピー
  3. C-u C-SPCで元の位置に戻る
  4. C-yで貼り付け

と、やはり6ストローク必要とします。

そこでisearch後、即に行はシンボルを貼り付けられるようにする
Emacs Lispを書きました。

isearch後、C-eでシンボルを、C-u C-eでその行を
元の位置に貼り付けます。

検索文字列がシンボルをまたがる場合は、
検索文字列を含むシンボル単位の塊を貼り付けます。

検索文字列を伸ばすにはC-w (標準機能)でできます。

行を指定してからコピーというのは昔から
知る人ぞ知る fcopy.el がありますが、
こちらはisearchという標準機能からすぐに使える手軽さがあります。

長いシンボルのdabbrev代わりに使ってあげてください。

(defun insert-from-isearch (&optional whole-line)
  (interactive "P")
  (let ((str (insert-from-isearch-target-string whole-line)))
    (isearch-done t)
    (goto-char (mark))
    (pop-mark)
    (and whole-line (beginning-of-line))
    (undo-boundary)
    (insert str)))
(defun insert-from-isearch-target-string (whole-line)
  (if whole-line
      (thing-at-point 'line)
    (let ((bound (bounds-of-thing-at-point 'symbol))
          (min (min (point) isearch-other-end))
          (max (max (point) isearch-other-end)))
      (cons (point) isearch-other-end)
      (if (and bound (<= (car bound) min max (cdr bound)))
          (buffer-substring (car bound) (cdr bound))
        (save-excursion
          (buffer-substring
           (progn (goto-char min)
                  (or (car (bounds-of-thing-at-point 'symbol)) min))
           (progn (goto-char max)
                  (or (cdr (bounds-of-thing-at-point 'symbol)) max))))))))
(define-key isearch-mode-map (kbd "C-e") 'insert-from-isearch)

20150130105919.png
Fig1: 初期状態

20150130113214.png
Fig2: thiを検索

20150130113222.png
Fig3: C-eでThisが貼り付けられる

20150130113317.png
Fig4: ant C-wでant toを検索

20150130113323.png
Fig5: C-eでwant toが貼り付けられる

20150130113346.png
Fig6: この状態でbuffを検索し、C-u C-eを押すとその行を貼り付ける

タグ

2015/01/30 | コメント/トラックバック(0) |

カテゴリー:Emacs

emacs flx-isearch.el : ido的あいまいインクリメンタルサーチ | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 flx-isearch
概要(原文) Fuzzy incremental searching for emacs
リポジトリ MELPA
取得先 https://github.com/PythonNut/flx-isearch
バージョン 20141227.1839
関連記事 package:flx-isearch package:flx-ido package:isearch-dabbrev package:ace-jump-mode package:flex-isearch

flx-isearch.el は、あいまい検索を行うisearchです。

<2015-01-31 Sat> 現時点ではflex-isearch.elの方が安定しています。

あいまいisearchとは、文字と文字の間に任意の文字が入ることを許可し、
isearchの打鍵数を減らすことができます。

idoのflex matchと似たようなものです。

たとえば「fisrh」でflx-isearchにマッチします。

しかも、シンボルのみにマッチするようになっているので、
コーディング時の検索にもってこいです。

本設定ではC-M-s/C-M-rに割り当てています。

正規表現isearchはC-u C-s/C-u C-rを使ってください。

とはいえ、かなりクセがあるので、慣れるまでは難しいかもしれません。

画面内での移動ならばace-jump-mode.el(レビュー) が便利ですし、
isearchの検索文字列をdabbrevするisearch-dabbrev.el(レビュー) もあります。

flx-isearch インストール

このパッケージはmelpaにあるので パッケージの初期設定 を行ってください。

M-x package-refresh-contents
M-x package-install flx-isearch

設定 150130070159.flx-isearch.1.el(以下のコードと同一)

(global-set-key (kbd "C-M-s") 'flx-isearch-forward)
(global-set-key (kbd "C-M-r") 'flx-isearch-backward)

実行方法

$ wget http://rubikitch.com/f/150130070159.flx-isearch.1.el
$ emacs -Q -f package-initialize -l 150130070159.flx-isearch.1.el

20150130070322.png
Fig1: cinbでcandidates-in-bufferにマッチ!

タグ

2015/01/30 | コメント/トラックバック(1) |

カテゴリー:Emacs

helmの原点へ立ち帰ろう

今回のメルマガはhelmのおさらいと
あまり知られていないであろう機能をお話します。

helmは前身anything時代から数えると実に8年にもなります。

もうすっかりおなじみの存在になったことでしょう。

登場時は世界中のEmacsユーザを熱狂させたanythingも、
数年後にはすっかり当たり前のものになり、
helmとなった今でも殊更話題になっているわけではありません。

今や誰もが持っているスマートフォンも、
かつては携帯電話とPDAに分かれており、
それぞれが画期的な発明でした。

かつては固定電話や公衆電話が当たり前だったのが、
いつでもどこでも電話できる携帯電話が登場しました。

昔のコンピュータは部屋中を占めるほど巨大なもので、
パソコンでさえもkg単位の重さがあるけれど、
PDAは数百グラムの手のひらサイズのコンピュータとして登場しました。

スマートフォンはその両者を兼ね備えた超ハイテク機器です。

歴史を振り返ってみると、
スマートフォンってすごいと思いませんか?

当たり前の存在になってしまったら、
それに対して感謝の気持ちというものが薄れてきます。

そのうち視野も狹くなり、
特定の機能のみしか使わなくなってしまいます。

それではもったいなさすぎですよね。

今一度、helmの原点に立ち返って
helmの思想を振り返り、
もっとhelmを使いこなしてみませんか?

「Emacsの支配者」の実力、とくと御覧あれ!

タグ

2015/01/30 | コメント/トラックバック(0) |

カテゴリー:メルマガ

emacs flx-ido.el : idoのあいまいマッチを改善する | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 flx-ido
概要(原文) flx integration for ido
リポジトリ MELPA
取得先 https://github.com/lewang/flx
バージョン 20140821.2033
関連記事 package:flx-ido package:smex package:ido-ubiquitous

flx-ido.el は、 flx.el というあいまいマッチライブラリを使って、
idoのあいまいマッチを改善します。

  1. あいまいマッチが必ず実行される
  2. マッチした部分に色がつく

たとえば、

("chops" "scone" "close" "confide")

の4要素のリストをidoでマッチさせる例を考えましょう。

標準のあいまいマッチを有効化(ido-enable-flex-matching = t)した状態で
「co」と入力すると、”scone”と”confide”しかマッチしません。

なぜなら、両者はcoを含むのであいまいマッチは無効になります。

20150129065125.png
Fig1: 標準では部分文字列マッチが優先される

部分文字列マッチがあいまいマッチよりも優先されたからです。

一方で「coe」と入力すると、あいまいマッチが有効になり
“scone”、”confide”、”close”にマッチします。

20150129065130.png
Fig2: ここで初めてあいまいマッチが有効になる

そこで、flx-ido.elでは常にあいまいマッチが行われるようにさせます。

20150129065321.png
Fig3: flx-ido-modeなら常にあいまいマッチが使える

ただし、M-xをido化させる smex.el(レビュー) に対しては、
やや動作が重くなります。

flx-ido インストール

このパッケージはmelpaにあるので パッケージの初期設定 を行ってください。

M-x package-refresh-contents
M-x package-install flx-ido

設定 150129065419.flx-ido.el(以下のコードと同一)

(setq ido-max-window-height 0.75)
(ido-vertical-mode 1)
(require 'flx-ido)
(ido-mode 1)
(ido-everywhere 1)
(flx-ido-mode 1)
;; disable ido faces to see flx highlights.
(setq ido-enable-flex-matching t)
(setq ido-use-faces nil)

実行方法

$ wget http://rubikitch.com/f/150129065419.flx-ido.el
$ emacs -Q -f package-initialize -l 150129065419.flx-ido.el

タグ

2015/01/29 | コメント/トラックバック(0) |

カテゴリー:Emacs

このページの先頭へ