【Vim 编辑器 配置指南】订制个人的编辑神器

欲善其事 先利其器

目录

  • 前言
  • Vim 配置
  • Vim 插件
  • 终端机指令

前言

工程师要学习 Vim 编辑器的过程,就跟学习 Java 或 Python 的程序语言一样,是有「门槛效应」。

例如

在学习 Vim 指令之前

最好是已经具备键盘「盲打」的能力,否则指令无法连贯,速度只会比平常更慢。

进阶的「巨集指令」

也是要先熟悉移动与编辑的动作,才能够发挥「用程序来写程序的功能」。

不过 Vim 的配置,没有门槛效应 :

就像初学 Java,变数都懵懂,物件导向更是奇谈。
但并不会妨碍我把 IntelliJ 改成暗色外观。

此次说明的 vim 配置档,以我平时在用的配置作为范例。

内容涵盖:

  • 外观风格调整
  • 快捷键配置
  • 命令行指令自定义
  • 插件管理器 Vundle
  • 8 种功能插件的介绍

书籍「Vim 实用技巧」 的结尾

建议我们,在了解 vim 的基本功能後,要订制自己的 vimrc 文件。

就像是「先学会锯子怎麽用,然後再打磨,使其锐利一样。」

事半功倍! 正是我们使用工具的原因!


Vim 配置

  • 配置方法
  • 一般配置
  • 快捷键配置
  • 命令行指令配置

配置方法

Vim 编辑器的配置,就如同所有的 IDE 一样,可以做各种快捷键与外观风格调整

不过因为没有滑鼠与可供点按的 GUI 介面,配置它的方法更会像是在软件专案中设置资料库的连线一样 :

001

(要使用特定格式与各种参数)

Vim 的配置档路径,通常会放在使用者资料夹档名为 .vimrc_vimrc

  • Windows : ~/_vimrc
  • Mac / Linux : ~/.vimrc

IDE 中的 Vim 插件

通常也会是一个独立的档案,以 IntelliJ 的 IdeaVim 插件为例,他的配置档就叫做 .ideavimrc

同样预设放置在使用者资料夹

002


完全没有任何配置的 Vim 编辑器

003

新增一个 .vimrc 的档案

004

快速加入两个开发常用的功能

  • 语法识别
  • 显示行数
" 语法识别
syntax enable

" 显示行数
set number

配置效果

005


一般配置

接续两个常用配置之後

语法高亮的部分

" 支援 256 色
set t_Co=256

" 终端机背景色 : dark / light
set background=dark

" 内建风格 ( 缩写指令 colo )
" 输入 colorscheme 空一格,再按 Tab 可以依次预览 : 
" blue / darkblue / default / delek / desert / eldlord
" evening / industry / koehler / morning / murphy / pable
" peachpuff / ron / shine / slate / torte / zollner
colorscheme default
  • set t_Co=256 :
让 Vim 能够支援 256 色
  • set background=dark :
告诉 Vim 编辑器终端机的背景色,
在有一些需要标注或选择的地方,Vim 才能够调整成容易辨识的颜色。
  • colorscheme default :
vim 内建的外观风格,注解列表的是可以用的风格名称。
+ 快速浏览的方法 ?
利用配置的设定,也是 vim 实际命令行的特性,在编辑器中输入 colorscheme 的指令,
名称的地方空一格不指定,再按一下 Tab,预设的风格就会依据字母的顺序显示出来。

增强 vim 编辑器功能

" 搜寻,高亮标注
set hlsearch

" 配置档案路径,让 find 指令更好用
set path=.,/usr/include,,**

" ts = tabstop
set ts=4 "缩排 4 格

" tab 替换成空格
set expandtab

" 自动缩排 | autoindent / smartindent / cindent
set autoindent " 跟上一行的缩进一致
  • set hlsearch
可以在搜寻时,把所有符合的文字用颜色区块标注出来。
  • set path=.,/usr/include,,**
原本的 find 指令 只能搜寻当前同层级的资料夹
这个 set path 指令,可以将搜寻的范围包含目录底下的所有子资料夹
  • set ts=4
按下一个 Tab 按键 等於四个空格
  • set expandtab
将原本 Tab 按键的一大段空白的空间,转换成刚才设置的空格数量
  • set autoindent
三种模式可以选择 : 
autoindent - 自动对齐上一行的缩排
smartindent - 针对左右大括号,增强缩排
cindent - 简单的 C/C++、Java 语法结构判断

快捷键配置

inoremap ;; <ESC>

" 执行程序
nmap <F5> :call CompileRun()<CR>
func! CompileRun()
        exec "w"
if &filetype == 'python'
            exec "!time python3 %"
elseif &filetype == 'java'
            exec "!javac %"
            exec "!time java %<"
elseif &filetype == 'sh'
            :!time bash %
endif
    endfunc
  • inoremap ;; ESC
在插入模式下,分号两下指令、非递归状态,映射为按键 
如此,就有三种退回普通模式的方法 :
左手 - ESC
右手 - ; ;
双手 - Ctrl + [
  • nmap :call CompileRun()
普通模式下,F5 按键 执行 CompileRun 涵式。
此函式会先存档,然後根据副档名的不同,使用终端机的指令执行这个档案。
(主要运用在 Python 的执行快捷键)

关注三个重点

01.Vim 编辑器的模式不同 :

前缀词:
i : 插入模式下生效
n : 普通模式下生效
v : 可视模式下生效
c : EX命令模式下生效

都不加代表在任何模式都起作用,不过很容易发生快捷键冲突,所以都建议加上。

02.递归与非递归差异

有 nore : 代表非递归
无 nore : 代表有递归
( nore 中文意思 - 没有 )

递归代表 ?

非递归 :
nnoremap j k
nnoremap k l

递归 :
nmap j k
nmap k l
  • 在递归状态下 按键 j 的功能 等於 l
  • 在非递归状态下 按键 j 的功能 则等於 k
  • 递归代表映射与映射的关联要不要延续
因此,除非真的确定原本按键上没有其他功能,不然都还是建议使用非递归状态。

03.ESC 与 CR 和 左右两侧大於、小於符号的意思

代表的是非字母的快捷键功能
名称 按键 名称 按键
<ESC> ESC <k0> - <k9> 小键盘数字 0 到 9
<CR> Enter <Ctrl> Ctrl 键
<S-x Shift + x 组合键 <Alt> Alt 键
<C-x> Ctrl + x 组合键 <Shift> Shift 键
<A-x> Alt + x 组合键 <F1> - <F12> F1 ~ F12 功能键
<BS> 退格键 (Backspace)    
<SPACE> 空格键    

命令行指令配置

" JSON 文字格式化 
" command! JSONFormat :execute '%!python -m json.tool' 

command! JSONFormat :execute '%!python -m json.tool'
\ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)).encode(\"utf-8\"), sys.stdin.read()))"'
\ | :set ft=javascript
\ | :1

" XML 文字格式化
command! XMLFormat :execute '%!xmllint --format -'

" 常用的文字替代
command! Br2line :execute '%s/<br>/---/g'
  • command! JSONFormat :execute '%!python -m json.tool'
json 文字的格式化排版
  • command! XMLFormat :execute '%!xmllint --format -'
xml 文字的格式化排版
  • command! Br2line :execute '%s/<br>/---/g'
执行常用的文字替代

JSONFormat

有两种,一种比较简单,另外一种相对复杂。

第一种:

command! JSONFormat :execute '%!python -m json.tool' 
  • command! : 代表命令行模式的指令
  • JSONFormat : 代表要输入的指令名称
  • : execute : 代表执行动作

执行什麽动作 ?

後方 '%!python -m json.tool' 指令
调用外部 指令 python 参数 -m ,将 json.tool 模组,作为脚本运行。

第二种:

command! JSONFormat :execute '%!python -m json.tool'
\ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)).encode(\"utf-8\"), sys.stdin.read()))"'
\ | :set ft=javascript
\ | :1

第一种指令,有一个小问题,如果资料内容有中文的话,会被转换成万国码。

因此,第二种就是将文字的编码,转换成 utf-8,中文部分就会显示正常。


XMLFormat

前面 command!、XMLFormat 与 execute 有了之前的说明,应该知道是什麽意思

不一样的地方,就是调用 xml 的解析工具 xmllint,执行参数 format 格式化功能。


Br2line

上述两者,都是调用外部指令来对档案作业。

如果只是要使用内建的命令行指令,将其中代表外部指令的 惊叹号(!)移除即可

这边的例子:

'%s/<br>/---/g'

使用 %s 替代文字的指令,将 br 换行的标签元素,替换成 Markdown 格式的水平分割线。


命令行格式

command! : {指令名称} :execute '{执行动作}'

剩下更多要新增的动作,只要模仿上面三个范例,替换 {指令名称} 与 {指令动作} 即可。


个人偏好 :

相比於快捷键的添加,我更倾向使用这个方法,简化动作。

因为 vim 有太多的指令,如果贸然更改很容易发生冲突,而且也不容易记忆。
因此,使用像函式的命名一样,定义命令行指令,我认为会是一个比较好的方法。

vimrc 配置

" 语法识别
syntax enable

" 显示行数
set number

" 支援 256 色
set t_Co=256

" 终端机背景色 : dark / light
set background=dark

" 内建风格 ( 缩写指令 colo )
" 输入 colorscheme 空一格,再按 Tab 可以依次预览 : 
" blue / darkblue / default / delek / desert / eldlord
" evening / industry / koehler / morning / murphy / pable
" peachpuff / ron / shine / slate / torte / zollner
colorscheme molokai

" 搜寻,高亮标注
set hlsearch

" 配置档案路径,让 find 指令更好用
set path=.,/usr/include,,**

" ts = tabstop
set ts=4 "缩排 4 格

" tab 替换成空格
set expandtab

" 自动缩排 | autoindent / smartindent / cindent
set autoindent " 跟上一行的缩进一致

" --- ↑ ---  一般配置 --- ↑ ---

inoremap ;; <ESC>


" 执行程序
nmap <F5> :call CompileRun()<CR>
func! CompileRun()
        exec "w"
if &filetype == 'python'
            exec "!time python3 %"
elseif &filetype == 'java'
            exec "!javac %"
            exec "!time java %<"
elseif &filetype == 'sh'
            :!time bash %
endif
    endfunc


" --- ↑ ---  快捷键配置 --- ↑ ---

" JSON 文字格式化 
" command! JSONFormat :execute '%!python -m json.tool' 

command! JSONFormat :execute '%!python -m json.tool'
\ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)).encode(\"utf-8\"), sys.stdin.read()))"'
\ | :set ft=javascript
\ | :1

" XML 文字格式化
command! XMLFormat :execute '%!xmllint --format -'

" 常用的文字替代
command! Br2line :execute '%s/<br>/---/g'

" --- ↑ ---  命令行配置 --- ↑ ---

Vim 插件

  • 插件管理器 Vundle
  • 外观风格插件
  • 侧边栏插件
  • Markdown 插件
  • Emmet 插件
  • 自动排版插件

插件管理器 Vundle

Vundle 是 Vim 的其中一种插件管理器,其他的还有 vim-pathogenvim-plug


访问 Vundle 的 GitHub 页面 :


依照 GitHub 的 Readme 文件 操作 :


第一步:

先准备好 git 版控工具,後续安装的每一个插件,都会放在使用者资料夹 .vim/bundle 里面。


第二步:

复制 git clone 指令,将整个专案拉取到 指定路径

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim


第三步:

开启 vimrc 档案,将插件配置贴到开头的位置

插件配置 (README):

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
  • 上面区块 - 注解的地方都可以删除。
  • 中间区块 - Plugin 是要安装的插件,只有 Vundle.vim 必需,其他示范拉取不同资源的方法,用不到也可以删除。
  • 下面区块 - 命令行指令,待会会用到,先留着。

插件配置 (简化):

set nocompatible              " be iMproved, required
filetype off                  " required

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'

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。


安装的过程如下图 :

006


如果不想要每次安装,都进入一次编辑器的话 :

 vim +PluginInstall +qall

这个指令,可以在一般的终端机状态下安装


其他的指令

" :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

在刚刚留下的注解中有说明,例如,列表(:PluginList) 与 解除安装(:PluginClean) 都可以自行尝试


外观风格插件

Plugin 'flazz/vim-colorschemes'

安装方法:

依据 Readme 文件,只要将上述的 Plugin 文字,贴到之前 Plugin Vundle.vim 的下方

然後,在 vim 里面 执行 PluginInstall

set nocompatible              " be iMproved, required
filetype off                  " required

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'VundleVim/Vundle.vim' " <- Vundle 插件
Plugin 'flazz/vim-colorschemes'

call vundle#end()            " required
filetype plugin indent on    " required
" To ignore plugin indent changes, instead use:
"filetype plugin on

插件配置

完成後,把风格设定的地方,改成这个插件支援的名称 :

colorscheme molokai

重新进入编辑器後,外观风格就会变成插件提供的配置

007


侧边栏插件

Plugin 'scrooloose/nerdtree'
Plugin 'jistr/vim-nerdtree-tabs'

nerdtree :

树状档案管理,是这个插件功能的主体。

nerdtree-tabs :

增强功能,让 nerdtree 的插件更像是真正的面版。

安装的方法

跟「外观风格」插件相同,将 nerdtree Plugin 与 nerdtree-tab Plugin 路径加入,
储存後,进入 vim 编辑器,命令行模式 输入 PluginInstall

使用方法

命令行指令 NERDTreeTabsToggle切换侧边栏的显示

其他指令,参考 GitHub 的 Readme 文件

插件配置

这一大段的指令 稍微有点长,在 vimrc 的档案内,还可以新增 opt + 1 的快捷键来进行切换

" 侧边栏快捷键 : opt + 1
nnoremap ¡ : NERDTreeToggle<CR>

我使用的是 opt + 1 的符号,像是 i 的字母是 Mac 键盘 按着 opt 时可以打出的符号。

008
(由於 Vim 的 alt 在 Mac 的映射 还有些问题,折衷方法可以透过直接使用特殊符号,来代表 opt 的组合键。)


Markdown 插件

Plugin 'gabrielelana/vim-markdown'
Plugin 'tyru/open-browser.vim'
Plugin 'kannokanno/previm'

我认为 Vim + Markdown 是写专案文件的绝佳组合,也是我写技术笔记的主力工具。


三种的 Markdown 插件,可以分成两种 :

  1. 支援编辑功能
  2. 支援预览功能

第一种 - 支援编辑功能 :

Plugin 'gabrielelana/vim-markdown'

增强 Markdown 风格的呈现,并且细节的部分,某些语法可以做简易的快捷操作。

例如 :

  1. 井字符号标题的部分,点击空格 可以依序添加
  2. 项目的加字符号,换行时会自动添加下一个并且支援反向 Tab 功能。

第二种 - 支援预览的功能 :

Plugin 'tyru/open-browser.vim'
Plugin 'kannokanno/previm'

实际的主体是後面 previm 插件,而 open-browser 则是他的一个前置插件。

功能是让你在编辑 Markdown 时,可以使用命令行指令,
将文件渲染在浏览器上,并且存档时会同步连动。

插件配置

" Markdown : Preview
let g:previm_open_cmd = 'open -a Google\ Chrome'

使用方法

命令行指令 :PrevimOpen


Emmet 插件

Plugin 'mattn/emmet-vim

网页开发的 Emmet 插件,安装方法与之前相同。


使用方法

预设的快捷键不是插入模式的 Tab 按键,而是输入完标签名称後 ctrl + y + ,


插件配置

"emmet-vim
let g:user_emmet_expandabbr_key = '<c-e>'

调整成 Ctrl + E ,虽然没有 Tab 按键来的直觉简单,

但考虑到 Vim 的各种指令 可能导致的按键冲突,目前这个配置算是一个可以接受的方案。


自动排版插件

Plugin 'Chiel92/vim-autoformat'

我认为 Vim 编辑器,在还没有改造成像 IDE 一样,有那麽多功能的配置时,

最适合拿来写三样东西 :

  • Markdown
  • 网页
  • Python
这三样很大程度上,都不需要语法的自动补全。

不过网页与 Python 缩排规则,并不相同。

所以我安装这个插件,就是为了 Python 的自动排版。


插件配置

GitHub 文件下方,已经写好要配置的参数

noremap <F3> :Autoformat<CR>
au BufWrite * :Autoformat
let g:autoformat_autoindent = 0
let g:autoformat_retab = 0
let g:autoformat_remove_trailing_spaces = 0
  • 映射快捷键 F3 进行自动排版
  • 储存档案时也会自动排版
这个插件,安装完成後,只针对 Python 语言处理

要让排版的功能扩展到其他语言,GitHub 的文件 往下拉

  • astyle 命令工具 : 支援 C# C++ C 与 Java.
如果系统有安装的话,插件就能够自动侦测直接支援。

astyle 命令工具

下载後、解压缩,在 build/mac/ 的 Makefile 路径上。

使用终端机,执行 make 指令,将产生出来的 bin 的资料夹,配置到系统变数上


例如 : Mac / Linux 的 ~/.zprofile

export PATH=$PATH:/Users/MyMac/DevTools/astyle/build/mac/bin

完成後,在 C# C++ C 与 Java 的档案中,按一下 F3 就会有排版的功能


vimrc 插件配置

set nocompatible              " be iMproved, required
filetype off                  " required

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'
Plugin 'flazz/vim-colorschemes'
Plugin 'scrooloose/nerdtree'
Plugin 'jistr/vim-nerdtree-tabs'
Plugin 'gabrielelana/vim-markdown'
Plugin 'tyru/open-browser.vim'
Plugin 'kannokanno/previm'
Plugin 'mattn/emmet-vim'
Plugin 'Chiel92/vim-autoformat'

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

" 侧边栏快捷键 : opt + 1
nnoremap ¡ : NERDTreeToggle<CR>

" Markdown : Preview
let g:previm_open_cmd = 'open -a Google\ Chrome'

"emmet-vim
let g:user_emmet_expandabbr_key = '<c-e>'

" autoformat
noremap <F3> :Autoformat<CR>
au BufWrite * :Autoformat
let g:autoformat_autoindent = 0
let g:autoformat_retab = 0
let g:autoformat_remove_trailing_spaces = 0

" --- ↑ ---  插件配置 --- ↑ ---

终端机指令

以上打磨 Vim 编辑器的方法,你可能会发现有很多简化的动作,实际上都是调用外部的终端机 :

command! JSONFormat :execute '%!python -m json.tool'
command! XMLFormat :execute '%!xmllint --format -'

对於学习 Vim 编辑器来说,熟练的使用这些命令工具,也是让 Vim 编辑器发挥更多威力的方法之一。


我觉得重要的两个命令:

  • alias 别名
  • open Mac

Alias 命令 :

中文意思是别名,可以简化系统中的其他命令,像是 cd 切换目录

例如 :

  • 将访问工作区(WorkSpace)路径的动作,简化为 WS 两个大写的字母
alias WS='cd /Users/Enoxs/Mac_Document/WorkSpace/'
  • 将访问线上文件(iCloud Document)路径的动作,简化为 iDoc 缩写文字
alias iDoc='cd /Users/Enoxs/Library/Mobile\ Documents/com~apple~CloudDocs/iStudioX'
  • 将访问 开发笔记(iCloud Document - Develop Note) 文件路径的动作,简化为 iDev 缩写文字
alias iDev='cd /Users/Enoxs/Library/Mobile\ Documents/com~apple~CloudDocs/iStudioX/DevStudio'

Open 命令 :

使用档案浏览器,开启当前的路径

两个指令互相搭配,用终端机访问文件的速度,相比於在最外层资料夹一路点过来快了不少。

更不用说,还可以随时切换到,开发笔记或者是开发工具的资料夹。


全部 vimrc 配置

set nocompatible              " be iMproved, required
filetype off                  " required

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'
Plugin 'flazz/vim-colorschemes'
Plugin 'scrooloose/nerdtree'
Plugin 'jistr/vim-nerdtree-tabs'
Plugin 'gabrielelana/vim-markdown'
Plugin 'tyru/open-browser.vim'
Plugin 'kannokanno/previm'
Plugin 'mattn/emmet-vim'
Plugin 'Chiel92/vim-autoformat'

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

" 侧边栏快捷键 : opt + 1
nnoremap ¡ : NERDTreeToggle<CR>

" Markdown : Preview
let g:previm_open_cmd = 'open -a Google\ Chrome'

"emmet-vim
let g:user_emmet_expandabbr_key = '<c-e>'

" autoformat
noremap <F3> :Autoformat<CR>
au BufWrite * :Autoformat
let g:autoformat_autoindent = 0
let g:autoformat_retab = 0
let g:autoformat_remove_trailing_spaces = 0

" --- ↑ ---  插件配置 --- ↑ ---

" 语法识别
syntax enable

" 显示行数
set number

" 支援 256 色
set t_Co=256

" 终端机背景色 : dark / light
set background=dark

" 内建风格 ( 缩写指令 colo )
" 输入 colorscheme 空一格,再按 Tab 可以依次预览 : 
" blue / darkblue / default / delek / desert / eldlord
" evening / industry / koehler / morning / murphy / pable
" peachpuff / ron / shine / slate / torte / zollner
colorscheme molokai

" 搜寻,高亮标注
set hlsearch

" 配置档案路径,让 find 指令更好用
set path=.,/usr/include,,**

" ts = tabstop
set ts=4 "缩排 4 格

" tab 替换成空格
set expandtab

" 自动缩排 | autoindent / smartindent / cindent
set autoindent " 跟上一行的缩进一致

" --- ↑ ---  一般配置 --- ↑ ---

inoremap ;; <ESC>


" 执行程序
nmap <F5> :call CompileRun()<CR>
func! CompileRun()
        exec "w"
if &filetype == 'python'
            exec "!time python3 %"
elseif &filetype == 'java'
            exec "!javac %"
            exec "!time java %<"
elseif &filetype == 'sh'
            :!time bash %
endif
    endfunc


" --- ↑ ---  快捷键配置 --- ↑ ---

" JSON 文字格式化 
" command! JSONFormat :execute '%!python -m json.tool' 

command! JSONFormat :execute '%!python -m json.tool'
\ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)).encode(\"utf-8\"), sys.stdin.read()))"'
\ | :set ft=javascript
\ | :1

" XML 文字格式化
command! XMLFormat :execute '%!xmllint --format -'

" 常用的文字替代
command! Br2line :execute '%s/<br>/---/g'

" --- ↑ ---  命令行配置 --- ↑ ---



<<:  Ruby解题分享-Maximum Subarray

>>:  组织计划为建立一个专责的资安部门(安全功能),最不重要的考虑是“安全和隐私安全控制选择”

实用且有效的CISSP考试秘诀!

来自Luke的实用且有效的CISSP考试秘诀! 很棒!! 阅读 (Reading) 作练习题 (Pr...

泳道图

要使用图来表达与非专业人员的执行程序与流程,除了一般的流程图就能做到之外,本题要介绍的这个图,是用角...

[day26] 从Line查询购物车(Rich Menu & Postback)

由左到右,由上至下,分别是 早餐选单按钮 午餐选单按钮 饮料选单按钮 使用说明按钮 查询购物车内容...

Day10-Go结构Struct

前言 今天要介绍 Go 语言的另一种资料型态,在先前,我们介绍的变数都是储存单一的值或是多个相同型态...

Day 20 真真假假的 Instance doubles

该文章同步发布於:我的部落格 昨天有提到会稍微介绍一下 allow method,其实在昨天的范例...