本章我们来学习一些更「高级」的概念
前置任务
上一文我们学习了如何快速使用vim做这些操作
- 打开文件
- 简单地移动光标
- 选择区域/输入内容
- 保存和关闭文件
现在,我们要一起来厘清一些基本的概念,这样后续的操作才会更加顺畅。
键位布局
你可能好奇为什么vim的键位设计是这样的,比如hjkl用来移动光标,Ctrl用来绑定映射,\用来做leader键,@用来调用宏...
直到你看到这块键盘...
因为vi(vim作为vi的改进)的创造者Bill Joy键盘是这样的!
现在的键盘布局和他的是不一样的,但我们可以通过「改键」来实现操作的流畅性~
符号的含义
关于vim文档中使用到的符号,你可以通过 :h notation 来查看帮助文档中所使用的示例符号。
[] # 可选的
[count] # 重复后续command的次数,比如5x,重复五次光标字符删除
["x] # "表示寄存器,x可选[a-zA-Z0-9#%]等字符,"a表示调用寄存器a
# :reg<Enter> 可以查看寄存器情况
# 寄存器存储了一些命令集合
{motion} # motion表示一个光标操作
# w b j k 等都属于一个motion 可以和[count]结合 [count]{motion}
# 可以和操作结合 operator {motion} 比如删除操作db表示delete backwords,向后删除
<BS> # 输入删除键
<Space> # 输入空格键
<Home> # home键
<Enter> # 按下回车键 vimrc文件中使用<CR>
<Tab> # 按下Tab键
<End> # end键
<C-a> # 按下Ctrl + A键
<S-a> # 按下Shift + A键
<M-a> # 按下Alt + A键 或者说Meta + A键
# 这个比较特殊,有的终端本身用到了meta,比如iterm,这时候就需要配置终端允许发送到界面内
# 建议不使用这个键位映射,不然多端可能要重新调试
<F1>-<F12> # 按下F1...F12键
<Up> # 上
<Down> # 下
<Left> # 左
<Right> # 右
注意事项
后续我们配置自己的vim时,有一些坑需要避免再踩
- vim不支持像Ctrl + Shift + A这种组合按键,只支持单命令按键Ctrl + A,Shift + A
- 但是像Shift + A和Meta + A这种组合很多终端(终端毕竟也是软件)有坑,会导致vim获取不到指令
- mac下的Command + A这种组合,被占用的可能性也很大
- 使用 :map :nmap :imap :vmap 等命令可以查看当前的键位映射,有时候我们映射的键位会有冲突,这个几个命令可以用于检查
- 综上所述尽量使用Ctrl作为映射
- 除了Ctrl之外,我们还有键(默认为backslash \)可以用,这个后续再讲。
寻找帮助
用任意一个产品,都要阅读它的帮助手册。比如vscode也是,很多人都不知道可以Ctrl+N/Ctrl+P来移动光标。我们要多使用vim的help。只需要 :h {TEXT} 就可以得到原生的帮助。
:h motion # 第一章我们讲过了motion,可以试着自己看看
:h buffer # buffer是vim处理文件缓存的方式
:h tab # tab和浏览器、vscode的tab一样
:h window # 窗口的概念 和窗口相关的是split,窗口分割
:h # 当然可以打开整个帮助手册
:h z # z命令帮助
在帮助页面,可以使用 :syntax on 打开语法高亮,这样你可以快速找到那些带有链接的字符。找到链接后,有跳转方案可以让你浏览起来更顺畅
# 帮助文档是只读模式,不能使用vim的插入模式,在Normal模式下可以用的命令,在帮助页面也可以用
<C-]> # Ctrl + ] 跳转进入链接页面
<C-o> # Ctrl + o 跳转回到上一次的光标地址
<C-i> # Ctrl + i 跳转回到执行<C-o>之前的光标地址
命令和配置项
所有的配置项都可以通过 :options 查看。配置项指的是你的软件配置,就像你使用word、typora等软件有个人偏好设置一样,vim也有自带的配置选项,这就是配置项。配置项使用 :set 来配置
比如最常见的一些配置
:set number # 显示行号
:set bg=dark # 可选dark light |背景为dark模式
:set nocp # 可选nocp cp |非兼容(兼容vi)模式
:set shiftwidth=4 # 输入tab键入的空格个数,默认为8
:set filetype=javascript # 设置文件类型
命令可以通过Terminal模式执行,比如 :set :h :syntax :filetype :map
:syntax on # 开启语法高亮
:filetype on plugin indent # 自动匹配文件类型
:h map # 打开map的帮助页面
:nmap # 直接执行一个命令,可以查看详情,比如这里是查看nmap配置
:e ~/.config/nvim/init.vim # 打开init.vim文件
hints
在命令行中使用tab可以得到命令补全,命令可选参数可以通过唤醒提示
配置你自己的编辑器
通过 :h usr_05 可以看到vim配置文件的帮助手册。mac上nvim的配置文件地址为 ~/.config/nvim/init.vim 你也可以使用下面的命令来得到配置地址
:echo stdpath('config') # 输出配置地址
:exe 'edit' stdpath('config').'/init.vim' # 编辑配置文件
VimScript是一个脚本语言,我们之前在Terminal模式使用的命令,都是脚本语言的一个内置指令。比如
" VimScript使用"作为注释
set number " 左侧显示行号
设置行号后,可以保存退出(:wq),再重新打开init.vim(vim init.vim),你会看到行号的出现。
我们来配置第一份配置
syntax on " 语法高亮
filetype plugin indent on " 文件格式自动检测
colorscheme delek " 主题色
set number " 显示行号
set rnu " 显示相对行号,凭个人喜好设置
set bg=dark " 黑色背景
set scrolloff=8 " 光标开始滚动的偏移行号(这样就不用在底部滚动)
set shiftwidth=4 " tab宽度
现在你的页面就有了色彩和定制的一些基础功能,不那么枯燥了。
键位映射
仅仅有一些简单的键位还不够支撑我们的需求,而且也不够「酷」。有组合键位之后,我们才能做更多的事情。
" 配置组合键的格式常用的有这些
:nm[ap] {lhs} {rhs}
:vm[ap] {lhs} {rhs}
:im[ap] {lhs} {rhs}
:cm[ap] {lhs} {rhs}
:tm[ap] {lhs} {rhs}
之前我们解释过了[x]表示可选的字符,这里解释一下其他的
- nmap: normal模式下的映射
- vmap: visual模式下的映射
- imap: insert模式下的映射
- cmap: command模式下的映射
- tmap: terminal模式下的映射
- {lhs} left hand side 左表达式
- {rhs} right hand side 右表达式
我们来看几个例子,通过例子来认识一下。
nmap <F1> :h<CR> " F1唤醒帮助
nmap <tab> V> " 缩进单行
vmap <tab> >gv " 缩进选中行 gv表示选中上一个选中的区域
nmap <leader>; A;<Esc>_ " 行末添加分号
最后一个例子,我们用到了 <leader> ,原生的键是 \ ,如果键盘不好按,可以改成
let mapleader = " " " 这里是设置mapleader的字符输入,因此空格字符表示<space>键
nmap <leader>h :h<CR> " 打开帮助菜单
接下来你就可以使用一些简单的键位映射来处理快捷键的问题了。如果你感觉使用Ctrl键位不舒服,或者使用原生的leader键位不舒服,mac系统上可以调整你的键盘布局。键位映射也没有银弹,按自己最舒服的方式来就行了。
总结
第二天,我们了解了这些内容
- vim帮助文档阅读
- vim键位映射
- vim配置文件设置
- leader键
第三天,我们要学习复制/搜索/redo/undo/跳转/跳转列表/多行编辑等稍微智能一点的编辑器功能