【问题标题】:Automatically run python code on save保存时自动运行python代码
【发布时间】:2013-10-05 23:22:46
【问题描述】:

有没有办法在每次保存时自动观看 python 脚本文件并在 tmux/screen 中执行它?我主要在 vim 中工作,每次我想评估它在新窗口中打开的代码时,它都会破坏工作流程。我问这个是因为我也在 Scala 中工作,并且 sbt 构建工具有非常好的选择来做到这一点(在保存时运行编译器/REPL)

【问题讨论】:

  • 如果你在 vim 中工作,为什么不为 save 函数写一个别名呢?比如代替 :w 你做 :pyw (python 保存),然后在保存时运行代码?同样在 VIM 中它不应该打开一个新窗口,至少它不会在我的开发机器上。
  • 您是否在screen 窗口中运行vim,并希望在父screen 内的新窗口中运行Python 脚本?
  • 我使用名为 ScreenShell 的插件,它在 vim 旁边运行一个 tmux 窗口,所有这些都在全局 tmux 实例中。它只是在其中创建一个拆分窗口。
  • 我喜欢 ctrl-z 让编辑器在后台运行,然后手动运行。

标签: python vim save watch


【解决方案1】:

如果每次我保存一个 py 文件,它都会自动执行,那会很烦人。由于您可以编辑 py 文件,因此只需 py 类。或者纯配置的东西。无论如何,如果您希望发生这种情况,您可以尝试:

autocmd FileWritePost *.py exec '!python' shellescape(@%, 1)

我的vimrc 中的内容是:

autocmd FileType python call AutoCmd_python()

fun! AutoCmd_python()
        "setlocal other options for python, then:
    nnoremap <buffer> <F9> :exec '!python' shellescape(@%, 1)<cr>

endf

现在您可以手动&lt;F9&gt; 来测试您当前的python 文件。

【讨论】:

    【解决方案2】:

    按照肖恩和肯特的建议,最简单的方法是让vim 驱动它。

    但是,如果您只“主要”在 vim 中工作,那可能不合适。

    唯一的另一种选择是编写使用您平台的文件系统监视 API 的代码,或者,如果最糟糕的情况出现,定期轮询文件,并在每次更新时运行它。然后只需在您的screentmux 下运行该代码(可能在另一个screen 窗口中使用vim)。

    由于我不了解您的平台,我将编写一个愚蠢的轮询实现来展示这个想法 - 请记住,在现实生活中,使用像 inotifywatch/fswatch 这样的工具会更好/等:

    import os
    import subprocess
    import sys
    import time
    
    scripts = sys.argv[1:]
    mtimes = {script: os.stat(script).st_mtime for script in scripts}
    while True:
        for script in scripts:
            mtime = os.stat(script).st_mtime
            if mtime != mtimes[script]:
                subprocess.call([script], shell=True)
                mtimes[script] = mtime
        time.sleep(250)
    

    现在,你可以这样做了:

    $ screen
    $ python watch.py myscript.py
    $ ^AS^A<Tab>^A^C
    $ vim myscript.py
    

    【讨论】:

    • 我主要在 linux 上工作,而 fswatch 正是我想要的。非常感谢您的帮助
    • @deprofundis:等等,Linux 上有一个叫fswatch 的东西?我什至不知道……我建议为 OS X 使用 fswatch,为 linux 建议 inotifywatch(或者可能像 gaminlibfam 端口之类的包装器,我忘记了它的名称,希望有工具在每个平台上都一样)。但是,如果有一个 linux fswatch,并且它可以满足您的需求……好吧,即使我偶然得到它,我也会接受。 :)
    • 我的意思是 inotifywatch , fswatch 只能在 Mac 上使用,抱歉。
    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 2023-01-26
    • 2015-03-30
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多