如何更高效的使用Vim?,更高效使用Vim?


   1. Vim的操作模式 - 先用起来

如果不知道Vim的这两种模式(命令模式 和 Insert模式),你连最基本的编辑保存都做不到,更别说高效了。Vim可以傲视群雄(嘘~别让Emacs听见)就依赖于这种设计思想。

命令模式 启动Vim后,即在命令模式下。Vim的精华全在该模式下,放到下一节再说
Insert模式 按下 i 键,编辑器左下角显示“--插入--”字样,即进入Insert模式,此时可以像记事本一样编辑文本了
两个模式切换 i 进入 Insert 模式,按 ESC 回到命令模式
  你还需要知道一些最基本的命令,才能正常使用Vim工作(但还谈不上高效):
:wq 存盘 + 退出 (:w 存盘, :q 退出)
ZZ 也是存盘+退出(我一般用这个,吹毛求疵的说,比:wq快那么几毫秒吧)
x 删当前光标所在的一个字符
dd 删除当前行,并把删除的行存到剪贴板里
p 粘贴剪贴板
hjkl 光标移动(虽然“上下左右”键也可以用,但依然吹毛求疵的说,hjkl不用把手移到方向键上,快不止几十毫秒吧)

 

2. 命令模式 - 带你装×带你飞

命令模式如果还要细分的话,可以分为指令模式(输入各种快捷键)和行末模式(输入各种命令),下面分别说明。

  2.1 指令模式 - 常用快捷键

  在命令模式下,只要不按“:”,就是指令模式,几乎每个按键都是一个快捷键,知道下面这些快捷键,你才能飞一般的使用Vim。
插入模式   删除(剪切)/拷贝/粘帖
i 在光标处插入   d 删除(剪切),需要和光标移动命令结合使用,比如dw: 删除字符到下个单词的开始
a 在光标后插入   y 拷贝,同d
o 在当前行后插入一个新行   dd 删除(剪切)当前行
O(大写) 在当前行前插入一个新行   yy 拷贝当前行
cw 删除光标到单词结尾,并进入插入模式   p(小写) 在光标后粘帖
 光标移动   P(大写) 在光标前粘帖
 0(数字零) 到行头   Undo/Redo/多次do
^ 到本行第一个非空字符的位置   u undo
$ 到行尾   <Ctrl-r> redo
g_ 到本行最后一个非空字符的位置   . 重复上个命令
b 到上一个单词的开始   数字n+命令 执行命令n次,比如3dd:删除3行
w 到下一个单词的开始   大小写替换
e 到下一个单词的结尾   gU 变大写
gg 到第1行   gu 变小写
G 到最后一行    可视化
nG, :n 到第n行,如 “13G”或“:13”,光标移动到13行    v
进入visual模式后可以选择一个代码块,然后进行操作了,非常棒的一个功能是代码自动对齐,只要选中代码块之后按“=”键即可。

  2.2 行末模式 - 常用命令

  在命令模式按“:”键进入行末模式,此时可以在行末输入各种命令了,下面是最常用的命令:
打开/保存/退出/改变文件
:q 退出
:w 保存
:x, :wq, ZZ 保存并退出(:x 表示仅在需要时保存,ZZ不需要输入冒号和回车)
:saveas <filePath> 另存为
:q! 退出不保存
:qa! 强行退出所有的正在编辑的文件,不保存
:e <filePath> 打开一个文件
:bn 和 :bp 通过:e打开多个文件后,使用这两个命令来切换下一个或上一个文件
:n 光标移动到第n行,如":13"移动到13行

 

  

   3. 高级技巧

如果觉得不过瘾,这儿还有更高级的内容说明:虽然是高级技巧,但都非常实用,而且会大呼过瘾,几百年不用的技巧这儿就不写了)

  3.1 查找和替换

  (1)查找

行内查找
f 向后查找(“fa”定位到下一个“a”的位置)
F 向前查找(“Fa”定位到上一个“a”的位置)
t 向后查找(“ta”定位到下一个“a”之前一个字符)
T 向前查找(“Ta”定位到上一个“a”之前一个字符)
全文查找
/ 向下查找,支持正则表达式。“n”继续查找,“N”反向继续查找
? 向上查找,同上
* 向下查找,匹配光标所在的单词(字符串)
# 向上查找,同上
% 查找匹配的括号,包括(,[,{。需要先把光标移动到括号上。碉堡了!

    

  (2)替换

语法为 :  [addr]s/源字符串/目的字符串/[option]
[addr] 表示检索范围,省略时表示当前行。
如:“1,20” :表示从第1行到20行;
  “%” :表示整个文件,同“1,$”;
  “. ,$” :从当前行到文件尾;
s 表示替换操作
[option] 表示操作类型
如:g 表示全局替换; 
      c 表示进行确认;
      p 表示替代结果逐行显示(Ctrl + L恢复屏幕);
      省略option时仅对每行第一个匹配串进行替换;
如果在源字符串和目的字符串中出现特殊字符,需要用”\”转义
示例
:%s/源字符串/目的字符串/g 全局替换
:%s/\(That\) or \(this\)/\u\2 or \l\1/g   将That or this 换成 This or that
(1)把正则表达式放进\(\)中,在后面即可用\1,\2访问\(\)中的内容;
(2)\u首字母大写; \l首字母小写
:%s/  */ /g   将多个空格换成一个空格
:%s/\([:.]\)  */\1 /g  将句号或冒号后的多个空格替换为一个空格
:%s/^/  /  在每行的开始插入两个空白

 

  3.2 自动补全

  <Ctrl-p>向上查找  <Ctrl-n>向下查找。使用<Ctrl-p>或<Ctrl-n>会列出之前键入过的单词

  

  3.3 块操作

  在命令模式下按<Ctrl-v>进入块模式,最常用的功能是同时操作多行,步骤如下:

  (1)按<Ctrl-v>进入块模式

  (2)通过光标选择要处理的区域块

  (3)按"I"在区域块之前插入,按“A”在区域块之后插入

  (4)插入完毕后按<ESC>使每一行生效

  3.3 分屏

分屏
vim -on file1 file2 ... 上下分屏(小写o,n为数字,表示分几屏)
vim -On file1 file2 ... 左右分屏(大写O)
:sp filename 上下分屏
:vsp filename 左右分屏
<Ctrl-w> s 上下分割当前文件
<Ctrl-w> v 左右分割当前文件
关闭分屏
<Ctrl-w> c 关闭当前窗口,无法关闭最后1个窗口
<Ctrl-w> q 关闭当前窗口,可以关闭最后1个窗口
移动光标
h,j,k,l 在一个屏内移动光标
<Ctrl-w> h,j,k,l 切换屏
屏幕尺寸
<Ctrl-w> = 让各分屏等分屏幕
<Ctrl-w> + 上移分割线
<Ctrl-w> - 下移分割线
<Ctrl-w> > 左移分割线
<Ctrl-w> < 右移分割线

      

   3.4 代码格式化

  (1) 按“v”进入视图模式

  (2) 选中要格式化的代码块

  (3) 按“=”键,颤抖吧~地球人~

相关内容