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)?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top