« Javaでグラフの連結成分を求める |Main| howm日記5日目、かな? »

« Pythonで87文字でCollatz角谷問題の(以下略 | Scheme/Lisp | »

選択範囲の行頭の余計な空白を取り除く

海馬日記 - my-unindent-region――Emacsで「逆インデント」を参考にしつつ、タブとスペースが混在していると使えないので自分用に改造しようと、F1fで関数の意味を調べたり、GNU Emacs Lisp Reference Manualで関数を探したり、見たことのないlet構文やwhile構文を取り除いたりしていたらこんなものができました。

選択範囲を最初にuntabifyしてしまってから、行頭のスペースの数が一番少ないところにあわせてそのスペースを取り去るというもの。最初は「バッファから選択範囲の文字列を取り出して加工して書き戻そう」と思ったのですけど、「選択範囲の文字列を変更」という関数がなんなのかわからなかったのでこうなりました。どうも「編集範囲を制限してからその範囲に処理を行う」というやり方の方がEmacsらしいようです。

(defun my-unindent-region (start end)
  (interactive "r")
  (save-excursion
    (save-restriction
      (narrow-to-region start end)
      (untabify start end)
      (goto-char (point-min))
      (replace-regexp
       (concat "^" 
	       (make-string
		(apply 
		 'min 
		 (mapcar
		  (lambda (line)
		    (progn 
		      (string-match "^ *" line)
		      (match-end 0)))
		  (split-string (buffer-string) "\n")))
		32))
       ""))))

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/423

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.