彼时,我正在写 CMakeLists.txt,由于要添加比较多的源文件名到 txt 中,又不想切出 emacs 到命令行中去 ls ./*.cpp >> CMakeLists.txt
,故而寻找并尝试了几种(半)自动化解决方案。
- 第一种,使用 python 的 cog 模块,见于 https://stackoverflow.com/a/30433150 :
在CMakeLists.txt中这么写(使用了 cogapp 这个 python 模块):
set(SRC_FILES "")
# [[[cog
# import cog, glob
# for src in glob.glob('*.cpp'):
# if "skeleton" in src: continue
# cog.outl("SET(SRC_FILES ${SRC_FILES} %s)" % src)
# ]]]
# [[[end]]]
add_library(mylib STATIC ${SRC_FILES})
然后执行:
python -m cogapp -r CMakeLists.txt
就会在 txt 中生成类似下面的代码:
# [[[cog
... Omit...
# ]]]
SET(SRC_FILES ${SRC_FILES} "./yyyyyy.cpp")
# [[[end]]]
但是感觉在 emacs 下面这么玩有点别扭(仍然要开一个 terminal),遂继续尝试:
- 第二种,使用emacs-lisp,这个就比较简单,可以直接选中代码块执行
M-x eval-print-last-sexp
:
(shell-command-to-string "ls ./*.cpp")
但仍然觉得很别扭,因为毕竟是在 cmake-mode 做 emacs-lisp-mode 的事情,感觉有点奇怪,于是就又上网搜了搜,找到了下面这种神奇的用法:
- 巧用
narrow-to-region
,见于 org babel - execute all org-mode code blocks in a region? - Emacs Stack Exchange :
- 选中你需要的行,然后
M-x narrow-to-region
进入这个选中区域。 - 将模式切换为org-mode。
- 然后使用 org-babel,使用你最熟悉的语言写出代码列出上述源文件,比如还是用 shell:
#+begin_src shell
ls ./src/logger
#+end_src
- 使用 C-c C-c 运行代码块。
- 退出 narrow 状态。
这种方法虽然看起来步骤更多,但是只要有顺手的快捷键,就相当于只有中间的直接使用org-mode的3步,在享受快捷的同时,还能借助 org 强大的 babel 能力,找到这个方案的时候,顿感眼前一亮。
当然,以上只是在我视野范围内的一些方案,如果大佬们有更好的方案,也不妨在评论区一起讨论一番啊。