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
: 向前搜索 wordn
: 查找下一处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
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}
可进行映射扫描,也就是可递归映射.
<Leader>和mapleader变量
mapleader
变量对所有map
映射命令起效,它的作用是将参数<Leader>
替换成mapleader
变量的值,可以用来自定义快捷键的前缀。
-
let mapleader=";"
: 自定义快捷键的前缀为;
支持系统剪贴板的复制粘贴
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
: 粘贴剪贴板的内容
支持移动文本到上/下一行
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 里面运行以下命令来安装插件:
:so ~/.vimrc // reload vimrc
:PluginInstall
其他命令:
- 打开doc :
:h vundle
- 更新插件 :
:PluginUpdate
- 清空全部没有在.vimrc中配置的插件 :
:PluginClean
- 清空没有使用的插件 :
:PluginClean!
- 列出所有插件 :
PluginList
- 查找插件 :
PluginSearch
vim-plug
vim-plug 是 vundle
升级版,支持并行安装插件,异步加载插件,配合 NeoVim 可以安装一些比较高级的插件。
vim 常用插件列表
- vim-markdown : markdown 编辑插件
- vim-colors-solarized : vim 配色
- vim-markdown-toc : 生成markdown目录
- vim-instant-markdown : markdown 预览插件(不能使用vundle安装,只能使用npm手动安装)
- nerdtree : 树型文件管理系统
插件命令
vim-markdown-toc
-
:GenTocGFM
: 生成 GFM (Github Flavored Markdown) 风格的目录 -
:GenTocRedcarpet
: 生成 Redcarpet 风格的目录 -
:GenTocGitLab
: 生成 GitLab 风格的目录 -
:UpdateToc
: 手动更新目录 -
:RemoveToc
: 手动删除目录
插件快捷键
nerdtree
-
Ctrl + n
: 打开/关闭 nerdtree(自定义的map) -
Ctrl + w + w
: 左右切换窗口
.vimrc 配置
以下是我的 vim 配置:
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => 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