将python输出链接到emacs缓冲区

时间:2016-11-23 12:39:36

标签: python shell emacs

目标

要在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-commandshell-command-to-string命令。两者都没有工作(即没有插入文本)。

但是,当我在Emacs中执行以下操作时,我确实从虚拟文件中插入了文本:

C-u M-! python /home/test.py

现在我有两个问题:

  1. 如何让Emacs执行我的Python代码并将返回的文本插入当前缓冲区?

  2. 如何将变量传递给Emacs的Python代码(即从特定的书籍,章节,经文中提取)?

  3. 由于这更像是一个Emacs问题,我没有将其标记为Python(如果您不这么认为,可以随意编辑它)。

2 个答案:

答案 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,准备好被拉扯。

https://gitlab.com/python-mode-devs/python-mode