2009-10-10 22 views
21

no me gusta la forma en estorba hasta mis carpetas con archivos de copia de seguridad vim, así que tengo la siguiente línea en mi archivo .vimrc:¿Cómo puedo crear una carpeta, si no existe, desde .vimrc?

set backupdir=~/.vim_backup 

Sin embargo, a veces esta carpeta no existe debido a las nuevas máquinas donde Estoy copiando mis archivos de usuario.

¿Cómo puedo crear esta carpeta automáticamente, si no existe, desde dentro .vimrc? ¿O hay alguna forma mejor de lidiar con esta situación?

Respuesta

25

Usted puede poner esto en su .vimrc:

silent !mkdir ~/.vim_backup > /dev/null 2>&1 

Este intentará crear el directorio ~/.vim_backup cada vez que inicia vim. Si ya existe, mkdir indicará un error, pero nunca lo verá.

+9

+1: Buena respuesta. Suponiendo Linux, también se puede hacer '! Mkdir -p ~/.vim_backup' como la opción' -p' se detendrá mkdir informar de un error en el primer lugar (además de hacer los directorios padre si es necesario). – DrAl

+10

¿Por qué haces '! Mkdir'? Hay una función vim incorporada 'mkdir()' que tiene el mismo propósito y es más portátil.Además, su código sin el entorno 'if' está haciendo una llamada al shell innecesaria que ralentiza el inicio. – ZyX

+0

@ZyX sí, entonces la pregunta es: ¿cómo se detecta si existe una carpeta? Sé que puede leer archivos(), ¿hay un equivalente para las carpetas? –

1

que quería una solución a este que funciona tanto en Linux como en Windows (con los binarios de Cygwin en el camino.) - mi config Vim se comparte entre los dos.

Un problema es que 'mkdir' está, creo, integrado en el shell de cmd en Windows, por lo que no puede anularse colocando el ejecutable Cygwin mkdir anteriormente en la ruta.

que resolvieron este invocando una nueva shell bash para realizar la acción: A partir de ahí, 'mkdir' significa siempre que sea ejecutable mkdir está en el camino:

!bash -c "mkdir -p ~/.vim-tmp" 

Sin embargo, esto tiene el problema de que. en Windows al menos, aparece una nueva ventana para el shell cmd que '!' invoca No quiero eso cada vez que empiezo vim. Luego descubrí el 'sistema' de la función vim, que invoca un nuevo shell cmd (el icono aparece en la barra de tareas de Windows) pero la ventana está minimizada. Por lo tanto:

call system("bash -c \"mkdir -p ~/.vim-tmp\"") 

Ugly pero funciona.

+0

Mira la respuesta @ xer0x, puedes verificar si el directorio existe y solo entonces llama al sistema, lo que hace que su solución sea fea pero lo más práctica posible en un host de ventana. –

8

me gusta mucho más las de una sola línea ya publicados. Sin embargo, pensé que me gustaría compartir lo que he estado usando:

function! EnsureDirExists (dir) 
    if !isdirectory(a:dir) 
    if exists("*mkdir") 
     call mkdir(a:dir,'p') 
     echo "Created directory: " . a:dir 
    else 
     echo "Please create directory: " . a:dir 
    endif 
    endif 
endfunction 

call EnsureDirExists($HOME . '/.vim_backup') 
+0

El mensaje "Creado" podría ser falso si 'mkdir' arroja un error. –

0

tengo una orden en mi vimrc que me permite hacer un directorio que corresponde a la memoria intermedia actualmente situada en primer plano:

nmap <silent> ,md :!mkdir -p %:p:h<CR>

Esto puede ser usado para crear un directorio en cualquier lugar que se preocupa de poner uno de forma local o remota a través de netrw si usted los permisos para hacerlo.

+1

Oye. ¿Qué significa exactamente 'correspondiente a'? No 'nombrado igual que', eso no tiene mucho sentido para mí. ¿Y qué? –

59

creo que esto independiente del sistema operativo:

if !isdirectory("/my/directory") 
    call mkdir("/my/directory", "p") 
endif 
+8

pero en ese caso tiene que usar $ HOME en lugar de ~ 'silent! Mkdir ~/.vim_backup>/dev/null 2 > & 1' se convertirá en 'llamada silenciosa mkdir ($ HOME. '/. Vim_backup', 'p')' – m42e

+0

... ¿por qué no ES ESTA la respuesta aceptada ??? –

+0

... porque solo @fragsworth puede designar una respuesta como "aceptada". Pero nosotros, como comunidad, votamos por la respuesta que aceptamos. –

1

usted podría utilizar la función mkdir() Vim. Puede crear directorios intermedios y establecer los permisos adecuados en el directorio también:

if !isdirectory($HOME . "/.vim/backup") 
    call mkdir($HOME . "/.vim/backup", "p", 0700) 
endif 
+0

Simplemente curioso ... Intenté esta solución, pero '~/.vim/somepath /' no funciona, ya que funciona la ruta completa en lugar del '~'. De todos modos, una vez que pensé eso, funcionó como un encanto. –

Cuestiones relacionadas