vim入门到进阶学习

1,261 阅读4分钟

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战

概述

vim有两种模式:Normal和Insert模式。

  • 处于Normal时,所有的键都为功能键,像传统Windows系统中,按下Ctrl键下的效果。比如,Ctrl + C为复制内容,那么处于Normal下,按「C」相当于复制(注意,这是比喻,实际Normal中的C是其他功能)。用VIm打开文件时,就处于Normal模式;当在Insert模式时,按下【Esc】键,回到Normal模式。
  • Insert模式,就是编辑模式了,可以编辑文档。一般我们可以通过在Normal模式按下【i】键,进入Insert模式

入门命令(Norma模式)

  • i 进入Insert 模式,按 ESC 回到 Normal 模式
  • x 删当前光标所在的一个字符
  • :wq 保存文件并退出
  • :q 退出vim,如果文件已修改,不能直接退出,需要:q!命令强制退出
  • :w [newfilename] 另存为newfilename文件(当前编辑的文件还属当前文件)
  • dd 删除当前行,并把删除的当前行存在剪贴板
  • p 粘贴剪贴板(dd存在剪贴板的内容,会粘贴到光标的下一行)
  • h j k l 移动光标,分别为:←↓↑→

进一步学习

更多的进入插入模式的方式

从前面的学习,我们知道通过在Normal模式按i进入编辑模式。这时候,我们就可以在光标之前插入内容。为了提高我们的编辑效率,有时候我们需要在不同的位置插入内容。vim提供了多种插入模式:

  • a 在光标后插入
  • o 在当前行后插入一个新行
  • O 大写的o, 在当前行前插入一个新行
  • cw 先按c,再按w。删除光标到这个单词结尾的部分,并进入Insert模式。ps:w移动到下一个单词位置
光标移动

我们最常用的移动方式就是上下左右移动,vim还有其他好用的光标移动方式:

  • 0 数字零(注意,不是9宫格数字键盘上的0,而是字符上的0),移动到行头
  • ^ 移动到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等),而0是直接移动到行头
  • $ 移动到本行行尾
  • g_ 移动到本行最后一个不是blank字符的位置
  • /pattern 先按「/」,再键入所要匹配的内容。搜索 pattern 的字符串,如果搜索出多个匹配,可按n键到下一个。ps:命中搜索结果,会高亮显示,如果想要清除高亮效果,可以再次匹配不存在的文本;或者使用命令:noh
复制、剪切、粘贴

复制,在vim中也叫yank(提起)。复制相关的命令都是y开头

  • yy 复制整行(nyy或者yny ,复制n行,n为数字);
  • y^ 复制当前(光标前,不包含当前光标所在位置)到行头的内容;
  • y$ 复制当前(包含光标所在位置)到行尾的内容;
  • yw 复制一个word (nyw或者ynw,复制n个word,n为数字)

剪切,在vim中也叫delete。剪切相关的命令都是d开头

  • dd 剪切整行
  • d^ 剪切至行首
  • d$ 剪切至行尾
  • dw 剪切一个word

粘贴,在vim中也叫put(放下)。

  • p 小写p代表贴至游标后(下),因为游标是在具体字符的位置上,所以实际是在该字符的后面
  • P 大写P代表贴至游标前(上)

说明:整行的复制粘贴在游标的上(下)一行,非整行的复制则是粘贴在游标的前(后)

Undo/Redo 撤销/重做
  • u undo,撤销。如,删除某行,再按u时,会撤销删除某行,相当于还原了某行
  • Ctrl + r redo,重做。如,删除某行,再按u时,会撤销删除某行,再按Ctrl + r,又重新删除某行。

undo/Redo 可以理解成操作的前进后退。

打开/保存/退出/改变文件
  • :e <path/to/file> 打开一个文件
  • :w 存盘
  • :saveas <path/to/file> 另存为 <path/to/file>
  • :xZZ:wq 保存并退出 (:x 表示仅在需要时保存,ZZ不需要输入冒号并回车)。:xZZ:wq最大的区别是::xZZ在内容未更改时,不会保存;:wq即使内容未更改,也会保存。文件修改时间可以很明显看出这两者的区别区别。
  • :q! 退出不保存 :qa! 强行退出所有的正在编辑的文件,就算别的文件有更改。
  • :bn:bp 你可以同时打开很多文件(在bash里,vim 命令紧跟多个文件名),使用这两个命令来切换下一个或上一个文件。(使用:n到下一个文件,切换到最后一个文件时,再执行就会报错了)

高效使用

高效移动光标
  • NG 「N」表示数字,「G」为大写,表示移动到第N行
  • :N 「N」表示数,同样可以达到移动到N行目的
  • gg 移动到第一行
  • G 移动到最后一行
  • wW 移动到下一个单词的开头,它们的区别是对单词字符的分隔符
  • eE 移动到下一个单词的结尾
  • bB 移动到上一个单词的开头
  • gegE 移动到上一个单词的结尾
  • % 匹配括号移动,包括()[]{},但不包括【】()「」(中文的括号)。注意:需要把光标先移动到括号上
  • *# 匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)
高效选择

当我们想选取文本内容是,可以按v进入视模式选择,结合移动光标命令进行选择相关内容。然后再执行相关命令,如d删除所选内容;y复制所选内容

参考

《简明 VIM 练级攻略》