Vim from zero to hero - Vim 从入门到精通
- 原文地址:
- 原文作者:Marco Hinz
- 译文地址:
- - 在所有匹配行执行命令
- - 脚本梦之队
- - 重定向消息
简介
什么是 Vim?
是一个历史悠久的文本编辑器,可以追溯到 ). 于1991年发布初始版本.
该项目托管在 .
获取Vim: 使用你最喜欢的包管理器安装,或者在vim.org上 .
讨论使用相关问题最好使用 邮件列表或者使用IRC () 的 #vim
频道。
项目在 上开发, 项目讨论请订阅 邮件列表.
通过阅读 来对Vim进行大致的了解.
Vim 哲学
Vim 坚持着模式编辑的理念. 这意味着他提供了多种模式,并根据模式,同一按键有不同含义。你可以在 普通模式 下浏览文件, 在 插入模式 下插入文本, 在 可视模式 下选择行, 在 命令模式 下执行命令.
起初这听起来可能很复杂, 但是这有一个很大的优点: 不需要通过同时按住多个键来完成操作,而是通过连续地单次按键。越常用的操作,所需要的按键数量越少.“动作”和“操作符”是一个能在模式编辑中得到良好体现的概念。操作符开始一些行为, 例如:修改, 删除, 或者选择文本。之后你要用一个动作来指定需要操作的文本区域。比如,要改变括号内的文本, 需要执行ci(
(读做 change inner parentheses);删除整个段落的内容, 需要执行 dap
(读做: deletearound paragraph)。
如果你能看见 Vim 老司机操作,你会发现他们使用 Vim 脚本语言就如同钢琴师操作自己的乐器一样。复杂的操作只需要几个按键就能完成。他们甚至不用刻意去想,因为这已经成为了. 这减少并帮助人们专注与实际任务。
起步
Vim 自带一个交互式的教程,内含你需要了解的最基础的信息,你可以通过终端运行以下命令打开教程:
$ vimtutor复制代码
不要因为这个看上去很无聊而跳过,按照此教程多练习。你以前用的 IDE 或者其他编辑器很少是有“模式”概念的,因此一开始你会很难适应模式切换。但是你 Vim 使用的越多, 将越容易形成。
Vim 基于一个 克隆, 叫做 ),支持两种运行模式:"compatible" 和 "nocompatible"。在兼容模式下运行 vim 意味着使用 vi 的默认设置,而不是 vim 的默认设置。只要你没有新建一个用户的 vimrc 或者使用 vim -N
命令启动 vim,那就是在兼容模式下运行 vim! 请大家不要在兼容模式下运行 vim。
- 创建你自己的 。
- 在第一周准备。
- 通读 一节知道做什么是可能的。
- 按需学习!vim 是学不完的。如果你遇到了任何问题,先去网上去找解决方案。你的问题可能早就被解决了。VIM 拥有大量的参考文档,知道如何去利用这些参考文档是有必要了:。
- 浏览。
最后一个建议:使用之前,请先掌握 vim 的基本操作。很多插件都只是对 vim 自带功能的封装。
精简的 vimrc
用户的 vimrc 配置文件可以放在 ~/.vimrc
,或者为了更好的分离放在 ~/.vim/vimrc
,后者更便于通过版本控制软件备份和同步整个配置,比方说github。
你可以在网上找到许多精简的 vimrc 配置文件, 我的版本可能并不是最简单的版本, 但是我的版本提供了一套我认为良好的,非常适合入门的设置.
最终你需要阅读完那些设置,然后自行决定需要使用哪些. :-)
精简的 vimrc 地址:
如果你有兴趣, 这里是我(原作者)的 .
建议:大多数插件作者都维护不止一个插件并且将他们的 vimrc 放在 Github 上展示(通常放在叫做 "vim-config" 或者 "dotfiles" 的仓库中),所以当你发现你喜欢的插件时,去插件维护者的 Github 主页看看有没有这样的仓库。
我正在使用什么样的 Vim
使用 :version 命令将向你展示当前正在运行的 vim 的所有相关信息,包括它是如何编译的。
第一行告诉你这个二进制文件的编译时间和版本号,比如:7.4。接下来的一行呈现Included patches: 1-1051
, 这是补丁版本包. 因此你 vim 确切的版本号是 7.4.1051。
另一行显示着一些像 Tiny version without GUI
或者 Huge version with GUI
的信息。很显然这些信息告诉你当前的 vim 是否支持 GUI,例如:从终端中运行 gvim
或者从终端模拟器中的 vim 内运行 :gui
命令。另一个重要的信息是 Tiny
和 Huge
。Vim 的特性集区分被叫做 tiny
,small
,normal
,big
and huge
,所有的都实现不同的功能子集.
:version
主要的输出内容是特性列表.+clipboard
意味这剪贴板功能被编译支持了, -clipboard
意味着剪贴板特性没有被编译支持.
一些功能特性需要编译支持才能正常工作。例如:为了让 :prof
工作, 你需要使用 huge
模式编译的 vim, 因为那种模式启用了 +profile
特性。
如果你的输出情况并不是那样,并且你是从包管理器安装 vim 的, 确保你安装了 vim-x
,vim-x11
,vim-gtk
,vim-gnome
这些包或者相似的, 因为这些包通常都是 huge
模式编译的.
你也可以运行下面这段代码来测试 Vim 版本以及功能支持:
" Do something if running at least Vim 7.4.42 with +profile enabled.if (v:version > 704 || v:version == 704 && has('patch42')) && has('profile') " do stuffendif复制代码
相关帮助:
:h :version:h feature-list:h +feature-list复制代码
备忘录
为了避免版权问题, 我只贴出链接:
或者在 vim 中快速打开备忘录:。
基础
缓冲区,窗口,标签
Vim 是一个文本编辑器。每次文本都是作为缓冲区的一部分显示的。每一份文件都是在他们自己独有的缓冲区打开的,插件显示的内容也在它们自己的缓冲区中。
缓冲区有很多属性,比如这个缓冲区的内容是否可以修改,或者这个缓冲区是否和文件相关联,是否需要同步保存到磁盘上。
窗口 是缓冲区上一层的视窗. 如果你想同时查看几个文件或者查看同一文件的不同位置,那样你会需要窗口.
请别把他们叫做分屏. 你可以把一个窗口分割成两个, 但是这并没有让这两个窗口完全分离.
窗口可以水平或者竖直分割并且现有窗口的高度和宽度都是可以被调节设置的,因此,如果你需要多种窗口布局,请考虑使用标签。
标签页 (标签) 是窗口的集合. 因此使用标签当你想使用多种窗口布局的时候.
简单的说, 如果你启动VIM的时候没有附带任何参数,你会得到一个包含着一个呈现一个缓冲区的窗口的标签.
顺带提一下, 缓冲区列表是全局可见的,你可以在任何标签中访问任何一个缓冲区.
已激活,已载入,已列出,已命名 缓冲区
用类似 vim file1
的命令启动 vim 。这个文件的内容将会被加载到缓冲区中,你现在有一个已载入的缓冲区。如果你在 vim 中保存这个文件,缓冲区内容将会被同步到磁盘上(写回文件中)。
由于这个缓冲区也在一个窗口上显示, 所以他也是一个已激活的缓冲区。如果你现在通过 :e file2
命令加载另一个文件,file1
将会变成一个隐藏的缓冲区,并且 file2
变成已激活缓冲区。
使用 :ls
我们能够列出所有可以列出的缓冲区。插件缓冲区和帮助缓冲区通常被标记为不可以列出的缓冲区,因为那并不是你经常需要在编辑器中编辑的常规文件。通过 :ls!
命令可以显示被放入缓冲区列表的和未被放入列表的缓冲区。
未命名的缓冲区是一种没有关联特定文件的缓冲区,这种缓冲区经常被插件使用。比如 :enew
将会创建一个无名临时缓冲区。添加一些文本然后使用 :w /tmp/foo
将他写入到磁盘,这样这个缓冲区就会变成一个已命名的缓冲区。
参数列表
是 vim 的特性。在这之前的 vi 中,仅仅只有参数列表,参数列表在 vim 中依旧可以使用。
每一个通过 shell 命令传递给 vim 的文件名都被记录在一个参数列表中。可以有多个参数列表:默认情况下所有参数都被放在全局参数列表下,但是你可以使用 :arglocal
命令去创建一个新的本地窗口的参数列表。
使用 :args
命令可以列出当前参数。使用 :next
,:previous
,:first
,:last
命令可以在切换在参数列表中的文件。通过使用 :argadd
,:argdelete
或者 :args
等命令加上一个文件列表可以改变参数列表。
偏爱缓冲区列表还是参数列表完全是个人选择,我的印象中大多数人都是使用缓冲区列表的。
然而参数列表在有些情况下被大量使用:批处理
使用:argdo
! 一个简单的重构例子: :args **/*.[ch]:argdo %s/foo/bar/ge | update复制代码
这条命令将替换掉当前目录下以及当前目录的子目录中所有的C源文件和头文件中的"foo",并用"bar"代替。
相关帮助::h argument-list
按键映射
使用 :map
命令家族你可以定义属于你自己的快捷键。该家族的每一个命令都限定在特定的模式下。从技术上来说 vim 自带高达12中模式,其中6种可以被映射。另外一些命令作用于多种模式:
Recursive | Non-recursive | Modes |
---|---|---|
:map | :noremap | normal, visual, operator-pending |
:nmap | :nnoremap | normal |
:xmap | :xnoremap | visual |
:cmap | :cnoremap | command-line |
:omap | :onoremap | operator-pending |
:imap | :inoremap | insert |
例如:这个自定义的快捷键只在普通模式下工作,
:nmap :echo "foo"复制代码
使用 :nunmap <space>
可以取消这个映射。
对于更少数,不常见的模式(或者他们的组合),查看 :h map-modes
。
到现在为止还好,对新手而言有一个问题会困扰他们::nmap
是递归执行的!结果是,右边执行可能的映射。
你自定义了一个简单的映射去输出"Foo":
:nmap b :echo "Foo"复制代码
但是如果你想要映射 b
(回退一个单词)的默认功能到一个键上呢?
:nmap a b复制代码
如果你敲击a,我们期望着光标回退到上一个单词,但是实际情况是“Foo”被输出到命令行里!因为在右边,b
已经被映射到别的行为上了,换句话说就是 :echo "Foo"<cr>
。
解决此问题的正确方法是使用一种非递归的映射代替:
:nnoremap a b复制代码
经验法则: 除非递归是必须的,否则总是使用非递归映射.
通过不给一个右值来检查你的映射. 比如:nmap
显示所以普通模式下的映射, :nmap <leader>
显示所有以 <leader>
键开头的普通模式下的映射。
如果你想禁止用标准映射,把他们映射到特殊字符 <nop>
上, 例如::noremap <left> <nop>
。
相关帮助:
:h key-notation:h mapping:h 05.3复制代码
加入我们
可以协助我们核对翻译,或者从中认领章节进行翻译。