创建一个帖子,记录自己学习 Elisp 的经过

谢谢,我自己动手想一下怎么实现,不想用 id 关联。

利用 org properties 就可以实现了

借楼问一下, read-regexpread-string 有什么区别吗

可以从日常的一些小功能开始: 比如我经常需要从浏览器复制一个http link, 再复制一下description, 然后变成org 的link,没有现成的命令,就可以自己写一下

  1. 选中两行
  2. 判断哪个是http,哪个是description
  3. 然后组装
  4. 删除选择的region
  5. 插入
  6. 再配一下快捷键就可以了
2 个赞

叶文彬这本书我看了。跟着这本书走一遍,我感觉比学李杀的文章更系统一点,也更简单一点。李杀的文章优点是很容易上手实践,学起来有成就感。

另,官方手册是最详细的,也是最值得学习的资料,缺点是不适合给初学者学习。

2 个赞

很开心,今天成功用了 Hook 机制,将 major-mode 和 minor-mode 绑定。

将 org-stick-header 和 org-mode 绑定在一起,极大地提升了复盘项目文件的条理性。

配置如下:

(use-package org-sticky-header
  :straight (org-sticky-header
			 :type git
			 :host github
			 :repo "alphapapa/org-sticky-header")
  :ensure t)

(add-hook 'org-mode-hook #' (lambda () org-sticky-header-mode 1))

效果如图:

(lambda()) 前使用 #’ 应该是不规范写法,改为:

(add-hook 'org-mode-hook (lambda () (org-sticky-header-mode 1)))

都可以,无所谓,顶多算一点代码风格区别

嗯,我刚刚在 Org-transclusion User Manual 手册的第五部分也见到 #'(lambda()) 的写法了。

(add-hook 'org-transclusion-after-add-functions
          #'(lambda (_beg _end) (org-latex-preview '(16))))

学习到了,感谢指出。

补充1:复习了一下 (lambda ()) 社区约定俗成写法:

“Never hard quote a lambda, it impedes byte-compilation.”

;;; Good
(lambda (x) (car x))

;;; Ok, but redundant.
#'(lambda (x) (car x))

;;; Bad
'(lambda (x) (car x))

这个用 org protocol 加 capture 可能比较方便

问一下,这个函数意思是什么?为何可以返回值较大的那一个?

  (defun our-max (a b)
    (if (> a b) a b))

if is a special form in ‘C source code’.

(if COND THEN ELSE…)

If COND yields non-nil, do THEN, else do ELSE… Returns the value of THEN or the value of the last of the ELSE’s. THEN must be one expression, but ELSE… can be zero or more expressions. If COND yields nil, and there are no ELSE’s, the value is nil.

Probably introduced at or before Emacs version 1.1.

[back]

写成这样,你可能就看的更清楚了。

(defun our-max (a b)
  (if (> a b)
      a
    b))

其实 emacs 有内置的函数 max 来计算最大值, 而且支持更多的参数。

我理解 if 函数的意思,返回值为 t 则返回 list 里的第一个元素,nil 则返回另外的元素。

但比较奇怪的是,(setq a 1) 和 (setq b 2) 后,返回的是 1。 而当 a、b 的值调转,返回的值是 2。

你的理解是对的。

至于你说的调转的情况,就不知道你是怎么操作的了。

我没怎么操作,就是用 org-babel, C-c C-c 运行了一下这段代码

我这没问题,肯定是你哪里搞错了。

这个函数的定义很直接,没什么歧义的。

我理解了,我刚才并没有用定义的函数来运行,而是直接改了定义函数里的值,有点小尴尬😂 主要是没有意识到,我已经定义了名为 our-max 的这一段程序。

重新安装了带 xwidget 的 emacs,然后装上 nov-xwidget 来阅读 epub,非常爽快。终于不用考虑把 epub 导入到 xx 软件里而直接阅读了。从阅读体验来说,nov-xwidget 非常好,而且流畅。当然功能也不那么完备,比如无法高亮、标注等,但这些在 emacs 生态里不是问题。用好 org-mode 和 org-oram 可以快速记录笔记。

近期更换了学习 lisp 的教材,进度可喜可贺,虽不能独立写出 package,然而在看 lisp 的代码时,开始具备一定的阅读能力,知道是什么顺序,大概会是什么作用。如果不知道,还可以直接查询函数。

近期的学习教材主要是《Practical Common Lisp》,我认为它的安排很好,一上来先教人安装了 lisp 的生产环境之后,就直接以一个「专辑数据库」为例子,让人直接上手,并从一步步的步骤中,理解自己所编写的代码,如何变成程序。对于一名非程序员来说,这种方式,可以很快地通过实操来理解代码的作用,找到感觉。

这和学习《 ANSI Common Lisp 中文版》的感受大不一样。ANSI Common Lisp,非常完整,十分细致,甚至有后面的练习题,来帮助人深入思考。但它太学术了,在学习过程中,总是不知道学了之后,用这些语法或函数能发挥什么作用。

所以我现在是《Practical Common Lisp》和 《 ANSI Common Lisp 中文版》一起结合来看。首先阅读前者,通过前者举的例子,来理解逻辑;而函数实际应用的细节,则查询后者——在逻辑理解了的情况下,阅读后者,往往很快就能理解,而且能够有一定的发散。这样子学,记得牢,学得快。

2 个赞