在Vim中重命名当前文件
我应该如何在vim中重命名我的当前文件。
例如:
- 我在编辑
person.html_erb_spec.rb
- 我想它重命名为
person.haml_spec.rb
- 我想继续编辑
person.haml_spec.rb
我将如何优雅地去做这件事?
有一个小插件 ,让你这样做。
该命令被称为:saveas
,但不幸的是它不会删除您的旧文件,您将不得不手动。 请参阅:help saveas
获取更多信息。
编辑:
大多数vim安装都有一个集成的文件浏览器,您可以将其用于这些操作。 尝试:Explore
在命令模式下:Explore
(我将其实际映射到一个function键,这是非常方便的)。 例如,您可以用R
重命名文件,或者用D
删除它们。 但在资源pipe理器中按<F1>
会给你一个更好的概述。
如果你使用git并且已经有了tpope的插件fugitive.vim,那么简单的:
:Gmove newname
这会:
- 重命名您的文件在磁盘上。
- 在git repo中重命名文件。
- 将文件重新加载到当前缓冲区中。
- 保留撤消历史。
如果你的文件还没有添加到一个git仓库,那么首先添加它:
:Gwrite
- 编辑时写入文件 –
:w newname
– 创build一个副本。 - 开始编辑新的副本 –
:e#
。 - (可选)删除旧的副本 –
:!rm oldname
。
在Windows上,可选的第三步稍作修改:
- (可选)删除旧的Windows副本 –
:!del oldname
。
我用NERDTree插件来做:
:NERDTreeFind
然后按m
接下来,您可以select删除,复制,移动等…
我build议:Rename
从tpope的太监 :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来做
explore命令在打开的文件的目录中打开netrw
:E
将光标移到要重命名的文件上:
R
input新名称,按回车,按y。
如果该文件已保存:
:!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未 validation
:!move {file location} {new file location} :e {new file location}
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 map <leader>n :call RenameFile()<cr>
这个怎么样(杰克的build议改进了):
:exe "!mv % newfilename" | e newfilename
Vim确实有一个rename
function,但不幸的是它没有保留历史logging。
最简单的操作系统不可知的方式来重命名文件,而不会丢失历史logging将是:
:saveas new_file_name :call delete(expand('#:p'))
expand('#:p')
返回旧文件的完整path。
使用:bd #
如果您还想从缓冲区列表中删除较旧的文件。
或者创build一个插件
如果要使用快速命令重命名文件,请在〜/ .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
命令将帮助您快速重命名文件。
简短,安全,无插件:
:sav new_name :!rm <CR>#
控制 + R , #将显示在清除世界之前我们必须删除什么…使用pipe道|
在这种情况下是不安全的,因为如果sav
由于任何原因失败,备用文件名#
不变, !rm #
或delete(expand(#))
将完全删除不同的文件! 所以。 用手仔细地做或用好的脚本(在这里有很多答案都提到)。
教育性
…或者尝试自己构build一个函数/命令/脚本。 从简单开始就像:
command! -nargs=1 Rename saveas <args> | call delete(expand('#')) | bd #
在vimrc重新加载之后,只需键入:Rename new_filename
。 这个命令有什么问题?
安全testing1:什么:Rename
没有参数?
是的,它删除隐藏在'#'中的文件!
解决scheme:你可以使用例如。 条件或try
像这样的陈述:
command! -nargs=1 Rename try | saveas <args> | call delete(expand('#')) | bd # | endtry
安全testing1: :Rename
(不带参数)会抛出一个错误:
E471:需要参数
安全testing2:如果名称与以前的名称相同,该怎么办?
安全testing3:如果文件位于与实际不同的位置,该怎么办?
自己修复它。 为了便于阅读,您可以通过以下方式编写它:
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('#'))
比shell命令(操作系统不可知的)要好,但input的时间更长,不能使用control + R -
try | code1 | code2 | tryend
try | code1 | code2 | tryend
– >当code1发生错误时,不要运行code2 -
:saveas
等同于:f new_name | w
:f new_name | w
– 参见file_f -
expand('%:p')
给出您的位置的整个path(%
)或备用文件的位置(#
)
Tim Pope提供了一个名为vim- eunuch的插件,它包含一个重命名函数以及其他一些好东西(删除,查找,保存所有,chmod,sudo编辑等等)。
在vim-eunuch中重命名一个文件:
:Move filename.ext
与rename.vim相比:
:rename[!] filename.ext
保存一些按键:)
你也可以使用:f,后跟:w
我不知道这是否是“最简单”的方法,但假设你已经保存了你的文件(:w),我将调用shell(:sh)并做一个简单的cp foo foo.bak返回编辑器使用Ctrl-D /退出。 这个链接上 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 <CR>=expand("%:p:h") . '/'<CR><CR>
:sav newfile | !rm #
请注意,它不会从缓冲区列表中删除旧文件。 如果这对你很重要,你可以使用下面的代码:
:sav newfile | bd# | !rm #