2017-07-14 11 views
0

私はバッファから行をコピーするためにelispを使いたいと思います。たとえば、行100〜200のテキストを別のバッファにコピーします。elisp - バッファから行を効果的にコピーする方法

地域(goto-line)を選択してコピーする必要がありますか?キーボードと同じように?いくつかの投稿は、elispコードでgoto-lineを使用しないようにしています。私はそれを行うには効果的な方法がわからない。

答えて

1

ここでは、行番号の代わりに、ポイントで動作することを除いてcopy-to-bufferに似て機能copy-lines-from-bufferだ、とcopy-to-bufferとは異なり、それがターゲットバッファの現在の内容を消去しません:

(defun copy-lines-from-buffer (buffer start-line end-line) 
    "Copy the text from START-LINE to END-LINE from BUFFER. 
Insert it into the current buffer." 
    (interactive "*bSource buffer: \nnStart line: \nnEnd line: ") 
    (let ((f #'(lambda (n) (goto-char (point-min)) 
       (forward-line n) 
       (point)))) 
    (apply 'insert-buffer-substring buffer 
      (with-current-buffer buffer 
      (list (funcall f start-line) (funcall f end-line)))))) 

copy-lines-from-buffer関数はどちらか取りますバッファまたはバッファ名を第1引数、開始行番号を第2引数、終了行番号を第3引数とする。現在のバッファのn行の先頭にポイントを返すローカルヘルパー関数fを作成し、現在のバッファをbufferに設定してfを2回呼び出して、目的のバッファ内容の開始点と終了点からなるリストを作成します。次にapplyを使用して、をbufferで呼び出し、バッファの内容の開始点と終了点を引数として呼び出します。

内容を挿入するバッファのポイントからcopy-lines-from-bufferを呼び出します。開始行の内容はコピーされた内容に含まれますが、終了行の内容は含まれません。

+0

偉大な、それは私が欲しいものです! – beetlej

関連する問題