要在Python中解析文本文件,搜索字符串,并插入当前的emacs缓冲区
我在Emacs下用LaTeX编写文档,我希望能够在输入时快速插入圣经经文。我知道esv-mode
中的esv.el
,它通过查询biblegateway.org
来插入圣经经文。但是,这只适用于我在线时,我希望能够离线插入(我经常离线工作)。
我知道pymacs,我没有尝试过,因为它看起来严重过时(我甚至无法在GitHub存储库下打开帮助文件......所以它似乎正在消亡)。
我在Python中创建了一个简单的测试文件,用于从虚拟文件中读取虚拟文本:
def get_verse():
with open('/home/test.txt','r') as tmp:
text = tmp.read()
return text
a = get_verse()
print(a)
我通常使用Python进行数据传输,分析和处理,因此当前的应用程序不在我的经验之内。如果有一些普遍的改进,我会很感激这些建议。
然后我在.emacs
文件下定义该函数:
;; testing function
(defun bible-verse ()
(interactive)
; (insert (shell-command "python /home/test.py")))
(insert (shell-command-to-string "python /home/test.py")))
(global-set-key
(kbd "C-c pytest")
'bible-verse
)
如您所见,我尝试了shell-command
和shell-command-to-string
命令。两者都没有工作(即没有插入文本)。
但是,当我在Emacs中执行以下操作时,我确实从虚拟文件中插入了文本:
C-u M-! python /home/test.py
现在我有两个问题:
如何让Emacs执行我的Python代码并将返回的文本插入当前缓冲区?
如何将变量传递给Emacs的Python代码(即从特定的书籍,章节,经文中提取)?
由于这更像是一个Emacs问题,我没有将其标记为Python(如果您不这么认为,可以随意编辑它)。
答案 0 :(得分:2)
shell-command
的文档建议您使用call-process
进行编程:
(call-process PROGRAM &optional INFILE DESTINATION DISPLAY &rest ARGS)
但是,您使用shell-command-to-string
编写的代码适用于M-x bible-verse
。但是,您需要修复无效的密钥序列才能使密钥绑定正常工作:
(global-set-key (kbd "C-c p") 'bible-verse)
这是一个接受参数并将它们传递给流程的版本:
(defun bible-verse (book chapter verse)
(interactive "*sBook: \ns%s, chapter: \ns%s, chapter %s, verse: ")
(call-process "python" nil t t
"~/test.py" book chapter verse))
我已经使用*
中的(interactive)
标志拒绝在不可写的缓冲区中运行,并且我已经展示了如何在提示时格式化先前的参数。
答案 1 :(得分:0)
下面的示例代码在Emacs缓冲区和python-mode中, C-c C-c 应该打印一个以字符开头的行" 1.2"在Python3 shell-buffer中 - 假设文本中有这样的行。
#! /usr/bin/env python3
import re
DATEI="My-path-to-bible.txt"
SATZ = re.compile('^1.2')
with open(DATEI, "r") as jetzt:
for line in jetzt:
k = SATZ.match(line)
if k:
print(line)
python-mode.el附带一个选项py-store-result-p
:当t
时,结果为kill-ring,准备好被拉扯。