отправить код из vim во внешнее приложение для исполнения - PullRequest
19 голосов
/ 12 августа 2011

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

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

Я ищу решение, которое делает это в 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

Ответы [ 3 ]

3 голосов
/ 23 августа 2011

IronAHK - это перезапись Linux / Mono языка сценариев AutoHotKey , который аналогичен AutoIt (инструмент для автоматизации графического интерфейса пользователя / переназначения клавиатуры). Я не использовал IronAHK, но AutoHotkey может запускать сценарии AutoIt v2.

Вы также можете посмотреть @ Project Sikuli : «Sikuli - это визуальная технология для автоматизации и тестирования графических пользовательских интерфейсов (GUI) с использованием изображений (снимки экрана). Sikuli включает в себя Sikuli Script, API визуальных сценариев для Jython и Sikuli IDE, интегрированная среда разработки для простого написания визуальных сценариев со скриншотами "(с первой страницы sikuli)

Другим хорошим вариантом является Проект Linux Desktop Testing (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])
    ...
1 голос
/ 19 августа 2011

Возможно, вы могли бы использовать механизм, аналогичный используемому в этом плагине 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'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 выше без изменений.

Надеюсь, что это поможет.

0 голосов
/ 12 августа 2011

Я использовал функцию VI map , чтобы определить макросы для отправки моего файла компилятору C и получения результатов. Это не очень надежно (нет, если / потом программирование), но довольно просто реализовать, и у меня есть много стандартных отображений, которые я использую. Например, &T прописывает строчную строку, в которой я нахожусь, а &t строчную. Я использую &S для запуска проверки орфографии (gspell) и т. Д. Вам не нужно начинать свои макросы с амперсанда, но, таким образом, я знаю, что это будет маловероятная комбинация букв, которые я буду печатать.

Настройка карты довольно проста. Вы используете команду : map ex, пробел, слово , используемое для вызова карты, пробела, а затем нажатия клавиш, которые вы хотите выполнить. Если вам нужно вставить что-то вроде возврата или выхода, добавьте префикс Ctrl-V.

Вы можете использовать map! для отображения макроса, который может быть выполнен в режиме вставки или замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...