Як я можу видалити з диска поточний відкритий файл зсередини vim? Було б непогано також закрити буфер.
Я бачу, що ви можете використовувати NERDTree для цього , але я не використовую цей плагін.
Як я можу видалити з диска поточний відкритий файл зсередини vim? Було б непогано також закрити буфер.
Я бачу, що ви можете використовувати NERDTree для цього , але я не використовую цей плагін.
Відповіді:
Використовувати зовнішній інструмент, такий як rm (1), добре, але у Vim також є своя delete()функція видалення файлів. Це має перевагу в тому, що є портативним.
:call delete(expand('%'))
Альтернативним способом вираження цього є :call delete(@%)використання %регістра (поточного файлу) (підказка @accolade).
Щоб повністю очистити поточний буфер, як подання файлу на диску, так і буфер Vim, додайте :bdelete:
:call delete(expand('%')) | bdelete!
Можливо, вам захочеться зіставити це відповідно до ваших уподобань.
rкоманду! Краще додайте префікс до вашого відображення <Leader>....
nnoremap <C-Del> :call delete(expand('%'))<CR>але я не закриваю буфер на випадок, якщо це трапиться випадково; тоді у вас ще є шанс врятувати його.
:call delete(@%)|q!← Короткий варіант (якщо ви не хочете його наносити на карту). (Буфер залишається :lsі може бути відновлений :bтаким чином; він зберігає ім'я файлу та параметри буфера, але не вміст файлу.)
:call delete(@%)|bd!і використовувати :ls!з :bоживати.
Погляньте на Видалення файлів за допомогою команди Vim . Розділ коментарів повинен містити те, що ви шукаєте:
В основному Rm видалить поточний файл; RM видалить поточний файл і вийде з буфера (без збереження) за один раз.
Крім того, ви можете просто виконати команду оболонки, щоб видалити поточний файл:
:!rm %
!rm %, чи є спосіб уникнути попередження, коли vim повертається до буфера?
%) в лапки: !rm "%".
%(шлях до файлу (" ім'я файлу " у термінології vim), який спочатку викликався, потенційно відносний, наприклад, лише ім'я файлу) замість %:p(абсолютний шлях до файлу), ви ризикуєте видалити файл з тим самим іменем в іншому каталозі, якщо ви забули про те, що ви :cdтам. Тому я настійно рекомендую використовувати %:pзамість того, %якщо ви все одно накладете на нього карту.
Іноді плагін може бути привабливим рішенням навіть для простої проблеми. У цьому випадку нам пощастило, оскільки є eunuch.vim Всемогутнього Тіма Попа.
Своїми словами eunuch.vim надає
Vim цукор для команд оболонки UNIX, які це найбільше потребують. Видаліть або перейменуйте буфер і базовий файл одночасно. Завантажте a
findабо alocateу список швидких виправлень. І так далі.
Ідеально Він має те, що нам потрібно, а також деякі додаткові інструменти, якщо ми працюємо в системі UNIX.
Команда, яку ви шукаєте, є
:Remove!
Знову ж таки, перемапуйте його, якщо вам це потрібно багато, наприклад :nnoremap <Leader>rm :Remove!<CR>.
mv, mkdir, findі т.д. дуже рекомендую.
Мені подобається можливість видаляти файли з внутрішнього середовища 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>
і натисніть клавішу повернення лише один раз.
expand('%:p')замість того, @%щоб все одно це робити. (Хоча мені лестить, що ви включили мій підказку :) перевага стислості незначна у сценарії. Що ще важливіше %:p:) розширить ім'я файлу до повного абсолютного шляху (яким він може бути, а може і не бути). Просто %ви ризикуєте видалити файл з однойменною назвою в іншому каталозі, якщо ви забули про те, що ви :cdтам були.
Ви можете зробити це у два етапи:
зберегти як новий файл
: w newfilename
видалити старий файл
! rm oldfilename
Це може бути непопулярною думкою, але ваш провідник файлових дерев (Netrw / NerdTree) стане найпростішим та найбезпечнішим способом видалення файлу. Навіть якщо OP не використовує NerdTree, вбудований плагін Netrw буде працювати так само добре.
nnoremap rm :call delete(expand('%')) \| bdelete!<CR>. Ви можете додати у свою відповідь.