Як я можу видалити поточний файл у vim?


Відповіді:


102

Використовувати зовнішній інструмент, такий як rm (1), добре, але у Vim також є своя delete()функція видалення файлів. Це має перевагу в тому, що є портативним.

:call delete(expand('%'))

Альтернативним способом вираження цього є :call delete(@%)використання %регістра (поточного файлу) (підказка @accolade).

Щоб повністю очистити поточний буфер, як подання файлу на диску, так і буфер Vim, додайте :bdelete:

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

Можливо, вам захочеться зіставити це відповідно до ваших уподобань.


7
Дякую! Наступна карта в .vimrc , здається, працює: nnoremap rm :call delete(expand('%')) \| bdelete!<CR>. Ви можете додати у свою відповідь.
фотанус

13
Таке відображення не є ідеальним. Ми не хочемо порушувати rкоманду! Краще додайте префікс до вашого відображення <Leader>....
glts

2
Я зіставив його на Ctrl + Del, використовуючи, nnoremap <C-Del> :call delete(expand('%'))<CR>але я не закриваю буфер на випадок, якщо це трапиться випадково; тоді у вас ще є шанс врятувати його.
Євген Сергєєв

3
:call delete(@%)|q!← Короткий варіант (якщо ви не хочете його наносити на карту). (Буфер залишається :lsі може бути відновлений :bтаким чином; він зберігає ім'я файлу та параметри буфера, але не вміст файлу.)
Аарон Тома,

2
@accolade, я як ваш трюк, але вам потрібно буде використовувати :call delete(@%)|bd!і використовувати :ls!з :bоживати.
Барт Луверс,

87

Погляньте на Видалення файлів за допомогою команди Vim . Розділ коментарів повинен містити те, що ви шукаєте:

В основному Rm видалить поточний файл; RM видалить поточний файл і вийде з буфера (без збереження) за один раз.

Крім того, ви можете просто виконати команду оболонки, щоб видалити поточний файл:

:!rm %

1
Це щось таке просте, що я майже не вірю, що мені потрібно створити сценарій для цього. Дякую.
фотанус

3
видаляючи за допомогою !rm %, чи є спосіб уникнути попередження, коли vim повертається до буфера?
фотанус

1
З деякими спеціальними символами в назві файлу ця команда не буде працювати, наприклад, якщо ім'я файлу 20130711-contacts # 285.vcf, у якому є простір, то буде сказано 'rm: не вдається видалити `20130711-contacts': Немає такого файлу або каталог '
Саїд,

4
@ Saeed144, в разі прогалин в імені файлу (або інші символи , які ви не хочете інтерпретувати на рівні оболонки), ви хочете , щоб оточити ім'я файлу ( %) в лапки: !rm "%".
Девід Кейн,

8
НЕБЕЗПЕКА ДАНИХ ПОПЕРЕДЖЕННЯ! За допомогою просто %(шлях до файлу (" ім'я файлу " у термінології vim), який спочатку викликався, потенційно відносний, наприклад, лише ім'я файлу) замість %:p(абсолютний шлях до файлу), ви ризикуєте видалити файл з тим самим іменем в іншому каталозі, якщо ви забули про те, що ви :cdтам. Тому я настійно рекомендую використовувати %:pзамість того, %якщо ви все одно накладете на нього карту.
Aaron Thoma

25

Іноді плагін може бути привабливим рішенням навіть для простої проблеми. У цьому випадку нам пощастило, оскільки є eunuch.vim Всемогутнього Тіма Попа.

Своїми словами eunuch.vim надає

Vim цукор для команд оболонки UNIX, які це найбільше потребують. Видаліть або перейменуйте буфер і базовий файл одночасно. Завантажте a findабо a locateу список швидких виправлень. І так далі.

Ідеально Він має те, що нам потрібно, а також деякі додаткові інструменти, якщо ми працюємо в системі UNIX.

Команда, яку ви шукаєте, є

:Remove!

Знову ж таки, перемапуйте його, якщо вам це потрібно багато, наприклад :nnoremap <Leader>rm :Remove!<CR>.


Я шукав спосіб обійтися без плагінів, тому прийму іншу вашу відповідь. Плагін виглядає добре :-)
fotanus

Цей плагін дуже зручно , якщо вам потрібно ВІМ шляху mv, mkdir, findі т.д. дуже рекомендую.
Ехтеш Чоудхурі

4

Мені подобається можливість видаляти файли з внутрішнього середовища vim, але я також параноїк щодо випадкового видалення важливої ​​роботи, яка з тих чи інших причин ще не перебуває під контролем версій. Я вважаю корисним поєднати попередню інформацію з @glts та @accolade з цією відповіддю про те, як використовувати confirmкоманду для запрошення перед виходом з vim.

Склавши їх разом, я додав функцію до моєї ~/.vimrc, яка підказує перед видаленням файлу та закриттям буфера, і відобразив його на комбінацію клавіш:

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

Якщо ви на один натискання клавіші менш параноїк, ніж я, ви можете додати <CR>до першого рядка

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

і натисніть клавішу повернення лише один раз.


1
Я настійно рекомендую використовувати expand('%:p')замість того, @%щоб все одно це робити. (Хоча мені лестить, що ви включили мій підказку :) перевага стислості незначна у сценарії. Що ще важливіше %:p:) розширить ім'я файлу до повного абсолютного шляху (яким він може бути, а може і не бути). Просто %ви ризикуєте видалити файл з однойменною назвою в іншому каталозі, якщо ви забули про те, що ви :cdтам були.
Аарон Тома

1
Дякуємо, що виклали це! Відповідно оновив свою відповідь.
joelostblom

0

Ви можете зробити це у два етапи:

  1. зберегти як новий файл

    : w newfilename

  2. видалити старий файл

    ! rm oldfilename


0

Це може бути непопулярною думкою, але ваш провідник файлових дерев (Netrw / NerdTree) стане найпростішим та найбезпечнішим способом видалення файлу. Навіть якщо OP не використовує NerdTree, вбудований плагін Netrw буде працювати так само добре.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.