アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

隙があればlispを詰め込んで行きたい

こんにちは、chibaです。
今回もネタがないのでEmacsネタです。 日常のちょっとしたテキストの編集作業なのですが、

app/views/top/foo.html.erb
app/views/shared/_foo.html.erb
app/views/shared/foo.html.erb
app/views/top/_foo.html.erb
app/views/shared/foo.html.erb
app/views/layouts/application.html.erb
config/links/foo.html.erb
public/images/shared/foo.jpg

のようなテキストをスペース区切りの一行にまとめる必要に迫られました。
ここはEmacsで、改行をスペースに置換してやれば良いんじゃないかと思いますが、いや、ここは踏ん張ってlispを書いてゆきたいと思い、

(mapconcat (lambda (x) (format "%s" x))
'(
app/views/top/foo.html.erb
app/views/shared/_foo.html.erb
app/views/shared/foo.html.erb
app/views/top/_foo.html.erb
app/views/shared/foo.html.erb
app/views/layouts/application.html.erb
config/links/foo.html.erb
public/images/shared/foo.jpg
)
" ")

のようなものを書いて、式のにカーソルを持っていって、C-u C-x C-eです。
そうすると、式の後ろに

=> "app/views/top/foo.html.erb app/views/shared/_foo.html.erb app/views/shared/foo.html.erb app/views/top/_foo.html.erb app/views/shared/foo.html.erb app/views/layouts/application.html.erb config/links/foo.html.erb public/images/shared/foo.jpg"

のようなものが挿入されます。lambdaって書けて良かったですよね。
次に、

A    app/views/top/foo.html.erb
M    app/views/shared/_foo.html.erb
M    app/views/shared/foo.html.erb
M    app/views/top/_foo.html.erb
?    app/views/shared/foo.html.erb
M    app/views/layouts/application.html.erb
A    config/links/foo.html.erb
M    public/images/shared/foo.jpg

のようなテキストでファイル名の部分だけ、一行にスペース区切りでつなげる必要に迫られました。
ここは、Emacsで、kill-rectangleでしょうか。いや、ここは踏ん張ってlispを書いてゆきたいと思い、

(apply #'concat
(loop for (x y) on
'(
A    app/views/top/foo.html.erb
M    app/views/shared/_foo.html.erb
M    app/views/shared/foo.html.erb
M    app/views/top/_foo.html.erb
?    app/views/shared/foo.html.erb
M    app/views/layouts/application.html.erb
A    config/links/foo.html.erb
M    public/images/shared/foo.jpg
)
by #'cddr
collect (format "%s " y))
)

のようなものを書き、上と同じく、eval-last-sexp すると

"app/views/top/foo.html.erb app/views/shared/_foo.html.erb app/views/shared/foo.html.erb app/views/top/_foo.html.erb app/views/shared/foo.html.erb app/views/layouts/application.html.erb config/links/foo.html.erb public/images/shared/foo.jpg "

という文字列が得られます。
なるほど、これは、shell-command-on-regionで、awk ‘{if($1==”M”){printf(“%s “, $2);}}’とかしている場合ではないですね。
Emacs便利です。