如果我正在运行带有一堆缓冲区的 emacs --daemon,有没有办法启动 emacsclient 以便它打开我上次工作时的顶部缓冲区?如果我使用 emacsclient -t 或 emacsclient -c 它会创建一个新框架并将其放在顶部,我怎样才能避免这种行为并恢复我正在做的事情?
4 回答
您可以尝试以下方法:
emacsclient -e '(raise-frame)'
或者
emacsclient -e '(other-frame 0)'
如果这些解决方案都不起作用(取决于您的窗口管理器),您还可以尝试以下解决方案(来自this SO answer):
emacsclient -e "(select-frame-set-input-focus (selected-frame))"
好像我找到了答案,虽然它有点不雅。在我的 .bash_profile 中,我把
alias emacs='emacsclient -a "" -t -e \(kill-buffer\)'
因此,如果守护进程不存在,则会启动它,emacs 客户端连接到它,创建一个新缓冲区并立即将其杀死,从而留下之前在顶部的任何缓冲区(我使用 emacs 桌面保存)现在显示在顶部.
您似乎对 emacs 概念有些困惑。框架在emacs 中,其他人称之为窗口,而 emacs窗口是显示缓冲区(您正在编辑的文本)的位置。
选项-c
和-t
应该创建一个新框架(以图形方式或在 tty 上),如果您不希望这样做,则将它们排除在外。
如果仍然有一个打开的(图形)框架,则最后一个活动的框架将被聚焦(可能取决于您的窗口管理器)并在最后一个活动窗口中显示访问给定文件的缓冲区。如果没有图形框架,则在当前 tty 上打开一个新框架。
emacsclient
不能在没有文件或目录以及 或的情况下调用。因此,请使用您的窗口管理器来显示所需的框架。-t
-c
但是,如果您真正想要的是,在列表顶部打开一个带有缓冲区的新帧(list-buffers)
,那么您就不走运了,因为新帧总是显示暂存缓冲区(如果未配置)。您可以使用变量手动更改C-x b
或修补initial-buffer-choice
。
没有
emacsclient -e '(raise-frame)'
或者
emacsclient -e '(other-frame 0)'
或者
emacsclient -e "(select-frame-set-input-focus (selected-frame))"
为我工作。它们确实导致 emacs 最初显示 *scratch* 以外的缓冲区,但这不是我正在处理的最后一个缓冲区。我必须编写自己的机制才能使其正常工作 - 它假设您使用 Cx Cc 断开 emacsclient 与服务器的连接:
(defun save-last-buffer-name-and-kill()
(interactive)
(setq jeeves/last-buffer-name (current-buffer))
(save-buffers-kill-terminal)
)
(defun get-last-buffer-name()
jeeves/last-buffer-name
)
(global-set-key (kbd "C-x C-c") 'save-last-buffer-name-and-kill)
(setq initial-buffer-choice 'get-last-buffer-name)