vim 总结

vim 总结:

vim 辅助记忆神图:

vim 辅助记忆神图

进入Vim自带的教程里

$ vimtutor

检查vim支持的功能

$ vim --version

注意:Mac 自带的 Vim 不支持复制内容到剪切板

光标快速移动

  • h, j, k, l : 左,下,上,右
  • w : 光标移动至下一单词首位
  • b : 光标移动至当前单词首位,如果光标已经在当前单词首位,就移动到前一单词首位
  • e : 光标移动至当前单词末位,如果光标已经在当前单词末位,就移动到下一单词末位
  • $ : 光标移动至行末
  • ^ : 光标移动至行首
  • gg : 光标移动至文本首行
  • Shift + G : 光标移动至文本尾行
  • 27 + Shift + G : 光标移动至文本第27行
  • Ctrl + f : 向下翻页
  • Ctrl + b : 向上翻页
  • 2 + Ctrl + f : 向下翻2页

插入

  • i : 进入编辑模式,在当前光标处插入文本
  • o : 进入编辑模式,在当前光标的下方插入新一行
  • a : 进入编辑模式,在下一光标处追加文本
  • s : 进入编辑模式,删除字符并插入

缩进

  • << : 向左缩进
  • >> : 向右缩进

删除

  • x : 删除光标处的字符
  • X : 删除光标处前面的字符
  • D : 删除至本行行末
  • d$ : 删除至本行行末
  • d^ : 删除至本行行首
  • d0 : 删除至本行行首
  • dl : 删除光标处的字符
  • dh : 删除光标前一个字符
  • dd : 删除光标所在行
  • 3dd : 删除3行
  • dw : 删除到下一个单词开头
  • de : 删除到本单词末尾
  • dE : 删除到本单词末尾包括标点在内
  • db : 删除到前一个单词
  • dB : 删除到前一个单词包括标点在内
  • dG : 删除到文本末尾

查找与替换

  • f + 字符 : 在当前行的光标之后查找字符
  • F + 字符 : 在当前行的光标之前查找字符
  • /word : 全文查找 word
  • /.word : 向后搜索 word
  • ?.word : 向前搜索 word
  • n : 查找下一处
  • N : 查找上一处
  • r + c : 将光标所在的字符替换成 c
  • :s/foo/bar : 光标所在行的第一个 foo 替换为 bar
  • :1,50s/foo/bar/ : 在第1行和第50行之间(含)进行搜索和替换
  • :45s/foo/bar/ : 仅仅在第45行进行搜索和替换
  • :%s/foo/bar/g : 全文查找 foo 并替换为 bar
  • :%s/foo/bar/gc : 全文查找 foo 并替换为 bar,替换时询问

    y/n/a/q/l/^E/^Y :

    • y表示同意当前替换;
    • n表示不同意当前替换;
    • a表示替换当前和后面的并且不再确认;
    • q表示立即结束替换操作;
    • l表示把当前的替换后结束替换操作;
    • ^E向上滚屏,用来帮助查看前后内容以决定进行操作;
    • ^Y向下滚屏,用来帮助查看前后内容以决定进行操作。

多行查找替换

将 foo 替换成 bar

1
2
3
Shift + V
// 方向键选中需要查找替换的内容,输入:,vim会自动补全 :'<,'
:'<,'>s/foo/bar/g>

选中

  • v + i + w : 选中当前光标所在的单词 (iw: inner word)
  • v + b : 选中当前光标到当前单词的开头
  • v + w : 选中当前光标到当前单词的末尾
  • ggVG : 全选

    解释:

    gg 让光标移动到首行
    V  进入Visual(可视)模式
    G  光标移到最后一行
    

可视模式下(Visual) 选中内容进行以下操作了的含义:

  • d : 删除选中内容

  • y : 复制选中内容到0号寄存

复制粘贴

  • yy : 复制光标所在行的内容
  • p : 粘贴到光标所在行
  • +y : 复制选中内容到+寄存器,也就是系统剪贴板,供其他程序使用(在Mac下不可用,因为Mac的Vim不支持剪贴板,可使用以下命令替代)
  • :w !pbcopy : 复制选中内容到+寄存器,也就是系统剪贴版,供其他程序使用
  • +p : 粘贴系统剪贴板的内容(在Mac下不可用,因为Mac的Vim不支持剪贴板,可使用以下命令替代)
  • :r !pbpaste : 粘贴系统剪贴板的内容

其他

  • u : 撤销
  • U : 行内撤销
  • Ctrl + r : 取消撤销
  • :!ls : 等同于在 Shell 终端执行 ls 命令。

自定义快捷键

Vim 通过 map 自定义快捷键,map 是一个映射命令,将常用的很长的命令映射到一个新的功能键上。

对于 map 而言,可能有这么几种前缀:

  • nore : 表示非递归。 递归的映射,其实很好理解,也就是如果键a被映射成了b,c又被映射成了a,如果映射是递归的,那么c就被映射成了b。
  • n : 表示在普通模式下生效
  • v : 表示在可视模式下生效
  • i : 表示在插入模式下生效
  • c : 表示在命令行模式下生效

命令格式:

:map {lhs} {rhs}

其含义是,在 :map 作用的模式中把键系列 {lhs} 映射为 {rhs}{rhs} 可进行映射扫描,也就是可递归映射.

\和mapleader变量

mapleader变量对所有map映射命令起效,它的作用是将参数<Leader>替换成mapleader变量的值,可以用来自定义快捷键的前缀。

  • let mapleader=";" : 自定义快捷键的前缀为;

支持系统剪贴板的复制粘贴

1
2
3
4
let mapleader=";"
vmap <Leader>y :w !pbcopy<CR><CR>
nmap <Leader>y :w !pbcopy<CR><CR>
nmap <Leader>p :r !pbpaste<CR><CR>

.vimrc 进行如上配置后,就支持以下的2个命令了:

  • ;y : 复制内容到剪贴板
  • ;p : 粘贴剪贴板的内容

支持移动文本到上/下一行

1
2
3
4
5
6
nnoremap <C-j> :m .+1<CR>==
inoremap <C-j> <Esc>:m .+1<CR>==gi
vnoremap <C-j> :m '>+1<CR>gv=gv
nnoremap <C-k> :m .-2<CR>==
inoremap <C-k> <Esc>:m .-2<CR>==gi
vnoremap <C-k> :m '<-2<CR>gv=gv

.vimrc 进行如上配置后,就支持快捷键上下移动文本了:

  • Ctrl + j : 移动文本到下一行
  • Ctrl + k : 移动文本到上一行

键表

<k0> - <k9>     : 小键盘 0 到 9 
<S-...>     : Shift+键 
<C-...>     : Control+键 
<M-...>     : Alt+键 或 meta+键 
<A-...>         : 同 <M-...> 
<Esc>         : Escape 键 
<Up>        : 光标上移键 
<Space>     : 插入空格 
<Tab>         : 插入Tab 
<CR>         : 等于<Enter>

插件管理

pathogen

使用 pathogen 来管理插件会非常的方便,可以让每一个插件占有一个单独的目录,解决了文件分散的问题。只需要将要安装的所有插件放在 ~/.vim/bundle 目录下即可,如果要删除某个插件,只需要将 ~/.vim/bundle 目录下对应的插件目录删除即可,通常使用 git clone 的方式安装插件。

vundle

Vundle 可以说是 pathogen 的升级版,把 git 操作整合进去,进一步简化了操作,用户需要做的只是去 GitHub 上找到自己想要的插件的名字,安装、更新和卸载由 vundle 来完成。

插件的安装目录是:~/.vim/bundle

在 vim 里面运行以下命令来安装插件:

1
2
:so ~/.vimrc // reload vimrc
:PluginInstall

其他命令:

  • 打开doc : :h vundle
  • 更新插件 : :PluginUpdate
  • 清空全部没有在.vimrc中配置的插件 : :PluginClean
  • 清空没有使用的插件 : :PluginClean!
  • 列出所有插件 : PluginList
  • 查找插件 : PluginSearch

vim-plug

vim-plugvundle 升级版,支持并行安装插件,异步加载插件,配合 NeoVim 可以安装一些比较高级的插件。

vim 常用插件列表

插件命令

vim-markdown-toc

  • :GenTocGFM : 生成 GFM (Github Flavored Markdown) 风格的目录
  • :GenTocRedcarpet : 生成 Redcarpet 风格的目录
  • :GenTocGitLab : 生成 GitLab 风格的目录
  • :UpdateToc : 手动更新目录
  • :RemoveToc : 手动删除目录

插件快捷键

nerdtree

NERDTree 快捷键辑录

  • Ctrl + n : 打开/关闭 nerdtree(自定义的map)
  • Ctrl + w + w : 左右切换窗口

.vimrc 配置

以下是我的 vim 配置:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => General
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
syntax on " 语法高亮
filetype plugin on " 根据不同的文件类型语言加载不同插件(如,C++ 的语法高亮插件与python的不同)
set nocompatible " 关闭兼容模式
set number " 显示行号
set autoindent " 自动对齐
set smartindent " 智能对齐
set showmatch " 括号匹配模式
set ruler " 显示状态行
set incsearch " 查询时非常方便,如要查找book单词,当输入到/b时,会自动找到 第一个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的单词,依次类推,进行查找时,使用此设置会快速找到答案,当你找要匹配的单词时,别忘记回车.
set cindent " C语言格式对齐
set nobackup " 不要备份文件
set clipboard+=unnamed " 共享剪贴板
" 1 tab == 4 spaces
set tabstop=4
set shiftwidth=4
" 高亮显示当前行/列
set cursorline
" set cursorcolumn
" 与剪贴板共享复制粘贴
let mapleader=";"
vmap <Leader>y :w !pbcopy<CR><CR>
nmap <Leader>y :w !pbcopy<CR><CR>
nmap <Leader>p :r !pbpaste<CR><CR>
" 上移或下移一行
nnoremap <C-j> :m .+1<CR>==
inoremap <C-j> <Esc>:m .+1<CR>==gi
vnoremap <C-j> :m '>+1<CR>gv=gv
nnoremap <C-k> :m .-2<CR>==
inoremap <C-k> <Esc>:m .-2<CR>==gi
vnoremap <C-k> :m '<-2<CR>gv=gv
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => pathogen
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
execute pathogen#infect()
filetype plugin indent on
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Vundle & Plugins
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
filetype off " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')
" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'
" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
Plugin 'godlygeek/tabular'
Plugin 'plasticboy/vim-markdown'
Plugin 'mzlogin/vim-markdown-toc'
Plugin 'altercation/vim-colors-solarized'
"Plugin 'dbgx/lldb.nvim'
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Plugin Settings
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" vim-markdown
let g:vim_markdown_folding_disabled = 1
" vim-instant-markdown
" vim-instant-markdown 不能使用vundle安装,只能使用npm手动安装
set shell=bash\ -i
"solarized theme
syntax enable
set background=dark
"set background=light
colorscheme solarized
" lldb.nvim
"set rtp+=/path/to/lldb.nvim
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => vim-plug
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if empty(glob('~/.vim/autoload/plug.vim'))
silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
" Specify a directory for plugins
" - For Neovim: ~/.local/share/nvim/plugged
" - Avoid using standard Vim directory names like 'plugin'
call plug#begin('~/.vim/plugged')
Plug 'dbgx/lldb.nvim'
Plug 'scrooloose/nerdtree'
" lldb.nvim
set rtp+=/path/to/lldb.nvim
" nerdtree
map <C-n> :NERDTreeToggle<CR>
" Initialize plugin system
call plug#end()
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => 一键编译
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
map <F5> :call Run()<CR>
func! Run()
exec "w"
exec "!g++ -Wall % -o %<"
exec "!./%<"
endfunc

热评文章