Как я могу удалить текущий файл в 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>. Вы можете добавить свой ответ.
fotanus

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чтобы оживить.
Барт Луверс

88

Взгляните на Удаление файлов с помощью команды Vim . В разделе комментариев должно быть то, что вы ищете:

Обычно Rm удаляет текущий файл; RM удалит текущий файл и выйдет из буфера (без сохранения) за один раз.

В качестве альтернативы вы можете просто ввести команду оболочки для удаления текущего файла:

:!rm %

1
Это что-то настолько простое, что я почти не могу поверить, что мне нужно создать для этого сценарий. Благодарю.
fotanus

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

1
С некоторыми специальными символами в имени файла эта команда не будет работать, например, если имя файла 20130711-contacts # 285.vcf, в котором есть пробел, будет сказано 'rm: cannot remove `20130711-contacts': нет такого файла или directory '
Саид

4
@ saeed144, в случае пробелов в имени файла (или другие символы , которые вы не хотите интерпретировать на уровне оболочки), вы хотите , чтобы окружить имя файла ( %) в кавычки: !rm "%".
Дэвид Кейн

8
ОПАСНОСТЬ ДАННЫХ ВНИМАНИЕ! Используя только %(путь к файлу (« имя файла » в терминологии vim) как первоначально вызванный, потенциально относительный, например, просто имя файла) вместо %:p(абсолютный путь к файлу), вы подвергаетесь небольшому риску удаления файла с таким же именем в другом каталоге вместо этого, если вы забыли, что вы :cdтам написали. Поэтому я настоятельно рекомендую использовать %:pвместо этого, %если вы все равно сопоставите его.
Аарон Тома

25

Иногда плагин может быть привлекательным решением даже для простой проблемы. В этом случае нам повезло, так как есть eunuch.vim всемогущего Тима Поупа.

По собственным словам, eunuch.vim предоставляет

Vim сахар для команд оболочки UNIX, которые в нем больше всего нуждаются. Удалите или переименуйте буфер и основной файл одновременно. Загрузите a findили a locateв список quickfix. И так далее.

Отлично. В нем есть все, что нам нужно, а также некоторые дополнительные инструменты, если мы работаем в системе UNIX.

Команда, которую вы ищете, это

:Remove!

Опять же, переназначьте его, если он вам очень нужен, например :nnoremap <Leader>rm :Remove!<CR>.


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

Этот плагин очень удобно , если вам нужно ВИМ пути mv, mkdir, findи т.д. очень рекомендую.
Ehtesh Choudhury

4

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

Собрав их вместе, я добавил функцию к my ~/.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 05

0

Вы можете сделать это в два этапа:

  1. сохранить как новый файл

    : w newfilename

  2. удалить старый файл

    ! rm oldfilename


0

Это может быть непопулярное мнение, но ваш проводник файлового дерева (Netrw / NerdTree) будет самым простым и безопасным способом удалить файл. Даже если OP не использует NerdTree, встроенный плагин Netrw будет работать так же.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.