【问题标题】:How to display results in a dedicated buffer?如何在专用缓冲​​区中显示结果?
【发布时间】:2017-10-07 01:45:15
【问题描述】:

如果我当前的缓冲区是foo,并且我运行C-x C-b(又名list-buffers),我的Emacs 窗口将一分为二,foo 占据两个结果窗口之一,一个专用的*Buffer List*缓冲区占用另一个。在此操作结束时,foo 仍然是活动缓冲区,point 仍然是在执行 C-x C-b 之前的状态。

我想编写一个以类似方式显示多页输出的交互式函数:必要时拆分窗口,调出专用缓冲区,将活动缓冲区保留为函数运行前的状态。

我设法做的最好的事情是具有以下结构的函数:

(defun my-func ()
  (interactive)
  (let ((this-buffer (current-buffer))
        (other-buffer (get-buffer-create "*my-func's Dedicated Buffer*")))
    (switch-to-buffer-other-window other-buffer)
    (erase-buffer)
    (insert (compute-pages-and-pages-of-stuff))
    (beginning-of-buffer)
    (switch-to-buffer-other-window this-buffer)))

这或多或少是可行的,但我认为 Emacs 已经有内置语法来简化此类代码。

IOW,我认为在下面的 sn-p 中有一种类似于(虚构的)WITH-BUFFER-OTHER-WINDOW 的特殊形式:

(defun my-func ()
    (interactive)
    (let ((other-buffer (get-buffer-create "*my-func's Dedicated Buffer*")))
        (WITH-BUFFER-OTHER-WINDOW other-buffer
           (erase-buffer)
           (insert (compute-pages-and-pages-of-stuff))
           (beginning-of-buffer))))

甚至可能

(defun my-func ()
    (interactive)
    (let ((other-buffer (get-buffer-create "*my-func's Dedicated Buffer*")))
        (WITH-BUFFER-OTHER-WINDOW other-buffer
            (compute-pages-and-pages-of-stuff))))

我尝试过save-excursionsave-current-buffer 之类的形式,但它们无法重现所需的行为。

是否有内置的方式来执行上述操作?

【问题讨论】:

    标签: elisp


    【解决方案1】:

    这是利用内置 display-bufferwith-current-buffer 可以获得的最短时间:

    (defun my-func ()
      (interactive)
      (let ((buffer (get-buffer-create "*my-func's Dedicated Buffer*")))
        (with-current-buffer buffer
          (erase-buffer)
          (insert (compute-pages-and-pages-of-stuff))
          (goto-char (point-min)))
        (display-buffer buffer)))
    

    如果你使用这种模式太多以至于它开始让你烦恼,请随意定义一个辅助宏:

    (defmacro my-setup-and-display-buffer (name &rest body)
      (declare (indent 1))
      (let ((buffer (make-symbol "buffer")))
        `(let ((,buffer (get-buffer-create ,name)))
           (with-current-buffer ,buffer
             ,@body)
           (display-buffer ,buffer))))
    
    (my-setup-and-display-buffer "*my-func's Dedicated Buffer*"
      (erase-buffer)
      (insert (compute-pages-and-pages-of-stuff))
      (goto-char (point-min)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 2013-12-21
      • 1970-01-01
      • 2011-07-17
      • 2015-09-23
      相关资源
      最近更新 更多