2012-05-01 14 views

Respuesta

6

intentar el siguiente comando:

function s:MKDir(...) 
    if   !a:0 
      \|| stridx('`+', a:1[0])!=-1 
      \|| a:1=~#'\v\\@<![ *?[%#]' 
      \|| isdirectory(a:1) 
      \|| filereadable(a:1) 
      \|| isdirectory(fnamemodify(a:1, ':p:h')) 
     return 
    endif 
    return mkdir(fnamemodify(a:1, ':p:h'), 'p') 
endfunction 
command -bang -bar -nargs=? -complete=file E :call s:MKDir(<f-args>) | e<bang> <args> 

Este comando está destinado a ser un reemplazo para una función de :e.

condiciones en las que mkdir no se ejecuta (en orden):

  1. comando se ejecuta sin argumentos
  2. comando se ejecuta con los generadores `generate filename` o `=generate_filename()` invertidas nombre del archivo o con +command/++opt interruptores.
  3. El comando contiene más de un argumento o tiene caracteres especiales no guardados.
  4. Argumento es un directorio.
  5. Argumento es un archivo existente.
  6. Argumento es un archivo en un directorio existente.

En los últimos tres casos no se debe hacer nada, segundo y tercer casos no son imposibles de manejar, simplemente más complicado.

Lo anterior está listo para añadir un cnoreabbrev:

cnoreabbrev <expr> e ((getcmdtype() is# ':' && getcmdline() is# 'e')?'E':'e') 

-complete=file botín cosas: que añadir no sólo la finalización, sino también los argumentos de procesamiento (por lo tanto la comprobación de ` expansión y presencia caracteres especiales no lo hace tiene sentido) y prohíbe tener múltiples "nombres de archivo" (por lo tanto no hay ++ opt).

-bar hace que no pueda usar `="String"` porque " ahora comienza un comentario. Sin -bar no es una emulación :e porque no puede hacer E file | another command.

Otra versión:

function s:MKDir(...) 
    if   !a:0 
      \|| isdirectory(a:1) 
      \|| filereadable(a:1) 
      \|| isdirectory(fnamemodify(a:1, ':p:h')) 
     return 
    endif 
    return mkdir(fnamemodify(a:1, ':p:h'), 'p') 
endfunction 
command -bang -bar -nargs=? -complete=file E :call s:MKDir(<f-args>) | e<bang> <args> 
+0

Ojalá hubiera un complemento adecuado para esto. –

29
:!mkdir -p spec/models 
:w spec/models/blog_spec.rb 
+4

Eso es dos pasos ... – notJim

17

Si te encuentras con esto a menudo, puede valer la pena agregar un comando para ello.

command -nargs=1 E execute('silent! !mkdir -p "$(dirname "<args>")"') <Bar> e <args> 

Si se agrega esta línea en su archivo .vimrc, sólo tiene que utilizar de esta manera:

:E spec/models/blog_spec.rb 

Editar Esto sólo funcionará en Linux/Mac, no de Windows.

+3

Este es, en mi opinión, mejor que la respuesta aceptada. Esto funcionó muy bien para mí. ¡Muchas gracias! – nickcoxdotme

+4

Una cosa es que esta respuesta no tiene la terminación de pestañas para las rutas. En el ejemplo anterior, si el modelo 'spec' existía pero los' modelos' no, tendrías que escribir 'spec' en lugar de' sp ' – graysonwright

2

por lo general encuentran que los directorios padre no existen ya sólo después de intentar guardar el archivo.

This code le pedirá que cree el directorio con :w, o simplemente hacerlo con :w!:

augroup vimrc-auto-mkdir 
    autocmd! 
    autocmd BufWritePre * call s:auto_mkdir(expand('<afile>:p:h'), v:cmdbang) 
    function! s:auto_mkdir(dir, force) 
    if !isdirectory(a:dir) 
      \ && (a:force 
      \  || input("'" . a:dir . "' does not exist. Create? [y/N]") =~? '^y\%[es]$') 
     call mkdir(iconv(a:dir, &encoding, &termencoding), 'p') 
    endif 
    endfunction 
augroup END 
+0

¡Esto es exactamente lo que estaba buscando! muchas veces, no quiero pensar si la ruta existe antes de editar un archivo. Solo me preocupo cuando estoy listo para guardar el archivo. – verboze

Cuestiones relacionadas