отправка кода из vim в stata - PullRequest
8 голосов
/ 19 ноября 2010

Я уже некоторое время использую Vim для написания сценариев Stata в Windows в университете.Сейчас я изучаю R и хочу полностью перейти на Linux в качестве своей ОС (недавно я переключился на Ubuntu на своем ноутбуке).R отлично работает с Vim как в Windows, так и в Linux, однако мне все равно иногда приходится использовать Stata.В Windows я использовал простой скрипт AutoIt, предоставленный пользователем Stata, для отправки строк / всего файла в stata для оценки.Этот скрипт не работает в Linux.

Вот как выглядит скрипт

; AutoIt v3 script to run a Stata do-file from an external text editor
; Version 3.1, Friedrich Huebler, fhuebler@gmail.com, www.huebler.info, 30 March 2009

; Declare variables
Global $ini, $statapath, $statawin, $dofile, $winpause, $keypause, $clippause

; File locations
; Path to INI file
$ini = @ScriptDir & "\rundo.ini"
; Path to Stata executable
$statapath = IniRead($ini, "Stata", "statapath", "C:\Program Files\Stata10\wsestata.exe")
; Title of Stata window
$statawin = IniRead($ini, "Stata", "statawin", "Stata/SE 10.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 SendKeyDelay and WinWaitDelay 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("^4")
  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("^4")
  ; 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

; End of script

со следующим в моем vimrc

" STATA DO-FILE SCRIPTS

fun! RunIt()
  w
  !start "C:\Programme\Stata10\integvim\rundo3\rundo.exe" "%:p"
endfun
map <F8> :<C-U>call RunIt()<CR><CR>
imap <F8> <Esc>:<C-U>call RunIt()<CR><CR>

fun! RunDoLines()
  let selectedLines = getbufline('%', line("'<"), line("'>"))
 if col("'>") < strlen(getline(line("'>")))
  let selectedLines[-1] = strpart(selectedLines[-1], 0, col("'>"))
  endif
 if col("'<") != 1
  let selectedLines[0] = strpart(selectedLines[0], col("'<")-1)
  endif
 let temp = tempname() . ".do"
  call writefile(selectedLines, temp)
    exec "!start C:\\Programme\\Stata10\\integvim\\rundo3\\rundo.exe " . temp
    au VimLeave * exe "!del -y" temp
endfun
map <F9> :<C-U>call RunDoLines()<CR><CR> 
imap <F9> <Esc>:<C-U>call RunDoLines()<CR><CR> 

Это действительно практично и практически единственная причина, по которой я до сих порпридерживаться Windows.Как мне получить что-то подобное для Ubuntu?Я новичок в Linux, и не очень много знаю о программировании, кроме статистики.Любая помощь очень ценится.(Пожалуйста, не предлагайте emacs, поддержка emacs для stata неисправна, и хотя его интеграция с R намного лучше, я бы хотел сейчас использовать Vim.)

По возможной связанной теме: я рассматриваюизучая Python, поскольку я, вероятно, буду работать с данными и проводить эмпирический анализ в течение более длительного времени, и я думаю, что это может быть полезно для некоторых задач, например, для решения подобных проблем или анализа данных с веб-сайтов.Рекомендуется ли это, или я должен смотреть на другой язык (или полностью забыть эту идею)?

Ответы [ 4 ]

1 голос
/ 09 декабря 2010

[Редактировать]: Ой, я заметил, что ваш главный вопрос относится к сценарию AutoIt, извините, я не знаю, как перевести это на Linux. Я не думаю, что есть простой способ. Возможно, вы захотите изучить xautomation или другие подобные инструменты, но это совершенно другая игра с мячом.

В вашем .vimrc заменить:

!start "C:\Programme\Stata10\integvim\rundo3\rundo.exe" "%:p"

С помощью команды, которая делает то же самое в Linux. Это должно выглядеть примерно так:

!/usr/share/... "%:p"

Поскольку я не имею понятия о Стате, вам придется узнать точную команду от кого-то другого.

Также я не уверен насчет "%:p": пожалуйста, посмотрите это в справке vim и сравните различия между Windows и Linux.

1 голос
/ 14 декабря 2010

в Linux вы можете использовать плагин для vim с именем slime.vim, который позволит вам передавать код из vim в работающий процесс R, не выходя из vim.Я использую это на Mac для MySQL, PHP, Python и Ocaml, и это прекрасно работает.Единственное предостережение в том, что он использует экран, чтобы творить свою магию, что само по себе неплохо.

Если я правильно понимаю ваш вопрос, я верю, что это вам очень поможет.Удачи и надежды, которые вам помогут.

1 голос
/ 21 ноября 2010

Если вы собираетесь перейти на linux (навсегда), вам следует: 1. позвонить в stata и переключить вашу лицензию на лицензию linux (что они сделают бесплатно) и установить ее изначально, а затем запустить stata из vim простотребуется bash-скрипт (я не эксперт по vim) 2. или вы можете купить stata 11, которая имеет одну лицензию для всех поддерживаемых платформ 3. вы можете установить stata с wine (игра на linux облегчила для меня), ноЯ не мог заставить вино дать stata больше половины гигабайта оперативной памяти, поэтому я установил native stata10

Я использую gedit для python, stata, R, latex и так далее, он обрабатывает все,довольно легко добавить подсветку синтаксиса и стили и так далее.

Python отлично подходит для анализа данных, см.

http://www.scipy.org/ http://openopt.org/Welcome http://www.macworld.com/appguide/app.html?id=63924&expand=false

Для очистки веб-сайтов Theres

http://scrapy.org/ http://wwwsearch.sourceforge.net/mechanize/

и для анализа данных из текста обычно у нас есть, http://pyparsing.wikispaces.com/

У меня есть куча файлов, которые выможет оказаться полезным (gtksoureview определит языкИоны для Stata и других, PDF-копии некоторых книг (некоторые с авторским левом), но я не знаю, как прикрепить файлы на этом сайте

0 голосов
/ 22 сентября 2012

Я редко использую stata, но в какой-то момент нашел быстрое решение в bash.этот скрипт, выполненный с несколькими строками в моем .vimrc, работает нормально.вам может потребоваться настроить задержки в зависимости от вашей системы.

#!/bin/bash

# needs wmctrl, xte and xsel
# to get them run
# sudo apt-get install wmctrl xautomation xsel
# in debian/ubuntu linux

#copy to clipboard "do filename"
echo 'do ' '"'$1'"' | xsel -b

# get current window id
winid = $(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}')

# check for stata window, if found activate else execute
# use correct version here
if [ "$(pgrep stata)" ] 
then
    wmctrl -a 'Stata/MP 11.2'
else
    xstata &
    sleep .1 
fi

# delay depends on window manager etc
# .1 ok with xmonad in 10.04
sleep .1 

# switch to command line, ctrl-4 in stata 10, ctrl-1 in 11/12
# and select existing text via ctrl-a
xte 'keydown Control_L' 'key 1' 'key A' 'usleep 100' \
    'key V' 'keyup Control_L' 
sleep .1
xte 'key Return'
sleep .3


# go back to editor window
wmctrl -i -a $winid 

отрегулируйте это и поместите в свой vimrc.

"" STATA DO-FILE SCRIPTS
fun! RunIt()
  w
  "adjust this path to the bash script
  !sh "/home/username/.rundo.sh" "%:p"
endfun
au FileType stata noremap <F8> :<C-U>call RunIt()<CR><CR>
fun! RunDoLines()
  let selectedLines = getbufline('%', line("'<"), line("'>"))
 if col("'>") < strlen(getline(line("'>")))
  let selectedLines[-1] = strpart(selectedLines[-1], 0, col("'>"))
  endif
 if col("'<") != 1
  let selectedLines[0] = strpart(selectedLines[0], col("'<")-1)
  endif
 let temp = tempname() . ".do"
  call writefile(selectedLines, temp)
          "adjust this path to the bash script
          exec "!sh /home/username/.rundo.sh " . temp
    "au VimLeave * exe "!del -y" temp
    au VimLeave * silent exe '!del /Q "'.$TEMP.'\*.tmp.do"'
endfun
au FileType stata noremap <F9> :<C-U>call RunDoLines()<CR><CR> 
...