2009-03-02 25 views
32

Hago muchas cosas de simulación rápida de Python y estoy constantemente guardando (: w) y luego ejecutando (: !!). Me pregunto si existe alguna forma de combinar estas acciones. Tal vez un comando de "guardar y ejecutar".VIM: ¿Guardar y ejecutar al mismo tiempo?

Gracias por su ayuda.

+0

Podría echar un vistazo a mi respuesta? Creo que responde correctamente tu pregunta. –

Respuesta

25

Opción 1:

escribir una función similar a este y lo coloca en la configuración de inicio:

function myex() 
    execute ':w' 
    execute ':!!' 
endfunction 

Incluso se puede asignar una combinación de teclas para it-- vistazo a la documentación.


Opción 2 (mejor):

vistazo a la documentación para la reasignación de las pulsaciones de teclado - usted puede ser capaz de lograr a través de un sencillo de reasignación de clave. El siguiente funciona, pero tiene "filename.py" codificado. Tal vez puedas profundizar y descubrir cómo reemplazarlo con el archivo actual.

:map <F2> <Esc>:w<CR>:!filename.py<CR> 

Después de mapear eso, puede presionar F2 en el modo de comando.

imap, vmap, etc ... son asignaciones en diferentes modos. Lo anterior solo se aplica al modo de comando. Lo siguiente debería funcionar en el modo de inserción también:

:imap <F2> <Esc>:w<CR>:!filename.py<CR>a 

La sección 40.1 del manual de VIM es muy útil.

+1

Para el nombre del archivo, vea las opciones para expandir. Creo que expand ("%: p") te dará el nombre del archivo. –

+7

Acabado probado. Funciona genial. Agregue "map : w :!%: P " a su vimrc (sin las comillas). – bernie

5

La combinación de comandos parece funcionar a través del carácter |, por lo que tal vez algo como aliasing :w|!your-command-here a una combinación de teclas distinta?

5

Aquí van:

:nmap <F1> :w<cr>:!%<cr>

Guardar & plazo (que tiene que estar en el modo n, aunque - sólo tiene que añadir esc y una para i modo)

+0

para las secuencias de comandos python con x bit establecido y '#!/Bin/bash/env python' como la primera línea,' map : w :! ./% 'en $ HOME/.vimrc funciona bien. (mapa o nmap, F1 u otros). – lllluuukke

-12
  1. considerar el cambio a OCIOSO. F5 hace todo.

  2. Considere cambiar a Komodo. Puede definir un comando para que F5 haga todo.

1

que tiene lo siguiente desde la punta vim wiki:

command! -complete=file -nargs=+ shell call s:runshellcommand(<q-args>) 
function! s:runshellcommand(cmdline) 
    botright vnew 
    setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap 
    call setline(1,a:cmdline) 
    call setline(2,substitute(a:cmdline,'.','=','g')) 
    execute 'silent $read !'.escape(a:cmdline,'%#') 
    setlocal nomodifiable 
    1 
endfunction 

pero cambió de nuevo a Vnuevo en la tercera línea, a continuación, para el pitón Tengo el siguiente

map <F9> :w:Shell python %<cr><c-w> 

golpear F9 guarda, ejecuta y descarga la salida en un nuevo búfer de raspado dividido verticalmente, para tirar/guardar fácilmente, etc ... también golpea cw, así que solo tengo que presionar h/c para cerrarlo/volver a mi código.

11

Utilice la opción autowrite:

:set autowrite 

escribir el contenido del archivo, si se ha modificado, en cada uno: al lado,: rebobinar: pasado, en primer lugar,: anterior,: parada ,: suspender,: etiqueta, :!, haga, CTRL] y CTRL-^comando [...]

49

bien, la forma más simple de lo que estás buscando es el comando tubería. Le permite ejecutar múltiples comandos cmdline en la misma línea. En su caso, los dos comandos son `` `` `` y `` ejecute el archivo '' actual! %: p`. Si tiene un comando específico que ejecuta para su archivo actual, se convierte en el segundo comando, p. `! python%: p`. Por lo tanto, la respuesta más simple que le pregunta es:

:w | ! %:p 
^^^ 
| | |--Execute current file 
| |--Chain two commands 
|--Save current file 

Una última cosa a tener en cuenta es que no todos los comandos se pueden encadenar. De acuerdo con la Vim docs, ciertos comandos aceptan un tubo como un argumento, y por lo tanto rompen la cadena ...

+0

Todo en un comando. Esta es la respuesta que buscaría, no el guión o el mapeo. No estaba al tanto del '|' que se usa para encadenar comandos. ¡Gracias! – dwerner

4

Otra posibilidad:

au BufWriteCmd *.py write | !! 

Aunque esto run cada vez que guarde, que podría no ser lo usted quiere.

0

Intenta hacerlo dentro del Bash.

En caso de un archivo llamado C t.c, esto es muy conveniente:

vi t.c && cc t.c -o t && ./t 

los símbolos y (&&) asegurarse de que un mensaje de error rompe la cadena de mando.

de Python para esto podría ser aún más fácil:

vi t.py && python t.py 
2

Esto es lo que he puesto en mi .vimrc y funciona como un encanto

nnoremap <leader>r :w<CR>:!!<CR> 

Por supuesto que necesita para ejecutar su comando shell una vez antes esto para que sepa qué comando ejecutar.

Ex:

:!node ./test.js 
2

En vim, usted podría simplemente redirigir cualquier rango de su búfer a un comando externo (ya se trate de fiesta, pitón, o es el propietario script en Python).

# redirect whole buffer to python 
:%w !python 

Suponga que su búfer contiene dos líneas como abajo,

import numpy as np 
print np.arange(12).reshape(3,4) 

continuación :%w !python que se ejecutará, ya sea ahorrar o no. e imprimir algo así como más adelante en su terminal ,

[[ 0 1 2 3] 
[ 4 5 6 7] 
[ 8 9 10 11]] 

Por supuesto, usted podría hacer algo persistente, por ejemplo, algunos mapas de teclado.

nnoremap <F8> :.w !python<CR> 
vnoremap <F8> :w !python<CR> 

first one run línea actual, segunda ejecución visual selection, a través de python intérprete.

#!! be careful, in vim ':w!python' and ':.w !python' are very different, the 
first write (create or overwrite) a file named 'python' with contents of 
current buffer, the second redirect the selected cmdline range (here dot ., 
which mean current line) to external command (here 'python'). 

para la gama línea_de_órdenes, ver

:h cmdline-ranges 

no por debajo de uno, que en relación con mando normal, no cmdline uno.

:h command-range 

inspirado por https://stackoverflow.com/a/19883963/3625404

+0

En realidad, esta respuesta es más IDE por igual respuesta. Los IDEs modernos no guardarán el archivo antes de 'ejecutar'. Yo renuncié a este. – minion

Cuestiones relacionadas