如何给多个文件的开头加上#+TITIL

程序小白提问:

如何在已经存在的多个org文件的开头,新增几行开头注释,比如: #+TITIL 「文件名」

#+作者

#+时间

等等

是同时添加,批量处理。

谢谢。

看看setup file符不符合你的需求

setup file 是什么?github没找到,emacs里好像有一个set-file-mode,设置后没有反应。

加一个setupfile的设置就能一次性修改所有文件的配置

2 个赞

谢谢,应该不是,看名称应该是同时打开的buffer。使用的场景是:在一个目录下的多个org文件。

如果用程序,大概是for遍历这个目录的所有文件,依次打开文件,然后取文件名为变量,然后判断是否在文件开头,再插入需要插入的内容。语言如果用lisp,可以写到配置文件中。

(defun my-add-org-meta-info (dir)
  (interactive "fchoose a directory: ")
  (let (real-files
	    (meta-info "#+TITLE: \n#+AUTHOR: \n#+DATE: \n"))
    (dolist (file (directory-files dir))
      (when (not (or (string= "." (substring file 0 1))
		             (string= "#" (substring file 0 1))
		             (string= "~" (substring file 0 1))))
	      (push file real-files)))
    (dolist (file real-files)
      (setq file (concat dir file))
      (with-temp-buffer
	    (insert-file-contents file)
	    (goto-char (point-min))
	    (insert meta-info)
	    (write-file file)))))
1 个赞

厉害,信手拈来。

如何取「文件名」作为#+TITLE:的值呢?如:

#+TITLE:文件名(去掉扩展名「.org」)

使用场景:之前的文件(或者是批量创建的文件)没有写标题等meta-info,现在想补充上。谢谢!

title是文件名,作者修改一下let里的author变量,日期设定是当前日期。

(defun my-add-org-meta-info (dir)
  (interactive "fchoose a directory: ")
  (let (real-files)
    (dolist (file (directory-files dir))
      (unless (or (string= "." (substring file 0 1))
		          (string= "#" (substring file 0 1))
		          (string= "~" (substring file -1))))
	      (push file real-files))
    (dolist (filename real-files)
      (let* ((title (file-name-base filename))
	         (author "author name")
	         (date (format-time-string "%F %T" (current-time)))
	         (meta-info (format "#+TITLE: %s\n#+AUTHOR: %s\n#+DATE: %s\n" title author date))
	         (file (concat dir filename)))
	    (with-temp-buffer
	      (insert-file-contents file)
	      (goto-char (point-min))
	      (insert meta-info)
	      (write-file file))))))
3 个赞

学习一下elisp,这些需求都可以自己写代码解决,并不难。

个人认为学习elisp分两步,先学基本语法,再学与emacs操作相关得api函数。

基本语法建议看 emergency elisp,边看边敲就差不多了。emacs相关的api建议看 李杀的网站 ,也是边看边敲,了解诸如 position, region, buffer, file …的基本函数,还有正则,搜索,替换等常用方法。elisp manual 的内容最全,可以作为补充和查阅使用。

然后,就是尝试用代码解决自己的小需求,忘了api就勤翻翻手册。还有利用好 C-h f,通过搜索也可以了解很多常用函数,不知道怎么用时就查看文档。最后就是多看别人(大佬)写的代码、看知名package的源码,了解一些常用的技巧和编程思路,代码结构等。

最终就也可以写出自己的package辣,哈哈哈哈 :joy:。我基本是按照这条线在走,也写了自己的第一个包 pp-html,虽然好像并不实用,但是 who cares,这个过程中我学到了很多就值得了。哈哈,happy hacking :smile:

4 个赞

谢谢大佬孜孜不倦的教诲,我主要想处理文本文件里的内容还有yaml的数据格式,似乎lisp特别适合编写处理文本的程序。

上面大佬写的程序,正好可以研究和模仿。拜谢!

在引用中继续请教了

排除 #临时文件#备份文件~ 。备份文件那行代码写错了,改为 (substring file -1)

push的作用是将一个值写入列表中。用setq也可以,写法是:

(setq real-files (append real-files (list file)))

这样才能保证连续赋值。

(setq real-files
      (cons file real-files))

这才是(push file real-files)的语义,你写的会吧文件追加到尾部。

1 个赞

嗯嗯,这个才是等价的。不过使用时无所谓。