【问题标题】:elisp - How to copy lines from a buffer effectivelyelisp - 如何有效地从缓冲区复制行
【发布时间】:2017-07-20 21:46:06
【问题描述】:

我想使用 elisp 从缓冲区中复制行。例如:将第 100 到 200 行的文本复制到另一个缓冲区。

我应该选择区域(转到行)然后复制它吗?就像我们用键盘做的一样?有些帖子说不要在 elisp 代码中使用 goto-line。我不知道什么是有效的方法。

【问题讨论】:

    标签: elisp


    【解决方案1】:

    这是一个函数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,它返回当前缓冲区的n行开头的点,并在当前缓冲区设置为buffer的情况下调用f两次以创建一个包含起点的列表和所需缓冲区内容的结束点。然后它使用applybuffer 调用insert-buffer-substring,并将缓冲区内容的起点和终点作为参数。

    从缓冲区中要插入内容的位置调用copy-lines-from-buffer。复制的内容中包含起始行的内容,但不包含结束行的内容。

    【讨论】:

    • 太好了,这正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多