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


392

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

Например:

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

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

Ответы:


87

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


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>в проводнике даст вам лучший обзор.


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

4
Слезы текут из моих глаз. Идеальный ответ!
Фарид Нури Нешат

3
Я пожертвовал двумя козами в честь этого ответа! Но у меня есть небольшая проблема с этим, потому что вы должны ввести путь из корня рабочего дерева; и это часто становится довольно длительным в любом проекте. Есть ли этому решение?
xor

1
Замечательно! Я продолжаю находить новые вещи, которые беглец может сделать.
Богатый Чёрчер

8
@xxor: как уже упоминалось в ответе Mesco, вы можете использовать Ctrl + R% для вставки текущего имени файла, которое затем можно редактировать.
Deltab

4
Чтобы объединить несколько комментариев здесь: :Gmoveтребуется относительный путь для нового имени файла. Хороший способ сделать это - напечатать :Gmove <ctrl-r>%текущий путь / имя файла.
Шмуп

80

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

:NERDTreeFind

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

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


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')дает полный путь вашего местоположения ( %) или местоположение альтернативного файла ( #)



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


7

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

:exe "!mv % newfilename" | e newfilename

Хммм, я должен уточнить, что вчера он работал на 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поможет вам быстро переименовать файл.


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

7

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

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

:Move filename.ext

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

:rename[!] filename.ext

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


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

5

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

:Explore

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


3

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


Это скопирует файл, а не переименует его.
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>

0

:sav newfile | !rm #

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

:sav newfile | bd# | !rm #

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