emacsclient -e 怎么实现像call-interactive一样


#1

我用一个python脚本运行emacsclient -e执行一个命令,default-directory竟然是脚本所在的文件夹,怎么才能是emacs当前buffer的default-directory?

(buffer-name) 是 “ server"

更多信息,用的是 xkeysnail

define_keymap(None, {
    K("C-KEY_1"): launch(['emacsclient -e "(sane-term)" -s /tmp/emacs1000/server'])
}, "Global")

#2

什么是当前buffer?不同的执行环境下有不同的当前buffer。对于emacsclient -e,他的当前buffer是一个叫* server*的buffer。如果想要cursor所在的window对应的buffer,用

emacsclient -e '(with-selected-window (selected-window) (with-current-buffer (current-buffer) ...))'

#3

Server 执行命令的时候会创建一个临时 Buffer,它的当前目录来源于 emacsclient 调用的位置。

如楼上提到的,“当前 Buffer” 可能不存在?(比如 emacs --daemon 的话,“当前 buffer”是哪个?)

找到 Emacs 最近的 Buffer 的话,可以试试:

(window-buffer (selected-window))

这样貌似也行,不过意义不完全相同:

(car (buffer-list))

要在指定 Buffer 中执行,还需要用 with-current-buffer


#4

明白了,感谢!