Отправить код из vim во внешнее приложение для выполнения
Я регулярно использую stata на работе. Моим текстовым редактором по выбору является (g) vim.
Я использовал сценарии здесь или здесь отправить код из vim в stata. Эта функциональность очень практична и практически единственная вещь, которая препятствует мне полностью переключиться на Linux. Сценарии написаны в AutoIT, поэтому я не могу использовать их в linux. Они также в основном не зависят от выбора текстового редактора, люди, которые их написали, используют notepad ++.
По сути, эти скрипты вместе с несколькими строками в моем vimrc позволяют мне отправлять выбранные файлы или весь файл в запущенное окно stata (если ни один не открыт, сначала запускается stata).
Я ищу решение, которое делает это в Linux, но я понятия не имею, с чего начать. В Linux есть две разные версии stata, stata для командной строки, а xstata - версия gui. Мне нужно использовать версию gui, так как функциональность версии командной строки ограничена, к сожалению, поэтому screen/tmux исключены.
Если это тривиально, мне очень жаль, что я пропустил его, и был бы очень благодарен за решение. Я также не смог найти существующий плагин для vim, который мог бы использовать. Если нет, я готов вложить некоторое время и выяснить, как реализовать решение. Однако указатель в правильном направлении был бы весьма полезен. Я относительно новичок в Linux и программировании в целом, но хочу учиться.
Что касается инструментов: я не знаю bash, но в какой-то момент я хочу посмотреть в любом случае. Я немного потрудился в python, так что это тоже будет нормально. Если у вас есть что-то еще более совершенное, сообщите мне.
Любая помощь приветствуется. Сценарии AutoIT размещаются на веб-сайте, но при необходимости я могу установить настройки своего окна.
ИЗМЕНИТЬ
Хорошо, после некоторых обсуждений в комментариях, вот главный AutoIT script, который мне нужно перевести. (Я бы предпочел решение, которое не перезаписывает содержимое системного буфера обмена каждый раз, хотя.)
Edit2
Я предполагаю, что это то, что делает script по существу: он проверяет открытое окно stata, выбирает его (или выполняет его), вставляет содержимое, которое должно быть исполнено во временный файл, переключается в окно stata, выбирает команду line с 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
Ответы
Ответ 1
IronAHK - это перезапись Linux/Mono AutoHotKey язык сценариев, который похож на AutoIt (инструмент автоматического переопределения графического интерфейса пользователя/клавиатуры). Я не использовал IronAHK, но AutoHotkey может запускать скрипты AutoIt v2.
Вы также можете посмотреть @Project Sikuli: "Sikuli - это визуальная технология для автоматизации и тестирования графических пользовательских интерфейсов (GUI) с использованием изображений (скриншоты). Sikuli включает в себя Sikuli Script, визуальный скриптовый API для Jython и 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])
...
Ответ 2
Возможно, вы могли бы использовать механизм, подобный используемому этим плагином vim, который выполняет аналогичную задачу:
http://www.vim.org/scripts/script.php?script_id=1048
Этот плагин отправляет R-код в инструмент R под UNIX и Windows (R-язык программирования широко используется для статистической разработки программного обеспечения и анализа данных).
Я не знаю о Stata или R-языке, но кажется, что вы можете управлять Stata с помощью R, как указано в
http://www.r-bloggers.com/why-use-r/
You can easily use it anywhere. It platform-independent, so you can use it
on any operating system. And it 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 без изменений.
Надеюсь на эту помощь.
Ответ 3
Я использовал функцию карты VI для определения макросов для отправки моего файла в компилятор C и получения результатов. Он не очень надежный (нет, если/тогда программирование), но его довольно просто реализовать, и у меня много стандартных сопоставлений, которые я использую. Например, &T
верхняя часть строки, на которой я нахожусь, а &T
- нижний регистр. Я использую &S
для запуска моей проверки орфографии (gspell) и т.д. Вам не нужно начинать свои макросы с амперсанда, но таким образом я знаю, что это маловероятная комбинация букв, которые я бы печатал.
Настройка карты довольно проста. Вы используете команду: map ex, пробел, слово, используемое для вызова карты, пробел и затем нажатия клавиш, которые вы хотите выполнить. Если вам нужно вставить что-то вроде возврата или выхода, префикс его Ctrl-V.
Вы можете использовать map!
для сопоставления макроса, который может быть выполнен в режиме Вставки или Замены.