バッファのある一行の文字列を取得する

アクセス解析を見てた時に、buffer-substringで行の取得の仕方を検索してた人がいた。そういえば行の取得の仕方を書いてなかったので書いてみようと思う。

やり方

test-string1 ;; <-ここの行にカーソルがあったとする
test-string2
;;(point-at-bol) 現在の行の先頭の位置を返す
;;(point-at-eol) 現在の行の終端の位置を返す
(buffer-substring-no-properties (point-at-bol) (point-at-eol))

というコードをコピーして、M-: として、C-y で貼り付けると *1

=> "test-string1"

という文字列を取得することができる。
また次の行や、前の行の文字列を取得したいと思ったら、

(forward-line -1)  ;;前の行
(forward-line 1)   ;;次の行

という風にして、また同じようにbuffer-substring-no-propertiesで取得すれば良い。

全部の行を処理したかったら

(progn
  (goto-char 0) ;;バッファの先頭に移動
  ;; (count-lines START END) START 位置から END のポイントまでの行数を数える
  (loop for i from 1 to (count-lines (point-min) (point-max)) do
        (buffer-substring-no-properties (point-at-bol) (point-at-eol))
        (forward-line 1)))

とかやると一行ずつバッファの文字列を取得することができる。

おまけ

さらに発展させると全ての行の先頭に連番を入れることもできる。

(progn 
  (goto-char 0) ;; バッファの先頭に移動
  (loop for i from 1 to (count-lines (point-min) (point-max)) do
        (insert (format "%d" i))
        (forward-line 1)))

あと(point-at-bol)の(point-at-eol)はそれぞれ(line-beginning-position)と(line-end-position)のエイリアスみたいです。 => Gmane -- Mail To News And Back Again

*1:M-x eval-expression (buffer-substring-no-properties (point-at-bol) (point-at-eol) ) でも 可