我经常在工作中使用 stata。我选择的文本编辑器是 (g)vim。我一直在使用此处或此处提供的脚本将代码从 vim 发送到 stata。这个功能非常实用,几乎是唯一让我无法完全切换到 linux 的东西。这些脚本是用 AutoIT 编写的,所以我不能在 linux 中使用它们。它们也基本上独立于文本编辑器的选择,编写它们的人使用的是记事本++。
本质上,这些脚本连同我的 vimrc 中的几行允许我将选择或整个文件发送到正在运行的 stata 窗口(如果没有打开,则首先启动 stata)。
我正在寻找在 linux 中执行此操作的解决方案,但我不知道从哪里开始。在 linux 中有两种不同的 stata 版本,stata 用于命令行,xstata 是 gui 版本。我需要使用 gui 版本,因为不幸的是命令行版本的功能有限,因此排除了 screen/tmux。
如果这是微不足道的,我真的很抱歉错过它,并且非常感谢您的解决方案。我也找不到可以使用的现有 vim 插件。如果没有,我愿意投入一些时间并弄清楚如何实施解决方案。然而,指向正确方向的指针会很有帮助。我对 linux 和一般编程比较陌生,但愿意学习。
关于工具:我不知道 bash,但无论如何我都想研究一下。我已经在 python 中涉足了一点,所以那也可以。如果还有其他绝对优于此任务的方法,请告诉我。
任何帮助是极大的赞赏。AutoIT 脚本托管在网站上,但如有必要,我可以在此处发布我的 Windows 设置。
编辑
好的,经过评论中的一些辩论,这是我需要翻译的基本 AutoIT 脚本。(我更喜欢每次都不会覆盖系统剪贴板内容的解决方案。)
Edit2 我猜这就是脚本本质上所做的:它检查打开的状态窗口,选择它(或执行一个),将要执行的内容粘贴到临时文件中,切换到状态窗口,选择命令行使用 ctrl-1(以及可能已经用 ctrl-a 编写的任何内容),然后将执行“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