“学习 vim 并且其会成为你最后一个使用的文本编辑器”
学习建议:
- 丢弃鼠标和小键盘
- 具有搭配使用各种按键的意识
1. 初级
1.1 编辑模式(Insert Mode)
编辑模式包括以下动作:
- insert:
i
在光标所在字符前插入,I
在当前行首第一个非空格字符前插入 - append:
a
在光标所在字符后插入,A
在行末尾开始插入 - open:
o
在下一行插入新行,O
在光标所在行的上一行插入新行 - replace:
r
将光标处字符替换成r
紧接的字符;R
一直替换字符串,知道ESC
键退出,同 windows 下的Insert
键 Ctrl
+p
:自动提示ESC
:回到普通模式
1.2 普通模式(Normal Mode)
h
,j
,k
,l
,分别对应 左 ← 下 ↓ 上 ↑ 右 →:q
,:q!
,:wq
退出 不保存强行退出 保存退出- 移动光标到当前行首/非空格,同^,
:0
$
移动光标到当前行尾,同:$G
移动光标到文档最后一行首30G
转到第 30 行,同:30
9-
光标向上移动 9 行,同9k
9+
光饼向下移动 9 行,同9j
- 9
space
光标向后移动 9 个空格 gg
转到文档第一行(1G)H
移动到屏幕的第一列M
移动到屏幕的中间列L
移动到屏幕的最后列w
移动到下一个单词的首字母,(标点符号认为是一个单词,W 表示单词以空格分隔)e
移动到下一个单词的末尾,(E 认为单词以空格分隔)b
移动到上一个单词的首字母,(B 认为单词以空格分隔)fx
移动到下一个字母是 x 的位置。Fx 向上移动。%
匹配括号移动,包括 (, {, [ ,你需要把光标先移到括号上CTRL
+b
向上(前)翻页CTRL
+f
向后翻页d
删除开始。其实是放到寄存器中,p 或 P 命令调用。c 即 change,删完进入编辑模式d$
删除光标到行尾的所有文字,同 D。C 指令进入编辑模式dw
删除当前字符到单词尾的所有字符。cw
删除光标后的单词并进入插入模式,等同替换dd
删除当前一行2dd
删除当前两行x
剪切光标处字符,可以 p 粘贴出来y
复制开始。yank 起来,p 或 P 命令调用yy
p 复制当前行并粘贴到下一行5yy
p 复制当前行以下 5 行,在合适的地方粘贴yw
p 复制一个单词并粘贴。yi{
复制光标所在{}中的内容。很容易知道ci{
和di “
的意思。u
撤销CTRL
+r
重做.
点号重复做上一个命令- .` 移动光标到上一次的修改点
Ctrl
+g
查看我当前位置
1.3 命令模式
/word
向下查找 word,n 定位到下一个。?word
向上开始查找,同/word
配合 N。*
直接查找光标所在处单词:%s/word1/word2/g
替换所有 word1 为 word2 (^$ []):set noic
区分大小写 (即 set no igorecase,set ic 不区分大小写):set
nu 显示行号。:set nonu
相反,不显示行号:set paste
设置为粘贴模式,解决Ctrl+Insert
粘贴时缩进错乱问题。:set nopaste
设置回默认:se ff=unix
设置文本文件的格式为 unix,去掉 windows 系统文件中的^M
。:!ls
执行 bash 下的命令ls
,回车后继续回到 vi。一般在一个不存在的目录中创建文件时用到:set all
查看 vim 说有设置属性值:map
查看绑定的快捷键:marks
查看可用标记
熟练上面的命令,已经可以满足日常工作要求,要提高效率可以学习 vim 的高级用法,如分屏显示、分页、标签功能、代码折叠、键盘映射。
1.4 可视化模式
visual mode 多用于用键盘灵活选择文本。v 或 V 键进入,可以实现同时编辑多行(如注释)
2. 中级
2.1 高级组合命令
:sh
暂时离开 vi,进入 shell 命令行:!ls
!表示要执行一个 shell 命令q:
调出历史命令窗口cc
替换一行,清空一行cw
替换一个单词,进入插入模式ea
在当前单词最后插入vw
visual 模式选择一个单词VU
全选一行,转换成大写:5,12 co 13
将 5 至 12 行复制到第 13 行下gg=G
自动缩排文件%
: 匹配括号移动,包括 (, {, [. ,你需要把光标先移到括号上*
和 #:匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)
当光标在 ( )
, [ ]
,< >
, { }
, " "
, ''
内时,可以用 ci
, di
, 或 yi
,加上 (
, [
, <
,{
, "
, '
。这样可以 改写
/删除
/复制``( )
内,[ ]
内,< >
内,{ }
内," "
内,' '
内的内容
多行注释(块操作)
- 首先按
esc
进入命令行模式下,按下Ctrl
+v
,进入列(也叫区块)模式; - 在行首使用上下键
kj
选择需要注释的多行; - 按下键盘(大写)
I
键,进入插入模式; - 然后输入注释符(“//”、“#”等);
- 最后按下
esc
键
删除多行开头的一个字符与此类似,删除多个字符也只要左右键,然后使用 d
。
另外一种多行注释的方式就是替换:
:5,9s/^/#/g
添加注释#:5,9s/^#//g
删除注释#:5,9s#^#//#g
添加注释//,同:5,9s/^/\/\/#/g
:5,9s#^//##g
删除注释//
多行缩进
ESC
, Ctrl
+v
选择行 <
或 >
左右缩进,=
自动缩进(gg=G 的局部功能)
多行行末尾加上 >> ${log}:Ctrl+v /^echo
>>
相当于 tab 键,一个缩进
多行删除
- 首先在命令模式下,输入
set nu
显示行号; - 通过行号确定你要删除的行;
- 命令输入
:32,65d
,回车键,32-65 行就被删除了
自动补全
在 Insert 模式下,你可以输入一个词的开头,然后按 <C-p>
或是 <C-n>
,自动补齐功能就出现了
2.2 分屏(split)
分割窗口(同时编辑多个文件)
vi -o file1 file2
水平分屏,也可以在先打开 file1 后,使用:sp file2
vi -O file1 file2
垂直分屏,也可以在先打开 file1 后,使用:vsp file2
Ctrl
+w
w 光标切换到另一个屏k
关闭当前窗口,如果有改动则提示要先保存。:wqa!
保存退出所有文件Ctrl
+w
v
左右分割当前打开的文件。Ctrl
+w
s
上下分割显示Ctrl
+w
H
左移该屏(大写,L 右移,K 上移—改变 vertical 为 horizontal):set scb
分屏同步滚动
另外一种不分屏,同时编辑多个文件的方法
vi file1 file2
:ls
展示全部打开的文档。其中%
代表正在打开的文件(buffer),#
代表上一个编辑过的文件,a
代表当前激活的 buffer 空间,+
代表有修改过的内容但还未保存:buffer 2
转到打开的第二个文件。或简写为:b2
:bn
转到下一个文件。没有保存不能离开这个文件。:bp
上一个文件:b#
转到上一个编辑过的文件,同:e #
。类似于多屏中Ctrl
+w
w
:e file3
编辑一个新的文件Ctrl
+g
显示当前文件名和行号,同:f
2.3 折叠(fold)
主要应用在复杂脚本的场合,特别是函数比较多,逻辑结构比较复杂的代码。(:help folding)
有 6 种方式来折叠代码
- manual //手工定义折叠
- indent //用缩进表示折叠
- expr //用表达式来定义折叠
- syntax //用语法高亮来定义折叠
- diff //对没有更改的文本进行折叠
- marker //用标志折叠
indent
:set foldmethod=indent
设置缩进折叠,fdm 为简写。只对当前会话有效,要使每次打开 vim 时折叠都生效,则在.vimrc 文件中添加设置,如添加:set fdm=indent
zc
折叠与当前缩进相同的行zo
打开折叠zj
移到下一个折叠处zk
移到上一个折叠处zm
折叠所有可折叠标记zr
展开所有折叠[z
到当前打开折叠的开始]z
到当前打开折叠的结束
marker
注意与后文的 mark 不是同一东西,:set fdm=marker
zf
创建 marker,默认# { { {, # } } }
Ctrl
+v
zf
进入可视化模式,选择需要折叠的行,zc
执行折叠。会自动加入# { { { code block # } } }
zf9j
创建从当前行起至以下 9 行的折叠标记,zc
进行折叠。同9zf
。类似有zf30G
,从当前行折叠刀第 30 行zf%
创建匹配的{}, [], (), <>
的 fold。不用执行zc
zd
删除当前行上存在的折叠标记。仅当 ‘foldmethod’ 设为 “manual” 或 “marker” 时有效
2.4 标记
标记(mark)是 vim 提供的精确定位技术,只要你知道标记的名字,就可以使用命令直接跳转到该标记所在的位置。vim 中的标记都有一个名字,这个名字用单一的字符表示。大写和小写字母(A-Za-z)都可以做为标记的名字,这些标志的位置可以由用户来设置;而数字标记 0-9,以及一些标点符号标记,用户不能进行设置,由 vim 来自动设置。(:help mark-motions
查看更多帮助)
-
ms
定义一个标记 s -
s` 跳转到标记 s 的地方
-
‘s 跳转到调剂 s 所在行首
-
.` jump to position where last change occurred in current buffer
-
jump back (to position in current buffer where jumped from)
-
:delmarks aA
使用:delmarks!
删除所有小写(a-z)的标记 -
:marks
查看所有标记### 3. 插件待续
4. vimrc
.vimrc 是目前自己用的比较习惯的 vim 风格。