elisp - 如何有效地从缓冲区复制行
elisp - How to copy lines from a buffer effectively
我想使用 elisp 从缓冲区复制行。例如:将第 100 行到第 200 行的文本复制到另一个缓冲区。
我应该 select 区域(转到行)然后复制它吗?就像我们用键盘做的一样?一些 post 说不要在 elisp 代码中使用 goto-line。我不知道什么是有效的方法。
这里有一个函数 copy-lines-from-buffer
类似于 copy-to-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
函数将缓冲区或缓冲区名称作为第一个参数,开始行号作为第二个参数,结束行号作为第三个参数。它创建了一个本地辅助函数 f
,returns 指向当前缓冲区行 n
的开头,并在当前缓冲区设置为 [= 的情况下调用 f
两次18=] 创建一个列表,其中包含所需缓冲区内容的起点和终点。然后它使用 apply
以 buffer
调用 insert-buffer-substring
并且缓冲区内容开始和结束点作为参数。
从缓冲区中要插入内容的位置调用 copy-lines-from-buffer
。起始行的内容包含在复制的内容中,但不包含结束行的内容。
我想使用 elisp 从缓冲区复制行。例如:将第 100 行到第 200 行的文本复制到另一个缓冲区。
我应该 select 区域(转到行)然后复制它吗?就像我们用键盘做的一样?一些 post 说不要在 elisp 代码中使用 goto-line。我不知道什么是有效的方法。
这里有一个函数 copy-lines-from-buffer
类似于 copy-to-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
函数将缓冲区或缓冲区名称作为第一个参数,开始行号作为第二个参数,结束行号作为第三个参数。它创建了一个本地辅助函数 f
,returns 指向当前缓冲区行 n
的开头,并在当前缓冲区设置为 [= 的情况下调用 f
两次18=] 创建一个列表,其中包含所需缓冲区内容的起点和终点。然后它使用 apply
以 buffer
调用 insert-buffer-substring
并且缓冲区内容开始和结束点作为参数。
从缓冲区中要插入内容的位置调用 copy-lines-from-buffer
。起始行的内容包含在复制的内容中,但不包含结束行的内容。