こんにちは、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便利です。
■