本部分笔记可作为速查 CheatSheet
使用 ^_^
![himg](https://i-blog.csdnimg.cn/blog_migrate/49a9d06024d9ec980acc2357d6318f4c.png)
本系列教程共分为以下五个部分:
路径
vim 的工作路径是使用中要格外注意的地方, 简单来说, 终端中的 vim 默认会把终端当前的路径作为其工作路径, 当然我们可以使用 cd
使其工作路径变更
-
:cd [path]
: 设置此次vim的工作目录为path -
:cd %:h
: cd 到当前缓冲区所属目录中 -
:cd ../
: cd 到上一级 -
:pwd
: 显示当前工作路径 -
:lcd [path]
: 设置当前窗口的工作目录为 path(与 cd 不同的是只会改变当前 window 的工作路径, 其他 window 的不受此影响)
vim 为我们提供了一些可以使用的宏用来表示相关路径或文件名称:
-
%:h
: 表示当前文件所在目录的相对工作目录路径(不含文件名及扩展) -
%:p
: 表示当前文件所在目录的绝对路径(含文件名及扩展) -
%:t
: 文件名及扩展 -
%:r
: 移除扩展之后的所有内容 -
%:e
: 扩展名
在使用以上这几种宏时, 我们可以使用 <Tab>
使其自动展开, 有些命令不支持自动展开的话需要使用 expand()
命令
-
echo expand('%:e')
: 打印当前文档扩展名, markdown 是md
-
cd %:h<Tab>
: cd 到当前缓冲区所属目录中, 在最后可以使用<Tab>
进行自动展开 -
e %<Tab>
: 会自动扩展为当前文件含相对工作目录的路径全名
寄存器
寄存器是 vim 的一种特有概念, 其他文本编辑器默认都会用系统剪贴板作为复制粘贴的根据地, 然后 vim 另辟蹊径使用多种不同类型寄存器作为临时内容存储位置. 我们可以在复制粘贴时使用指定的寄存器定制化我们的需求, 也可以在录制宏及使用宏时指定寄存器, 大大地提高了我们的工作效率.
很多刚使用 vim 的人会抱怨无法复制内容到 vim 外或 vim 内, 然后各种搜索如何使 vim 的默认复制操作与剪贴板交互, 最后定义了一大堆按键, 譬如 "*y
, set clipboard=unnamed
, 其实大可不必, 寄存器是 vim 的高效操作方式之一, 接受了这种方式才能更好地利用 vim 来为我们服务(虽然刚开始适应的过程必然是痛苦的)
总的来说 Vim 的删除, 复制与粘贴命令以及定义宏时都会用到众多寄存器中的某一个. 可以通过给命令加 "{register}
前缀的方式指定要用的寄存器. 若不指明, Vim 将缺省使用无名寄存器
-
无名寄存器
所有删除复制粘贴操作如果不显示指明寄存器类型的话使用的都是无名寄存器, 其标志符是
""
. -
复制寄存器
使用
y
复制后内容会被放到复制寄存器及无名寄存器中, 但是复制寄存器是稳定的, 无名寄存器的内容会时刻被重置替换. 其标志符是"0
-
粘贴板寄存器
用于与系统的其他应用中进行复制粘贴交互, 等于系统的剪贴板. 其标识符是
"*
(或"+
) -
黑洞寄存器
所有放入黑洞寄存器的内容全部被丢弃, 相当于完全删除, 不留痕迹, 其标识符是
"_
-
有名寄存器
以单个小写字母命名的寄存器, 可用于自定义存储空间, 一共有 26 个
-
特殊寄存器
-
"%
: 当前文件名 -
"#
: 轮换文件名 -
".
: 上次插入的文本 -
":
: 上次执行的 Ex 命令 -
"/
: 上次查找的模式
-
使用方式
-
""p
: 从无名寄存器中取值进行粘贴 -
"ay
: 将内容复制到有名寄存器a
-
"_y
: 将内容复制到黑洞寄存器, 相当于彻底地删除 -
"ap
: 从自定义寄存器中取出内容进行粘贴 -
"0p
: 从复制寄存器中取出内容进行粘贴, 默认的 p 是从无名寄存器取值 -
"*p
: 从系统粘贴板寄存器中取出内容进行粘贴 -
<C-r>"
: 在插入模式中将无名寄存器的内容粘贴进来 -
<C-r>*
: 在插入模式中将系统粘贴板寄存器的内容粘贴进来 -
<C-r>0
: 在插入模式中将复制寄存器的内容粘贴进来 -
<C-r>%
: 插入当前文件名(因为 "% 寄存器中存储了当前文件名) -
:reg a
: 查看有名寄存器a
的内容 -
:reg *
: 查看粘贴板寄存器*
的内容 -
:reg "
: 查看无名寄存器"
的内容 -
:put a
: 将有名寄存器a
的内容粘贴到当前缓冲区中, 与"ap
不同的是p
用于只能在光标之前或光标之后进行粘贴, 但是put
则会始终将内容粘贴到新的一行上 -
:d a
: 将内容删除到有名寄存器a
中
❝使用 Visual Mode 时, 在选中的文本上使用
p
将直接替换该部分文本(替换后被替换的文本会被放入到无名寄存器中), 可用于解决需要删除然后粘贴但是会影响到无名寄存器的问题
vimdiff
![himg](https://i-blog.csdnimg.cn/blog_migrate/811e41ecd39ab30055a57f8cd021bf66.png)
git 与 vim 可以说是非常好的一对搭档了, 平时在终端中提交 commit 我们都少不了与 vim
打交道, vimdiff 是 vim 提供的专门用于修正 git 冲突文件的一款工具
若想使用 vimdiff 作为冲突修改工具, 需要设置 ~/.gitconfig
的以下项
[diff]
tool = vimdiff
[merge]
tool = vimdiff
在 vimdiff 中, 一共有四个窗口, 上面依次是 LOCAL
, BASE
, REMOTE
, 底部则是一个最终的文件结果窗口, 整个过程我们只需要将光标在最下方窗口上上下移动, 使用 diffget
命令从 LOCAL
, BASE
, REMOTE
中选择需要使用哪一个作为本行的最终结果(当然也可以跳到上面的窗口中使用 diffput 放置结果到底部窗口上
-
:diffget LOCAL
: 选择 LCOAL 作为本行最终结果 -
:diffget REMOTE
: 选择 REMOTE 作为本行最终结果 -
:diffget BASE
: 选择 BASE 作为本行最终结果 -
:diffput [num]
: 放置结果到缓冲区上,num
为缓冲区编号 -
:diffg L
: 这里 vim 为我们做了简略命令, 同样可用于REMTOE
与BASE
上 -
dp/do
: 如果只有两个文件则可以使用dp/do
来替代:diffput/:diffget
-
:ls!
: 显示当前所有缓冲区的号码 -
[c
: conflict, 移动到上一个冲突处 -
]c
: conflict, 移动到下一个冲突处 -
:wqa
: 冲突修复完成保存退出, 如果仍然有文件冲突则进入下一个冲突 -
$git merge --continue
: 冲突全部解决完后在外界终端中使用git merge --continue
继续之前的merge
操作
最后
本文作者 Hanley Lee, 首发于 闪耀旅途, 如果对本文比较认可, 欢迎 Follow
![himg](https://i-blog.csdnimg.cn/blog_migrate/be6ded38973dc58d5794a4c40140b1d6.jpeg)