Как мне переименовать мой текущий файл в Vim?
Например:
- Я редактирую
person.html_erb_spec.rb - Я бы хотел переименовать в
person.haml_spec.rb - Я хотел бы продолжить редактирование
person.haml_spec.rb
Как бы я поступил так элегантно?
Как мне переименовать мой текущий файл в Vim?
Например:
person.html_erb_spec.rbperson.haml_spec.rbperson.haml_spec.rbКак бы я поступил так элегантно?
Ответы:
Есть небольшой плагин, который позволяет вам сделать это.
Program Files (x86), Каждый раз, когда с этим каталогом нужно работать, его нужно заключить в кавычки. Что много.
Команда вызывается :saveas, но, к сожалению, она не удалит ваш старый файл, вам придется делать это вручную. см. :help saveasдля получения дополнительной информации.
РЕДАКТИРОВАТЬ:
Большинство установок vim имеют встроенный файловый менеджер, который вы можете использовать для таких операций. Попробуйте :Exploreв командном режиме (на самом деле я бы сопоставил это с функциональной клавишей, это очень удобно). Например, вы можете переименовать файлы Rили удалить их с помощью D. Но нажатие <F1>в проводнике даст вам лучший обзор.
Если вы используете git и уже имеете плагин tpope fugitive.vim, тогда просто:
:Gmove newname
Это будет:
Если ваш файл еще не был добавлен в репозиторий git, то сначала добавьте его:
:Gwrite
:Gmoveтребуется относительный путь для нового имени файла. Хороший способ сделать это - напечатать :Gmove <ctrl-r>%текущий путь / имя файла.
Я делаю это с плагином NERDTree:
:NERDTreeFind
затем нажмите m
Для переименования вы можете выбрать (m)ove the current nodeи изменить имя файла. Также есть такие опции, как удаление, копирование, перемещение и т. Д.
:w newname- чтобы создать копию.:e#.:!rm oldname.В Windows необязательный третий шаг немного меняется:
:!del oldname.:f newname2) сохранить его :w3) (опционально) !rm oldname. Преимущество в том, что ваша история отмены сохраняется.
:saveasлучше в этом отношении, @rampion - и делает то, что написал @kynan.
Если файл уже сохранен:
:!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}
Я бы порекомендовал :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
: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')дает полный путь вашего местоположения ( %) или местоположение альтернативного файла ( #)
sav person.haml_spec.rb | call delete(expand('#'))
call delete(expand('#'))
В .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>
:!mv % %:h/new_name
Регистр %содержит имя текущего файла. '%:h'показывает каталог 'head', содержащий текущий файл, например: %:hвозвращает, /abc/defкогда полный путь к файлуabc/dev/my.txt
Как насчет этого (улучшено предложением Джейка):
:exe "!mv % newfilename" | e newfilename
:exe "!mv % newfilename" | e newfilename
У 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поможет вам быстро переименовать файл.
Там есть значительно больший плагин под названием vim-eunuch от Tim Pope, который включает функцию переименования, а также некоторые другие полезности (удаление, поиск, сохранение всего, chmod, sudo edit, ...).
Чтобы переименовать файл в vim-eunuch:
:Move filename.ext
По сравнению с rename.vim:
:rename[!] filename.ext
Сохраняет несколько нажатий клавиш :)
Для переименования существующего файла без использования плагинов вы должны использовать команду
:Explore
Эта команда позволяет вам исследовать файлы в .directory, удалять или переименовывать их. чем вы должны перейти к необходимому файлу в проводнике, чем введите Rкоманду, которая позволит вам переименовать имя файла
Я не знаю, является ли это «самым простым» методом, но при условии, что вы уже сохранили свой файл (: w), я бы вызвал оболочку (: sh) и сделал бы простой cp foo foo.bak. Чтобы вернуться в редактор. используйте Ctrl-D / Exit. Полезный список команд редактора vi по этой ссылке
Этот маленький сценарий не идеален (дополнительный возврат каретки, который вы должны нажать), но он выполняет свою работу.
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>
Другой способ - просто использовать netrw, который является частью vim.
:e path/to/whatever/folder/
Тогда есть варианты для удаления, переименования и т. Д.
Вот таблица ключей, чтобы открыть netrw в папку файла, который вы редактируете:
map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>