我经常在工作中使用stata。我选择的文本编辑器是(g)vim。 我一直在使用here或here提供的脚本将代码从vim发送到stata。这个功能是非常实用的,实际上是唯一阻止我完全切换到Linux的东西。脚本是用AutoIT编写的,所以我不能在linux中使用它们。它们也基本上独立于文本编辑器的选择,编写它们的人使用的是notepad ++。
基本上,这些脚本连同我的vimrc中的几行允许我将选择或整个文件发送到正在运行的stata窗口(如果没有打开,则首先启动stata)。
我正在寻找一个在linux中执行此操作的解决方案,但我不知道从哪里开始。在linux中有两个不同的stata版本,命令行的stata和xstata是gui版本。我需要使用gui版本,因为命令行版本的功能有限,所以屏幕/ tmux被排除在外。
如果这是微不足道的,我真的很抱歉错过了它,并且非常感谢解决方案。我也无法找到我可以使用的vim的现有插件。如果没有,我愿意花一些时间来弄清楚如何实施解决方案。然而,正确方向的指针会非常有用。我对linux和编程一般比较陌生,但愿意学习。
关于工具:我不知道bash,但在某些时候我想要查看它。我已经在python中涉足了一点,所以这也没关系。如果此任务还有其他优势,请告诉我。
非常感谢任何帮助。 AutoIT脚本托管在网站上,但如果需要,我可以在此处发布我的Windows设置。
修改
好的,经过评论中的一些争论,这是我需要翻译的基本AutoIT脚本。 (我更喜欢每次都不会覆盖系统剪贴板内容的解决方案。)
EDIT2 我想这就是脚本本质上的作用:它检查一个打开的stata窗口,选择它(或执行一个),将要执行的内容粘贴到一个临时文件中,切换到stata窗口,选择命令行ctrl-1(以及可能已经用ctrl-a写入的任何内容)然后粘贴到命令行执行“tempfile”,然后命令行执行发送的代码。至少这是我理解它的方式。
最终评论
前段时间我在bash中编写了一个解决方案,它已发布here作为此问题之前版本的答案。
; 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
答案 0 :(得分:3)
IronAHK是对AutoHotKey脚本语言的Linux / Mono重写,类似于AutoIt(GUI自动化/键盘重映射工具)。我没有使用IronAHK,但AutoHotkey可以运行AutoIt v2脚本。
你也可以看看@ Project Sikuli:“Sikuli是一种使用图像自动化和测试图形用户界面(GUI)的视觉技术(截图).Sikuli包括Sikuli Script,一个Jython的可视化脚本API,以及Sikuli IDE,一个集成开发环境,用于编写带有屏幕截图的可视化脚本“(来自sikuli首页)
另一个好的选择是Linux Desktop Testing Project (LDTP),可以用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])
...
答案 1 :(得分:1)
也许你可以使用类似于这个vim插件使用的机制,它执行类似的任务:
http://www.vim.org/scripts/script.php?script_id=1048
此插件将R代码发送到R工具,在unix和windows下(R programming language 广泛用于统计软件开发和数据分析)。
我不知道Stata或R语言,但似乎你可以使用R来控制Stata,如中所述 http://www.r-bloggers.com/why-use-r/ :
You can easily use it anywhere. It's platform-independent, so you can use it
on any operating system. And it's free, so you can use it at any employer
without having to persuade your boss to purchase a license.
:
:
R allows you to integrate with other languages (C/C++, Java, Python) and
enables you to interact with many data sources: ODBC-compliant databases
(Excel, Access) and other statistical packages (SAS, Stata, SPSS,
Minitab).
一些Stata命令转换为R:
http://www.r-bloggers.com/stata-or-r/
如果你可以通过R执行所需的任务,那么你可能可以使用上面的vim插件保持不变。
希望得到这个帮助。
答案 2 :(得分:0)
我已经使用VI map 函数来定义宏以将我的文件发送到C编译器,并检索结果。它不是非常强大(没有if / then编程),但实现起来非常简单,而且我使用了很多标准映射。例如&T
大写我所在的行,而&t
小写它。我使用&S
运行我的拼写检查程序(gspell)等。你不需要用&符号开始你的宏,但这样我就知道这是一个不太可能的字母组合我要输入。
设置地图非常简单。您可以使用:map ex命令,空格,用于调用地图的字,空格,然后使用要执行的击键。如果您需要插入类似返回或转义的内容,请在其前面加上Ctrl-V。
您可以使用map!
映射在插入或替换模式下可以执行的宏。