移动

h,j,k,l    #h表示往左,j表示往下,k表示往右,l表示往上
w, e, W, E    #跳到单词的后面,小写包括标点
b, B    #以单词为单位往前跳动光标,小写包含标点
f/F  #command is used to search through the current line
O    #开启新的一行
^    #一行的开始
$    #一行的结尾
gg    #文档的第一行
[N]G    #文档的第N行或者最后一行
Ctrl+o  #jump back to the previous (older) location
Ctrl+i  #to jump forward to the next location
H       #光标移动至当前屏幕显示行的行首
M       #光标移动至当前屏幕中间行的行首
L       #光标移动至当前屏幕最后一行的行首

滚屏

Ctrl+f    #上一页
Ctrl+b    #下一页
Ctrl+e    #屏幕向下滚动一行
Ctrl+y    #屏幕向上滚动一行
Ctrl+d    #屏幕向下滚动半屏
Ctrl+u    #屏幕向上滚动半屏

插入模式

i    #插入到光标前面
I    #插入到行的开始位置
a    #插入到光标的后面
A    #插入到行的最后位置
o, O    #新开一行
Esc    #关闭插入模式

编辑

r    #在插入模式替换光标所在的一个字符
J    #合并下一行到上一行
s    #删除光标所在的一个字符, 光标还在当行
S    #删除光标所在的一行,光标还在当行,不同于dd
u    #撤销上一步操作
ctrl+r    #恢复上一步操作
.    #重复最后一个命令
~    #变换为大写
[N]>>    #一行或N行往右移动一个tab
[N]<<    #一行或N行往左移动一个tab
:set number #显示行号
ctrl + s #冻结terminal
ctrl + q #解冻

搜索

/pattern    #搜索(非插入模式)
?pattern    #往后搜索
n    #光标到达搜索结果的前一个目标
N    #光标到达搜索结果的后一个目标

:noh #取消搜索高亮

视觉模式

v    #选中一个或多个字符
V    #选中一行
Ctrl+v #列块视觉模式

剪切和复制

dd    #删除一行
dw    #删除一个单词
x    #删除后一个字符
X    #删除前一个字符
D    #删除一行最后一个字符
[N]yy    #复制一行或者N行
yw    #复制一个单词
p    #粘贴

:reg # 查看vim寄存器

# 查看是否支持系统剪贴板
vim --version | grep "clipboard"
# 不支持安装图形化vim
sudo apt-get install vim-gnome

"+yy  # 复制当前行到剪切板
"+p   # 将剪切板内容粘贴到光标后面
"ayy  # 复制当前行到寄存器 a
"ap   # 将寄存器 a 中的内容粘贴到光标后面

窗口操作

:new
:split    #水平方向分割出一个窗口
:vsplit    #垂直方向分割出一个窗口
:vs       #垂直分割
:close    #关闭窗口
Ctrl+W    #切换窗口, h到左边窗口,j到下方窗口,k到上方窗口,l到右边窗口

文件操作

# 打开多个文件
vim a.file b.file

# 打开文件
:e 文件名

# 打开文件管理
:Sex,:Vex,:Tex,:Ex

# 显示文件buffer
:ls

# 移动至要修改的文档
:b 文档名或编号

# 文件之间相互切换
Ctrl+6 下一个文件
:bn 下一个文件
:bp 上一个文件

# 编辑下一个文档
:n

缩进

= #自动缩进
>> #向右缩进
<< #向左缩进

替换和删除

# :s(substitute) 用以查找和替换字符串
:{作用范围}s/{目标}/{替换}/{替换标志}

# 全局范围(%)查找foo并替换为bar,所有出现都会被替换
:s/foo/bar/g

# 当前行
:s/foo/bar/g

# 全文
:%s/foo/bar/g

# 选定的区域(按v可自动补全)
:'<,'>s/foo/bar/g

# c对替换进行确认,y替换,n不替换,a替换所有,q退出查找模式
:%s/foo/bar/gc

:%s/\s\+$//g #删除行尾多个空格

diff

vimdiff file1 file2
zo #打开折叠 
zc #关闭折叠
dp #puts changes under the cursor into the other file
do #The change under the cursor is replaced
]c #jump to the new diff
[c #jump to the pervious diff

设置鼠标

# 设置鼠标显示
:set mouse=a

# 取消鼠标显示
:set mouse=

插件

# 文件侧边栏
NERDTree

# F3唤起
map <F2> :NERDTreeToggle<CR>

neovim

# 配置文件
~/.config/nvim/init.vim

# 插件管理工具 vim-plug
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

# 修改init.vim 其它插件的安装都要放在两个 call 命令之间
call plug#begin('~/.local/share/nvim/plugged')
# 插件
call plug#end()

# vim-plug 使用
安装插件
:PlugInstall
更新插件:
PlugUpdate
删除插件:
PlugClean (首先在 init.vim 中,注释掉该插件,然后打开 Nvim, 使用 :PlugClean 命令清除该插件)
查看插件状态:
PlugStatus
升级 vim-plug:
:PlugUpgrade

# 文件管理器插件
Plug 'scrooloose/nerdtree'

# 内置terminal
:terminal

# 水平方向打开terminal
vnew term://bash

# 垂直方向打开terminal
new term://bash

# 输入模式
i

# 退出terminal输入模式
<Ctrl+\><Ctrl+N>

录制宏

1. 把光标定位在第一行;
2. 在normal模式下输入qa(当然也可以输入qb, qc, etc,这里的a, b, c是指寄存器名称,vim会把录制好的宏放在这个寄存器中)(PS:如果不知道什么是vim的寄存器,请自行放狗搜之);
3. 正常情况下,vim的命令行会显示“开始录制”的字样,这时候,把光标定位到第一个字符(按0或者|),再按x删除,按j跳到下一行;
4. normal模式下输入q,结束宏录制。

在normal模式下输入@a,以播放我们刚录制好的存在寄存器a中的宏,7@a在命令前面加数字,就是代表要执行这个命令多少次