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

20 ответов

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

87
ответ дан innaM 18 March 2018 в 09:33
поделиться

:sav newfile | !rm #

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

:sav newfile | bd# | !rm #

0
ответ дан sitaktif 18 March 2018 в 09:33
поделиться

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

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>
1
ответ дан Jonas Geiregat 18 March 2018 в 09:33
поделиться

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

:e path/to/whatever/folder/

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

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

map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>
0
ответ дан dechimp 18 March 2018 в 09:33
поделиться

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

2
ответ дан DBMarcos99 18 March 2018 в 09:33
поделиться

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

3
ответ дан 18 March 2018 в 09:33
поделиться
:!mv % %:h/new_name

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

4
ответ дан Yossarian42 18 March 2018 в 09:33
поделиться

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

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

:Move filename.ext

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

:rename[!] filename.ext

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

6
ответ дан sh78 18 March 2018 в 09:33
поделиться

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

6
ответ дан Alex 18 March 2018 в 09:33
поделиться

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

:exe "!mv % newfilename" | e newfilename
7
ответ дан murftown 18 March 2018 в 09:33
поделиться
sav person.haml_spec.rb | call delete(expand('#'))
17
ответ дан Maxim Kim 18 March 2018 в 09:33
поделиться

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

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

:E

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

R

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

25
ответ дан Ben 18 March 2018 в 09:33
поделиться

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

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

27
ответ дан Mesco 18 March 2018 в 09:33
поделиться

Я бы порекомендовал :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
27
ответ дан blueyed 18 March 2018 в 09:33
поделиться

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

:!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}
29
ответ дан Benjamin 18 March 2018 в 09:33
поделиться

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

:NERDTreeFind

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

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

70
ответ дан yozzz 18 March 2018 в 09:33
поделиться
  • Запишите файл во время редактирования - :w newname - чтобы создать копию.
  • Начать редактирование новой копии - :e#.
  • (Опционально) удалить старую копию - :!rm oldname.

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

  • (опционально) удалить старую копию Windows - :!del oldname.
70
ответ дан gimel 18 March 2018 в 09:33
поделиться

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

:Gmove newname

Это будет:

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

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

:Gwrite
144
ответ дан ISQ 18 March 2018 в 09:33
поделиться

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

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

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

419
ответ дан soulmerge 18 March 2018 в 09:33
поделиться

В есть функция .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>
10
ответ дан Jezen Thomas 18 March 2018 в 09:33
поделиться