Vim: ejecuta el script en el que estoy trabajando en una pantalla dividida

16

Estoy trabajando en un pequeño script de Python, que necesita ejecución frecuente para depurar y desarrollar más.

¿Puedo dividir la pantalla vim y ejecutar mi script en una parte con una pulsación de tecla?

Adam Matan
fuente

Respuestas:

8

Agregue esta línea a su .vimrc:

command R !./%

Y luego puede escribir ": R" mientras está en Vim para ejecutar el script ( vim-run-current-file )

caleb
fuente
10

Vim no lo hace, y nunca admitirá un shell incrustado como emacs o kate (si quiere decir eso), vea esta pregunta de stackoverflow .

David Spillet tiene razón, puedes ejecutar tu vim dentro de la pantalla gnu:

$ screen vim foo.txt

Pero eso solo le dará algo remotamente parecido a un administrador de ventanas en una terminal, MUY útil cuando se usa sobre ssh o en una caja sin X, pero localmente puede abrir otro xterm y cambiar entre ellos. *

De todos modos, si puede vivir con el hecho de que no verá el archivo que está editando mientras mira la salida que produce, la sugerencia de Jack M es buena, pero podría ser más corta:

:map ;e :w<cr>:!python %<cr>

Con el mismo propósito, tengo esto en mi ~/.vimrc:

au BufEnter *
\if match( getline(1) , '^\#!') == 0 |
\ execute("let b:interpreter = getline(1)[2:]") |
\endif

fun! CallInterpreter()
    if exists("b:interpreter")
         exec ("!".b:interpreter." %")
    endif
endfun

map <F5> :call CallInterpreter()<CR>

Esto ejecuta cualquier archivo que tenga un shebang ( #!) en la primera línea. Utiliza el intérprete para ejecutar el archivo, por lo que no necesita tener permisos de ejecución.

* (la pantalla tiene algunas otras características muy buenas como copiar y pegar desde la salida, monitorear las ventanas ocultas en busca de actividad / no actividad, poder usar la sesión desde diferentes terminales al mismo tiempo, cerrar sesión dejando todos los programas corriendo - es una herramienta poderosa).

0x89
fuente
Este autocomando no funcionó para mí hasta que puse la primera línea (con el \ if) en la misma línea que el au BufEnter pero eliminé el \
Jason Axelson el
Es posible que Vim no admita un shell de forma nativa, pero solo quería mencionar este interesante complemento de shell: vim.org/scripts/script.php?script_id=2771
Sr. Mikkél
:map ;e :w<cr>:!python %<cr>quiere hacer eco de cosas en mi búfer vim para "confirmar" (?) que se ejecutó el comando. ¿Cómo consigo que simplemente ejecute el comando en silencio? :map <silent> ...no parece funcionar
Johnny Utahh
5

La forma menos detallada (que requiere que su script sea ejecutable) es probablemente:

 :!%
TNT
fuente
Para que esto funcione, tuve que modificarlo para :!./%que el script se encuentre en el directorio actual.
Paul Wintz
Y no soy un experto, pero parece que !le dice a vim que ejecute lo que sigue como un comando bash, para que pueda hacerlo !echo "Hello". El %se expande para ser el nombre del archivo actual.
Paul Wintz
2

Puede que no sea pantalla dividida, pero esto funciona bastante bien para mí:

map ;e :w<CR>:exe ":!python " . getreg("%") . "" <CR>

Esto se asigna ;epara escribir el archivo actual y ejecutarlo usando python (se supone que python está en su PATH).

Jack M.
fuente
2

El complemento Bexec vim hace exactamente lo que quieres. Atajos de teclado incluidos.

jmetz
fuente
0

Coloque este pequeño fragmento en su .vimrc para ejecutar el archivo actual con una sola tecla (como F5) y mostrar el resultado en un nuevo búfer de panel dividido.

:! está bien, pero debe cambiar a su terminal para ver el resultado.

Si bien puedes hacer eso ctrl-zy traer vim de regreso fg, aún significa que debes cambiar mucho de contexto.

La forma en que funciona este fragmento es primero adivinando el ejecutable basado en el archivo filetypey luego ejecutándolo con el archivo actual como argumento.

A continuación, un útil método de utilidad toma la salida y la descarga en un nuevo búfer.

No es perfecto, pero sí muy rápido para flujos de trabajo comunes.

Aquí está el fragmento copiado a continuación:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""" RUN CURRENT FILE """""""""""""""""""""""""""""
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Execute current file
nnoremap <F5> :call ExecuteFile()<CR>

" Will attempt to execute the current file based on the `&filetype`
" You need to manually map the filetypes you use most commonly to the
" correct shell command.
function! ExecuteFile()
  let filetype_to_command = {
  \   'javascript': 'node',
  \   'coffee': 'coffee',
  \   'python': 'python',
  \   'html': 'open',
  \   'sh': 'sh'
  \ }
  let cmd = get(filetype_to_command, &filetype, &filetype)
  call RunShellCommand(cmd." %s")
endfunction

" Enter any shell command and have the output appear in a new buffer
" For example, to word count the current file:
"
"   :Shell wc %s
"
" Thanks to: http://vim.wikia.com/wiki/Display_output_of_shell_commands_in_new_window
command! -complete=shellcmd -nargs=+ Shell call RunShellCommand(<q-args>)
function! RunShellCommand(cmdline)
  echo a:cmdline
  let expanded_cmdline = a:cmdline
  for part in split(a:cmdline, ' ')
     if part[0] =~ '\v[%#<]'
        let expanded_part = fnameescape(expand(part))
        let expanded_cmdline = substitute(expanded_cmdline, part, expanded_part, '')
     endif
  endfor
  botright new
  setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
  call setline(1, 'You entered:    ' . a:cmdline)
  call setline(2, 'Expanded Form:  ' .expanded_cmdline)
  call setline(3,substitute(getline(2),'.','=','g'))
  execute '$read !'. expanded_cmdline
  setlocal nomodifiable
  1
endfunction
Evan
fuente
-1

No sé sobre vim directamente, pero generalmente puede dividir la pantalla de esta manera con la screenutilidad. ctrl+ a, S(tenga en cuenta que es una S mayúscula) dividirá la pantalla y puede cambiar entre los dos con ctrl+ a, tab(si la ventana está vacía, use ctrl+ a, npara moverse a otra ventana abierta o ctrl+ a, cpara crear una nueva) .

También puede dividir la pantalla en más de dos y cambiar el tamaño de las divisiones con ctrl-a,: redimensionar. Utilizo la pantalla de esta manera a menudo, y aunque no es la solución de una sola clave que pides, puede ser muy conveniente.

David Spillett
fuente
¿Estás seguro de que está funcionando para Vim? No parece responder en mi vim (uso el comando slpit para dividir entre archivos).
Adam Matan
Estos son comandos de pantalla GNU, no vim.
innaM
Sí. Estoy hablando de ejecutar vim dentro de la pantalla.
David Spillett
una división vim es algo que ocurre dentro del ámbito de la ventana vim (o el terminal en el que se está ejecutando).
hasen