vim 配置指南(持續更新)

vim 全家桶配置指南(持續更新)

簡介

本教程適用前後端。

因爲寫了一段時間前端,一直在考慮vim是否能夠替代前端無敵編輯器vscode,最後發現只能高仿,自己配置的性能跟vscode下的vim模式差不多,靈活性更高點,喜歡折騰的朋友可以試試,否則用vscode vim模式吧,已經神一般的完美了(不是高級黑-。-)。
這套插件目前包含了代碼自動補全,目錄樹,js/jsx eslint自動格式化,小黑屋模式,
文件搜索ctrlp,快速檢索ack,emmet,函數工具條還有各種奇奇插插的主題配置而成, 別想歪。這裏我做了一堆的配置,大家可以根據個人喜好,配置任意的快捷鍵。我是一邊做一邊寫的文章,有些東西可能沒考慮到,有問題可以給我留言。

最終結果預覽圖

在這裏插入圖片描述
在這裏插入圖片描述

安裝

預安裝python3
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel
wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz
./configure --enable-pythoninterp=yes --enable-shared --prefix=/usr    (關鍵要開啓python api注入,enable-share開啓讓YCM能讀庫)
make && make install
預安裝vim8
(1)yum remove `yum list|grep -E '^vim.*'|awk -F" " '{print $1}'` -y
(2)git clone https://github.com/vim/vim.git
(3)cd vim/src
(4)git checkout v8.2.0368
常用依賴裝下<<<yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel>>>
### pythoninterp, python3interp爲了是vim支持python+python3的解釋器注入
(5)./configure \
  --disable-nls \
  --enable-cscope \
  --enable-gui=no \
  --enable-multibyte  \
  --enable-python3interp \
(6) make && make install
1.vundle vi包管理工具
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
2.vimrc配置

更新日誌:
2019年03月04日:終端支持256色,代碼可視化縮進塊,ctags自動更新腳本,一些小配置的demo
2020年01月19日:增加scala支持,可以用來簡單編輯,沒有idea順暢

(1) vim ~/.vimrc
(2) 把下配置文件複製進去
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
 
"文件檢索ctrl+p
Plugin 'ctrlp.vim'
"vim包管理工具
Plugin 'gmarik/Vundle.vim'
"vim自動格式化(配合命令行eslint phplint xxxx等使用)
Plugin 'Chiel92/vim-autoformat'
"文件目錄分屏
Bundle 'scrooloose/nerdtree'
"文件目錄增加git 狀態
Plugin 'Xuyuanp/nerdtree-git-plugin'
"文件函數/類名提取分屏
Bundle 'majutsushi/tagbar'
"小黑屋模式
Bundle 'junegunn/goyo.vim'
"tab智能補全
Plugin 'ervandew/supertab'
"函數快速檢索(前端開發可以不配置)
Plugin 'tacahiroy/ctrlp-funky'
 
"js 全家桶
Plugin 'mxw/vim-jsx'
Plugin 'isRuslan/vim-es6'
Plugin 'pangloss/vim-javascript'
"語法檢測
Plugin 'scrooloose/syntastic'
"html emmet
Plugin 'mattn/emmet-vim'
"代碼摺疊
Plugin 'tmhedberg/SimpylFold'
"自動補全(vim難裝插件之一)
Plugin 'Valloric/YouCompleteMe'
"vim底層命令行git美化
Plugin 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'}
"vim主題(vscode主題,可以不裝)
Plugin 'tomasiser/vim-code-dark'
 
"ack命令在vim中的快速檢索
Plugin 'mileszs/ack.vim'
"https://beyondgrep.com/ack-2.24-single-file > /usr/local/bin/ack

"代碼可視化縮進塊
Plugin 'nathanaelkane/vim-indent-guides'

"彩虹括號
Plugin 'kien/rainbow_parentheses.vim'

"搜索快樂就完事了
Bundle 'Lokaltog/vim-easymotion'

"youcomplateme 通過 jedi補全python
Bundle "davidhalter/jedi"

"括號自動匹配
Plugin 'jiangmiao/auto-pairs'

"真彩色
Plugin 'tpope/vim-sensible'

"git左邊欄增刪改提示
Plugin 'airblade/vim-gitgutter'

" tmux Status Line, 依賴 powerline,tmux組件
Plugin 'edkolev/tmuxline.vim'

" 只有mac能用,依賴mac必須裝dash APP, 用法 Dash xxx javascript
" 非mac,可以用https://github.com/KabbAmine/zeavim.vim
Plugin 'rizzatti/dash.vim'

"scala 語法解析
Plugin 'derekwyatt/vim-scala'

"PEP8 python格式化pip3 install --upgrade autopep8
Plugin 'tell-k/vim-autopep8'


filetype plugin indent on
call vundle#end()
set runtimepath^=~/.vim/bundle/ctrlp.vim
 
"""tagbar相關配置(ctags可執行文件不能是mac只帶的ctags,mac用戶需要brew install
"""ctags 並且軟連接 ctags
"""爲當前環境變量的ctags,然後利用ctags生成tags文件給vim函數分屏讀取
"""
"let g:tagbar_ctags_bin='/usr/local/Cellar/ctags/5.8_1/bin/ctags'
let g:tagbar_right=1
set tags=tags;
set autochdir
"ctrl+m開啓文件tagbar(就是函數提示分屏)
map <C-m> :TagbarToggle<CR>
"""

"文件目錄樹分屏ctrl+n
map <C-n> :NERDTreeToggle<CR>

"顯示行號
set nu
"高亮搜索
set hlsearch
set ruler
set showmode
syntax on
"使用空格代替縮進.tab默認2個(前端),後端默認4個是吧
set tabstop=4
set shiftwidth=4
set expandtab
"文件編碼模式指定utf
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8

"""ctrlp 文件檢索配置ctrl + p
nmap <F12> <ESC>:.cc<CR><C-W>p
set runtimepath^=~/.vim/bundle/ctrlp.vim
let g:ctrlp_cache_dir = $HOME.'/.cache/ctrlp'
let g:ctrlp_open_multiple_files = 'ij'
let g:ctrlp_extensions = ['tag', 'buffertag', 'quickfix', 'dir', 'rtscript', 'undo', 'line', 'changes', 'mixed', 'bookmarkdir']
let g:ctrlp_working_path_mode = 'ra'
set wildignore+=*/tmp/*,*/node_modules/*,*.so,*.swp,*.zip
let g:ctrlp_custom_ignore = {'dir':  '\v[\/]\.(git|hg|svn)$', 'file': '\v\.(exe|so|dll)$'}
let g:SuperTabDefaultCompletionType = 'context'
"""
 
syntax enable

"主題色配置
colorscheme onedark 
set nocompatible
"設置不產生swp文件
set nobackup
set autochdir
"字體配置
set guifont=Consolas:h17
set laststatus=2
set backspace=2
"一些vim內置高亮覆蓋,參考highlight
"highlight LineNr cterm=bold ctermfg=242 
"hi Search cterm=NONE ctermfg=blue ctermbg=black cterm=reverse
"highlight Directory ctermfg=blue
set cursorline
 
"""jsx配置(一定要保證你eslint是全局的啊,軟鏈接到/usr/local/bin/下面)
"let g:jsx_ext_required = 1 " Allow JSX in normal JS files
"js AutoFormat配置
"eslint 建議用項目裏面的node_modules裏的eslint.js bin 文件 sudo ln -s /Users/fdd/work/agent-activity-website/node_modules/eslint/bin/eslint.js /usr/local/bin/eslint
"let g:syntastic_javascript_checkers = ['eslint']
"eslint保存檢測太卡了(太吃配置,改成被動模式)
let g:syntastic_enable_signs=1
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list=1
let g:syntastic_enable_highlighting = 1
let g:syntastic_echo_current_error = 1
let g:syntastic_auto_jump = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 1
"let g:syntastic_mode_map={'mode': 'passive'}
let g:syntastic_error_symbol = "\u2717"
let g:syntastic_warning_symbol = "\u26A0"
"let g:formatdef_eslint = '"SRC=eslint-temp-${RANDOM}.js; cat - >$SRC; eslint --fix $SRC >/dev/null 2>&1; cat $SRC | perl -pe \"chomp if eof\"; rm -f $SRC"'
"let g:formatters_javascript = ['eslint']
highlight SyntasticError ctermfg=240 ctermbg=204
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
"-->  上面定義的 formatter 做了這些事情:
"-->  1將標準輸入寫到臨時文件eslint-temp-xxx.js
"-->  2調用 eslint --fix 來修復它
"-->  3將 eslint-temp-xxx.js 輸出到標準輸出。
"-->  4截掉文件尾的換行(\n)
"-->  5刪掉臨時文件
"-->  臨時文件放在當前目錄而非/tmp。否則 eslint 會根據 /tmp/eslint-temp-xxx.js 路徑來讀取配置文件。
"-->  臨時文件不命名爲隱藏文件。否則 eslint 會忽略它。
"-->  幹掉文件尾的換行。這是因爲 Vim 讀入文件尾的換行後,會再來一個換行產生兩個\n。
"-->  autoformat 觸發
"F3快捷鍵開始自動格式化(eslint自動格式化)
noremap <F3> :Autoformat<CR>:w<CR>

"""html emmet(輸入 tr>td*3 然後在插入模式下 ctrl+y+,(逗號)  開啓emmet補全)
let g:user_emmet_mode='a'    "enable all function in all mode.
let g:user_emmet_install_global = 1
autocmd FileType jsx,html,css,js EmmetInstall
set directory=$HOME/.vim/swapfiles//
"""

"代碼摺疊
set foldmethod=indent
augroup AutoSaveFolds
  autocmd!
  au BufWinLeave ?* mkview 1
  au BufWinEnter ?* silent loadview 1
augroup END
"用空格來切換摺疊狀態
nnoremap <space> za             

"""---這條配置僅使用mac用戶!!!就是你想要的vim的快捷鍵複製,直接在外面的qq能夠黏貼出來!!!(不再需要什麼tmux,xclip中轉了)
set clipboard=unnamed

"""底層命令行美化,好像可以不裝字體
"先安裝字體 git clone https://github.com/powerline/fonts.git --depth=1 
"./install.sh

"""powerline配置
let g:Powerline_symbols = 'fancy'
set t_Co=256
set fillchars+=stl:\ ,stlnc:\
set term=xterm-256color

""" you complate me 配置 
""" 安裝
"  --> 裝好後去bundle裏面編譯,最好看文檔
"  --> https://github.com/Valloric/YouCompleteMe#mac-os-x
"  --> install
"  --> cd ~/.vim/bundle/YouCompleteMe
"  --> ./install.py --clang-completer
" 2個字符之後自動補全
let g:ycm_min_num_of_chars_for_completion = 2
let g:ycm_min_num_identifier_candidate_chars = 4
let g:ycm_enable_diagnostic_highlighting = 0
" ycm預覽窗口不顯示
set completeopt-=preview
" 補全之後自動關閉預覽窗口
let g:ycm_autoclose_preview_window_after_insertion = 1
let g:ycm_add_preview_to_completeopt = 0
" 設置默認預覽窗口在下面
set splitbelow
" 語法關鍵字補全
let g:ycm_seed_identifiers_with_syntax = 1
" 在註釋輸入中也能補全
let g:ycm_complete_in_comments = 1
" 在字符串輸入中也能補全
let g:ycm_complete_in_strings = 1
" 傳說中的vim8 + ycm異步補全, 2個字符後開始補全
if !exists('g:ycm_semantic_triggers')
    let g:ycm_semantic_triggers = {}
endif
let g:ycm_semantic_triggers.python = ['re!(?=[a-zA-Z_]{2})']

" F1 手動開啓函數文檔
noremap <F1> :YcmCompleter GetDoc<CR>
"""

"""
"ctags配置熱鍵自動更新
"""
function! UpdateCtags()
    let curdir=getcwd()
    while !filereadable("./tags")
        cd ..
        if getcwd() == "/"
            break
        endif
    endwhile
    if filewritable("./tags")
        !ctags -R --file-scope=yes --langmap=c:+.h --languages=python,php,javascript --links=yes --fields=+iaS --extra=+q
    endif
    execute ":cd " . curdir
endfunction
nmap <F5> :call UpdateCtags()<CR>

"智能縮進,當匹配到func main() {}
"當在大括號中間回車的時候,他會智能縮進,因爲他知道括號中間要縮進
set smartindent

"自動縮進,當你第一行敲 tab + 文字 回車後 下一行自動給你加個 tab 
set autoindent

"自定義map示例,CR(cr)代表回車,空格可以直接用Space或者一個空白符代替
map <F9> i### 作者: 張昱升<Space>  DEV<CR>### 參數:<CR>### 含義:<CR><ESC>

"自定義mapleader 前綴按鍵申明, 按 逗號 + w鍵
"可以寫入並且保存(相當於底層命令行模式執行了 w!)
let mapleader=","
map <leader>w :w!<CR>

"支持光標快速移動,就是支持鼠標滾輪啦,如果用的item2,如果你滾輪,它會提示你要不要開啓滾輪上拉,如果開啓就不需要開啓這個配置,開啓這個模式複製的話要按住option鍵
"set mouse=a

"代碼縮進塊顯示 + 奇偶行縮進顏色配置 + 縮進塊寬度
let g:indent_guides_enable_on_vim_startup = 1
let g:indent_guides_guide_size = 1
let g:indent_guides_auto_colors = 0
autocmd VimEnter,Colorscheme * :hi IndentGuidesOdd  ctermbg=237
autocmd VimEnter,Colorscheme * :hi IndentGuidesEven ctermbg=236
let g:indent_guides_exclude_filetypes = ['help', 'nerdtree']
let g:indent_guides_color_change_percent = 1

"彩虹括號
let g:rbpt_colorpairs = [
    \ ['brown',       'RoyalBlue3'],
    \ ['Darkblue',    'SeaGreen3'],
    \ ['darkgray',    'DarkOrchid3'],
    \ ['darkgreen',   'firebrick3'],
    \ ['darkcyan',    'RoyalBlue3'],
    \ ['darkred',     'SeaGreen3'],
    \ ['darkmagenta', 'DarkOrchid3'],
    \ ['brown',       'firebrick3'],
    \ ['gray',        'RoyalBlue3'],
    \ ['black',       'SeaGreen3'],
    \ ['darkmagenta', 'DarkOrchid3'],
    \ ['Darkblue',    'firebrick3'],
    \ ['darkgreen',   'RoyalBlue3'],
    \ ['darkcyan',    'SeaGreen3'],
    \ ['darkred',     'DarkOrchid3'],
    \ ['red',         'firebrick3'],
    \ ]
let g:rbpt_max = 16
let g:rbpt_loadcmd_toggle = 0
au VimEnter * RainbowParenthesesToggle
au Syntax * RainbowParenthesesLoadRound
au Syntax * RainbowParenthesesLoadSquare
au Syntax * RainbowParenthesesLoadBraces

"""搜索快樂就完事了
let g:EasyMotion_smartcase = 1
map <Leader><leader>h <Plug>(easymotion-linebackward)
map <Leader><Leader>j <Plug>(easymotion-j)
map <Leader><Leader>k <Plug>(easymotion-k)
map <Leader><leader>l <Plug>(easymotion-lineforward)
" 重複上一次操作, 類似repeat插件, 很強大
map <Leader><leader>. <Plug>(easymotion-repeat)
"""

"因爲Python已經有pylint來檢查, 而且syntastic檢查Python會在保存時有很長時間的卡頓, 所以禁用它對Python文件的檢查
let g:syntastic_ignore_files=[".*\.py$"]
"let g:syntastic_python_python_exe = 'python3'
"let g:syntastic_python_pylint_post_args =    \ '--msg-template="{path}:{line}:{column}:{C}: [{symbol} {msg_id}] {msg} <---------->"'

"nerdTree 忽略pyc文件
let NERDTreeIgnore = ['\.pyc$']

"""VimScript教程
"啓動加載echom 打入vim啓動日誌,命令 messages
echom "Never Give Up Your Dream!!! >^.^<"

"空格選中整個單詞,覆蓋摺疊folder的插件快捷鍵
map <space> viw

" -鍵 作爲刪除一行
map - dd

"上移一行
map _ k

"nmap -> normalmap
"vmap -> visualmap
"imap -> insertmap
"n + nore(不解釋映射對象) + map
"v + nore(不解釋映射對象) + map
"i + nore(不解釋映射對象) + map
"\ 在通用模式下刪除一行 
"nmap \ -
nnoremap \ dd

" U 在可視化模式下大寫選中單詞
vnoremap \ U

" ctrl+d 插入模式下刪除一行,ecs回到普通模式,i再回到插入模式
inoremap <c-d> <esc>ddi

" ctrl+u 插入模式轉換當前單詞爲大寫
inoremap <c-u> <esc>viwUi

"映射按鍵序列
nnoremap -d dd
nnoremap -c dd0

"leader 前綴使用, 關聯233行
nnoremap <leader>d dd

"重讀我的vimrc文件
nnoremap <leader>sv :source $MYVIMRC<cr>
"打開我的vimrc配置文件
nnoremap <leader>ev :vsp $MYVIMRC<cr>

"nnoremap <leader>zb :term zsh<cr>mpv "https://www.youtube.com/watch?v=OQZQ-VGbZAY" -vo tct<cr>
"nnoremap <leader>zb :vsp<cr>:sp<cr>:resize 20<cr>:vertical res 50<cr>
nnoremap <leader>zb :vsp<cr>:term zsh<cr>mpv "http://www.youtube.com/watch?v=OQZQ-VGbZAY" -vo tct<cr>

"利用hl.py腳本高亮py腳本編譯的結果,提供舒適的可視化輸出
nnoremap <leader>r :! python3 %\|/Users/tap/zys/study/py_fluent/hl.py<cr>

" * 注意映射可以死循環
" nmap dd O<esc>jddk   dd 嵌套 dd命令,會無限死循環

"# abbreviations 縮略語
iabbrev adn and

"普通模式下,雙引號包括當前單詞
nnoremap <leader>" viw<esc>a"<esc>hbi"<esc>lel

"插入模式下,jk退出插入模式,順便提下 <c-[>也是可以退出插入模式
inoremap jk <esc>
"強制幹掉esc,讓自己用j k退出插入模式
"inoremap <esc> <nop>

"""

""" json 格式化 + 轉utf8
"noremap <leader>json :%!python -m json.tool && native2ascii -encoding UTF-8 -reverse % %<CR>
noremap <leader>json :%!python -m json.tool<CR>

"這樣選中你要運行的代碼<leader>te 就會發到python shell裏
nnoremap <leader>te V:call SendToTerminal()<CR>$
vnoremap <leader>te <Esc>:call SendToTerminal()<CR>
function! SendToTerminal()
    let buff_n = term_list()
    if len(buff_n) > 0
        let buff_n = buff_n[0] " sends to most recently opened terminal
        let lines = getline(getpos("'<")[1], getpos("'>")[1])
        let indent = match(lines[0], '[^ \t]') " check for removing unnecessary indent
        for l in lines
            let new_indent = match(l, '[^ \t]')
            if new_indent == 0
                call term_sendkeys(buff_n, l. "\<CR>")
            else
                call term_sendkeys(buff_n, l[indent:]. "\<CR>")
            endif
            sleep 10m
        endfor
    endif
endfunction

""" 真彩色 -測試腳本 https://github.com/JohnMorales/dotfiles/blob/master/colors/24-bit-color.sh
"curl -s https://raw.githubusercontent.com/JohnMorales/dotfiles/master/colors/24-bit-color.sh | bash
set termguicolors
if &term =~# '^screen'
    let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
    let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
endif


" '<-1d | '>+1d  刪除塊的前一行,和後一行

"""  git左邊狀態插件配置
" 檢查修改間隔時間 ms
set updatetime=100
" 高亮,仿git diff
highlight GitGutterAdd    guifg=#009900 ctermfg=2 ctermbg=39
highlight GitGutterChange guifg=#bbbb00 ctermfg=3 ctermbg=204
highlight GitGutterDelete guifg=#ff2222 ctermfg=1 ctermbg=59


" vim tmux 居中展示風格
let g:tmuxline_preset = 'full'
" 檢查tmux環境變量,如果有,就改變vim的底部powerline樣式 
if $TMUX != ""
    autocmd VimEnter * Tmuxline powerline
endif


" scala 縮進
let g:scala_scaladoc_indent = 1

# py_fluent/hl.py 代碼,作用: 在py腳本按鍵 “,r” 觸發運行腳本(可選)

#!/usr/bin/env python3

#源代碼來自http://code.activestate.com/recipes/578178/
#Created by Raymond Hettinger on Sat, 30 Jun 2012 (MIT)
#改造代碼,張昱升 2019年01月31日

'''Add syntax highlighting to Python source code'''

__author__ = 'Raymond Hettinger'

import keyword, tokenize, cgi, re, functools, sys
try:
    import builtins
except ImportError:
    import __builtin__ as builtins

#### Analyze Python Source #################################

def is_builtin(s):
    'Return True if s is the name of a builtin'
    return hasattr(builtins, s)

def combine_range(lines, start, end):
    'Join content from a range of lines between start and end'
    (srow, scol), (erow, ecol) = start, end
    if srow == erow:
        return lines[srow-1][scol:ecol], end
    rows = [lines[srow-1][scol:]] + lines[srow: erow-1] + [lines[erow-1][:ecol]]
    return ''.join(rows), end

def analyze_python(source):
    '''Generate and classify chunks of Python for syntax highlighting.
       Yields tuples in the form: (category, categorized_text).
    '''
    lines = source.splitlines(True)
    lines.append('')
    readline = functools.partial(next, iter(lines), '')
    kind = tok_str = ''
    tok_type = tokenize.COMMENT
    written = (1, 0)
    for tok in tokenize.generate_tokens(readline):
        prev_tok_type, prev_tok_str = tok_type, tok_str
        tok_type, tok_str, (srow, scol), (erow, ecol), logical_lineno = tok
        kind = ''
        if tok_type == tokenize.COMMENT:
            kind = 'comment'
        elif tok_type == tokenize.OP and tok_str[:1] not in '{}[](),.:;@':
            kind = 'operator'
        elif tok_type == tokenize.STRING:
            kind = 'string'
            if prev_tok_type == tokenize.INDENT or scol==0:
                kind = 'docstring'
        elif tok_type == tokenize.NAME:
            if tok_str in ('def', 'class', 'import', 'from'):
                kind = 'definition'
            elif prev_tok_str in ('def', 'class'):
                kind = 'defname'
            elif keyword.iskeyword(tok_str):
                kind = 'keyword'
            elif is_builtin(tok_str) and prev_tok_str != '.':
                kind = 'builtin'
        if kind:
            if written != (srow, scol):
                text, written = combine_range(lines, written, (srow, scol))
                yield '', text
            text, written = tok_str, (erow, ecol)
            yield kind, text
    line_upto_token, written = combine_range(lines, written, (erow, ecol))
    yield '', line_upto_token

#### Raw Output  ###########################################

def raw_highlight(classified_text):
    'Straight text display of text classifications'
    result = []
    for kind, text in classified_text:
        result.append('%15s:  %r\n' % (kind or 'plain', text))
    return ''.join(result)

#### ANSI Output ###########################################

default_ansi = {
    'comment': ('\033[0;31m', '\033[0m'),
    'string': ('\033[0;32m', '\033[0m'),
    'docstring': ('\033[0;32m', '\033[0m'),
    'keyword': ('\033[0;33m', '\033[0m'),
    'builtin': ('\033[0;35m', '\033[0m'),
    'definition': ('\033[0;33m', '\033[0m'),
    'defname': ('\033[0;34m', '\033[0m'),
    'operator': ('\033[0;33m', '\033[0m'),
}

def ansi_highlight(classified_text, colors=default_ansi):
    'Add syntax highlighting to source code using ANSI escape sequences'
    # http://en.wikipedia.org/wiki/ANSI_escape_code
    result = []
    for kind, text in classified_text:
        opener, closer = colors.get(kind, ('', ''))
        result += [opener, text, closer]
    return ''.join(result)

#### HTML Output ###########################################

def html_highlight(classified_text,opener='<pre class="python">\n', closer='</pre>\n'):
    'Convert classified text to an HTML fragment'
    result = [opener]
    for kind, text in classified_text:
        if kind:
            result.append('<span class="%s">' % kind)
        result.append(cgi.escape(text))
        if kind:
            result.append('</span>')
    result.append(closer)
    return ''.join(result)

default_css = {
    '.comment': '{color: crimson;}',
    '.string':  '{color: forestgreen;}',
    '.docstring': '{color: forestgreen; font-style:italic;}',
    '.keyword': '{color: darkorange;}',
    '.builtin': '{color: purple;}',
    '.definition': '{color: darkorange; font-weight:bold;}',
    '.defname': '{color: blue;}',
    '.operator': '{color: brown;}',
}

default_html = '''\
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
          "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title> {title} </title>
<style type="text/css">
{css}
</style>
</head>
<body>
{body}
</body>
</html>
'''

def build_html_page(classified_text, title='python',
                    css=default_css, html=default_html):
    'Create a complete HTML page with colorized source code'
    css_str = '\n'.join(['%s %s' % item for item in css.items()])
    result = html_highlight(classified_text)
    title = cgi.escape(title)
    return html.format(title=title, css=css_str, body=result)

#### LaTeX Output ##########################################

default_latex_commands = {
    'comment': '{\color{red}#1}',
    'string': '{\color{ForestGreen}#1}',
    'docstring': '{\emph{\color{ForestGreen}#1}}',
    'keyword': '{\color{orange}#1}',
    'builtin': '{\color{purple}#1}',
    'definition': '{\color{orange}#1}',
    'defname': '{\color{blue}#1}',
    'operator': '{\color{brown}#1}',
}

default_latex_document = r'''
\documentclass{article}
\usepackage{alltt}
\usepackage{upquote}
\usepackage{color}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage[cm]{fullpage}
%(macros)s
\begin{document}
\center{\LARGE{%(title)s}}
\begin{alltt}
%(body)s
\end{alltt}
\end{document}
'''

def alltt_escape(s):
    'Replace backslash and braces with their escaped equivalents'
    xlat = {'{': r'\{', '}': r'\}', '\\': r'\textbackslash{}'}
    return re.sub(r'[\\{}]', lambda mo: xlat[mo.group()], s)

def latex_highlight(classified_text, title = 'python',
                    commands = default_latex_commands,
                    document = default_latex_document):
    'Create a complete LaTeX document with colorized source code'
    macros = '\n'.join(r'\newcommand{\py%s}[1]{%s}' % c for c in commands.items())
    result = []
    for kind, text in classified_text:
        if kind:
            result.append(r'\py%s{' % kind)
        result.append(alltt_escape(text))
        if kind:
            result.append('}')
    return default_latex_document % dict(title=title, macros=macros, body=''.join(result))


if __name__ == '__main__':
    import sys, argparse, webbrowser, os, textwrap

    ### debug
    source = sys.stdin.read()

    classified_text = analyze_python(source)
    encoded = ansi_highlight(classified_text)
    sys.stdout.write(encoded)
3.在vi 底層命令行模式

:PluginInstall 安裝你的插件(youcompleteme很大,裝的很慢,耐心等待)
在這裏插入圖片描述

4.把剩餘的插件補全(光是vundle裝是不夠的,有些主題,插件還需要配置),一個一個來.

在這裏插入圖片描述
裝完後執行下vim果然發現報錯,先把主題顏色搞定把,推薦onedark(atom黨的最愛),

主題安裝教程鏈接

主題裝完啓動vim,發現又報錯,反正就是類似的錯誤,看起來像是youcompleteme沒裝完,先配置這個把
在這裏插入圖片描述
在這裏插入圖片描述
YouCompleteMe安裝

cd ~/.vim/bundle/YouCompleteMe
./install.py --clang-completer --ts-completer (需要裝npm)
python3 install.py --clang-completer (僅需要c家族支持,建議指定python3)

題外話:
	--clang-completer 是c語言家族的解析器,c語言家族包括php,javascript,等等語言, ts支持es6
	如果是用"python3"的補全,請使用python3 install.py安裝!!

(1)如果報錯,說明你沒gcc的編譯器,這玩意要編譯c++代碼
ERROR: Unable to find executable 'cmake'. CMake is required to build ycmd
執行
brew install cmake
(ubuntu: apt install cmake,centos: yum install cmake)

(2)報錯:python3: error while loading shared libraries: libpython3.7m.so.1.0
echo  '/usr/local/share/python3/lib'  /etc/ld.so.conf.d/py37.conf     (whereis python3 找lib包路徑)
ldconfig
(注意這裏的python路徑要是你的lib包的準確路徑)

(3)報錯 ... --enable-shared  ....
你應該重新編譯python
./configure prefix=/usr/local/share/python3 --with-ssl --enable-shared


在這裏插入圖片描述
結果報錯了 CMake Error at ycm/CMakeLists.txt:108

A方案
執行這條命令
./install.py --clang-completer --system-libclang
B方案(推薦)
開vpn執行這個./install命令 ,因爲下載被牆了
C方案
如果還是報錯 google一下 

在這裏插入圖片描述
看到這個就說明YoucompleteMe裝好了哦

神馬?還是報錯,google了一下
執行

mkdir -p $HOME/.vim/swapfiles/
mkdir -p ~/.cache/ctrlp

到這裏所有的報錯都已經解決了,接下來解決下js跳函數文件的問題。

 brew install ctags  
 (可選)裝好後軟連接到/usr/local/bin/ctags覆蓋mac的ctags,因爲mac的ctags是低配版的,用不了
 (或者你在開一個終端讓環境變量生效,which ctags可以看到目前用的是系統的還是新裝的)

[jsCtags]補充安裝參考(支持js跳文件哦,就是在vim裏面往函數裏面跳)(https://blog.csdn.net/ghostyusheng/article/details/82747386)

補充下在powerline有一些?的符號是字體沒裝,powerline字體安裝下.
git clone https://github.com/powerline/fonts.git --depth=1
cd fonts
./install.sh

然後在iterm2的設置裏面改變字體(神馬?不是mac環境,你自己研究下)
在這裏插入圖片描述
在這裏插入圖片描述

注意事項

eslint:
如果你用npm全局裝的eslint,在按F3自動格式化的時候可能會沒用,請卸載全局的eslint(npm uninstall eslint -g),然後用軟鏈接把項目依賴的eslint -> /usr/local/bin/eslint (ln -s …/node_modules/eslint/bin/eslint.js /usr/local/bin/eslint),這樣F3才能啓用eslint自動格式化。
如果你想動態監測eslint報錯,請在vimrc中把監測模式中的passive消極模式配置註釋掉(有點耗性能)。

ack:
請執行如下命令保證你的命令行ack命令能夠被vim ACK組件使用。
wget -O- https://beyondgrep.com/ack-2.24-single-file > /usr/local/bin/ack && chmod 755 /usr/local/bin/ack

到此全部配置完畢,有問題請給我留言,謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章