Переименование текущего файла в Vim - PullRequest
369 голосов
/ 30 июля 2009

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

Например:

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

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

Ответы [ 20 ]

415 голосов
/ 30 июля 2009

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

EDIT:

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

143 голосов
/ 22 ноября 2012

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

:Gmove newname

Это будет:

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

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

:Gwrite
86 голосов
/ 30 июля 2009

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

70 голосов
/ 30 июля 2009
  • Запишите файл во время редактирования - :w newname - чтобы создать копию.
  • Начать редактирование новой копии - :e#.
  • (опционально) удалить старую копию - :!rm oldname.

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

  • (опционально) удалить старую копию Windows - :!del oldname.
68 голосов
/ 28 октября 2012

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

:NERDTreeFind

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

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

29 голосов
/ 26 декабря 2013

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

:!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}
27 голосов
/ 28 апреля 2012

Я бы порекомендовал :Rename из tpope's евнух для этого.

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

Команда 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
25 голосов
/ 03 декабря 2016

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

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

control + R , # мгновенно расширится до Альтернативный файл (ранее отредактированный путь в текущем окне) перед нажатием Введите .Это позволяет нам проверить, что именно мы собираемся удалить.Использование pipe | в таком случае не безопасно, потому что если 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') дает полный путь вашего местоположения (%) или местоположения альтернативного файла (#)

25 голосов
/ 15 января 2015

Вы также можете сделать это, используя netrw

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

:E

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

R

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

17 голосов
/ 30 июля 2009
sav person.haml_spec.rb | call delete(expand('#'))
...