Vim无法保存到python创建的临时文件

时间:2014-04-10 00:29:05

标签: python vim temporary-files

目标

我正在尝试在vim中创建和编辑临时文件(与git / hg / svn中的提交脚本完全相同)。

当前代码

我在这个答案中找到了一个方法: call up an EDITOR (vim) from a python script

import sys, tempfile, os
from subprocess import call
EDITOR = os.environ.get('EDITOR','vim')
initial_message = "write message here:"
with tempfile.NamedTemporaryFile(suffix=".tmp") as tmp:
  tmp.write(initial_message)
  tmp.flush()
  call([EDITOR, tmp.name])
  tmp.seek(0)
  print tmp.read()

问题

当我运行上面的代码时,tempfile不会读取在vim中所做的更改。这是之后的输出我在vim中添加了几行:

fgimenez@dn0a22805f> ./note.py
Please edit the file:

fgimenez@dn0a22805f>

现在有趣(奇怪)的部分。如果我将编辑器更改为nano或emacs,则脚本可以正常工作!到目前为止,当我使用vim或textedit时,这似乎只会中断。

作为另一个实验,我尝试连续调用几个编辑器来查看会发生什么。修改后的代码是:

with tempfile.NamedTemporaryFile(suffix=".tmp") as tmp:
  tmp.write(initial_message)
  tmp.flush()
  # CALLING TWO EDITORS HERE, VIM THEN NANO
  call(['vim', tmp.name])
  raw_input("pausing between editors, just press enter")
  call(['nano', tmp.name])
  tmp.seek(0)
  print tmp.read()

即。我用vim然后nano编辑。会发生什么是nano DOES注册vim所做的更改,但是python没有注册任何内容(与之前相同的结果):

fgimenez@dn0a22805f> ./note.py
Please edit the file:

fgimenez@dn0a22805f>

但是,如果我先用nano编辑,那么vim,python仍会注册纳米编辑而不是vim的编辑!

with tempfile.NamedTemporaryFile(suffix=".tmp") as tmp:
  tmp.write(initial_message)
  tmp.flush()
  # CALLING TWO EDITORS HERE, NANO THEN VIM
  call(['nano', tmp.name])
  raw_input("pausing between editors, just press enter")
  call(['vim', tmp.name])
  tmp.seek(0)
  print tmp.read()

运行程序并在nano中添加a\nb\nc并在vim中添加d\ne\nf输出:

fgimenez@dn0a22805f> ./note.py
Please edit the file:
a
b
c

fgimenez@dn0a22805f>

似乎使用vim或textedit消除了附加到文件的能力。我在这里完全糊涂了,我只想在vim中编辑我的笔记......

编辑1:澄清

  • 我在osx Mavericks上

  • 我从shell(不是MacVim)调用vim并以ZZ结束会话(也尝试过:w:q)

2 个答案:

答案 0 :(得分:2)

我不是Python专家,但看起来你在Vim编辑文件的同时保持打开临时文件的句柄,然后尝试从句柄读入编辑过的内容。默认情况下,Vim会创建原始文件的副本,将新内容写入另一个文件,然后将其重命名为原始文件(有关详细信息,请参阅:help 'backupcopy';其他像nano这样的编辑器显然不这样做)。这意味着Python句柄仍然指向原始文件(即使它可能已经从文件系统中删除,具体取决于Vim设置),并且您获得了原始内容。

您需要重新配置Vim(请参阅:help 'writebackup'),或者(更好)更改Python实现以在Vim退出后重新打开相同的临时文件名,以便获取新写入的句柄文件内容。

答案 1 :(得分:2)

在我的代码在Linux上正常工作后,我在OS X上遇到了同样的问题。正如Ingo建议的那样,您可以通过重新打开文件来获取最新内容。为此,您可能希望使用delete=False创建一个临时文件,然后在完成后明确删除该文件:

import sys, tempfile, os
from subprocess import call
EDITOR = os.environ.get('EDITOR','vim')
initial_message = "write message here:"
with tempfile.NamedTemporaryFile(suffix=".tmp", delete=False) as tmp:
  tmp.write(initial_message)
  tmp.flush()
  call([EDITOR, tmp.name])
  tmp.close()
  with open(tmp.name) as f:
    print f.read()
  os.unlink(tmp.name)