zl程序教程

您现在的位置是:首页 >  工具

当前栏目

The ultimate Vim configuration (vimrc)

Vim The configuration Ultimate
2023-09-27 14:27:57 时间
" Maintainer: amix the lucky stiff
"             http://amix.dk - amix@amix.dk
"
" Version: 3.3 - 21/01/10 01:05:46
"
" Blog_post: 
"       http://amix.dk/blog/post/19486#The-ultimate-vim-configuration-vimrc
" Syntax_highlighted:
"       http://amix.dk/vim/vimrc.html
" Raw_version: 
"       http://amix.dk/vim/vimrc.txt
"
" How_to_Install:
"    $ mkdir ~/.vim_runtime
"    $ svn co svn://orangoo.com/vim ~/.vim_runtime
"    $ cat ~/.vim_runtime/install.sh
"    $ sh ~/.vim_runtime/install.sh system
"       sytem can be `mac`, `linux` or `windows`
"
" How_to_Upgrade:
"    $ svn update ~/.vim_runtime
"
" Sections:
"    - General
"    - VIM user interface
"    - Colors and Fonts
"    - Files and backups
"    - Text, tab and indent related
"    - Visual mode related
"    - Command mode related
"    - Moving around, tabs and buffers
"    - Statusline
"    - Parenthesis/bracket expanding
"    - General Abbrevs
"    - Editing mappings
"
"    - Cope
"    - Minibuffer plugin
"    - Omni complete functions
"    - Python section
"    - JavaScript section
"
" Plugins_Included:
"     minibufexpl.vim - http://www.vim.org/scripts/script.php?script_id=159
"       Makes it easy to get an overview of buffers:
"           info - :e ~/.vim_runtime/plugin/minibufexpl.vim
"
"     bufexplorer - http://www.vim.org/scripts/script.php?script_id=42
"       Makes it easy to switch between buffers:
"           info - :help bufExplorer
"
"     yankring.vim - http://www.vim.org/scripts/script.php?script_id=1234
"       Emacss killring, useful when using the clipboard:
"           info - :help yankring
"
"     surround.vim - http://www.vim.org/scripts/script.php?script_id=1697
"       Makes it easy to work with surrounding text:
"           info - :help surround
"
"     snipMate.vim - http://www.vim.org/scripts/script.php?script_id=2540
"       Snippets for many languages (similar to TextMates):
"           info - :help snipMate
"
"     fuzzyfinder - http://www.vim.org/scripts/script.php?script_id=1984
"       Find files fast (similar to TextMates feature):
"           info - :help fuzzyfinder@en
"
"  Revisions:
"     3.3: Added syntax highlighting for Mako mako.vim 
"     3.2: Turned on python_highlight_all for better syntax
"            highlighting for Python
"     3.1: Added revisions ;) and bufexplorer.vim
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = General
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Sets how many lines of history VIM has to remember
set history=300

" Enable filetype plugin
filetype plugin on
filetype indent on

" Set to auto read when a file is changed from the outside
set autoread

" With a map leader its possible to do extra key combinations
" like leader w saves the current file
let mapleader = ","
let g:mapleader = ","

" Fast saving
nmap  leader w :w! cr

" Fast editing of the .vimrc
map  leader e :e! ~/.vim_runtime/vimrc cr

" When vimrc is edited, reload it
autocmd! bufwritepost vimrc source ~/.vim_runtime/vimrc


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = VIM user interface
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Set 7 lines to the curors - when moving vertical..
set so=7

set wildmenu "Turn on WiLd menu

set ruler "Always show current position

set cmdheight=2 "The commandbar height

set hid "Change buffer - without saving

" Set backspace config
set backspace=eol,start,indent
set whichwrap+= , ,h,l

set ignorecase "Ignore case when searching

set hlsearch "Highlight search things

set incsearch "Make search act like search in modern browsers

set magic "Set magic on, for regular expressions

set showmatch "Show matching bracets when text indicator is over them
set mat=2 "How many tenths of a second to blink

" No sound on errors
set noerrorbells
set novisualbell
set t_vb=


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = Colors and Fonts
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
syntax enable "Enable syntax hl

" Set font according to system
if MySys() == "mac"
  set gfn=Bitstream\ Vera\ Sans\ Mono:h13
  set shell=/bin/bash
elseif MySys() == "windows"
  set gfn=Bitstream\ Vera\ Sans\ Mono:h10
elseif MySys() == "linux"
  set gfn=Monospace\ 10
  set shell=/bin/bash
endif

if has("gui_running")
  set guioptions-=T
  set background=dark
  set t_Co=256
  set background=dark
  colorscheme peaksea

  set nu
else
  colorscheme zellner
  set background=dark
  
  set nonu
endif

set encoding=utf8
try
    lang en_US
catch
endtry

set ffs=unix,dos,mac "Default file types


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = Files and backups
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Turn backup off, since most stuff is in SVN, git anyway...
set nobackup
set nowb
set noswapfile


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = Text, tab and indent related
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set expandtab
set shiftwidth=4
set tabstop=4
set smarttab

set lbr
set tw=500

set ai "Auto indent
set si "Smart indet
set wrap "Wrap lines

map  leader t2 :setlocal shiftwidth=2 cr
map  leader t4 :setlocal shiftwidth=4 cr
map  leader t8 :setlocal shiftwidth=4 cr


""""""""""""""""""""""""""""""
" = Visual mode related
""""""""""""""""""""""""""""""
" Really useful!
"  In visual mode when you press * or # to search for the current selection
vnoremap  silent  * :call VisualSearch(f) CR
vnoremap  silent  # :call VisualSearch(b) CR

" When you press gv you vimgrep after the selected text
vnoremap  silent  gv :call VisualSearch(gv) CR
map  leader g :vimgrep // **/*. left left left left left left left


function! CmdLine(str)
    exe "menu Foo.Bar :" . a:str
    emenu Foo.Bar
    unmenu Foo
endfunction 

" From an idea by Michael Naumann
function! VisualSearch(direction) range
    let l:saved_reg = @"
    execute "normal! vgvy"

    let l:pattern = escape(@", \\/.*$^~[])
    let l:pattern = substitute(l:pattern, "\n$", "", "")

    if a:direction == b
        execute "normal ?" . l:pattern . "^M"
    elseif a:direction == gv
        call CmdLine("vimgrep " . /. l:pattern . / .  **/*.)
    elseif a:direction == f
        execute "normal /" . l:pattern . "^M"
    endif

    let @/ = l:pattern
    let @" = l:saved_reg
endfunction



"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = Command mode related
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Smart mappings on the command line
cno $h e ~/
cno $d e ~/Desktop/
cno $j e ./
cno $c e  C-\ eCurrentFileDir("e") cr

" $q is super useful when browsing on the command line
cno $q  C-\ eDeleteTillSlash() cr

" Bash like keys for the command line
cnoremap  C-A        Home
cnoremap  C-E        End
cnoremap  C-K        C-U

cnoremap  C-P   Up
cnoremap  C-N   Down

" Useful on some European keyboards
map ½ $
imap ½ $
vmap ½ $
cmap ½ $


func! Cwd()
  let cwd = getcwd()
  return "e " . cwd 
endfunc

func! DeleteTillSlash()
  let g:cmd = getcmdline()
  if MySys() == "linux" || MySys() == "mac"
    let g:cmd_edited = substitute(g:cmd, "\\(.*\[/\]\\).*", "\\1", "")
  else
    let g:cmd_edited = substitute(g:cmd, "\\(.*\[\\\\]\\).*", "\\1", "")
  endif
  if g:cmd == g:cmd_edited
    if MySys() == "linux" || MySys() == "mac"
      let g:cmd_edited = substitute(g:cmd, "\\(.*\[/\]\\).*/", "\\1", "")
    else
      let g:cmd_edited = substitute(g:cmd, "\\(.*\[\\\\\]\\).*\[\\\\\]", "\\1", "")
    endif
  endif   
  return g:cmd_edited
endfunc

func! CurrentFileDir(cmd)
  return a:cmd . " " . expand("%:p:h") . "/"
endfunc


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = Moving around, tabs and buffers
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Map space to / (search) and c-space to ? (backgwards search)
map  space  /
map  c-space  ?
map  silent   leader cr  :noh cr

" Smart way to move btw. 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

" Close the current buffer
map  leader bd :Bclose cr

" Close all the buffers
map  leader ba :1,300 bd! cr

" Use the arrows to something usefull
map  right  :bn cr
map  left  :bp cr

" Tab configuration
map  leader tn :tabnew % cr
map  leader te :tabedit 
map  leader tc :tabclose cr
map  leader tm :tabmove 

" When pressing leader cd switch to the directory of the open buffer
map  leader cd :cd %:p:h cr


command! Bclose call  SID BufcloseCloseIt()
function!  SID BufcloseCloseIt()
   let l:currentBufNum = bufnr("%")
   let l:alternateBufNum = bufnr("#")

   if buflisted(l:alternateBufNum)
     buffer #
   else
     bnext
   endif

   if bufnr("%") == l:currentBufNum
     new
   endif

   if buflisted(l:currentBufNum)
     execute("bdelete! ".l:currentBufNum)
   endif
endfunction

" Specify the behavior when switching between buffers 
try
  set switchbuf=usetab
  set stal=2
catch
endtry


""""""""""""""""""""""""""""""
" = Statusline
""""""""""""""""""""""""""""""
" Always hide the statusline
set laststatus=2

" Format the statusline
set statusline=\ %F%m%r%h\ %w\ \ CWD:\ %r%{CurDir()}%h\ \ \ Line:\ %l/%L:%c


function! CurDir()
    let curdir = substitute(getcwd(), /Users/amir/, "~/", "g")
    return curdir
endfunction


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = Parenthesis/bracket expanding
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
vnoremap $1  esc ` a) esc ` i( esc
vnoremap $2  esc ` a] esc ` i[ esc
vnoremap $3  esc ` a} esc ` i{ esc
vnoremap $$  esc ` a" esc ` i" esc
vnoremap $q  esc ` a esc ` i esc
vnoremap $e  esc ` a" esc ` i" esc

" Map auto complete of (, ", , [
inoremap $1 () esc i
inoremap $2 [] esc i
inoremap $3 {} esc i
inoremap $4 { esc o} esc O
inoremap $q  esc i
inoremap $e "" esc i


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = General Abbrevs
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
iab xdate  c-r =strftime("%d/%m/%y %H:%M:%S") cr


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = Editing mappings
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Remap VIM 0
map 0 ^

"Move a line of text using ALT+[jk] or Comamnd+[jk] on mac
nmap  M-j  mz:m+ cr `z
nmap  M-k  mz:m-2 cr `z
vmap  M-j  :m + cr ` my` mzgv`yo`z
vmap  M-k  :m -2 cr ` my` mzgv`yo`z

if MySys() == "mac"
  nmap  D-j   M-j
  nmap  D-k   M-k
  vmap  D-j   M-j
  vmap  D-k   M-k
endif

"Delete trailing white space, useful for Python ;)
func! DeleteTrailingWS()
  exe "normal mz"
  %s/\s\+$//ge
  exe "normal `z"
endfunc
autocmd BufWrite *.py :call DeleteTrailingWS()


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = Cope
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Do :help cope if you are unsure what cope is. Its super useful!
map  leader cc :botright cope cr
map  leader n :cn cr
map  leader p :cp cr


""""""""""""""""""""""""""""""
" = bufExplorer plugin
""""""""""""""""""""""""""""""
let g:bufExplorerDefaultHelp=0
let g:bufExplorerShowRelativePath=1


""""""""""""""""""""""""""""""
" = Minibuffer plugin
""""""""""""""""""""""""""""""
let g:miniBufExplModSelTarget = 1
let g:miniBufExplorerMoreThanOne = 2
let g:miniBufExplModSelTarget = 0
let g:miniBufExplUseSingleClick = 1
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplVSplit = 25
let g:miniBufExplSplitBelow=1

let g:bufExplorerSortBy = "name"

autocmd BufRead,BufNew :call UMiniBufExplorer

map  leader u :TMiniBufExplorer cr :TMiniBufExplorer cr


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = Omni complete functions
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
autocmd FileType css set omnifunc=csscomplete#CompleteCSS


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = Spell checking
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Pressing ,ss will toggle and untoggle spell checking
map  leader ss :setlocal spell! cr

"Shortcuts using leader
map  leader sn ]s
map  leader sp [s
map  leader sa zg
map  leader s? z=


""""""""""""""""""""""""""""""
" = Python section
""""""""""""""""""""""""""""""
au FileType python set nocindent
let python_highlight_all = 1
au FileType python syn keyword pythonDecorator True None False self

au BufNewFile,BufRead *.jinja set syntax=htmljinja
au BufNewFile,BufRead *.mako set ft=mako

au FileType python inoremap  buffer  $r return 
au FileType python inoremap  buffer  $i import 
au FileType python inoremap  buffer  $p print 
au FileType python inoremap  buffer  $f #--- PH ---------------------------------------------- esc FP2xi
au FileType python map  buffer   leader 1 /class 
au FileType python map  buffer   leader 2 /def 
au FileType python map  buffer   leader C ?class 
au FileType python map  buffer   leader D ?def 


""""""""""""""""""""""""""""""
" = JavaScript section
"""""""""""""""""""""""""""""""
au FileType javascript call JavaScriptFold()
au FileType javascript setl fen
au FileType javascript setl nocindent

au FileType javascript imap  c-t  AJS.log(); esc hi
au FileType javascript imap  c-a  alert(); esc hi

au FileType javascript inoremap  buffer  $r return 
au FileType javascript inoremap  buffer  $f //--- PH ---------------------------------------------- esc FP2xi

function! JavaScriptFold() 
    setl foldmethod=syntax
    setl foldlevelstart=1
    syn region foldBraces start=/{/ end=/}/ transparent fold keepend extend

    function! FoldText()
    return substitute(getline(v:foldstart), {.*, {...}, )
    endfunction
    setl foldtext=FoldText()
endfunction


""""""""""""""""""""""""""""""
" = Fuzzy finder
""""""""""""""""""""""""""""""
try
    call fuf#defineLaunchCommand(FufCWD, file, fnamemodify(getcwd(), %:p:h))
    map  leader t :FufCWD **/ CR
catch
endtry


""""""""""""""""""""""""""""""
" = Vim grep
""""""""""""""""""""""""""""""
let Grep_Skip_Dirs = RCS CVS SCCS .svn generated
set grepprg=/bin/grep\ -nH


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" = MISC
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Remove the Windows ^M - when the encodings gets messed up
noremap  Leader m mmHmt:%s/ C-V cr //ge cr tztm

"Quickly open a buffer for scripbble
map  leader q :e ~/buffer cr
一文配置全面而强大的vim 开发工作中往往会用到Linux系统,如果直接使用桌面版还好,但是如果使用putty或MobaXterm此类工具远程服务器必然会少不了和vim打交道,如果在windows下开发好再用sftp或git、svn远程到服务器需要多余的操作比较麻烦,合理利用vim能够极大提高开发效率。推荐理由:丰富而高效的命令;简单、便捷;配合插件能够自动补全、自动缩进等,而且对于Python第三方库的补全速度远超vs code等IDE;