在Vim中重命名当前文件


392

如何在Vim中重命名当前文件?

例如:

  • 我正在编辑 person.html_erb_spec.rb
  • 我想将其重命名为 person.haml_spec.rb
  • 我想继续编辑 person.haml_spec.rb

我要如何优雅地做到这一点?

Answers:


87

有一个小插件,让您执行此操作。


9
此Rename.vim的更新版本可以正确处理CWD-始终将文件保存在原始文件的目录中。
生病了2011年

48
问:“哪种社交病怪人在目录名中放置空格?” -答:很久以前就开始从事该项目的人,现在是您的老板...晋升为从编码领域脱颖而出,成为他真正的专长领域:遵循开发方法学风尚并迫使他们加入团队。
稳定狗2013年

3
@AaronMahan我已经修复了Rename2.vim(忽略更智能但更复杂的DelvarWorld版本),以在路径中留有空格,并在此处添加了分叉:github.com/aehlke/vim-rename3随时提交请求请求以获得更智能的功能!
aehlke

4
@Stabledog微软,显然。Program Files (x86)。任何时候需要使用此目录时,都需要用引号引起来。恩,很多。
JackHasaKeyboard

5
@JackHasaKeyboard:+10。“程序文件(x86)”赢得了“缺少符号链接的操作系统中的最差目录名”的历史记录。:)
Stabledog '17

451

该命令称为:saveas,但是很遗憾,它不会删除您的旧文件,您必须手动执行此操作。查看:help saveas更多信息。

编辑:

大多数vim安装都有集成的文件浏览器,您可以将其用于此类操作。:Explore在命令模式下尝试(我实际上会将其映射到功能键,这非常方便)。例如,您可以使用来重命名文件R或使用来删除文件D。但是按<F1>一下浏览器将为您提供更好的概述。


6
与通常无法移动文件的其他编辑器相比,我认为这并不尴尬。相反,您必须去选择的文件管理器,重命名文件,然后回到编辑器。如果幸运的话,如果没有收到文件名更改通知,则必须退出并重新启动编辑器。
拉斐尔·布加杰夫斯基

130
您可能还会喜欢:Sex(拆分浏览的简写:
Peter Jankuliak 2011年

6
此外,:e还将在当前窗格中打开浏览。比:Sex少刺激,但效率更高;)。
2012年

56
对于强悍,垂直:Sex为:Vex。
hobbes3

5
@Josh:E对我有用,:e对我不起作用。我用:e编辑同一窗口中的其他文件。
omar 2014年

159

如果您使用git并且已经拥有tpope的插件fugitive.vim,则只需:

:Gmove newname

这将:

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

如果您的文件尚未添加到git repo,请先添加它:

:Gwrite

4
眼泪从我的眼睛里冒出来。完美的答案!
Farid Nouri Neshat

3
为了纪念这个答案,我牺牲了两只山羊!但是我有一个小问题,因为您必须输入从工作树的根开始的路径。在任何项目中,这通常都很漫长。这个问题有方法解决吗?
xor 2015年

1
那很棒!我一直在寻找逃犯可以做的新事情。
Rich Churcher

8
@xxor:如Mesco的答案中所述,您可以使用Ctrl + R%插入当前文件名,然后可以对其进行编辑。
deltab 2013年

4
在此处合并一些注释::Gmove需要新文件名的相对路径。一个不错的方法是键入:Gmove <ctrl-r>%附加当前路径/文件名的类型。
shmup

80

我正在使用NERDTree插件:

:NERDTreeFind

然后按 m

要重命名,您可以选择(m)ove the current node并更改文件名。也有删除,复制,移动等选项。


1
你知道吗,这就是我最近改名的主要方式
Sam Saffron 2012年

2
这个真的很好用。绝对推荐。
马特·塞特

喜欢这个主意。这将是我现在的主要更改文件名方法。
SLN

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

在Windows上,可选的第3步会有所变化:

  • (可选)删除旧的Windows复制- :!del oldname

3
我一直使用这种方法,但是缺点是您会丢失撤消树-因此,您无法撤消:e
猖ion事件

7
真好 显然Ctrl-6与:e#一样
glenn jackman 09年

您也可以打开目录,将光标移至文件,然后按“ D”删除文件。
Peder

38
imho的更直接方法是1)重命名当前缓冲区:f newname2)保存它:w3)(可选)!rm oldname。好处是可以保留您的撤消历史记录。
kynan 2011年

3
:saveas在这方面更好,@ rampion-并执行@kynan编写的内容。
lericson

36

如果文件已经保存:

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

5
您至少可以解释一下为什么您不赞成这个答案。
本杰明

31

我会:Rename从tpope的太监那里推荐这个。

它还包括许多其他方便的命令。

当前,重命名命令的定义如下(请检查存储库中是否有任何更新!):

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

31

您也可以使用netrw

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

:E

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

R

输入新名称,按Enter,然后按y。


大!我什至不知道netrw。
javadba

31

简短,安全,无插件:

: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之后,只需键入:Rename new_filename。此命令有什么问题?

安全测试1:什么:Rename没有说法?

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

解决方案:您可以使用例如。这样的条件或try陈述:

command! -nargs=1 Rename try | saveas <args> | 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(<f-args>)

笔记

  • !rm #!rm old_name-> 更好-您不需要记住旧名称

  • !rm <C-R>#!rm #手动操作要好->您会看到实际删除的内容(出于安全原因)

  • !rm通常不太安全... mv到垃圾桶的位置更好

  • call delete(expand('#'))比shell命令(与OS无关)要好,但键入时间更长且无法使用control+R

  • try | code1 | code2 | tryend ->当代码1发生错误时,请勿运行代码2

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

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



10

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>

5
随便选我吧。至少我可以重命名文件。
Jezen Thomas

这是一个很好的答案,不需要额外的插件。
wpp

8
:!mv % %:h/new_name

寄存器%包含当前文件的名称。'%:h'显示了目录“头部”含有当前文件,如:%:h回报/abc/def你的文件完整路径是abc/dev/my.txt


7

怎么样(由杰克的建议改进):

:exe "!mv % newfilename" | e newfilename

嗯,我要澄清一下,它昨天在MacVim上工作了,但是我被扔进服务器并在今天尝试了它,而第二个命令似乎没有被视为冒号命令……
murftown 2011年

1
实际上,现在MacVim也不起作用。回到绘图板!:)
murftown 2011年

2
应该是:exe "!mv % newfilename" | e newfilename
Jake 2012年

谢谢杰克,这比我的解决方案好一点。更新。
murftown 2013年

7

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将帮助您快速重命名文件。


:call delete('<Cr>#')易于编写。
MaikoID 2014年

7

提姆·波普(Tim Pope)有一个看似更大的插件vim-eunuch,其中包括重命名功能以及其他一些功能(删除,查找,保存所有内容,chmod,sudo编辑等)。

要在vim-eunuch中重命名文件:

:Move filename.ext

与rename.vim相比:

:rename[!] filename.ext

节省了一些击键:)


它确实还有其他一些非常有用的功能!
Pierre-Adrien Buisson 2014年

5

要在不使用插件的情况下重命名现有文件,应使用命令

:Explore

此命令允许您浏览.directory中的文件,删除或重命名它们。比您应该在资源管理器中导航到必要的文件,而不是type R命令,它将允许您重命名文件名


3

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


这将复制文件,而不是重命名。
innaM

啊-我读错了“我想继续编辑person.haml_spec.rb”,我不好!
DBMarcos99,2009年

我想你可以:!cp foo foo.new然后:e foo.new吗?
DBMarcos99,2009年

3

您也可以使用:f后跟:w


3
这不会删除旧文件。
基思·品森

1

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

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>

0

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

:e path/to/whatever/folder/

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

这是一个将netrw打开到您正在编辑的文件的文件夹的按键图:

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

0

:sav newfile | !rm #

请注意,它不会从缓冲区列表中删除旧文件。如果那对您很重要,则可以改用以下内容:

:sav newfile | bd# | !rm #

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.