Vim 配置
打印信息
:echo:打印信息,但是信息不会保存:echom:打印信息会保存在:messages中:messages:查看:echom保存的信息
设置选项
设置选项方式
- 命令行一次设置多个选项:
:set number numberwidth=6 - 本地缓冲区设置:
:setlocal nonumber
- 命令行一次设置多个选项:
设置 bool 选项
:set <name>:打开选项:set no<name>:关闭选项:set <name>!:切换选项:set <name>?:查看选项值(返回或no )
设置键值选项
:set <name>=value:设置选项值:set <name>?:查看选项值- 键值选项支持运算:
+=等
statusline 状态栏设置
状态栏代码通用格式:
%-0{minwid}.{maxwid}{item}-:左对齐0:使用”0”填充%=:切换到状态栏右侧%f:文件名%F:完整路径文件名%y:文件类型([text],[python])%Y:文件类型(TEXT,PYTHON)%l:当前行号%L:总行数%v/%V:列号%c:字符列号%p:文件位置百分比%n:buffer number%{&ff}:文件格式(DOS、UNIX)%b:当前字符ACSII码%B:当前字符16进制值%m:modified flag([+],[-]表示不可修改)
设置状态栏显式格式,既可以一行完成配置,也可以分开配置
1
2
3
4
5
6set statusline=%f\ -\ filetype:\ %y
set statusline=%f
set statusline+=%=
set statusline+=%l
set statusline+=/
set statusline+=%L- 中间空格需要用“\“转义,“%%”转义“%”
laststatus:设置状态栏显示模式1:默认值,两个以上窗口才显示2:一直显示
折叠设置
foldmethodmanual:手动折叠选中的行(默认zf触发)marker:{{{` 到 `}}}标记待折叠行(默认za触发)indent:折叠缩进syntax:语法折叠
foldlevel=<num>:设置 indent 折叠起始水平(zm触发),即从<num>水平开始尝试折叠foldlevelstart=<num>:设置文件打开时默认折叠水平-1:初始不折叠
foldcolumn=<num>:用<num>行表示可可折叠状态
一些常用关键字
iskeyword=@,_,48-57,192_255:指定关键字- 下划线
- ASCII 码位在 48-57 之间的字符(
0-9)、192-255之间的字符
conceallevel=0:隐藏等级12
键盘映射
1 | :<mode>map <mark> {lhs} {rhs} |
- 注意:映射后不能跟注释,vim会认为整行都是命令
映射工作模式
- 映射的工作模式可区分 6 种
- normal 模式:输入命令时
- visual 模式:可视区域高亮并输入命令时
- select 模式:类似可视模式,但键入的字符对选择区替换
- operator-pending 模式:操作符等待中
- insert 模式:包括替换模式
- command-line 模式:输入
:、/命令时
映射命令设置
映射命令设置的模式如下,对应都有如下非递归、取消命令
<mode>noremap[!]:非递归映射,即不会在其他映射中再次被展开<mode>unmap[!]:取消映射<mode>mapclear[!]:
|命令|模式| |——-|——-| |
:map|normal、visual、select、operator-pending| |:nmap|normal| |:vmap|visual、select| |:smap|selection| |:xmap|visual| |:omap|operator-pending| |:map!|insert、command-line| |:imap|insert| |:lmap|insert、command-line、Lang-Arg| |:cmap|command-line| |:tmap|终端作业|
特殊参数
映射特殊参数
<buffer>:映射将局限于当前缓冲区- 优先级比全局映射高
- 清除映射时同样需要添加参数
- 可使用
<leader>替代<localleader>可工作,但是不推荐
<nowait>:存在较短映射时,失效以其作为前缀的较长映射<silent>:映射不在命令行上回显<special>:特殊键可以使用<>记法<script>:映射只使用通过以<SID>开头来定义的脚本局部映射来重映射优右值中的字符<unique>:若存在相同命令、缩写则定义失败- 定义局部映射时,同样会检查全局映射
<expr>:映射的右值将被作为表达式被计算
特殊参数说明
- 特殊参数的尖括号
<>是本身具有的,必须紧跟命令后面 - 有些特殊参数在取消映射时同样需注明
- 特殊参数的尖括号
omap
- 应用方法:operator (操作) + operator-pending (移动、范围选择)
预定义的 operator-pending 映射如
w、aw、i(、t,|按键 |操作 |移动 | |———-|———————-|———————-| |dw |删除(delete) |到下一个单词 | |ci( |修改(change) |在括号内 | |yt, |复制 |到逗号前 |
自定义的 operator-pending 映射则需要
选取一定范围:可同时指定开头、结尾(一般通过进入 visual 模式下选择范围)
1
2
3
4
5
6
7" 下个括号内内容
onoremap in( :<c-u>normal! f(vi(<cr>
" 当前括号内容
onoremap il( :<c-u>normal! f)vi(<cr>`
" 选取使用 `===` 标记 markdown 标题
onoremap ih :<c-u>execute "normal! ?^==\\+$\r:nohlsearch\rkvg_"<cr>
onoremap ah :<c-u>execute "normal! ?^==\\+$\r:nohlsearch\rg_vk0"<cr>指定光标位置:光标当前位置为开头、指定位置为结尾
1
2" 移动至 `return` 前一行
onoremap b /return<cr>
leaders、localleader
leader、localleader:作为“前缀”的不常用的按键,后接其他字符作为整体映射
用途
- 避免覆盖太多按键原始功能
- 约定俗成的规范,容易理解
- 方便更改
<leader>、<localleader>作为前缀设置<leader>:对全局映射而设置的映射的前缀<localleader>:只对某类(个)文件而设置的映射的前缀
<leader>和<localleader>除了设置不同以外,没有太大区别,应用场合时约定规范,不是强制性的
<leader>、<localleader>设置1
2
3
4:let mapleader = "-"
:nnoremap <leader>d dd
:let maplocalleader = "\\"
:nnoremap <buffer> <localleader>c I#<esc>- vim 会对
mapleader、maplocalleader进行特殊的处理,不是简单的声明
- vim 会对
Abbreviations 缩写
iabbrev:紧跟缩写输入非关键字后,缩写会替换为相应的完整字符串- 相较于映射
iabbrev用于 insert、replace、command-line 模式iabbrev会注意缩写前后的字符,只在需要的时候替换
iabbrev同样支持特殊参数<buffer>:仅限本地缓冲区
- 相较于映射
1 | " 纠错 |
:set iskeyword?即可查看关键字字符
Autocmd 自动命令
autocmd 使用
autocmd注意事项- 同时监听多个事件,使用
,分隔,中间不能有空格 - 一般同时监听
bufnewfile、bufread,这样打开文件时无论文件是否存在都会执行命令 - 所有事件后面都需要注明适用场景,可用
*表示全部场景,中间也不能有空格 autocmd是定义命令,不是执行命令- 每次执行都会定义命令,而vim 不会忽略重复定义
- 如:
:autocmd bufwrite * :sleep 200m,每次执行时都会重复定义命令
- 同时监听多个事件,使用
缓冲区事件
1
2
3
4autocmd bufnewfile * :write
autocmd bufnewfile *.txt :write
autocmd bufwritepre *.html :normal gg=g
autocdm bufnewfile,bufread *.html setlocal nowrapfiletype 事件(vim 设置缓冲区 filetype 时触发)
1
2
3
4autocmd filetype javascript nnoremap <buffer> <localleader>c i//<esc>
autocmd filetype python nnoremap <buffer> <localleader>c i#<esc>
autocmd filetype javascript :iabbrev <buffer> iff if ()<left>
autocmd filetype python :iabbrev <buffer> iff if:<left>
augroup 自动命令组
自动命令组
1
2
3
4augroup cmdgroup
autocmd bufwrite * :echom "foo"
autocmd bufwrite * :echom "bar"
augroup end注意事项
类似
autocmd,vim 不会忽略重复定义,但是可以通过:autocmd!清除一个组:augroup cmdgroup : autocmd! : autocmd bufwrite :echom “foo” : autocmd bufwrite :echom “bar” :augroup end
Vim安装
安装选项
1 | ./configure --with-features=huge\ |
按照以上命令配置,编译出的Vim版本中是动态支持
+python/dyn和+python3/dyn此时Vim看似有python支持,但是在Vim内部
:echo has("python")和:echo has("python3")都返回0之后无意中尝试去掉对
python的支持,编译出来的Vim就是 可用的python3,不直到为啥