vim编辑器进阶学习(一)

风尘

文章目录

  1. 1. 缓冲区
  2. 2. 标签
  3. 3. 分屏
    1. 3.1. 目录分屏
    2. 3.2. 同步滚屏(help scroll-binding)
    3. 3.3. 调整窗口大小
  4. 4. 会话保存
  5. 5. 快捷键映射
    1. 5.1. 映射模式
    2. 5.2. 映射命令
    3. 5.3. 特殊参数
    4. 5.4. 特殊键符
  6. 6. 插件
    1. 6.1. vim-scripts/Emmet.vim
    2. 6.2. scrooloose/nerdtree
    3. 6.3. luochen1990/rainbow
    4. 6.4. vim-scripts/taglist.vim
    5. 6.5. vim-scripts/ctrlp.vim
    6. 6.6. scrooloose/nerdcommenter
    7. 6.7. jiangmiao/auto-pairs
    8. 6.8. vim-scripts/TagHighlight
    9. 6.9. vim-airline/vim-airline
    10. 6.10. vim-airline/vim-airline-themes
    11. 6.11. ianva/vim-youdao-translater
    12. 6.12. yianwillis/vimcdoc
    13. 6.13. Valloric/YouCompleteMe
    14. 6.14. python-mode/python-mode
    15. 6.15. Chiel92/vim-autoformat
    16. 6.16. w0rp/ale
  7. 7. 文件操作
  8. 8. 其他资料

[TOC]

缓冲区

如同一般编辑器都有的tab标签一样,vim也类似的功能叫buffer(缓冲区),可以通过:help buffer查看详细文档。

常用命令 描述
:ls[flags] 展示所有(指定flags的)buffer
:b[数字/文件名] 切换指定buffer
:sb[数字/文件名] 分割屏幕显示指定buffer
:bn 显示下一个buffer
:bp 显示前一个buffer
:bf 显示第一个buffer
:bl 显示最后一个buffer
:bd[数字] 删除指定buffer
:e[文件名] 编辑文件在新buffer中(当前文件必须保存)
:e![文件名] 强制编辑文件在新buffer中,没有保存文件将丢失
  • :ls命令标识符号(同一列上的符号不可能同时出现)

u列表外缓冲区 (只有使用 [!] 才能看到) |unlisted-buffer|
%当前窗口里的缓冲区
#用 “:e #” 或 CTRL-^ 可切换到的轮换缓冲区
a激活缓冲区: 已载入内存并且可见
h隐藏缓冲区: 已载入内存但是没有窗口显示它|hidden-buffer|
-不可更改的缓冲区,选项 ‘modifiable’ 被关闭。
=只读缓冲区
+已经更改的缓冲区
x有读错误的缓冲区

  • ls[flags] 可以是下面字符的组合,用来限制列出的缓冲区

    +修改过的缓冲区(常用)
    -‘modifiable’ 关闭的缓冲区
    =只读缓冲区
    a激活的缓冲区
    u列表外缓冲区 (覆盖 “!”)
    h隐藏缓冲区
    x有读入错误的缓冲区
    %当前缓冲区(常用)
    #轮换缓冲区

标签

一个标签页可以容纳多个buffer,可以通过切换标签页达到每个标签页做不同的工作。

常用命令 描述
:tabnew 在当前页之后打开带新窗口的标签页
:tabs 显示所有标签页>代表当前窗口,+表示修改过的缓冲区
:tabc[数字] 关闭当前(第几个)标签页,屏幕上只有一个标签页时无法关闭
:tabo 关闭其他标签页
:tabn[数字] 循环显示下一个标签页(转到下几个标签页,首个标签页编号是1)
:tabp[数字] 循环显示上一个标签页(转到下上个标签页,首个标签页编号是1)
:tabfir[st] 显示第一个标签页
:tabl 显示最后一个标签页
:tabf [文件名] 打开新的标签,并编辑指定文件,和:find命令类似(需要设置查找路径set path=.)

分屏

目录分屏

  • 把当前窗口上下分屏,并进行目录浏览:
    :He 在下边分屏浏览目录
    :He! 在上分屏浏览目录

  • 把当前窗口左右分屏,并进行目录浏览:
    Ve 在左边分屏间浏览目录
    Ve! 在右边分屏间浏览目录

同步滚屏(help scroll-binding)

在需要同步滚动的窗口输入:set scb命令,取消同步滚动输入:set noscb命令。默认情况,两窗口偏移量是从当前行开始,可以通过:syncbind命令强制同步偏移量。

调整窗口大小

命令 描述
:res[ize] (+/-)[数字] 调整窗口高度为(加/减)指定行数
:vertical res[ize] (+/-)[数字] 调整窗口宽度为(加/减)指定列数

会话保存

通过:mksession命令可以保存当前编辑器的设置和已打开的文件或标签等以便下次直接打开。

1
2
3
4
5
" 保存会话
:mksession ~/.mysession.vim

" 打开会话
vim -S ~/.mysession.vim

快捷键映射

vim快捷键映射用于改变输入键的含义,:map命令查看所有映射。可以通过help map.txt查看完整文档。

映射模式

  • Normal Mode(普通模式)

    前缀n,表示普通模式下生效,也就是进入vim后的默认模式。即::nmap

  • Visual Mode(可视化模式)

    前缀v,表示在可视模式下生效,也就是进入vim后按v键时的模式。即::vmap

  • Insert Mode(插入模式)

    前缀i,表示在插入模式下生效,也就是进入vim后按i键时的模式。即::imap

  • Command-Line/Ex Mode(命令行模式)

    前缀c,表示在命令行模式下生效,也就是进入vim后按:键的模式。即::cmap

  • Select Mode(选择模式)

    前缀s,表示选择模式下生效,也就是用鼠标拖选区域的时候的模式。gvim下常用的模式。即::smap

  • 普通、可视、选择和操作符等模式
    前缀<Space>,表示这几种模式下均生效。即::map

  • 插入和命令行模式

    后缀!,表示在插入和命令行模式下生效。即::map!

  • 操作符等待模式

    前缀o,表示在操作符等待模式下生效,也就是在操作一个命令时的间隔时间段的模式,一般该模式非常短暂。比如,执行一个命令,此时操作符等待模式被激活,当执行时间较长时可以通过按终止该操作,返回到普通模式。即::omap

  • 非递归映射
    前缀nore,表示非递归映射。map映射默认都是递归映射,即如果键a被映射成了b,c又被映射成了a,那么c就被映射成了b。可与上述模式组合使用。即::noremap

映射命令

:map {lhs} {rhs}
表示将{lhs}映射为{rhs},其中{rhs}可以递归映射。

:unmap {lhs}
表示解除映射

:mapclear
清除所有映射,危险操作,慎用!

{lhs}之前可能显示一个特殊字符:
  * 表示不可重映射
  & 表示脚本的局部映射可以被重映射
  @ 表示缓冲区的局部映射

特殊参数

特殊参数可以按任意顺序使用,但必须紧跟在命令后面,其它任何参数之前。

  • <buffer>

    如果命令后面第一个参数是<buffer>,表示映射将只局限于当前的缓冲区内,当绥中区被删除时,映射也会被删除。如:map <buffer> ,w /[.,;]<CR>

  • <nowait>

    定义局部于缓冲区的映射 “,” 时,可能有另一个全局映射也以 “,” 开始。此时需要键入另一个字符,Vim 才能知道是用 “,” 映射还是更长的那个字符。为了避免这个问题,使用 参数,这样映射一旦匹配就会被使用,Vim 不会等待更多字符的输入。但如果那些字符已经输入了,还是会使用的。

  • <silent>

    定义一个映射时不在命令行上回显该映射。

  • <unique>

    定义新的键映射或者缩写命令的同时检查是否该键已经被映射,如果该映射或者缩写已经存在,则该命令会失败。

  • <Leader>和mapleader变量

    mapleader变量对所有map映射命令起效,它的作用是将参数替换成mapleader变量的值。如:
    :map <Leader>A oanother line<Esc>
    如果mapleader变量没有设置,则用默认的反斜杠代替,因此这个映射等效于:
    :map \A oanother line<Esc>
    如果设置了mapleader变量,如:
    let mapleader = ","
    那么就等效于:
    :map ,A oanother line<Esc>

特殊键符

符号 描述
<k0> - <k9> 小键盘 0 到 9
<S-…> Shift+键
<C-…> Control+键
<M-…> Alt+键 或 meta+键
<A-…> 同 <M-…>
<Esc> Escape 键
<Up> 光标上移键
<Space> 插入空格
<Tab> 插入Tab
<CR> 等于<Enter>
<C-U>前缀 表示在命令模式中删除所有的文本(如:nnoremap <silent> <C-T> :<C-u>Ydc<CR>)

插件

vim-scripts/Emmet.vim

html/css代码生成插件 GitHub

常用配置
1
2
3
4
5
6
7
"-------------------------------------------------------------------------------
" emmet Setting
"-------------------------------------------------------------------------------

" 快捷键 Ctrl+e
let g:user_emmet_expandabbr_key = '<c-e>'
let g:use_emmet_complete_tag = 1

scrooloose/nerdtree

vim导航插件,通过:NERDTree命令打开 GitHub

luochen1990/rainbow

彩虹插件 GitHub

常用配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
"-------------------------------------------------------------------------------
" rainbow Setting
"-------------------------------------------------------------------------------

"0 if you want to enable it later via :rainbowtoggle
let g:rainbow_active = 1
let g:rainbow_conf = {
\ 'guifgs': ['royalblue3', 'darkorange3', 'seagreen3', 'firebrick'],
\ 'ctermfgs': ['lightblue', 'lightyellow', 'lightcyan', 'lightmagenta'],
\ 'operators': '_,_',
\ 'parentheses': ['start=/(/ end=/)/ fold', 'start=/\[/ end=/\]/ fold', 'start=/{/ end=/}/ fold'],
\ 'separately': {
\ '*': {},
\ 'tex': {
\ 'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/'],
\ },
\ 'lisp': {
\ 'guifgs': ['royalblue3', 'darkorange3', 'seagreen3', 'firebrick', 'darkorchid3'],
\ },
\ 'vim': {
\ 'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/', 'start=/{/ end=/}/ fold', 'start=/(/ end=/)/ containedin=vimfuncbody', 'start=/\[/ end=/\]/ containedin=vimfuncbody', 'start=/{/ end=/}/ fold containedin=vimfuncbody'],
\ },
\ 'html': {
\ 'parentheses': ['start=/\v\<((area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)[ >])@!\z([-_:a-za-z0-9]+)(\s+[-_:a-za-z0-9]+(\=("[^"]*"|'."'".'[^'."'".']*'."'".'|[^ '."'".'"><=`]*))?)*\>/ end=#</\z1># fold'],
\ },
\ 'css': 0,
\ }
\}

vim-scripts/taglist.vim

文件标签导航插件 GitHub

vim-scripts/ctrlp.vim

文件查找插件,默认快捷键Ctrl+p GitHub

scrooloose/nerdcommenter

自动注释插件 GitHub
默认快捷键
[count]cc 单行注释

jiangmiao/auto-pairs

括号自动补全插件 GitHub

vim-scripts/TagHighlight

关键字高亮插件 GitHub

vim-airline/vim-airline

状态栏插件 GitHub

常用配置
1
2
3
4
5
6
7
8
9
10
"-------------------------------------------------------------------------------
" airline Setting
"-------------------------------------------------------------------------------

" Integrating with powerline fonts
let g:airline_powerline_fonts = 1
" beautify tab line
let g:airline#extensions#tabline#enabled = 1
" airline Theme
let g:airline_theme = 'bubblegum'

vim-airline/vim-airline-themes

状态栏插件主题 GitHub

ianva/vim-youdao-translater

有道翻译插件 GitHub

常用配置
1
2
3
4
5
6
7
"-------------------------------------------------------------------------------
" 有道翻译 Setting
"-------------------------------------------------------------------------------

vnoremap <silent> <C-T> :<C-u>Ydv<CR>
nnoremap <silent> <C-T> :<C-u>Ydc<CR>
noremap <leader>yd :<C-u>Yde<CR>

在普通模式下,按 ctrl+t, 会翻译当前光标下的单词;
在 visual 模式下选中单词或语句,按 ctrl+t,会翻译选择的单词或语句;
点击引导键再点y,d,可以在命令行输入要翻译的单词或语句;

yianwillis/vimcdoc

vim 文档中文翻译插件 GitHub

Valloric/YouCompleteMe

自动完成插件 GitHub

常用配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
"-------------------------------------------------------------------------------
" youcompleteme Setting
"-------------------------------------------------------------------------------

let g:ycm_max_num_candidates = 10

" python配置
let g:ycm_python_interpreter_path = '/users/windus/.pyenv/shims/python'
let g:ycm_python_sys_path = ['', '/users/windus/.pyenv/versions/3.7.3/lib/python37.zip', '/users/windus/.pyenv/versions/3.7.3/lib/python3.7', '/users/windus/.pyenv/versions/3.7.3/lib/python3.7/lib-dynload', '/users/windus/.pyenv/versions/3.7.3/lib/python3.7/site-packages']
let g:ycm_extra_conf_vim_data = [
\ 'g:ycm_python_interpreter_path',
\ 'g:ycm_python_sys_path'
\]
let g:ycm_global_ycm_extra_conf = '~/global_extra_conf.py'

python-mode/python-mode

python开发插件 GitHub

常用配置
1
2
3
4
5
6
7
8
9
10
11
12
"-------------------------------------------------------------------------------
" python-mode Setting
"-------------------------------------------------------------------------------

" 禁用每行后面带颜色线条
let g:pymode_options_colorcolumn = 0
" 行最大长度提示
let g:pymode_options_max_line_length = 100
" 设置python-mode sys_path
let g:pymode_paths = ['', '/users/windus/.pyenv/versions/3.7.3/lib/python37.zip', '/users/windus/.pyenv/versions/3.7.3/lib/python3.7', '/users/windus/.pyenv/versions/3.7.3/lib/python3.7/lib-dyn load', '/users/windus/.pyenv/versions/3.7.3/lib/python3.7/site-packages']
" run python 快捷键
let g:pymode_run_bind = '<leader>r'

Chiel92/vim-autoformat

代码格式化插件 GitHub

w0rp/ale

语法检查插件 GitHub

文件操作

1
2
:file 显示当前文件名
:file [name] 设置或修改当前文件名

其他资料