vim handbook
差那么点意思啊
记个终端的
1  |  | 
词移动
w
“w” 移动到下一个单词的词首
    This is a line with example text 
      x-->-->->----------------->
       w  w  w    3w
b
“b” 命令向后移动到前一个词的词首
    This is a line with example text 
    <----<--<-<---------<--x
       b   b b    2b      b
e, ge
“e” 命令可以移到下一个单词的词末
“ge” 则移动到前一个单词的末尾
    This is a line with example text 
       <----<----x---->------------>
       2ge   ge     e       2e
移动到行首或行尾
“$” 命令把光标移动到当前行行尾
“^” 命令把光标移动到一行的第一个非空字符
“0” 命令 (零) 移到一行的第一个字符
移动到一个指定的字符
“f” 代表 “Find” (寻找)
“F” 命令用于向左查找
    To err is human.  To really foul up you need a computer. 
    ---------->--------------->
        fh           fy
    To err is human.  To really foul up you need a computer. 
              --------------------->
                       3fl
“t” 表示 “To” (到达)
“Tx” 是这个命令的反向版本
    To err is human.  To really foul up you need a computer. 
               <------------  ------------->
                    Th              tn
这四个命令可以通过 “;” 命令重复,”,” 命令则用于反向重复。无论用哪个命令,光标
永远都不会移出当前行,哪怕这两行是连续的一个句子。
括号匹配
“%” 它能匹配一对括号
如果光标在 “(“ 上,它移动到对应的 “)” 上,反之,如果它在 “)”
上,它移动到 “(“ 上
                        %
                     <----->
            if (a == (b * c) / d) 
               <---------------->
                        %
移动到指定的行
“G” 命令加上一个计数前缀这个命令可以把你送到指定的行
   |   first line of a file   ^
        |   text text text text    |
        |   text text text text    |  gg
    7G  |   text text text text    |
        |   text text text text
        |   text text text text
        V   text text text text    |
            text text text text    |  G
            text text text text    |
            last line of a file    V
“%” 命令, “50%” 移动到文件的中间,”90%” 移到差不多结尾的位置
移动到视野之内的一行,”H” 表示 Home (头),”M” 表示 Middle (中) 而 “L” 表示 Last (尾)
                    +---------------------------+
            H -->   | text sample text          |
                    | sample text               |
                    | text sample text          |
                    | sample text               |
            M -->   | text sample text          |
                    | sample text               |
                    | text sample text          |
                    | sample text               |
            L -->   | text sample text          |
                    +---------------------------+
滚屏
CTRL-U 命令向下滚动半屏
CTRL-D 命令把视窗向下移动半屏
                               +----------------+
                                   | some text      |
                                   | some text      |
                                   | some text      |
    +---------------+              | some text      |
    | some text     |  CTRL-U  --> |                |
    |               |              | 123456         |
    | 123456        |              +----------------+
    | 7890          |
    |               |              +----------------+
    | example       |  CTRL-D -->  | 7890           |
    +---------------+              |                |
                                   | example        |
                                   | example        |
                                   | example        |
                                   | example        |
                                   +----------------+
每次滚一行的命令是 CTRL-E (上滚) 和 CTRL-Y (下滚)
“zz” 命令,光标所在行处于屏幕的中间
“zt” 把光标所在行移动到屏幕的顶部
“zb” 则移动到屏幕的底部
简单查找
查找命令是 “/String”
要查找单词 “include”,使用如下命令:
    /include
要查找下一个匹配可以使用 “n” 命令
查找光标后的第一个 #include:
    /#include
“?” 命令功能与 “/“ 的功能类似,但进行反方向查找:
    ?word
“N” 命令在反方向重复前一次查找,因此,在 “/“ 命令后执行 “N” 命令是反向查找,在
“?” 命令后执行 “N” 命令是正向查找。
历 史 记 录
假设你执行了三个查找命令:
    /one
    /two
    /three
现在,让我们输入 “/“ 启动一次查找,但先不按下回车键。现在按 
把 “/three” 放到你的命令行上。回车就会从当前位置查找 “three”。如果你不回车,继
续按 
    你还可以用 
在 文 本 中 查 找 一 个 单 词
把光标移到那个单词下面使用 “*” 命令。Vim 会取得光标上的
单词并把它作为被查找的字符串
 “#” 命令在反向完成相同的功能。你可以在命令前加一个计数: “3*” 查找光标下单
词第三次出现的地方。
查 找 整 个 单 词
找到以 “the” 结尾的单词
  /the\>
“>“ 是一个特殊的记号,表示只匹配单词末尾。类似地,”<“ 只匹配单词的开头。
这样,要匹配一个完整的单词 “the”,只需: 
/\<the\>
高 亮 匹 配
变量 “nr”。你可以把光标移到 “nr” 下用 “*” 命令,然后用 n 命令一个个遍历
:set hlsearch
:set nohlsearch
使用标记
当你用 “G” 命令跳到另一个地方,Vim 会记住你从什么地方跳过去的。这个位置成为一
个标记,要回到原来的地方,使用如下命令: 
    ``
有 名 字 的 标 记
命令 “ma” 用 a 标记当前的光标位置
你可以在文本中使用 26 个标记 (a 到 z)
要跳到一个你定义的标记,可以使用命令 `{mark},这里 {mark} 是指定义标记的那
个字母。所以,移到标记 a 的命令是: 
    `a
取得所有的标记的列表
:marks
你会注意到有一些特殊的标记,包括:
    '       跳转前的光标位置
    "       最后编辑的光标位置
    [       最后修改的开始位置
    ]       最后修改的结束位置
快 捷 键
有些操作符 - 动作命令由于经常被使用,所以被设置为单字符命令:
    x  表示  dl  (删除当前光标下的字符)
    X  表示  dh  (删除光标左边的字符)
    D  表示  d$  (删除到行尾)
    C  表示  c$  (修改到行尾)
    s  表示  cl  (修改一个字符)
    S  表示  cc  (修改一整行)
替 换 单 个 字 符
“r” 命令不是操作符。它只是等你输入一个字符然后用这个字符替换当前光标上的字符
你可以用 “cl” 命令或者 “s” 命令完成相同的功能,但 “r” 命令不需要使用 
出插入状态:
        there is somerhing grong here
        rT           rt    rw
    There is something wrong here 
可视模式
用 “v” 命令启动可视模式
如果你想对整行做操作,可以使用 “V” 命令来启动可视模式
如果你在可视模式下选中了一些文字,然后你又发现你需要改变被选择的文字的另一端,
用 “o” 命令即可 (提示: “o” 表示 other end),光标会移动到被选中文字的另一端,现
在你可以移动光标去改变选中文字的开始点了。再按 “o” 光标还会回到另一端。
当使用列块可视模式的时候,你会有四个角,”o” 只是把你移到对角上。而用 “O” 则能
移到同一行的另一个角上。
daw
“daw” 的 “d” 是删除操作符。”aw” 是一个文本对象。提示: “aw” 表示 “A Word” (一个
单词),这样,”daw” 就是 “Delete A Word” (删除一个单词)。确切地说,该单词后的空
格字符也被删除掉了 (或者如果在行尾的话,单词前的空格字符)。
编辑另一个文件
:edit foo.txt
文件列表
你可以在启动 Vim 的时候指定一堆文件。例如:
    vim one.c two.c three.c
这个命令启动 Vim 并告诉它你要编辑三个文件。Vim 只显示第一个。等你编辑完第一个
以后,用如下命令可以编辑第二个:
    :next
如果你在当前文件中有未保存的修改,你会得到一个错误信息而无法编辑下一个文件。这
个问题与前一节执行 “:edit” 命令的问题相同。要放弃当前修改:
    :next!
但大多数情况下,你需要保存当前文件再进入下一个。这里有一个特殊的命令:
    :wnext
这相当于执行了两个命令:
    :write
    :next
从一个文件跳到另一个文件
要在两个文件间快速跳转,按 CTRL-^ (美式英语键盘中 ^ 6 的上面)
文件标记
在  03.10  一节,我们介绍过使用 “mx” 命令在文件中增加标记,那只在一个文件中有
效。如果你编辑另一个文件并在那里加了标记,这些标记都是这个文件专用的。这样,每
个文件都有一个自己的标记集,并只能在该文件中使用。
    到此为止,我们都用小写字母的标记。实际上还可以使用大写字母标记,这种标记是
全局的,它们可以在任何文件中使用。例如,你在编辑一个文件 “foo.txt”。在文件的中
间 (50%) 并建立一个 J 标记 (J 表示甲):
    50%mJ
现在编辑文件 “bar.txt” 并在文件的最后一行放一个标记 Y (Y 表示乙):
    GmY
现在你可以使用 “J" 命令跳回到 foo.txt 的中间。或者在另一个文件中输入 "Y” 跳
回到 bar.txt 的末尾。
文件标记会被一直记住直到被重新定义。这样,你可以在一个文件中留下一个标记,然后
任意做一段时间的编辑,最后用这个标记跳回去。
    让文件标记符和对应的位置建立一些关系常常是很有用的。例如,用 H 表示头文件
(Head File),M 表示 Makefile 而 C 表示 C 的代码文件。
要知道一个标记在什么地方,在 “:marks” 命令中加上标记名作为参数即可:
    :marks M
你还可以带多个参数:
    :marks MCP
别忘了你还可以 CTRL-O 和 CTRL-I 在整个跳转序列中前后跳转。
分割窗口
水平分割
:split命令把屏幕分解成两个窗口并把光标置于上面的窗口中:
    +----------------------------------+
    |/* file one.c */                  |
    |~                                 |
    |~                                 |
     one.c============================= 
    |/* file one.c */                  |
    |~                                 |
     one.c============================= 
    |                                  |
    +----------------------------------+
CTRL-W w 命令可以用于在窗口间跳转
垂直分割
要在窗口左边打开新窗口,用这个命令:
    :vsplit
或者
    :vsplit two.c
这个命令的结果如下:
    +--------------------------------------+
    |/* file two.c */   |/* file one.c */  |
    |~                  |~                 |
    |~                  |~                 |
    |~                  |~                 |
     two.c===============one.c============= 
    |                                      |
    +--------------------------------------+
还有一个 “vnew” 命令,用于打开一个垂直分割的新窗口。还有一种方法是:
    :vertical new
用另一个文件分割窗口
:split two.c
要打开窗口编辑一个新文件,可以使用如下命令:
    :new
你可以重复使用 “:split” 和 “:new” 命令建立任意多的窗口。
关 闭 窗 口
以下命令用于关闭窗口:
    :close
关 闭 所 有 其 它 窗 口
如果你已经打开了一整套窗口,但现在只想编辑其中一个,如下命令可以完成这个功能:
    :only
窗口大小
要扩大窗口:
    CTRL-W +
要缩小窗口:
    CTRL-W -
要把一个窗口设置为指定的高度,可以用这个命令:
    {height}CTRL-W _
窗 口 间 跳 转
    CTRL-W h        跳转到左边的窗口
    CTRL-W j        跳转到下面的窗口
    CTRL-W k        跳转到上面的窗口
    CTRL-W l        跳转到右边的窗口
    CTRL-W t        跳转到最顶上的窗口
    CTRL-W b        跳转到最底下的窗口
移动窗口
    CTRL-W K
    CTRL-W H        把当前窗口移到最左边
    CTRL-W J        把当前窗口移到最下边
    CTRL-W L        把当前窗口移到最右边
对所有窗口执行命令
    :qall
这表示 “quit all” (全部退出)。如果任何一个窗口没有存盘,Vim 都不会退出。同时光
标会自动跳到那个窗口,你可以用 “:write” 命令保存该文件或者 “:quit!” 放弃修改。
如果你知道有窗口被改了,而你想全部保存,则执行如下命令:
    :wall
这表示 “write all” (全部保存)。但实际上,它只会保存修改过的文件。Vim 知道保存
一个没有修改过的文件是没有意义的。
    另外,还有 “:qall” 和 “wall” 的组合命令:
    :wqall
这会保存所有修改过的文件并退出 Vim 。
   最后,下面的命令由于退出 Vim 并放弃所有修改:
    :qall!
用 vimdiff 显示文件差异
在命令行中输入如下命令: (不是在 Vim 中)
    vimdiff main.c~ main.c
Vim 会用垂直分割的方式打开两个文件。你只能看到你修改过的地方和上下几行的地方。
     VV                   VV
    +-----------------------------------------+
    |+ +--123 lines: /* a|+ +--123 lines: /* a|  <- 折叠
    |  text              |  text              |
    |  text              |  text              |
    |  text              |  text              |
    |  text              |  changed text      |  <- 修改过的行
    |  text              |  text              |
    |  text              |  ------------------|  <- 删除的行
    |  text              |  text              |
    |  text              |  text              |
    |  text              |  text              |
    |+ +--432 lines: text|+ +--432 lines: text|  <- 折叠
    |  ~                 |  ~                 |
    |  ~                 |  ~                 |
     main.c~==============main.c============== 
    |                                         |
    +-----------------------------------------+
改变大小写
~ 改变当前字母
你手头有一个分节标题全部是小写的。你想把全部 “section” 改成大写的。这可以用
“gU” 操作符。先在第一列执行:
                         gUw
    section header      ---->      SECTION header
“gu” 的作用正好相反:
                         guw
    SECTION header      ---->      section header
你还可以用 “g“ 来交换大小写。所有这些命令都是操作符,所以它们可以用于 “动作”g~” 则是 “g~~”。例如:
命令,文本对象和可视模式。
    要让一个操作符作用于当前行,可以执行这个操作符两次。例如,”d” 是删除操作
符,所以删除一行就是 “dd”。相似地,”gugu” 使整一行变成小写。这可以缩成 “guu”。
“gUgU” 可以缩成 “gUU” 而 “g
                            g~~
    Some GIRLS have Fun    ---->   sOME girls HAVE fUN 
单词替换
替换命令可以在全文中用一个单词替换另一个单词:
    :%s/four/4/g
“%” 范围前缀表示在所有行中执行替换。最后的 “g” 标记表示替换行中的所有匹配点。
    如果你有一个像 “thirtyfour” 这样的单词,上面的命令会出错。这种情况下,这
个单词会被替换成 “thirty4”。要解决这个问题,用 “<“ 来指定匹配单词开头:
    :%s/\<four/4/g
显然,这样在处理 “fourteen” 的时候还是会出错。用 “>“ 来解决这个问题:
    :%s/\<four\>/4/g
如果你在编码,你可能只想替换注释中的 “four”,而保留代码中的。由于这很难指定,
可以在替换命令中加一个 “c” 标记,这样,Vim 会在每次替换前提示你:
    :%s/\<four\>/4/gc
| 上 | 下 | 左 | 右 | 
|---|---|---|---|
| j | k | h | l | 
| 命令 | 操作 | 
|---|---|
| ddp | 交换上下行 | 
| yyp | 复制当前行 | 
| gd | 跳到定义 | 
| /def | 跳到下个函数开始的地方 | 
| cf. | 直接修改到下个 . | 
常用设置
设置 syntax on
设置 行号 set nu
设置自动缩进 set autoindent 
:e! 重新加载并且不保存文件
移动
基于单词的移动
1  |  | 
行移动
1  |  | 
行间搜索移动
- 使用 f{char} 可以移动到 char 字符上, t 移动到 char 前一个字符
 - 使用 ; 或 , 继续搜索下一个或上一个
 
单词移动
word: 以非空白符分割的单词
WORD: 以空白符分割的单词
- w/W 移动到下一个 word/WORD 开头, e/E 下一个 word/WORD 尾
 - b/B 回到上一个 word/WORD 开头
 
翻页
- gg 移动到文件开头
 - G 移动到文件结尾
 - ctrl + O 返回到刚刚移动的位置
 - H/M/L 跳转到屏幕的开头, 中间和 结尾
 - ctrl + f, ctrl+u 上下翻页,
 - zz 把屏幕放在中间
 
增
1  |  | 
a 会在当前字母的后面插入
i 会在当前字母的前面插入
o 会打开一个新行
A 在行末添加
I 在行首插入
O 在当前行的上方插入
删除
1  |  | 
d,x 都可以搭配数字执行多次
2dd/2x 删除两行/删除两个字符
dt] del to ], 删除到 ] 的所有内容
d0/d& 快速删除行首和行尾
改
- r replace
 - c change
 - s substitue
 
normal 模式下使用 r 替换一个字符, s 替换并进入插入模式
使用 c 配合文本对象, 可以进行快速修改
1  |  | 
查
1  |  | 
使用 n/N 跳转到下一个或者上一个匹配
翻页
1  |  | 
粘贴复制
1  |  | 
分屏
1  |  | 
搜索和替换
1  |  | 
其它常用命令
设置行号
:set nu
visual 模式
一般用来块状选择文本
normal 模式下使用 v 进入 visual 模式
1  |  | 
快速切换 insert normal 模式
- ctrl + c (可能会中断插件) 或者 ctrl + [
 - gi 快速跳转到最后一次编辑的地方并进入 insert 模式
 
多文件
buffer windows tab
buffer 指打开的文件的一个内存缓冲区
窗口是 buffer 可视化的分割区
tab 是窗口的工作区
文本对象操作方式
[number] <command> [text object]
`[次数] <命令 (delete change yank)>[文本对象 (单词 w, 句子 s, 段落 p)]
复制粘贴和寄存器的使用
Vim 里面剪切 (cut) 复制 (copy) 粘贴 (paste) 分别是 delete/yank/put
normal 模式
normal 模式下复制粘贴分别使用 y(yank) 和 p(put), 剪贴 d 和 p
可以使用 v(visual) 命令选中要复制的地方, 然后使用 p 粘贴
配合文本对象使用:
- yiw 复制一个单词
 - yy 复制一行
 
insert 模式下的复制粘贴
很多人会使用鼠标进行选中, 然后使用 ctrl + v 进行粘贴, 这里和其它编辑器差不多, 但是粘贴代码的时候会有个坑
当设置了 autoindent, 粘贴代码时缩进会混乱
这个时候需要使用 set: paste 和 set: nopaste 解决
寄存器
Vim 操作的是寄存器, 不是系统剪贴板
默认我们使用 d 删除 或者 y 复制的内容都会放到这个 寄存器
使用 x 删除一个字符放到寄存器, 然后使用 p 粘贴, 可以调换两个字符
指定寄存器
通过 “{register}” 前缀可以指定寄存器, 不指定则默认使用无名寄存器
比如, 使用 "ayiw 复制一个单词到寄存器 a 中, "bdd 删除当前行到寄存器 b 中
Vim 中 "" 表示无名寄存器, 缺省使用. ""p 等同于 p
其它一些寄存器
复制专用寄存器 `”0 使用 y 复制文本同时会被拷贝到复制寄存器 0
系统剪贴板 “+ 可以在复制前加上 “+ 复制到系统剪贴板, 可以使用系统剪贴板粘贴到其它地方
"% 当前文件名, “. 上次插入的文本
设置系统剪贴板为默认无名寄存器
set clipboard=unnamed
vim 宏(macro)
什么是宏
宏 是一系列命令的集合
我们可以使用宏 [录制] 一系列操作, 然后用于 [回放]
使用宏
宏的使用分为录制和回放
normal 模式下使用 q 来录制, 同时也是 q 来结束录制
使用 q{register} 选择要保存的寄存器, 把录制的命令保存其中
使用 @{register} 回放寄存器中保存的一系列命令
vim 中的补全
使用 ctrl + n 和 ctrl + p 补全单词
使用 ctrl + x 和 ctrl + f 补全文件名
使用 ctrl + x ctrl + o 补全代码, 需要开启文件类型检查, 安装插件
使用 ctrl + xf 补全文件路径
vim 换色
使用 :colorscheme 显示当前的主题配色, 默认 default
使用 :colorscheme <ctrl + d> 可以显示所有的配色
使用 :colorscheme 配色名可以修改配色
vim 配置
配置文件 ~/.vimrc, 常用设置
idea 和 vscode 输入法自动切换
idea
vscode
使用 im-select
配置 vscode , 在 setting.json 中添加
1  |  |