Как мне переименовать мой текущий файл в 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
Как бы я поступил так элегантно?
Там маленький плагин, который позволяет вам это делать.
Команда называется :saveas
, но, к сожалению, она не удалит старый файл, вам придется сделать это вручную. см. :help saveas
для получения дополнительной информации.
EDIT:
В большинстве установок vim есть встроенный файловый проводник, который вы можете использовать для таких операций. Попробуйте :Explore
в командном режиме (я бы на самом деле сопоставлял это с функциональным ключом, это очень удобно). Вы можете переименовать файлы с помощью R
или удалить их с помощью D
, например. Но нажатие <F1>
в проводнике даст вам лучший обзор.
Если вы используете git и уже имеете плагин tpope fugitive.vim, просто:
:Gmove newname
Это будет:
Если ваш файл еще не был добавлен в репозиторий git, а затем добавьте его:
:Gwrite
:w newname
- для создания копии.:e#
.:!rm oldname
.В Windows дополнительный 3-й шаг немного изменится:
:!del oldname
.Я делаю это с плагином NERDTree:
:NERDTreeFind
затем нажмите m
Для переименования вы можете выбрать (m)ove the current node
и изменить имя файла. Также есть такие опции, как удаление, копирование, перемещение и т.д.
Если файл уже сохранен:
:!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
от 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
Вы также можете сделать это, используя netrw
Команда "Поиск" открывает netrw в каталоге открытого файла
:E
Переместите курсор над файлом, который вы хотите переименовать:
R
Введите новое имя, нажмите enter, нажмите y.
: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')
дает полный путь вашего местоположения (%
) или местоположение альтернативного файла (#
)
sav person.haml_spec.rb | call delete(expand('#'))
Это функция в 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>
Как насчет этого (улучшено предложением Джейка):
: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
Сохраняет несколько нажатий клавиш :)
Вы также можете использовать: f, за которым следуют: w
Я не знаю, является ли это самым простым методом, но если вы уже сохранили свой файл (: w), я бы вызвал оболочку (: sh) и сделал простой cp foo foo.bak назад к редактору используйте Ctrl-D/Exit. Полезный список команд редактора vi по этой ссылке
Этот маленький 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>
Другой способ - просто использовать netrw, который является родной частью vim.
:e path/to/whatever/folder/
Затем есть опции для удаления, переименования и т.д.
Здесь находится раскладка клавиатуры для открытия netrw в папку файла, который вы редактируете:
map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>
:sav newfile | !rm #
Обратите внимание, что он не удаляет старый файл из списка буферов. Если это важно для вас, вы можете использовать следующее:
:sav newfile | bd# | !rm #
:!mv % %:h/new_name
Регистр %
содержит имя текущего файла. '%:h'
показывает каталог "head", содержащий текущий файл, например: %:h
возвращает /abc/def
когда полный путь к файлу - abc/dev/my.txt