python bash vim autoit stata

python - enviar código desde vim a una aplicación externa para su ejecución



bash autoit (3)

He usado la función de mapa VI para definir macros para enviar mi archivo a un compilador de C y recuperar los resultados. No es muy robusto (no hay programación if / then), pero es bastante simple de implementar, y tengo muchos mapeos estándar que uso. Por ejemplo, &T mayúsculas la línea en la que estoy, mientras que &t minúsculas. Utilizo &S para ejecutar mi corrector ortográfico (gspell), etc. No es necesario que comiences tus macros con un signo, pero de esta manera sé que es una combinación improbable de letras que estaría escribiendo.

Configurar un Mapa es bastante fácil. Utiliza el comando : map ex, space, una palabra que se usa para invocar el mapa, un espacio y luego las pulsaciones de teclas que deseas ejecutar. Si necesita insertar algo como una devolución o escape, prefílela con Ctrl-V.

Puedes usar el map! para asignar una macro que se puede ejecutar en el modo Insertar o Reemplazar.

Estoy usando regularmente stata en el trabajo. Mi editor de texto de elección es (g) vim. He estado usando los scripts proporcionados here o here para enviar código de vim a stata. Esta funcionalidad es inmensamente práctica y prácticamente lo único que me impide cambiarme completamente a Linux. Los scripts están escritos en AutoIT, por lo que no puedo usarlos en Linux. También son básicamente independientes de la elección del editor de texto, las personas que los escribieron están usando notepad ++.

Esencialmente, estas secuencias de comandos junto con algunas líneas en mi vimrc me permiten enviar selecciones o todo el archivo a una ventana de estado de ejecución (si no hay ninguno abierto, primero se inicia).

Estoy buscando una solución que haga esto en Linux, pero no tengo idea de por dónde empezar. En Linux hay dos versiones de stata diferentes, stata para la línea de comandos y xstata es la versión gui. Necesito usar la versión gui, ya que la funcionalidad de la versión de línea de comandos está limitada, por lo que la pantalla / tmux quedan descartadas.

Si esto es trivial, realmente lamento perdérmelo y estaría inmensamente agradecido por una solución. Tampoco pude encontrar un complemento existente para vim que pudiera utilizar. Si no es así, estoy dispuesto a invertir algo de tiempo y descubrir cómo implementar una solución. Sin embargo, un indicador en la dirección correcta sería muy útil. Soy relativamente nuevo en Linux y en la programación en general, pero estoy dispuesto a aprender.

Respecto a las herramientas: no sé bash, pero es algo que quiero analizar de alguna manera en algún momento. He incursionado un poco en python, por lo que también estaría bien. En caso de que haya algo absolutamente superior para esta tarea, hágamelo saber.

Cualquier ayuda es muy apreciada. Los scripts de AutoIT están alojados en el sitio web, pero puedo publicar mi configuración de Windows aquí si es necesario.

EDITAR

Ok, después de un poco de debate en los comentarios, aquí está el script AutoIT esencial que necesito traducir. (Aunque preferiría una solución que no sobrescriba el contenido del portapapeles del sistema cada vez).

Edit2 Supongo que esto es lo que hace esencialmente el script: comprueba si hay una ventana abierta de datos, la selecciona (o ejecuta una), pega los contenidos que se van a ejecutar en un archivo temporal, cambia a la ventana de datos, selecciona la línea de comandos con ctrl-1 (y cualquier cosa que ya esté escrita con ctrl-a) y luego pegue "tempfile" en la línea de comandos, que luego ejecuta el código que se envió. Al menos así es como lo entiendo.

COMENTARIO FINAL

He desarrollado una solución en bash hace algún tiempo, se publica here como respuesta a una versión anterior de esta pregunta.

; 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


Tal vez podría usar un mecanismo similar al utilizado por este complemento vim, que realiza una tarea similar:

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

Este complemento envía el código R a una herramienta R, bajo Unix y Windows (el lenguaje de programación R se usa ampliamente para el desarrollo de software estadístico y el análisis de datos).

No sé sobre Stata o el lenguaje R, pero parece que puedes controlar Stata usando R, como se indica en 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).

Algunos comandos de Stata traducidos a R:

http://www.r-bloggers.com/stata-or-r/

Si pudiera realizar la tarea deseada a través de R, entonces probablemente podría usar el complemento vim anterior sin cambios.

Espero que esto ayude.


IronAHK es una reescritura de Linux / Mono del lenguaje de scripting AutoHotKey , que es similar a AutoIt (una herramienta de automatización de GUI / herramienta de reasignación de teclado). No he usado IronAHK, pero AutoHotkey puede ejecutar scripts AutoIt v2.

También puede buscar @ Project Sikuli : "Sikuli es una tecnología visual para automatizar y probar interfaces gráficas de usuario (GUI) usando imágenes (capturas de pantalla). Sikuli incluye Sikuli Script, una API de scripts visuales para Jython, y Sikuli IDE, un entorno de desarrollo integrado. para escribir guiones visuales con capturas de pantalla fácilmente "(de la página principal de Sikuli)

Otra buena opción es Linux Desktop Testing Project (LDTP) , programable con Python:

ejemplo:

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]) ...