在Vim中重命名当前文件

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

例如:

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

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

251306 次浏览

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

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

. xml

该命令名为:saveas,但不幸的是,它不会删除旧文件,你必须手动删除。更多信息见:help saveas

编辑:

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

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

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

  • (可选)删除旧的Windows副本- :!del oldname
sav person.haml_spec.rb | call delete(expand('#'))

你也可以用:f后跟:w

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

:exe "!mv % newfilename" | e newfilename

为此,我推荐tpope的太监中的: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

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

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)ove the current node并更改文件名。也有选项,如删除,复制,移动等…

如果你使用git并且已经有tpope的插件fugitive.vim,那么简单:

:Gmove newname

这将:

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

如果你的文件还没有添加到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}
< p >
对于Windows 未经证实的

:!move {file location} {new file location}
:e {new file location}

加里·伯恩哈特的。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确实有一个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将帮助您快速重命名文件。

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

使用vim-eunuch重命名文件。

:Move filename.ext

相对于rename.vim:

:rename[!] filename.ext

节省了一些按键:)

另一种方法是只使用netrw,它是vim的原生部分。

:e path/to/whatever/folder/

然后还有删除、重命名等选项。

下面是打开netrw到你正在编辑的文件文件夹的键图:

map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>

:sav newfile | < /代码> < / p >

注意,它不会从缓冲区列表中删除旧文件。如果这对你来说很重要,你可以使用以下方法:

:sav newfile | bd# | < /代码> < / p >

你也可以使用netw

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

:E

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

R

输入新名字,回车,按y。

短,安全,无插件:

:sav new_name
:!rm <C-R>#  // or !del <C-R># for windows

控制 + R,在按输入之前,将立即展开为替换文件(当前窗口中先前编辑的路径)。这样我们就可以查看要删除的内容。 在这种情况下使用管道|安全的,因为如果sav由于任何原因失败,#仍将指向另一个地方(或不指向任何地方)。这意味着!rm #delete(expand(#))可能会删除完全不同的文件! 所以要小心地手工或使用好的脚本(在这里的许多答案中都提到了它们)。< / p >

教育

...或者尝试自己构建一个函数/命令/脚本。从简单的事物开始:

command! -nargs=1 Rename saveas <args> | call delete(expand('#')) | bd #
vimrc重载后,只需键入:Rename new_filename。 这个命令有什么问题?< / p >

__abc0不带参数是什么?

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

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

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

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

E471:必需参数

安全测试2: 如果名字和之前的一样怎么办?< / p >

安全测试3: 如果文件的位置与实际位置不同怎么办?< / p >

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

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 <C-R>#!rm #更好->你会看到你实际上删除了什么(安全原因)

  • !rm通常不是很安全…mv到垃圾位置更好

  • call delete(expand('#'))比shell命令(OS不可知)更好,但输入时间更长,不可能使用control + R

  • try | code1 | code2 | tryend ->当code1发生错误时,不要运行code2

  • :sav(或:saveas)等价于:f new_name | w -参见file_f -并保留撤消历史

  • expand('%:p')给出了你的位置的整个路径(%)或备用文件的位置(#)

:!mv % %:h/new_name

寄存器%包含当前文件的名称。__abc1显示包含当前文件的目录'head',例如:当你的文件完整路径为abc/def/my.txt时,__abc2返回/abc/def

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

:Explore

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

:h rename()是迄今为止最简单和最干净的方法。 就叫它吧 :call rename("oldname", "newnane") < / p >