I am transitioning to Emacs with evil-mode after years of Vim. For work reasons I have to use a GUI statistics program (Stata) frequently. This program does not integrate well with external editors. ess-mode
doesn't support the GUI version of Stata but only a very limited terminal version. I prefer a simple solution that I can maintain myself.
To make it work with Vim, I wrote a shell script using xdotool
that takes as argument a filename, opens the GUI window, pastes "do filename" in the command window, sends return and then goes back to the original editor window. It's not a sophisticated solution but works well in practice.
In my .vimrc
I had some code that would write the currently selected region or the current line to a temporary file in /tmp/randomfoldername/consecutivenumber.do
, then call the shell script with that file as the argument. Upon leaving vim, the folder would be deleted.
I am looking to replicate this functionality in Emacs, but don't know how or where to start. I essentially want to mimick what the ess-mode
functions ess-eval-region-or-line-and-step
and ess-eval-buffer
are doing, simply by calling the shell script with the name of a temporary file or the name of the current buffer.
If it helps, this is the vimscript code:
" Run current buffer
fun! RunIt()
w
!sh "~/dotfiles/rundo.sh" "%:p"
endfun
" Run selection
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 "!sh ~/dotfiles/rundo.sh " . temp
au VimLeave * silent exe '!del /Q "'.$TEMP.'\*.tmp.do"'
endfun
" Mappings
au FileType stata noremap <F8> :<C-U>call RunIt()<CR><CR>
au FileType stata noremap <F9> :<C-U>call RunDoLines()<CR><CR>
au FileType stata noremap <C-Return> <S-v>:<C-U>call RunDoLines()<CR><CR>