将代码从Vim发送到外部应用程序执行

emeijp43  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(145)

使用Stata我的文本编辑器是gVim。使用来自herehere的脚本将代码从Vim发送到Stata使我不会切换到Linux。脚本是在AutoIt中,我不能在Linux中使用。它们独立于文本编辑器;写它们的人使用Notepad++。这些脚本在我的.vimrc文件中有几行,允许我将选择或整个文件发送到Stata窗口。
我在Linux中寻找这个。命令行有Stata,xstata是GUI版本。我使用GUI版本,因此排除了ScreenTmux。我找不到Vim的插件。Bash我想看看。Python就OK了。
AutoIt脚本我需要翻译我喜欢不覆盖剪贴板的内容。它检查打开的Stata窗口,选择或执行一个,将要执行的内容粘贴到临时文件中,切换到Stata窗口,用Ctrl + 1选择命令行(以及已经用Ctrl + A编写的任何内容),然后将“tempfile”粘贴到命令行,然后执行代码。a solution in 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
8zzbczxx

8zzbczxx1#

IronAHKAutoHotKey脚本语言的Linux/Mono重写,类似于AutoIt(GUI自动化/键盘重Map工具)。我没有使用过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])
    ...
xhv8bpkk

xhv8bpkk2#

也许你可以使用类似于这个Vim插件使用的机制,它执行类似的任务:
R.vim : Send R code from a VIM buffer to R
这个插件将R代码发送到一个R工具,在unix和windows下(R programming language)被广泛用于统计软件开发和数据分析)。
我不知道Stata或R语言,但似乎你可以使用R控制Stata,如 * Why use R? * 所述:
你可以在任何地方轻松使用它。它是独立于平台的,因此您可以在任何操作系统上使用它。而且它是免费的,所以你可以在任何雇主那里使用它,而不必说服你的老板购买许可证。


R允许您与其他语言(C/C++,Java,Python)集成,并使您能够与许多数据源进行交互:符合ODBC标准的数据库(Excel、Access)和其他统计软件包(SAS、Stata、SPSS、Minitab)。
一些Stata命令被翻译成R:

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

disbfnqx

disbfnqx3#

我已经使用VI map 函数定义了宏来将文件发送到C编译器,并检索结果。它不是很健壮(没有if/then编程),但实现起来相当简单,而且我使用了很多标准Map。例如,&T大写我所在的行,而&t小写它。我使用&S来运行拼写检查器(gspell)等。你不需要开始你的宏与符号,但这样我知道这是一个不太可能的字母组合,我会键入。
建立一个Map是很容易的。您可以使用 :map ex命令、空格、一个用于调用map的 * 单词 *、一个空格,然后是要执行的命令。如果你需要插入回车或转义之类的东西,可以在前面加上Ctrl-V。
您可以使用map!Map一个宏,该宏可以在插入或替换模式下执行。

相关问题