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

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

Например:

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

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

Ответы [ 20 ]

10 голосов
/ 30 декабря 2013

В есть функция .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>
7 голосов
/ 19 декабря 2011

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

:exe "!mv % newfilename" | e newfilename
6 голосов
/ 31 июля 2014

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

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

:Move filename.ext

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

:rename[!] filename.ext

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

6 голосов
/ 29 апреля 2014

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

3 голосов
/ 04 марта 2011

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

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

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

1 голос
/ 04 июня 2019
:!mv % %:h/new_name

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

1 голос
/ 26 мая 2012

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

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 голосов
/ 16 ноября 2014

:sav newfile | !rm #

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

:sav newfile | bd# | !rm #

0 голосов
/ 14 ноября 2014

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

:e path/to/whatever/folder/

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

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

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