在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 

这会:

  1. 重命名您的文件在磁盘上。
  2. 在git repo中重命名文件。
  3. 将文件重新加载到当前缓冲区中。
  4. 保留撤消历史。

如果你的文件还没有添加到一个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确实有一个renamefunction,但不幸的是它没有保留历史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 #