基本操作
查看系统当前的 vim 是否支持剪贴板
在终端输入vim --version | grep clipboard 命令,看到 clipboard 和 xterm_clipboard 前面都是减号 -,所以系统当前的 vim 不支持系统剪贴板。(加号 + 表示支持;减号 - 表示不支持)
-clipboard +jumplist +persistent_undo +virtualedit
-ebcdic -mouseshape +statusline -xterm_clipboard
快捷键
""""""""""""重要功能"""""""""""""""""""""
Ctrl+s 导致了冻屏,无法操作,可以使用 Ctrl + q 恢复
vim中查阅Man手册其实很方便,Shift+k键就成
mx mark,添加标记 x,x 是 a~z 或者 A~Z 之间的任意一个字母
'x 直接定位到标记 x 所在位置
Ctrl + r 恢复(取消)之前的撤销操作【重做,redo
% 括号匹配及切换
"""""""""""""""""光标操作"""""""""""""""""""""""""""
i:在光标所在字符前开始插入
a:在光标所在字符后开始插入
o:在光标所在行的下面另起一新行插入
s:删除光标所在的字符并开始插入
I:在光标所在行的行首开始插入 如果行首有空格则在空格之后插入
A:在光标所在你行的行尾开始插入
O:在光标所在行的上面另起一行开始插入
S:删除光标所在行并开始插入
另外 u 撤销上一步的操作 Ctrl+r 恢复上一步被撤销的操作
w ,b,W,B,e,g,e 以单词为间隔移动光标
w是后移
b是向前
W是后移包含符号的单词
B是前移包含符号的单词
e 移动到单词的尾部
ge 移动到上一个单词的尾部
f移动到本行下一个特定的字母活符号
F移动到本行前一个特定的字母
f和F光标在搜索的字母前,你也可以使用t和T,他的光标在搜索的字母之后
当你使用了f{character}之后,你可以用;向后重复查找,或者使用,向前重复查找
光标移动到首行的行首,按键:gg
光标移动到末行的行首,按键:G / [Shift + G 键]
数字gg 光标定位到数字对应行数的行首
数字G 光标定位到数字对应行数的行首
""""""""""""""""""""""窗口操作"""""""""""""""
<Ctrl-w>s 水平切分
<Ctrl-w>v 垂直切分
<Ctrl-w>c 关闭活动窗口
<Ctrl-w>o 只保留活动窗口,关闭其他所有窗口
"切换窗口
<Ctrl-w>w 窗口间循环切换
<Ctrl-w>h 切换到左边窗口
<Ctrl-w>j
<Ctrl-w>k
<Ctrl-w>l
+ 增加窗口高度
- 减少窗口高度
> 增加窗口宽度
< 减少窗口宽度
= 等分窗口大小
""""""""""""""""""""切换标签页"""""""""""""
:tabedit {filename} 打开新的窗口页
:tabc 关闭当前窗口页
:tabo 只保留当前窗口页
gt gT 分别是切换Tab
{N}gt 切换到编号为{N}的标签页。默认从1开始
""""""""""""""""""寄存器"""""""""""""""""""
:reg 显示所有寄存器的内容。
"":不加寄存器索引时,默认使用的寄存器。
"*:当前选择缓冲区,”*yy把当前行的内容放入当前选择缓冲区。
"+:系统剪贴板。”+yy把当前行的内容放入系统剪贴板。
基本配置
" 控制
set nocompatible "关闭vi兼容
filetype off "关闭文件类型侦测,vundle需要
set fileencodings=utf-8,gbk "使用utf-8或gbk编码方式
syntax on "语法高亮
set backspace=2 "退格键正常模式
set whichwrap=<,>,[,] "当光标到行首或行尾,允许左右方向键换行
set autoread "文件在vim外修改过,自动重载
set nobackup "不使用备份
set confirm "在处理未保存或只读文件时,弹出确认消息
set scrolloff=3 "光标移动到距离顶部或底部开始滚到距离
set history=1000 "历史记录数
"set mouse= "关闭鼠标
"set selection=inclusive "选择包含最后一个字符
"set selectmode=mouse,key "启动选择模式的方式
set mouse=a "启用鼠标
set selection=exclusive
set selectmode=mouse,key
set completeopt=longest,menu "智能补全,弹出菜单,无歧义时才自动填充
set noswapfile "关闭交换文件
set hidden "允许在有未保存的修改时切换缓冲区
"显示
"colorscheme mycolor "选择配色方案
set t_Co=256 "可以使用的颜色数目
set number "显示行号
set cursorline "突出显示当前行
set laststatus=2 "显示状态行
set ruler "显示标尺
set showcmd "显示输入的命令
set showmatch "高亮括号匹配
set matchtime=1 "匹配括号高亮的时间(十分之一秒)
set matchpairs={:},(:) "匹配括号"{}""()"
set hlsearch "检索时高亮匹配项
set incsearch "边检索边显示匹配
set go-=T "去除gvim的toolbar
"格式
"set noexpandtab "不要将tab转换为空格
set shiftwidth=4 "自动缩进的距离,也是平移字符的距离
set tabstop=4 "tab键对应的空格数
set autoindent "自动缩进
set smartindent "智能缩进
"===================按键映射======================
"按键映射的起始字符
let mapleader = '\'
"使用Ctrl-l 和 Ctrl+h 切换标签页
nnoremap <C-l> gt
nnoremap <c-h> gT
"在行末加上分号
nnoremap <silent> <Leader>; :<Esc><End>a<Space>;<Esc><Down>
"保存
nnoremap <C-s> :w<CR>
"替换
nnoremap <C-h> :%s/<C-R>=expand("<cword>")<CR>/<C-R>=expand("<cword>")<CR>
set laststatus=2 " 设置状态栏在倒数第2行
" 设置状态栏格式
"set statusline=%<%F%=%y%m%r%h%w%{&ff}\[%{&fenc}]0x%02B@%040h#%n\(%3l/%3L,%3c\|%3v\)%3p%%
set statusline=%1*\%<%.100F\ "显示文件名和文件路径
set statusline+=%=%2*\%y%m%r%h%w\ %* "显示文件类型及文件状态
set statusline+=%3*\%{&ff}\[%{&fenc}]\ %* "显示文件编码类型
set statusline+=%4*\ row:%l/%L,col:%c\ %* "显示光标所在行和列
set statusline+=%5*\%3p%%\%*
基本语法
map
-
map可以理解为快捷键,im有三种模式,normal,visual,insert,与此对应,nmap,vmap,imap就是在某一模式下的映射。 -
noremap
noremap命令会使其在该map中失效
//由于映射双方都有dd,会无限循环。当执行完O<esc>j后又执行dd(即执行O<esc>jddk)
nmap dd O<esc>jddk
leaders
leader就有点像win键,告诉vim:我要用快捷键了。事实上,我们不关心这个leader是什么,只是需要这么一个“前缀”.
- autocmd
自动命令,是在指定事件发生时自动执行的命令。利用自动命令可以将重复的手工操作自动化,以提高编辑效率并减少人为操作的差错。
- tab
tab标签快捷键
:tabnew [++opt选项] [+cmd] 文件 建立对指定文件新的tab
:tabc 关闭当前的tab
:tabo 关闭所有其他的tab
:tabs 查看所有打开的tab
:tabp 前一个
:tabn 后一个
标准模式下:gt , gT 可以直接在tab之间切换。
let mapleader = "," 设置leader,把逗号设置为mapleader
nnoremap <leader>d dd //只需要按下,d就等于执行了dd
- let g: let b: let l:
通过指令查看内部变量::help internal-variables
buffer-variable b: Local to the current buffer.
window-variable w: Local to the current window.
tabpage-variable t: Local to the current tab page.
global-variable g: Global.
local-variable l: Local to a function.
script-variable s: Local to a |:source|’ed Vim script.
function-argument a: Function argument (only inside a function).
vim-variable v: Global, predefined by Vim.
call
在脚本语句中使用 call 函数名(参数) 在vim命令中使用 :call 函数名(参数)
包管理器 bundle
- 下载并放置在
~/.vim 文件夹
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
~/.vimrc 配置vundle插件
插件有三种类型,对于不同的插件,vundle自动管理和下载插件的时候,有不同的地址填写方法
- Github上vim-scripts仓库的插件:只需要写出repos(仓库)名称
- Github上非vim-scripts仓库的插件:需要写出"用户名/repos名"
- 不在Github上的插件:需要写出git全路径
把下面文件内容填入~/.vimrc 文件,相应的插件填入call vundle#begin() 和call vundle#end() " required 之间。
set nocompatible " be iMproved, required
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 on GitHub repo
Plugin 'tpope/vim-fugitive'
" plugin from http://vim-scripts.org/vim/scripts.html
" Plugin 'L9'
" Git plugin not hosted on GitHub
Plugin 'git://git.wincent.com/command-t.git'
" git repos on your local machine (i.e. when working on your own plugin)
"Plugin 'file:///home/gmarik/path/to/plugin'
" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" Install L9 and avoid a Naming conflict if you've already installed a
" different version somewhere else.
" Plugin 'ascenator/L9', {'name': 'newL9'}
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
- 下载安装相应的插件
- 下载使用 vim 打开文件并执行:
PluginInstall - 安装:通过命令行直接安装
vim +PluginInstall +qall - 插件在仓库的子目录中格式:
Plugin '用户名/插件仓库名',{'rtp': '子目录'} -- rtp: runtimepath
示例: Plugin 'rstacruz/sparkup', {'rtp': 'vim/'} 范例插件在 sparkup/vim 目录下
- 移除不需要的插件
- 编辑 .vimrc 文件移除的你要移除的插件所对应的plugin那一行。
- 保存退出当前的 vim
- 重新打开 vim ,输入命令
PlugClean 。
必备插件安装
配置文件如下
set nocompatible " be iMproved, required
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 on GitHub repo
Plugin 'tpope/vim-fugitive'
" plugin from http://vim-scripts.org/vim/scripts.html
" Plugin 'L9'
" Git plugin not hosted on GitHub
Plugin 'git://git.wincent.com/command-t.git'
Plugin 'scrooloose/nerdtree'
Plugin 'Valloric/YouCompleteMe'
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
" Other visual enhancement
Plugin 'nathanaelkane/vim-indent-guides'
Plugin 'itchyny/vim-cursorword'
Plugin 'connorholyday/vim-snazzy'
" Markdown
Plugin 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install_sync() }, 'for' :['markdown', 'vim-plug'] }
Plugin 'dhruvasagar/vim-table-mode', { 'on': 'TableModeToggle' }
Plugin 'vimwiki/vimwiki'
Plugin 'majutsushi/tagbar'
Plugin 'vim-scripts/taglist.vim'
Plugin 'godlygeek/tabular'
Plugin 'scrooloose/nerdcommenter'
" git repos on your local machine (i.e. when working on your own plugin)
"Plugin 'file:///home/gmarik/path/to/plugin'
" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" Install L9 and avoid a Naming conflict if you've already installed a
" different version somewhere else.
" Plugin 'ascenator/L9', {'name': 'newL9'}
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
""""""""""""""""""basic"""""""""""""""""""""""
" 控制
set nocompatible "关闭vi兼容
filetype off "关闭文件类型侦测,vundle需要
set fileencodings=utf-8,gbk "使用utf-8或gbk编码方式
syntax on "语法高亮
set backspace=2 "退格键正常模式
set whichwrap=<,>,[,] "当光标到行首或行尾,允许左右方向键换行
set autoread "文件在vim外修改过,自动重载
set nobackup "不使用备份
set confirm "在处理未保存或只读文件时,弹出确认消息
set scrolloff=3 "光标移动到距离顶部或底部开始滚到距离
set history=1000 "历史记录数
"set mouse= "关闭鼠标
"set selection=inclusive "选择包含最后一个字符
"set selectmode=mouse,key "启动选择模式的方式
set mouse=a "启用鼠标
set selection=exclusive
set selectmode=mouse,key
set completeopt=longest,menu "智能补全,弹出菜单,无歧义时才自动填充
set noswapfile "关闭交换文件
set hidden "允许在有未保存的修改时切换缓冲区
"显示
"colorscheme mycolor "选择配色方案
set t_Co=256 "可以使用的颜色数目
set number "显示行号
set cursorline "突出显示当前行
set laststatus=2 "显示状态行
set ruler "显示标尺
set showcmd "显示输入的命令
set showmatch "高亮括号匹配
set matchtime=1 "匹配括号高亮的时间(十分之一秒)
set matchpairs={:},(:) "匹配括号"{}""()"
set hlsearch "检索时高亮匹配项
set incsearch "边检索边显示匹配
set go-=T "去除gvim的toolbar
"格式
"set noexpandtab "不要将tab转换为空格
set shiftwidth=4 "自动缩进的距离,也是平移字符的距离
set tabstop=4 "tab键对应的空格数
set autoindent "自动缩进
set smartindent "智能缩进
"=================按键映射======================
"按键映射的起始字符
let mapleader = '\'
"使用Ctrl-l 和 Ctrl+h 切换标签页
nnoremap <C-l> gt
nnoremap <c-h> gT
"在行末加上分号
nnoremap <silent> <Leader>; :<Esc><End>a<Space>;<Esc><Down>
"保存
nnoremap <C-s> :w<CR>
"替换
nnoremap <C-h> :%s/<C-R>=expand("<cword>")<CR>/<C-R>=expand("<cword>")<CR>
""""""""""""""""""nerdtree""""""""""""""""""""
let NERDTreeHighlightCursorline = 1 " 高亮当前行
let NERDTreeShowLineNumbers = 1 " 显示行号
" 忽略列表中的文件
let NERDTreeIgnore = [ '\.pyc$', '\.pyo$', '\.obj$', '\.o$', '\.egg$', '^\.git$', '^\.repo$', '^\.svn$', '^\.hg$' ]
" 启动 vim 时打开 NERDTree
"autocmd vimenter * NERDTree
" 当打开 VIM,没有指定文件时和打开一个目录时,打开 NERDTree
"autocmd StdinReadPre * let s:std_in = 1
"autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
"autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif
" 关闭 NERDTree,当没有文件打开的时候
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | end
" <leader>nt 打开 nerdtree 窗口,在左侧栏显示
map <F2> :NERDTreeToggle<CR>
" <leader>tc 关闭当前的 tab
map <leader>tc :tabc<CR>
" <leader>to 关闭所有其他的 tab
map <leader>to :tabo<CR>
" <leader>ts 查看所有打开的 tab
map <leader>ts :tabs<CR>
" <leader>tp 前一个 tab
map <leader>tp :tabp<CR>
" <leader>tn 后一个 tab
map <leader>tn :tabn<CR>
""""""""""""youcompleleme""""""""""""""""""""
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py'
let g:ycm_min_num_of_chars_for_completion = 2 " 输入第 2 个字符开始补全
let g:ycm_seed_identifiers_with_syntax = 1 " 语法关键字补全
let g:ycm_complete_in_comments = 1 " 在注释中也可以补全
let g:ycm_complete_in_strings = 1 " 在字符串输入中也能补全
let g:ycm_collect_identifiers_from_tag_files = 1 " 使用 ctags 生成的 tags 文件
let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 注释和字符串中的文字也会被收入补全
let g:ycm_cache_omnifunc = 0 " 每次重新生成匹配项,禁止缓存匹配项
let g:ycm_use_ultisnips_completer = 0 " 不查询 ultisnips 提供的代码模板补全,如果需要,设置成 1 即可
let g:ycm_show_diagnostics_ui = 0 " 禁用语法检查
let g:ycm_key_list_select_completion = ['<Down>'] " 选择下一条补全,Default: ['<TAB>', '<Down>']
let g:ycm_key_list_previous_completion = ['<Up>'] " 选择上一条补全,Default: ['<S-TAB>', '<Up>']
let g:ycm_key_list_stop_completion = ['<Enter>'] " 中止此次补全,Default: ['<C-y>']
"""""""""""""""""""vim-airline"""""""""""""""
let g:airline_powerline_fonts = 1 " 使用 powerline 打过补丁的字体
let g:airline#extensions#tabline#enabled = 1 " 开启 tabline
let g:airline#extensions#tabline#buffer_nr_show = 1 " 显示 buffer 编号
let g:airline#extensions#ale#enabled = 1 " enable ale integration
" 状态栏显示图标设置
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
let g:airline#extensions#tabline#left_sep = ' '
let g:airline#extensions#tabline#left_alt_sep = '|'
let g:airline#extensions#tabline#formatter = 'default'
" 切换 buffer
nnoremap [b :bp<CR>
nnoremap ]b :bn<CR>
" 关闭当前 buffer
noremap <C-x> :w<CR>:bd<CR>
" <leader>1~9 切到 buffer1~9
map <leader>1 :b 1<CR>
map <leader>2 :b 2<CR>
map <leader>3 :b 3<CR>
map <leader>4 :b 4<CR>
map <leader>5 :b 5<CR>
map <leader>6 :b 6<CR>
map <leader>7 :b 7<CR>
map <leader>8 :b 8<CR>
map <leader>9 :b 9<CR>
"""""""""""""""im-indent-guide""""""""""""""""""""
let g:indent_guides_guide_size = 1
let g:indent_guides_start_level = 2
let g:indent_guides_enable_on_vim_startup = 1
let g:indent_guides_color_change_percent = 1
silent! unmap <LEADER>ig
autocmd WinEnter * silent! unmap <LEADER>ig
"""""""""""""""""snazzy""""""""""""""""""""""
let g:SnazzyTransparent = 1
color snazzy
""""""""""""""""MarkdownPreview"""""""""""""""""""""""""
let g:mkdp_auto_start = 0
let g:mkdp_auto_close = 1
let g:mkdp_refresh_slow = 0
let g:mkdp_command_for_global = 0
let g:mkdp_open_to_the_world = 0
let g:mkdp_open_ip = ''
let g:mkdp_browser = 'chromium'
let g:mkdp_echo_preview_url = 0
let g:mkdp_browserfunc = ''
let g:mkdp_preview_options = {
\ 'mkit': {},
\ 'katex': {},
\ 'uml': {},
\ 'maid': {},
\ 'disable_sync_scroll': 0,
\ 'sync_scroll_type': 'middle',
\ 'hide_yaml_meta': 1
\ }
let g:mkdp_markdown_css = ''
let g:mkdp_highlight_css = ''
let g:mkdp_port = ''
let g:mkdp_page_title = '「${name}」'
"""""""""""""""""""""tarbar""""""""""""
let g:tagbar_ctags_bin = 'ctags' " tagbar 依赖 ctags 插件
let g:tagbar_width = 30 " 设置 tagbar 的宽度为 30 列,默认 40 列
let g:tagbar_autofocus = 1 " 打开 tagbar 时光标在 tagbar 页面内,默认在 vim 打开的文件内
let g:tagbar_left = 1 " 让 tagbar 在页面左侧显示,默认右边
"let g:tagbar_sort = 0 " 标签不排序,默认排序
" <leader>tb 打开 tagbar 窗口,在左侧栏显示
"map <leader>tb :TagbarToggle<CR>
map <F3> :TagbarToggle<CR>
""""""""""""tarlist"""""""""""""""
let Tlist_Show_One_File = 1 " 只显示当前文件的tags
let Tlist_GainFocus_On_ToggleOpen = 1 " 打开 Tlist 窗口时,光标跳到 Tlist 窗口
let Tlist_Exit_OnlyWindow = 1 " 如果 Tlist 窗口是最后一个窗口则退出 Vim
let Tlist_Use_Left_Window = 1 " 在左侧窗口中显示
let Tlist_File_Fold_Auto_Close = 1 " 自动折叠
let Tlist_Auto_Update = 1 " 自动更新
" <leader>tl 打开 Tlist 窗口,在左侧栏显示
map <F4>tl :TlistToggle<CR>
""""""""""""'scrooloose/nerdcommenter'
let g:NERDSpaceDelims = 1 " 在注释符号后加一个空格
let g:NERDCompactSexyComs = 1 " 紧凑排布多行注释
let g:NERDDefaultAlign = 'left' " 逐行注释左对齐
let g:NERDAltDelims_java = 1 " JAVA 语言使用默认的注释符号
let g:NERDCustomDelimiters = {'c': {'left': '/*', 'right': '*/'}} " C 语言注释符号
let g:NERDCommentEmptyLines = 1 " 允许空行注释
let g:NERDTrimTrailingWhitespace = 1 " 取消注释时删除行尾空格
let g:NERDToggleCheckAllLines = 1 " 检查选中的行操作是否成功
参考文献
- [VIM] VIM 实用插件整理
- VIM学习笔记
- vimrc-example/vimrc
|