Jak mogę usunąć bieżący plik w vimie?

85

Jak mogę usunąć z dysku aktualnie otwarty plik z poziomu vima? Byłoby miło również zamknąć bufor.

Widzę, że możesz do tego użyć NERDTree , ale nie używam tej wtyczki.

fotanus
źródło

Odpowiedzi:

102

Używanie zewnętrznego narzędzia, takiego jak rm (1) jest w porządku, ale Vim ma również własną delete()funkcję usuwania plików. Ma to tę zaletę, że jest przenośny.

:call delete(expand('%'))

Alternatywnym sposobem wyrażenia tego jest :call delete(@%)użycie %rejestru (bieżącego pliku) (wskazówka @accolade).

Aby całkowicie wyczyścić bieżący bufor, zarówno reprezentacja pliku na dysku, jak i bufor Vima, dodaj :bdelete:

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

Prawdopodobnie będziesz chciał mapować to zgodnie ze swoimi preferencjami.

połysk
źródło
7
Dzięki! Poniższa mapa w .vimrc wydaje się działać: nnoremap rm :call delete(expand('%')) \| bdelete!<CR>. Możesz dodać swoją odpowiedź.
fotanus
13
To mapowanie nie jest idealne. Nie chcemy łamać rpolecenia! Lepiej prefiksuj swoje mapowanie <Leader>....
glts
2
Zmapowałem to na Ctrl + Del za pomocą, nnoremap <C-Del> :call delete(expand('%'))<CR>ale nie zamykam bufora na wypadek, gdyby stało się to przez przypadek; wtedy nadal masz szansę go zapisać.
Evgeni Sergeev
3
:call delete(@%)|q!← Krótki wariant (jeśli nie chcesz go mapować). (Bufor pozostaje :lsi można go przywrócić w :bten sposób; zachowuje nazwę pliku i opcje bufora, ale nie zawartość pliku.)
Aaron Thoma
2
@accolade, podoba mi się twoja sztuczka, ale musisz go używać :call delete(@%)|bd!i używać :ls!z, :baby ożywić.
Bart Louwers,
87

Spójrz na Usuń pliki za pomocą polecenia Vima . Sekcja Komentarze powinna zawierać to, czego szukasz:

Zasadniczo Rm usunie bieżący plik; RM usunie bieżący plik i wyjdzie z bufora (bez zapisywania) za jednym razem.

Alternatywnie możesz po prostu wydać polecenie powłoki, aby usunąć bieżący plik:

:!rm %
David Cain
źródło
1
To jest coś tak prostego, że prawie nie mogę uwierzyć, że muszę stworzyć do tego skrypt. Dzięki.
fotanus
3
usuwanie za pomocą !rm %, czy jest sposób na uniknięcie ostrzeżenia, gdy vim wróci do bufora?
fotanus
1
Z niektórymi znakami specjalnymi w nazwie pliku to polecenie nie zadziała, na przykład jeśli nazwa pliku to 20130711-contact # 285.vcf, która zawiera spację, będzie brzmiała: „rm: nie można usunąć„ 20130711-kontakty ”: Nie ma takiego pliku katalog '
Saeed
4
@ saeed144, w przypadku pomieszczeń w pliku (lub innych znaków, które nie chcą dokonywać na poziomie shell), będziemy chcieli, aby otoczyć nazwę pliku ( %) z cytatami: !rm "%".
David Cain,
8
OSTRZEŻENIE O ZAGROŻENIU DANYCH! Z just %(filepath (" filename " w terminologii vima) jak pierwotnie wywołane, potencjalnie względne, np. Tylko nazwa pliku) zamiast %:p(bezwzględna ścieżka pliku), ryzykujesz usunięcie pliku o tej samej nazwie w innym katalogu, jeśli zapomniałeś, że :cdtam się wydałeś. Dlatego zdecydowanie zalecam używanie %:pzamiast, %jeśli i tak je mapujesz.
Aaron Thoma,
25

Czasami wtyczka może być atrakcyjnym rozwiązaniem nawet w przypadku prostego problemu. W tym przypadku mamy szczęście, ponieważ istnieje eunuch.vim wszechmogącego Tima Pope'a.

Własnymi słowami eunuch.vim zapewnia

Vim sugar dla poleceń powłoki UNIX, które najbardziej tego potrzebują. Usuń lub zmień nazwę bufora i pliku źródłowego w tym samym czasie. Załaduj a findlub a locatedo listy quickfix. I tak dalej.

Idealny. Ma to, czego potrzebujemy, a także kilka dodatkowych narzędzi, jeśli pracujemy w systemie UNIX.

Polecenie, którego szukasz, to

:Remove!

Ponownie, przemapuj go, jeśli bardzo go potrzebujesz, np :nnoremap <Leader>rm :Remove!<CR>.

połysk
źródło
Szukałem sposobu na obejście się bez wtyczek, więc zaakceptuję Twoją drugą odpowiedź. Wtyczka wygląda dobrze :-)
fotanus
Wtyczka ta jest bardzo wygodne, jeśli trzeba vim sposoby mv, mkdir, find, itd. Bardzo polecam.
Ehtesh Choudhury
4

Lubię móc usuwać pliki z poziomu vima, ale mam też paranoję na punkcie przypadkowego usuwania ważnej pracy, która z jakiegoś powodu nie jest jeszcze pod kontrolą wersji. Uważam, że przydatne jest połączenie poprzednich informacji z @glts i @accolade z tą odpowiedzią, jak używać confirmpolecenia do wyświetlania monitu przed zamknięciem vima.

Składając je razem, dodałem do my funkcję ~/.vimrc, która wyświetla monity przed usunięciem pliku i zamknięciem bufora, i zamapowałem ją na kombinację klawiszy:

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

Jeśli jesteś o jedno naciśnięcie klawisza mniej paranoikiem niż ja, możesz dołączyć <CR>do pierwszej linii

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

i wystarczy raz nacisnąć klawisz powrotu.

joelostblom
źródło
1
Zdecydowanie zalecam używanie expand('%:p')zamiast @%skryptu i tak. (Chociaż pochlebia mi, że uwzględniłeś moją wskazówkę :), korzyść zwięzłości jest marginalna w scenariuszu. Co ważniejsze %:p:) rozszerzy nazwę pliku do pełnej ścieżki bezwzględnej (którą może już być, ale nie musi). Po prostu %ryzykujesz usunięcie pliku o tej samej nazwie w innym katalogu, jeśli zapomniałeś, że :cdtam edytujesz.
Aaron Thoma,
1
Dzięki za pionierstwo! Odpowiednio zaktualizowałem swoją odpowiedź.
joelostblom
0

Możesz to zrobić w dwóch krokach:

  1. zapisz jako nowy plik

    : w nowa nazwa pliku

  2. usuń stary plik

    ! rm stara nazwa pliku

Ranger Way
źródło
0

Może to być niepopularna opinia, ale eksplorator drzewa plików (Netrw / NerdTree) będzie najprostszym i najbezpieczniejszym sposobem na usunięcie pliku. Nawet jeśli OP nie używa NerdTree, wbudowana wtyczka Netrw będzie działać równie dobrze.

Alex Mckay
źródło