在启动过程和弹出​​到缓冲区之后滚动窗口

时间:2013-12-15 22:48:36

标签: emacs elisp

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

(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退出,屏幕就像


Process echo finished

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

blah

Process echo finished

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

3 个答案:

答案 0 :(得分:0)

\n内置Process之前,似乎有一个process.c。也许有人可以建议你在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

答案 1 :(得分:0)

有点黑客,但对我来说这很有效:

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

答案 2 :(得分:0)

使用进程Sentinel修复它:

(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),这可能不是您想要的。