• 程序员的效率--专属vim(一)


    专题介绍

    一台配置强大的电脑,一个巨大的显示屏,一个顺手的编辑器,飞快的网速,可以说是高效工作的必备条件.自命一个搞技术的,深知时间的宝贵,效率可以说是一个人的能力评价的评介标准.硬件条件只是钱的问题,而软件的配置则是个人素养问题.
    此处本意是打造一个专题,这里单讲编辑器vim


    打造专属vim

    vim的重要性不必费话.网上有几个不错的vim配置方案,特别在github上,作者已经简化到只出几个命令的地步,有kvim,wklken, [easwy](git clone https://github.com/easwy/share.git)等,但这些有很大的针对性,不可照搬不误,因为好多插件和配置,如果不明就里,反而会适得其反.这就要求对配置和插件做到耳熟能详,只在身体力行,运用才能游刃有余.

    此博文长期更新,以备不时之需,亦可备份待查

    配置vimrc

    先上一个最基本的配置代码

    "==========================================
    " Author:  vintion  
    " Version: 1.0
    " Email: niwenxianq@qq.com
    " BlogPost: http://cnblog/vintion
    " Last_modify: 2014-11-24
    " ====================================================
    
    " 修改leader键
    let mapleader = ','
    let g:mapleader = ','
    
    " 开启语法高亮
    syntax on
    
    "==========================================
    " General Settings 基础设置
    "==========================================
    
    "set guifont=Monaco:h20          " 字体 && 字号
    
    " history存储容量
    set history=2000
    
    "检测文件类型
    filetype on
    
    "set tags
    ":set tags=tags
    
    "针对不同的文件类型采用不同的缩进格式
    filetype indent on
    "允许插件
    filetype plugin on
    "启动自动补全
    filetype plugin indent on
    
    set autoread          " 文件修改之后自动载入。
    set shortmess=atI       " 启动的时候不显示那个援助索马里儿童的提示
    
    " 备份,到另一个位置. 防止误删, 目前是取消备份
    "set backup
    "set backupext=.bak
    "set backupdir=/tmp/vimbk/
    
    " 取消备份。 视情况自己改
    set nobackup
    " 关闭交换文件
    set noswapfile
    
    "create undo file
    if has('persistent_undo')
      set undolevels=1000         " How many undos
      set undoreload=10000        " number of lines to save for undo
      set undofile                " So is persistent undo ...
      set undodir=/tmp/vimundo/
    endif
    
    set wildignore=*.swp,*.bak,*.pyc,*.class,.svn
    
    " 突出显示当前行等
    set cursorcolumn
    set cursorline          " 突出显示当前行
    
    
    "设置 退出vim后,内容显示在终端屏幕, 可以用于查看和复制
    "好处:误删什么的,如果以前屏幕打开,可以找回
    set t_ti= t_te=
    
    
    " 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
     set mouse=a
    "set mouse-=a             " 鼠标暂不启用, 键盘党....
    set selection=exclusive
    set selectmode=mouse,key
    
    " 修复ctrl+m 多光标操作选择的bug,但是改变了ctrl+v进行字符选中时将包含光标下的字符
    "set selection=exclusive
    set selection=inclusive
    set selectmode=mouse,key
    
    " No annoying sound on errors
    " 去掉输入错误的提示声音
    set title                " change the terminal's title
    "不要闪烁
    set novisualbell         " don't beep
    set noerrorbells         " don't beep
    set t_vb=
    set tm=500
    
    " Remember info about open buffers on close"
    set viminfo^=%
    
    " For regular expressions turn magic on
    set magic
    
    " Configure backspace so it acts as it should act
    set backspace=eol,start,indent
    set whichwrap+=<,>,h,l
    
    "==========================================
    " Display Settings 展示/排版等界面格式设置
    "==========================================
    "
    "显示当前的行号列号:
    set ruler
    set rulerformat=%20(%2*%<%f%= %m%r %3l %c %p%%%)
    
    " 命令行(在状态行下)的高度,默认为1
     set cmdheight=1
    
    ""在状态栏显示正在输入的命令
    set showcmd
    " 左下角显示当前vim模式
    set showmode
    
    " 在上下移动光标时,光标的上方或下方至少会保留显示的行数
    set scrolloff=7
    " 状态行颜色
    highlight StatusLine guifg=SlateBlue guibg=Yellow
    highlight StatusLineNC guifg=Gray guibg=White
    
    " set winwidth=79
    
    " 命令行(在状态行下)的高度,默认为1,这里是2
    "set statusline=%<%f %h%m%r%=%k[%{(&fenc=="")?&enc:&fenc}%{(&bomb?",BOM":"")}] %-14.(%l,%c%V%) %P
    " Always show the status line - use 2 lines for the status bar
    set laststatus=2
    set statusline=%F%m%r%h%w [FORMAT=%{&ff}] [TYPE=%Y] [POS=%l,%v][%p%%] %{strftime("%d/%m/%y - %H:%M")}
    
    "显示行号:
    set number
    " 取消换行。
    set nowrap
    
    " 括号配对情况,跳转并高亮一下匹配的括号
    set showmatch
    " How many tenths of a second to blink when matching brackets
    set matchtime=2
    
    "设置文内智能搜索提示
    " 高亮search命中的文本。
    set hlsearch
    " 打开增量搜索模式,随着键入即时搜索,逐字高亮
    set incsearch
    " 搜索时忽略大小写
    set ignorecase
    " 有一个或以上大写字母时仍大小写敏感
    set smartcase     " ignore case if search pattern is all lowercase, case-sensitive otherwise
    
    " 代码折叠
    set foldenable
    " 折叠方法
    " manual    手工折叠
    " indent    使用缩进表示折叠
    " expr      使用表达式定义折叠
    " syntax    使用语法定义折叠
    " diff      对没有更改的文本进行折叠
    " marker    使用标记进行折叠, 默认标记是 {{{ 和 }}}
    set foldmethod=indent
    set foldlevel=99
    
    " 缩进配置
    
    set smartindent   " Smart indent
    set cindent "C样式缩进
    set autoindent    " 打开自动缩进,继承前一行的缩进
    " never add copyindent, case error   " copy the previous indentation on autoindenting
    
    " tab相关变更
    set tabstop=4     " 设置Tab键的宽度        [等同的空格个数]
    set shiftwidth=4  " 每一次缩进对应的空格数
    set softtabstop=4 " 按退格键时可以一次删掉 4 个空格
    set smarttab      " insert tabs on the start of a line according to shiftwidth, not tabstop 按退格键时可以一次删掉 4 个空格
    set expandtab     " 将Tab自动转化成空格    [需要输入真正的Tab键时,使用 Ctrl+V + Tab]
    set shiftround    " 缩进时,取整 use multiple of shiftwidth when indenting with '<' and '>'
    set wrap "换行,nowrap是不换行
    " A buffer becomes hidden when it is abandoned
    set hidden
    set wildmode=list:longest
    set ttyfast
    
    " 00x增减数字时使用十进制
    set nrformats=
    
    
    " 相对行号      行号变成相对,可以用 nj  nk   进行跳转 5j   5k 上下跳5行
    set relativenumber number
    au FocusLost * :set norelativenumber number
    au FocusGained * :set relativenumber
    " 插入模式下用绝对行号, 普通模式下用相对
    autocmd InsertEnter * :set norelativenumber number
    autocmd InsertLeave * :set relativenumber
    function! NumberToggle()
      if(&relativenumber == 1)
        set norelativenumber number
      else
        set relativenumber
      endif
    endfunc
    nnoremap <C-n> :call NumberToggle()<cr>
    
    
    "==========================================
    " FileEncode Settings 文件编码,格式
    "==========================================
    " 设置新文件的编码为 UTF-8
    set encoding=utf-8
    " 自动判断编码时,依次尝试以下编码:
    set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
    set helplang=cn
    "set langmenu=zh_CN.UTF-8
    "set enc=2byte-gb18030
    " 下面这句只影响普通模式 (非图形界面) 下的 Vim。
    set termencoding=utf-8
    
    " Use Unix as the standard file type
    set ffs=unix,dos,mac
    
    " 如遇Unicode值大于255的文本,不必等到空格再折行。
    "自动格式化
    "set formatoptions+=m
    set formatoptions=tcrqn
    " 合并两行中文时,不在中间加空格:
    set formatoptions+=B
    
    
    "==========================================
    " others 其它设置
    "==========================================
    autocmd! bufwritepost _vimrc source % " vimrc文件修改之后自动加载。 windows。
    autocmd! bufwritepost .vimrc source % " vimrc文件修改之后自动加载。 linux。
    
    " 自动补全配置
    "让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
    set completeopt=longest,menu
    
    " 增强模式中的命令行自动完成操作
    set wildmenu
    " Ignore compiled files
    set wildignore=*.o,*~,*.pyc,*.class
    
    "离开插入模式后自动关闭预览窗口
    autocmd InsertLeave * if pumvisible() == 0|pclose|endif
    "回车即选中当前项
    inoremap <expr> <CR>       pumvisible() ? "<C-y>" : "<CR>"
    
    "上下左右键的行为 会显示其他信息
    inoremap <expr> <Down>     pumvisible() ? "<C-n>" : "<Down>"
    inoremap <expr> <Up>       pumvisible() ? "<C-p>" : "<Up>"
    inoremap <expr> <PageDown> pumvisible() ? "<PageDown><C-p><C-n>" : "<PageDown>"
    inoremap <expr> <PageUp>   pumvisible() ? "<PageUp><C-p><C-n>" : "<PageUp>"
    
    " if this not work ,make sure .viminfo is writable for you
    if has("autocmd")
      au BufReadPost * if line("'"") > 1 && line("'"") <= line("$") | exe "normal! g'"" | endif
    endif
    
    "==========================================
    " HotKey Settings  自定义快捷键设置
    "==========================================
    
    " 主要按键重定义
    
    " 关闭方向键, 强迫自己用 hjkl
    map <Left> <Nop>
    map <Right> <Nop>
    map <Up> <Nop>
    map <Down> <Nop>
    
    "Treat long lines as break lines (useful when moving around in them)
    "se swap之后,同物理行上线直接跳
    nnoremap k gk
    nnoremap gk k
    nnoremap j gj
    nnoremap gj j
    
    " F1 - F6 设置
    " F1 废弃这个键,防止调出系统帮助
    " F2 行号开关,用于鼠标复制代码用
    " F3 显示可打印字符开关
    " F4 换行开关
    " F5 粘贴模式paste_mode开关,用于有格式的代码粘贴
    " F6 语法开关,关闭语法可以加快大文件的展示
    
    " I can type :help on my own, thanks.  Protect your fat fingers from the evils of <F1>
    noremap <F1> <Esc>"
    
    ""为方便复制,用<F2>开启/关闭行号显示:
    function! HideNumber()
      if(&relativenumber == &number)
        set relativenumber! number!
      elseif(&number)
        set number!
      else
        set relativenumber!
      endif
      set number?
    endfunc
    nnoremap <F2> :call HideNumber()<CR>
    nnoremap <F3> :set list! list?<CR>
    nnoremap <F4> :set wrap! wrap?<CR>
                  "set paste
    set pastetoggle=<F5>            "    when in insert mode, press <F5> to go to
                                    "    paste mode, where you can paste mass data
                                    "    that won't be autoindented
    
    " disbale paste mode when leaving insert mode
    au InsertLeave * set nopaste
    
    nnoremap <F6> :exec exists('syntax_on') ? 'syn off' : 'syn on'<CR>
    
    
    "Smart way to move between windows 分屏窗口移动
    map <C-j> <C-W>j
    map <C-k> <C-W>k
    map <C-h> <C-W>h
    map <C-l> <C-W>l
    
    " Go to home and end using capitalized directions
    noremap H ^
    noremap L $
    
    
    "Map ; to : and save a million keystrokes
    " ex mode commands made easy 用于快速进入命令行
    nnoremap ; :
    
    
    " 命令行模式增强,ctrl - a到行首, -e 到行尾
    cnoremap <C-j> <t_kd>
    cnoremap <C-k> <t_ku>
    cnoremap <C-a> <Home>
    cnoremap <C-e> <End>
    
    " 搜索相关
    
    " Map <Space> to / (search) and Ctrl-<Space> to ? (backwards search)
    map <space> /
    " 进入搜索Use sane regexes"
    nnoremap / /v
    vnoremap / /v
    
    "Keep search pattern at the center of the screen."
    nnoremap <silent> n nzz
    nnoremap <silent> N Nzz
    nnoremap <silent> * *zz
    nnoremap <silent> # #zz
    nnoremap <silent> g* g*zz
    
    " switch # *
    nnoremap # *
    nnoremap * #
    
    " 去掉搜索高亮
    "noremap <silent><leader>/ :nohls<CR>
    set nohlsearch
    
    " --------tab/buffer相关
    
    "Use arrow key to change buffer"
    " TODO: 如何跳转到确定的buffer?
    " :b1 :b2   :bf :bl
    nnoremap [b :bprevious<cr>
    nnoremap ]b :bnext<cr>
    noremap <left> :bp<CR>
    noremap <right> :bn<CR>
    
    
    " tab 操作
    " TODO: ctrl + n 变成切换tab的方法
    "map <C-2> 2gt
    map <leader>th :tabfirst<cr>
    map <leader>tl :tablast<cr>
    
    map <leader>tj :tabnext<cr>
    map <leader>tk :tabprev<cr>
    map <leader>tn :tabnext<cr>
    map <leader>tp :tabprev<cr>
    
    map <leader>te :tabedit<cr>
    map <leader>td :tabclose<cr>
    map <leader>tm :tabm<cr>
    
    
    " 新建tab  Ctrl+t
    nnoremap <C-t>     :tabnew<CR>
    inoremap <C-t>     <Esc>:tabnew<CR>
    " TODO: 配置成功这里, 切换更方便, 两个键
    " nnoremap <C-S-tab> :tabprevious<CR>
    " nnoremap <C-tab>   :tabnext<CR>
    " inoremap <C-S-tab> <Esc>:tabprevious<CR>i
    " inoremap <C-tab>   <Esc>:tabnext<CR>i
    " nnoremap <C-Left> :tabprevious<CR>
    " nnoremap <C-Right> :tabnext<CR>
    
    " normal模式下切换到确切的tab
    noremap <leader>1 1gt
    noremap <leader>2 2gt
    noremap <leader>3 3gt
    noremap <leader>4 4gt
    noremap <leader>5 5gt
    noremap <leader>6 6gt
    noremap <leader>7 7gt
    noremap <leader>8 8gt
    noremap <leader>9 9gt
    noremap <leader>0 :tablast<cr>
    
    " Toggles between the active and last active tab "
    " The first tab is always 1 "
    let g:last_active_tab = 1
    nnoremap <leader>gt :execute 'tabnext ' . g:last_active_tab<cr>
    nnoremap <silent> <c-l> :execute 'tabnext ' . g:last_active_tab<cr>
    vnoremap <silent> <c-l> :execute 'tabnext ' . g:last_active_tab<cr>
    autocmd TabLeave * let g:last_active_tab = tabpagenr()
    
    
    " ------- 选中及操作改键
    
    "Reselect visual block after indent/outdent.调整缩进后自动选中,方便再次操作
    vnoremap < <gv
        vnoremap > >gv
    
    " y$ -> Y Make Y behave like other capitals
    map Y y$
    
    " select all
    map <Leader>sa ggVG"
    "map <Leader>as gg"+yG
    " select block
    nnoremap <leader>v V`}
    
    " w!! to sudo & write a file
    cmap w!! w !sudo tee >/dev/null %
    
    " kj 替换 Esc
    inoremap kj <Esc>
    
    " 滚动Speed up scrolling of the viewport slightly
    nnoremap <C-e> 2<C-e>
    nnoremap <C-y> 2<C-y>
    
    
    "Jump to start and end of line using the home row keys
    " 增强tab操作, 导致这个会有问题, 考虑换键
    "nmap t o<ESC>k
    "nmap T O<ESC>j
    
    " Quickly close the current window
    nnoremap <leader>q :q<CR>
    
    " Swap implementations of ` and ' jump to markers
    " By default, ' jumps to the marked line, ` jumps to the marked line and
    " column, so swap them
    nnoremap ' `
    nnoremap ` '
    
    " remap U to <C-r> for easier redo
    nnoremap U <C-r>
    
    " Quickly edit/reload the vimrc file
    nmap <silent> <leader>ev :e $MYVIMRC<CR>
    nmap <silent> <leader>sv :so $MYVIMRC<CR>
    
    "==========================================
    " FileType Settings  文件类型设置
    "==========================================
    
    " Python 文件的一般设置,比如不要 tab 等
    autocmd FileType python set tabstop=4 shiftwidth=4 expandtab ai
    
    " 保存python文件时删除多余空格
    fun! <SID>StripTrailingWhitespaces()
        let l = line(".")
        let c = col(".")
        %s/s+$//e
        call cursor(l, c)
    endfun
    autocmd FileType c,cpp,java,php,ruby,python autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()
    
    
    " 定义函数AutoSetFileHead,自动插入文件头
    autocmd BufNewFile *.sh,*.py exec ":call AutoSetFileHead()"
    function! AutoSetFileHead()
        "如果文件类型为.sh文件
        if &filetype == 'sh'
            call setline(1, "#!/bin/bash")
        endif
    
        "如果文件类型为python
        if &filetype == 'python'
            call setline(1, "#!/usr/bin/env python")
            call append(1, "# encoding: utf-8")
        endif
    
        normal G
        normal o
        normal o
    endfunc
    
    " F10 to run python script
    nnoremap <buffer> <F10> :exec '!python' shellescape(@%, 1)<cr>
    
    "F5: C/C++的编译和运行
    map <F5> :call CompileRunGpp()<CR>
    func! CompileRunGpp()
    exec "w"
    exec "!g++ % -o %<"
    exec "! ./%<"
    endfunc
    
    "==========================================
    " Theme Settings  主题设置
    "==========================================
    
    " Set extra options when running in GUI mode
    if has("gui_running")
        set guifont=Monaco:h14
        if has("gui_gtk2")   "GTK2
            set guifont=Monaco 12, Monospace 12
        endif
        set guioptions-=T
        set guioptions+=e
        set guioptions-=r
        set guioptions-=L
        set guitablabel=%M %t
        set showtabline=1
        set linespace=2
        set noimd
        set t_Co=256
    endif
    
    " theme主题
    set background=dark
    "colorscheme solarized
    set t_Co=256
    
    "colorscheme molokai
    "colorscheme desert
    
    "设置标记一列的背景颜色和数字一行颜色一致
    hi! link SignColumn   LineNr
    hi! link ShowMarksHLl DiffAdd
    hi! link ShowMarksHLu DiffChange
    
    "" for error highlight,防止错误整行标红导致看不清
    highlight clear SpellBad
    highlight SpellBad term=standout ctermfg=1 term=underline cterm=underline
    highlight clear SpellCap
    highlight SpellCap term=underline cterm=underline
    highlight clear SpellRare
    highlight SpellRare term=underline cterm=underline
    highlight clear SpellLocal
    highlight SpellLocal term=underline cterm=underline
    
    """"""""""""""""""""""""""""""
    " Tag list (ctags)
    """"""""""""""""""""""""""""""
    nmap <silent> <F9> <ESC>:Tlist<RETURN>
    nmap tl :Tlist<cr> 
    let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的 
    let Tlist_File_Fold_Auto_Close = 1
    let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim 
    let Tlist_Use_Right_Window = 1         "在右侧窗口中显示taglist窗口 
    " minibufexpl插件的一般设置
    let g:miniBufExplMapWindowNavVim = 1
    let g:miniBufExplMapWindowNavArrows = 1
    let g:miniBufExplMapCTabSwitchBufs = 1
    let g:miniBufExplModSelTarget = 1  
    
    
    "********************************************************
    "                      NERD_Tree 配置                   *
    "********************************************************
    
    "显示增强
    let NERDChristmasTree=1
    
    "自动调整焦点
    let NERDTreeAutoCenter=1
    
    "鼠标模式:目录单击,文件双击
    let NERDTreeMouseMode=2
    
    "打开文件后自动关闭
    let NERDTreeQuitOnOpen=1
    
    "显示文件
    let NERDTreeShowFiles=1
    
    "显示隐藏文件
    let NERDTreeShowHidden=1
    
    "高亮显示当前文件或目录
    let NERDTreeHightCursorline=1
    
    "显示行号
    let NERDTreeShowLineNumbers=1
    
    "窗口位置
    let NERDTreeWinPos='left'
    
    "窗口宽度
    let NERDTreeWinSize=31
    
    "不显示'Bookmarks' label 'Press ? for help'
    let NERDTreeMinimalUI=1
    nnoremap <silent> <F4> :NERDTreeToggle<CR>
    "快捷键
    "nnoremap <silent> <F4> :NERDTreeToggle<CR>
    ""map <F4> :silent! NERDTreeToggle<CR>
    ""let NERDTreeWinPos="right" "窗口在右侧
    "当打开NERDTree时,自动显示bookmark
    ""let NERDTreeShowBookmarks=1
    
    
    "winManagerWinodw
    let g:winManagerWindowLayout='FileExplorer|TagList'
    nmap wm :WMToggle<cr>
    
    "括号补全
    :inoremap ( ()<ESC>i
    :inoremap ) <c-r>=ClosePair(')')<CR>
    inoremap { {<CR>}<ESC>O
    inoremap } <c-r>=ClosePair('}')<CR>
    :inoremap [ []<ESC>i
    :inoremap ] <c-r>=ClosePair(']')<CR>
    :inoremap " ""<ESC>i
    :inoremap ' ''<ESC>i
    function! ClosePair(char)
    	if getline('.')[col('.') - 1] == a:char
    		return "<Right>"
    	else
    		return a:char
    	endif
    endfunction
    
    
    "*********************************************************
    "                  vundle 配置                           *
    "*********************************************************
    
    set rtp+=~/.vim/bundle/Vundle.vim
    
    call vundle#begin()
    
    " let Vundle manage Vundle, required
    Plugin 'gmarik/Vundle.vim'
    
    
    " My Plugins is here
    Plugin 'tpope/vim-fugitive'
    Plugin 'L9'
    Plugin 'a.vim'
    Plugin 'Auto-Pairs'
    Plugin 'vim-scripts/taglist.vim'
    Plugin 'The-NERD-tree'
    Plugin 'Syntastic'
    Plugin 'FuzzyFinder'
    Plugin 'Lokaltog/vim-powerline'
    Plugin 'Valloric/YouCompleteMe' 
    
    call vundle#end()
    "启动智能补全
    filetype plugin indent on
    "*****************************************************
    "                   taglist配置                      *
    "*****************************************************
    
    "不显示"press F1 to display help"
    let Tlist_Compact_Format=1
    
    "窗口在右侧显示
    let Tlist_Use_Right_Window=1
    
    "只显示当前文件的tags
    let Tlist_Show_One_File=1  
    
    "高亮显示
    let Tlist_Auto_Highlight_tag=1
    
    "随文件自动更新
    let Tlist_Auto_Update=1
    
    "设置宽度
    let Tlist_WinWidth=30       
    
    "taglist窗口是最后一个窗口,则退出vim
    let Tlist_Exit_OnlyWindow=1 
    
    "单击跳转
    let Tlist_Use_SingClick=1
    
    "打开关闭快捷键
    nnoremap <silent> <F8> :TlistToggle<CR>
    
    "*****************************************************
    "           YouCompleteMe配置                        *
    "*****************************************************
    
    "leader映射为逗号“,”
    let mapleader = ","  
    
    "配置默认的ycm_extra_conf.py
    let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py' 
     
    "按,jd 会跳转到定义
    nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>   
    
    "打开vim时不再询问是否加载ycm_extra_conf.py配置
    let g:ycm_confirm_extra_conf=0   
    
    "使用ctags生成的tags文件
    let g:ycm_collect_identifiers_from_tag_files = 1 
    
    
    "*****************************************************
    "           Syntastic配置                            *
    "*****************************************************
    
    
    let g:Syntastic_check_on_open=1
    
    

    更新...

    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    Jmeter接口测试与数据驱动
    Jmeter内存溢出
    Mac下多版本pip共存
    Linux命令: ps
    intellij ultimate2019.3 注册
    纪念已经逝去的十年
    H3C路由器设置NAT回环、端口回流
    理清PHP在Linxu下执行时的文件权限
    windows下vagrant的安装使用
    无限极分类(adjacency list)的三种方式(迭代、递归、引用)
  • 原文地址:https://www.cnblogs.com/vintion/p/4119947.html
Copyright © 2020-2023  润新知