--- title: カーソル位置から行末までの数字を全て加算してその結果を返すelisp author: kazu634 date: 2008-12-21 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4459;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - Emacs - Lisp ---
『やさしいEmacs‐Lisp講座』での勉強がてら作ってみました。編集系コマンドを駆使すると、できました。要は、
100 200 300 400
という行があったときに、100の「1」の部分にカーソルを合わせてこの関数を実行すると、
1000
としてくれます。
とりあえず簡単なLispはわかるーという人。letとかの説明はされなくても大丈夫な人。
(defun my-calc-sum () (interactive) ;; tmp_point: カーソル行末のポイント ;; sum: 計算結果を格納するための変数 (let ((tmp_point (progn (save-excursion ;; 現在のカーソル位置を記憶 (end-of-line) ;; 行末に移動 (point)))) ;; 現在のポイント位置を取得し、tmp_pointに代入 (sum )) ;; sumに0を代入 (save-excursion ;; 現在のカーソル位置を記憶 ;; 数字がカーソル行に存在する間は以下の処理を実施 (while (re-search-forward "[0-9]+" tmp_point t) ;; 検索結果を数字として認識し、sumに加算 (setq sum (+ sum (string-to-number (buffer-substring (match-beginning ) (match-end ))))))) (kill-line) ;; カーソル位置から行末までを消去 (insert (number-to-string sum)))) ;;計算結果を挿入
re(gular)-search-forwardという意味です。そのままずばりで、「正規表現を用いた前方検索」というやつです。使い方は、
(re-search-forward "正規表現" 検索する範囲 エラー回避 回数)
となります。
現在位置のポイントを記憶し、以降に記述する処理を実行します。save-excursionのブロックを抜けると、記憶したポイント位置に戻ります。
カーソル位置から行末までを消去します。これは知っている人も多い?Ctrl-kにデフォルトでは割り当てられています。