Переименование текущего файла в Vim

392

Как мне переименовать мой текущий файл в Vim?

Например:

  • Я редактирую person.html_erb_spec.rb
  • Я бы хотел переименовать в person.haml_spec.rb
  • Я хотел бы продолжить редактирование person.haml_spec.rb

Как бы я поступил так элегантно?

Сэм Шафран
источник

Ответы:

87

Есть небольшой плагин, который позволяет вам сделать это.

InnaM
источник
9
Эта обновленная версия Rename.vim правильно обрабатывает CWD - всегда сохраняет файл в каталоге оригинала.
лазарет
48
Q: "какой социопатический чудак помещает пробелы в имя режиссера?" - A: парень, который начал проект давно, а теперь ваш начальник ... продвинулся от кодирования до своей истинной области знаний: следования методам разработки и навязывания их в команде.
Конюшня
3
@AaronMahan Я исправил Rename2.vim (игнорируя более умную, но более сложную версию DelvarWorld), чтобы учесть пробелы в путях, и разветвил ее здесь: github.com/aehlke/vim-rename3 Не стесняйтесь отправлять запросы на извлечение для еще более разумной функциональности!
aehlke
4
@Stabledog Microsoft, по-видимому. Program Files (x86), Каждый раз, когда с этим каталогом нужно работать, его нужно заключить в кавычки. Что много.
JackHasaKeyboard
5
@JackHasaKeyboard: +10. «Program Files (x86)» побеждает за все время «Худшее имя каталога в операционной системе, в котором отсутствуют символические ссылки». :)
Конюшня
451

Команда вызывается :saveas, но, к сожалению, она не удалит ваш старый файл, вам придется делать это вручную. см. :help saveasдля получения дополнительной информации.

РЕДАКТИРОВАТЬ:

Большинство установок vim имеют встроенный файловый менеджер, который вы можете использовать для таких операций. Попробуйте :Exploreв командном режиме (на самом деле я бы сопоставил это с функциональной клавишей, это очень удобно). Например, вы можете переименовать файлы Rили удалить их с помощью D. Но нажатие <F1>в проводнике даст вам лучший обзор.

soulmerge
источник
6
Я не думаю, что это неудобно по сравнению с другими редакторами, где вы обычно не можете переместить файл. Вместо этого вам нужно перейти к выбранному вами файловому менеджеру, переименовать файл и вернуться в редактор. Если вам повезло, вы должны выйти и перезапустить редактор, если он не получил уведомление об изменении имени файла.
Рафаэль Бугаевский
130
Вам также может понравиться: Секс (сокращение от сплит исследования :-))
Питер Янкуляк
6
Также: e откроет исследовать в текущей панели. Менее захватывающий, чем: секс, но более эффективный;).
Джош
56
Для бесстрашных, вертикальных: Секс это: Vex.
hobbes3
5
@ Джош: E работает для меня,: E это не работает для меня. Я использую: e для редактирования другого файла в том же окне.
Омар
159

Если вы используете git и уже имеете плагин tpope fugitive.vim, тогда просто:

:Gmove newname

Это будет:

  1. Переименуйте ваш файл на диске.
  2. Переименуйте файл в git repo.
  3. Перезагрузите файл в текущий буфер.
  4. Сохранить историю отмен.

Если ваш файл еще не был добавлен в репозиторий git, то сначала добавьте его:

:Gwrite
ISQ
источник
4
Слезы текут из моих глаз. Идеальный ответ!
Фарид Нури Нешат
3
Я пожертвовал двумя козами в честь этого ответа! Но у меня есть небольшая проблема с этим, потому что вы должны ввести путь из корня рабочего дерева; и это часто становится довольно длительным в любом проекте. Есть ли этому решение?
xor
1
Замечательно! Я продолжаю находить новые вещи, которые беглец может сделать.
Богатый Чёрчер
8
@xxor: как уже упоминалось в ответе Mesco, вы можете использовать Ctrl + R% для вставки текущего имени файла, которое затем можно редактировать.
Deltab
4
Чтобы объединить несколько комментариев здесь: :Gmoveтребуется относительный путь для нового имени файла. Хороший способ сделать это - напечатать :Gmove <ctrl-r>%текущий путь / имя файла.
Шмуп
80

Я делаю это с плагином NERDTree:

:NERDTreeFind

затем нажмите m

Для переименования вы можете выбрать (m)ove the current nodeи изменить имя файла. Также есть такие опции, как удаление, копирование, перемещение и т. Д.

woto
источник
1
Вы знаете, что это - главный способ, которым я переименовываю вещи в эти дни
Сэм Шафран
2
Этот работает очень хорошо. Определенно рекомендую это.
Мэтт Сеттер
Люблю идею. Теперь это будет мой основной метод изменения имени файла.
SLN
72
  • Запишите файл во время редактирования - :w newname- чтобы создать копию.
  • Начать редактирование новой копии :e#.
  • (Опционально) удалить старую копию - :!rm oldname.

В Windows необязательный третий шаг немного меняется:

  • (Опционально) удалить старую копию Windows :!del oldname.
гимель
источник
3
Я использую этот подход все время, однако недостатком является то, что вы теряете свое дерево отмены - так что вы ничего не можете отменить до: e
rampion
7
Ницца. По-видимому, Ctrl-6 делает то же самое, что и: e #
Гленн Джекман
Вы также можете открыть каталог, навести курсор на файл и нажать «D», чтобы удалить файл.
Педер
38
Более простой способ imho: 1) переименовать текущий буфер :f newname2) сохранить его :w3) (опционально) !rm oldname. Преимущество в том, что ваша история отмены сохраняется.
Кинан
3
:saveasлучше в этом отношении, @rampion - и делает то, что написал @kynan.
lericson
36

Если файл уже сохранен:

:!mv {file location} {new file location}
:e {new file location}

Пример:

:!mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala
:e src/test/scala/myNewFile.scala

Требования к разрешению:

:!sudo mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala

Сохранить как:

:!mv {file location} {save_as file location}
:w
:e {save_as file location} 


Для Windows не проверено

:!move {file location} {new file location}
:e {new file location}
Вениамин
источник
5
Вы могли бы хотя бы объяснить, почему вы проголосовали за этот ответ.
Бенджамин
31

Я бы порекомендовал :Renameот этого евнуха Тпопе .

Он также включает в себя множество других удобных команд.

Команда Rename в настоящее время определяется следующим образом (проверьте репо на наличие обновлений!):

command! -bar -nargs=1 -bang -complete=file Rename :
  \ let s:file = expand('%:p') |
  \ setlocal modified |
  \ keepalt saveas<bang> <args> |
  \ if s:file !=# expand('%:p') |
  \   call delete(s:file) |
  \ endif |
  \ unlet s:file
Гэвин Гилмор
источник
31

Вы также можете сделать это с помощью Netrw

Команда explore открывает netrw в каталоге открытого файла

:E

Наведите курсор на файл, который вы хотите переименовать:

R

Введите новое имя, нажмите ввод, нажмите y.

Бен
источник
Великий! я даже не знал о сети.
Джавадба
31

Коротко, безопасно, без плагина:

:sav new_name
:!rm <C-R>#  // or !del <C-R># for windows

control+ R, #мгновенно развернется до альтернативного файла (ранее отредактированный путь в текущем окне) перед нажатием Enter. Это позволяет нам проверить, что именно мы собираемся удалить. Использование трубы |в таком случае является не безопасным, потому что если savне удается по какой - либо причине, #будет по- прежнему указывают на другое место (или ничего). Это означает !rm #или delete(expand(#))может удалить совершенно другой файл! Поэтому делайте это вручную или используйте хороший сценарий (они упоминаются здесь во многих ответах).

образования

... или попробуйте создать функцию / команду / скрипт самостоятельно. Начните с простого как:

command! -nargs=1 Rename saveas <args> | call delete(expand('#')) | bd #

после перезагрузки vimrc просто введите :Rename new_filename. В чем проблема с этой командой?

Тест безопасности 1: что значит :Renameбез аргументов?

Да, он удаляет файл, скрытый в «#»!

Решение: вы можете использовать, например. условия или tryутверждение, подобное этому:

command! -nargs=1 Rename try | saveas <args> | call delete(expand('#')) | bd # | endtry

Тест безопасности 1: :Rename (без аргументов) выдаст ошибку:

E471: требуется аргумент

Тест безопасности 2: Что делать, если имя будет таким же, как и предыдущее?

Тест безопасности 3: Что делать, если файл будет находиться в другом месте, чем на самом деле?

Исправь это сам. Для удобства чтения вы можете написать это следующим образом:

function! s:localscript_name(name):
  try
    execute 'saveas ' . a:name
    ...
  endtry
endfunction
command! -nargs=1 Rename call s:localscript_name(<f-args>)

ноты

  • !rm #лучше чем !rm old_name-> вам не нужно помнить старое имя

  • !rm <C-R>#лучше, чем !rm #когда это делается вручную -> вы увидите, что вы на самом деле удаляете (из соображений безопасности)

  • !rmкак правило, не очень безопасно ... mvдля мусора расположение лучше

  • call delete(expand('#'))лучше, чем команда оболочки (независимость от ОС), но длиннее для ввода и невозможно использовать control+R

  • try | code1 | code2 | tryend -> когда происходит ошибка во время code1, не запускайте code2

  • :sav(или :saveas) эквивалентно :f new_name | w- см. file_f - и сохраняет историю отмен

  • expand('%:p')дает полный путь вашего местоположения ( %) или местоположение альтернативного файла ( #)

Mesco
источник
17
sav person.haml_spec.rb | call delete(expand('#'))
Максим Ким
источник
отлично! не знал оcall delete(expand('#'))
Кайл Уайлд
10

В .vimrc Гэри Бернхардта есть функция , которая обрабатывает это.

function! RenameFile()
let old_name = expand('%')
let new_name = input('New file name: ', expand('%'), 'file')
if new_name != '' && new_name != old_name
    exec ':saveas ' . new_name
    exec ':silent !rm ' . old_name
    redraw!
endif
endfunction
map <leader>n :call RenameFile()<cr>
Джезен Томас
источник
5
Проголосуй за меня, сколько захочешь. По крайней мере, я могу переименовать файлы.
Джезен Томас
Это отличный ответ, дополнительный плагин не требуется.
wpp
8
:!mv % %:h/new_name

Регистр %содержит имя текущего файла. '%:h'показывает каталог 'head', содержащий текущий файл, например: %:hвозвращает, /abc/defкогда полный путь к файлуabc/dev/my.txt

Yossarian42
источник
7

Как насчет этого (улучшено предложением Джейка):

:exe "!mv % newfilename" | e newfilename
murftown
источник
Хммм, я должен уточнить, что вчера он работал на MacVim, но я был залит на сервер и попробовал его сегодня, а вторая команда, похоже, не рассматривалась как команда двоеточия ...
murftown
1
На самом деле сейчас он не работает на MacVim. Вернуться к доске для рисования! :)
Murftown
2
Это должно быть:exe "!mv % newfilename" | e newfilename
Джейк
Спасибо Джейк, это немного лучше, чем мое решение. Обновлено.
Murftown
7

У Vim есть renameфункция, но, к сожалению, она не сохраняет историю.

Самый простой способ переименовать файл без потери истории, не зависящий от ОС:

:saveas new_file_name
:call delete(expand('#:p'))

expand('#:p') возвращает полный путь к старому файлу.

Используйте, :bd #если вы также хотите удалить старый файл из списка буферов.

Или создайте плагин

Если вы хотите использовать быструю команду для переименования файла, добавьте новый файл в ~ / .vim / plugin со следующим содержимым:

function! s:rename_file(new_file_path)
  execute 'saveas ' . a:new_file_path
  call delete(expand('#:p'))
  bd #
endfunction

command! -nargs=1 -complete=file Rename call <SID>rename_file(<f-args>)

Команда Renameпоможет вам быстро переименовать файл.

Alex
источник
: call delete ('<Cr> #') легче написать.
MaikoID
7

Там есть значительно больший плагин под названием vim-eunuch от Tim Pope, который включает функцию переименования, а также некоторые другие полезности (удаление, поиск, сохранение всего, chmod, sudo edit, ...).

Чтобы переименовать файл в vim-eunuch:

:Move filename.ext

По сравнению с rename.vim:

:rename[!] filename.ext

Сохраняет несколько нажатий клавиш :)

sh78
источник
И это действительно имеет некоторые другие очень полезные функции!
Пьер-Адриен Буассон
5

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

:Explore

Эта команда позволяет вам исследовать файлы в .directory, удалять или переименовывать их. чем вы должны перейти к необходимому файлу в проводнике, чем введите Rкоманду, которая позволит вам переименовать имя файла

Наглый Спамер
источник
3

Я не знаю, является ли это «самым простым» методом, но при условии, что вы уже сохранили свой файл (: w), я бы вызвал оболочку (: sh) и сделал бы простой cp foo foo.bak. Чтобы вернуться в редактор. используйте Ctrl-D / Exit. Полезный список команд редактора vi по этой ссылке

DBMarcos99
источник
Это скопирует файл, а не переименует его.
InnaM
Ах, я неправильно понял "Я хотел бы продолжить редактирование person.haml_spec.rb" Мой плохой!
DBMarcos99
Я полагаю, вы могли бы: cp foo foo.new, а затем: e foo.new?
DBMarcos99
3

Вы также можете использовать: f, а затем: w


источник
3
Это не удаляет старый файл.
Кит Пинсон
1

Этот маленький сценарий не идеален (дополнительный возврат каретки, который вы должны нажать), но он выполняет свою работу.

function Rename()
  let new_file_name = input('New filename: ')
  let full_path_current_file = expand("%:p")
  let new_full_path = expand("%:p:h")."/".new_file_name
  bd    
  execute "!mv ".full_path_current_file." ".new_full_path
  execute "e ".new_full_path
endfunction                                                                                                                                                                                                                                 

command! Rename :call Rename()
nmap RN :Rename<CR>
Йонас Гейрегат
источник
0

Другой способ - просто использовать netrw, который является частью vim.

:e path/to/whatever/folder/

Тогда есть варианты для удаления, переименования и т. Д.

Вот таблица ключей, чтобы открыть netrw в папку файла, который вы редактируете:

map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>
dechimp
источник
0

:sav newfile | !rm #

Обратите внимание, что он не удаляет старый файл из списка буферов. Если это важно для вас, вы можете использовать следующее:

:sav newfile | bd# | !rm #

sitaktif
источник