Как мне переименовать мой текущий файл в Vim?
Например:
- Я редактирую
person.html_erb_spec.rb
- Я бы хотел переименовать в
person.haml_spec.rb
- Я хотел бы продолжить редактирование
person.haml_spec.rb
Как бы я поступил так элегантно?
Как мне переименовать мой текущий файл в Vim?
Например:
person.html_erb_spec.rb
person.haml_spec.rb
person.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 newname
2) сохранить его :w
3) (опционально) !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>