我应该如何在 Vim 中重命名当前文件?
例如:
- 我正在编辑
person.html_erb_spec.rb
- 我希望它重命名为
person.haml_spec.rb
- 我想继续编辑
person.haml_spec.rb
我将如何优雅地做到这一点?
该命令称为:saveas
,但不幸的是它不会删除您的旧文件,您必须手动执行此操作。查看:help saveas
更多信息。
编辑:
大多数 vim 安装都有一个集成的文件资源管理器,您可以将其用于此类操作。在命令模式下尝试:Explore
(我实际上会将其映射到功能键,这非常方便)。例如,您可以使用 重命名文件R
或使用 删除它们D
。但按下<F1>
资源管理器将为您提供更好的概览。
如果你使用 git 并且已经有了 tpope 的插件fugitive.vim那么简单:
:Gmove newname
这会:
如果您的文件尚未添加到 git 存储库,请先添加它:
:Gwrite
我正在使用 NERDTree 插件:
:NERDTreeFind
然后按m
要重命名,您可以选择(m)ove the current node
和更改文件名。还有删除、复制、移动等选项...
有一个小插件可以让你做到这一点。
:w newname
- 创建一个副本。:e#
.:!rm oldname
。在 Windows 上,可选的第 3 步略有变化:
:!del oldname
.: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')
给出您所在位置%
的完整路径 ( ) 或备用文件的位置 ( #
)
如果文件已保存:
:!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
explore 命令在打开文件的目录下打开 netrw
:E
将光标移到要重命名的文件上:
R
输入新名称,按回车,按 y。
我会: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
要在不使用插件的情况下重命名现有文件,您应该使用命令
:Explore
此命令允许您浏览.directory 中的文件,删除或重命名它们。比你应该在资源管理器中导航到必要的文件而不是输入R
命令,这将允许你重命名文件名
sav person.haml_spec.rb | call delete(expand('#'))
:!mv % %:h/new_name
寄存器%
包含当前文件的名称。'%:h'
显示包含当前文件的目录“头”,例如:%:h
当/abc/def
您的文件完整路径为abc/def/my.txt
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>
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
将帮助您快速重命名文件。
Tim Pope有一个更大的插件叫做vim-eunuch,它包括一个重命名功能以及其他一些好东西(删除、查找、保存所有、chmod、sudo 编辑……)。
在 vim-eunuch 中重命名文件:
:Move filename.ext
与 rename.vim 相比:
:rename[!] filename.ext
节省了一些击键:)
这个怎么样(由杰克的建议改进):
:exe "!mv % newfilename" | e newfilename
我不知道这是否是“最简单”的方法,但假设您已经保存了文件(:w),我将调用 shell(:sh)并执行一个简单的 cp foo foo.bak 返回编辑器使用 Ctrl-D/退出。此链接上有用的 vi 编辑器命令列表
您也可以使用 :f 后跟 :w
这个小脚本并不完美(您必须按额外的回车键),但它完成了工作。
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>
:h rename()
是迄今为止最简单和最干净的方法。就叫吧
:call rename("oldname", "newnane")
另一种方法是只使用 netrw,它是 vim 的原生部分。
:e path/to/whatever/folder/
然后有删除、重命名等选项。
这是打开 netrw 到您正在编辑的文件的文件夹的键盘映射:
map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>
:sav newfile | !rm #
请注意,它不会从缓冲区列表中删除旧文件。如果这对您很重要,您可以改用以下内容:
:sav newfile | bd# | !rm #