当前位置:  开发笔记 > 编程语言 > 正文

在Vim中重命名当前文件

如何解决《在Vim中重命名当前文件》经验,为你挑选了15个好方法。

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

例如:

我正在编辑 person.html_erb_spec.rb

我希望它重命名为 person.haml_spec.rb

我想继续编辑 person.haml_spec.rb

我怎么会优雅地这样做呢?



1> soulmerge..:

该命令被调用:saveas,但遗憾的是它不会删除您的旧文件,您必须手动执行此操作.了解:help saveas更多信息.

编辑:

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


你可能也喜欢:性(__split explore__ :-)的简写)
对于勇敢,垂直:性别是:Vex.
此外,:e将在当前窗格中打开探索.不那么令人兴奋:性,但更有效;).
@Josh:E对我有用,:它对我不起作用.我使用:e在同一窗口中编辑其他文件.
与其他通常无法移动文件的编辑器相比,我认为它并不尴尬.相反,您必须转到您选择的文件管理器,重命名该文件,然后返回编辑器.如果您很幸运,如果没有获得文件名更改通知,您必须退出并重新启动编辑器.
哎呀,我的意思是:e.(期末).
:探索效果很好!我正在摆脱NERD树而支持这个!
@bzx NERDTree执行此操作,除非您需要'移动':打开NERDTree,`mm`然后输入新名称.

2> 小智..:

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

:Gmove newname

这将:

    在磁盘上重命名您的文件.

    在git repo中重命名该文件.

    将文件重新加载到当前缓冲区中.

    保留撤消历史记录.

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

:Gwrite


@xxor:正如Mesco的回答中所提到的,您可以使用Ctrl + R%插入当前文件名,然后可以对其进行编辑.
要在此处合并一些注释:`:Gmove`需要新文件名的相对路径。这样做的一种好方法是键入`:Gmove <ctrl-r>%`,它会附加当前路径/文件名。
泪水从我的眼睛里流出来.完美的答案!
为了纪念这个答案,我牺牲了两只山羊!但是我有一个小问题,因为您必须输入从工作树的根开始的路径。在任何项目中,这通常都很漫长。这个问题有方法解决吗?

3> innaM..:

有一个小插件让你这样做.


问:"什么样的反社会怪物会在名字中加上空格?" - 答:很久以前开始这个项目的人现在是你的老板......从编码中提升到他真正的专业领域:遵循开发方法论时尚并强迫他们加入团队.
[Rename.vim的更新版本](http://www.vim.org/scripts/script.php?script_id=2724)正确处理CWD - 始终将文件保存在原始目录中.
@JackHasaKeyboard:+10."程序文件(x86)"赢得了"缺少符号链接的操作系统中历史最糟糕的目录名称".:)
@Stabledog微软,显然.`Program Files(x86)`.无论何时需要使用此目录,都需要用引号括起来.这是呃,很多.
@AaronMahan我修复了Rename2.vim(忽略更智能但更复杂的DelvarWorld版本)以允许路径中的空格并在此处分叉:https://github.com/aehlke/vim-rename3随意提交拉取请求更智能的功能!
:重命名将文件从其位置移动到CWD,因此请确保先设置CWD,或者使用正确的子目录为新文件名添加前缀.
@sickill这是一个更好的版本IMO试图变得聪明,如果新文件名包含"/"它使用完整路径,否则它假设当前目录https://github.com/DelvarWorld/configs/blob/主/束/重命名/插件/ Rename.vim

4> woto..:

我正在使用NERDTree插件:

:NERDTreeFind

然后按 m

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


这个效果很好.绝对推荐它.

5> gimel..:

编辑时编写文件 - :w newname- 创建副本.

开始编辑新副本 - :e#.

(可选)删除旧副本 - :!rm oldname.

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

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


更直接的方式imho是1)重命名当前缓冲区`:f newname` 2)保存它:`w` 3)(可选)`!rm oldname`.优点是保留了撤消历史记录.
尼斯.显然Ctrl-6的作用与:e#相同
`:saveas`在这方面更好,@ rampion - 并且@kynan写的是什么.

6> Benjamin..:

如果文件已保存:

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


你至少可以解释为什么你拒绝投票给这个答案.

7> Mesco..:

简短,安全,无插件:

:sav new_name
:!rm #  // or !del # for windows

control+ R,在按下之前#会立即扩展到备用文件(当前窗口中先前编辑过的路径)Enter.这使我们可以审查我们将要删除的内容.使用管道|在这种情况下是不是安全的,因为如果sav由于某种原因失败,#仍将指向另一个地方(或没有).这意味着!rm #delete(expand(#))可能删除完全不同的文件!所以要小心谨慎或使用好的脚本(这里提到了很多答案).

教育性

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

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

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

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

是的,它会删除隐藏在'#'中的文件!

解决方案:您可以使用例如.条件或try声明:

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

笔记

!rm #!rm old_name- >你不需要记住旧名称

!rm #!rm #手工做的更好- >你会看到你真正删除的东西(安全原因)

!rm通常不是很安全...... mv到垃圾场更好

call delete(expand('#'))比shell命令(操作系统不可知)更好但输入更长,不可能使用control+R

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

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

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



8> Gavin Gilmou..:

我建议:Rename从tpope的太监这个.

它还包括一堆其他方便的命令.

Rename命令目前在其中定义如下(检查repo是否有任何更新!):

command! -bar -nargs=1 -bang -complete=file Rename :
  \ let s:file = expand('%:p') |
  \ setlocal modified |
  \ keepalt saveas  |
  \ if s:file !=# expand('%:p') |
  \   call delete(s:file) |
  \ endif |
  \ unlet s:file



9> Ben..:

你也可以用netrw来做

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

:E

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

R

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



10> Maxim Kim..:
sav person.haml_spec.rb | call delete(expand('#'))



11> Jezen Thomas..:

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 n :call RenameFile()


向我倾倒你喜欢的一切.至少我可以重命名文件.

12> murftown..:

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

:exe "!mv % newfilename" | e newfilename


它应该是`:exe"!mv%newfilename"| e newfilename`

13> Alex..:

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 rename_file()

该命令Rename将帮助您快速重命名文件.



14> sh78..:

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

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

:Move filename.ext

与rename.vim相比:

:rename[!] filename.ext

保存几个按键:)



15> Yossarian42..:
:!mv % %:h/new_name

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

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有