読者です 読者をやめる 読者になる 読者になる

行番号挿入プログラムの改良

emacs

プログラムを打ち合わせ資料に貼り付けるときに使っていたものが
あったんだけど、数百行ぐらいになるとちょっともっさりってことで
改良。何行あるか一行一行数えていたんだけど、line-number-at-pos
っていう関数が Emacs22であったから、それを使ってみました。



作ったは卒論にコードを貼り付けるときだったんで、たぶんバージョン
21のときだったかと思います。1000行でもすぐに終わったんで満足です。
なんかこの機能を提供するパッケージがあったような気がするんだけど、
行番号挿入以外使わないなって思ったので、これで十分です。

;; insert line number
(defun insert-line-number-region (rb re)
  "insert line number at each line"
  (interactive "r")
  (let* ((i 1)
         (lines (+ (- (line-number-at-pos re) (line-number-at-pos rb)) 1))
         (digit (length (number-to-string lines)))
         (line-format (concat "%" (number-to-string digit) "d:")))
    (save-excursion
      (goto-char rb)
      (beginning-of-line)
      (while (<= i lines)
        (insert (format line-format i))
        (unless (eolp)
            (insert " "))
        (forward-line 1)
        (incf i)))))

結果

 1: ;; insert line number
 2: (defun insert-line-number-region (rb re)
 3:   "insert line number at each line"
 4:   (interactive "r")
 5:   (let* ((i 1)
 6:          (lines (+ (- (line-number-at-pos re) (line-number-at-pos rb)) 1))
 7:          (digit (length (number-to-string lines)))
 8:          (line-format (concat "%" (number-to-string digit) "d:")))
 9:     (save-excursion
10:       (goto-char rb)
11:       (beginning-of-line)
12:       (while (<= i lines)
13:         (insert (format line-format i))
14:         (unless (eolp)
15:             (insert " "))
16:         (forward-line 1)
17:         (incf i)))))

こんな感じになります。