差别
这里会显示出您选择的修订版和当前版本之间的差别。
blog:vim:vim_trainning [2022/01/09 22:18] – 创建 wikiadmin | blog:vim:vim_trainning [2022/01/09 22:20] (当前版本) – 外部编辑 127.0.0.1 | ||
---|---|---|---|
行 1: | 行 1: | ||
- | d | + | # Vim使用经验 |
+ | |||
+ | |||
+ | [我的vim配置文件](https:// | ||
+ | |||
+ | |||
+ | # 缓冲区 | ||
+ | |||
+ | 查看vim当前的缓冲区(已打开的文件) | ||
+ | `:ls[!]` 或 `buffers[!]` | ||
+ | |||
+ | 例如: | ||
+ | ``` | ||
+ | :ls! | ||
+ | 1 #h "/ | ||
+ | | ||
+ | 3 %a + " | ||
+ | ``` | ||
+ | unlistted buffer通常用于显示帮助信息, | ||
+ | 编号后面的符号指示buffer的类型: | ||
+ | `u` | ||
+ | `%` | ||
+ | `#` the alternate buffer | ||
+ | `a` the active buffer, | ||
+ | `h` the hidden buffer, | ||
+ | `-` | ||
+ | `=` a readonly buffer | ||
+ | `+` a modified buffer, 被修改尚未保存的buffer | ||
+ | |||
+ | 每个buffer都有一个唯一的编号,可以通过`: | ||
+ | |||
+ | |||
+ | 关于缓冲区的命令 | ||
+ | |||
+ | * `: | ||
+ | * `: | ||
+ | |||
+ | |||
+ | # 移动光标 | ||
+ | |||
+ | *normal模式* | ||
+ | |||
+ | ``` | ||
+ | 行首与行尾: | ||
+ | 0 | ||
+ | ^ | ||
+ | $ | ||
+ | |||
+ | 移动到行内指定字符: | ||
+ | f{char} | ||
+ | F{char} | ||
+ | |||
+ | 在文件中移动: | ||
+ | gg 移动到文件的首行 | ||
+ | G | ||
+ | 在G或者gg前加上数字表示移动到第几行 | ||
+ | {count}% | ||
+ | |||
+ | 按单词移动: | ||
+ | 单词由字母数字下划线组成, | ||
+ | w | ||
+ | b | ||
+ | e | ||
+ | ge 移动到前一个单词的结尾 | ||
+ | W | ||
+ | B | ||
+ | E | ||
+ | gE 移动到前一个字符串的结尾 | ||
+ | |||
+ | |||
+ | % | ||
+ | * | ||
+ | # | ||
+ | |||
+ | gd Goto local Declaration. 如果光标所在位置是一个局部变量,则跳转到该局部变量定义的位置. | ||
+ | gD Goto global Declaration | ||
+ | |||
+ | ``` | ||
+ | |||
+ | |||
+ | # yank | ||
+ | |||
+ | yank的本义是 *猛的一拉* *拽* 的意思, vim用yank来表示复制 | ||
+ | |||
+ | motion的概念: | ||
+ | 当输入命令使光标从一点移动到另外一点, | ||
+ | |||
+ | `[" | ||
+ | x表示寄存器的名字,`: | ||
+ | 寄存器x是可选的,如果不指定x, | ||
+ | |||
+ | 例如: | ||
+ | |||
+ | ``` | ||
+ | y2j | ||
+ | ygg | ||
+ | yG 将复制从当前行到最后一行的内容 | ||
+ | ye 将从当前位置复制到本单词的最后一个字符 | ||
+ | y$ 将从当前位置复制到本行的最后一个字符 | ||
+ | ``` | ||
+ | |||
+ | `[" | ||
+ | 复制[count]行到寄存器x | ||
+ | |||
+ | |||
+ | # 大小写转换 | ||
+ | |||
+ | 将motion命令跨过的字符转换为小写 | ||
+ | ``` | ||
+ | gu{motion} | ||
+ | gU{motion} | ||
+ | ``` | ||
+ | |||
+ | gugu或者guu | ||
+ | gUgU或者gUU | ||
+ | |||
+ | |||
+ | # Visual可视化模式 | ||
+ | |||
+ | 三种visual模式 | ||
+ | |||
+ | * `v` 启动单字符的visual模式, | ||
+ | * `V` 启动行模式的visual模式, | ||
+ | * `Ctrl-v` 启动块visual模式, 按块选择一个区域, | ||
+ | |||
+ | `gv` 启动上一次的visual模式,并选择相同的字符/ | ||
+ | |||
+ | Operating on the Visual mode | ||
+ | |||
+ | 在选择好字符/ | ||
+ | |||
+ | * `~` | ||
+ | * `d` | ||
+ | * `y` | ||
+ | * `< | ||
+ | * `> | ||
+ | * `J` | ||
+ | * `=` | ||
+ | * `I` | ||
+ | * `A` | ||
+ | * `C` | ||
+ | * `r` | ||
+ | |||
+ | 例: 在所有被选中的行尾插入字符 | ||
+ | |||
+ | ``` | ||
+ | < | ||
+ | 输入$到移动到行尾, | ||
+ | |||
+ | 如果不移动到行尾, | ||
+ | 通过I可以在选中块之前插入字符 | ||
+ | ``` | ||
+ | |||
+ | |||
+ | # 录制宏 | ||
+ | |||
+ | 将一串操作录制在一个寄存器中,然后可以回放录制的这个宏,也就是按照录制的顺序重新执行一次那些命令 | ||
+ | |||
+ | ``` | ||
+ | q{0-9a-zA-Z" | ||
+ | q | ||
+ | @{0-9a-zA-Z" | ||
+ | @@ 执行上次replay的宏 [count]次 | ||
+ | |||
+ | ``` | ||
+ | |||
+ | 例如: | ||
+ | |||
+ | > qa 开始录制 | ||
+ | yyp | ||
+ | C-a | ||
+ | q | ||
+ | > | ||
+ | |||
+ | 例如文本中被复制的这一行只有一个数字1, | ||
+ | 如果加上数字前缀,例如100@a,将产生2到101的行 | ||
+ | |||
+ | |||
+ | # 分屏 | ||
+ | |||
+ | *split与vsplit* | ||
+ | |||
+ | ``` | ||
+ | split | ||
+ | vsplit | ||
+ | |||
+ | < | ||
+ | < | ||
+ | < | ||
+ | ``` | ||
+ | |||
+ | |||
+ | # 折叠代码 | ||
+ | |||
+ | 折叠: folding | ||
+ | 所有的折叠命令都以z开头,因为z看起来由点像折叠的意思. | ||
+ | |||
+ | zf is used to create a fold: | ||
+ | `zf{motion}` | ||
+ | `{Visual}zf` | ||
+ | |||
+ | `zd` delete one folder at the cursor(取消光标处的折叠), | ||
+ | 在visual模式下,选中区域内所有的折叠都被取消, | ||
+ | `zD` delete folds recursively | ||
+ | |||
+ | |||
+ | # 有用的技巧 | ||
+ | |||
+ | 当你希望搜索一些已存在的文本,或在所有行里寻找某个用到的单词或短语时, | ||
+ | 你可以简单地使用搜索命令、模式去找到它。但是也有更智能的方法: | ||
+ | |||
+ | > 在normal模式下, 使用 * 命令,可以定位到当前光标所在处的单词,并搜索下一个 | ||
+ | 如果设置了“incsearch”选项,当你还在输入时,Vim将会显示第一个匹配模式的文本。这能迅速显示一个模式错误。 | ||
+ | 如果设置了“hlsearch”选项,Vim将用黄色背景高亮显示所有匹配的模式,让你对搜索命令的结果有个快速概览。它可以显示一个变量在程序代码哪个位置被使用。你甚至不需要移动光标去看匹配的文本。 | ||
+ | |||
+ | 例如 set incsearch set hlsearch | ||
+ | > | ||
+ | |||
+ | 在结构化的文本中还有更多可能性快速移动。Vim有针对C(以及类似语言,如C++和Java)程序的特定命令: | ||
+ | |||
+ | 1. 使用%从一个左括号跳转到与其配对的右括号,或从一个“# | ||
+ | 2. 使用 [{ 跳回当前代码块起始的“{”。 | ||
+ | 3. 使用 gd 从变量的调用跳转到它的局部声明 | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ |