我可不可以在文件内创建一个类似“按钮“的东西

我是萌新,刚入坑emacs不久,想知道emacs中是否存在这样一个功能或插件,具体描述如下:

有时,你经常在某个项目,或者某个文件中执行某个M-x命令。或者,你几乎只在某个项目或文件里执行那个命令。每次都通过M-x输入命令未免有点繁琐,绑定一个快捷键又会觉得占用了快捷键资源。

那可不可以把这个命令写在一个代码块里,需要执行的时候把光标移动上去,再按某个简单的快捷键(Enter/C-c C-c)来执行它呢?

如果没有的话,或许有办法实现这个功能吧?

可以用 org-link。 在 org 文件中,按 C-c C-l 然后输入 elisp 回车,再输入你想运行的函数,回车,接着输入链接的说明。这样就生成了一个类似按钮的链接

2 个赞

根据你的描述,你是否在寻找 C-x C-e?

make-button ?

十分感谢你,这个正是我想要的,简单又快捷!

但是我发现,这么实用的东西,如果不通过阅读文档得知,那就很难在其他地方搜到了,即便问chatgpt也不容易问的出来。且关键是,你也不知道文档的哪一部分会介绍这一内容。我觉得这可能是阻碍emacs推广普及的某一因素。

1 个赞

我就经常在org-mode里做按钮,点击那个按钮把整个org文件的内容改变来显示执行结果,或者 局部更新org文件的内容

最近添加的按钮是exec sql,方便对返回的sql直接编辑后执行,效果如图:

image

不过这个按钮的源码有点长,我还没有写成一个elisp函数,现在是合成一行的,阅读有些不太方便: [[elisp:(progn (next-line 1)(org-mark-element) (orgcms-load (format "http://127.0.0.1/org/?&c=sql-exec&sql=%s" (url-hexify-string (buffer-substring-no-properties (region-beginning) (region-end)))))) ][exec sql]

2 个赞

是的。所以我正在努力抽时间读文档。如果空闲程度和学生差不多的话(我),大概一年能读完 eintr、emacs、elisp这三本手册。不过真的好累…

等等,org-link 是 org 手册里的东西,那…

1 个赞

所以才说现在的ai技术大大提高了技术人员的生产力,比如你这个问题,直接问就得到答案了

这也关系到你是怎么问的,以及一点点运气。

比如我像这样问chatgpt就问不出来。(我当时还不知道M-x原来是执行一段可交互的elisp函数)

所以说还是社区好啊!

能问出结果的前提肯定是把问题说清楚,你问得模糊他就给不了你答案,所以基础概念得自己学明白。

目前除了直接叫他写代码给我不是很满意,其他比如问概念性问题,或者解释代码,或者给出api示例效果都不错。

2 个赞

这样点击有会有一个提示:Execute … as elisp. 这个提示确认如何取消? 尝试了:(setq org-confirm-babel-evaluate nil) ,没起作用。

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

2 个赞

GNU Hyperbole, 专门就是用来干这件事的,与你的要求100%匹配

https://www.gnu.org/software/hyperbole/

screc

对我来说主要的优点就是这是个Global Minor Mode,所以不需要依赖于特定的Major Mode,无论是 Org 还是邮件还是代码窗口都可以用。

三种不同的按钮形式:

  • Implicit Button: 主要是一些文件名,链接,键盘宏之类的,不会被Hyperbole主动存储,光标或者鼠标指针移上去按下Action Key就可以自动识别打开。
  • Explicit Button: 用Hyperbole主动生成的针对于Buffer的按钮
  • Global Button: 用Hyperbole生成的全局可用的按钮

我个人主要的用途:

  • 在代码里面插入编译,调试按钮,以及repo,issue链接,可以直接一键定位
  • Dashboard 和 AppLauncher
  • 笔记 (不一定是Org)的目录,和文本间跳转。

这玩意儿和Org还是有很大区别的,但和Org一起用的话就非常舒服了。

8 个赞

在工具栏或顶部菜单上做个按钮不就行吗

有意思,字数补丁

感谢回复 :grinning:

是否愿意,详细分享一下,你对 Hyerbole 的理解,以及你的使用?

它的文档和演示都太不友好了,极其学术,看着脑壳痛。

如果不考虑按钮自带下划线的特点,可以考虑通过双击功能名称的形式,比如对于org文件中字符串“this is a function.”,光标移动到funtion,然后双击来实现。 实现思路是:1. 定义一个function,比如org-double-click,绑定到双击上;2. org-double-click的功能是获取当前光标位置的单词,然后将该字符串作为一个function来eval。3. 双击运行的function需要单独定义,可以通过启动时加载el文件来实现。 这种方式的优势是只需要在org中有该字符串即可双击运行该function,如果一个fuction在不同org中使用频率都很高,那么每次都插入org-link略显繁琐。当然,如果不是很高的频率且需要突出显示org-link则更合适。