程序小白提问:
如何在已经存在的多个org文件的开头,新增几行开头注释,比如: #+TITIL 「文件名」
#+作者
#+时间
等等
是同时添加,批量处理。
谢谢。
程序小白提问:
如何在已经存在的多个org文件的开头,新增几行开头注释,比如: #+TITIL 「文件名」
#+作者
#+时间
等等
是同时添加,批量处理。
谢谢。
看看setup file符不符合你的需求
setup file 是什么?github没找到,emacs里好像有一个set-file-mode,设置后没有反应。
加一个setupfile的设置就能一次性修改所有文件的配置
谢谢,应该不是,看名称应该是同时打开的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)))))
厉害,信手拈来。
如何取「文件名」作为#+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))))))
学习一下elisp,这些需求都可以自己写代码解决,并不难。
个人认为学习elisp分两步,先学基本语法,再学与emacs操作相关得api函数。
基本语法建议看 emergency elisp,边看边敲就差不多了。emacs相关的api建议看 李杀的网站 ,也是边看边敲,了解诸如 position, region, buffer, file …的基本函数,还有正则,搜索,替换等常用方法。elisp manual 的内容最全,可以作为补充和查阅使用。
然后,就是尝试用代码解决自己的小需求,忘了api就勤翻翻手册。还有利用好 C-h f,通过搜索也可以了解很多常用函数,不知道怎么用时就查看文档。最后就是多看别人(大佬)写的代码、看知名package的源码,了解一些常用的技巧和编程思路,代码结构等。
最终就也可以写出自己的package辣,哈哈哈哈 。我基本是按照这条线在走,也写了自己的第一个包 pp-html,虽然好像并不实用,但是 who cares,这个过程中我学到了很多就值得了。哈哈,happy hacking
谢谢大佬孜孜不倦的教诲,我主要想处理文本文件里的内容还有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)
的语义,你写的会吧文件追加到尾部。
嗯嗯,这个才是等价的。不过使用时无所谓。