Como posso deletar o arquivo atual no vim?

85

Como posso excluir do disco o arquivo aberto no vim? Seria bom também fechar o buffer.

Vejo que você pode usar o NERDTree para isso , mas não uso esse plugin.

fotanus
fonte

Respostas:

102

Usar uma ferramenta externa como rm (1) é bom, mas o Vim também tem sua própria delete()função para excluir arquivos. Tem a vantagem de ser portátil.

:call delete(expand('%'))

Uma forma alternativa de expressar isso é :call delete(@%), usando o %registrador (arquivo atual) (dica de @accolade).

Para limpar completamente o buffer atual, a representação do arquivo no disco e o buffer do Vim, anexe :bdelete:

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

Você provavelmente vai querer mapear isso de acordo com suas preferências.

glts
fonte
7
Obrigado! O mapa a seguir na Vimrc parece funcionar: nnoremap rm :call delete(expand('%')) \| bdelete!<CR>. Você pode querer adicionar em sua resposta.
fotanus de
13
Esse mapeamento não é ideal. Não queremos quebrar o rcomando! Melhor prefixar seu mapeamento com <Leader>....
glts de
2
Mapeei para Ctrl + Del usando, nnoremap <C-Del> :call delete(expand('%'))<CR>mas não fecho o buffer para o caso de acontecer por acidente; então você ainda tem a chance de salvá-lo.
Evgeni Sergeev
3
:call delete(@%)|q!← Variante curta (se você não quiser mapeá-la). (O buffer permanece :lse pode ser revivido :bdesta forma; ele retém o nome do arquivo e as opções do buffer, mas não o conteúdo do arquivo.)
Aaron Thoma
2
@accolade, eu como o seu truque, mas você precisa usar :call delete(@%)|bd!e uso :ls!com :ba reviver.
Bart Louwers,
88

Dê uma olhada em Excluir arquivos com um comando do Vim . A seção de comentários deve ter o que você está procurando:

Basicamente, Rm irá deletar o arquivo atual; RM excluirá o arquivo atual e sairá do buffer (sem salvar) de uma vez.

Como alternativa, você pode apenas emitir um comando shell para remover o arquivo atual:

:!rm %
David Cain
fonte
1
É algo tão simples que quase não consigo acreditar que preciso criar um script para isso. Obrigado.
fotanus de
3
excluindo com !rm %, há uma maneira de evitar o aviso quando o vim voltar ao buffer?
fotanus de
1
Com alguns caracteres especiais no nome do arquivo, este comando não funcionaria, como se o nome do arquivo fosse 20130711-contacts # 285.vcf, que tem espaço, diria 'rm: não é possível remover `20130711-contacts': Nenhum arquivo ou diretório '
Saeed
4
@ saeed144, no caso de espaços em um nome de arquivo (ou outros caracteres que você não quer interpretado no nível shell), você vai querer cercar o nome do arquivo ( %) com citações: !rm "%".
David Cain
8
AVISO DE RISCO DE DADOS! Com apenas %(caminho do arquivo (" nome do arquivo " na terminologia do vim) como originalmente invocado, potencialmente relativo, por exemplo, apenas o nome do arquivo) em vez de %:p(caminho do arquivo absoluto), você corre um pequeno risco de excluir um arquivo com o mesmo nome em outro diretório, se você esqueceu que você :cded lá. Portanto, eu recomendo fortemente usar em %:pvez de %se você mapear de qualquer maneira.
Aaron Thoma
25

Às vezes, um plug-in pode ser uma solução atraente, mesmo para um problema simples. Neste caso, temos sorte, pois há eunuch.vim do todo-poderoso Tim Pope.

Em suas próprias palavras, o eunuch.vim fornece

Açúcar do Vim para os comandos do shell UNIX que mais precisam dele. Exclua ou renomeie um buffer e o arquivo subjacente ao mesmo tempo. Carregue a findou a locatena lista de correção rápida. E assim por diante.

Perfeito. Ele tem o que precisamos, além de algumas ferramentas adicionais se estivermos em um sistema UNIX.

O comando que você está procurando é

:Remove!

Novamente, remapeie-o se precisar muito dele, por exemplo :nnoremap <Leader>rm :Remove!<CR>.

glts
fonte
Eu estava procurando uma maneira de fazer sem plug-ins, então vou aceitar sua outra resposta. O plugin parece bom :-)
fotanus
Este plugin é muito conveniente se você precisa maneiras vim de mv, mkdir, find, etc. recomendo.
Ehtesh Choudhury de
4

Gosto de poder deletar arquivos de dentro do vim, mas também sou paranóico sobre deletar acidentalmente um trabalho importante que, por uma razão ou outra, ainda não está sob controle de versão. Acho útil combinar as informações anteriores de @glts e @accolade com esta resposta sobre como usar o confirmcomando para solicitar antes de sair do vim.

Juntando tudo isso, adicionei uma função ao meu ~/.vimrc, que avisa antes de excluir o arquivo e fechar o buffer, e mapeei-o para uma combinação 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

Se você for um toque de tecla menos paranóico do que eu, poderá acrescentar <CR>à primeira linha

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

e só precisa pressionar Enter uma vez.

joelostblom
fonte
1
Eu recomendo fortemente usar em expand('%:p')vez de @%quando você fizer o script de qualquer maneira. (Embora eu esteja lisonjeado por você ter incorporado minha dica :) o benefício da brevidade é marginal em um script. Mais importante ainda %:p:) irá expandir o nome do arquivo para um caminho absoluto completo (que pode ou não ser). Com apenas %você corre o risco de deletar um arquivo com o mesmo nome em outro diretório, caso tenha esquecido que foi :cded lá.
Aaron Thoma
1
Obrigado por pensar nisso! Eu atualizei minha resposta de acordo.
joelostblom
0

Você pode fazer isso em duas etapas:

  1. salvar como um novo arquivo

    : w newfilename

  2. apague o arquivo antigo

    ! rm nome do arquivo antigo

Ranger Way
fonte
0

Esta pode ser uma opinião impopular, mas o seu explorador de árvore de arquivos (Netrw / NerdTree) será a maneira mais simples e segura de excluir um arquivo. Mesmo se o OP não estiver usando o NerdTree, o plugin embutido Netrw funcionará tão bem.

Alex Mckay
fonte