我正在尝试编写一个编译一些代码的函数,如果编译成功,它会生成进程并在新窗口中打开它的输出。编译位工作正常,但第二部分有一些奇怪的事情。我写了一些看起来像这样的代码:
(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-up
和goto-char
之类的东西,但它们似乎没有任何影响。从其他一些来源看来,似乎我可以将一个哨兵附加到进程中,并在输出时向上滚动,但这似乎有点过分只是在开头向上滚动。
答案 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)
,这可能不是您想要的。