19

我经常在工作中使用 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
4

3 回答 3

3

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

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

另一个不错的选择是Linux 桌面测试项目 (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])
    ...
于 2011-08-22T20:01:16.970 回答
1

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

http://www.vim.org/scripts/script.php?script_id=1048

该插件将 R 代码发送到 R 工具,在 unix 和 windows 下(R 编程语言广泛用于统计软件开发和数据分析)。

我不了解 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 插件。

希望这有帮助。

于 2011-08-19T12:08:21.007 回答
0

我使用 VI映射函数来定义宏以将我的文件发送到 C 编译器,并检索结果。它不是很健壮(没有 if/then 编程),但实现起来非常简单,而且我使用了很多标准映射。例如&T,将我所在的行大写,而&t将其小写。我&S用来运行我的拼写检查器 (gspell) 等。你不需要用 & 号开始你的宏,但这样我知道这是我要输入的字母的不太可能的组合。

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

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

于 2011-08-12T14:26:42.083 回答