我应该如何重命名我的当前文件在Vim?

例如:

我正在编辑person.html_erb_spec.rb 我希望它重命名为person.haml_spec.rb 我想继续编辑person.haml_spec.rb

我该如何优雅地做这件事呢?


有一个小插件可以让你这么做。


我不知道这是否是“最简单”的方法,但假设你已经保存了你的文件(:w),我会调用shell (:sh)并做一个简单的cp foo foo.bak返回编辑器使用Ctrl-D/Exit。 此链接上的vi编辑器命令的有用列表


该命令被称为:saveas,但不幸的是,它不会删除您的旧文件,您必须手动执行。参见:help save获取更多信息。

编辑:

大多数vim安装都有一个集成的文件资源管理器,您可以使用它进行此类操作。尝试:在命令模式下探索(我会将其映射到一个功能键,这非常方便)。例如,可以用R重命名文件,也可以用D删除文件。但是在资源管理器中按<F1>会给你一个更好的概述。


在编辑时写入文件-:w newname -以创建一个副本。 开始编辑新副本-:e#。 (可选)删除旧副本-:!rm oldname。

在Windows上,可选的第三步略有变化:

(可选)删除旧的Windows副本-:!德尔oldname。


sav person.haml_spec.rb | call delete(expand('#'))

你也可以用:f后跟:w


这样怎么样(经过杰克的建议改进):

:exe "!mv % newfilename" | e newfilename

我建议:从tpope的eunuch(太监)来命名这个。

它还包括一系列其他方便的命令。

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

这个小脚本并不完美(你必须按下额外的回车键),但它完成了工作。

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>

我用NERDTree插件来做:

:NERDTreeFind

然后按m

要重命名,您可以在当前节点上选择(m)并更改文件名。也有选项,如删除,复制,移动等…


如果你使用git并且已经有tpope的插件逃犯。然后简单地Vim:

:Gmove newname

这将:

重命名磁盘上的文件。 在git repo中重命名文件。 将文件重新加载到当前缓冲区中。 保留撤销历史记录。

如果你的文件还没有添加到git repo,那么先添加它:

:Gwrite

如果文件已经保存:

:!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}

在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>

Vim确实有一个重命名函数,但不幸的是它不保留历史。

在不丢失历史的情况下重命名文件的最简单的操作系统不可知的方法是:

: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命令可以帮助您快速重命名文件。


Tim Pope设计了一个更大的插件vim-eunuch,它包含了重命名函数和其他一些功能(删除、查找、保存所有、chmod、sudo编辑等等)。

使用vim-eunuch重命名文件。

:请确保移动

相对于rename.vim:

:重命名!)请

节省了一些按键:)


另一种方法是只使用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# |


你也可以使用netw

explore命令在打开文件的目录中打开netrw

:E

将光标移到需要重命名的文件上:

R

输入新名字,回车,按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重载后,只需键入:重命名new_filename。 这个命令有什么问题?

安全测试1:干什么:不带参数地重命名?

是的,它删除隐藏在“#”中的文件!

解决方法:你可以用eg。条件或try语句:

command! -nargs=1 Rename try | saveas <args> | call delete(expand('#')) | bd # | endtry

安全测试一: :Rename(不带参数)将抛出一个错误:

E471:必需参数

安全测试二: 如果名字和之前的一样怎么办?

安全测试三: 如果文件的位置与实际位置不同怎么办?

自己修理。 为了可读性,你可以这样写:

function! s:localscript_name(name):
  try
    execute 'saveas ' . a:name
    ...
  endtry
endfunction
command! -nargs=1 Rename call s:localscript_name(<f-args>)

笔记

!rm # is better than !rm old_name -> you don't need remember the old name !rm <C-R># is better than !rm # when do it by hand -> you will see what you actually remove (safety reason) !rm is generally not very secure... mv to a trash location is better call delete(expand('#')) is better than shell command (OS agnostic) but longer to type and impossible to use control + R try | code1 | code2 | tryend -> when error occurs while code1, don't run code2 :sav (or :saveas) is equivalent to :f new_name | w - see file_f - and preserves undo history expand('%:p') gives whole path of your location (%) or location of alternate file (#)


:!mv % %:h/new_name

寄存器%包含当前文件的名称。'%:h'显示包含当前文件的目录'head',例如:%:hreturns /abc/def,当你的文件完整路径是abc/def/my.txt


要重命名现有文件而不使用插件,您应该使用命令

:Explore

这个命令允许您浏览文件。目录,删除或重命名它们。然后你应该在资源管理器中导航到必要的文件,而不是键入R命令,这将允许你重命名文件名


:h rename()是迄今为止最简单、最干净的方法。 就叫它吧 :调用重命名("oldname", "newnane")