在Vim中重命名当前文件

Sam*_*ron 380 vi vim

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

例如:

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

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

sou*_*rge 434

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

编辑:

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

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

小智 149

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

:Gmove newname
Run Code Online (Sandbox Code Playgroud)

这将:

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

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

:Gwrite
Run Code Online (Sandbox Code Playgroud)

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

inn*_*naM 86

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

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

wot*_*oto 73

我正在使用NERDTree插件:

:NERDTreeFind
Run Code Online (Sandbox Code Playgroud)

然后按 m

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

  • 你知道吗,这是我现在重命名的主要方式 (2认同)
  • 这个效果很好.绝对推荐它. (2认同)

gim*_*mel 70

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

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

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

  • 更直接的方式imho是1)重命名当前缓冲区`:f newname` 2)保存它:`w` 3)(可选)`!rm oldname`.优点是保留了撤消历史记录. (34认同)
  • 尼斯.显然Ctrl-6的作用与:e#相同 (7认同)
  • 我一直使用这种方法,但是,缺点是您丢失了撤消树 - 因此您无法在 :e 之前撤消任何内容 (4认同)
  • `:saveas`在这方面更好,@ rampion - 并且@kynan写的是什么. (3认同)
  • `:e#` 中的 `#` 代表什么? (2认同)

Ben*_*min 33

如果文件已保存:

:!mv {file location} {new file location}
:e {new file location}
Run Code Online (Sandbox Code Playgroud)

例:

:!mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala
:e src/test/scala/myNewFile.scala
Run Code Online (Sandbox Code Playgroud)

许可要求:

:!sudo mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala
Run Code Online (Sandbox Code Playgroud)

另存为:

:!mv {file location} {save_as file location}
:w
:e {save_as file location} 
Run Code Online (Sandbox Code Playgroud)


对于 未经验证的Windows

:!move {file location} {new file location}
:e {new file location}
Run Code Online (Sandbox Code Playgroud)

  • 你至少可以解释为什么你拒绝投票给这个答案. (5认同)

Mes*_*sco 30

简短,安全,无插件:

:sav new_name
:!rm <C-R>#  // or !del <C-R># for windows
Run Code Online (Sandbox Code Playgroud)

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

教育性

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

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

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

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

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

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

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

安全测试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>)
Run Code Online (Sandbox Code Playgroud)

笔记

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

  • !rm <C-R>#!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')给出你的位置的整个路径(%)或备用文件的位置(#)


Gav*_*our 29

我建议: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
Run Code Online (Sandbox Code Playgroud)


Ben*_*Ben 28

你也可以用netrw来做

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

:E
Run Code Online (Sandbox Code Playgroud)

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

R
Run Code Online (Sandbox Code Playgroud)

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


Max*_*Kim 17

sav person.haml_spec.rb | call delete(expand('#'))
Run Code Online (Sandbox Code Playgroud)


Наг*_*мер 15

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

:Explore
Run Code Online (Sandbox Code Playgroud)

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


Jez*_*mas 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>
Run Code Online (Sandbox Code Playgroud)

  • 向我倾倒你喜欢的一切.至少我可以重命名文件. (5认同)

mur*_*own 7

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

:exe "!mv % newfilename" | e newfilename
Run Code Online (Sandbox Code Playgroud)

  • 它应该是`:exe"!mv%newfilename"| e newfilename` (2认同)

Ale*_*lex 6

Vim确实有一个rename功能,但不幸的是它没有保留历史.

在不丢失历史记录的情况下,最简单的操作系统无关的方法是:

:saveas new_file_name
:call delete(expand('#:p'))
Run Code Online (Sandbox Code Playgroud)

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>)
Run Code Online (Sandbox Code Playgroud)

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


sh7*_*h78 6

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

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

:Move filename.ext

与rename.vim相比:

:rename[!] filename.ext

保存几个按键:)


Yos*_*n42 6

:!mv % %:h/new_name
Run Code Online (Sandbox Code Playgroud)

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