在Vim中重命名当前文件

时间:2009-07-30 08:46:24

标签: vim vi

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

例如:

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

如何优雅地完成这项工作?

21 个答案:

答案 0 :(得分:412)

该命令名为:saveas,但遗憾的是它不会删除旧文件,您必须手动执行此操作。有关详细信息,请参阅:help saveas

修改

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

答案 1 :(得分:141)

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

:Gmove newname

这将:

  1. 在磁盘上重命名文件。
  2. 在git repo中重命名文件。
  3. 将文件重新加载到当前缓冲区中。
  4. 保留撤消历史记录。
  5. 如果您的文件尚未添加到git repo,请先添加它:

    :Gwrite
    

答案 2 :(得分:86)

有一个little plugin让你这样做。

答案 3 :(得分:70)

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

在Windows上,可选的第3步稍有改动:

  • (可选)删除旧的Windows副本 - :!del oldname

答案 4 :(得分:67)

我正在使用NERDTree插件:

:NERDTreeFind

然后按 m

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

答案 5 :(得分:29)

如果文件已保存:

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

答案 6 :(得分:27)

我建议来自tpope eunuch: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

答案 7 :(得分:25)

您也可以使用netrw

来完成

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

:E

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

R

输入新名称,按enter键,然后按y。

答案 8 :(得分:25)

简短,安全,无插件:

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

control + R 会在按<之前立即扩展为alternate-file(之前编辑的当前窗口中的路径) KBD>输入。这样我们就可以查看我们要删除的内容。 在这种情况下使用管道|安全,因为如果sav因任何原因失败,#仍会指向另一个地方(或者什么都不是) 。这意味着!rm #delete(expand(#))可能会删除完全不同的文件! 所以要小心谨慎或使用好的脚本(这里提到了很多答案)。

教育

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

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

重新加载vimrc后,只需输入:Rename new_filename即可。 这个命令有什么问题?

安全测试1: :Rename没有参数是什么?

是的,它会删除隐藏在&#39;#&#39;中的文件!

解决方案:您可以使用例如。条件或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 - &gt;你不需要记住旧名称

  • !rm <C-R>#优于!rm #手动操作时 - &gt;你会看到你实际删除的内容(安全原因)

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

  • call delete(expand('#'))优于shell命令(OS不可知)但输入时间更长且无法使用 control + R

    < / LI>
  • try | code1 | code2 | tryend - &gt;当code1发生错误时,请不要运行code2

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

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

答案 9 :(得分:17)

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

答案 10 :(得分:10)

Gary Bernhardt’s .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>

答案 11 :(得分:7)

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

:exe "!mv % newfilename" | e newfilename

答案 12 :(得分:6)

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

答案 13 :(得分:6)

Tim Pope提供了一个名为vim-eunuch的大插件,它包含一个重命名功能以及其他一些好东西(删除,查找,保存所有,chmod,sudo编辑......)。 / p>

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

:Move filename.ext

与rename.vim相比:

:rename[!] filename.ext

保存一些按键:)

答案 14 :(得分:3)

:!mv % %:h/new_name

寄存器%包含当前文件的名称。'%:h'显示包含当前文件的目录'head',例如:%:h在文件已满时返回/abc/def路径为abc/dev/my.txt

答案 15 :(得分:3)

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

答案 16 :(得分:2)

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

答案 17 :(得分: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>

答案 18 :(得分:0)

:sav newfile | !rm #

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

:sav newfile | bd# | !rm #

答案 19 :(得分:0)

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

:e path/to/whatever/folder/

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

这是一个打开netrw到你正在编辑的文件夹的键盘图:

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

答案 20 :(得分:0)

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

:Explore

此命令允许您浏览.directory中的文件,删除或重命名它们。比您应该在浏览器中导航到所需文件的方式要多得多,而不是键入R命令,它将允许您重命名文件名