我应该如何在Vim中重命名我当前的文件?
例如:
我正在编辑 person.html_erb_spec.rb
我希望它重命名为 person.haml_spec.rb
我想继续编辑 person.haml_spec.rb
我怎么会优雅地这样做呢?
该命令被调用:saveas
,但遗憾的是它不会删除您的旧文件,您必须手动执行此操作.了解:help saveas
更多信息.
编辑:
大多数vim安装都有一个集成的文件浏览器,您可以将其用于此类操作.尝试:Explore
命令模式(我实际上将它映射到一个功能键,它非常方便).例如,您可以使用R
或重命名文件D
.但是按下
浏览器会给你一个更好的概述.
如果您使用git并且已经拥有tpope的插件fugitive.vim,那么只需:
:Gmove newname
这将:
在磁盘上重命名您的文件.
在git repo中重命名该文件.
将文件重新加载到当前缓冲区中.
保留撤消历史记录.
如果您的文件尚未添加到git repo,请先添加它:
:Gwrite
有一个小插件让你这样做.
我正在使用NERDTree插件:
:NERDTreeFind
然后按 m
要重命名,您可以选择(m)ove the current node
并更改文件名.还有删除,复制,移动等选项......
编辑时编写文件 - :w newname
- 创建副本.
开始编辑新副本 - :e#
.
(可选)删除旧副本 - :!rm oldname
.
在Windows上,可选的第3步稍有改动:
(可选)删除旧的Windows副本 - :!del oldname
.
如果文件已保存:
:!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}
:sav new_name :!rm# // or !del # for windows
control+ R,在按下之前#会立即扩展到备用文件(当前窗口中先前编辑过的路径)Enter.这使我们可以审查我们将要删除的内容.使用管道|
在这种情况下是不是安全的,因为如果sav
由于某种原因失败,#
仍将指向另一个地方(或没有).这意味着!rm #
或delete(expand(#))
可能删除完全不同的文件!所以要小心谨慎或使用好的脚本(这里提到了很多答案).
...或者尝试自己构建一个函数/命令/脚本.从简单的开始:
command! -nargs=1 Rename saveas| call delete(expand('#')) | bd #
在vimrc重新加载后,只需输入:Rename new_filename
.这个命令有什么问题?
安全测试1:什么:Rename
没有说法?
是的,它会删除隐藏在'#'中的文件!
解决方案:您可以使用例如.条件或try
声明:
command! -nargs=1 Rename try | saveas| 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()
笔记
!rm #
比!rm old_name
- >你不需要记住旧名称
!rm
比!rm #
手工做的更好- >你会看到你真正删除的东西(安全原因)
!rm
通常不是很安全...... mv
到垃圾场更好
call delete(expand('#'))
比shell命令(操作系统不可知)更好但输入更长,不可能使用control+R
try | code1 | code2 | tryend
- >当code1发生错误时,不要运行code2
:sav
(或:saveas
)等同于:f new_name | w
- 请参阅file_f - 并保留撤消历史记录
expand('%:p')
给出你的位置的整个路径(%
)或备用文件的位置(#
)
我建议:Rename
从tpope的太监这个.
它还包括一堆其他方便的命令.
Rename命令目前在其中定义如下(检查repo是否有任何更新!):
command! -bar -nargs=1 -bang -complete=file Rename : \ let s:file = expand('%:p') | \ setlocal modified | \ keepalt saveas| \ if s:file !=# expand('%:p') | \ call delete(s:file) | \ endif | \ unlet s:file
你也可以用netrw来做
explore命令在打开文件的目录中打开netrw
:E
将光标移动到要重命名的文件上:
R
输入新名称,按enter键,然后按y.
sav person.haml_spec.rb | call delete(expand('#'))
Gary Bernhardt的.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 mapn :call RenameFile()
怎么样(由杰克的建议改进):
: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 callrename_file( )
该命令Rename
将帮助您快速重命名文件.
Tim Pope有一个名为vim- eunuch的大型插件,它包含一个重命名功能以及一些其他好东西(删除,查找,保存所有,chmod,sudo编辑......).
要在vim-eunuch中重命名文件:
:Move filename.ext
与rename.vim相比:
:rename[!] filename.ext
保存几个按键:)
:!mv % %:h/new_name
寄存器%
包含当前文件的名称。'%:h'
显示了目录“头部”含有当前文件,如:%:h
回报/abc/def
你的文件完整路径是abc/dev/my.txt