anything 20170125.1710(in MELPA)
open anything / QuickSilver-like candidate-selection framework

ニュース!

このページは随時更新していきます。

  • <2016-11-30 Wed>開発予定を追記
  • <2016-11-29 Tue>記事更新
  • <2016-11-28 Mon>
    1. ツータッチ候補選択の見た目を整えた
    2. ツータッチ候補選択でデフォルト以外のアクションも選択できるようにした
    3. ツータッチ候補選択のヒント文字をスクロールのたびにつけなおすようにした
    4. ツータッチ候補選択をデフォルトで有効にした

概要

anything.elは、僕が2007年からじっくりと育ててきた候補選択フレームワークです。

2012年からはhelmに改名されて袂を分かち、helmはとてつもない勢いで開発が進められています。
いつしか
「anything.elは終わった、これからはhelmの時代だ」
「anything.elからhelmに移行だ」
と言われるようになりました。
実際MELPAにあるアドオンパッケージ数は8対125でhelmの圧勝です。

現に候補選択フレームワークといえば、helm、ido、新勢力のivy/counsel の三つ巴状態で、今更anything.elの名を出す人はいません。

そんな中で僕はhelmを観察しつつも、ずっとanything.elを使い続けてきました。

次第にhelmの決定的な欠点が明るみになってきました。
それは、あまりにも開発速度がはやすぎるためにユーザがついていけないことです。
helm開発者は非互換な変更を平気でやります。
そのために以前は動いていた設定がいきなり動かなくなってしまいます。
それも一度や二度ではなく、あまりにも多く行われてきました。
「helmを更新したら動かなくなった」、そんな声を何度も聞きました。

非互換な変更をしたのであれば、ユーザに対し移行手段を用意してしかるべきです。
非互換な変更のために動かなくなったという問題解決にかかる時間は、とくにEmacsの熟練度が低い人にとっては致命的です。
「時は金なり」どころか 「時は命」 と思います。
相手に時間を取らせるということは、その分、相手の命を奪っていることに他なりません。

ユーザが安心して使えないようでは、フレームワークとは呼べません。

実際、僕もhelmプログラミングをしてきましたが、急に動かなくなったり遅くなったりしましたので、anything.elベースに書き直しました。

候補選択インターフェースの中において、確かに機能面においては複数の情報源・複数のアクションが持てるhelmが最強でしょう。
idoもivyも単一情報源・アクションです。
helmが王者として君臨する中でなぜivyが登場してきたかは、おそらくhelm開発者とユーザの温度差ではないかと推測しています。

anything.elはあなたに安心と機能性を提供します。

僕は以下の理念でもってanything.elをこれからも育てていきます。

  1. 互換性重視!いきなり動かなくなることをなくす
  2. Emacs Lisp初級者でも情報源を簡単に組める!連想リスト上等
  3. ユーザ目線!初級者から安心して使えるようにする
  4. anything-config.elは情報源のカタログ
  5. anything.elからEmacs Lispを学べるようにする

anything.elは 「Emacs Lisp学習キット」 と考えています。
これから細かいバグ修正にソースコードの整理を始めたいと思います。
helmと明確な差別化をはかり、 捲土重来を期す ことにします!

インストール

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

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

M-x package-install anything

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

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

<2016-11-29 Tue>こんな人は使わないでください

anything.elはhelmの4年前の姿です。
僕の中ではanything.elは昔の段階で成熟していると考えています。

ですがhelmはとてつもない勢いで開発が続けられています。
helmが好きな人は無理にanything.elを使う必要性を感じません。

  1. helmを使って満足している人
  2. 常にhelmの最新を追い掛けたい人
  3. helmの突然の変更にも喜んで受け入れられる人
  4. 複雑さを好む人
  5. EIEIO厨

<2016-11-29 Tue>こんな人にこそ使ってください

逆にこんな人にこそanything.elは試していただきたいです。

  1. Emacs Lispを学ぼうとしている人
  2. 自分で書いたanything.elのコードを無変更でずっと使いたい
  3. 情報源を自在に組み合わせたい
  4. シンプルなものが好きな人
  5. 安定・安心という価値観を大切にする人
  6. helmに嫌気を感じている人・ついていけない人
  7. idoやivyを使っている人
  8. helmを使ってても結局はバッファやファイルの選択ばかりしている人
  9. サッと候補選択をしたい人

helmはあまりにも複雑化してしまいました。
新しく情報源を定義する方法も変わってしまいました。

anything.elでは、連想リストというシンプルなデータ構造で情報源を定義できます。

情報源を定義することはEmacs Lisp初級者でも難しくありません。
候補の集合とアクションさえ与えれば、あとはanything.elが面倒を見ます。
情報源の実際の定義方法はanything-config.elが参考になります。

Emacs Lisp初級者にとって必要なものは、何といっても
実用的なプログラムを作れたという 成功体験 です。
そして、自分のプログラムが未来永劫動くという 安心感 です。

すでにある情報源を組み合わせたコマンドを作成することでさえも、
れっきとした実用的Emacs Lispプログラミングです。

anything.elによってEmacs Lisp初級者を中級者へと引き上げるお手伝いができたら嬉しいです。

僕はEmacs 25.1でも現役でanything.elを使い続けています。
なので、バグは迅速に直します。

使い方

helmの前身だけに、基本的な使い方はhelmに準じています。
M-x anything-miniやM-x anything-for-filesから試してください。

#11 Emacs に革命を起こすパッケージ「helm」 (Software Design 2015年3月号掲載記事) Emacs helm インストール 設定 使い方
も参考になるでしょう。

NEWツータッチ候補選択!

helmにはなくanything独自の機能として、ツータッチ候補選択・アクション実行があります。
機能そのものは大昔から存在していましたが、先程marginを使うように書き換えました。
以前はヒント文字が出ている候補と出ていない候補で不揃いになっていましたが、marginを使うことで見た目が良くなりました。

20161128150955.png
Fig1: C-x bでanything-miniを開く

左にA〜Gというヒント文字があります。
ここで「@」を押すとヒント文字で候補選択できるようになります。
たとえば「@d」で*Messages*バッファに切り替えられます。

使い慣れていくにつれて、アクションの場所も覚えてくるようになります。
たとえばバッファの3番目のアクションは「別ウィンドウで開く」ことです。
そこで「@3d」を押すと*Messages*バッファを別ウィンドウで開くようになります。
このアクション番号選択機能もさっき実装しました。

20161128151002.png
Fig2: ヒント文字はスクロールに合わせて自動で設定される

通常の絞り込み検索に加え、ツータッチ候補選択が合わさることで、候補数の大小にかかわらず快適な候補選択ができるインターフェースになったのではないでしょうか。

ツータッチ候補選択機能は、idoやivyユーザにも是非とも試していただきたいです。

anything.elは決して死んでいません!
生まれ変わったanything.el、試していただけると幸いです。

設定 161128150730.anything.el(以下のコードと同一)

(require 'anything-config)
(setq anything-enable-shortcuts 'prefix)
(define-key anything-map (kbd "@") 'anything-select-with-prefix-shortcut)
(global-set-key (kbd "C-x b") 'anything-mini)

実行方法

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

<2016-11-30 Wed>開発予定

これからの開発予定を軽く立ててみました。
機能的にはすでに完成していると僕の中では感じていますので、
全体的にはメンテナンスが中心となっています。

そして、何より
「Emacs Lisp学習者に成功体験を!」
というミッションを達成するために、
コードを精査し、ドキュメントをしっかり書くことにします。

anything.elの整理

anything.el本体は長く使っているコードです。
わかりにくいところは書き直して、トラブル時の原因究明をやりやすいようにします。
anything.elは完成品を提供することよりも、
ユーザが自分の意志でいじくれるような形にしていくことを狙っています。

ちょっと慣れてきた人には、フックで挙動をカスタマイズできるようにし、
上級者はadviceで自由自在に挙動を変更できるような余地を残しておきます。

candidates関数でのカレントバッファの変更

元々candidates関数はanything-bufferをカレントバッファとして評価していましたが、
anything-current-bufferをカレントバッファとした方が都合がいいことが多いことに気付いていました。
現行の挙動だと、ついついハマってしまうこともありました。

特にカレントバッファ(anything-current-buffer)の情報を集める情報源を作成する場合に、
「なんで見付からないんだよ!」
となるのは混乱の大元と考えています。

これはおそらくanything.el史上最後の非互換な変更となるでしょう。
ですが、この変更で被る影響はほとんどないと考えています。

もし、現行の挙動がいいという声が多ければ、
candidates属性は現行のままにし、新たに candidates* 属性を作成するつもりです。

anything-config.elの整理

anything-config.elは現状では、
すべての設定をひとまとめにしてあり、
12000行を超えています。

現状では見通しが悪すぎますので、大きいコードは別ファイルに分けることにします。
たとえばM-x anything-find-files関連やgrep関連は別ファイル行き確定です。

anything-config.elはカタログとして読めるようにします。

小さくてわかりやすい情報源を最初に配列しておくことで、
参考資料として使えるようにと考えています。

また、 anything-c-* 変数群は anything-* 変数群としてアクセスできるようにします。
-c-は冗長だと思うからです。

anything-complete.elの整理

Emacsシンボル収集関連はanything-apropos.el行きにします。
シンボル収集は毎回行うか、手動で行うかの設定もできるようにしておきます。

非互換性を排除するため、anything-complete.elを読み込めば、
anything-apropos.elも読み込むことにします。

anything-read-string-modeはanything-completion-modeに置き換えることにします。

anything-grep.elの開発

anything-grep.elは僕自身が長年使っているEmacs Lispです。
grepに限らず、the_silver_searcher(ag)、ripgrep(rg)、codesearch(csearch)にしても動作しています。
M-x anything-grep-by-nameは本当に重宝しています。

オンラインドキュメント・チュートリアル

anything.elは使っていくうちに覚えられるようなシステムにしたいです。

使い方・情報源作成のチュートリアルを作成予定です。

また、ドキュメントは日本語・英語の両方で書いていきます。
僕の方としても、日本語で一旦書いてから寝かして英語化した方が効率いいと考えているからです。
ファイルは anything-doc-en.el と anything-doc-ja.el を予定しています。

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


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