отправить код из vim во внешнее приложение для исполнения

Я регулярно использую stata на работе. Я предпочитаю текстовый редактор (g) vim. Я использовал предоставленные сценарии здесь или здесь для отправки кода из vim в stata. Эта функциональность чрезвычайно практична и практически единственное, что удерживает меня от полного перехода на Linux. Скрипты написаны на AutoIT, поэтому я не могу использовать их в Linux. Они также в основном не зависят от выбора текстового редактора, люди, которые их написали, используют notepad ++.

По сути, эти сценарии вместе с несколькими строками в моем vimrc позволяют мне отправлять выделенные фрагменты или весь файл в работающее окно статистики (если ни один не открыт, сначала запускается stata).

Я ищу решение, которое делает это в Linux, но я не знаю, с чего начать. В linux есть две разные версии stata: stata для командной строки и xstata - это версия графического интерфейса. Мне нужно использовать версию с графическим интерфейсом, поскольку, к сожалению, функциональность версии командной строки ограничена, поэтому screen / tmux исключены.

Если это тривиально, мне очень жаль, что я его упустил, и был бы безмерно благодарен за решение. Мне также не удалось найти существующий плагин для vim, который я мог бы использовать. Если нет, я готов потратить некоторое время и выяснить, как реализовать решение. Однако указатель в правильном направлении был бы весьма полезен. Я относительно новичок в Linux и программировании в целом, но хочу учиться.

Что касается инструментов: я не знаю bash, но это то, что я все равно хочу изучить в какой-то момент. Я немного поработал с Python, так что это тоже будет нормально. Если есть что-то еще более подходящее для этой задачи, дайте мне знать.

Любая помощь приветствуется. Сценарии AutoIT размещены на веб-сайте, но при необходимости я могу разместить здесь свои настройки Windows.

EDIT

Хорошо, после некоторых дискуссий в комментариях, вот основной сценарий 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

19
задан Community 23 May 2017 в 12:31
поделиться