Vim 实用技巧必知必会
吴咏炜
前 Intel 资深软件架构师
21753 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
Vim 实用技巧必知必会
15
15
1.0x
00:00/00:00
登录|注册

05|多文件打开与缓冲区:复制粘贴的正确姿势

处理“已经存在交换文件!”错误提示
Vim老版本的特殊处理
使用终端窗口的粘贴命令或快捷键
使用i进入插入模式
逐一打开文件
在终端里进入目标目录
粘贴内容的方法
使用文件 > 打开菜单
使用右键菜单或拖拽文件到Vim中
操作系统资源管理器打开文件
内容小结
缓冲区列表的命令
缓冲区是文件在Vim中的映射
使用:args命令和:next等命令
使用命令行参数或通配符
Vim支持一次性打开多个文件
终端Vim
图形界面
下一讲
课后练习
缓冲区的管理和切换
多文件的打开方式
单文件的打开方式
Vim 多文件打开与缓冲区

该思维导图由 AI 生成,仅供参考

你好,我是吴咏炜。
在前面的几讲里,我们介绍了 Vim 的基本命令和配置。有了这些基本功,单个文件的基本编辑对你来说应该已经不成问题了。不过,显然我们在工作和生活中不可能只用一个文件包打天下,你肯定还会遇到需要同时编辑多个文件的情况。今天,我们就来细细讨论一下这个话题,什么是编辑多个文件的正确姿势。
先来假设一个简单的使用场景,我们现在需要在某个目录下的所有 .cpp 和 .h 文件开头贴入一段版权声明,该如何操作?

单文件的打开方式

图形界面

使用图形界面的话,我们可以在操作系统的资源管理器里进入到合适的目录,然后逐个使用 Vim 来打开文件。我们可以使用右键菜单(“Edit with Vim”、“Open with…”等),也可以直接把文件拖拽到 Vim 里。使用“文件 > 打开”(File > Open)菜单当然也是一种选择,但这需要你记住上次打开到第几个文件,并不如使用资源管理器方便。
使用这几种编辑方式的话,你可以把需要粘贴的内容放到操作系统的剪贴板里,然后在图形界面的 Vim 里用以下方法之一粘贴进去(当然,如果光标不在开头的话,先用鼠标或用 gg 命令跳转到开头):
正常模式 Vim 命令 "+P(意义我们后面再解释)
快捷键 <D-V>(提醒:这是我们对 ⌘V 的标记方式;仅适用于 macOS)或 <S-Insert>(PC 键盘)
鼠标右键加“粘贴”(Paste)
菜单“编辑 > 粘贴”(Edit > Paste)
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Vim多文件打开与缓冲区管理是一篇深入介绍Vim编辑多个文件的实用技术文章。文章首先介绍了在Vim中打开多个文件的方法,包括使用通配符和命令行参数。作者还讨论了在终端Vim中处理多文件打开的特殊情况,并介绍了Vim 8.0.0210版本引入的对括号粘贴模式的支持。此外,文章详细讨论了缓冲区的概念和管理方法,包括使用命令行模式的命令进行缓冲区切换和管理。总的来说,本文通过介绍Vim编辑多个文件的方法和缓冲区管理,为Vim用户提供了实用的编辑技巧和高效的工作流程。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Vim 实用技巧必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(20)

  • 最新
  • 精选
  • 我来也
    关于文中批量在文件开头贴入内容的需求,应该还可以更简单点. 1. 打开需要修改的文件: `vi *.cpp *.h` 2. 在外面复制一段内容(或在vim中选中一段内容并用y命令复制到默认寄存器) 3. 在命令行模式中执行命令: `bufdo normal ggP` (批量在所有缓冲区中的文件上执行命令) 4. 回写所有文件: `:wa`. 至此,任务就完成了. `bufdo`就是在缓冲区列表的每一个缓冲区里执行命令{cmd}. 与之对应的有`argdo`. bufdo是针对缓冲区的. argdo是针对参数列表的. 两者还是有明显的差别的. 查看所有列表时,一个是`buffers`,一个是`args`. 如果想在打开vi的情况下,正则导入文件,就不能用`vi *.h`,但是可以用`args *.h`.

    作者回复: bufdo 是个很有用的命令。不过,你这么做还是有一定先决条件的: 1. 外面复制不能直接用,你需要使用 gg"+P,而且这个不能适用于远程和纯终端版本。 2. 你需要打开 hidden 才能这么用。这又是个额外复杂性,而且有一定的坑。 此外,虽说这儿是批量修改,还是人眼要看一下的那种。如果真的完全不用看,用 sed 就好。

    2020-08-03
    5
    7
  • 我来也
    关于文中`启用括号粘贴模式`的内容,我稍微补充一下下. 针对在tmux中使用vim的同学,可能需要稍微调整下. 具体参见这篇文章: [Automatically set paste mode in Vim when pasting in insert mode](https://coderwall.com/p/if9mda/automatically-set-paste-mode-in-vim-when-pasting-in-insert-mode) 在我使用了一段时间该功能后,默默的把这个功能给关闭了. 还是用了最原始的方法,映射了F12在paste模式开启和关闭见切换. 原因是:有一定几率在粘贴后,把终端环境弄出问题.导致无法正常使用终端和退出vi. 反正我遇到的概率还是蛮大.我的环境是MacOS+iTerm2+Vim(8.2). 后来我发现,我在外面复制的内容,直接在vim中的普通模式中按`p`,一样不会触发vim的自动缩进. 由于我mac下的vim是与系统剪切板打通了的,所以还是蛮方便的.

    作者回复: 哈哈,tmux 又把问题进一步复杂化了…… 注意我说的括号粘贴模式的主要使用场景是远程连接到服务器上,这种情况下,没有打通剪贴板这个选项……

    2020-08-03
    3
    2
  • fei
    命令 :n|normal ggP,其中的"|"的用法没明白,Shell中是管道,用在这里是什么含义?是表示两个命令依次执行?这种用法的说明文档怎么查阅?

    作者回复: 在 Vim 里,竖线是用来分隔多个命令的。用“:help :|”可以查看帮助文件。“:”代表命令模式的命令。 这些在“:help”的一开头就有说明的,我在文中没有重复这些信息。

    2021-10-28
    1
  • IT蜗壳-Tango
    这种专栏干货太多了,需要吸收一下,但是很有意思啊。加油

    作者回复: 多多练习就行……

    2020-11-06
    1
  • 三石
    现有a.py b.py c.py d.py四个文件 vim *.py 进入了a.py 需求从a.py 跳转到 c.py 方式1 如果用命令行模式多次 n才能到达c.py 这样很啰嗦 方式2 如果用命令行 c c.py的话 查看参数列表 参数列表显示当前还处于还在a.py上,不一致问题。 方式3 如果用 args c.py 虽然到达了,但修改了args参数列表。 此时命令行查看 args就只有c.py一个文件了。 想问下有没有好的方法跳转?

    作者回复: 如果不介意参数列表的显示的话,用这一讲介绍的 3<C-^> 最快。 介意的话,用 :3argu 吧。或者记得住要跳几步的话,用 :2n。

    2020-08-11
    1
  • xavier
    感谢老师的倾囊相授。之前只会基本的一些操作,已经感觉到 vim 的高效。跟着老师学习,效率可以再提高 N 倍。期待后续课程。

    作者回复: 谢谢。😇

    2020-08-05
    1
  • pyhhou
    根据当前的 vim 配置,如果在正常模式下。鼠标选择会造成 vim 进入 virtual 模式而不能用 <D-C> 进行复制,必须输入 : 进入到命令行模式下才可以复制。这样的操作放到 Mac 下是可以的,但是通过 Mac 的 terminal 去到远程 Ubuntu 命令行 server,发现如果进入到命令行模式就没有办法通过鼠标选中文字,也就不能复制,不知道有没有什么好的方法。 现在的场景是,去到两个远程机器,把一个机器上的文件的某部分文字复制到另一个机器上一个文件上。不知道除了手动照着敲还有没有什么更好的办法?

    作者回复: Visual,不是 virtual。 我回头试试你说的。Mac 终端至少可以用 <D-R> 暂停发送鼠标事件(再按一次恢复)。

    2020-08-05
    6
    1
  • 谁家内存泄露了
    请问各位是如何使用vim打开工程项目的? 我们的项目需要多个git仓库大概是这样的树形结构 root | |——git1 |-inc | |-src | |——git2 |-inc | |-src | |——git3 |-inc | |-src ... 是一次性把所有的cpp和h导入吗?还是有其他好方法?

    作者回复: Vim 没有“导入”的概念啊。如果想要跳转之类的功能的话,需要看你的工程怎么设置。参见后面讨论 YouCompleteMe 等工具的部分。

    2022-09-19归属地:上海
  • tequ1lAneio
    vim在同时打开多文件的时候,切换文件和切换缓冲区是一回事吗?他们操作的对象是什么呢?

    作者回复: 切换文件和切换缓冲区可以获得相近的效果,但它们不是一回事,用的命令也不一样。实际上专栏里已经写了,打开多文件时每个文件都有对应的缓冲区,但你完全可以建立新的缓冲区(打开新文件等),而不影响要打开的文件列表(:args)。:ls 的结果数量常常要多于 :args。

    2021-08-11
  • chris
    老师请问:args命令是干什么的,没搞懂!

    作者回复: 我们主要用它来替换命令行给出的参数列表,即,执行 :args *.c 相当于你用 vim *.c 来启动 Vim。这样,我们就能使用 :next 等命令在多个文件中跳转。

    2020-09-16
收起评论
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部