看elisp代码的正确姿势是咋样的

今天想弄一个在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的时候参数的数据结构完全靠猜 :triumph: 想稍微改造下下工具,复杂点的就看不太懂了。

1 个赞

靠文档和 print :laughing:

最好问具体的问题。

读完了没? 读完了继续看 https://www.gnu.org/software/emacs/manual/html_node/elisp/index.html

不是说没读完不配用 emacs,但是没在这两个文档里找过答案的话不建议直接就来问问题。

我有点没看懂你这个描述:

"子龙山人"提供的函数 和 consult 提供的函数 到底是不是一个? 你这里说已经集成到了 consult 里面, 但是下面又说两个函数的行为不一致.

你现在是基于哪一个函数改的?

你这段代码和上面说的是不是一回事?

因为我看你的代码的功能是: 在调用函数前先设置其默认目录, 很难和 “一步到位打开文件” 联系起来

另外 Elisp 手册很有用, 比如 call-interactively 的作用和用法, 就和 command 这个东西有关, 可以参阅 https://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Commands.html

然后这东西可以让你明白 consult-open-file-externallyinteractive spec 有什么用

let 绑定 default-directory 的原理可以参考: Variable Scoping (GNU Emacs Lisp Reference Manual)

和楼上几位说的差不多,一般来说看 Info 里的文档就够了,如 EmacsElisp ,然后结合 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 最方便的办法。