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):
- comando se ejecuta sin argumentos
- comando se ejecuta con los generadores
`generate filename`
o `=generate_filename()`
invertidas nombre del archivo o con +command
/++opt
interruptores.
- El comando contiene más de un argumento o tiene caracteres especiales no guardados.
- Argumento es un directorio.
- Argumento es un archivo existente.
- 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>
Ojalá hubiera un complemento adecuado para esto. –