Python 将代码从vim发送到外部应用程序以执行

Python 将代码从vim发送到外部应用程序以执行,python,bash,vim,autoit,stata,Python,Bash,Vim,Autoit,Stata,我经常在工作中使用stata。我选择的文本编辑器是(g)vim。 我一直在使用提供的脚本或将代码从vim发送到stata。这个功能非常实用,实际上是唯一能阻止我完全切换到linux的东西。这些脚本是用AutoIT编写的,所以我不能在linux中使用它们。它们也基本上独立于文本编辑器的选择,编写它们的人使用的是notepad++ 基本上,这些脚本和vimrc中的几行代码允许我将选择或整个文件发送到正在运行的stata窗口(如果没有打开,则首先启动stata) 我正在寻找一个在linux中实现这一点

我经常在工作中使用stata。我选择的文本编辑器是(g)vim。 我一直在使用提供的脚本或将代码从vim发送到stata。这个功能非常实用,实际上是唯一能阻止我完全切换到linux的东西。这些脚本是用AutoIT编写的,所以我不能在linux中使用它们。它们也基本上独立于文本编辑器的选择,编写它们的人使用的是notepad++

基本上,这些脚本和vimrc中的几行代码允许我将选择或整个文件发送到正在运行的stata窗口(如果没有打开,则首先启动stata)

我正在寻找一个在linux中实现这一点的解决方案,但我不知道从哪里开始。在linux中有两个不同的stata版本,stata用于命令行,xstata是gui版本。不幸的是,我需要使用gui版本,因为命令行版本的功能有限,所以不能使用screen/tmux

如果这是微不足道的,我真的很抱歉错过了它,并将非常感谢一个解决方案。我也无法找到一个现有的vim插件。如果没有,我愿意投入一些时间,找出如何实施解决方案。然而,指向正确方向的指针将非常有用。一般来说,我对linux和编程比较陌生,但愿意学习

关于工具:我不知道bash,但我想在某个时候研究一下它。我已经涉猎了一点python,所以也可以。如果有任何其他绝对优于此任务,请让我知道

非常感谢您的帮助。AutoIT脚本托管在网站上,但如果需要,我可以在这里发布我的windows安装程序

编辑

好的,在评论中进行了一些讨论之后,这里是我需要翻译的基本AutoIT脚本。(不过,我更喜欢一种不会每次都覆盖系统剪贴板内容的解决方案。)

编辑2 我猜这就是脚本的基本功能:它检查打开的stata窗口,选择(或执行一个),将要执行的内容粘贴到临时文件中,切换到stata窗口,使用ctrl-1选择命令行(以及可能已经使用ctrl-a写入的任何内容),然后粘贴do“tempfile”进入命令行,然后命令行执行发送的代码。至少我是这样理解的

最后评论

不久前,我在bash中设计了一个解决方案,它是对这个问题的前一个版本的回答

; Declare variables
Global $ini, $statapath, $statawin, $statacmd, $dofile, $clippause, $winpause, $keypause

; File locations
; Path to INI file
$ini = @ScriptDir & "\rundo.ini"
;; contents of ini file are the following
    ;[Stata]
    ;; Path to Stata executable
    ;statapath = "C:\Program Files\Stata11\StataSE.exe"
    ;; Title of Stata window
    ;statawin = "Stata/SE 11.2"
    ;; Keyboard shortcut for Stata command window
    ;statacmd = "^1"
    ;[Delays]
    ;; Pause after copying of Stata commands to clipboard, in milliseconds
    ;; Use higher number if script fails (default: 100, recommended range: 0 - 200)
    ;clippause = 100
    ;; Pause between window-related operations, in milliseconds
    ;; Use lower number to speed up script, higher number if script fails (default: 200)
    ;winpause = 200
    ;; Pause between key strokes sent to Stata, in milliseconds
    ;; Use lower number to speed up script, higher number if script fails (default: 1)
    ;keypause = 1


; Path to Stata executable
$statapath = IniRead($ini, "Stata", "statapath", "C:\Program Files\Stata11\StataSE.exe")
; Title of Stata window
$statawin = IniRead($ini, "Stata", "statawin", "Stata/SE 11.2")

; Keyboard shortcut for Stata command window
$statacmd = IniRead($ini, "Stata", "statacmd", "^1")

; Path to do-file that is passed to AutoIt
; Edit line to match editor used, if necessary
$dofile = $CmdLine[1]

; Delays
; Pause after copying of Stata commands to clipboard
$clippause = IniRead($ini, "Delays", "clippause", "100")
; Pause between window-related operations
$winpause = IniRead($ini, "Delays", "winpause", "200")
; Pause between keystrokes sent to Stata
$keypause = IniRead($ini, "Delays", "keypause", "1")

; Set WinWaitDelay and SendKeyDelay to speed up or slow down script
Opt("WinWaitDelay", $winpause)
Opt("SendKeyDelay", $keypause)

; If more than one Stata window is open, the window that was most recently active will be matched
Opt("WinTitleMatchMode", 2)

; Check if Stata is already open, start Stata if not
If WinExists($statawin) Then
  WinActivate($statawin)
  WinWaitActive($statawin)
  ; Activate Stata command window and select text (if any)
  Send($statacmd)
  Send("^a")
  ; Run saved do-file
  ; Double quotes around $dofile needed in case path contains blanks
  ClipPut("do " & '"' & $dofile & '"')
  ; Pause avoids problem with clipboard, may be AutoIt or Windows bug
  Sleep($clippause)
  Send("^v" & "{Enter}")
Else
  Run($statapath)
  WinWaitActive($statawin)
  ; Activate Stata command window
  Send($statacmd)
  ; Run saved do-file
  ; Double quotes around $dofile needed in case path contains blanks
  ClipPut("do " & '"' & $dofile & '"')
  ; Pause avoids problem with clipboard, may be AutoIt or Windows bug
  Sleep($clippause)
  Send("^v" & "{Enter}")
EndIf
我使用VI-map函数定义宏,将文件发送到C编译器,并检索结果。它不是很健壮(没有if/then编程),但实现起来非常简单,我使用了很多标准映射。例如,
&T
大写我所在的行,而
&T
将其小写。我使用
&S
运行拼写检查器(gspell),等等。您不需要在宏的开头加上一个符号,但这样我就知道我输入的字母组合不太可能是字母组合

设置地图非常简单。使用:map ex命令、空格、用于调用map的单词、空格,然后是要执行的击键。如果需要插入诸如回车或转义之类的内容,请在其前面加上Ctrl-V


你可以使用
map
映射在插入或替换模式下可以执行的宏。

也许您可以使用与此vim插件类似的机制,执行类似的任务:

该插件将R代码发送到unix和windows下的R工具(广泛用于统计软件开发和数据分析)

我不知道Stata或R语言,但似乎可以使用R控制Stata,如中所述 :

某些Stata命令转换为R:

如果您可以通过R执行所需的任务,那么您可能可以使用上面的vim插件

希望有帮助。

是对脚本语言的Linux/Mono重写,类似于AutoIt(GUI自动化/键盘重新映射工具)。我没有使用IronAHK,但AutoHotkey可以运行AutoIt v2脚本

你也可以看看@:“Sikuli是一种使用图像(屏幕截图)自动化和测试图形用户界面(GUI)的可视化技术。Sikuli包括Sikuli脚本(Jython的可视化脚本API)和Sikuli IDE(一种集成开发环境,用于轻松编写带有屏幕截图的可视化脚本)。”

另一个好的选择是,可以使用Python编写脚本:

例如:

from ldtp import *
from ldtputils import *

try:
    launchapp("gedit")
    if waittillguiexist("*.gedit")==0:
        raise LdtpExecutionError("Gedit window does not exist")

    selectmenuitem("*-gedit", "mnuFile;mnuOpen")
    selectrow("dkgOpenFiles...", "tblFiles", fileName[0])
    ...

你看过吗?(2) 在statalist()问?我个人在文本编辑器中工作,只需在Stata中键入
完成整个事情。如果整个过程运行时间过长,则需要将其分解为更小的可管理部分,这是标准的编程建议,并将中间结果存储在Stata中,用于数据和估计结果。(另请参阅)我对stata一无所知,但是有一些脚本使用screen/tmux来做这类事情。看看这个例子:@Randy:我想最大的问题是你需要进入一个正在运行的可执行文件;OP对“批处理”模式不太感兴趣,发送到该模式并不代表任何问题。(我与之相反:我对vim一无所知,但我对Stata了解很多。)@StasK使用该脚本,您可以将输入发送到gnu屏幕或tmux中运行的可执行文件,就像用户键入它一样。如果stata没有命令行界面,这是行不通的。@Randy:它确实有命令行界面,但OP表示他查看了tmux,但没有成功。可执行文件可能不会特别接受来自外部的内容。它打算在int中使用
from ldtp import *
from ldtputils import *

try:
    launchapp("gedit")
    if waittillguiexist("*.gedit")==0:
        raise LdtpExecutionError("Gedit window does not exist")

    selectmenuitem("*-gedit", "mnuFile;mnuOpen")
    selectrow("dkgOpenFiles...", "tblFiles", fileName[0])
    ...