在Vim中移动文件

Sve*_*enK 16 vim

有没有办法在Vim中移动文件?我在Vim中打开了一个文件foo/bar.txt.我知道有两种方法来移动这个文件:

第一解决方案

  1. 删除缓冲区 :bd bar.txt
  2. 用shell执行shell上的移动 mv foo/bar.txt foo/bar2.txt
  3. 用vim加载文件 :e foo/bar2.txt

二解决方案:

  1. 关闭Vim,使所有缓冲区关闭.
  2. 在shell上执行移动...
  3. 启动Vim并加载文件.

但这两种解决方案令人尴尬.我知道,有一个用于重命名文件vim-enuch的插件,但是没有Vim方式来执行这样的基本功能吗?

Dou*_*son 28

您还可以使用netrw(默认文件资源管理器)重命名功能.

  1. 打开netrw :E
  2. 将光标移动到包含要重命名的文件的行,在本例中为bar.txt.您可以使用h,j,k,l移动到相关文件,或者您可以使用/(例如/bar.txt)搜索它
  3. 命中R.然后,系统将提示您输入新的文件路径.完成后输入文件路径命中<CR>
  4. 将光标移动到新文件并使用打开它 <CR>

虽然此解决方案可能不如使用vim-eunch快,但它允许您在重命名文件时查看项目的结构.这也允许您一次移动多个文件.

进一步阅读运行 :help netrw-move

  • 如果将 :E 命令重新映射到某些内容,则还可以使用 (`:Sex` 或 `:Vex`) 打开文件浏览器。 (2认同)

seh*_*ehe 6

没有原子方法来移动这样的文件,但这应该是关闭的:

function! MoveFile(newspec)
     let old = expand('%')
     " could be improved:
     if (old == a:newspec)
         return 0
     endif
     exe 'sav' fnameescape(a:newspec)
     call delete(old)
endfunction

command! -nargs=1 -complete=file -bar MoveFile call MoveFile('<args>')
Run Code Online (Sandbox Code Playgroud)

现在你可以说:

:MoveFile file2.txt
Run Code Online (Sandbox Code Playgroud)

要重命名为file2.txt

:MoveFile %.0
Run Code Online (Sandbox Code Playgroud)

将file2.txt移动到file2.txt.0


pb2*_*b2q 5

如果您在 bar.txt 缓冲区中:

:w bar2.txt
:!rm bar.txt
Run Code Online (Sandbox Code Playgroud)

如果当前目录中已经存在bar2.txt,则使用:w!.

  • 但是`!rm bar.txt` 不会关闭打开的缓冲区 (2认同)