¿Cómo puedo eliminar el archivo actual en vim?

85

¿Cómo puedo eliminar del disco el archivo abierto actual desde vim? Sería bueno cerrar también el búfer.

Veo que puedes usar NERDTree para eso , pero yo no uso este complemento.

fotanus
fuente

Respuestas:

102

Usar una herramienta externa como rm (1) está bien, pero Vim también tiene su propia delete()función para eliminar archivos. Esto tiene la ventaja de ser portátil.

:call delete(expand('%'))

Una forma alternativa de expresar esto es :call delete(@%), que usa el %registro (archivo actual) (sugerencia de @accolade).

Para purgar por completo el búfer actual, tanto la representación del archivo en el disco como el búfer Vim, agregue :bdelete:

:call delete(expand('%')) | bdelete!

Probablemente desee mapear esto de acuerdo con sus preferencias.

glts
fuente
7
¡Gracias! En el siguiente mapa en el .vimrc parece funcionar: nnoremap rm :call delete(expand('%')) \| bdelete!<CR>. Es posible que desee agregar su respuesta.
fotanus
13
Ese mapeo no es ideal. ¡No queremos romper el rcomando! Mejor prefija su mapeo con <Leader>....
glts
2
Lo asigné a Ctrl + Del usando nnoremap <C-Del> :call delete(expand('%'))<CR>pero no cierro el búfer en caso de que ocurra por accidente; entonces todavía tienes la oportunidad de guardarlo.
Evgeni Sergeev
3
:call delete(@%)|q!← Variante corta (si no quieres mapearla). (El búfer permanece :lsy se puede reactivar de :besta manera; conserva el nombre del archivo y las opciones del búfer, pero no el contenido del archivo).
Aaron Thoma
2
@accolade, me gusta tu truco, pero necesitarías usar :call delete(@%)|bd!y usar :ls!con :bpara revivir.
Bart Louwers
87

Eche un vistazo a Eliminar archivos con un comando Vim . La sección Comentarios debe tener lo que está buscando:

Básicamente, Rm eliminará el archivo actual; RM eliminará el archivo actual y saldrá del búfer (sin guardar) de una vez.

Alternativamente, puede simplemente emitir un comando de shell para eliminar el archivo actual:

:!rm %
David Caín
fuente
1
Es algo tan simple que casi no puedo creer que necesite crear un script para esto. Gracias.
fotanus
3
eliminando con !rm %, ¿hay alguna manera de evitar la advertencia cuando vim regrese al búfer?
fotanus
1
Con algunos caracteres especiales en el nombre del archivo, este comando no funcionaría, como si el nombre del archivo fuera 20130711-contactos # 285.vcf, que tiene espacio, diría 'rm: no se puede eliminar' 20130711-contactos ': No existe tal archivo o directorio '
Saeed
4
@ saeed144, en el caso de espacios en un nombre de archivo (u otros caracteres que no desea interpretado a nivel cáscara), tendrá que rodear el nombre de archivo ( %) con citas: !rm "%".
David Cain
8
ADVERTENCIA DE PELIGRO DE DATOS! Con solo %(filepath (" filename " en terminología vim) como se invocó originalmente, potencialmente relativo, por ejemplo, solo el nombre del archivo) en lugar de %:p(filepath absoluto), corre un pequeño riesgo de eliminar un archivo con el mismo nombre en otro directorio en su lugar, si te has olvidado de que :cdestuviste allí. Por lo tanto, recomiendo usarlo en %:plugar de %si lo asigna de todos modos.
Aaron Thoma
25

A veces, un complemento puede ser una solución atractiva incluso para un problema simple. En este caso tenemos suerte ya que hay eunuch.vim del todopoderoso Tim Pope.

En sus propias palabras, eunuch.vim proporciona

Vim sugar para los comandos de shell de UNIX que más lo necesitan. Elimine o cambie el nombre de un búfer y el archivo subyacente al mismo tiempo. Cargue a findo a locateen la lista de arreglos rápidos. Y así.

Perfecto. Tiene lo que necesitamos, además de algunas herramientas adicionales si estamos en un sistema UNIX.

El comando que busca es

:Remove!

Nuevamente, vuelva a asignarlo si lo necesita mucho, por ejemplo :nnoremap <Leader>rm :Remove!<CR>.

glts
fuente
Estaba buscando una manera de prescindir de los complementos, así que aceptaré tu otra respuesta. El complemento se ve bien :-)
fotanus
Este plugin es muy conveniente si necesita formas de vim mv, mkdir, find, etc. muy recomendable.
Ehtesh Choudhury
4

Me gusta poder eliminar archivos desde dentro de vim, pero también estoy paranoico acerca de eliminar accidentalmente un trabajo importante que, por una razón u otra, aún no está bajo el control de versiones. Encuentro útil combinar la información anterior de @glts y @accolade con esta respuesta sobre cómo usar el confirmcomando para solicitar antes de salir de vim.

Al juntarlos, agregué una función a my ~/.vimrc, que solicita antes de eliminar el archivo y cerrar el búfer, y lo asigné a una combinación de teclas:

nnoremap <Leader>d. :call DeleteFileAndCloseBuffer()

fun! DeleteFileAndCloseBuffer()
  let choice = confirm("Delete file and close buffer?", "&Do it!\n&Nonono", 1)
  if choice == 1 | call delete(expand('%:p')) | q! | endif
endfun

Si pulsa una tecla menos que yo, puede agregarlo <CR>a la primera línea

nnoremap <Leader>d. :call DeleteFileAndCloseBuffer()<CR>

y solo tienes que pulsar volver una vez.

joelostblom
fuente
1
Recomiendo encarecidamente usarlo en expand('%:p')lugar de @%cuando lo escriba de todos modos. (Aunque me halaga que hayas incorporado mi pista :) el beneficio de la brevedad es marginal en un guión. Más importante %:p:) expandirá el nombre del archivo a una ruta absoluta completa (que puede que ya sea o no). Con solo %corre un pequeño riesgo de eliminar un archivo con el mismo nombre en otro directorio en su lugar, si se ha olvidado de que está :cdallí.
Aaron Thoma
1
¡Gracias por publicar eso! Actualicé mi respuesta en consecuencia.
joelostblom
0

Puedes hacerlo con dos pasos:

  1. guardar como un archivo nuevo

    : w nuevo nombre de archivo

  2. eliminar el archivo antiguo

    ! rm nombre de archivo antiguo

Camino del guardabosques
fuente
0

Esta puede ser una opinión impopular, pero su explorador de árbol de archivos (Netrw / NerdTree) será la forma más sencilla y segura de eliminar un archivo. Incluso si OP no usa NerdTree, el complemento integrado Netrw funcionará igual de bien.

Alex Mckay
fuente