如何在Vim中重命名当前文件?
例如:
person.html_erb_spec.rb
person.haml_spec.rb
person.haml_spec.rb
如何优雅地完成这项工作?
答案 0 :(得分:412)
该命令名为:saveas
,但遗憾的是它不会删除旧文件,您必须手动执行此操作。有关详细信息,请参阅:help saveas
。
修改强>
大多数vim安装都有一个集成的文件资源管理器,您可以将其用于此类操作。在命令模式下尝试:Explore
(我实际上将其映射到一个功能键,它的非常方便)。您可以使用R
重命名文件,或者使用D
将其删除。但是在资源管理器中按<F1>
可以为您提供更好的概述。
答案 1 :(得分:141)
如果您使用git并且已经拥有tpope的插件fugitive.vim,那么只需:
:Gmove newname
这将:
如果您的文件尚未添加到git repo,请先添加它:
:Gwrite
答案 2 :(得分:86)
有一个little plugin让你这样做。
答案 3 :(得分:70)
:w newname
- 创建副本。:e#
。:!rm oldname
。在Windows上,可选的第3步稍有改动:
:!del oldname
。答案 4 :(得分:67)
我正在使用NERDTree插件:
:NERDTreeFind
然后按 m
要重命名,您可以选择(m)ove the current node
并更改文件名。还有删除,复制,移动等选项...
答案 5 :(得分:29)
如果文件已保存:
:!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}
答案 6 :(得分:27)
我建议来自tpope eunuch的:Rename
。
它还包括许多其他方便的命令。
Rename命令目前在其中定义如下(检查repo是否有任何更新!):
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
答案 7 :(得分:25)
您也可以使用netrw
来完成explore命令在打开文件的目录中打开netrw
:E
将光标移到要重命名的文件上:
R
输入新名称,按enter键,然后按y。
答案 8 :(得分:25)
:sav new_name
:!rm <C-R># // or !del <C-R># for windows
control + R ,#会在按<之前立即扩展为alternate-file(之前编辑的当前窗口中的路径) KBD>输入。这样我们就可以查看我们要删除的内容。
在这种情况下使用管道|
是不安全,因为如果sav
因任何原因失败,#
仍会指向另一个地方(或者什么都不是) 。这意味着!rm #
或delete(expand(#))
可能会删除完全不同的文件!
所以要小心谨慎或使用好的脚本(这里提到了很多答案)。
...或尝试自己构建一个函数/命令/脚本。从简单的开始:
command! -nargs=1 Rename saveas <args> | call delete(expand('#')) | bd #
重新加载vimrc后,只需输入:Rename new_filename
即可。
这个命令有什么问题?
安全测试1: :Rename
没有参数是什么?
是的,它会删除隐藏在&#39;#&#39;中的文件!
解决方案:您可以使用例如。条件或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
- &gt;你不需要记住旧名称
!rm <C-R>#
优于!rm #
手动操作时 - &gt;你会看到你实际删除的内容(安全原因)
!rm
通常不太安全...... mv
到垃圾箱位置更好
call delete(expand('#'))
优于shell命令(OS不可知)但输入时间更长且无法使用 control + R
try | code1 | code2 | tryend
- &gt;当code1发生错误时,请不要运行code2
:sav
(或:saveas
)相当于:f new_name | w
- 请参阅file_f - 并保留撤消历史记录
expand('%:p')
提供您所在位置的完整路径(%
)或备用文件的位置(#
)
答案 9 :(得分:17)
sav person.haml_spec.rb | call delete(expand('#'))
答案 10 :(得分:10)
Gary Bernhardt’s .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>
答案 11 :(得分:7)
这个怎么样(由杰克的建议改进):
:exe "!mv % newfilename" | e newfilename
答案 12 :(得分:6)
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
将帮助您快速重命名文件。
答案 13 :(得分:6)
Tim Pope提供了一个名为vim-eunuch的大插件,它包含一个重命名功能以及其他一些好东西(删除,查找,保存所有,chmod,sudo编辑......)。 / p>
要在vim-eunuch中重命名文件:
:Move filename.ext
与rename.vim相比:
:rename[!] filename.ext
保存一些按键:)
答案 14 :(得分:3)
:!mv % %:h/new_name
寄存器%
包含当前文件的名称。'%:h'
显示包含当前文件的目录'head',例如:%:h
在文件已满时返回/abc/def
路径为abc/dev/my.txt
答案 15 :(得分:3)
你也可以使用:f后跟:w
答案 16 :(得分:2)
我不知道这是否是“最简单”的方法,但假设你已经保存了你的文件(:w)我会调用shell(:sh)并做一个简单的cp foo foo.bak去回到编辑器使用Ctrl-D / Exit。 有用的vi编辑器命令列表on this link
答案 17 :(得分:1)
这个小小的剧本并不完美(你必须按下额外的回车),但它完成了工作。
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>
答案 18 :(得分:0)
:sav newfile | !rm #
请注意,它不会从缓冲区列表中删除旧文件。如果这对您很重要,您可以使用以下代码:
:sav newfile | bd# | !rm #
答案 19 :(得分:0)
另一种方法是使用netrw,它是vim的原生部分。
:e path/to/whatever/folder/
然后有删除,重命名等选项。
这是一个打开netrw到你正在编辑的文件夹的键盘图:
map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>
答案 20 :(得分:0)
要在不使用插件的情况下重命名现有文件,应使用命令
:Explore
此命令允许您浏览.directory中的文件,删除或重命名它们。比您应该在浏览器中导航到所需文件的方式要多得多,而不是键入R
命令,它将允许您重命名文件名