elisp 行の先頭に行番号を追加

| | トラックバック(0)

ある掲示板にemacsで下記のことを実現するにはどうしたらいいかという書き込みがあった。

各行の先頭に行番号を追加する。 引数として数値を入力すると、その数値を初期行数として使用し、その値からの増加を追加する。

aaa
bbb
ccc
の場合。

引数を渡さなかった場合は
1 aaa
2 bbb
3 ccc

引数8を渡した場合、
8 aaa
9 bbb
10 ccc

メジャーモード製作を目指している自分にとってはちょうど良い練習だと思って自分なりに作って掲示板に書き込んでみた。

↓これ。

(defun add_line_number (&optional start)

"add line number"

(interactive "p")

(or start (setq start 1))

(save-excursion

(let ((max-line 0) (current-line 1))

(goto-char (point-max))

(setq max-line (count-lines (point-min) (point)))

(goto-char (point-min))

(while (<= current-line max-line)

(goto-line current-line)

(insert (format "%d " (+ current-line)))

(setq current-line (1+ current-line))))))

その後、このlispコードを見た人が以下の3点の指摘をしてくれた。

  • lispの関数名には"_"(アンダーバー)でなく"-"(ダッシュ、マイナス)を使う。
  • バッファの最後までの処理をする際は、最後の行を数えるのではなく、通常 (eobp)を使用する。
  • 次の行に移動する場合は、通常(forward-line 1)を使用する。

    早速これを参考に修正してみた。

    (defun add-line-number (&optional start)

    "add line number"

    (interactive "p")

    (or start (setq start 1))

    (save-excursion

    (let ((current-line 0))

    (goto-char (point-min))

    (while (not (eobp))

    (insert (format "%d " (+ start current-line)))

    (setq current-line (1+ current-line))

    (forward-line 1)))))

    なんかかなりすっきりと実現できてしまった。
    最初の自分が作ったのはかなり無理やり感が漂っている。
    良い勉強になった。
    指摘してくれた人サンクス!!さらに、ここはこうするべきってころがあればご教授お願いします。(コメント欄で)

    後に、わざわざlispで書かなくても、emacsの正規表現置換(replace-regexp)を使えばできることが判明。

    ^ (行先頭)

    \,(+ 5 \#)  (数値、引数5の場合。)
    を置換する。
    しかし、自分のxemacsの環境ではこの方法は上手くいかなかった。


    ↓こんなのあった。自分としては、elispで高レベルを目指すつもりはない。とにかく、自分の作業効率を上げるためにメジャーモードを作ったり、コマンドを作ったり、自由にカスタマイズできるようになれれば、それで良いのである。
    Scheme:Schemeプログラマのレベル10

    ↓ちなみに、Perl版もある。こっちは、高レベルを目指したい・・・。
    Perlプログラマのレベル10

  • トラックバック(0)

    このブログ記事を参照しているブログ一覧: elisp 行の先頭に行番号を追加

    このブログ記事に対するトラックバックURL: http://www.chillout.in/blog/mt/mt-tb.cgi/668