Enviando código de Vim para STATA
Pergunta
Eu tenho usado o VIM para escrever scripts STATA no Windows há um tempo agora na universidade. Estou aprendendo r no momento e quero mudar completamente para o Linux como meu sistema operacional (recentemente mudei para o Ubuntu no meu laptop). R funciona bem com o VIM no Windows e no Linux, no entanto, ainda preciso usar o STATA. No Windows, usei um script automático simples fornecido por um usuário do STATA para enviar linhas / o arquivo inteiro para o STATA para avaliação. Este script não funciona no Linux.
É assim que o script se parece
; 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
com o seguinte no meu 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>
Esta é realmente prática e praticamente a única razão pela qual ainda estou mantendo o Windows. Como eu conseguiria algo assim para o Ubuntu? Sou novo no Linux e realmente não sei muito sobre programação além das estatísticas. Qualquer ajuda é muito apreciada. (Por favor, não sugira emacs, o suporte do EMACS para o STATA está com defeito e, embora sua integração com r seja muito melhor, eu gostaria de continuar usando o VIM por enquanto.)
Em um tópico possivelmente relacionado: estou pensando em aprender Python, pois provavelmente vou trabalhar com dados e fazer uma análise empírica por mais tempo, e acho que pode ser útil para algumas tarefas, por exemplo, resolver problemas como esse ou a análise dados de sites. Isso é recomendado ou devo olhar para outro idioma (ou esquecer completamente a idéia)?
Solução 4
Eu raramente uso o STATA, mas em algum momento resolveu uma solução rápida no Bash. Esse script, executado com algumas linhas no meu .VIMRC, funciona bem. Pode ser necessário ajustar os atrasos, dependendo do seu sistema.
#!/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
Ajuste isso e coloque -o no seu 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>
Outras dicas
Se você vai mudar para o Linux (para o bem), você deve 1. Ligue para o Stata e troque sua licença para uma licença Linux (o que eles farão de graça) e instale -o nativamente, então iniciar o Stata do Vim apenas requer uma festa Script (não sou especialista em Vim) 2. Ou você pode comprar o Stata 11, que possui uma licença para todas as plataformas suportadas 3. Você pode instalar o Stata With Wine (o jogo no Linux facilitou para mim), mas eu não podia Ter vinho para dar a Stata mais de meio show de RAM, então eu instalei o Stata10 nativo10
Eu uso o GEDIT para Python, Stata, R, Latex, etc.
Python é ótimo para análise de dados, consulte
http://www.scipy.org/http://openopt.org/welcomehttp://www.macworld.com/appguide/app.html?id=63924&expand=false
Para raspar sites
http://scrapy.org/http://wwwsearch.sourceforge.net/mechanize/
e para analisar dados fora do texto em geral, temos,http://pyparsing.wikispaces.com/
Eu tenho vários arquivos que você pode achar úteis (definições de idiomas GTKSOUREVIEW para Stata e outros, cópias em PDF de alguns livros (alguns copyleft)), mas não sei como anexar arquivos neste site
No Linux, você pode usar um plug -in para vim chamado slime.vim, que permitirá que você permitirá o código do VIM para um processo R em execução sem sair do VIM. Eu uso isso no Mac para MySQL, PHP, Python e OCAML e funciona muito bem. A única ressalva é que ela usa a tela para fazer sua mágica, o que não é uma coisa ruim em si.
Se eu entender sua pergunta corretamente, acredito que isso o ajudará enormemente. Boa sorte e esperança que ajudem você.
EDIT]: OOPS, notei que sua pergunta principal está relacionada ao script automático, desculpe, não sei como traduzir isso para o Linux. Eu não acho que exista uma maneira fácil. Você pode querer investigar o Xautomation ou outras ferramentas semelhantes, mas esse é um jogo de bola totalmente diferente.
Na tua .vimrc
substituir:
!start "C:\Programme\Stata10\integvim\rundo3\rundo.exe" "%:p"
Com o comando que faz a mesma coisa no Linux. Deve parecer parecido com isso:
!/usr/share/... "%:p"
Como não tenho idéia do STATA, você terá que descobrir o comando exato de outra pessoa.
Também não tenho certeza sobre o "%:p"
: Por favor, procure isso na ajuda do VIM e compare as diferenças entre o Windows e o Linux.