Fra*_*sco 5 python vim temporary-files
我正在尝试在vim中创建和编辑临时文件(与git/hg/svn中的提交脚本完全相同).
我在这个答案中找到了一个方法: 从python脚本中调用EDITOR(vim)
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()
从运行程序并添加a\nb\ncnano和d\ne\nfin vim输出:
fgimenez@dn0a22805f> ./note.py
Please edit the file:
a
b
c
fgimenez@dn0a22805f>
似乎使用vim或textedit消除了附加到文件的能力.我在这里完全糊涂了,我只想在vim中编辑我的笔记...
我是osx Mavericks
我从shell调用vim(不是MacVim)并用ZZ结束会话(也试过:w:q)
我不是 Python 专家,但看起来您在 Vim 编辑文件时保持临时文件的句柄打开,然后尝试从句柄读取编辑后的内容。默认情况下,Vim 创建原始文件的副本,将新内容写入另一个文件,然后将其重命名为原始文件(有关:help 'backupcopy'详细信息,请参阅 参考资料;其他编辑器(例如 nano)显然不会这样做)。这意味着 Python 句柄仍然指向原始文件(即使它可能已经从文件系统中删除,具体取决于 Vim 设置),并且您将获得原始内容。
您需要重新配置 Vim(请参阅 参考资料:help 'writebackup'),或者(更好)更改 Python 实现以在 Vim 退出后重新打开相同的临时文件名,以便获取新写入的文件内容的句柄。
| 归档时间: | 
 | 
| 查看次数: | 367 次 | 
| 最近记录: |