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

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

Например:

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

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

Ответ 2

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

EDIT:

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

Ответ 3

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

:Gmove newname

Это будет:

  • Переименуйте файл на диск.
  • Переименуйте файл в git repo.
  • Перезагрузите файл в текущий буфер.
  • Сохранять историю отмены.

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

:Gwrite

Ответ 4

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

В Windows дополнительный 3-й шаг немного изменится:

  • (необязательно) удалите старую копию Windows - :!del oldname.

Ответ 5

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

:NERDTreeFind

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

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

Ответ 6

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

:!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}

Ответ 7

Я бы рекомендовал :Rename от tpope eunuch для этого.

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

Команда 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

Ответ 8

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

Команда "Поиск" открывает netrw в каталоге открытого файла

:E

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

R

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

Ответ 9

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

: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 <CR># лучше, чем !rm # когда вы делаете это вручную → вы увидите, что вы действительно удаляете (из соображений безопасности)

  • !rm обычно не очень безопасно... mv к местоположению мусора лучше

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

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

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

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

Ответ 10

sav person.haml_spec.rb | call delete(expand('#'))

Ответ 11

Это функция в Gary Bernhardts.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>

Ответ 12

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

:exe "!mv % newfilename" | e newfilename

Ответ 13

У 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 поможет вам быстро переименовать файл.

Ответ 14

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

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

:Move filename.ext

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

:rename[!] filename.ext

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

Ответ 15

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

Ответ 16

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

Ответ 17

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

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>

Ответ 18

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

:e path/to/whatever/folder/

Затем есть опции для удаления, переименования и т.д.

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

map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>

Ответ 19

:sav newfile | !rm #

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

:sav newfile | bd# | !rm #

Ответ 20

:!mv % %:h/new_name

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