2010-11-19 16 views
8

Ich habe Vim verwendet, um Stata-Skripte in Windows für eine Weile jetzt an der Universität zu schreiben. Ich lerne gerade R, und ich möchte komplett auf Linux als mein Betriebssystem umsteigen (ich bin kürzlich auf meinem Laptop zu Ubuntu gewechselt). R funktioniert gut mit Vim in Windows und Linux, aber ich muss Stata manchmal verwenden. In Windows habe ich ein einfaches AutoIt-Skript verwendet, das von einem Stata-Benutzer bereitgestellt wurde, um Zeilen/die gesamte Datei zur Auswertung an Stata zu senden. Dieses Skript funktioniert nicht unter Linux. DieseSenden von Code von vim an stata

ist, was das Skript sieht aus wie

; AutoIt v3 script to run a Stata do-file from an external text editor 
; Version 3.1, Friedrich Huebler, [email protected], 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 

mit folgendem in meinem 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> 

Das ist wirklich praktisch und praktisch der einzige Grund, warum ich immer noch auf Windows kleben. Wie würde ich so etwas für Ubuntu machen? Ich bin neu in Linux und weiß nicht viel über Programmierung neben Statistiken. Jede Hilfe wird sehr geschätzt. (Bitte nicht vorschlagen Emacs, Emacs Unterstützung für Stata ist fehlerhaft, und obwohl seine Integration mit R ist viel besser, würde ich gerne weiterhin Vim verwenden.)

Zu einem möglicherweise verwandten Thema: Ich überlege zu lernen Python, da ich wahrscheinlich mit Daten arbeiten und länger empirische Analysen machen werde, und ich denke, dass es für einige Aufgaben nützlich sein könnte, z um Probleme wie diese zu lösen oder Daten von Webseiten zu analysieren. Ist das empfohlen, oder sollte ich eine andere Sprache anschauen (oder die Idee komplett vergessen)?

+1

Vielleicht möchten Sie die Python-Frage in einem separaten Thema stellen. Aber R hat eine ganze Reihe von Tools zum Parsen von Daten von Webseiten. Und wenn Sie R für die nachfolgende Analyse verwenden möchten, verwenden Sie besser R für die Datengenerierung, da Sie es einfacher im richtigen Format haben können. Dennoch ist Python eine interessante Sprache. –

Antwort

0

Ich benutze selten Stata mehr, aber irgendwann in bash eine schnelle Lösung ausgearbeitet. Dieses Skript, ausgeführt mit ein paar Zeilen in meinem .vimrc, funktioniert gut. Möglicherweise müssen Sie die Verzögerungen abhängig von Ihrem System anpassen.

#!/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 

dies anpassen und in Ihrem 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> 
1

Wenn Sie zu Linux wechseln (für gute) sollten Sie 1. Stata aufrufen und wechseln Sie Ihre Lizenz zu einer Linux-Lizenz (was sie kostenlos tun werden) und installieren Sie es nativ und starten Stata von vim benötigt nur ein Bash-Skript (Ich bin kein Experte für vim) 2. oder, könnte man Stata 11 kaufen, die eine Lizenz für alle unterstützten Plattformen hat 3. Sie könnten Stata mit Wein installieren (spielen auf Linux machte es einfacher für mich) aber ich konnte nicht Wein zu Stata mehr als ein halbes Gig von Ram zu geben, so installierte ich native stata10

Ich benutze gedit für Python, Stata, R, Latex, und so weiter, es behandelt alles, und gtksourceview ist ziemlich einfach, Syntax-Highlighting und Stile usw. hinzuzufügen.

Python ist für die Datenanalyse finden Sie in

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

Für Schaben Websites Theres

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

und für das Parsen von Daten aus dem Text haben wir im Allgemeinen, http://pyparsing.wikispaces.com/

Ich habe eine Reihe von Dateien, die Sie vielleicht nützlich (gtksoureview Sprachdefinitionen für Stata und andere, pdf Kopien einiger Bücher (einige Copyleft)), aber ich weiß nicht finden, wie die Dateien auf dieser Website befestigen

+1

Ich habe Stata 11 und es funktioniert gut in Linux. Ich suche nur nach einem Fix, um Stata von Vim auszuführen. – ilprincipe

+0

Ich wünschte, jemand wüsste die Antwort auf Ihre Frage aus der Hand, sorry, ich benutze nicht vim. Darf ich fragen, was dich zu vim angezogen hat? –

+0

anfänglich war es mehr oder weniger eine zufällige Wahl, aber ich habe es sehr schnell gemocht, und nie daran gedacht, zu etwas anderem zu wechseln. Die modale Bearbeitung ist für mich viel bequemer als die Modifizierungsschlüssel, die emacs verwendet, und ich brauche keine vollwertige IDE. Ich werde einen Blick auf bash werfen. – ilprincipe

1

[Bearbeiten]: Hoppla, ich habe bemerkt, dass Ihre Hauptfrage sich auf das AutoIt-Skript bezieht. Tut mir leid, ich weiß nicht, wie ich das in Linux übersetzen soll. Ich glaube nicht, dass es einen einfachen Weg gibt. Vielleicht möchten Sie in Xautomation oder andere ähnliche Tools schauen, aber das ist ein völlig anderes Ballspiel.

In Ihrem .vimrc ersetzen:

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

Mit dem Befehl, der die gleiche Sache in Linux tut. Es sollte ähnlich aussehen:

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

Da ich keine Ahnung von Stata haben werden Sie von jemandem, den genauen Befehl aus anderen finden müssen.

Auch ich bin mir nicht sicher über die "%:p": Bitte schauen Sie sich das in der vim Hilfe an und vergleichen Sie die Unterschiede zwischen Windows und Linux.

1

In Linux können Sie ein Plugin für vim namens slime.vim verwenden, mit dem Sie Code von vim an einen laufenden R-Prozess übergeben können, ohne vim zu verlassen. Ich benutze dies auf dem Mac für MySQL, PHP, Python und Ocaml und es funktioniert gut. Die einzige Einschränkung ist, dass es Bildschirm verwendet, um seine Magie zu tun, die an sich keine schlechte Sache ist.

Wenn ich Ihre Frage richtig verstehe, glaube ich, dass dies Ihnen enorm helfen wird. Viel Glück und Hoffnung das hilft dir.