如何用Elisp代码在新Emacs会话中显示已有Buffer?
在新Emacs会话中打开现有Buffer的Elisp实现
下面分两种场景给出具体实现,你可以根据需求选择或整合:
场景1:Buffer关联已保存文件
如果当前Buffer对应已保存到磁盘的文件,直接启动新Emacs进程并指定文件路径即可:
(defun open-buffer-in-new-emacs-session () (interactive) (let ((buffer-file (buffer-file-name))) (if buffer-file (start-process "new-emacs" nil "emacs" buffer-file) (message "当前Buffer未关联已保存文件,请使用临时文件方案"))))
代码说明:
buffer-file-name:获取当前Buffer对应的本地文件路径start-process:启动独立的Emacs进程,将文件路径作为参数传入- 若Buffer未关联文件,会弹出提示信息
场景2:临时未保存Buffer
对于未绑定本地文件的临时Buffer,需要先把内容写入临时文件,再用新会话打开:
(defun open-temp-buffer-in-new-emacs-session () (interactive) (let* ((temp-file (make-temp-file "emacs-temp-buffer-")) (buffer-content (buffer-string))) ;; 将Buffer内容写入临时文件 (with-temp-file temp-file (insert buffer-content)) ;; 启动新Emacs进程打开临时文件 (start-process "new-emacs" nil "emacs" temp-file) (message "临时Buffer已在新会话打开,文件路径:%s" temp-file)))
代码说明:
make-temp-file:创建临时文件,前缀为emacs-temp-buffer-,系统自动生成唯一后缀buffer-string:获取当前Buffer的全部文本内容with-temp-file:打开临时文件并写入内容,完成后自动保存关闭
通用整合版函数
把两种场景整合到一个函数,自动判断Buffer类型并处理:
(defun open-current-buffer-in-new-emacs-session () (interactive) (let ((buffer-file (buffer-file-name))) (if buffer-file (progn (start-process "new-emacs" nil "emacs" buffer-file) (message "已在新会话打开文件:%s" buffer-file)) (let* ((temp-file (make-temp-file "emacs-temp-buffer-")) (buffer-content (buffer-string))) (with-temp-file temp-file (insert buffer-content)) (start-process "new-emacs" nil "emacs" temp-file) (message "临时Buffer已在新会话打开,文件路径:%s" temp-file)))))
使用方法:
切换到目标Buffer后,按下 M-x 输入函数名 open-current-buffer-in-new-emacs-session 执行即可。
注意事项:
- Windows系统需把
"emacs"替换为Emacs可执行文件的完整路径,比如"C:/Program Files/Emacs/emacs.exe" - 临时文件不会自动删除,无需保留可手动清理,或在函数中添加
run-at-time设置延迟删除逻辑
内容的提问来源于stack exchange,提问作者Mahavir
相关产品推荐
相关产品推荐

