VIM学习

普通模式

Esc         进入normal模式
ctrl+c      代替Esc 但是可能中断某些插件 或者使用ctrl+[
gi          回到上一次编辑的地方
:+ctrl+p        上翻执行的命令
:+ctrl+n        下翻执行的命令
:sourec ~/.vimrc    使配置生效

保存退出

:w          保存
:q          退出
:wq         保存退出
:e            重新加载
:e!            重新加载不保存

移动技巧

h           左移
j           下移
k           上移
l           右移
w           移动到下一个单词的开头
e           移动到下一个单词的结尾
b           移动到上一个单词的开头
W           跟w一样,以空白符做分割
E           跟e一样,以空白符做分割
B           跟b一样,以空白符做分割
f           按下f跟上对应字符,移动到该字符,可以使用;继续搜索
t           按下t跟上对应字符,移动到该字符前面,可以使用;继续搜索
F           跟f一样,但是是往前搜索
T           跟t一样,但是是往前搜索
0           移动到行首第一个字符
$           移动到行尾
^           移动到第一个非空白字符
g_          移动到行尾非空白字符
gg/G        移动到文件开头和结尾
ctrl+o      快速返回
H           文件开头
M           文件中间
L           文件末尾
ctrl+u      上翻页
ctrl+f      下翻页
zz          把屏幕置为中间

增删改查

i           在当前字母前面进行插入
a           在当前字母末尾进行插入
o           在当前行下面,另起一行进入插入
I           在当前行行首进行插入
A           在当前行末尾进行插入
O           在当前行上面,另起一行进行插入
x           删除字符

dw          删除一个单词,并且删除空格
diw         删除一个单词,不删除空格
dd          删除一行
dt字符      删除行直到字符结束
d0          删除到行首
d$          删除到行尾
数字+x      代表删除几个字符

r           替换一个字符
c           配合文本对象进行快速修改
s           删除并且进入插入模式
R           替换一个字符且后面的也可以继续替换
S           删除整行进入插入
C           删除整行进入插入
caw         删除当前单词进入插入
ct字符      删除行直到字符结束,并且进入插入

/           前向搜索
?          反向搜索
n           下一个匹配
N           上一个匹配

*           当前单词的前向匹配

#           当前单词的后向匹配

搜索替换

:[range]s[ubstitute]/{pattern}/{string}/[flags]
range       表示多少行,%代表全部
ubstitute   需要替换的文字
pattern     模式
string      替换后的文本
flag        替换标志
    g       表示全局范围执行
    c       表示确认,可以确认或者拒绝修改
    n       匹配到的次数而不替换
模糊替换
:% s/单词/被替换内容/g
准确替换
:% s/\<单词\>/被替换的内容/g

hello world hello 
hello world
hello_world

Visual可视模式

v           进入visual选择
V           选择行
ctrl+v      方块选择
vs          垂直分屏
sp          水平分屏

编辑模式下快速纠错

% s         全局替换
ctrl+h      删除上一个字符
ctrl+w      删除上一个单词
ctrl+u      删除当前行

多文件操作

# buffer
每个文件都是加载到buffer缓冲区中
:ls            查看当前buffer,当前打开的文件
:b n        n代表切换到第几个buffer
:bp            切换buffer
:bl            跳转到最后的buffer
:bf            跳转到第一个buffer
:b name        name是指文件名

# windows
ctrl+w+s     水平分割
ctrl+w+v    垂直分割
:sp            水平分割
:vs            垂直分割
ctrl+w+w    在窗口循环切换
ctrl+w+h    切换左边窗口
ctrl+w+j    切换下边窗口
ctrl+w+k    切换上边窗口
ctrl+w+l    切换右边窗口
ctrl+w+L    把左边窗口切换到右边
ctrl+w+H    把右边窗口切换到左边

# tab
:table[dit]{filename}    在新标签页中打开file_name
ctrl+w+T    把当前窗口移到一个新标签页
:tabc[lose]    关闭当前标签页及其中的所有窗口
:tabo[nly]    只保留活动标签页,关闭所有其他标签页
:tabn[ext]{N} {N}gt    切换到编号为N的标签页
:tabn[ext]    gt        切换下一标签页
:tabp[revious]    gT    切换上一标签页

文本对象

[number]<command>[text object]
    number    表示次数
    command    表示命令d/c/y
    text object    是要操作的文本对象,比如单词w,句子s,段落p
iw    表示inner word 如果键入vim命令,那么首先v将进入选择模式,然后iw将选中当前单词
aw    跟iw一样,但是会选中空格
iW    前后内容,不带空格
aW    前后内容带空格
this is a [word].
this is a [word ].

复制粘贴寄存器

#normal模式
yy    复制
p    粘贴
dd    删除and复制
u    还原
yiw    复制一个单词

# insert模式
复制错乱,因为大部分vimrc都设置了autoindent
:set paste     设置这个复制内容进来不会自动对齐 
:set nopaste 取消 否则自动对齐不生效
:echo has('clipboard')    查看是否支持clipboard 支持1 
:set clipboard=unnamed    设置系统剪切板

寄存器

Vim里操作的是寄存器而不是系统剪切板,这和其他编辑器不同
默认我们使用d或者y的内容都放入了五名寄存器中
用x删除一个字符放到五名寄存器,然后p粘贴可以调换两字符

# 深入寄存器

    通过{register}前缀可以指定寄存器,不指定默认用无名寄存器
    比如使用 "a + yiw 复制一个单词到寄存器a中,"b + dd 删除当前行到寄存器b中

# 除了有名寄存器a-z,Vim还有一些其他常见的寄存器

    复制专用寄存器 "0    使用yy复制的文本会拷贝到复制的寄存器0
    系统剪切板    "+ 可以复制前面加上 "+到系统剪切板
    其他寄存器比如 "% 当前文件名, ".上次插入的文本

Vim宏

# 什么是宏?
    宏可以看成是一系列命令的集合
    我们可以使用宏录制一系列的操作,然后用于回放
    宏可以非常方便地把一系列命令用在多行文本上
# 如何使用宏?        
    Vim使用q来录制,同时也是使用q结束录制
    使用q{register}选择要保存的寄存器,把录制的命令保存其中
    使用@{register}回访寄存器中保存的一系列命令    

# 给所有链接前后加上""
    录制q跟上寄存器的名字 qa
    给链接加上""
    结束录制按q
    选择行,然后@刚刚的寄存器 @a
    多选行,在命令行进行normal的执行
        输入:normal 然后跟上@寄存器 @q回车即可    
https://www.baidu.com/?1
https://www.baidu.com/?2
https://www.baidu.com/?3
https://www.baidu.com/?4
https://www.baidu.com/?5
https://www.baidu.com/?6

Vim补全

ctrl+n ctrl+p    补全单词
ctrl+x ctrl+f    补全文件名
ctrl+x ctrls+o    补全代码,需要开启类型检查,安装插件

# 设置VIM配色主题
:colorscheme 主题名 
ctrl+d        查看当前主题进行设置

# 下载vim主题配置文件
cp 到.vim/colors/ 如果没有这个文件夹自己创建

# 主题
vim-hybird
solarized
gruvbox

linux下新建一个隐藏文件 vim ~/,vimrc

Vim映射

# 什么是映射?
    # VIM映射就是把一个操作映射到另一个操作

# 基本映射指的是normal模式下的映射
    使用map就可以实现映射,比如:
    :map - x                按-就会删除字符
    :map <space> viw        按下空格选中整个单词
    :map <c-d> dd            ctrl+d 删除整行
    :unmap -                取消-的映射 其他也是同理
    vimrc中不需要加:

Vim常用模式normal/visual/insert都可以映射
    用nmap/vmap/imap定义映射
        :vmap \ U    按下\就会将visual模式下的U 把选中的目标转成大小写
        :imap <c-d> <Esc>ddi    在插入模式下删除一行,进入normal模式dd然后在进入插入模式

递归与非递归映射

# 递归映射
    :namp - dd
    :nmap \ -
    这种是递归映射最终是\映射为dd

# map系列的命令有递归的风险
    如果安装插件,插件映射了同一个按键的不同行为,有冲突就会有一个失效
    解决方案就是非递归映射

# 非递归映射
    使用*map对应的nnoremap/vnoremap/inoremap    
    建议任何时候都是用非递归映射,拯救自己和插件作者
    

set pastetoggle=<F2>        "F2进入粘贴模式
let mapleader= ","            "设置lader键 
inoremap <leader>w <ESC>:w<cr>    "在插入模式保存

Vim插件

    # Vim插件是使用Vimscript或者其他语言编写的vim功能扩展
    # 目前Vim有很多插件管理器
        常见的有vim-plug、Vundle、Pathogen、Dein.Vim、volt等