2010-02-14 [長年日記]
_ [emacs][ruby] emacs lisp "shell-command-on-region" を使って選択した範囲をruby ワンライナーで処理
ここ2年ほどemacsを使ってますが、
育てゲーと表すべきカスタマイズし放題な作りに快適なエディタライフを送っています。
不便だなと感じていたのは正規表現の部分で、
emacsの正規表現は*? とか +? みたいな最短一致ができない。
正規表現の部分だけrubyのものを使えたら便利なのに、ということで調べてみた。
「選択範囲をrubyに渡して結果を選択範囲に流し込む」、そんなelispを書けばいいんだな、
と思ったら、そのものずばりの shell-command-on-region がありました。emacsすごい。
あとは開始時にregexpと置換後の文字列を渡したいので、
2つの引数を入力するにはinteractiveにどう書くの?ってとこではまったのですが、
会社の先輩に書き方を教えてもらいました。\nで改行で区切ればいいのね。
あとは最初の1文字のsが文字列を現す意味だと知らずにはまったりとか。
rubyのコードはワンライナーでこう書きました。
ruby -p -e '$_.gsub!(/regexp/, %q`dst`)'
-p の意は渡された文字列を1行ずつ $_ に入れて $_.gsub!(/regexp/, %q`dst`) を実行。
動作環境によっては日本語コードの指定(-Kx)も必要かもだけど、
今のところ問題ないので様子見中。
便利になりました。 :)
追記:ワンライナーのdstをダブルクオテーションで囲ってたけど、
正規表現の括弧を\1で使ったりするときに\記号を重ねないといけなくなるので、
シングルクオテーションに変更した。
そうするとワンライナーの'とかぶるので、
%記法を使って%q``で括ってみた。
置換先の文字列にバッククオテーションは使わないだろってことで。