【问题标题】:Window scrolling after start-process and pop-to-buffer启动进程和弹出缓冲区后的窗口滚动
【发布时间】:2013-12-15 22:48:35
【问题描述】:

我正在尝试编写一个编译一些代码的函数,如果编译成功,它会生成进程并在新窗口中打开其输出。编译位工作正常,但第二部分发生了一些奇怪的事情。我写了一些看起来像这样的代码:

(defun test-function ()
  (with-current-buffer (get-buffer-create "*output*")
    (erase-buffer)
    (start-process "echo" (current-buffer) "echo" "hi")
    (pop-to-buffer (current-buffer))))

这段代码几乎可以运行,但是当它运行时,屏幕顶部似乎位于程序实际输出的正下方。所以,一旦echo 退出,屏幕看起来像

进程回显完成

向上滚动一行给出(预期的)

废话 进程回显完成

有没有办法让它从缓冲区的实际顶部开始?在开始该过程之前和之后,我已经尝试过scroll-upgoto-char 之类的东西,但它们似乎没有任何影响。从其他一些来源来看,我似乎可以在进程中附加一个哨兵,并在有输出时让它向上滚动,但这似乎只是在开始时向上滚动。

【问题讨论】:

  • scroll-upgoto-char 没有帮助,因为 start-process 异步工作:进程启动并且函数调用通常在任何进程有机会将任何内容写入缓冲区之前返回。恕我直言,在进程完成状态更改时将点移动到开头的哨兵并不是矫枉过正,而是一个有效的解决方案。

标签: emacs elisp


【解决方案1】:

process.c 中的 Process 之前似乎有一个 \n。也许有人可以建议您在 Emacs 已经构建之后如何修改它 - 如果没有,自定义构建似乎是一个极端的解决方案。

当然,你也可以使用elisp代码上去,事后删除硬回车。

Searching 5342 files for "\nprocess"

/Users/HOME/Desktop/emacs-trunk/src/process.c:
 6405        tem = BVAR (current_buffer, read_only);
 6406        bset_read_only (current_buffer, Qnil);
 6407:       insert_string ("\nProcess ");
 6408        { /* FIXME: temporary kludge.  */
 6409   Lisp_Object tem2 = p->name; Finsert (1, &tem2); }

/Users/HOME/Desktop/emacs-trunk/lisp/man.el:
 1304                      (substring msg 0 eos) msg))))
 1305              (goto-char (point-max))
 1306:             (insert (format "\nprocess %s" msg))))
 1307        ))
 1308          (if delete-buff

/Users/HOME/Desktop/emacs-trunk/lisp/progmodes/sql.el:
 3944    (if (and (eq (current-buffer) sql-buffer)
 3945      (not buffer-read-only))
 3946:       (insert (format "\nProcess %s %s\n" process event))
 3947      (message "Process %s %s" process event)))
 3948  

/Users/HOME/Desktop/emacs-trunk/lisp/shell.el:
  641      (when (buffer-live-p buf)
  642        (with-current-buffer buf
  643:         (insert (format "\nProcess %s %s\n" process event))))))
  644  
  645  ;;;###autoload

4 matches across 4 files

【讨论】:

  • 是导致问题的换行符吗?即使没有换行符,它仍然不会显示“blah”,它只会显示“Process echo finished”而没有空行。
  • 我的猜测是blah 之后有一个\n(可能也在process.c 中定义),还有一个\nProcess 之前,如上所述。
  • 我明白这一点,但我不明白为什么换行符会导致窗口位于该特定位置。
  • 我无法想象这个问题 - 也许通过在您的问题中添加屏幕截图,我或其他人可能能够进一步帮助您。
【解决方案2】:

有点小技巧,但对我来说这是可行的:

(insert "\n")
(start-process ...

【讨论】:

    【解决方案3】:

    用进程哨兵修复它:

    (defun recenter-temp-buffer (process event)
      (pop-to-buffer (process-buffer process)) (recenter-top-bottom))
    
    (with-output-to-temp-buffer "test-buffer"
      (set-process-sentinel 
        (start-process "test-process" "test-buffer" "echo" "hello") 
                       'recenter-temp-buffer))
    

    请注意,每次状态更改时哨兵都会调用(recenter-top-bottom),这可能不是您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2013-07-19
      • 2014-10-29
      相关资源
      最近更新 更多