我一直在大学使用Vim在Windows中编写Stata脚本一段时间。我正在学习R,我想完全切换到Linux作为我的操作系统(我最近在笔记本电脑上切换到Ubuntu)。 R在Windows和Linux中都可以与Vim一起使用,但是我有时候还需要使用Stata。在Windows中,我一直使用Stata用户提供的简单AutoIt脚本将行/整个文件发送到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,因为我可能会处理数据并进行更长时间的实证分析,我认为它可能对某些任务很有用,例如:解决这样的问题或解析网站上的数据。这是推荐的,还是我应该看另一种语言(或完全忘记这个想法)?
答案 0 :(得分:1)
如果你要切换到linux(for good)你应该 1.调用stata并将你的许可证转换为linux许可证(他们将免费使用)并原生安装,然后从vim启动stata只需要一个bash脚本(我不是vim的专家) 2.或者,您可以购买stata 11,它拥有所有支持平台的一个许可证 3.你可以用葡萄酒安装stata(在linux上播放让我更容易)但是我无法获得葡萄酒给stata超过半公斤的ram,所以我安装了原生的stata10
我使用gedit进行python,stata,R,latex等等,它处理任何事情,gtksourceview很容易添加语法高亮和样式等等。
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/
我有一堆你可能会觉得有用的文件(对stata和其他人的gtksoureview语言定义,某些书籍的pdf副本(一些copyleft))但我不知道如何在这个网站上附加文件
答案 1 :(得分:1)
[编辑]:哎呀,我注意到你的主要问题与AutoIt脚本有关,抱歉我不知道怎么把它翻译成Linux。我认为没有任何简单的方法。您可能想要研究xautomation或其他类似的工具,但这是一个完全不同的球类游戏。
在.vimrc
替换:
!start "C:\Programme\Stata10\integvim\rundo3\rundo.exe" "%:p"
使用在linux中执行相同操作的命令。 它看起来应该类似于:
!/usr/share/... "%:p"
由于我对Stata没有任何线索,你必须从其他人那里找到确切的命令。
此外,我不确定"%:p"
:请在vim帮助中查看,并比较Windows和Linux之间的差异。
答案 2 :(得分:1)
如果我理解你的问题,我相信这会对你有很大的帮助。祝你好运和希望帮助你。
答案 3 :(得分:0)
我很少使用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>