最新情報

2014年12月23日Emacs
emacs isearch-dabbrev.el : isearch中に検索語を補完する/ace-isearch(helm-swoop)のお供に | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット
2014年12月22日記事更新情報
dired-subtreeはdired-detailsと併用しよう / imenu-anywhere更新
2014年12月22日Emacs
emacs dired-subtree.el : diredがディレクトリツリーエディタに進化!dired-detailsにも対応 | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット
2014年12月22日Emacs
emacs mbe.el : Scheme風パターンマッチをEmacs Lispで実現するライブラリ! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方
2014年12月21日Emacs
emacs let-alist.el : 【Emacs 25から標準】alistの要素にシンボルでアクセスするマクロ! | ELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方

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

emacs isearch-dabbrev.el : isearch中に検索語を補完する/ace-isearch(helm-swoop)のお供に | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 isearch-dabbrev
概要(原文) Use dabbrev in isearch
リポジトリ MELPA
取得先 https://github.com/Dewdrops/isearch-dabbrev
バージョン 20141222.122
関連記事 package:isearch-dabbrev package:helm package:ace-isearch package:helm-swoop package:ace-jump-mode

isearch-dabbrev.el は、 インクリメンタルサーチ 中に
TABを押すことで dabbrev (動的略語展開)を行うものです。

つまり、検索語を完全に入力しなくても適宜補完してくれます。

isearchからhelm-swoopへと繋ぐace-isearch とは
すこぶる相性がよく、数文字タイプしてからTABで補完し、
自動的に helm-swoop へ移行できるようになります。

クリスマスに helm-swoop を大々的に紹介しますが、
helm-swoopは神拡張なのでアンチhelmもhelm-swoopのためだけに
helmを使ってみてください。

isearch-dabbrev インストール

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

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

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

(define-key isearch-mode-map (kbd "<tab>") 'isearch-dabbrev-expand)

実行方法

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

20141223070837.png
Fig1: isearchでisまで入力し

20141223070902.png
Fig2: TABを押すとisearchまで補完される(helm-swoop発動)

タグ

2014/12/23 | コメント/トラックバック(0) |

カテゴリー:Emacs helm

dired-subtreeはdired-detailsと併用しよう / imenu-anywhere更新

先程レビューしたばかりのdired-subtree.el ですが、
Emacs 24.4標準の M-x dired-hide-details-mode には対応していません。

diredでファイル名以外を隠している方は
古くからあるdired-details.el と併用してください。

また、レビュー当時バグっていたimenu-anywhere.el のバグが
修正されたので記事も更新しました。

タグ

emacs dired-subtree.el : diredがディレクトリツリーエディタに進化!dired-detailsにも対応 | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 dired-subtree
概要(原文) Insert subdirectories in a tree-like fashion
リポジトリ MELPA
取得先 https://github.com/Fuco1/dired-hacks
バージョン 20141221.1009
関連記事 package:dired-subtree package:dired-details

dired-subtree.el は、 dired にて
ディレクトリの直下にその内容を挿入します。

標準の「i」(dired-maybe-insert-subdir)は
diredバッファの最後尾に挿入しますが、
dired-subtree.elを使えばディレクトリの直下に挿入されます。

つまり、ディレクトリツリーらしく表示されるわけです。

たったこれだけの違いですが、表示が直観的になってわかりやすくなります。

最新版ではdired-details.el(レビュー記事) に対応したので、
本設定ではdired-details.elの設定もしておきます。

また、dired-subtreeによって表示させたサブディレクトリに対して
wdired を使うこともできます。

なお、同じ機能を持つEmacs 24.4標準の dired-hide-details-mode には
まだ対応していません。

作者がまだ24.3を使っているので対応が待たれるところです。

dired-subtree インストール

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

M-x package-refresh-contents
M-x package-install dired-subtree

dired-subtree インストール

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

M-x package-refresh-contents
M-x package-install dired-subtree

dired-detailsもインストールしましょう。

M-x package-install dired-details

設定 141222134234.dired-subtree.1.el(以下のコードと同一)

(require 'dired-subtree)
;;; iを置き換え
(define-key dired-mode-map (kbd "i") 'dired-subtree-insert)
;;; org-modeのようにTABで折り畳む
(define-key dired-mode-map (kbd "<tab>") 'dired-subtree-remove)
;;; C-x n nでsubtreeにナローイング
(define-key dired-mode-map (kbd "C-x n n") 'dired-subtree-narrow)

;;; ファイル名以外の情報を(と)で隠したり表示したり
(require 'dired-details)
(dired-details-install)
(setq dired-details-hidden-string "")
(setq dired-details-hide-link-targets nil)
(setq dired-details-initially-hide nil)

;;; dired-subtreeをdired-detailsに対応させる
(defun dired-subtree-after-insert-hook--dired-details ()
  (dired-details-delete-overlays)
  (dired-details-activate))
(add-hook 'dired-subtree-after-insert-hook
          'dired-subtree-after-insert-hook--dired-details)

;; find-dired対応
(defadvice find-dired-sentinel (after dired-details (proc state) activate)
  (ignore-errors
    (with-current-buffer (process-buffer proc)
      (dired-details-activate))))
;; (progn (ad-disable-advice 'find-dired-sentinel 'after 'dired-details) (ad-update 'find-dired-sentinel))

実行方法

$ wget http://rubikitch.com/f/141222134234.dired-subtree.1.el
$ emacs -Q -f package-initialize -l 141222134234.dired-subtree.1.el

20141222140153.png
Fig1: ディレクトリ直下に表示!

20141222140204.png
Fig2: 「(」を押して詳細を隠したところ

タグ

2014/12/22 | コメント/トラックバック(2) |

カテゴリー:Emacs

emacs mbe.el : Scheme風パターンマッチをEmacs Lispで実現するライブラリ! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方

パッケージ名 mbe
概要(原文) Macros by Example
リポジトリ MELPA
取得先 https://github.com/ijp/mbe.el
バージョン 20141112.1042
関連記事 package:mbe

mbe.elSchemeパターンマッチ のようなことができます。

SRFI 46 / R6RS スタイルのパターンが使えます。

(<pattern> ...)
(<pattern> <pattern> ... . <pattern>)
(<pattern> ... <pattern> <ellipsis>)
(<pattern> ... <ellipsis> <pattern> ...)
(<pattern> ... <ellipsis> <pattern> ... . <pattern>)

mbe インストール

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

M-x package-refresh-contents
M-x package-install mbe

パターンマッチ結果をローカル変数にするmbe-bind

パターンマッチを行うマクロは mbe-bind です。

(mbe-bind Patパターン
  値
  フォーム...)

の書式になります。

使用例 141222083004.el(以下のコードと同一)

;;; これは単純なパターンでaとbにはそれぞれ1と2が入る
(mbe-bind
 (a b)
 '(1 2)
 a                                    ; => 1
 b                                    ; => 2
 )
;;; シンボル...は直前のパターンの繰り返し
;;; b ...でリストの残りを表す
(mbe-bind
 (a b ...)
 '(1 2 3 4 5)
 a                                    ; => 1
 b                                    ; => (2 3 4 5)
 )
;;; パターン (a b) の繰り返しを表す暗黙のループ
(mbe-bind
 ((a b) ...)
 '((a 1) (b 2) (c 3))
 a                                      ; => (a b c)
 b                                      ; => (1 2 3)
 )
;;; ネストした...
;;; aは最初の要素、bは残りの要素になる
(mbe-bind
 ((a b ...) ...)
 '((a 1 "alpha" "beta") (b 2) (c 3 "gamma"))
 a                           ; => (a b c)
 b                           ; => ((1 "alpha" "beta") (2) (3 "gamma"))
 )
;;; 最後の3 2 1がマッチしている
(mbe-bind
 (a b c ... 3 2 1)
 '(7 6 5 4 3 2 1)
 a                                      ; => 7
 b                                      ; => 6
 c                                      ; => (5 4)
 )
;;; dとeは最後の2要素になる
(mbe-bind
 (a b c ... d e)
 '(1 2 3 4 5 6 7 8 9)
 a                                      ; => 1
 b                                      ; => 2
 c                                      ; => (3 4 5 6 7)
 d                                      ; => 8
 e                                      ; => 9
 )
;;; リストの最後のコンスセルのcdrはnilなのでfはnil
(mbe-bind
 (a b c ... d e . f)
 '(1 2 3 4 5 6 7 8 9)
 a                                      ; => 1
 b                                      ; => 2
 c                                      ; => (3 4 5 6 7)
 d                                      ; => 8
 e                                      ; => 9
 f                                      ; => nil
 )
;;; 最後のコンスセルが9
(mbe-bind
 (a b c ... d e . f)
 '(1 2 3 4 5 6 7 8 . 9)
 a                                      ; => 1
 b                                      ; => 2
 c                                      ; => (3 4 5 6)
 d                                      ; => 7
 e                                      ; => 8
 f                                      ; => 9
 )

パターンマッチを使ってマクロを記述する

mbe-defrules マクロはSchemeの syntax-rules
syntax-case のような形でマクロを定義します。

パターンマッチの方法はmbe-bindと同じです。

incfを定義 141222084410.el(以下のコードと同一)

(mbe-defrules my-incf
  ;; 引数が1つのときは1足す
  ((var) (setq var (+ var 1)))
  ;; 引数が2つのときはby足す
  ((var by) (setq var (+ var by))))
(let ((a 0) (b 0))
  (incf a)                              ; => 1
  (incf a 10)                           ; => 11
  a                                     ; => 11
  (my-incf b)                           ; => 1
  (my-incf b 10)                        ; => 11
  b                                     ; => 11
  )

pushを定義 141222084700.el(以下のコードと同一)

;;; 冗長な記法
(mbe-defrules my-push1
  ((newelt place) (setq place (cons newelt place))))
;;; 引数の形式が1つなのでシンプルな記法でよい
(mbe-defrule my-push2 (newelt place)
  (setq place (cons newelt place)))
(let (x y z)
  (push 1 x)                            ; => (1)
  x                                     ; => (1)
  (my-push1 1 y)                        ; => (1)
  y                                     ; => (1)
  (my-push2 1 z)                        ; => (1)
  z                                     ; => (1)
  )

letを定義 141222084905.el(以下のコードと同一)

(mbe-defrule mylet (((var val) ...) body ...)
  (funcall (lambda (var ...) body ...) val ...))
(mylet ((a 1) (b 2))
  a                               ; => 1
  b                               ; => 2
  (+ a b))                        ; => 3

タグ

emacs let-alist.el : 【Emacs 25から標準】alistの要素にシンボルでアクセスするマクロ! | ELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方

パッケージ名 let-alist
概要(原文) Easily let-bind values of an assoc-list by their names
リポジトリ ELPA(公式リポジトリ)
バージョン 1.0.2
関連記事 package:let-alist

初めて本家ELPAにあるパッケージを紹介します。

let-alist マクロは、 連想リスト (alist) の
アクセスを劇的に簡単にします。

読み取りのみで、文字列には対応していません。

こういうマクロがあると本当に助かりますね。

let-alist インストール

このパッケージはELPAにあるので、パッケージの初期設定は不要です。

%sM-x package-refresh-contents
M-x package-install let-alist

使用例 141221045657.let-alist.el(以下のコードと同一)

(require 'let-alist)
(setq alist '((foo . "FOO")
              (bar . "BAR")
              ("baz" . "not used")))
;;; assq/cdrを使っていたのが
(let ((.foo (cdr (assq 'foo alist)))
      (.bar (cdr (assq 'bar alist))))
  (cons .foo .bar))                     ; => ("FOO" . "BAR")
;;; あっさり! .つきのシンボルでアクセスできる!!
(let-alist alist
  (cons .foo .bar))                     ; => ("FOO" . "BAR")
;;; 文字列で使えないのが残念でならない。亜種が欲しいところ。
(let-alist alist
  .baz)                                 ; => nil
;;; 残念ながら書き込みはできない
(let-alist alist
  (setf .foo 100)
  alist)                                ; => ((foo . "FOO") (bar . "BAR") ("baz" . "not used"))

タグ

emacs initsplit.el : M-x customizeの結果(custom-file)を変数名別に分ける | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方

パッケージ名 initsplit
概要(原文) code to split customizations into different files
リポジトリ MELPA
取得先 https://github.com/dabrahams/initsplit
バージョン 20140203.441
関連記事 package:initsplit

initsplit.el は、M-x customize等によるGUIでのカスタマイズ結果を
変数名別のファイルに分けます。

本来ならば custom-file にすべてのカスタマイズ結果が書き出されますが、
これを使うことで、特定のパッケージに関するカスタマイズ結果を
別のファイルに追い出し、見通しを良くします。

このように使います。

(load "initsplit")
;; カスタマイズ結果のファイルをバイトコンパイルする
(setq custom-file "~/.emacs.d/settings.el")
;; orgとgnusのカスタマイズは別々のファイルに保存する
(setq initsplit-customizations-alist
  '(("^gnus-" "~/.emacs.d/gnus-settings.el")
    ("^org-" "~/.emacs.d/org-settings.el")))
(add-hook 'after-save-hook 'initsplit-byte-compile-files t)

;; 全カスタマイズファイルを読み込む
(load custom-file)
(load "~/.emacs.d/gnus-settings.el")
(load "~/.emacs.d/org-settings.el")

initsplit インストール

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

M-x package-refresh-contents
M-x package-install initsplit

テストファイル initsplit-test.el(以下のコードと同一)

どのような動作をするのかがわかりにくいかもしれないので、
パッケージの方でテストファイルが添付してあります。

以下の変数を定義し、ファイルに分けます。

  • custom-file
  • mac-command-modifier
  • initsplit-customizations-alist
  • apple
  • boy
  • cat
  • dog
(message "testing")
(setq debug-on-error t)
(add-to-list 'load-path (file-name-directory load-file-name))
(custom-set-variables
 '(custom-file "/tmp/settings.el")
 '(mac-command-modifier 'meta)
 '(initsplit-customizations-alist
   '(("\\`a" "/tmp/a-settings.el")
     ("\\`b" "/tmp/b-settings.el")
     ("\\`[ac]" "/tmp/c-settings.el")
     ("\\`d" "/tmp/a-settings.el")))
 )
(require 'initsplit)

(defgroup test nil "")

(dolist (symbol '(apple boy cat dog))
  (eval `(defcustom ,symbol nil "doc" :group 'test))
  (set symbol t)
  (put symbol 'saved-value '(t)))

(custom-save-all)
(kill-emacs)
(customize-group "test")

;; expectations:
;; a-settings.el: apple, dog
;; b-settings.el: boy
;; c-settings.el: cat

init.elを別ファイルに退避し、
initsplit-test.elをinit.elにして読み込むと、
以下のファイルが書き出されて終了します。

/tmp/a-settings.el
apple, dog
/tmp/b-settings.el
boy
/tmp/c-settings.el
cat
/tmp/settings.el
それ以外

これを見てわかるように、カスタマイズ結果をファイルに分けたら、
すべてのファイルを読み込む必要があることです。

タグ

emacs ack-menu.el : ack-grepをmagitのメニューインターフェースで動かす!mag-menuの実例!! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 ack-menu
概要(原文) A menu-based front-end for ack
リポジトリ MELPA
取得先 https://github.com/chumpage/ack-menu
バージョン 20130312.131
関連記事 package:ack-menu package:mag-menu package:magit

ack-menu.el は、高速grepのack(ack-grep)
magit のメニューインターフェースで
細かくオプションを設定して実行します。

magitのインターフェースの素晴らしさは、
複雑なオプションをもメニュー形式で指定でき
誰にでも使いやすいことです。

メニューインターフェースを提供するライブラリmag-menu
いい実例でもあります。

興味ある方はソースコードを読んでみてください。

同種の優れたインターフェースを作るいい勉強になることでしょう。

20141220150449.png
Fig1: magitのメニューインターフェースでackのオプションを選択

20141220150504.png
Fig2: ack検索結果を表示

ack-menu インストール

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

M-x package-refresh-contents
M-x package-install ack-menu

タグ

emacs mag-menu.el : 最強magitメニューインターフェースライブラリ!Google検索の実例あり | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 mag-menu
概要(原文) Intuitive keyboard-centric menu system
リポジトリ MELPA
取得先 https://github.com/chumpage/mag-menu
バージョン 20141218.2327
関連記事 package:mag-menu package:magit package:ack-menu package:google-this

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

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

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

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

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

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

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

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

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

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

magとはmagitの略です。

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

mag-menu インストール

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

M-x package-refresh-contents
M-x package-install 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
Fig2: 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
Fig3: Google検索を実装

もっと複雑な例

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

ack-menuレビュー記事

タグ

emacs helm-migemo.el : helmで正しくMigemoを動作させる! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット

パッケージ名 helm-migemo
概要(原文) Migemo plug-in for helm
リポジトリ MELPA
取得先 https://github.com/emacs-helm/helm-migemo
バージョン 20130820.440
関連記事 package:helm-migemo package:migemo

helm-migemo.el は、かつて僕が作った anything-migemo.el
myuheさん がhelmに移植したものです。

これを使えばhelmのMigemo対応情報源にてMigemo検索できるようになります。

しかし、helmが lexical-binding 対応になったときから
そのままでは動作しなくなってしまいました。

本設定を使えば引き続きMigemoで絞り込めるようになります。

Migemo対応情報源ではMigemo使えるが反面、
正規表現が無効になってしまいます。

helm-swoop などではそれが顕著に出てくるので注意してください。

情報源をMigemoに対応するには(migemo)を加えます。
helm-bmの例を参考にしてください

helm-migemo インストール

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

M-x package-refresh-contents
M-x package-install helm-migemo

設定 helm-migemo-fix.1.el(以下のコードと同一)

(require 'helm-migemo)
;;; この修正が必要
(eval-after-load "helm-migemo"
  '(defun helm-compile-source--candidates-in-buffer (source)
     (helm-aif (assoc 'candidates-in-buffer source)
         (append source
                 `((candidates
                    . ,(or (cdr it)
                           (lambda ()
                             ;; Do not use `source' because other plugins
                             ;; (such as helm-migemo) may change it
                             (helm-candidates-in-buffer (helm-get-current-source)))))
                   (volatile) (match identity)))
       source)))

実行方法

動作させるには、migemoの設定をロードしてください。

$ wget http://rubikitch.com/f/helm-migemo-fix.1.el
$ emacs -Q -f package-initialize -l your-migemo-settings.el -l helm-migemo-fix.1.el

20141219095040.png
Fig1: Migemoで絞り込み

タグ

2014/12/19 | コメント/トラックバック(0) |

カテゴリー:Emacs helm

helmでバッファ名が奇妙な並び順になるのを修正

みなさん、helm使ってますかー?

anything.elhelm.el に改名されてからはや3年になりますが、
今尚anything.elの方がいいと言ってくれる人がいるのは
嬉しい限りです。

anything.elは個人的に使い続けているため、今後とも
最新のEmacsでも動くような状態には保っておきますが
anything.elはもう機能拡張しません。

時代の流れには逆らえないもので、
候補選択フレームワークのトレンドは
anything.elからhelm.elに
完全移行してしまいました。

helm.elは過激に変更しているのでanything.elとは
挙動が変わってしまった点もあります。

特にストレスなのが、バッファ選択です。

M-x helm-mini でバッファを選択するために
クエリを入力しても、変な順番に並んでしまいます。

この原因は、type:bufferの filtered-candidate-transformer
helm-buffers-sort-transformer という関数が入っているからです。

これはバッファの順番をバッファ名の長さにソートする関数です。

type:bufferにて定義されているので、M-x helm-mini以外にも
M-x helm-projectile など、バッファを選択する情報源すべてに影響します。

正直、作者は何考えているのかわかりません(苦笑)。

ハードコーディングされているのでカスタマイズではどうしようもありません。

a_bickyさんも同じストレスを抱えていますが、
彼はパッチとフォークで対処してします。

こちらは本家helmを使いたい人向けです。

検証方法

M-x anything-miniとM-x helm-miniの挙動の違いを確かめるために、
コマンドマルチプレクサmykie.el でC-x C-zに割り当てましょう。

(mykie:global-set-key "C-x C-z"
  :default helm-mini
  :C-u! anything-mini
  :C-u*2 ibuffer)
C-x C-z
helm-mini
C-u C-x C-z
anything-mini
C-u C-u C-x C-z
ibuffer

このようになります。

ibuffer で/ mを使い、メジャーモードでフィルタをかけます(例:org-mode)。

そして、anything-miniとhelm-miniを使って
orgと入力してください。

アドバイスをかける前後で挙動の違いを確認してください。

とっとと潰せ!

こんな関数はアドバイスで潰してしまいましょう。

(defadvice helm-buffers-sort-transformer (around ignore activate)
  (setq ad-return-value (ad-get-arg 0)))

これでbuffer-list順に並ぶようになります。

タグ

2014/12/19 | コメント/トラックバック(0) |

カテゴリー:Emacs helm

このページの先頭へ