今天想弄一个在emacs中使用外部程序打开某些文件的功能
然后就去看了子龙山人新版的21天学会emacs。 找到了consult-directory-externally这个函数(这个函数应该已经集成到consult 里面了 叫consult-file-externally)
不过子龙山人的那个只能打开对应文件所在的目录,并不能一步到位直接打开文件。 但是consult的就可以。
然后我就想在调用consult-file-externally的时候给它一个默认参数, 弄了好半天才搞定
(defun open-luna-word ()
(interactive)
(let ((default-directory luna-word-directory))
(call-interactively #'consult-file-externally))
)
然后我就感觉elisp这种动态语言看着好费劲啊,不像go这种静态语言。 看elisp的时候参数的数据结构完全靠猜 想稍微改造下下工具,复杂点的就看不太懂了。
1 个赞
cireu
5
我有点没看懂你这个描述:
"子龙山人"提供的函数 和 consult 提供的函数 到底是不是一个? 你这里说已经集成到了 consult 里面, 但是下面又说两个函数的行为不一致.
你现在是基于哪一个函数改的?
你这段代码和上面说的是不是一回事?
因为我看你的代码的功能是: 在调用函数前先设置其默认目录, 很难和 “一步到位打开文件” 联系起来
cireu
6
另外 Elisp 手册很有用, 比如 call-interactively
的作用和用法, 就和 command 这个东西有关, 可以参阅 https://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Commands.html
然后这东西可以让你明白 consult-open-file-externally
的 interactive
spec 有什么用
let
绑定 default-directory
的原理可以参考: Variable Scoping (GNU Emacs Lisp Reference Manual)
和楼上几位说的差不多,一般来说看 Info
里的文档就够了,如 Emacs
和 Elisp
,然后结合 C-h
,实在不懂就用 edebug
单步调试一下,看看具体的函数实现,这样一来基本能够解决 80% 的问题,剩下 15% 靠自己谷歌也能解决。
以 consult-file-externally
为例,我感觉是楼主一开始没有理解 (interactive)
这个函数的用法,
(defun consult-file-externally (file)
"Open FILE externally using the default application of the system."
(interactive "fOpen externally: ")
(if (and (eq system-type 'windows-nt)
(fboundp 'w32-shell-execute))
(w32-shell-execute "open" file)
(call-process (pcase system-type
('darwin "open")
('cygwin "cygstart")
(_ "xdg-open"))
nil 0 nil
(expand-file-name file))))
这里 interactive
的第一个字符是 f
,不清楚意思,那么就 Info Elisp
,然后可以按 i (Info-index)
来检索:
然后 C-h v
看一下 default-directory
的文档。OK,问题解决了。
1 个赞
是这样的啦,我先设置了一个默认的文件夹,然后call-interactively #'consult-file-externally 就会默认进入这个文件夹,这样我就可以在我设置的默认文件夹里面搜索了。
consult里面提供的确实和子龙山人写的不一样,是有一点小改动的。
我有点不太懂那个a file name of an existing file是啥意思。 我的理解是 这个 “f” 控制符应该是可以给参数的吧。
那个用外部程序打开文件的问题我已经解决了啊,我问的就只是怎么看elisp代码比较方便的问题。。。。。
interactive
的单个控制符都不能给参数,它们只是控制 interactive
如何计算参数
多看手册和多用 C-h
,这是看 elisp 最方便的办法。