控制台运行 vimtutor 这是 vim 官方实操教程 三种模式:
光标的移动
单词级
- w or W 向移动到下一单词开头 ★★
- b or B 向左移动到单词开头 ★★
块级
-
gg 文档第一行,相当于1G ★★★
-
G 文档最后一行,<n>G 移动到你n行 ★★
-
0 或home 到行首(第1列) ★★
-
$ 或end 到行尾 ★
-
:<N> or <n>gg 跳转到第N行 ★★★
-
ctrl-f 屏幕向下移动一页
-
ctrl-b 屏幕向上移动一页
-
<n>j 或者<n>↓ ,向下移动n行,同理,也可以实现左右移动 ★★★
-
v 或者V ,字符选择或者行选择 ★★★
-
ctrl-v 长方形选择,牛逼了 ★★★
注意,所有命令都可以加一个数字N,表示对后面的命令执行N次,比如
<n>G 表示移动到第n行。
高级移动
-
'. 跳到最后修改的那一行
-
gd 跳到当前变量在当前文件的定义处,其实是跳转到当前变量在此文件中第一次出现的地方,不过一般来说,第一次出现的地方也就是变量定义的地方 ★★★
-
ma 在当前位置做标记,用字母a标记当前光标所在位置,这里a可以是任意字母
-
`a 跳到标记a处 ★★
- `` 跳到上一次光标所在处,相当有用 ★★★
打开文件、查找内容
vim中打开文件
-
:e <filename> ,在vim中打开名为filename的文件,如果没有,则创建;
文档内查找
-
* 向后查找光标当前所在单词
-
# 向前查找光标当前所在单词 ★★★
-
/<search> 向后查找指定字符
-
?<search> 向后查找指定字符串
-
n 继续查找下一个 ★★★
-
N 继续查找上一个
匹配查找
vim 中可以使用 % 对 ( 和 ) ,[ 和 ] ,{ 和 } 进行匹配查找,当光标位于其中一个 符号上时,按下 % ,光标会跳到与之匹配的另外一个符号上。
括号匹配,程序员必备
文档的修改与保存
插入
-
a 当前字符后插入 ★★★
-
I 行首插入
-
A 行尾插入
-
o 在下一行插入 ★★★
-
O 在上一行插入 ★★★
-
ctrl-p 插入模式下进行单词补齐,比如有一个变量为fifth_test_day ,那么你只需要敲入部分名之后,就可以按下ctrl-p 自动补全了。★★★
删除
-
x 删除当前字符
-
X 向前删除一个字符,相当于键盘的Back Space 。
-
dd 删除当前行,并将删除内容保存在vim剪贴板 ndd 表示删除光标所在的向下n行。★★
-
dw 删除光标所在位置到下个字的第一个字母
-
daw 删除一个单词,包括词尾空格,实用,不用将光标移动到单词第一个字母,aw 表示a word
-
d<X> 删除指定内容,保存在剪贴板
-
c<X> 删除指定内容,保存在剪贴板,同时进入insert模式
说明,<X>部分是对操作内容的描述,比如,删除一个单词,可以dw或者de,要复制当前位置到行尾内容,可以输入
y$ ,要删除后面3个字符并插入,就输入
c3l 。
复制
-
yy 复制当前行到vim剪贴板 nyy 复制光标向下n行 ★★★
-
y<X> 复制指定内容到剪贴板
粘贴
合并
替换
-
r<X> 将当前字符替换为X ★★★
-
:%s/search>/<replace>/ 查找search内容并替换为replace内容,正则表达来替换,这个命令可以消除所有行位多余的空格::%s/s+$// ★★★
-
<n1>,<n2>s/word1/word2/gc n1/n2都是数字,在n1 行和n2 行之间寻找word1 ,替换为word2 。c 代表confirm ,替换前需要你确认,不加就默认全部替换。n2 用$ 表示时,表示搜索到最后一行。★★★
撤销、重做
-
u 撤销 ★★★
-
ctrl-r 重做 ★★★
-
. 重复前一个操作的意思 ★★★
保存文件
-
:wq or ZZ 保存并退出
-
:x 保存退出
-
:q! or ZQ 强制推出,不保存
-
saveas <newfilename> 文件另存为
编辑
-
ctrl-n Vim自带的补全(按照全文已有输入)★★★
多窗口
-
:sp 切割窗口
-
ctrl-w-j 或者ctrl-w-↓ 跳转窗口
-
:q 或者ctrl-w-q 关闭当前窗口
设置vim
为了让vim使用起来更加得心应手,先做一些简单的配置。
编辑VIM配置文件,可能一开始没有这个文件,不过没关系,直接vi ~/.vimrc 保存这个文件即可。
简单设置vim:
set number """显示行号
set relativenumber """显示相对行号(这个非常重要,慢慢体会)
set hlsearch """搜索结果高亮
set autoindent """自动缩进
set smartindent """智能缩进
set tabstop=4 """设置 tab 制表符所占宽度为 4
set softtabstop=4 """设置按 tab 时缩进的宽度为 4
set shiftwidth=4 """设置自动缩进宽度为 4
set expandtab """缩进时将 tab 制表符转换为空格
filetype on """开启文件类型检测
syntax on """开启语法高亮
关于vim的配置,还可以看强大的vim配置文件,让编程更随意
重复上一次命令
vim有一个特殊的命令. ,你可以用它重复执行上一个命令。我感觉有点像EXCEL中的F4 命令。
缩进
分屏与标签页
分屏方式
-
:split 缩写sp or ctrl-w s 上下分屏
-
:vsplit 缩写vs or ctrl-w v 左右分屏
-
:diffsplit 缩写:diffs diff模式打开一个分屏,后面可以加上{filename}
窗口跳转
-
ctrl-w w 激活下一个窗口
-
ctrl-w j 激活下方窗口
-
ctrl-w k 激活上方窗口
-
ctrl-w h 激活左侧窗口
-
ctrl-w l 激活右侧窗口
插件
采用vim-plug安装、升级、管理插件。
添加 vim-plug 的配置到 ~/.vimrc 中:
- 配置以
call plug#begin() 开始
- 插件列表,以 Plug 命令开头
- 用 call plug#end() 结束,以初始化插件系统
这将会自动开启 filetype plugin indent on 和 syntax enable ,如果不希望这 样,你可以在该配置后重置你的设置,例如:filetype indent off,syntax off
安装vim-plug
先cd ~ ,然后创建mkdir .vim ,接着执行如下命令:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
会在~/.vim文件夹下创建autoload文件夹,同时将下载的plug.vim文件归档到该文件夹下。 下面是官方对~/.vimrc 文件配置的一个Example:
" Specify a directory for plugins
" - For Neovim: ~/.local/share/nvim/plugged
" - Avoid using standard Vim directory names like 'plugin'
call plug#begin('~/.vim/plugged')
" Make sure you use single quotes
" 注意要使用单引号
" Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
" 如果插件在 GitHub 的地址是 https://github.com/junegunn/vim-easy-align
" 可以缩写成下面这样
Plug 'junegunn/vim-easy-align'
" Any valid git URL is allowed
" 或者直接给定插件 git 地址
Plug 'https://github.com/junegunn/vim-github-dashboard.git'
" Multiple Plug commands can be written in a single line using | separators
" 多个 `Plug` 命令可以写在一行,用 `|` 符号分割
Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
" On-demand loading
Plug 'scrooloose/nerdtree',{ 'on': 'NERDTreeToggle' }
Plug 'tpope/vim-fireplace',{ 'for': 'clojure' }
" Using a non-master branch
Plug 'rdnetto/YCM-Generator',{ 'branch': 'stable' }
" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
Plug 'fatih/vim-go',{ 'tag': '*' }
" Plugin options
Plug 'nsf/gocode',{ 'tag': 'v.20150303','rtp': 'vim' }
" Plugin outside ~/.vim/plugged with post-update hook
Plug 'junegunn/fzf',{ 'dir': '~/.fzf','do': './install --all' }
" Unmanaged plugin (manually installed and updated)
Plug '~/my-prototype-plugin'
" Initialize plugin system
call plug#end()
vim-plug常用命令
常用命令
命令 |
说明 |
PlugInstall [name ...] [#threads] |
安装插件 |
PlugUpdate [name ...] [#threads] |
安装或升级插件 |
PlugClean |
清理插件 |
PlugUpgrade |
升级 vim-plug |
PlugStatus |
查看已安装插件的状态 |
怎么使用这些命令呢?
直接vim 之后,进入冒号的命令模式,输入上述命令就可以执行命令了。
FAQ
Q:配置VIM,安装vim-plug插件之后,想要生效通过source ~/.vimrc 命令生效配置,就会报错:E492: Not an editor command: Plug
[root@localhost ~]# source .vimrc
-bash: .vimrc: line 2: syntax error near unexpected token `('
-bash: .vimrc: line 2: `call plug#begin('~/.vim/plugged')'
A:- error while running “source .vimrc” 原因是,我们.vimrc 本身并不是shell文件,而source ~/.vimrc 等价于./.vimrc ,当然后校验shell语法了。看了StackOverflow上的解答才清楚的。
- 可以通过输入
$vim 直接进入vim的命令模式,执行下面命令
:source ~/.vimrc
注意,我这里.vimrc 的位置就是位于~ 目录下,你可以:source /path/to/.vimrc
:so $MYVIMRC
Q:从Win上复制文件时,常常因为换行符出错:
:set fileformat=unix
A: linux的文件换行符为n ,但windows却非要把rn 作为换行符,所以,vim在解析从windows拷贝到linux的的vimrc时,因为遇到无法解析的r,所以报错。
- vim E492: Not an editor command: ^M(使用VIM打开文件一直提示错误)
个人vim配置收藏
参考多人的配置,打造属于自己的Vim配置:
syntax on " 自动语法高亮
set cursorline " 突出显示当前行
set hlsearch " 搜索时高亮显示被找到的文本
set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感
set incsearch " 输入搜索内容时就显示搜索结果
set laststatus=2 " 显示状态栏 (默认值为 1,无法显示状态栏)
set magic " 设置魔术
set nocompatible " 关闭 vi 兼容模式
set number " 显示行号
set paste "解决拷贝的时遇到注释会自动注释后续所有行的问题
set ruler " 打开状态栏标尺
set shiftwidth=4 " 设定 << 和 >> 命令移动时的宽度为 4
set softtabstop=4 " 使得按退格键时可以一次删掉 4 个空格
set smartindent " 开启新行时使用智能自动缩进
set tabstop=4 " 设定 tab 长度为 4
vim配置文件中的注释,末尾用" 隔开即可。保留注释,对于了解配置内容有利。
安装主题
从https://github.com/fatih/molokai 下载molokai.vim文件,放入~/.vim/colors 中。然后在~/.vimrc 文件中加入行colorscheme molokai 即可。
Vim配置参考
"my vim configuration begin
set history=50 " keep 50 lines of command line history
set incsearch " do incremental searching
set showmatch " 设置匹配模式,类似当输入一个左括号时会匹配相应的右括号
set fileencodings=utf-8,ucs-bom,gbk18030,gbk,gb2312,cp936
set encoding=utf-8 "utf-8编码
set number "显示行号
set expandtab "tab自动扩展为空格
set tabstop=4 "tab宽度为4个空格
set shiftwidth=4 "设置缩进4个空格
set foldmethod=marker "设置按标志折叠
set showcmd "设置显示命令
set ignorecase "搜索忽略大小写,取消忽略 :set noic
set hlsearch "搜索高亮
set linebreak "设置单词不跨行
set ruler "显示光标行列信息
syntax enable "使能语法高亮
syntax on "语法高亮
set cindent "cindent是特别针对 C语言语法自动缩进
set cinoptions={2,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
syntax keyword Type_Error ERROR
hi Type_Error ctermfg=1 " 关键字ERROR显示成红色
syntax keyword Type_Warn WARN
hi Type_Warn ctermfg=3 " 关键字WARN显示成黄色
syntax keyword Type_Info INFO
hi Type_Info ctermfg=2 " 关键字INFO显示成绿色
syntax keyword Type_Debug DEBUG
hi Type_Debug ctermfg=6 " 关键字DEBUG显示成蓝色
hi Search ctermfg=5 ctermbg=none " 搜索颜色
hi CursorLine ctermbg=236 cterm=none " 当前行颜色
"my vim configuration end
另外一个人的配置:
"=========================================================================
" DesCRiption: 适合自己使用的vimrc文件,for Linux/Windows,GUI/Console
"
" Last Change: 2015年08月02日 15时13分
"
" Version: 1.0.0
"
"=========================================================================
set nocompatible " 关闭 vi 兼容模式
syntax on " 自动语法高亮
colorscheme molokai " 设定配色方案
set number " 显示行号
set cursorline " 突出显示当前行
set ruler " 打开状态栏标尺
set shiftwidth=4 " 设定 << 和 >> 命令移动时的宽度为 4
set softtabstop=4 " 使得按退格键时可以一次删掉 4 个空格
set tabstop=4 " 设定 tab 长度为 4
set nobackup " 覆盖文件时不备份
set autochdir " 自动切换当前目录为当前文件所在的目录
filetype plugin indent on " 开启插件
set backupcopy=yes " 设置备份时的行为为覆盖
set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感
set nowrapscan " 禁止在搜索到文件两端时重新搜索
set incsearch " 输入搜索内容时就显示搜索结果
set hlsearch " 搜索时高亮显示被找到的文本
set noerrorbells " 关闭错误信息响铃
set novisualbell " 关闭使用可视响铃代替呼叫
set t_vb= " 置空错误铃声的终端代码
" set showmatch " 插入括号时,短暂地跳转到匹配的对应括号
" set matchtime=2 " 短暂跳转到匹配括号的时间
set magic " 设置魔术
set hidden " 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存
set guioptions-=T " 隐藏工具栏
set guioptions-=m " 隐藏菜单栏
set smartindent " 开启新行时使用智能自动缩进
set backspace=indent,eol,start
" 不设定在插入状态无法用退格键和 Delete 键删除回车符
set cmdheight=1 " 设定命令行的行数为 1
set laststatus=2 " 显示状态栏 (默认值为 1,无法显示状态栏)
set statusline= %<%F[%1*%M%*%n%R%H]%= %y %0(%{&fileformat} %{&encoding} %c:%l/%L%)
" 设置在状态行显示的信息
set foldenable " 开始折叠
set foldmethod=syntax " 设置语法折叠
set foldcolumn=0 " 设置折叠区域的宽度
setlocal foldlevel=1 " 设置折叠层数为
" set foldclose=all " 设置为自动关闭折叠
" nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
" 用空格键来开关折叠
" return OS type,eg: windows,or linux,mac,et.st..
function! MySys()
if has("win16") || has("win32") || has("win64") || has("win95")
return "windows"
elseif has("unix")
return "linux"
endif
endfunction
" 用户目录变量$VIMFILES
if MySys() == "windows"
let $VIMFILES = $VIM.'/vimfiles'
elseif MySys() == "linux"
let $VIMFILES = $HOME.'/.vim'
endif
" 设定doc文档目录
let helptags=$VIMFILES.'/doc'
" 设置字体 以及中文支持
if has("win32")
set guifont=Inconsolata:h12:cANSI
endif
" 配置多语言环境
if has("multi_byte")
" UTF-8 编码
set encoding=utf-8
set termencoding=utf-8
set formatoptions+=mM
set fencs=utf-8,gbk
if v:lang =~? '^(zh)|(ja)|(ko)'
set ambiwidth=double
endif
if has("win32")
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
language messages zh_CN.utf-8
endif
else
echoerr "Sorry,this version of (g)vim was not compiled with +multi_byte"
endif
" Buffers操作快捷方式!
nnoremap <C-RETURN> :bnext<CR>
nnoremap <C-S-RETURN> :bprevious<CR>
" Tab操作快捷方式!
nnoremap <C-TAB> :tabnext<CR>
nnoremap <C-S-TAB> :tabprev<CR>
"关于tab的快捷键
" map tn :tabnext<cr>
" map tp :tabprevious<cr>
" map td :tabnew .<cr>
" map te :tabedit
" map tc :tabclose<cr>
"窗口分割时,进行切换的按键热键需要连接两次,比如从下方窗口移动
"光标到上方窗口,需要<c-w><c-w>k,非常麻烦,现在重映射为<c-k>,切换的
"时候会变得非常方便.
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
"一些不错的映射转换语法(如果在一个文件中混合了不同语言时有用)
nnoremap <leader>1 :set filetype=xhtml<CR>
nnoremap <leader>2 :set filetype=css<CR>
nnoremap <leader>3 :set filetype=javascript<CR>
nnoremap <leader>4 :set filetype=php<CR>
" set fileformats=unix,dos,mac
" nmap <leader>fd :se fileformat=dos<CR>
" nmap <leader>fu :se fileformat=unix<CR>
" use Ctrl+[l|n|p|cc] to list|next|previous|jump to count the result
" map <C-x>l <ESC>:cl<CR>
" map <C-x>n <ESC>:cn<CR>
" map <C-x>p <ESC>:cp<CR>
" map <C-x>c <ESC>:cc<CR>
" 让 Tohtml 产生有 CSS 语法的 html
" syntax/2html.vim,可以用:runtime! syntax/2html.vim
let html_use_css=1
" Python 文件的一般设置,比如不要 tab 等
autocmd FileType python set tabstop=4 shiftwidth=4 expandtab
autocmd FileType python map <F12> :!python %<CR>
" 选中状态下 Ctrl+c 复制
vmap <C-c> "+y
" 打开javascript折叠
let b:javascript_fold=1
" 打开javascript对dom、html和css的支持
let javascript_enable_domhtmlcss=1
" 设置字典 ~/.vim/dict/文件的路径
autocmd filetype javascript set dictionary=$VIMFILES/dict/javascript.dict
autocmd filetype css set dictionary=$VIMFILES/dict/css.dict
autocmd filetype php set dictionary=$VIMFILES/dict/php.dict
"-----------------------------------------------------------------
" plugin - bufexplorer.vim Buffers切换
" be 全屏方式查看全部打开的文件列表
" bv 左右方式查看 bs 上下方式查看
"-----------------------------------------------------------------
"-----------------------------------------------------------------
" plugin - taglist.vim 查看函数列表,需要ctags程序
" F4 打开隐藏taglist窗口
"-----------------------------------------------------------------
if MySys() == "windows" " 设定windows系统中ctags程序的位置
let Tlist_Ctags_Cmd = '"'.$VIMRUNTIME.'/ctags.exe"'
elseif MySys() == "linux" " 设定windows系统中ctags程序的位置
let Tlist_Ctags_Cmd = '/usr/bin/ctags'
endif
nnoremap <silent><F4> :TlistToggle<CR>
let Tlist_Show_One_File = 1 " 不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow = 1 " 如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Use_Right_Window = 1 " 在右侧窗口中显示taglist窗口
let Tlist_File_Fold_Auto_Close=1 " 自动折叠当前非编辑文件的方法列表
let Tlist_Auto_Open = 0
let Tlist_Auto_Update = 1
let Tlist_Hightlight_Tag_On_BufEnter = 1
let Tlist_Enable_Fold_Column = 0
let Tlist_Process_File_Always = 1
let Tlist_Display_Prototype = 0
let Tlist_Compact_Format = 1
"-----------------------------------------------------------------
" plugin - mark.vim 给各种tags标记不同的颜色,便于观看调式的插件。
" m mark or unmark the word under (or before) the cursor
" r manually input a regular expression. 用于搜索.
" n clear this mark (i.e. the mark under the cursor),or clear all highlighted marks .
" * 当前MarkWord的下一个 # 当前MarkWord的上一个
" / 所有MarkWords的下一个 ? 所有MarkWords的上一个
"-----------------------------------------------------------------
"-----------------------------------------------------------------
" plugin - NERD_tree.vim 以树状方式浏览系统中的文件和目录
" :ERDtree 打开NERD_tree :NERDtreeClose 关闭NERD_tree
" o 打开关闭文件或者目录 t 在标签页中打开
" T 在后台标签页中打开 ! 执行此文件
" p 到上层目录 P 到根目录
" K 到第一个节点 J 到最后一个节点
" u 打开上层目录 m 显示文件系统菜单(添加、删除、移动操作)
" r 递归刷新当前目录 R 递归刷新当前根目录
"-----------------------------------------------------------------
" F3 NERDTree 切换
map <F3> :NERDTreeToggle<CR>
imap <F3> <ESC>:NERDTreeToggle<CR>
"-----------------------------------------------------------------
" plugin - NERD_commenter.vim 注释代码用的,
" [count],cc 光标以下count行逐行添加注释(7,cc)
" [count],cu 光标以下count行逐行取消注释(7,cu)
" [count],cm 光标以下count行尝试添加块注释(7,cm)
",cA 在行尾插入 /* */,并且进入插入模式。 这个命令方便写注释。
" 注:count参数可选,无则默认为选中行或当前行
"-----------------------------------------------------------------
let NERDSpaceDelims=1 " 让注释符与语句之间留一个空格
let NERDCompactSexyComs=1 " 多行注释时样子更好看
"-----------------------------------------------------------------
" plugin - DoxygenToolkit.vim 由注释生成文档,并且能够快速生成函数标准注释
"-----------------------------------------------------------------
let g:DoxygenToolkit_authorName="Asins - asinsimple AT gmail DOT com"
let g:DoxygenToolkit_briefTag_funcName="yes"
map <leader>da :DoxAuthor<CR>
map <leader>df :Dox<CR>
map <leader>db :DoxBlock<CR>
map <leader>dc a /* */<LEFT><LEFT><LEFT>
"-----------------------------------------------------------------
" plugin – ZenCoding.vim 很酷的插件,HTML代码生成
" 插件最新版:http://github.com/mattn/zencoding-vim
" 常用命令可看:http://nootn.com/blog/Tool/23/
"-----------------------------------------------------------------
"-----------------------------------------------------------------
" plugin – checksyntax.vim JavaScript常见语法错误检查
" 默认快捷方式为 F5
"-----------------------------------------------------------------
let g:checksyntax_auto = 0 " 不自动检查
"-----------------------------------------------------------------
" plugin - NeoComplCache.vim 自动补全插件
"-----------------------------------------------------------------
let g:AutoComplPop_NotEnableAtStartup = 1
let g:NeoComplCache_EnableAtStartup = 1
let g:NeoComplCache_SmartCase = 1
let g:NeoComplCache_TagsAutoUpdate = 1
let g:NeoComplCache_EnableInfo = 1
let g:NeoComplCache_EnableCamelCaseCompletion = 1
let g:NeoComplCache_MinSyntaxLength = 3
let g:NeoComplCache_EnableSkipCompletion = 1
let g:NeoComplCache_SkipInputTime = '0.5'
let g:NeoComplCache_SnippetsDir = $VIMFILES.'/snippets'
" <TAB> completion.
inoremap <expr><TAB> pumvisible() ? "&;C-n>" : "&;TAB>"
" snippets expand key
imap <silent> <C-e> <Plug>(neocomplcache_snippets_expand)
smap <silent> <C-e> <Plug>(neocomplcache_snippets_expand)
"-----------------------------------------------------------------
" plugin - matchit.vim 对%命令进行扩展使得能在嵌套标签和语句之间跳转
" % 正向匹配 g% 反向匹配
" [% 定位块首 ]% 定位块尾
"-----------------------------------------------------------------
"-----------------------------------------------------------------
" plugin - vcscommand.vim 对%命令进行扩展使得能在嵌套标签和语句之间跳转
" SVN/git管理工具
"-----------------------------------------------------------------
"-----------------------------------------------------------------
" plugin – a.vim
"-----------------------------------------------------------------
vim配置总结
参考
- Vim 实操教程(Learn Vim)
- vim环境设定:~/.vimrc(语法高亮等一些的设置)
- 无香花自开-Vim配置
- 那些离了就活不了的 VIM 插件
- Vim 配置入门
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|