vi,是一款由加州大学伯克利分校,Bill Joy研究开发的文本编辑器,起初用在 Unix Like 系统。而Vim是从 vi 发展出来的一个文本编辑器,在Vi的基础上改进和增加了很多特性,代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
vim基本使用
1. vim工作四种模式
- 普通模式
- 插入模式
- 可视模式
- 命令行模式
2. 中文帮助手册的安装
- 在下面的网站下载中文帮助的文件包:
$ wget https://jaist.dl.sourceforge.net/project/vimcdoc/vimcdoc/vimcdoc-2.1.0.tar.gz
- 也可以在
https://sourceforge.net/projects/vimcdoc/
页面下载其他版本
- 也可以在
- 解包后进入文件夹进行安装
$ tar zxvf vimcdoc-2.1.0.tar.gz
$ cd vimcdoc-2.1.0
$ sudo ./vimcdoc.sh -i
- 启动vim,输入:help,看看帮助文档是否已经便成中文了?
- 一些注意事项:
- vim中文文档不会覆盖原英文文档,安装后vim默认使用中文文档。若想使用英文文档,可在vim中执行以下命令:
set helplang=en
同理,使用以下命令可重新使用中文文档:
set helplang=cn
- 帮助文件的文本是utf-8编码的, 如果想用vim直接查看, 需要在~/.vimrc中设置:
set encoding=utf-8
- 不想错过学习英语机会的,卸除使用:
$ sudo ./vimcdoc.sh -u
- vim中文文档不会覆盖原英文文档,安装后vim默认使用中文文档。若想使用英文文档,可在vim中执行以下命令:
3. 多文件编辑
- 在shell下使用命令
vim file_1 file_2 …… file_n
:打开多个文件 - 正常模式下使用命令
:e 文件名
在vim中打开新文件 - 正常模式下使用命令
:ls
:所有打开文件列表
:bn
:到下一个文件
:bp
:到上一个文件
:b#
或ctrl-6
:到最近的前一个文件 - 写入配置文件.vimrc中
set autowriteall
:如果讨厌每次打开新文件,vim喋喋不休的要求你保存,那么可以设置自动保存。
4. 多窗口编辑
- 正常模式下使用下面命令或快捷键
:sp 文件名
:横向拆分窗口(多行窗口)。
:vsp 文件名
:纵向拆分窗口(多列窗口)。
ctrl_w_h
:将光标移动到左一个窗口。
ctrl_w_j
:将光标移动到下一个窗口。
ctrl_w_k
:将光标移动到上一个窗口。
ctrl_w_l
:将光标移动到右一个窗口。
ctrl_w_+
:当前窗口尺寸变大。
ctrl_w_-
:当前窗口尺寸变小。
ctrl_w_o
:只显示当前窗口。
5. tab键与空格键转化
- 对于已保存的文件,TAB替换为空格的方法:
:set ts=4 :set expandtab :%retab!
- 对于已保存的文件,空格替换为TAB的方法:
:set ts=4 :set noexpandtab :%retab!
vim插件
1. 插件管理器 — vim-plug
Vim本身并没有提供插件管理功能,在有很多插件的情况下,.vim/vimfile 文件夹下就变得杂乱不堪,管理插件将会很难麻烦;而使用插件管理器则让管理变得方便。
vim插件管理器还是蛮多的,比如vundle、pathogen、neobundle、vim addon manager、vim-plug ,我选择了neobundle(不分好坏,用着顺手就好)
- 下载plug.vim并将它安置在
~/.vim/autoload
目录- 必须是放置在
~/.vim/autoload
目录,其他目录是测试不行$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
- 必须是放置在
-
插件配置
- 编辑
~/.vimrc
,添加vim-plug配置: - 以call plug#begin()开头,begin可以接受参数指定存放插件的位置
- 中间是以Plug开头的插件列表,支持以下功能:
- 允许任何有效的git URL
- 可以使用
|
分隔符在单行中写入多个Plug
命令 - 按需加载
- 以call plug#end()结尾
- 我的插件配置
"==================== Plug-in Management ================== " " set the runtime path to include Vundle and initialize set rtp+=~/.vim/autoload/
" Warning: Make sure you use single quotes
" Specify a directory for plugins
call plug#begin('~/.vim/plug-in')" 目录树、文件浏览插件:NERD tree
Plug 'https://github.com/scrooloose/nerdtree.git';" 自动补全、错误提示
"Plug 'Valloric/YouCompleteMe'" 状态栏(装逼必备)
"Plug 'https://github.com/vim-airline/vim-airline.git';" 超级搜索
Plug 'kien/ctrlp.vim'" 对齐代码的虚线,写Python尤其需要
Plug 'Yggdroot/indentLine'" Initialize plugin system
call plug#end() - 编辑
- 安装配置文件中的插件
重新加载.vimrc并在vim命令行模式执行:PlugInstall
安装插件。
其他命令:PlugInstall [name ...] [#threads]
:安装插件PlugUpdate [name ...] [#threads]
:安装或更新插件lugClean[!]
:删除未使用的目录(bang版本无需提示即可清除)PlugUpgrade
:升级vim-plug本身PlugStatus
:检查插件的状态vim美化状态栏PlugDiff
:检查上次更新和挂起的更改中的更改。PlugSnapshot[!] [output path]
:生成用于恢复插件当前快照的脚本
2. 配置目录树(NERD tree插件)
- 插件简介
NERD tree是一款vim树形文件资源管理器插件。NERD tree可以让你在vim中浏览你的文件系统,打开想要的文件或目录。 - 插件安装
NERD tree插件在上述vim-plug中已安装了,对于手动安装这里不做说明。 - 插件命令
- 命令行模式(command mode)
:NERDTree
:打开新的目录树。可以提供一个路径参数,那么命令将打开以该路径作为根目录的目录树。如果没有路径参数提供,那么当前目录将作为新的目录树的根目录。:NERDTreeToggle
: 如果当前标签已经存在目录树,该命令会重新刷新目录树显示;如果当前标签不存在目录树,该命令作用效果与:NERDTree命令一致。:NERDTreeClose
: 关闭当前标签的目录树。- 为了方便得打开目录树和关闭目录树,我们在
~/.vimrc
中绑定快捷键,将F2映射到:NERDTreeToggle命令的配置如下,之后我们按下F2就可以方便地开关目录树"---------------------- NERD tree插件 ---------------------- " 绑定F2到NERDTreeToggle map <F2> :NERDTreeToggle<CR> " 启用鼠标以便更改窗口宽度 set mouse=a
- 插件快捷键
普通模式(normal mode)下操作
- 插件快捷键
- 文件节点映射(File node mappings)
左键双击 or 回车 or o
: 打开指定文件。go
:打开指定文件,将光标留在目录树中。t
:在新标签中打开文件。T
:在新标签中打开文件,保持鼠标焦点留在当前标签。鼠标中键 or i
:在水平分屏窗口中打开指定文件。gi
:在水平分屏窗口中打开指定文件,将光标留在目录树中。s
:在垂直分屏窗口中打开指定文件。gs
:在垂直分屏窗口中打开指定文件,将光标留在目录树中。- 目录节点映射(Directory node mappings)
左键双击 or 回车 or o
: 打开指定目录。O
:递归打开指定目录。x
:关闭当前节点的父节点。X
:递归关闭当前节点的所有子节点。鼠标中键 or e
:浏览指定目录。- 书签表映射(Bookmark table mappings)
左键双击 or 回车 or o
: 打开指定书签。t
:在新标签中打开书签。T
:在新标签中打开书签,保持鼠标焦点留在当前标签。D
:删除指定书签。- 树形导航映射(Tree navigation mappings)
p
:跳转到根节点。P
:跳转到当前节点的父节点。K
:跳转到当前目录的第一个子节点。J
:跳转到当前目录的最后一个子节点。Ctrl + K
:跳转到当前节点的上一个兄弟节点。Ctrl + J
:跳转到当前节点的下一个兄弟节点。- 文件系统映射(Filesystem mappings)
C
:将当前选择的目录做为树形目录的根节点,即切换当前根目录节点为选择的目录节点。u
:将当前视图中的树根节点上移一层目录,即拿当前树根目录的父目录做为新的根目录。U
:将当前视图中的树根节点上移一层目录,即拿当前树根目录的父目录做为新的根目录,并且保持原树目录状态不变。r
:递归刷新当前目录。R
:递归刷新当前节点。m
:显示菜单。cd
:将CWD切换到当前选择节点的目录。- 树形过滤器映射(Tree filtering mappings)
I
:是否显示隐藏文件开关。f
:是否启用文件过滤器开关。F
:是否显示文件开关。B
:是否显示书签表的开关。- 树形过滤器映射(Tree filtering mappings)
q
:关闭树形目录树窗口。A
:缩放树形目录树窗口。?
:显示帮助文档的开关。
3. 状态栏美化
" ----------------------- 状态栏美化 ----------------------
set laststatus=2 "显示状态栏
set t_Co=256 "在windows中用xshell连接打开vim可以显示色彩
4. 插件推荐
- 插件管理器
- Vundle.vim - 最常用最老牌最简单的Vim插件管理器,缺陷是没法并发执行更新,安装
- dein.vim - 日本人Shougo 写的,也是neobundle.vim的插件管理器的作者 (neobundle基本不维护了), 对比vim-plug, 此插件速度上要少为逊色一些
- vim-plug - 韩国人junegunn (Junegunn Choi) 写的, 目前最快插件管理器,无论是更新,安装,全都是并发的,对,是并发的!!!!
- 自动补全
- neocomplete - 日本人Shougo 写的,比较老牌的自动补全插件,综合体验一般般,需要Vim支持Lua
- 语法错误提示和自动补全:YouCompleteMe (推荐)
- 装逼必备
vim-airline - 各种line已经成为过去,基本 airline 已经实现了统一 ,同时支持各种插件,当然带来的负担就是会导致vim启动慢了一点. 当然如果要用vim装逼的话,这个是必不可少的.
vim配置
vim的配置文件:
~/.vimrc 用户的默认配置文件
~/.vim/plugin/ 用户的默认脚本文件的存放目录
~/.vim/ftplugin/ 用户的默认文件类型相关脚本文件的存放目录
1. 基础配置
-
编辑
~/.vimrc
文件"====================== 基础配置 =========================== set nocompatible "去掉vi的一致性 set backspace=indent,eol,start " -------------------- 界面布局 ------------------------ set showtabline=0 "隐藏顶部标签栏 set guifont=Monaco:h13 "设置字体 set background=dark "设置背景色 set nowrap "折行设置(关闭折行) set whichwrap+=<,>,h,l "允许backspace和光标键跨越行边界 set cmdheight=3 "命令行高度 "隐藏滚动条 set guioptions-=r set guioptions-=L set guioptions-=b "标尺" set scrolloff=6 "上下可视行数 set ruler "右下角显示光标位置的状态行 set cursorline "突出显示当前行 set cursorcolumn "突出显示当前列 "设置行号的颜色和背景(这在设置了colorscheme可能会无效) set number "显示行号 if has("gui_running") highlight LineNr guifg=red "gui模式下字体颜色设置 highlight LineNr guibg=white "gui模式下背景颜色设置 else highlight LineNr ctermfg=brown "彩色终端下字体颜色设置 highlight LineNr ctermbg=153 "彩色终端下背景颜色设置 endif " ------------------- 格式化设置 ----------------------- set fileformat=unix "设置以unix的格式保存文件 set showmatch "高亮显示匹配的括号 set matchtime=10 "匹配括号高亮的时间(单位是十分之一秒) set scrolloff=5 "距离顶部和底部5行 set laststatus=2 "命令行为两行 set fenc=utf-8 "文件编码 set ignorecase "忽略大小写 "格式化设置之制表符 set tabstop=4 "设置tab键的宽度 set shiftwidth=4 "换行时行间交错使用4个空格 set softtabstop=4 set smarttab "开启新行时使用智能 tab 缩进 set list "显示Tab符(2行) set listchars=tab:\|\ ,trail:.,extends:>,precedes:< " 缩进 "set autoindent "设置自动缩进(即每行的缩进值与上一行相等) "set smartindent "设置智能缩进 "set cindent " 使用 C/C++ 语言的自动缩进方式 "set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s "设置C/C++语言的具体缩进方式 " --------------------- 功能设置 ----------------------- set hlsearch "高亮搜索项 set noexpandtab "不允许扩展table syntax on "开启语法高亮 filetype on "检测文件类型 set mouse=a "启用在buffer的任何地方使用鼠标 set selection=exclusive set selectmode=mouse,key " 让配置变更立即生效 autocmd BufWritePost $MYVIMRC source $MYVIMRC
2. vim打造IDE
"======================= 打造IDE =========================
" ---------------------- 自动填充 ---------------------
" 当新建 .py .cc .sh .java等文件时自动调用SetTitle 函数
autocmd BufNewFile *.py,*.sh exec ":call SetTitle()"
" 自动填写注释部分
func SetComment()
call setline(2,"#=============================================")
call setline(3,"# Author: Dream")
call setline(4,"# Time:" .strftime("%F %T"))
call setline(5,"# Name:" .expand("%"))
call setline(6,"# Version: V1.0 ")
call setline(7,"# Description:This is a XXXX.")
call setline(8,"#=============================================")
endfunc
" 根据文件后缀自动填写第一行信息
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#! /bin/bash")
call SetComment()
elseif expand("%:e") == 'py'
call setline(1,"#! /usr/bin/python3")
call SetComment()
endif
endfunc
" ----------------------- 一键运行 ------------------------
"按F5一键编译并运行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!g++ % -DLOCAL -o %<"
exec "!time ./%<"
elseif &filetype == 'cpp'
exec "!g++ % -std=c++11 -DLOCAL -Dxiaoai -o %<"
exec "!time ./%<"
elseif &filetype == 'java'
exec "!javac %"
exec "!time java %<"
elseif &filetype == 'sh'
:!time bash %
elseif &filetype == 'python'
exec "!time python3.5 %"
endif
endfunc