Hatena::Groupemacs

Emacs/Lisp/Drill

|

2011-08-09

Exuberant ctagsで生成されるtagsファイルを最大限活用するanything-exuberant-ctags.elを作ってみた

22:24 | はてなブックマーク - Exuberant ctagsで生成されるtagsファイルを最大限活用するanything-exuberant-ctags.elを作ってみた - Emacs/Lisp/Drill

PHPを触っている限りはGNU GLOBALとanything-gtags.elで十分なんだけれども、残念ながらRubyはサポートしていない。

後輩のRubyistEmacsを教えている時に、ふと「Ruby+Emacsの場合って、TAGS関係はどうするんだろ?」と思って調べたり聞いてみたら、どうやら"ctags -R -e"でetags互換のTAGSを生成して利用しているらしい。


で、d:id:buzztaikiさんの2年前の記事を思い出して、Exuberant ctagsがサポートする言語をみてみたらRubyがあった。

んでもって、anything-etags.elを元にごにょごにょしてanything-exuberant-ctags.elを作ってみた。

せっかくなので、id:kiwanamiさんのanything-find-project-resources.elを参考に見た目も若干見やすくしてみた。


GitHub - k1LoW/anything-exuberant-ctags: Exuberant ctags anything.el interface

no title


PHPerにとっては、多少表示項目が増えただけなのでそこまで面白くないけれども、JavaScriptなんかと透過的に検索できるのはなかなか良いかも。

(GNU GLOBALはJavaScriptはサポートしていない)

Rubyistにとっては、正直anything-yaetags.elのほうがインターフェース的に使いやすいと思う。

Railsソースコードでtagsを作ってみて、初めてd:id:buzztaikiさんが言っていたことが分かった。同名のタグが多すぎる。


というわけで、自分がanything-yaetags.elのソースを読みきるか、誰かが作らないかぎりRubyistはanything-yaetags.elを使っていたほうがいいと思う。

タイトルに「最大限」とか書いたけれども微妙な結果になっていたという。


なんだかなー。

BobboBobbo2011/10/09 11:15Smack-dab what I was lkooing for-ty!

oyfmcraaoyfmcraa2011/10/10 01:43o3UKtj <a href="http://kjmzszwfqzgp.com/">kjmzszwfqzgp</a>

tlyfeoufhtlyfeoufh2011/10/10 22:502TmKnN , [url=http://jprtpqfpsizi.com/]jprtpqfpsizi[/url], [link=http://xrxofucblrud.com/]xrxofucblrud[/link], http://hwtqedgkylhi.com/

ralnbzpxralnbzpx2011/10/14 01:26qwD2Lb , [url=http://dqfbhjtpythl.com/]dqfbhjtpythl[/url], [link=http://giigzcgrrqku.com/]giigzcgrrqku[/link], http://ehmvjtmldjpf.com/

2011-01-08

anything-replace-string.elがquery-string()にも対応した

17:28 | はてなブックマーク -  anything-replace-string.elがquery-string()にも対応した - Emacs/Lisp/Drill

d:id:kitokitokiさんによる怒涛の修正が加えられて、anything-replace-string.elがquery-string()に対応しました。

ついでに、置換履歴に「replace-string()の履歴かquery-string()の履歴か」を保持して、よきにはからって実行アクションを変更する'Smart Replace'も追加した。


GitHub - k1LoW/anything-replace-string: replace-string() and query-string() `anything.el' interface


便利ー。d:id:kitokitoki++

2011-01-07

replace-string()の置換履歴を使って置換できるanything-replace-string.elを作ってみた

23:02 | はてなブックマーク -  replace-string()の置換履歴を使って置換できるanything-replace-string.elを作ってみた - Emacs/Lisp/Drill

キーバインドを割り当てるくらい多用するreplace-string()なんだけれども、置換履歴を1対しか持てないのが不便。

なので、前々から構想していたreplace-string()の置換履歴をfrom-stringとto-stringの対で保持しつつ、さらにその履歴をanything.elインターフェースで再利用して置換できるEmacs Lispを書いてみた。


GitHub - k1LoW/anything-replace-string: replace-string() and query-string() `anything.el' interface


使い方はanything-replace-string.elをロードパスに設置して、

(require 'anything-replace-string)

と書いて設置完了。

後はM-x replace-stringの代わりにM-x anything-replace-stringとするだけ。


一部でreplace-string()の挙動をエミュレートしているような部分もあるので、まだバグがあったりするかもしれないけれども、replace-string()の代わりに使っていて今のところ問題なし。

置換履歴を対で保持するのがミソで、これが結構便利。

もう少し使って問題なければEmacsWikiに上げたい。


でも、なんでreplace-string()は

This function is usually the wrong thing to use in a Lisp program.

って書いてあるんだろ。

kiwanamikiwanami2011/01/08 11:56replace-stringは対話的な「command」なのでいろいろと副作用があるようです。なので、プログラム中で置換したいときは、re-search-forward(バッファ)とかreplace-regexp-in-string(文字列)を使いなさいと言うことだと思います。
http://d.hatena.ne.jp/m2ym/20100320/1269072746

kitokitokikitokitoki2011/01/08 14:54次 anything-query-replace つくろうと tomoya さんと話してたんです。先こされた。あとでパッチ送ります。

k1LoWk1LoW2011/01/11 09:14> d:id:kiwanami
たしかに対話的ですね。そういえば引用URLのやり取りをみていた覚えがありました。(interactive)な関数は副作用があるかもと考えてもいいかもしれないですね。

> d:id:kitokitoki
パッチありがとうございます。あとはfirst-actionを切り替えれれば完成ですかねー

2010-12-11

空気のようなEmacs Lisp -2010 冬-

14:48 | はてなブックマーク - 空気のようなEmacs Lisp -2010 冬- - Emacs/Lisp/Drill

Emacs Advent Calendar 2010ということで。

10日目はd:id:handlenameさんのorg-modeでTODO管理 - handlename's blogです。

今年もレベル高いですねー。今までのエントリーではd:id:podhmoさんfletの説明がわかりやすかったです。fletの扱いには苦労しています。


さて、11日目です。自分は昨年に引き続き「空気のようなEmacs Lisp」を紹介します。

ちなみに昨年の「Calendar->空前のEmacsブーム->社内でEmacsが浸透」作戦は見事に失敗に終わってしまい、相変わらずEmacserは社内ではマイノリティです。

昨年は鬼軍曹.elという「人に厳しいEmacs Lisp」の紹介だったので、今年は「真鬼軍曹.el」という「さらに厳しいEmacs Lisp」の紹介をしようと思いましたが、世間から抹殺されてしまいそうなので、やめときます。


今回は、個人的に「これ別にEmacs標準でよくね?」と思えるくらい便利なのに、意外に浸透していないっぽいEmacs Lisp(と設定)を2つ紹介します。

導入していない人はだまされたと思ってインストールしてみてください。


sequential-command.el

だんだんEmacsに慣れてくると、同時にMacを使っているときにちょっと便利になるキーバインドに心当たりありませんか?もしくはシェルでコマンドを打っているときかもしれません。心当たりありませんか?


多分Emacsに慣れすぎている人には空気のようなキーバインドです。

そう、C-a(行頭に移動)、C-e(行末に移動)の2つです。

もしかしたら、このキーバインドを使っていない人はまだEmacsビギナーかもしれません。


f:id:k1LoW:20101211143657p:image


ただ、C-aもC-eも行頭や行末に移動したあとは無意味なキーバインドになってしまいます。あまりに慣れすぎてそうは考えないとは思いますが、たしかに行頭でC-aを押しても意味がありません。


ここでC-aとC-eを「今までの機能をそのままに」拡張してみましょう。

以下の設定を.emacsに記述します。その際にsequential-command.elをロードパスに設置しておきます。

(require 'sequential-command)

(define-sequential-command seq-home
  back-to-indentation  beginning-of-line beginning-of-buffer seq-return)
(global-set-key "\C-a" 'seq-home)

(define-sequential-command seq-end
  end-of-line end-of-buffer seq-return)
(global-set-key "\C-e" 'seq-end)

これを設定するとC-aとC-eは以下のような動きをします。


f:id:k1LoW:20101211143658p:image


C-aやC-eを連続して打つことによって複数のタイプのポイント移動を実現しています。

また最終的には元の位置に戻るので、思考としては「とりあえず先頭に移動」するためにC-aを打ちます。インデントの「先頭」なのか行の「先頭」なのか文の「先頭」なのかは考える必要がなくなります。

空気のようなキーバインドがさらに拡張されました。


このsquential-command.elは、複数のコマンドをトグル形式で1つにまとめるEmacs Lispです。作者はanything.eld:id:rubikitchさんです。(d:id:rubikitchさんによるsequential-command.el紹介文はこちら)


smartchr.el

みなさん今日も元気にEmacsプログラミングしていますか?自分は今日もPHPときどきJavaScriptプログラミングです。

さきほど紹介したsequential-command.elはコマンドをまとめるEmacs Lispでしたが、smartchr.elはキーを押して入力される文字列をまとめるEmacs Lispです。

例えばPHPプログラミングをしている方は、以下の設定を.emacsに記述してみてください。smartchr.elはロードパスに設置しておきます。

(global-set-key (kbd "=") (smartchr '(" = " " == " " === ")))

これを設定すると、"="キーを押したタイミングで" = "が文字入力されます。

さらに"="を押すと" == "が文字入力されます。

さらに"="を押すと" === "が文字入力されます。

さらに"="を押すと"="が文字入力されます。

他のキーを押したタイミングで通常どおりに入力がされます。


「"="の前後にスペースをいれる」。たったそれだけでソースコードの視認性は上がります。

「"="の前後にスペースをいれる」。たったそれだけの操作が無くなるだけでプログラムを書くスピードが上がります。思考としては「(プログラムとして必要な)"="を入力する」ということだけ考えるだけでよくなります。

空気のようにスペースが入力されますよ。

このsmartchr.elは、複数の入力文字列をトグル形式で1つにまとめるEmacs Lispです。作者はd:id:IMAKADOさんです。(d:id:IMAKADOさんによるsmartchr.elの紹介文はこちら)


まとめ

今回も「空気のようなEmacs Lisp(と設定)」を2つほど紹介しました。

この2つは1つのキー操作で複数の操作をトグル形式でおこなうEmacs Lispです。d:id:kiwanamiさんの言葉を借りるならば「空気を読むコマンド」「コンテキスト依存コマンド」です。(d:id:kiwanamiさんの昨年の考察はこちら)

目立たないですが、あるとないとでは大違いな空気のようなEmacs Lispの紹介でした(たぶん)。

皆さんも是非設定してみてください。


あすはid:takano32さんです。

2010-09-21

任意のディレクトリを開くanything-sourcesを複数動的に生成する

21:11 | はてなブックマーク - 任意のディレクトリを開くanything-sourcesを複数動的に生成する - Emacs/Lisp/Drill

地道にcake.elアップデートしているのだけれども(最近同じシリーズでRails用Lithium用も作っている)、その中でのちょっとしたコード。

任意ディレクトリを開くanything-sourcesを複数動的に生成するコード。

「,」とか「`」とか初めて使った。

「どうにかしてできるはず」と思って本屋にまで調べにいったけど見つからず。結局リファレンスに載ってた。


普通に考えると誰得なコードなのだけれども(複数のsourceを設定すればいいじゃん的な)、ディレクトリ間に関連があるようなフレームワークのマイナーモードを作成している人には便利かと(カレントバッファのファイルに関連するMVCの各ディレクトリを同時に開く関数を作るとか)。


やっぱり誰得かー。

|