【发布时间】:2010-11-15 08:56:06
【问题描述】:
我应该如何在 Vim 中重命名当前文件?
例如:
- 我正在编辑
person.html_erb_spec.rb - 我想把它重命名为
person.haml_spec.rb - 我想继续编辑
person.haml_spec.rb
我将如何优雅地做到这一点?
【问题讨论】:
我应该如何在 Vim 中重命名当前文件?
例如:
person.html_erb_spec.rb
person.haml_spec.rb
person.haml_spec.rb
我将如何优雅地做到这一点?
【问题讨论】:
:h rename() 是迄今为止最简单、最干净的方法。
就叫吧
:call rename("oldname", "newnane")
【讨论】:
有一个little plugin 可以让你做到这一点。
【讨论】:
Program Files (x86)。任何时候需要使用此目录时都需要用引号括起来。这是呃,很多。
:!mv % %:h/new_name
注册%包含当前文件的名称。'%:h'显示包含当前文件的目录'head',例如:%:hreturns /abc/def当你的文件完整路径是abc/def/my.txt时
【讨论】:
要在不使用插件的情况下重命名现有文件,您应该使用命令
:Explore
此命令允许您浏览.directory 中的文件,删除或重命名它们。你应该在资源管理器中导航到必要的文件而不是输入R 命令,这将允许你重命名文件名
【讨论】:
我正在使用 NERDTree 插件:
:NERDTreeFind
然后按m
要重命名,您可以选择(m)ove the current node 并更改文件名。还有删除、复制、移动等选项...
【讨论】:
:sav new_name
:!rm <C-R># // or !del <C-R># for windows
control + R, # 将在按下 之前立即展开为 alternate-file(当前窗口中先前编辑的路径)输入。这使我们能够查看我们要删除的确切内容。
在这种情况下使用管道| 是不 安全的,因为如果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(或:saveas)等同于:f new_name | w - 请参阅file_f - 并保留撤消历史记录
expand('%:p') 提供您所在位置的完整路径 (%) 或备用文件的位置 (#)
【讨论】:
如果文件已保存:
:!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}
【讨论】:
你也可以用 netrw 来做
explorer命令在打开文件所在目录打开netrw
:E
将光标移到要重命名的文件上:
R
输入新名称,按回车,按 y。
【讨论】:
:sav newfile | !rm #
请注意,它不会从缓冲区列表中删除旧文件。如果这对您很重要,您可以改用以下内容:
:sav newfile | bd# | !rm #
【讨论】:
另一种方法是只使用 netrw,它是 vim 的原生部分。
:e path/to/whatever/folder/
然后有删除、重命名等选项。
这是一个键盘映射,用于打开 netrw 到您正在编辑的文件所在的文件夹:
map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>
【讨论】:
Tim Pope 有一个名为 vim-eunuch 的明显更大的插件,其中包括重命名功能以及其他一些好东西(删除、查找、全部保存、chmod、sudo 编辑……)。
在 vim-eunuch 中重命名文件:
:Move filename.ext
与 rename.vim 相比:
:rename[!] filename.ext
节省了几次击键:)
【讨论】:
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 将帮助您快速重命名文件。
【讨论】:
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>
【讨论】:
这个怎么样(根据 Jake 的建议改进):
:exe "!mv % newfilename" | e newfilename
【讨论】:
:exe "!mv % newfilename" | e newfilename
如果你使用 git 并且已经有 tpope 的插件 fugitive.vim 那么简单:
:Gmove newname
这将:
如果您的文件尚未添加到 git 存储库,请先添加它:
:Gwrite
【讨论】:
:Gmove 需要新文件名的相对路径。一个很好的方法是输入:Gmove <ctrl-r>%,它会附加当前的路径/文件名。
为此,我会推荐来自 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
【讨论】:
这个小脚本并不完美(您必须按额外的回车键),但它可以完成工作。
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>
【讨论】:
:w newname - 以创建副本。:e#。:!rm oldname。在 Windows 上,可选的第 3 步略有变化:
:!del oldname。【讨论】:
:f newname 2) 保存它 :w 3) (可选)!rm oldname。这样做的好处是可以保留您的撤消历史记录。
:saveas 在这方面更好,@rampion -- 并且按照@kynan 所写的方式行事。
# 在:e# 中代表什么?
你也可以使用 :f 后跟 :w
【讨论】:
sav person.haml_spec.rb | call delete(expand('#'))
【讨论】:
call delete(expand('#'))
该命令名为:saveas,但不幸的是它不会删除您的旧文件,您必须手动执行此操作。请参阅:help saveas 了解更多信息。
编辑:
大多数 vim 安装都有一个集成的文件浏览器,您可以将其用于此类操作。在命令模式下尝试:Explore(我实际上会将其映射到功能键,它非常很方便)。例如,您可以使用R 重命名文件或使用D 删除它们。但是在资源管理器中按<F1> 会让您获得更好的概览。
【讨论】:
我不知道这是否是“最简单”的方法,但假设你已经保存了你的文件 (:w) 我会调用 shell (:sh) 并执行一个简单的 cp foo foo.bak 去返回编辑器使用 Ctrl-D/Exit。 vi 编辑器命令的有用列表on this link
【讨论】: