433

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

例如:

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

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

4

22 回答 22

487

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

编辑:

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

于 2009-07-30T09:08:08.227 回答
186

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

:Gmove newname

这会:

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

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

:Gwrite
于 2012-11-21T20:45:29.573 回答
100

我正在使用 NERDTree 插件:

:NERDTreeFind

然后按m

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

于 2012-10-27T23:18:55.887 回答
90

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

于 2009-07-30T08:51:21.100 回答
76
  • 在编辑时写入文件 - :w newname- 创建一个副本。
  • 开始编辑新副本 - :e#.
  • (可选)删除旧副本 - :!rm oldname

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

  • (可选)删除旧的 Windows 副本 - :!del oldname.
于 2009-07-30T10:06:54.537 回答
44

简短、安全、无插件:

: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 命令(与操作系统无关),但输入时间更长且无法使用control+R

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

  • :sav(or :saveas) 等价于:f new_name | w- 请参阅file_f - 并保留撤消历史记录

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

于 2016-12-03T11:10:23.253 回答
38

如果文件已保存:

:!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}
于 2013-12-25T20:20:28.040 回答
37

你也可以使用 netrw

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

:E

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

R

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

于 2015-01-15T12:04:55.750 回答
33

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

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

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
于 2012-04-28T09:15:29.537 回答
19

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

:Explore

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

于 2019-11-25T21:37:26.100 回答
18
sav person.haml_spec.rb | call delete(expand('#'))
于 2009-07-30T13:49:15.333 回答
14
:!mv % %:h/new_name

寄存器%包含当前文件的名称。'%:h'显示包含当前文件的目录“头”,例如:%:h/abc/def您的文件完整路径为abc/def/my.txt

于 2019-06-04T05:35:43.330 回答
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>
于 2013-12-30T09:15:54.247 回答
8

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

于 2014-04-29T16:20:49.227 回答
8

Tim Pope有一个更大的插件叫做vim-eunuch,它包括一个重命名功能以及其他一些好东西(删除、查找、保存所有、chmod、sudo 编辑……)。

在 vim-eunuch 中重命名文件:

:Move filename.ext

与 rename.vim 相比:

:rename[!] filename.ext

节省了一些击键:)

于 2014-07-31T08:01:51.773 回答
7

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

:exe "!mv % newfilename" | e newfilename
于 2011-12-18T21:12:03.547 回答
3

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

于 2009-07-30T09:00:26.310 回答
3

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

于 2011-03-04T17:47:20.200 回答
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>
于 2012-05-26T11:18:38.873 回答
1

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

于 2021-10-03T04:33:15.553 回答
0

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

:e path/to/whatever/folder/

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

这是打开 netrw 到您正在编辑的文件的文件夹的键盘映射:

map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>
于 2014-11-13T22:46:22.887 回答
0

:sav newfile | !rm #

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

:sav newfile | bd# | !rm #

于 2014-11-16T18:05:11.017 回答