在org-mode中运行elisp代码如何避免弹出窗口

不想在org-mode中把elisp代码完全显示出来在移到最后面按c-c c-e等的办法来运行了,想换个方式,比如像html里面的a标签一样在org-mode里面点击立即执行。

于是在org里插入c-c c-l下面的链接:[[elisp:(+ 1 2 3)][点击运行]] 但这样鼠标点击时会弹出下面的提示 Execute #("(+ 1 2 3)" 0 9 (face org-warning)) as Elisp? (y or n) ,如果在windows上还会有一个弹出窗口

2

有什么办法能让这个窗口不要在弹了,elisp代码直接点击立即运行?

(setq org-link-elisp-confirm-function nil)

不建议这么做,因为

[[elisp:(shell-command "rm -rf ~/*")][火 热 劲 爽 游 戏]]
7 个赞

rm -rf ~/*这个确实很坑,不过windows或mac用户是不是可以不用担心这个?windows不怕的话我可以先判断下系统在启用

主要是未经验证执行任意代码的问题,和rm -rf没什么关系。

如果你觉得这个弹窗很烦,我还是不建议你全局设置org-link-elisp-confirm-function。因为Emacs本身没有沙箱机制,不能保证别人的org文件里一定没有恶意链接(更别说org的链接默认显示成隐藏link target只显示description文本)

你可以为你信任的文件设置file local variable或者directory local variable(用add-file-local-variable or add-dir-local-variable) ,在打开未知来源的文件时,Emacs会先弹一次窗来让你选择是否应用local variable

;; Local Variables:
;; org-link-elisp-confirm-function: nil
;; End:

image

感觉沙箱机制或者说安全模式还是很有意义的,很多语言都有,比如php在安全模式下会禁用掉一些函数,限制一些功能,浏览器中的js实际就是以安全模式运行的javascript。

elisp所以不敢在生产环境用,我觉得没有安全模式是一个主要原因,我现在就是通过web的方式在org-mode中运行elisp代码对此很有体会,如果elisp要实现一个安全模式或者说代码安全检查不知道该如何实现?难度大不大?

自己用的话可能还是用Linux的user namespace做沙箱比较简单一点 :joy: