diff --git a/vim/.vimrc b/vim/.vimrc new file mode 100755 index 0000000..b18b0ab --- /dev/null +++ b/vim/.vimrc @@ -0,0 +1,53 @@ +set encoding=utf-8 +execute pathogen#infect('plugins/{}') +execute pathogen#infect('snippets/{}') +autocmd vimenter * Helptags +syntax on +filetype plugin on +filetype plugin indent on +set number +set relativenumber +set autochdir +set expandtab + +let &undodir = expand('~/.vim/.undo') +let &backupdir = expand('~/.vim/.backup//') +let &directory = expand('~/.vim/.swp//') +set undofile + +colorscheme new-railscasts +source ~/.vim/config/plugin.vim +source ~/.vim/config/keybindings.vim + +set tabstop=4 +set shiftwidth=4 +set cc=120 +let g:netrw_liststyle = 3 +let g:netrw_browse_split = 4 +let g:netrw_winsize = 20 +let g:netrw_altv = 0 +let g:netrw_banner = 0 +let g:tex_conceal = "" + +function! ForceResizeNetrw() +let curWin = winnr() + for winnr in range(1, winnr('$')) + if getwinvar(winnr, '&ft')=="netrw" + if curWin != winnr + silent noautocmd exec winnr 'wincmd w' + silent noautocmd exec 'vertical resize ' . g:netrw_winsize + silent noautocmd exec curWin 'wincmd w' + else + silent noautocmd exec 'vertical resize ' . g:netrw_winsize + endif + endif + endfor +endfunction + + +autocmd WinEnter * call ForceResizeNetrw() +" autocmd VimEnter * Vex +autocmd BufNew * call ForceResizeNetrw() + +" Transparency +hi Normal guibg=NONE ctermbg=NONE diff --git a/vim/autoload/pathogen.vim b/vim/autoload/pathogen.vim new file mode 100755 index 0000000..2ec30e1 --- /dev/null +++ b/vim/autoload/pathogen.vim @@ -0,0 +1,266 @@ +" pathogen.vim - path option manipulation +" Maintainer: Tim Pope +" Version: 2.4 + +" Install in ~/.vim/autoload (or ~\vimfiles\autoload). +" +" For management of individually installed plugins in ~/.vim/bundle (or +" ~\vimfiles\bundle), adding `execute pathogen#infect()` to the top of your +" .vimrc is the only other setup necessary. +" +" The API is documented inline below. + +if exists("g:loaded_pathogen") || &cp + finish +endif +let g:loaded_pathogen = 1 + +" Point of entry for basic default usage. Give a relative path to invoke +" pathogen#interpose() or an absolute path to invoke pathogen#surround(). +" Curly braces are expanded with pathogen#expand(): "bundle/{}" finds all +" subdirectories inside "bundle" inside all directories in the runtime path. +" If no arguments are given, defaults "bundle/{}", and also "pack/{}/start/{}" +" on versions of Vim without native package support. +function! pathogen#infect(...) abort + if a:0 + let paths = filter(reverse(copy(a:000)), 'type(v:val) == type("")') + else + let paths = ['bundle/{}', 'pack/{}/start/{}'] + endif + if has('packages') + call filter(paths, 'v:val !~# "^pack/[^/]*/start/[^/]*$"') + endif + let static = '^\%([$~\\/]\|\w:[\\/]\)[^{}*]*$' + for path in filter(copy(paths), 'v:val =~# static') + call pathogen#surround(path) + endfor + for path in filter(copy(paths), 'v:val !~# static') + if path =~# '^\%([$~\\/]\|\w:[\\/]\)' + call pathogen#surround(path) + else + call pathogen#interpose(path) + endif + endfor + call pathogen#cycle_filetype() + if pathogen#is_disabled($MYVIMRC) + return 'finish' + endif + return '' +endfunction + +" Split a path into a list. +function! pathogen#split(path) abort + if type(a:path) == type([]) | return a:path | endif + if empty(a:path) | return [] | endif + let split = split(a:path,'\\\@]','\\&','') + endif +endfunction + +" Like findfile(), but hardcoded to use the runtimepath. +function! pathogen#runtime_findfile(file,count) abort + let rtp = pathogen#join(1,pathogen#split(&rtp)) + let file = findfile(a:file,rtp,a:count) + if file ==# '' + return '' + else + return fnamemodify(file,':p') + endif +endfunction + +" vim:set et sw=2 foldmethod=expr foldexpr=getline(v\:lnum)=~'^\"\ Section\:'?'>1'\:getline(v\:lnum)=~#'^fu'?'a1'\:getline(v\:lnum)=~#'^endf'?'s1'\:'=': diff --git a/vim/colors/happy_hacking.vim b/vim/colors/happy_hacking.vim new file mode 100644 index 0000000..9361d03 --- /dev/null +++ b/vim/colors/happy_hacking.vim @@ -0,0 +1,361 @@ +" # Happy Hacking +" +" Happy Hacking is a color scheme heavily inspired by Autumn +" (https://github.com/yorickpeterse/autumn.vim). The main differences between +" the two themes are various small tweaks to the colors, an easier to maintain +" codebase and a much wider range of supported languages. On top of that +" various inconsistencies that were present in Autumn have been resolved. +" +" As with any Vim color scheme the overall look and feel heavily depends on how +" accurate a syntax highlighter for a language is. For example, the Ruby syntax +" highlighter is fairly accurate and allows you to customize a lot whereas for +" example C has a more generic highlighting setup. At worst this will result in +" a bit more heavy use of red as it's one of the base colors of this theme. +" +" Author: Yorick Peterse +" License: MIT +" Website: https://github.com/yorickpeterse/happy_hacking.vim +" + +set background=dark +set t_Co=256 + +hi clear + +if exists("syntax_on") + syntax reset +end + +let colors_name = "happy_hacking" + +" ============================================================================ +" GUI Colors +" +" This section defines all the colors to use when running Vim as a GUI (Gvim, +" Macvim, etc). These colors are *not* used when Vim is run in a terminal. + +let s:white = "#F3F2CC" +let s:black1 = "#000000" +let s:black2 = "#202020" +let s:yellow = "#FAD566" +let s:blue = "#81A2C7" +let s:green = "#8daf67" +let s:turqoise = "#B3EBBF" +let s:orange = "#FAA166" +let s:pink = "#F77EBD" +let s:red = "#F05E48" +let s:gray1 = "#292929" +let s:gray2 = "#525252" +let s:gray3 = "#6c6c6c" +let s:gray4 = "#7c7c7c" +let s:gray5 = "#aaaaaa" +let s:gray6 = "#393939" + +" ============================================================================ +" Terminal Colors +" +" This section defines all the colors that are used when Vim is run inside a +" terminal instead of a GUI. + +let s:t_white = "230" +let s:t_black1 = "16" +let s:t_black2 = "16" +let s:t_yellow = "221" +let s:t_blue = "103" +let s:t_green = "107" +let s:t_turqoise = "157" +let s:t_orange = "179" +let s:t_pink = "211" +let s:t_gold = "186" +let s:t_red = "203" +let s:t_gray1 = "235" +let s:t_gray2 = "59" +let s:t_gray3 = "59" +let s:t_gray4 = "102" +let s:t_gray5 = "145" +let s:t_gray6 = "237" + +" ============================================================================ +" Color Functions + +" Function for creating a highlight group with a GUI/Terminal foreground and +" background. No font styling is applied. +function! s:Color(group, fg, bg, t_fg, t_bg, ...) + if empty(a:0) + let style = "NONE" + else + let style = a:1 + end + + exe "hi " . a:group . " guifg=" . a:fg . " guibg=" . a:bg + \ . " ctermfg=" . a:t_fg + \ . " ctermbg=" . a:t_bg + \ . " gui=" . style + \ . " cterm=" . style +endfunction + +" ============================================================================ +" General Syntax Elements +" +" Definitions for generic syntax elements such as strings and numbers. + +call s:Color("Pmenu", s:white, s:black2, s:t_white, s:t_gray6) +" Modified Pmenu! original white black2 t_white t_black +" ~rad4day +call s:Color("PmenuSel", s:white, s:gray2, s:t_white, s:t_gray2) +call s:Color("Cursor", "NONE", s:gray2, "NONE", s:t_gray2) +call s:Color("Normal", s:white, s:gray1, s:t_white, s:t_gray1) +call s:Color("Search", s:yellow, "NONE", s:t_yellow, "NONE", "bold") +call s:Color("Title", s:white, "NONE", s:t_white, "NONE", "bold") + +call s:Color("LineNr", s:gray3, "NONE", s:t_gray3, "NONE") +call s:Color("StatusLine", s:white, s:gray6, s:t_white, s:t_gray6) +call s:Color("StatusLineNC", s:gray4, s:gray6, s:t_gray4, s:t_gray6) +call s:Color("VertSplit", s:gray3, "NONE", s:t_gray3, "NONE") +call s:Color("ColorColumn", "NONE", s:gray6, "NONE", s:t_gray6) + +call s:Color("Folded", s:gray4, "NONE", s:t_gray4, "NONE") +call s:Color("FoldColumn", s:gray3, s:gray1, s:t_gray3, s:t_gray1) +call s:Color("ErrorMsg", s:red, "NONE", s:t_red, "NONE", "bold") +call s:Color("WarningMsg", s:yellow, "NONE", s:t_yellow, "NONE", "bold") +call s:Color("Question", s:white, "NONE", s:t_white, "NONE") + +call s:Color("SpecialKey", s:white, s:gray2, s:t_white, s:t_gray2) +call s:Color("Directory", s:blue, "NONE", s:t_blue, "NONE") + +call s:Color("Comment", s:gray4, "NONE", s:t_gray4, "NONE") +call s:Color("Todo", s:gray5, "NONE", s:t_gray5, "NONE") +call s:Color("String", s:green, "NONE", s:t_green, "NONE") +call s:Color("Keyword", s:red, "NONE", s:t_red, "NONE") +call s:Color("Number", s:turqoise, "NONE", s:t_turqoise, "NONE") +call s:Color("Regexp", s:orange, "NONE", s:t_orange, "NONE") +call s:Color("Macro", s:orange, "NONE", s:t_orange, "NONE") +call s:Color("Function", s:yellow, "NONE", s:t_yellow, "NONE") +call s:Color("Notice", s:yellow, "NONE", s:t_yellow, "NONE") + +call s:Color("MatchParen", "NONE", "NONE", "NONE", "NONE", "bold") + +hi! link CursorLine Cursor +hi! link Identifier Normal +hi! link Constant Normal +hi! link Operator Normal +hi! link Type Keyword +hi! link Statement Keyword +hi! link PmenuThumb PmenuSel +hi! link Visual Cursor +hi! link SignColumn FoldColumn +hi! link Error ErrorMsg +hi! link NonText LineNr +hi! link PreProc Normal +hi! link Special Normal +hi! link Boolean Keyword +hi! link StorageClass Keyword +hi! link MoreMsg Normal +hi! link Character String +hi! link Label Special +hi! link PreCondit Macro + +" ============================================================================ +" Specific Languages +" +" Language specific settings that would otherwise be too generic. These +" definitions are sorted in alphabetical order. + +" Coffeescript +hi! link coffeeRegex Regexp +hi! link coffeeSpecialIdent Directory + +" CSS +hi! link cssIdentifier Title +hi! link cssClassName Directory +hi! link cssMedia Notice +hi! link cssColor Number +hi! link cssTagName Normal +hi! link cssImportant Notice + +" CtrlP +hi! link CtrlPBufferHid Todo +hi! link CtrlPBufferPath Todo + +call s:Color("CtrlPMode1", s:white, s:gray1, s:t_white, s:t_gray1, "bold") + +" D +hi! link dDebug Notice +hi! link dOperator Operator +hi! link dStorageClass Keyword +hi! link dAnnotation Directory +hi! link dAttribute dAnnotation + +" Diffs +hi! link diffFile WarningMsg +hi! link diffLine Number +hi! link diffAdded String +hi! link diffRemoved Keyword + +hi! link DiffChange Notice +hi! link DiffAdd diffAdded +hi! link DiffDelete diffRemoved +hi! link DiffText diffLine + +" Dot (GraphViz) +hi! link dotKeyChar Normal + +" Git commits +hi! link gitCommitSummary String +hi! link gitCommitOverflow ErrorMsg + +" HAML +hi! link hamlId Title +hi! link hamlClass Directory +hi! link htmlArg Normal +hi! link hamlDocType Comment + +" HTML +hi! link htmlLink Directory +hi! link htmlSpecialTagName htmlTag +hi! link htmlTagName htmlTag +hi! link htmlScriptTag htmlTag + +" Javascript +hi! link javaScriptBraces Normal +hi! link javaScriptMember Normal +hi! link javaScriptIdentifier Keyword +hi! link javaScriptFunction Keyword +hi! link JavaScriptNumber Number + +" Java +hi! link javaCommentTitle javaComment +hi! link javaDocTags Todo +hi! link javaDocParam Todo +hi! link javaStorageClass Keyword +hi! link javaAnnotation Directory +hi! link javaExternal Keyword + +" JSON +hi! link jsonKeyword String + +" Less +hi! link lessClass cssClassName + +" Make +hi! link makeTarget Function + +" Markdown +hi! link markdownCodeBlock Todo +hi! link markdownCode markdownCodeBlock +hi! link markdownListMarker Keyword +hi! link markdownOrderedListMarker Keyword + +" NERDTree +hi! link NERDTreeRO Notice +hi! link NERDTreeCWD Title +hi! link NERDTreeLink Number +hi! link NERDTreeDir Directory +hi! link NERDTreeOpenable NERDTreeDir +hi! link NERDTreeClosable NERDTreeDir + +" Perl +hi! link podCommand Comment +hi! link podCmdText Todo +hi! link podVerbatimLine Todo +hi! link perlStatementInclude Statement +hi! link perlStatementPackage Statement +hi! link perlPackageDecl Normal + +" Ragel +hi! link rlAugmentOps Operator + +" Ruby +hi! link rubySymbol Regexp +hi! link rubyConstant Constant +hi! link rubyInstanceVariable Directory +hi! link rubyClassVariable rubyInstancevariable +hi! link rubyClass Keyword +hi! link rubyModule rubyClass +hi! link rubyFunction Function +hi! link rubyDefine Keyword +hi! link rubyRegexp Regexp +hi! link rubyRegexpSpecial Regexp +hi! link rubyRegexpCharClass Normal +hi! link rubyRegexpQuantifier Normal + +" Rust +hi! link rustFuncCall Identifier +hi! link rustCommentBlockDoc Comment +hi! link rustCommentLineDoc Comment + +" SASS +hi! link sassClass cssClassName +hi! link sassId cssIdentifier +hi! link sassInclude cssMedia + +" Shell +hi! link shFunctionKey Keyword +hi! link shTestOpr Operator +hi! link bashStatement Normal + +" SQL +hi! link sqlKeyword Keyword + +" TypeScript +hi! link typescriptBraces Normal +hi! link typescriptEndColons Normal +hi! link typescriptFunction Function +hi! link typescriptFuncKeyword Keyword +hi! link typescriptLogicSymbols Operator +hi! link typescriptIdentifier Keyword +hi! link typescriptExceptions Keyword + +" Vimscript +hi! link vimGroup Constant +hi! link vimHiGroup Constant +hi! link VimIsCommand Constant +hi! link VimCommentTitle Todo + +" YAML +hi! link yamlPlainScalar String + +" YARD +hi! link yardType Todo +hi! link yardTypeList Todo +hi! link yardComment Comment + +" XML +hi! link xmlTagName Normal +hi! link xmlTag Normal +hi! link xmlAttrib Normal + +" Neomake +hi! link NeomakeWarningSign WarningMsg +hi! link NeomakeErrorSign Error +hi! link NeomakeWarning WarningMsg + +" Wild menu completion +hi! link WildMenu PmenuSel + +" Vim tabline +hi! link TabLine StatusLine +hi! link TabLineFill StatusLine + +call s:Color("TabLineSel", s:white, s:gray2, s:t_white, s:t_gray2, "bold") + +" Line numbers +call s:Color("CursorLineNR", s:yellow, "NONE", s:t_yellow, "NONE", "bold") + +" Neovim terminal colors +let g:terminal_color_0 = s:black1 +let g:terminal_color_1 = s:red +let g:terminal_color_2 = s:green +let g:terminal_color_3 = s:yellow +let g:terminal_color_4 = s:blue +let g:terminal_color_5 = s:pink +let g:terminal_color_6 = s:turqoise +let g:terminal_color_7 = s:white +let g:terminal_color_8 = s:black1 +let g:terminal_color_9 = s:red +let g:terminal_color_10 = s:green +let g:terminal_color_11 = s:yellow +let g:terminal_color_12 = s:blue +let g:terminal_color_13 = s:pink +let g:terminal_color_14 = s:turqoise +let g:terminal_color_15 = s:white diff --git a/vim/colors/jellybeans.vim b/vim/colors/jellybeans.vim new file mode 100755 index 0000000..a089a5a --- /dev/null +++ b/vim/colors/jellybeans.vim @@ -0,0 +1,687 @@ +" Vim color file +" +" " __ _ _ _ " +" " \ \ ___| | |_ _| |__ ___ __ _ _ __ ___ " +" " \ \/ _ \ | | | | | _ \ / _ \/ _ | _ \/ __| " +" " /\_/ / __/ | | |_| | |_| | __/ |_| | | | \__ \ " +" " \___/ \___|_|_|\__ |____/ \___|\____|_| |_|___/ " +" " \___/ " +" +" "A colorful, dark color scheme for Vim." +" +" File: jellybeans.vim +" URL: github.com/nanotech/jellybeans.vim +" Scripts URL: vim.org/scripts/script.php?script_id=2555 +" Maintainer: NanoTech (nanotech.nanotechcorp.net) +" Version: 1.6 +" Last Change: October 18th, 2016 +" License: MIT +" Contributors: Andrew Wong (w0ng) +" Brian Marshall (bmars) +" Daniel Herbert (pocketninja) +" David Liang +" Henry So, Jr. +" Joe Doherty (docapotamus) +" Karl Litterfeldt (Litterfeldt) +" Keith Pitt (keithpitt) +" Philipp Rustemeier (12foo) +" Rafael Bicalho (rbika) +" Rich Healey (richo) +" Siwen Yu (yusiwen) +" Tim Willis (willist) +" +" Copyright (c) 2009-2016 NanoTech +" +" Permission is hereby granted, free of charge, to any per‐ +" son obtaining a copy of this software and associated doc‐ +" umentation files (the “Software”), to deal in the Soft‐ +" ware without restriction, including without limitation +" the rights to use, copy, modify, merge, publish, distrib‐ +" ute, sublicense, and/or sell copies of the Software, and +" to permit persons to whom the Software is furnished to do +" so, subject to the following conditions: +" +" The above copyright notice and this permission notice +" shall be included in all copies or substantial portions +" of the Software. +" +" THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY +" KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +" THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICU‐ +" LAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CON‐ +" TRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON‐ +" NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +" THE SOFTWARE. + +set background=dark + +hi clear + +if exists("syntax_on") + syntax reset +endif + +let colors_name = "jellybeans" + +if has("gui_running") || (has('termguicolors') && &termguicolors) || &t_Co >= 88 + let s:low_color = 0 +else + let s:low_color = 1 +endif + +" Configuration Variables: +" - g:jellybeans_overrides (default = {}) +" - g:jellybeans_use_lowcolor_black (default = 1) +" - g:jellybeans_use_gui_italics (default = 1) +" - g:jellybeans_use_term_italics (default = 0) + +let s:background_color = "151515" + +if exists("g:jellybeans_overrides") + let s:overrides = g:jellybeans_overrides +else + let s:overrides = {} +endif + +" Backwards compatibility +if exists("g:jellybeans_background_color") + \ || exists("g:jellybeans_background_color_256") + \ || exists("g:jellybeans_use_term_background_color") + + let s:overrides = deepcopy(s:overrides) + + if !has_key(s:overrides, "background") + let s:overrides["background"] = {} + endif + + if exists("g:jellybeans_background_color") + let s:overrides["background"]["guibg"] = g:jellybeans_background_color + endif + + if exists("g:jellybeans_background_color_256") + let s:overrides["background"]["256ctermbg"] = g:jellybeans_background_color_256 + endif + + if exists("g:jellybeans_use_term_background_color") + \ && g:jellybeans_use_term_background_color + let s:overrides["background"]["ctermbg"] = "NONE" + let s:overrides["background"]["256ctermbg"] = "NONE" + endif +endif + +if !exists("g:jellybeans_use_lowcolor_black") || g:jellybeans_use_lowcolor_black + let s:termBlack = "Black" +else + let s:termBlack = "Grey" +endif + +" When `termguicolors` is set, Vim[^1] ignores `guibg=NONE` after +" `guibg` is already set to a color. See: +" +" - https://github.com/vim/vim/issues/981 +" - https://github.com/nanotech/jellybeans.vim/issues/64 +" +" To work around this, ensure we don't set the default background +" color before an override changes it to `NONE` by ensuring that the +" background color isn't set to a value different from its override. +" +" [^1]: Tested on 8.0.567. Does not apply to Neovim. +" +" TODO: Enable this behavior for all highlights by applying +" overrides before calling highlight commands. +" +if has_key(s:overrides, "background") && has_key(s:overrides["background"], "guibg") + let s:background_color = s:overrides["background"]["guibg"] +endif + +" Color approximation functions by Henry So, Jr. and David Liang {{{ +" Added to jellybeans.vim by Daniel Herbert + +" returns an approximate grey index for the given grey level +fun! s:grey_number(x) + if &t_Co == 88 + if a:x < 23 + return 0 + elseif a:x < 69 + return 1 + elseif a:x < 103 + return 2 + elseif a:x < 127 + return 3 + elseif a:x < 150 + return 4 + elseif a:x < 173 + return 5 + elseif a:x < 196 + return 6 + elseif a:x < 219 + return 7 + elseif a:x < 243 + return 8 + else + return 9 + endif + else + if a:x < 14 + return 0 + else + let l:n = (a:x - 8) / 10 + let l:m = (a:x - 8) % 10 + if l:m < 5 + return l:n + else + return l:n + 1 + endif + endif + endif +endfun + +" returns the actual grey level represented by the grey index +fun! s:grey_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 46 + elseif a:n == 2 + return 92 + elseif a:n == 3 + return 115 + elseif a:n == 4 + return 139 + elseif a:n == 5 + return 162 + elseif a:n == 6 + return 185 + elseif a:n == 7 + return 208 + elseif a:n == 8 + return 231 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 8 + (a:n * 10) + endif + endif +endfun + +" returns the palette index for the given grey index +fun! s:grey_color(n) + if &t_Co == 88 + if a:n == 0 + return 16 + elseif a:n == 9 + return 79 + else + return 79 + a:n + endif + else + if a:n == 0 + return 16 + elseif a:n == 25 + return 231 + else + return 231 + a:n + endif + endif +endfun + +" returns an approximate color index for the given color level +fun! s:rgb_number(x) + if &t_Co == 88 + if a:x < 69 + return 0 + elseif a:x < 172 + return 1 + elseif a:x < 230 + return 2 + else + return 3 + endif + else + if a:x < 75 + return 0 + else + let l:n = (a:x - 55) / 40 + let l:m = (a:x - 55) % 40 + if l:m < 20 + return l:n + else + return l:n + 1 + endif + endif + endif +endfun + +" returns the actual color level for the given color index +fun! s:rgb_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 139 + elseif a:n == 2 + return 205 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 55 + (a:n * 40) + endif + endif +endfun + +" returns the palette index for the given R/G/B color indices +fun! s:rgb_color(x, y, z) + if &t_Co == 88 + return 16 + (a:x * 16) + (a:y * 4) + a:z + else + return 16 + (a:x * 36) + (a:y * 6) + a:z + endif +endfun + +" returns the palette index to approximate the given R/G/B color levels +fun! s:color(r, g, b) + " map greys directly (see xterm's 256colres.pl) + if &t_Co == 256 && a:r == a:g && a:g == a:b && a:r > 3 && a:r < 243 + return (a:r - 8) / 10 + 232 + endif + + " get the closest grey + let l:gx = s:grey_number(a:r) + let l:gy = s:grey_number(a:g) + let l:gz = s:grey_number(a:b) + + " get the closest color + let l:x = s:rgb_number(a:r) + let l:y = s:rgb_number(a:g) + let l:z = s:rgb_number(a:b) + + if l:gx == l:gy && l:gy == l:gz + " there are two possibilities + let l:dgr = s:grey_level(l:gx) - a:r + let l:dgg = s:grey_level(l:gy) - a:g + let l:dgb = s:grey_level(l:gz) - a:b + let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) + let l:dr = s:rgb_level(l:gx) - a:r + let l:dg = s:rgb_level(l:gy) - a:g + let l:db = s:rgb_level(l:gz) - a:b + let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) + if l:dgrey < l:drgb + " use the grey + return s:grey_color(l:gx) + else + " use the color + return s:rgb_color(l:x, l:y, l:z) + endif + else + " only one possibility + return s:rgb_color(l:x, l:y, l:z) + endif +endfun + +fun! s:is_empty_or_none(str) + return empty(a:str) || a:str ==? "NONE" +endfun + +" returns the palette index to approximate the 'rrggbb' hex string +fun! s:rgb(rgb) + if s:is_empty_or_none(a:rgb) + return "NONE" + endif + let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0 + let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0 + let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0 + return s:color(l:r, l:g, l:b) +endfun + +fun! s:prefix_highlight_value_with(prefix, color) + if s:is_empty_or_none(a:color) + return "NONE" + else + return a:prefix . a:color + endif +endfun + +fun! s:remove_italic_attr(attr) + let l:attr = join(filter(split(a:attr, ","), "v:val !=? 'italic'"), ",") + if empty(l:attr) + let l:attr = "NONE" + endif + return l:attr +endfun + +" sets the highlighting for the given group +fun! s:X(group, fg, bg, attr, lcfg, lcbg) + if s:low_color + exec "hi ".a:group. + \ " ctermfg=".s:prefix_highlight_value_with("", a:lcfg). + \ " ctermbg=".s:prefix_highlight_value_with("", a:lcbg) + else + exec "hi ".a:group. + \ " guifg=".s:prefix_highlight_value_with("#", a:fg). + \ " guibg=".s:prefix_highlight_value_with("#", a:bg). + \ " ctermfg=".s:rgb(a:fg). + \ " ctermbg=".s:rgb(a:bg) + endif + + let l:attr = s:prefix_highlight_value_with("", a:attr) + + if exists("g:jellybeans_use_term_italics") && g:jellybeans_use_term_italics + let l:cterm_attr = l:attr + else + let l:cterm_attr = s:remove_italic_attr(l:attr) + endif + + if !exists("g:jellybeans_use_gui_italics") || g:jellybeans_use_gui_italics + let l:gui_attr = l:attr + else + let l:gui_attr = s:remove_italic_attr(l:attr) + endif + + exec "hi ".a:group." gui=".l:gui_attr." cterm=".l:cterm_attr +endfun +" }}} + +call s:X("Normal","e8e8d3",s:background_color,"","White","") +set background=dark + +if version >= 700 + call s:X("CursorLine","","1c1c1c","","",s:termBlack) + call s:X("CursorColumn","","1c1c1c","","",s:termBlack) + call s:X("MatchParen","ffffff","556779","bold","","DarkCyan") + + call s:X("TabLine","000000","b0b8c0","italic","",s:termBlack) + call s:X("TabLineFill","9098a0","","","",s:termBlack) + call s:X("TabLineSel","000000","f0f0f0","italic,bold",s:termBlack,"White") + + " Auto-completion + call s:X("Pmenu","ffffff","606060","","White",s:termBlack) + call s:X("PmenuSel","101010","eeeeee","",s:termBlack,"White") +endif + +call s:X("Visual","","404040","","",s:termBlack) +call s:X("Cursor",s:background_color,"b0d0f0","","","") + +call s:X("LineNr","605958",s:background_color,"NONE",s:termBlack,"") +call s:X("CursorLineNr","ccc5c4","","NONE","White","") +call s:X("Comment","888888","","italic","Grey","") +call s:X("Todo","c7c7c7","","bold","White",s:termBlack) + +call s:X("StatusLine","000000","dddddd","italic","","White") +call s:X("StatusLineNC","ffffff","403c41","italic","White","Black") +call s:X("VertSplit","777777","403c41","",s:termBlack,s:termBlack) +call s:X("WildMenu","f0a0c0","302028","","Magenta","") + +call s:X("Folded","a0a8b0","384048","italic",s:termBlack,"") +call s:X("FoldColumn","535D66","1f1f1f","","",s:termBlack) +call s:X("SignColumn","777777","333333","","",s:termBlack) +call s:X("ColorColumn","","000000","","",s:termBlack) + +call s:X("Title","70b950","","bold","Green","") + +call s:X("Constant","cf6a4c","","","Red","") +call s:X("Special","799d6a","","","Green","") +call s:X("Delimiter","668799","","","Grey","") + +call s:X("String","99ad6a","","","Green","") +call s:X("StringDelimiter","556633","","","DarkGreen","") + +call s:X("Identifier","c6b6ee","","","LightCyan","") +call s:X("Structure","8fbfdc","","","LightCyan","") +call s:X("Function","fad07a","","","Yellow","") +call s:X("Statement","8197bf","","","DarkBlue","") +call s:X("PreProc","8fbfdc","","","LightBlue","") + +hi! link Operator Structure +hi! link Conceal Operator + +call s:X("Type","ffb964","","","Yellow","") +call s:X("NonText","606060",s:background_color,"",s:termBlack,"") + +call s:X("SpecialKey","444444","1c1c1c","",s:termBlack,"") + +call s:X("Search","f0a0c0","302028","underline","Magenta","") + +call s:X("Directory","dad085","","","Yellow","") +call s:X("ErrorMsg","","902020","","","DarkRed") +hi! link Error ErrorMsg +hi! link MoreMsg Special +call s:X("Question","65C254","","","Green","") + + +" Spell Checking + +call s:X("SpellBad","","902020","underline","","DarkRed") +call s:X("SpellCap","","0000df","underline","","Blue") +call s:X("SpellRare","","540063","underline","","DarkMagenta") +call s:X("SpellLocal","","2D7067","underline","","Green") + +" Diff + +hi! link diffRemoved Constant +hi! link diffAdded String + +" VimDiff + +call s:X("DiffAdd","D2EBBE","437019","","White","DarkGreen") +call s:X("DiffDelete","40000A","700009","","DarkRed","DarkRed") +call s:X("DiffChange","","2B5B77","","White","DarkBlue") +call s:X("DiffText","8fbfdc","000000","reverse","Yellow","") + +" PHP + +hi! link phpFunctions Function +call s:X("StorageClass","c59f6f","","","Red","") +hi! link phpSuperglobal Identifier +hi! link phpQuoteSingle StringDelimiter +hi! link phpQuoteDouble StringDelimiter +hi! link phpBoolean Constant +hi! link phpNull Constant +hi! link phpArrayPair Operator +hi! link phpOperator Normal +hi! link phpRelation Normal +hi! link phpVarSelector Identifier + +" Python + +hi! link pythonOperator Statement + +" Ruby + +hi! link rubySharpBang Comment +call s:X("rubyClass","447799","","","DarkBlue","") +call s:X("rubyIdentifier","c6b6fe","","","Cyan","") +hi! link rubyConstant Type +hi! link rubyFunction Function + +call s:X("rubyInstanceVariable","c6b6fe","","","Cyan","") +call s:X("rubySymbol","7697d6","","","Blue","") +hi! link rubyGlobalVariable rubyInstanceVariable +hi! link rubyModule rubyClass +call s:X("rubyControl","7597c6","","","Blue","") + +hi! link rubyString String +hi! link rubyStringDelimiter StringDelimiter +hi! link rubyInterpolationDelimiter Identifier + +call s:X("rubyRegexpDelimiter","540063","","","Magenta","") +call s:X("rubyRegexp","dd0093","","","DarkMagenta","") +call s:X("rubyRegexpSpecial","a40073","","","Magenta","") + +call s:X("rubyPredefinedIdentifier","de5577","","","Red","") + +" Erlang + +hi! link erlangAtom rubySymbol +hi! link erlangBIF rubyPredefinedIdentifier +hi! link erlangFunction rubyPredefinedIdentifier +hi! link erlangDirective Statement +hi! link erlangNode Identifier + +" Elixir + +hi! link elixirAtom rubySymbol + + +" JavaScript + +hi! link javaScriptValue Constant +hi! link javaScriptRegexpString rubyRegexp +hi! link javaScriptTemplateVar StringDelim +hi! link javaScriptTemplateDelim Identifier +hi! link javaScriptTemplateString String + +" CoffeeScript + +hi! link coffeeRegExp javaScriptRegexpString + +" Lua + +hi! link luaOperator Conditional + +" C + +hi! link cFormat Identifier +hi! link cOperator Constant + +" Objective-C/Cocoa + +hi! link objcClass Type +hi! link cocoaClass objcClass +hi! link objcSubclass objcClass +hi! link objcSuperclass objcClass +hi! link objcDirective rubyClass +hi! link objcStatement Constant +hi! link cocoaFunction Function +hi! link objcMethodName Identifier +hi! link objcMethodArg Normal +hi! link objcMessageName Identifier + +" Vimscript + +hi! link vimOper Normal + +" HTML + +hi! link htmlTag Statement +hi! link htmlEndTag htmlTag +hi! link htmlTagName htmlTag + +" XML + +hi! link xmlTag Statement +hi! link xmlEndTag xmlTag +hi! link xmlTagName xmlTag +hi! link xmlEqual xmlTag +hi! link xmlEntity Special +hi! link xmlEntityPunct xmlEntity +hi! link xmlDocTypeDecl PreProc +hi! link xmlDocTypeKeyword PreProc +hi! link xmlProcessingDelim xmlAttrib + +" Debugger.vim + +call s:X("DbgCurrent","DEEBFE","345FA8","","White","DarkBlue") +call s:X("DbgBreakPt","","4F0037","","","DarkMagenta") + +" vim-indent-guides + +if !exists("g:indent_guides_auto_colors") + let g:indent_guides_auto_colors = 0 +endif +call s:X("IndentGuidesOdd","","232323","","","") +call s:X("IndentGuidesEven","","1b1b1b","","","") + +" Plugins, etc. + +hi! link TagListFileName Directory +call s:X("PreciseJumpTarget","B9ED67","405026","","White","Green") + +" Manual overrides for 256-color terminals. Dark colors auto-map badly. +if !s:low_color + hi StatusLineNC ctermbg=235 + hi Folded ctermbg=236 + hi DiffText ctermfg=81 + hi DbgBreakPt ctermbg=53 + hi IndentGuidesOdd ctermbg=235 + hi IndentGuidesEven ctermbg=234 +endif + +if !empty("s:overrides") + fun! s:current_attr(group) + let l:synid = synIDtrans(hlID(a:group)) + let l:attrs = [] + for l:attr in ["bold", "italic", "reverse", "standout", "underline", "undercurl"] + if synIDattr(l:synid, l:attr, "gui") == 1 + call add(l:attrs, l:attr) + endif + endfor + return join(l:attrs, ",") + endfun + fun! s:current_color(group, what, mode) + let l:color = synIDattr(synIDtrans(hlID(a:group)), a:what, a:mode) + if l:color == -1 + return "" + else + return substitute(l:color, "^#", "", "") + endif + endfun + fun! s:load_color_def(group, def) + call s:X(a:group, get(a:def, "guifg", s:current_color(a:group, "fg", "gui")), + \ get(a:def, "guibg", s:current_color(a:group, "bg", "gui")), + \ get(a:def, "attr", s:current_attr(a:group)), + \ get(a:def, "ctermfg", s:current_color(a:group, "fg", "cterm")), + \ get(a:def, "ctermbg", s:current_color(a:group, "bg", "cterm"))) + if !s:low_color + for l:prop in ["ctermfg", "ctermbg"] + let l:override_key = "256".l:prop + if has_key(a:def, l:override_key) + exec "hi ".a:group." ".l:prop."=".a:def[l:override_key] + endif + endfor + endif + endfun + fun! s:load_colors(defs) + for [l:group, l:def] in items(a:defs) + if l:group == "background" + call s:load_color_def("LineNr", l:def) + call s:load_color_def("NonText", l:def) + call s:load_color_def("Normal", l:def) + else + call s:load_color_def(l:group, l:def) + endif + unlet l:group + unlet l:def + endfor + endfun + call s:load_colors(s:overrides) + delf s:load_colors + delf s:load_color_def + delf s:current_color + delf s:current_attr +endif + +" delete functions {{{ +delf s:X +delf s:remove_italic_attr +delf s:prefix_highlight_value_with +delf s:rgb +delf s:is_empty_or_none +delf s:color +delf s:rgb_color +delf s:rgb_level +delf s:rgb_number +delf s:grey_color +delf s:grey_level +delf s:grey_number +" }}} diff --git a/vim/colors/molokai.vim b/vim/colors/molokai.vim new file mode 100755 index 0000000..6d97053 --- /dev/null +++ b/vim/colors/molokai.vim @@ -0,0 +1,276 @@ +" Vim color file +" +" Author: Tomas Restrepo +" https://github.com/tomasr/molokai +" +" Note: Based on the Monokai theme for TextMate +" by Wimer Hazenberg and its darker variant +" by Hamish Stuart Macpherson +" + +hi clear + +if version > 580 + " no guarantees for version 5.8 and below, but this makes it stop + " complaining + hi clear + if exists("syntax_on") + syntax reset + endif +endif +let g:colors_name="molokai" + +if exists("g:molokai_original") + let s:molokai_original = g:molokai_original +else + let s:molokai_original = 0 +endif + + +hi Boolean guifg=#AE81FF +hi Character guifg=#E6DB74 +hi Number guifg=#AE81FF +hi String guifg=#E6DB74 +hi Conditional guifg=#F92672 gui=bold +hi Constant guifg=#AE81FF gui=bold +hi Cursor guifg=#000000 guibg=#F8F8F0 +hi iCursor guifg=#000000 guibg=#F8F8F0 +hi Debug guifg=#BCA3A3 gui=bold +hi Define guifg=#66D9EF +hi Delimiter guifg=#8F8F8F +hi DiffAdd guibg=#13354A +hi DiffChange guifg=#89807D guibg=#4C4745 +hi DiffDelete guifg=#960050 guibg=#1E0010 +hi DiffText guibg=#4C4745 gui=italic,bold + +hi Directory guifg=#A6E22E gui=bold +hi Error guifg=#E6DB74 guibg=#1E0010 +hi ErrorMsg guifg=#F92672 guibg=#232526 gui=bold +hi Exception guifg=#A6E22E gui=bold +hi Float guifg=#AE81FF +hi FoldColumn guifg=#465457 guibg=#000000 +hi Folded guifg=#465457 guibg=#000000 +hi Function guifg=#A6E22E +hi Identifier guifg=#FD971F +hi Ignore guifg=#808080 guibg=bg +hi IncSearch guifg=#C4BE89 guibg=#000000 + +hi Keyword guifg=#F92672 gui=bold +hi Label guifg=#E6DB74 gui=none +hi Macro guifg=#C4BE89 gui=italic +hi SpecialKey guifg=#66D9EF gui=italic + +hi MatchParen guifg=#000000 guibg=#FD971F gui=bold +hi ModeMsg guifg=#E6DB74 +hi MoreMsg guifg=#E6DB74 +hi Operator guifg=#F92672 + +" complete menu +hi Pmenu guifg=#66D9EF guibg=#000000 +hi PmenuSel guibg=#808080 +hi PmenuSbar guibg=#080808 +hi PmenuThumb guifg=#66D9EF + +hi PreCondit guifg=#A6E22E gui=bold +hi PreProc guifg=#A6E22E +hi Question guifg=#66D9EF +hi Repeat guifg=#F92672 gui=bold +hi Search guifg=#000000 guibg=#FFE792 +" marks +hi SignColumn guifg=#A6E22E guibg=#232526 +hi SpecialChar guifg=#F92672 gui=bold +hi SpecialComment guifg=#7E8E91 gui=bold +hi Special guifg=#66D9EF guibg=bg gui=italic +if has("spell") + hi SpellBad guisp=#FF0000 gui=undercurl + hi SpellCap guisp=#7070F0 gui=undercurl + hi SpellLocal guisp=#70F0F0 gui=undercurl + hi SpellRare guisp=#FFFFFF gui=undercurl +endif +hi Statement guifg=#F92672 gui=bold +hi StatusLine guifg=#455354 guibg=fg +hi StatusLineNC guifg=#808080 guibg=#080808 +hi StorageClass guifg=#FD971F gui=italic +hi Structure guifg=#66D9EF +hi Tag guifg=#F92672 gui=italic +hi Title guifg=#ef5939 +hi Todo guifg=#FFFFFF guibg=bg gui=bold + +hi Typedef guifg=#66D9EF +hi Type guifg=#66D9EF gui=none +hi Underlined guifg=#808080 gui=underline + +hi VertSplit guifg=#808080 guibg=#080808 gui=bold +hi VisualNOS guibg=#403D3D +hi Visual guibg=#403D3D +hi WarningMsg guifg=#FFFFFF guibg=#333333 gui=bold +hi WildMenu guifg=#66D9EF guibg=#000000 + +hi TabLineFill guifg=#1B1D1E guibg=#1B1D1E +hi TabLine guibg=#1B1D1E guifg=#808080 gui=none + +if s:molokai_original == 1 + hi Normal guifg=#F8F8F2 guibg=#272822 + hi Comment guifg=#75715E + hi CursorLine guibg=#3E3D32 + hi CursorLineNr guifg=#FD971F gui=none + hi CursorColumn guibg=#3E3D32 + hi ColorColumn guibg=#3B3A32 + hi LineNr guifg=#BCBCBC guibg=#3B3A32 + hi NonText guifg=#75715E + hi SpecialKey guifg=#75715E +else + hi Normal guifg=#F8F8F2 guibg=#1B1D1E + hi Comment guifg=#7E8E91 + hi CursorLine guibg=#293739 + hi CursorLineNr guifg=#FD971F gui=none + hi CursorColumn guibg=#293739 + hi ColorColumn guibg=#232526 + hi LineNr guifg=#465457 guibg=#232526 + hi NonText guifg=#465457 + hi SpecialKey guifg=#465457 +end + +" +" Support for 256-color terminal +" +if &t_Co > 255 + if s:molokai_original == 1 + hi Normal ctermbg=234 + hi CursorLine ctermbg=235 cterm=none + hi CursorLineNr ctermfg=208 cterm=none + else + hi Normal ctermfg=252 ctermbg=233 + hi CursorLine ctermbg=234 cterm=none + hi CursorLineNr ctermfg=208 cterm=none + endif + hi Boolean ctermfg=135 + hi Character ctermfg=144 + hi Number ctermfg=135 + hi String ctermfg=144 + hi Conditional ctermfg=161 cterm=bold + hi Constant ctermfg=135 cterm=bold + hi Cursor ctermfg=16 ctermbg=253 + hi Debug ctermfg=225 cterm=bold + hi Define ctermfg=81 + hi Delimiter ctermfg=241 + + hi DiffAdd ctermbg=24 + hi DiffChange ctermfg=181 ctermbg=239 + hi DiffDelete ctermfg=162 ctermbg=53 + hi DiffText ctermbg=102 cterm=bold + + hi Directory ctermfg=118 cterm=bold + hi Error ctermfg=219 ctermbg=89 + hi ErrorMsg ctermfg=199 ctermbg=16 cterm=bold + hi Exception ctermfg=118 cterm=bold + hi Float ctermfg=135 + hi FoldColumn ctermfg=67 ctermbg=16 + hi Folded ctermfg=67 ctermbg=16 + hi Function ctermfg=118 + hi Identifier ctermfg=208 cterm=none + hi Ignore ctermfg=244 ctermbg=232 + hi IncSearch ctermfg=193 ctermbg=16 + + hi keyword ctermfg=161 cterm=bold + hi Label ctermfg=229 cterm=none + hi Macro ctermfg=193 + hi SpecialKey ctermfg=81 + + hi MatchParen ctermfg=233 ctermbg=208 cterm=bold + hi ModeMsg ctermfg=229 + hi MoreMsg ctermfg=229 + hi Operator ctermfg=161 + + " complete menu + hi Pmenu ctermfg=81 ctermbg=16 + hi PmenuSel ctermfg=255 ctermbg=242 + hi PmenuSbar ctermbg=232 + hi PmenuThumb ctermfg=81 + + hi PreCondit ctermfg=118 cterm=bold + hi PreProc ctermfg=118 + hi Question ctermfg=81 + hi Repeat ctermfg=161 cterm=bold + hi Search ctermfg=0 ctermbg=222 cterm=NONE + + " marks column + hi SignColumn ctermfg=118 ctermbg=235 + hi SpecialChar ctermfg=161 cterm=bold + hi SpecialComment ctermfg=245 cterm=bold + hi Special ctermfg=81 + if has("spell") + hi SpellBad ctermbg=52 + hi SpellCap ctermbg=17 + hi SpellLocal ctermbg=17 + hi SpellRare ctermfg=none ctermbg=none cterm=reverse + endif + hi Statement ctermfg=161 cterm=bold + hi StatusLine ctermfg=238 ctermbg=253 + hi StatusLineNC ctermfg=244 ctermbg=232 + hi StorageClass ctermfg=208 + hi Structure ctermfg=81 + hi Tag ctermfg=161 + hi Title ctermfg=166 + hi Todo ctermfg=231 ctermbg=232 cterm=bold + + hi Typedef ctermfg=81 + hi Type ctermfg=81 cterm=none + hi Underlined ctermfg=244 cterm=underline + + hi VertSplit ctermfg=244 ctermbg=232 cterm=bold + hi VisualNOS ctermbg=238 + hi Visual ctermbg=235 + hi WarningMsg ctermfg=231 ctermbg=238 cterm=bold + hi WildMenu ctermfg=81 ctermbg=16 + + hi Comment ctermfg=59 + hi CursorColumn ctermbg=236 + hi ColorColumn ctermbg=236 + hi LineNr ctermfg=250 ctermbg=236 + hi NonText ctermfg=59 + + hi SpecialKey ctermfg=59 + + if exists("g:rehash256") && g:rehash256 == 1 + hi Normal ctermfg=252 ctermbg=234 + hi CursorLine ctermbg=236 cterm=none + hi CursorLineNr ctermfg=208 cterm=none + + hi Boolean ctermfg=141 + hi Character ctermfg=222 + hi Number ctermfg=141 + hi String ctermfg=222 + hi Conditional ctermfg=197 cterm=bold + hi Constant ctermfg=141 cterm=bold + + hi DiffDelete ctermfg=125 ctermbg=233 + + hi Directory ctermfg=154 cterm=bold + hi Error ctermfg=222 ctermbg=233 + hi Exception ctermfg=154 cterm=bold + hi Float ctermfg=141 + hi Function ctermfg=154 + hi Identifier ctermfg=208 + + hi Keyword ctermfg=197 cterm=bold + hi Operator ctermfg=197 + hi PreCondit ctermfg=154 cterm=bold + hi PreProc ctermfg=154 + hi Repeat ctermfg=197 cterm=bold + + hi Statement ctermfg=197 cterm=bold + hi Tag ctermfg=197 + hi Title ctermfg=203 + hi Visual ctermbg=238 + + hi Comment ctermfg=244 + hi LineNr ctermfg=239 ctermbg=235 + hi NonText ctermfg=239 + hi SpecialKey ctermfg=239 + endif +end + +" Must be at the end, because of ctermbg=234 bug. +" https://groups.google.com/forum/#!msg/vim_dev/afPqwAFNdrU/nqh6tOM87QUJ +set background=dark diff --git a/vim/colors/new-railscasts.vim b/vim/colors/new-railscasts.vim new file mode 100644 index 0000000..06374cf --- /dev/null +++ b/vim/colors/new-railscasts.vim @@ -0,0 +1,229 @@ +" Vim color scheme +" +" Name: railscast.vim +" Maintainer: Josh O'Rourke +" Modified: Carlos Ramos, carakan +" License: public domain +" +" A GUI Only port of the RailsCasts TextMate theme [1] to Vim. +" Some parts of this theme were borrowed from the well-documented Lucius theme [2]. +" + +let g:colors_name = "new-railscasts" +hi clear +if exists("syntax_on") + syntax reset +endif +highlight clear SignColumn +set background=dark + +hi Normal guifg=#E6E1DC guibg=#212121 ctermfg=white ctermbg=234 +hi Cursor guifg=#000000 guibg=#FFFFFF ctermfg=0 ctermbg=15 +hi CursorLine guibg=#282828 ctermbg=235 cterm=NONE +hi Search guibg=#072f95 ctermfg=NONE ctermbg=236 +hi Visual guibg=#004568 ctermbg=60 +hi LineNr guifg=#707070 guibg=#2d2d2d ctermfg=242 +hi StatusLine guifg=#e4e4e4 guibg=#606060 gui=NONE ctermfg=254 ctermbg=241 cterm=NONE +hi StatusLineNC guifg=#585858 guibg=#303030 gui=NONE ctermfg=240 ctermbg=236 cterm=NONE + +hi! link CursorColumn ColorColumn +hi VertSplit guibg=#212121 gui=bold guifg=#444444 ctermfg=white ctermbg=234 +hi CursorLineNr guifg=#d7b0fc guibg=#2d2d2d ctermfg=248 +hi ColorColumn guibg=#333435 ctermbg=235 +highlight SignColumn guibg=#2d2d2d + +" StatusLine +" Bold +hi User1 guifg=#eeeeee guibg=#606060 gui=bold ctermfg=255 ctermbg=241 cterm=bold +" Yellow +hi User2 guifg=#FFAF00 guibg=#606060 gui=bold ctermfg=214 ctermbg=241 cterm=bold +" Green +hi User3 guifg=#15d300 guibg=#606060 gui=bold ctermfg=82 ctermbg=241 cterm=bold +" Red +hi User4 guifg=#870000 guibg=#606060 gui=bold ctermfg=88 ctermbg=241 cterm=bold +hi User5 guifg=#e4e4e4 guibg=#606060 gui=bold ctermfg=254 ctermbg=241 cterm=bold +hi User6 guifg=#e4e4e4 guibg=#606060 gui=bold ctermfg=254 ctermbg=241 cterm=bold +hi User7 guifg=#e4e4e4 guibg=#606060 gui=bold ctermfg=254 ctermbg=241 cterm=bold +hi User8 guifg=#e4e4e4 guibg=#606060 gui=bold ctermfg=254 ctermbg=241 cterm=bold +hi User9 guifg=#e4e4e4 guibg=#606060 gui=bold ctermfg=254 ctermbg=241 cterm=bold + +" Folds +" ----- +hi Folded guifg=#F6F3E8 guibg=#444444 gui=NONE + +" Invisible Characters +" ------------------ +hi NonText guifg=#777777 gui=NONE +hi SpecialKey guifg=#777777 gui=NONE + +" Misc +" ---- +" directory names and other special names in listings +hi Directory guifg=#A5C261 gui=NONE + +" Popup Menu +" ---------- +" normal item in popup +hi Pmenu guifg=#F6F3E8 guibg=#444444 gui=NONE ctermfg=white ctermbg=237 +" selected item in popup +hi PmenuSel guifg=#000000 guibg=#A5C261 gui=NONE +" scrollbar in popup +hi PMenuSbar guibg=#5A647E gui=NONE +" thumb of the scrollbar in the popup +hi PMenuThumb guibg=#AAAAAA gui=NONE + +" Comment +hi Comment guifg=#BC9458 guibg=NONE gui=italic ctermfg=137 cterm=italic +hi Todo guifg=#df5f5f guibg=NONE gui=bold ctermfg=94 + +"rubyPseudoVariable: nil, self, symbols, etc +hi Constant guifg=#6D9CBE ctermfg=73 +" rubyClass, rubyModule, rubyDefine def, end, include, etc +hi Define guifg=#CC7833 ctermfg=173 +" Interpolation +hi Delimiter guifg=#519F50 +hi WarningMsg guifg=#DA4939 guibg=NONE ctermfg=1 ctermbg=NONE +" Error, rubyInvalidVariable +hi Error guifg=#FFFFFF guibg=#990000 ctermfg=221 ctermbg=88 +"rubyFunction +hi! Function guifg=#FFC66D guibg=NONE ctermfg=221 cterm=NONE +" Identifier: @var, @@var, $var, etc +hi Identifier guifg=#d7b0fc guibg=NONE ctermfg=73 cterm=NONE +" Include: include, autoload, extend, load, require +hi Include guifg=#CC7833 guibg=NONE ctermfg=173 cterm=NONE +" Keyword, rubyKeywordAsMethod: alias, undef, super, yield, callcc, caller, lambda, proc +hi Keyword guifg=#d8690f ctermfg=172 cterm=NONE +" same as define +hi Macro guifg=#CC7833 guibg=NONE ctermfg=172 +"rubyInteger +hi Number guifg=#A5C261 ctermfg=107 +hi Boolean guifg=#47a3e5 ctermfg=107 gui=italic +" #if, #else, #endif +hi PreCondit guifg=#CC7833 guibg=NONE ctermfg=172 cterm=NONE +" generic preprocessor +hi PreProc guifg=#CC7833 guibg=NONE ctermfg=103 +" Control, Access, Eval: case, begin, do, for, if unless, while, until else, etc. +hi Statement guifg=#CC7833 guibg=NONE ctermfg=172 cterm=NONE +" String +hi String guifg=#74d155 guibg=NONE ctermfg=107 +hi! Title guifg=#FFFFFF guibg=NONE ctermfg=15 +" Constant +hi Type guifg=#ff5d4f guibg=NONE gui=NONE +hi PreProc guifg=#ff8700 guibg=NONE ctermfg=208 +hi Special guifg=#ff8700 guibg=NONE ctermfg=22 +hi Operator guifg=#CC7833 guibg=NONE ctermfg=73 +hi Tag guifg=#CC7833 guibg=NONE ctermfg=73 +hi Label guifg=#6D9CBE ctermfg=221 gui=bold + +" Indentation +hi IndentGuidesOdd ctermbg=239 guibg=#282828 +hi IndentGuidesEven ctermbg=237 guibg=#332717 + +" Diffs +hi DiffAdd guifg=#e4e4e4 guibg=#519F50 ctermfg=254 ctermbg=22 +hi DiffDelete guifg=#e4e4e4 guibg=#660000 gui=bold ctermfg=16 ctermbg=52 cterm=bold +hi DiffChange guifg=#FFFFFF guibg=#870087 ctermfg=15 ctermbg=90 +hi DiffText guifg=#FFC66D guibg=#FF0000 gui=bold ctermfg=15 ctermbg=9 cterm=bold + +hi diffAdded guifg=#008700 ctermfg=28 +hi diffRemoved guifg=#800000 ctermfg=1 +hi diffNewFile guifg=#FFFFFF guibg=NONE gui=bold ctermfg=15 ctermbg=NONE cterm=bold +hi diffFile guifg=#FFFFFF guibg=NONE gui=bold ctermfg=15 ctermbg=NONE cterm=bold + + +hi javaScriptOperator guifg=#c9d05c ctermfg=185 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi javaScriptBraces guifg=#dd7927 ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi javaScriptNull guifg=#dd7927 ctermfg=215 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + +" Ruby +" ---- +hi rubyTodo guifg=#fc5858 guibg=NONE gui=bold ctermfg=167 ctermbg=NONE cterm=bold +hi rubyClass guifg=#dd7927 ctermfg=15 +hi rubyConstant guifg=#fc5858 ctermfg=167 +hi rubyInterpolation guifg=#ea8c3f ctermfg=15 +hi rubyBlockParameter guifg=#d7b0fc ctermfg=189 +hi rubyPseudoVariable guifg=#47a3e5 ctermfg=221 gui=italic +hi rubySymbol guifg=#6D9CBE ctermfg=73 gui=bold +hi rubyStringDelimiter guifg=#87af5f ctermfg=107 +hi rubyInstanceVariable guifg=#d7b0fc ctermfg=189 +hi rubyPredefinedConstant guifg=#fc5858 ctermfg=167 +hi rubyLocalVariableOrMethod guifg=#d7b0fc ctermfg=189 +hi rubyBoolean guifg=#47a3e5 gui=italic + +" JAVASCRIPT +" +hi jsFunction guifg=#ff8700 ctermfg=221 gui=italic +hi jsFunctionKey guifg=#ff8700 ctermfg=221 gui=italic +hi jsArrowFunction guifg=#ff8700 ctermfg=221 +hi jsObjectKey guifg=#6D9CBE ctermfg=73 gui=bold +hi jsThis guifg=#d7b0fc ctermfg=189 gui=italic +hi jsStorageClass guifg=#fc5858 ctermfg=167 gui=italic +hi jsNull guifg=#ff8700 ctermfg=221 gui=italic + +" Typescript +" +hi typescriptArrowFunc guifg=#ff8700 ctermfg=221 gui=italic +hi typescriptIdentifier guifg=#d7b0fc ctermfg=189 gui=italic +hi typescriptAsyncFuncKeyword guifg=#47a3e5 gui=italic +hi typescriptType guifg=#ff8700 ctermfg=167 gui=italic +hi typescriptObjectLabel guifg=#6D9CBE ctermfg=73 gui=bold + +" Python +" ------ +hi pythonExceptions guifg=#ffaf87 ctermfg=216 +hi pythonDoctest guifg=#8787ff ctermfg=105 +hi pythonDoctestValue guifg=#87d7af ctermfg=115 + +" Elixir +" +hi elixirAtom guifg=#6D9CBE ctermfg=221 gui=bold +hi elixirTuple guifg=#6D9CBE ctermfg=221 gui=bold +hi elixirDefine guifg=#CC7833 ctermfg=173 gui=bold +hi elixirPrivateDefine guifg=#CC7833 ctermfg=173 gui=bold +hi elixirModuleDefine guifg=#CC7833 ctermfg=173 gui=bold + +" Ember.js +" +hi hbsProperty guifg=#ff8700 ctermfg=221 gui=italic +hi mustacheHandlebars guifg=#CC7833 ctermfg=173 gui=bold + +" CSS +hi cssClassName guifg=#FFC66D gui=italic +hi cssIdentifier guifg=#47a3e5 gui=italic + +" JSON +hi jsonBoolean guifg=#47a3e5 gui=italic +hi jsonNull guifg=#47a3e5 gui=italic + +" yaml +hi yamlKey guifg=#d7b0fc ctermfg=189 gui=bold + +" Mail +" ---- +hi mailEmail guifg=#87af5f ctermfg=107 gui=italic cterm=underline +hi mailHeaderKey guifg=#ffdf5f ctermfg=221 +hi! link mailSubject mailHeaderKey + +" Spell +" ---- +hi! SpellBad guifg=#df5f87 guibg=NONE gui=NONE ctermfg=160 ctermbg=NONE cterm=underline +hi! SpellRare guifg=#df5f87 guibg=NONE gui=NONE ctermfg=168 ctermbg=NONE cterm=underline +hi! SpellCap guifg=#dfdfff guibg=NONE gui=NONE ctermfg=189 ctermbg=NONE cterm=underline +hi! SpellLocal guifg=#00FFFF guibg=NONE gui=NONE ctermfg=51 ctermbg=NONE cterm=underline +hi! MatchParen guifg=#FFFFFF guibg=#005f5f ctermfg=15 ctermbg=23 +hi! Question guifg=#df5f87 guibg=NONE gui=NONE ctermfg=168 ctermbg=NONE cterm=underline + +" XML +" --- +hi xmlTag guifg=#dfaf5f ctermfg=179 +hi xmlTagName guifg=#dfaf5f ctermfg=179 +hi xmlEndTag guifg=#dfaf5f ctermfg=179 + +hi link htmlTag xmlTag +hi link htmlTagName xmlTagName +hi link htmlEndTag xmlEndTag +hi htmlArg guifg=#ff8700 ctermfg=221 gui=italic + +hi checkbox guifg=#3a3a3a guibg=NONE gui=NONE ctermfg=237 ctermbg=NONE cterm=NONE +hi checkboxDone guifg=#15d300 guibg=NONE gui=BOLD ctermfg=82 ctermbg=NONE cterm=BOLD +hi checkboxNotDone guifg=#005fdf guibg=NONE gui=BOLD ctermfg=26 ctermbg=NONE cterm=BOLD diff --git a/vim/colors/sexy-railscasts.vim b/vim/colors/sexy-railscasts.vim new file mode 100755 index 0000000..187fc18 --- /dev/null +++ b/vim/colors/sexy-railscasts.vim @@ -0,0 +1,102 @@ +" Name: sexy-railscast vim colorscheme +" Modifier: Oguz Bilgic +" Url: https://github.com/oguzbilgic/sexy-railscasts-theme +" License: public domain +" +" A GUI Only port of the RailsCasts TextMate theme [1] to Vim. +" Some parts of this theme were borrowed from the well-documented Lucius theme [2]. +" Initial file was written by Josh O'Rourke [3] then improved by Oguz Bilgic +" +" [1] http://railscasts.com/about +" [2] http://www.vim.org/scripts/script.php?script_id=2536 +" [3] https://github.com/jpo/vim-railscasts-theme + +" ----------------------------------------------------------------------------------- +" Settings +" ----------------------------------------------------------------------------------- +set background=dark +hi clear +if exists("syntax_on") + syntax reset +endif +let g:colors_name = "sexy-railscasts" + +" ----------------------------------------------------------------------------------- +" Basics +" ----------------------------------------------------------------------------------- +hi Normal guifg=#E6E1DC guibg=#222222 +hi Cursor guibg=#FFFFFF +hi CursorLine guibg=#333435 +hi LineNr guifg=#383838 guibg=#141414 +hi SignColumn guibg=#222222 +hi NonText guifg=#383838 guibg=#252525 +hi Search guibg=#5A647E +hi VertSplit guifg=#383838 guibg=#383838 +hi Visual guibg=#5A647E +hi Title guifg=#FFFFFF + +" ----------------------------------------------------------------------------------- +" Folds +" ----------------------------------------------------------------------------------- +hi Folded guifg=#F6F3E8 guibg=#444444 gui=NONE + +" ----------------------------------------------------------------------------------- +" Misc +" ----------------------------------------------------------------------------------- +hi Directory guifg=#A5C261 gui=NONE + +" ----------------------------------------------------------------------------------- +" Popup Menu +" ----------------------------------------------------------------------------------- +hi Pmenu guifg=#F6F3E8 guibg=#444444 gui=NONE +hi PmenuSel guifg=#000000 guibg=#A5C261 gui=NONE +hi PMenuSbar guibg=#5A647E gui=NONE +hi PMenuThumb guibg=#AAAAAA gui=NONE + +" ----------------------------------------------------------------------------------- +" Syntax +" ----------------------------------------------------------------------------------- +hi Comment guifg=#BC9458 gui=italic +hi Todo guifg=#BC9458 guibg=NONE gui=italic +hi Constant guifg=#6D9CBE +hi Define guifg=#CC7833 +hi Delimiter guifg=#519F50 +hi Error guifg=#FFFFFF guibg=#990000 +hi Function guifg=#FFC66D gui=NONE +hi Identifier guifg=#D0D0FF gui=NONE +hi Include guifg=#CC7833 gui=NONE +hi Keyword guifg=#CC7833 +hi Macro guifg=#CC7833 gui=NONE +hi Number guifg=#A5C261 +hi PreCondit guifg=#CC7833 gui=NONE +hi PreProc guifg=#CC7833 gui=NONE +hi Statement guifg=#CC7833 gui=NONE +hi String guifg=#A5C261 +hi Type guifg=#DA4939 gui=NONE + +" ----------------------------------------------------------------------------------- +" Ruby +" ----------------------------------------------------------------------------------- +hi erubyDelimiter guifg=#DA4939 + +" ----------------------------------------------------------------------------------- +" Git +" ----------------------------------------------------------------------------------- +hi DiffAdd guifg=#E6E1DC guibg=#144212 +hi DiffDelete guifg=#E6E1DC guibg=#660000 + +" ----------------------------------------------------------------------------------- +" Xml +" ----------------------------------------------------------------------------------- +hi xmlTag guifg=#E8BF6A +hi xmlTagName guifg=#E8BF6A +hi xmlEndTag guifg=#E8BF6A + +" ----------------------------------------------------------------------------------- +" Html +" ----------------------------------------------------------------------------------- +hi htmlArg guifg=#FFC66D guibg=#222222 +hi link htmlTag xmlTag +hi link htmlTagName xmlTagName +hi link htmlEndTag xmlEndTag + diff --git a/vim/config/keybindings.vim b/vim/config/keybindings.vim new file mode 100644 index 0000000..eb8da51 --- /dev/null +++ b/vim/config/keybindings.vim @@ -0,0 +1,40 @@ +" No Arrowkeys +no +no +no +no +ino +ino +ino +ino +vno +vno +vno +vno + +" Misc Keybindings +let mapleader = "," + +" Window Movement +nnoremap +nnoremap +nnoremap +nnoremap + +" Yankstack +nmap yankstack_substitute_newer_paste +nmap yankstack_substitute_older_paste + +" CTRL + Space = Autocomplete +inoremap +imap + +" Syntastic +nnoremap :SyntasticToggleMode + +" SingleCompile +nmap :SCChooseCompiler +nmap :SCCompile +nmap :SCCompileRun + +nmap g~iw diff --git a/vim/config/plugin.vim b/vim/config/plugin.vim new file mode 100644 index 0000000..f08b395 --- /dev/null +++ b/vim/config/plugin.vim @@ -0,0 +1,106 @@ +" Airline +if !exists('g:airline_symbols') + let g:airline_symbols = {} +endif +let g:airline_left_sep = '' +let g:airline_left_alt_sep = '' +let g:airline_right_sep = '' +let g:airline_right_alt_sep = '' +let g:airline_symbols.branch = '' +let g:airline_symbols.readonly = '' +let g:airline_symbols.linenr = '' +let g:airline#extensions#tabline#left_sep='' +let g:airline#extensions#tabline#left_alt_sep='' +let g:airline_symbols.maxlinenr = '' +let g:airline#extensions#tabline#enabled = 1 +let g:airline#extensions#wordcount#enabled = 1 +let g:airline_theme="minimalist" + +" GoldenView +let g:goldenview__enable_default_mapping = 0 +let g:goldenview__ignore_urule = { + \ 'filetype' : [ + \ '' , + \ 'qf' , 'vimpager', 'undotree', 'tagbar', + \ 'nerdtree', 'vimshell', 'vimfiler', 'voom' , + \ 'tabman' , 'unite' , 'quickrun', 'Decho' , + \ 'netrw' , + \ ], + \ 'buftype' : [ + \ 'nofile' , + \ ], + \ 'bufname' : [ + \ 'GoToFile' , 'diffpanel_\d\+' , + \ '__Gundo_Preview__' , '__Gundo__' , + \ '\[LustyExplorer-Buffers\]' , '\-MiniBufExplorer\-' , + \ '_VOOM\d\+$' , '__Urannotate_\d\+__' , + \ '__MRU_Files__' , + \ ], + \} +let g:goldenview__restore_urule = { + \ 'filetype' : [ + \ 'nerdtree', 'vimfiler', 'netrw', + \ ], + \ 'bufname' : [ + \ '__MRU_Files__' , + \ ], + \ } + + +" JavaComplete +if has("autocmd") + autocmd Filetype java setlocal omnifunc=javacomplete#CompleteParamsInfo +endif + +" Deoplete +let g:deoplete#enable_at_startup = 1 + +" NeoComplete +" let g:acp_enableAtStartup = 0 +" let g:neocomplete#enable_at_startup = 1 +" let g:neocomplete#enable_smart_case = 1 + +" NerdCommenter +let g:NERDSpaceDelims = 1 +let g:NERDCompactSexyComs = 1 +let g:NERDDefaultAlign = "left" +let g:NERDCommentEmptyLines = 1 +let g:NERDTrimTrailingWhitespace = 1 + +" NerdTree +" let g:NERDTreeShowHidden = 1 +" " let NERDTreeMinimalUI = 1 +" let NERDTreeCascadeSingleChildDir = 1 +" let NERDTreeCascadeOpenSingleChildDir = 1 +" autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif +" let g:nerdtree_tabs_open_on_console_startup = 1 + +" PythonSyntax +let python_highlight_all = 1 + +" Simpylfold +let g:SimpylFold_docstring_preview = 1 + +" Supertab +let g:SuperTabDefaultCompletionType = "" + +" Syntastic +let g:syntastic_always_populate_loc_list = 1 +let g:syntastic_auto_loc_list = 1 +let g:syntastic_check_on_open = 1 +let g:syntastic_check_on_wq = 0 +let g:syntastic_mode_map={"mode":"active", "active_filetypes": [], "passive_filetypes": ['tex']} +let g:syntastic_python_checkers=['flake8'] +let g:syntastic_python_flake8_args='--ignore=E501,E225' + + +" UltiSnips +let g:UltiSnipsJumpForwardTrigger="" +let g:UltiSnipsJumpBackwardTrigger="" + +" Whitespace +autocmd BufEnter * EnableStripWhitespaceOnSave + +" Yankstack +let g:yankstack_map_keys = 0 +call yankstack#setup() diff --git a/vim/plugins/FastFold/.gitignore b/vim/plugins/FastFold/.gitignore new file mode 100644 index 0000000..926ccaa --- /dev/null +++ b/vim/plugins/FastFold/.gitignore @@ -0,0 +1 @@ +doc/tags diff --git a/vim/plugins/FastFold/README.md b/vim/plugins/FastFold/README.md new file mode 100644 index 0000000..1c51fb0 --- /dev/null +++ b/vim/plugins/FastFold/README.md @@ -0,0 +1,106 @@ +# What good will FastFold do? + +Automatic folds (that is, folds generated by a fold method different +from `manual`), bog down VIM noticeably in insert mode. They are also often +recomputed too early (for example, when inserting an opening fold marker +whose closing counterpart is yet missing to complete the fold.) + +See http://vim.wikia.com/wiki/Keep_folds_closed_while_inserting_text +for a discussion. + +With this plug-in, the folds in the currently edited buffer are updated by an +automatic fold method only + +- when saving the buffer +- when closing or opening folds (zo, za, zc, etc...) +- when moving or operating fold-wise (zj,zk,[z,]z) +- when typing `zuz` in normal mode + +and are kept as is otherwise (by keeping the fold method set to `manual`). + +# Example Setup + +Each of these triggers for updating folds can be modified or disabled by adding +the lines + +```vim +nmap zuz (FastFoldUpdate) +let g:fastfold_savehook = 1 +let g:fastfold_fold_command_suffixes = ['x','X','a','A','o','O','c','C'] +let g:fastfold_fold_movement_commands = [']z', '[z', 'zj', 'zk'] +``` + +to the file `~/.vimrc` (respectively `%USERPROFILE%/_vimrc` on Microsoft Windows). + +For example, by adding + +```vim +let g:tex_fold_enabled=1 +let g:vimsyn_folding='af' +let g:xml_syntax_folding = 1 +let g:php_folding = 1 +let g:perl_fold = 1 +``` + +to the `.vimrc` file and installing this plug-in, the folds in a TeX, Vim, XML, +PHP or Perl file are updated by the `syntax` fold method when saving the +buffer, opening, closing, moving or operating on folds, or typing `zuz` in +normal mode and are kept as is otherwise. + +*Set fold methods for every file type only*! Setting it globally risks that FastFold assumes the wrong, global, fold method instead of that intended by the file type plug-in, for example TagList. + +# Configuration + +- If you prefer that folds are only updated manually but not when saving the buffer, + then add `let g:fastfold_savehook = 0` to your `.vimrc`. + +- If you prefer that folds are updated whenever you close or open folds by a + standard keystroke such as `zx`,`zo` or `zc`, then add `let + g:fastfold_fold_command_suffixes = []` to your `.vimrc`. + + The exact list of these standard keystrokes is `zx,zX,za,zA,zo,zO,zc,zC` and + it can be customized by changing the global variable + `g:fastfold_mapsuffixes`. If you wanted to intercept all possible fold + commands (such as zr,zm,...), change this to: + + ```vim + let g:fastfold_fold_command_suffixes = + ['x','X','a','A','o','O','c','C','r','R','m','M','i','n','N'] + ``` + +- If you prefer that this plug-in does not add a normal mode mapping that updates + folds (that defaults to `zuz`), then add + `nmap (DisableFastFoldUpdate) (FastFoldUpdate) ` to your `.vimrc`. + + You can remap `zuz` to your favorite keystroke, say ``, by adding + `nmap (FastFoldUpdate)` to your `.Vimrc`. + + There is also a command `FastFoldUpdate` that updates all folds and its + variant `FastFoldUpdate!` that updates all folds and echos by which fold + method the folds were updated. + +# Addons + +## Vim-Stay + +`FastFold` integrates with the plug-in +[vim-stay](https://github.com/kopischke/vim-stay/issues) that restores the +folds of a file buffer by `:mkview` and `:loadview`. + +## Custom Fold Text + +A `CustomFoldText()` function that displays the percentage of the number of buffer lines that the folded text takes up and indents folds according to their nesting level, similar to [that](http://www.gregsexton.org/2011/03/improving-the-text-displayed-in-a-fold/) by Greg Sexton, is available at + +http://www.github.com/Konfekt/FoldText + +## Fold Text-Object + +Create a fold text object, mapped to `iz` and `az`, by adding the lines + +```vim +xnoremap iz :FastFoldUpdate:normal! ]zv[z +xnoremap az :FastFoldUpdate:normal! ]zV[z +``` + +to the file `~/.vimrc` (respectively `%USERPROFILE%/_vimrc` on Microsoft Windows). + diff --git a/vim/plugins/FastFold/doc/FastFold.txt b/vim/plugins/FastFold/doc/FastFold.txt new file mode 100644 index 0000000..42484ea --- /dev/null +++ b/vim/plugins/FastFold/doc/FastFold.txt @@ -0,0 +1,153 @@ + FastFold, folding optimization *FastFold* *fastfold* + +=========================================================================== +0. Introduction ~ + *FastFold-intro* *fastfold-intro* + +Automatic folds - that is, folds generated by a fold method different +from `manual` - bog down VIM considerably in insert mode. Also, they are often +re-evaluated prematurely for example, when inserting an opening fold marker +whose closing counterpart has yet to be added to complete the fold. + +See http://vim.wikia.com/wiki/Keep_folds_closed_while_inserting_text +for a discussion. + +With this plug-in, the folds in the currently edited buffer are updated when +certain triggers are met: + +- when saving the buffer +- when closing or opening folds (zo, za, zc, etc...) +- when moving or operating fold-wise (zj,zk,[z,]z) +- when typing `zuz` in normal mode + +=========================================================================== +1. Commands ~ + *FastFold-commands* *fastfold-commands* + *FastFoldUpdate!* + +- `:FastFoldUpdate` updates all folds in the current buffer. +- `:FastFoldUpdate!` updates all folds & echoes what fold method was used + +- The mapping `zuz` that invokes `:FastFoldUpdate!` can be changed to your + favorite keystroke, say ``, by adding +> + nmap (FastFoldUpdate) +< + to your `.vimrc`. It can be disabled by adding +> + nmap (DisableFastFoldUpdate) (FastFoldUpdate) +< +=========================================================================== +2. Config ~ + *FastFold-config* *fastfold-config* + +Each of the above triggers can be enabled or disabled by setting the +matching global flags in your `.vimrc`. Default values are shown. +> + let g:fastfold_savehook = 1 + let g:fastfold_fdmhook = 0 + nmap zuz (FastFoldUpdate) + let g:fastfold_fold_command_suffixes = ['x','X','a','A','o','O','c','C'] + let g:fastfold_fold_movement_commands = [']z', '[z', 'zj', 'zk'] +< +For example, by adding the following to your `.vimrc` +> + let g:tex_fold_enabled=1 + let g:vimsyn_folding='af' + let g:xml_syntax_folding = 1 + let g:php_folding = 1 + let g:perl_fold = 1 +< +You will enable tex, vim, xml, php and perl syntax folding. + +Set fold methods for every file type only! Setting it globally risks that +FastFold assumes the wrong, global, fold method instead of that intended by the +file type plug-in, for example TagList. + +----------------------------- + +- FastFold updates all folds when you open or close folds by the commands + zx, zX, za, zA, zo, zO, zc, zC. This list of commands is configured by +> + let g:fastfold_fold_command_suffixes = ['x','X','a','A','o','O','c','C'] +< + To intercept all possible fold commands (such as zr,zm,...),change this to +> + let g:fastfold_fold_command_suffixes = + ['x','X','a','A','o','O','c','C','r','R','m','M','i','n','N'] +< + To disable all interceptions, change this to +> + let g:fastfold_fold_command_suffixes = [] +< +- FastFold updates all fold when you move or operate fold-wise by + the commands zj,zk,[z or ]z. This list of commands is configured by +> + let g:fastfold_fold_movement_commands = [']z', '[z', 'zj', 'zk'] +< + It can be disabled by +> + let g:fastfold_fold_movement_commands = [] +< +- FastFold updates all folds when you save a buffer. This hook is set by +> + let g:fastfold_savehook = 1 +< +- FastFold intercepts every change of the fold method by +> + let g:fastfold_fdmhook = 1 +< + This is disabled by default as it could interfere with other plugins such as + `easymotion`. + +- To disable FastFold for a list of file types, such as 'taglist', add +> +` let g:fastfold_skip_filetypes`= [ 'taglist' ] +< + to your 'vimrc'. Default value is []. + +- Add a fold text-object, mapped to `iz` and `az`, by adding the lines + + xnoremap iz :FastFoldUpdate:normal! ]zv[z + xnoremap az :FastFoldUpdate:normal! ]zV[z + + to your 'vimrc'. +=========================================================================== +3. Extra Notes ~ + +3.1 Related Plugins ~ + +`FastFold` integrates with the plug-in `vim-stay` available at + +https://github.com/kopischke/vim-stay + +that stores and restores the last folds by `:mkview` and `:loadview`. + +------------------------------ + +A fold-text function `CustomFoldText()` that displays the percentage of the +number of buffer lines that the folded text takes up and indents folds +according to their nesting level is available at + +http://www.github.com/Konfekt/FoldText + +3.2 Warning ~ + +FastFold overwrites your manual folds when saving the currently edited buffer, +unless + +- FastFold is disabled for this filetype by `g:fastfold_skip_filetypes`, or +- the `foldmethod=manual` since having entered the buffer. + +3.3 API ~ + +The last used fold method by which FastFold updates the folds in the current +buffer can be read off from the window local variable `w:lastdfm`. + +3.4 Thanks go to... ~ + +- starcraftman for providing this documentation, and +- blueyed, kopischke, sabauma, willywampa, and many others for reporting +issues and suggesting code improvements. + +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl diff --git a/vim/plugins/FastFold/plugin/fastfold.vim b/vim/plugins/FastFold/plugin/fastfold.vim new file mode 100644 index 0000000..19de8f8 --- /dev/null +++ b/vim/plugins/FastFold/plugin/fastfold.vim @@ -0,0 +1,224 @@ +scriptencoding utf-8 + +" LICENCE PUBLIQUE RIEN À BRANLER +" Version 1, Mars 2009 +" +" Copyright (C) 2009 Sam Hocevar +" 14 rue de Plaisance, 75014 Paris, France +" +" La copie et la distribution de copies exactes de cette licence sont +" autorisées, et toute modification est permise à condition de changer +" le nom de la licence. +" +" CONDITIONS DE COPIE, DISTRIBUTON ET MODIFICATION +" DE LA LICENCE PUBLIQUE RIEN À BRANLER +" +" 0. Faites ce que vous voulez, j’en ai RIEN À BRANLER. + +if exists('g:loaded_fastfold') || &cp + finish +endif +let g:loaded_fastfold = 1 + +let s:keepcpo = &cpo +set cpo&vim +" ------------------------------------------------------------------------------ + +if !exists('g:fastfold_fdmhook') | let g:fastfold_fdmhook = 0 | endif +if !exists('g:fastfold_savehook') | let g:fastfold_savehook = 1 | endif +if !exists('g:fastfold_fold_command_suffixes') + let g:fastfold_fold_command_suffixes = ['x','X','a','A','o','O','c','C'] +endif +if !exists('g:fastfold_fold_movement_commands') + let g:fastfold_fold_movement_commands = [']z', '[z', 'zj', 'zk'] +endif +if !exists('g:fastfold_skip_filetypes') | let g:fastfold_skip_filetypes = [] | endif + +function! s:EnterWin() + if exists('w:unchanged') + unlet w:unchanged + elseif s:Skip() + if exists('w:lastfdm') + unlet w:lastfdm + endif + else + let w:lastfdm = &l:foldmethod + setlocal foldmethod=manual + endif +endfunction + +function! s:LeaveWin() + if exists('w:predifffdm') + if empty(&l:foldmethod) || &l:foldmethod is# 'manual' + let &l:foldmethod = w:predifffdm + unlet w:predifffdm + return + elseif &l:foldmethod isnot# 'diff' + unlet w:predifffdm + endif + endif + + if exists('w:lastfdm') && &l:foldmethod is# 'diff' + let w:predifffdm = w:lastfdm + endif + + if exists('w:lastfdm') && &l:foldmethod is# 'manual' + if !exists('b:last_changedtick') || b:changedtick > b:last_changedtick + let &l:foldmethod = w:lastfdm + let b:last_changedtick = b:changedtick + else + let w:unchanged = 1 + endif + endif +endfunction + +" Like windo but restore the current buffer. +" See http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers#Restoring_position +function! s:WinDo( command ) + " avoid errors in CmdWin + if exists('*getcmdwintype') && !empty(getcmdwintype()) + return + endif + " Work around Vim bug. + " See https://groups.google.com/forum/#!topic/vim_dev/LLTw8JV6wKg + let curaltwin = winnr('#') ? winnr('#') : 1 + let currwin=winnr() + if &scrollopt =~# '\' + set scrollopt-=jump + let l:restore = 'set scrollopt+=jump' + endif + silent! execute 'keepjumps noautocmd windo ' . a:command + silent! execute 'noautocmd ' . curaltwin . 'wincmd w' + silent! execute 'noautocmd ' . currwin . 'wincmd w' + if exists('l:restore') + exe l:restore + endif +endfunction + +" WinEnter then TabEnter then BufEnter then BufWinEnter +function! s:UpdateWin(check) + " skip if another session still loading + if a:check && exists('g:SessionLoad') | return | endif + + let s:curwin = winnr() + call s:WinDo('if winnr() is s:curwin | call s:LeaveWin() | endif') + call s:WinDo('if winnr() is s:curwin | call s:EnterWin() | endif') +endfunction + +function! s:UpdateBuf(feedback) + let s:curbuf = bufnr('%') + call s:WinDo("if bufnr('%') is s:curbuf | call s:LeaveWin() | endif") + call s:WinDo("if bufnr('%') is s:curbuf | call s:EnterWin() | endif") + + if !a:feedback | return | endif + + if !exists('w:lastfdm') + echomsg "'" . &l:foldmethod . "' folds already continuously updated" + else + echomsg "updated '" . w:lastfdm . "' folds" + endif +endfunction + +function! s:UpdateTab() + " skip if another session still loading + if exists('g:SessionLoad') | return | endif + + call s:WinDo('call s:LeaveWin()') + call s:WinDo('call s:EnterWin()') +endfunction + +function! s:Skip() + if !s:isReasonable() | return 1 | endif + if !&l:modifiable | return 1 | endif + if s:inSkipList() | return 1 | endif + + return 0 +endfunction + +function! s:isReasonable() + if &l:foldmethod is# 'syntax' || &l:foldmethod is# 'expr' + return 1 + else + return 0 + endif +endfunction + +function! s:inSkipList() + for ifiles in g:fastfold_skip_filetypes + if index(g:fastfold_skip_filetypes, &l:filetype) >= 0 + return 1 + endif + endfor + return 0 +endfunction + +command! -bar -bang FastFoldUpdate call s:UpdateBuf(0) + +nnoremap (FastFoldUpdate) :FastFoldUpdate! + +if !hasmapto('(FastFoldUpdate)', 'n') && empty(mapcheck('zuz', 'n')) + nmap zuz (FastFoldUpdate) +endif + +for suffix in g:fastfold_fold_command_suffixes + execute 'nnoremap z'.suffix.' :call UpdateWin(0)z'.suffix +endfor + +for cmd in g:fastfold_fold_movement_commands + exe "nnoremap " . cmd. " ':call UpdateWin(0)'.v:count." . "'".cmd."'" + exe "xnoremap " . cmd. " ':call UpdateWin(0)gv'.v:count." . "'".cmd."'" + exe "onoremap " . cmd. " ':call UpdateWin(0)' . '\"' . v:register . v:operator . v:count1 . " . "'".cmd."'" +endfor + +augroup FastFold + autocmd! + autocmd VimEnter * call s:init() + autocmd BufEnter,WinEnter * + \ if !exists('b:last_changedtick') | let b:last_changedtick = b:changedtick | endif +augroup end + +function! s:init() + call s:UpdateTab() + augroup FastFoldEnter + autocmd! + " Make &l:foldmethod local to Buffer and NOT Window. + autocmd BufEnter,WinEnter * + \ if exists('b:lastfdm') | let w:lastfdm = b:lastfdm | call s:LeaveWin() | call s:EnterWin() | endif + autocmd BufLeave,WinLeave * + \ call s:LeaveWin() | call s:EnterWin() | + \ if exists('w:lastfdm') | let b:lastfdm = w:lastfdm | + \ elseif exists('b:lastfdm') | unlet b:lastfdm | endif + + autocmd BufEnter,WinEnter * + \ if &l:foldmethod isnot# 'diff' && exists('b:predifffdm') | call s:UpdateBuf(0) | endif + autocmd BufLeave,WinLeave * + \ if exists('w:predifffdm') | let b:predifffdm = w:predifffdm | + \ elseif exists('b:predifffdm') | unlet b:predifffdm | endif + + " UpdateBuf/Win(1) = skip if another session is still loading. + autocmd TabEnter * call s:UpdateTab() + + " BufWinEnter = to change &l:foldmethod by modelines. + autocmd BufWinEnter,FileType * call s:UpdateWin(1) + " So that FastFold functions correctly after :loadview. + autocmd SessionLoadPost * call s:UpdateWin(0) + + " Update folds on reload. + autocmd BufReadPost * + \ if !exists('b:already_loaded') | let b:already_loaded = 1 | + \ else | call s:UpdateBuf(0) | endif + " Update folds on saving. + if g:fastfold_savehook + autocmd BufWritePost * call s:UpdateBuf(0) + endif + if g:fastfold_fdmhook + if exists('##OptionSet') + autocmd OptionSet foldmethod call s:UpdateBuf(0) + endif + endif + augroup end +endfunction + +" ------------------------------------------------------------------------------ +let &cpo= s:keepcpo +unlet s:keepcpo diff --git a/vim/plugins/GoldenView/.gitignore b/vim/plugins/GoldenView/.gitignore new file mode 100644 index 0000000..c4c4ffc --- /dev/null +++ b/vim/plugins/GoldenView/.gitignore @@ -0,0 +1 @@ +*.zip diff --git a/vim/plugins/GoldenView/.vclog b/vim/plugins/GoldenView/.vclog new file mode 100644 index 0000000..796c237 --- /dev/null +++ b/vim/plugins/GoldenView/.vclog @@ -0,0 +1,31 @@ +# Heuristics used by VCLog itself. + +type :major, 3, "Major Enhancements" +type :minor, 2, "Minor Enhancements" +type :bug, 1, "Bug Fixes" +type :fix, 1, "Bug Fixes" +type :update, 0, "Nominal Changes" +type :doc, -1, "Documentation Changes" +type :test, -1, "Test/Spec Adjustments" +type :admin, -2, "Administrative Changes" +type :log, -3, "Just a record" + + +on Regexp.union(/^(? \w+):/, /^\[(?\w+)\]/) do |commit, md| + type = md[:type].to_sym + commit.type = type + commit.message = commit.message.sub(md[0],'').strip +end + +on /updated? (README\.md|PROFILE|PACKAGE|VERSION|Manifest\.txt)/ do |commit| + commit.type = :admin +end + +on /(bump|bumped|prepare) version/ do |commit| + commit.type = :admin +end + +colors :grey, :blue, :cyan, :green, :yellow, :red, [:red, :bold] + + +# vim: set ft=ruby ts=2 sw=2 tw=78 fmr=[[[,]]] fdm=syntax : diff --git a/vim/plugins/GoldenView/GoldenView.Vim.vimup b/vim/plugins/GoldenView/GoldenView.Vim.vimup new file mode 100644 index 0000000..7b8d7d2 --- /dev/null +++ b/vim/plugins/GoldenView/GoldenView.Vim.vimup @@ -0,0 +1,124 @@ +script_name: GoldenView.Vim +script_id: '4529' +script_type: utility +script_package: '{script_name}-{version}.zip' +required_vim_version: '7.3' +summary: Always have a nice view for vim split windows + +detailed_description: | + + Please goto homepage for a better view of the introduction. + + Homepage: http://zhaocai.github.io/GoldenView.Vim/ + Screencast: http://dl.dropboxusercontent.com/u/1897501/Screencasts/GoldenView.gif + + + If you like it, please star or fork in https://github.com/zhaocai/GoldenView.Vim so that more people may find it. + + + + + + + >>> Introduction: + + The initial motive for GoldenView comes from the frustration of using other vim plugins to autoresize split windows. The idea is deadly simple and very useful: resize the focused window to a proper size. However, in practice, many hiccups makes autoresizing not a smooth experience. Below are a list of issues I am trying to solve: + + First and the most important one, autoresizing should play nicely with existing plugins like tagbar, vimfiler, unite, VOoM, quickfix, undotree, gundo, etc. These windows should manage there own window size. + + Second, autoresizing should take care of the other windows too. Resizing the focused window may cause the other windows become too small. When you have 4+ split windows, autoresizing may just make a mess out of it. + + + + + >>> Features: + + GoldenView has preliminarily solved the issues described above. It also provides other features. Bascally, it does two things: + + 1. Autoresizing + + First of all, it automatically resize the focused split window to a "golden" view based on golden ratio and textwidth. + + 2. Tiled Windows Management + + Second, it maps a single key ( by default) to nicely split windows to tiled windows. + + ====+==============+============+===+ + | | | | | + | F | | S1 | T | + | I | +------------| A | + | L | MAIN PANE | S2 | G | + | E | +------------+ B | + | R | | S3 | A | + | | | | | + +===+==============+============+===+ + + To get this view, just hit 4 times. or, if you have a large monitor, you may get tiled windows below. + + +===+==============+==============+============+===+ + | | | | | | + | F | | | S1 | T | + | I | | +------------| A | + | L | MAIN PANE | M2 | S2 | G | + | E | | +------------+ B | + | R | | | S3 | A | + | | | | | | + +===+==============+==============+============+===+ + + + To quickly switch between those windows, a few keys are mapped to + + - Focuse to the main window + - Switch with the largest, smallest, etc. + - Jump to next and previous window + + Requirements: + - Vim 7.3 or later + +install_details: | + http://zhaocai.github.io/GoldenView.Vim/ + +versions: +- '1.3.6': | + - Maintenance update +- '1.3.5': | + - Fix for issue #5 (github). + - Fix for Dirdiff, FencView + - Improve tracing + +- '1.3.0': | + - Diff mode auto-resizing + - refactor autocmd function: tweak restore behavior + +- '1.2.2': | + Improve documents and small bug fixes, + Load guard for #4 (github) + +- '1.2.0': | + add restore rule for some special buffers, which solves all the hiccups I could identify so far. + +- '1.1.2': | + Improve documents, fix load sequence + +- '1.1.1': | + Improve documents, fix zl library load + +- '1.1.0': | + - 3 Major Enhancements + * add WinLeave event into account. This version works perfectly. + * fix various hiccups caused by winleave + * use ignore rules from zl.vim + - 4 Minor Enhancements + * add mapping to switch to main pane. [minor] speed up buffer switch with noautocmd + * include zl.vim into source code + * tune for autocmd sequence + * treat winfixwidth and winfixheight separately + - 2 Bug Fixes + * winleave cause ignored windows resized + * cannot let &winminwidth > &winwidth + - 2 Nominal Changes + * change profile variable scope to s\: + * tweak golden ratio for win size + +# __END__ +# vim: filetype=yaml diff --git a/vim/plugins/GoldenView/History.md b/vim/plugins/GoldenView/History.md new file mode 100644 index 0000000..f30e4aa --- /dev/null +++ b/vim/plugins/GoldenView/History.md @@ -0,0 +1,102 @@ +# RELEASE HISTORY + +## V1.3.0 / 2013-04-22 + +Diff Mode auto resizing (Zhao Cai ) + +Changes: + +* 1 Major Enhancements + + * diff mode auto-resizing. + +* 1 Minor Enhancements + + * refactor autocmd function: tweak restore behavior + + +## V1.2.2 / 2013-04-21 + +Improve documents and small bug fixes, +Load guard for #4 (github) (Zhao Cai ) + +Changes: + +* 1 Minor Enhancements + + * better tracing + +* 1 Bug Fixes + + * load guard for issue #4 + + E806: using Float as a String + + +## V1.2.0 / 2013-04-18 + + (Zhao Cai ) + +Changes: + +* 1 Major Enhancements + + * add restore rule for some special buffers + +* 4 Bug Fixes + + * E36 no enough room to split + * issue #2 MRU plugin window + * init sequence + * zl load guard + + +## V1.1.2 / 2013-04-18 + +Fix init sequence between zl.vim and GoldenVim (Zhao Cai ) + + +## HEAD / 2013-04-23 + +Current Development (Zhao Cai) + + +## V1.1.1 / 2013-04-18 + +improve documents, fix zl library load (Zhao Cai ) + + +## V1.1.0 / 2013-04-18 + + (Zhao Cai ) + +Changes: + +* 3 Major Enhancements + + * add WinLeave event into account. This version works perfectly. + * fix various hiccups caused by winleave + * use ignore rules from zl.vim + +* 4 Minor Enhancements + + * add mapping to switch to main pane. [minor] speed up buffer switch with noautocmd + * include zl.vim into source code + * tune for autocmd sequence + * treat winfixwidth and winfixheight separately + +* 2 Bug Fixes + + * winleave cause ignored windows resized + * cannot let &winminwidth > &winwidth + +* 2 Nominal Changes + + * change profile variable scope to s: + * tweak golden ratio for win size + + +## 1.0 / 2012-09-18 + + (Zhao Cai ) + diff --git a/vim/plugins/GoldenView/README.md b/vim/plugins/GoldenView/README.md new file mode 100644 index 0000000..8373a4f --- /dev/null +++ b/vim/plugins/GoldenView/README.md @@ -0,0 +1,343 @@ +# Always have a nice view for vim split windows + + ------------- - ----------------------------------------------- + Plugin : GoldenView.vim + Author : Zhao Cai + EMail : caizhaoff@gmail.com + Homepage : http://zhaocai.github.io/GoldenView.Vim/ + Vim.org : http://www.vim.org/scripts/script.php?script_id=4529 + Version : 1.3.6 + Date Created : Tue 18 Sep 2012 05:23:13 PM EDT + Last Modified : Mon 22 Apr 2013 05:55:22 PM EDT + ------------- - ----------------------------------------------- + + + +The initial motive for [GoldenView][GoldenView] comes from the frustration of using other vim plugins to auto-resize split windows. The idea is deadly simple and very useful: **resize the focused window to a proper size.** However, in practice, many hiccups makes **auto-resizing** not a smooth experience. Below are a list of issues [GoldenView][GoldenView] attempts to solve: + +First and the most important one, auto-resizing should play nicely with existing plugins like `tagbar`, `vimfiler`, `unite`, `VOoM`, `quickfix`, `undotree`, `gundo`, etc. These windows should manage there own window size. + +Second, auto-resizing should take care of **the other windows** too. Resizing the focused window may cause the other windows become too small. When you have 4+ split windows, auto-resizing may just make a mess out of it. + + +![GoldView Screencast]( http://dl.dropboxusercontent.com/u/1897501/Screencasts/GoldenView.gif ) + + +## Features + +[GoldenView][GoldenView] has preliminarily solved the issues described above. It also provides other features. Bascally, it does two things: + +### 1. AutoResizing +First of all, it automatically resize the focused split window to a "golden" view based on [golden ratio][golden-ratio-wikipedia] and `textwidth`. + + +### 2. Tiled Windows Management + +Second, it maps a single key (`` by default) to nicely split windows to tiled windows. + +``` +----+----------------+------------+---+ +| | | | | +| F | | S1 | T | +| I | +------------| A | +| L | | S2 | G | +| E | MAIN PANE +------------+ B | +| R | | S3 | A | +| | | | R | +| | | | | ++---+----------------+------------+---+ +``` + +To get this view, just hit `` 4 times. or, if you have a large monitor, you may get tiled windows below. + + +``` +----+---------------+--------------+------------+---+ +| | | | | | +| F | | | S1 | T | +| I | | +------------| A | +| L | | M2 | S2 | G | +| E | MAIN PANE | +------------+ B | +| R | | | S3 | A | +| | | | | B | +| | | | | | ++---+---------------+--------------+------------+---+ +``` + + +To quickly switch between those windows, a few keys are mapped to + +- Focus to the main window +- Switch with the `MAIN PANE`, the largest, smallest, etc. +- Jump to the next and previous window + + + + + +## Installation + +Install [GoldenView][GoldenView] is the *same as installing other vim plugins*. If experienced with vim, you can skim the example below and move to [next section](#quick-start). + + +### **Option A** - With [Plugin Manager][vim-plugin-manager] ( **recommended** ) + +If you use plugin managers like *Pathogen*, *vundle*, *neobundle*, *vim-addon-manager*, etc., just unarchive the zip file or clone the [GoldenView][GoldenView] repo from `git://github.com/zhaocai/GoldenView.git` into your local plugin installation directory (most likely `~/.vim/bundle/`). Then add corresponding scripts in .vimrc for the bundle manager you are using. + +**Example**: + +- *neobundle*: + +```vim + NeoBundle 'zhaocai/GoldenView.Vim' "Always have a nice view for vim split windows +``` + +- *vundle*: + +```vim + Bundle 'zhaocai/GoldenView.Vim' +``` + +- *vim-addon-manager*: + +```vim + call vam#ActivateAddons(['GoldenView.Vim'], {'auto_install' : 1}) +``` + + +### **Option B** - Without [Plugin Manager][vim-plugin-manager] + +Unarchive the zip file into a directory that is under `runtimepath` of your vim, `~/.vim` for example. + + +## Quick Start +[GoldenView][GoldenView] should work out of the box without configuration. It should automatically start to resize focused window to [golden ratio][golden-ratio-wikipedia] based on `textwidth` and vim available size. You may start to play with it now. + +To get you started, a few default keys are mapped as below: + +```vim +" 1. split to tiled windows +nmap GoldenViewSplit + +" 2. quickly switch current window with the main pane +" and toggle back +nmap GoldenViewSwitchMain +nmap GoldenViewSwitchToggle + +" 3. jump to next and previous window +nmap GoldenViewNext +nmap GoldenViewPrevious + +``` + +The meaning of those keys are self-explaining. A general workflow would be `GoldenViewSplit` key to quickly and nicely split windows to the layout as below. Then you may open your files. + +``` +----+----------------+------------+---+ +| | | | | +| F | | S1 | T | +| I | +------------| A | +| L | | S2 | G | +| E | MAIN PANE +------------+ B | +| R | | S3 | A | +| | | | R | +| | | | | ++---+----------------+------------+---+ + +``` + +To switch `S1` with `MAIN PANE`, in `S1` and hit `GoldenViewSwitchMain`. To switch back, hit `GoldenViewSwitchToggle` in either `MAIN PAIN` or `S1` + +#### g:goldenview__enable_default_mapping + +Every experienced vim user has a different set of key mappings. If you you are (most likely) unhappy about some of the mappings, map you own keys as below: + +```vim +let g:goldenview__enable_default_mapping = 0 + +nmap GoldenViewSplit +" ... and so on + +``` + +#### g:goldenview__enable_at_startup + +if you do not want to start auto-resizing automatically, you can put the following script in your vimrc. + +```vim +let g:goldenview__enable_at_startup = 0 +``` + +## More Commands and Mappings + +### `:ToggleGoldenViewAutoResize` +### `:DisableGoldenViewAutoResize` +### `:EnableGoldenViewAutoResize` + +These commands toggle, enable, and disable GoldenView auto-resizing. + + +### `:GoldenViewResize` +this command do manual resizing of focused window. + +You can also map a key for this as below: + +```vim +nmap GoldenViewResize + +``` + +### `:SwitchGoldenViewMain` +### `:SwitchGoldenViewLargest` +### `:SwitchGoldenViewSmallest` + +these commands do as it named. + +You can also add mappings as below. ( no default keys for these mappings) +```vim +nmap GoldenViewSwitchWithLargest +nmap GoldenViewSwitchWithSmallest + +``` + +Other switch rules can be easily defined. If you have some ideas, please post to [github issue][GoldenViewIssue] for discussion. + + +## Rules + +[GoldenView][] defines two rules: + +### `g:goldenview__ignore_urule` +is to "ignore" - allow those special buffers to manage their own window size. + +### `g:goldenview__restore_urule` +is to "restore" - restore window size of some of special buffers. + +The `urule` (user rules) are like this, which will be normalize at runtime for faster processing. + +```vim + \{ + \ 'filetype' : [ + \ '' , + \ 'qf' , 'vimpager', 'undotree', 'tagbar', + \ 'nerdtree', 'vimshell', 'vimfiler', 'voom' , + \ 'tabman' , 'unite' , 'quickrun', 'Decho' , + \ ], + \ 'buftype' : [ + \ 'nofile' , + \ ], + \ 'bufname' : [ + \ 'GoToFile' , 'diffpanel_\d\+' , + \ '__Gundo_Preview__' , '__Gundo__' , + \ '\[LustyExplorer-Buffers\]' , '\-MiniBufExplorer\-' , + \ '_VOOM\d\+$' , '__Urannotate_\d\+__' , + \ '__MRU_Files__' , + \ ], + \}, + +``` + +## Profiles +[GoldenView][] defines two profile: + +### `g:goldenview__active_profile` +defines the functions and preferences to auto resize windows. + +### `g:goldenview__reset_profile` + +defines reset preferences to restore everything to default. + + +`function GoldenView#ExtendProfile()` is provided to customize preferences. + +For more details, please read the source code! :) + + + +## Troubleshooting: + +### Please do not resize me! + +[GoldenView][] maintains rules for "common" cases. But vim offers a great variety of plugins which defines buffers for special purposes. If you find some special buffers which is supposed to not be auto-resized. Please check `g:goldenview__ignore_urule`. You may extend the `g:goldenview__active_profile` yourself or post the issue to [github issue][GoldenViewIssue] for adding it to builtin support. + + + +### [minibufexpl.vim][] takes 5+ lines + +Check my fork [minibufexpl.vim][] to see if it is working for you. I have send pull request to the origin repo. + + +### I cannot resize window height to < 7 + +This is features. As mentioned in the [Introduction](#always-have-a-nice-view-for-vim-split-windows) section, there is no normal cases to have a normal window too small. For special cases like [minibufexpl.vim][], it can be handled case by case. + + +However, if you really want to have small windows. It can be done by : + +```vim + +" Extend a new profile named 'small-height' from default profile. +" +" 1. Change "2" to your desire minimal height +" 2. Change "small-height" to the profile name you like +" --------------------------------------------------------------- +call GoldenView#ExtendProfile('small-height', { +\ 'other_window_winheight' : 2 , +\ }) + +let g:goldenview__active_profile = 'small-height' +``` + +(refer to issue #5) + +### I still have Issues: + +If you have any issues, please post it to [github issue][GoldenViewIssue] for discussion. + +Remember to run the following command and post the results. +```vim +echo GoldenView#Info() +``` + + +## Contributors + + + + +## RELEASE HISTORY + +Refer to [History.md]( https://github.com/zhaocai/GoldenView.Vim/blob/master/History.md ) + + + + +## LICENSE: + +Copyright (c) 2013 Zhao Cai \ + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see . + + + + +[dwm]: http://www.vim.org/scripts/script.php?script_id=4186 +[golden-ratio-plugin]: http://www.vim.org/scripts/script.php?script_id=3690 +[golden-ratio-wikipedia]: http://en.wikipedia.org/wiki/Golden_ratio +[zl]: https://github.com/zhaocai/zl.vim "zl.vim vim script library" +[GoldenView]: http://zhaocai.github.io/GoldenView.Vim/ "GoldenView Homepage" +[GoldenViewCode]: https://github.com/zhaocai/GoldenView.Vim "GoldenView Vim Plugin" +[vim-plugin-manager]: http://vim-scripts.org/vim/tools.html "Vim Plugin Manangers" +[GoldenViewIssue]: https://github.com/zhaocai/GoldenView.Vim/issues "GoldenView Issue Track" +[minibufexpl.vim]: https://github.com/zhaocai/minibufexpl.vim + diff --git a/vim/plugins/GoldenView/Rakefile b/vim/plugins/GoldenView/Rakefile new file mode 100644 index 0000000..208e8aa --- /dev/null +++ b/vim/plugins/GoldenView/Rakefile @@ -0,0 +1,54 @@ +require 'facets/string' +require 'rake/clean' + +project_name = __FILE__.pathmap("%-1d") + +def version + project_readme = FileList['README.*'] + version_re = /Version \s+ : \s* (? \d\.\d\.\d) $/x + + project_readme.each { |f| + File.read(f).mscan(version_re).each { |m| + return m[:version] + } + } +end + +desc "version" +task :version => [] do + puts version +end + + + + +desc "zip for distribution" +task :zip => [] do + sh "zip -r #{project_name}-#{version}.zip autoload plugin doc README.md --exclude='*/.DS_Store'" +end + +CLEAN.include('*.zip') + + + + +vimup = File.expand_path('~/Developer/Vim/Bundle/tool/vimup/vimup') +vimorg = File.expand_path('~/.apps/vimup/vim.org.yml') + +namespace :vimup do + desc "new vim.org script" + task :new do + sh vimup, 'new-script', project_name, vimorg + end + + desc "updae vim.org script" + task :release => [:zip] do + sh vimup, 'update-script', project_name, vimorg + task(:clean).invoke + end + + desc "updae vim.org script detail" + task :details do + sh vimup, 'update-details', project_name, vimorg + end +end diff --git a/vim/plugins/GoldenView/autoload/GoldenView.vim b/vim/plugins/GoldenView/autoload/GoldenView.vim new file mode 100644 index 0000000..7203dd0 --- /dev/null +++ b/vim/plugins/GoldenView/autoload/GoldenView.vim @@ -0,0 +1,529 @@ +" =============== ============================================================ +" Name : GoldenView +" Description : Always have a nice view for vim split windows +" Author : Zhao Cai +" HomePage : https://github.com/zhaocai/GoldenView.Vim +" Date Created : Tue 18 Sep 2012 10:25:23 AM EDT +" Last Modified : Fri 19 Oct 2012 05:55:17 PM EDT +" Tag : [ vim, window, golden-ratio ] +" Copyright : © 2012 by Zhao Cai, +" Released under current GPL license. +" =============== ============================================================ + +" ============================================================================ +" Initialization And Profile: ⟨⟨⟨1 +" ============================================================================ +function! GoldenView#ExtendProfile(name, def) + let default = get(s:goldenview__profile, a:name, + \ copy(s:goldenview__profile['default'])) + + let s:goldenview__profile[a:name] = extend(default, a:def) +endfunction + +function! GoldenView#Init() + if exists('g:goldenview__initialized') && g:goldenview__initialized == 1 + return + endif + + let s:goldenview__golden_ratio = 1.618 + lockvar s:goldenview__golden_ratio + + set equalalways + set eadirection=ver + + + let s:goldenview__profile = { + \ 'reset' : { + \ 'focus_window_winheight' : &winheight , + \ 'focus_window_winwidth' : &winwidth , + \ 'other_window_winheight' : &winminheight , + \ 'other_window_winwidth' : &winminwidth , + \ }, + \ 'default' : { + \ 'focus_window_winheight' : function('GoldenView#GoldenHeight') , + \ 'focus_window_winwidth' : function('GoldenView#TextWidth') , + \ 'other_window_winheight' : function('GoldenView#GoldenMinHeight') , + \ 'other_window_winwidth' : function('GoldenView#GoldenMinWidth') , + \ }, + \ + \ } + + call GoldenView#ExtendProfile('golden-ratio', { + \ 'focus_window_winwidth' : function('GoldenView#GoldenWidth') , + \ }) + + let s:goldenview__ignore_nrule = GoldenView#zl#rule#norm( + \ g:goldenview__ignore_urule, { + \ 'logic' : 'or', + \ } + \ ) + + let s:goldenview__restore_nrule = GoldenView#zl#rule#norm( + \ g:goldenview__restore_urule, { + \ 'logic' : 'or', + \ } + \ ) + let g:goldenview__initialized = 1 +endfunction + + + +" ============================================================================ +" Auto Resize: ⟨⟨⟨1 +" ============================================================================ +function! GoldenView#ToggleAutoResize() + if exists('s:goldenview__auto_resize') && s:goldenview__auto_resize == 1 + call GoldenView#DisableAutoResize() + call GoldenView#zl#print#moremsg('GoldenView Auto Resize: Off') + else + call GoldenView#EnableAutoResize() + call GoldenView#zl#print#moremsg('GoldenView Auto Resize: On') + endif +endfunction + + +function! GoldenView#EnableAutoResize() + + call GoldenView#Init() + + let active_profile = s:goldenview__profile[g:goldenview__active_profile] + call s:set_focus_window(active_profile) + call s:set_other_window(active_profile) + + augroup GoldenView + au! + " Enter + autocmd VimResized * call GoldenView#Enter({'event' : 'VimResized'}) + autocmd BufWinEnter * call GoldenView#Enter({'event' : 'BufWinEnter'}) + autocmd WinEnter * call GoldenView#Enter({'event' : 'WinEnter'}) + + " Leave + autocmd WinLeave * call GoldenView#Leave() + augroup END + let s:goldenview__auto_resize = 1 + +endfunction + + +function! GoldenView#DisableAutoResize() + au! GoldenView + call GoldenView#ResetResize() + + let s:goldenview__auto_resize = 0 +endfunction + +function! GoldenView#Leave(...) + + " GoldenViewTrace 'WinLeave', a:000 + + " Do nothing if there is no split window + " -------------------------------------- + if winnr('$') < 2 + return + endif + + call GoldenView#Diff() + + if GoldenView#IsIgnore() + " Record the last size of ignored windows. Restore there sizes if affected + " by GoldenView. + + " For new split, the size does not count, which is highly possible + " to be resized later. Should use the size with WinLeave event. + " + call GoldenView#initialize_tab_variable() + let t:goldenview['bufs'][bufnr('%')] = { + \ 'winnr' : winnr() , + \ 'winwidth' : winwidth(0) , + \ 'winheight' : winheight(0) , + \ } + let t:goldenview['cmdheight'] = &cmdheight + end +endfunction + +function! GoldenView#Diff() + " Diff Mode: auto-resize to equal size + if ! exists('b:goldenview_diff') + let b:goldenview_diff = 0 + endif + if &diff + if ! b:goldenview_diff + for nr in GoldenView#zl#list#uniq(tabpagebuflist()) + if getbufvar(nr, '&diff') + call setbufvar(nr, 'goldenview_diff', 1) + endif + endfor + exec 'wincmd =' + endif + return 1 + else + if b:goldenview_diff + let b:goldenview_diff = 0 + endif + endif + return 0 +endfunction + +function! GoldenView#Enter(...) + + if GoldenView#Diff() + return + endif + + if &lazyredraw + return + endif + + return call('GoldenView#Resize', a:000) +endfunction + +function! GoldenView#Resize(...) + "--------- ------------------------------------------------ + " Desc : resize focused window + " + " Args : {'event' : event} + " Return : none + " + " Raise : none from this function + " + " Pitfall : + " - Can not set winminwith > winwidth + " - AutoCmd Sequence: + " - `:copen` : + " 1. WinEnter (&ft inherited from last buffer) + " 2. BufWinEnter (&ft == '') + " 3. BufWinEnter (&ft == 'qf', set winfixheight) + " - `:split` + " 1. WinLeave current window + " 2. WinEnter new split window with current buffer + " 3. `split` return, user script may change the buffer + " type, width, etc. + " + " + "--------- ------------------------------------------------ + + " GoldenViewTrace 'GoldenView Resize', a:000 + + let opts = {'is_force' : 0} + if a:0 >= 1 && GoldenView#zl#var#is_dict(a:1) + call extend(opts, a:1) + endif + + let winnr_diff = s:winnr_diff() + if winnr_diff > 0 + " Plus Split Window: + " ++++++++++++++++++ + + " GoldenViewTrace '+++ winnr +++', a:000 + return + + elseif winnr_diff < 0 + " Minus Split Window: + " ------------------- + + call GoldenView#initialize_tab_variable() + let saved_lazyredraw = &lazyredraw + set lazyredraw + let current_winnr = winnr() + + " Restore: original size based on "g:goldenview__restore_urule" + " ------------------------------------------------------------ + for winnr in range(1, winnr('$')) + let bufnr = winbufnr(winnr) + let bufsaved = get(t:goldenview['bufs'], bufnr, {}) + + " Ignored Case: same buffer displayed in multiply windows + " ------------------------------------------------------- + if ! empty(bufsaved) && bufsaved['winnr'] == winnr + silent noautocmd exec winnr 'wincmd w' + + if GoldenView#IsRestore() + silent exec 'vertical resize ' . bufsaved['winwidth'] + silent exec 'resize ' . bufsaved['winheight'] + + " GoldenViewTrace 'restore buffer:'. nr, a:000 + endif + endif + endfor + + if &cmdheight != t:goldenview['cmdheight'] + exec 'set cmdheight=' . t:goldenview['cmdheight'] + endif + + silent exec current_winnr 'wincmd w' + + redraw + let &lazyredraw = saved_lazyredraw + + " GoldenViewTrace '--- winnr ---', a:000 + return + endif + + if ! opts['is_force'] + + " Do nothing if there is no split window + if winnr('$') < 2 + return + endif + + if GoldenView#IsIgnore() + " GoldenViewTrace 'Ignored', a:000 + return + endif + + endif + + + let active_profile = s:goldenview__profile[g:goldenview__active_profile] + call s:set_focus_window(active_profile) + " GoldenViewTrace 'Set Focuse', a:000 + + + + " reset focus windows minimal size + let &winheight = &winminheight + let &winwidth = &winminwidth + + " GoldenViewTrace 'Reset Focus', a:000 +endfunction + +function! GoldenView#IsIgnore() + return GoldenView#zl#rule#is_true(s:goldenview__ignore_nrule) +endfunction + +function! GoldenView#IsRestore() + return GoldenView#zl#rule#is_true(s:goldenview__restore_nrule) +endfunction + + +function! GoldenView#ResetResize() + let reset_profile = s:goldenview__profile[g:goldenview__reset_profile] + call s:set_other_window(reset_profile, {'force' : 1}) + call s:set_focus_window(reset_profile, {'force' : 1}) +endfunction + + +function! GoldenView#GoldenHeight(...) + return float2nr(&lines / s:goldenview__golden_ratio) +endfunction + + +function! GoldenView#GoldenWidth(...) + return float2nr(&columns / s:goldenview__golden_ratio) +endfunction + + +function! GoldenView#GoldenMinHeight(...) + return float2nr(GoldenView#GoldenHeight()/(5*s:goldenview__golden_ratio)) +endfunction + + +function! GoldenView#GoldenMinWidth(...) + return float2nr(GoldenView#GoldenWidth()/(3*s:goldenview__golden_ratio)) +endfunction + + +function! GoldenView#TextWidth(...) + let tw = &l:textwidth + + if tw != 0 + return float2nr(tw * 4/3) + else + let tw = float2nr(80 * 4/3) + let gw = GoldenView#GoldenWidth() + return tw > gw ? gw : tw + endif +endfunction + + +function! s:set_focus_window(profile,...) + let opts = { + \ 'force' : 0 + \ } + if a:0 >= 1 && GoldenView#zl#var#is_dict(a:1) + call extend(opts, a:1) + endif + + try + if !&winfixwidth || opts['force'] + let &winwidth = + \ s:eval(a:profile, a:profile['focus_window_winwidth']) + endif + if !&winfixheight || opts['force'] + let &winheight = + \ s:eval(a:profile, a:profile['focus_window_winheight']) + endif + catch /^Vim\%((\a\+)\)\=:E36/ " Not enough room + call GoldenView#zl#print#warning('GoldenView: ' . v:exception) + endtry +endfunction + +function! s:set_other_window(profile,...) + let opts = { + \ 'force' : 0 + \ } + if a:0 >= 1 && GoldenView#zl#var#is_dict(a:1) + call extend(opts, a:1) + endif + + try + if !&winfixwidth || opts['force'] + let &winminwidth = + \ s:eval(a:profile, a:profile['other_window_winwidth']) + endif + if !&winfixheight || opts['force'] + let &winminheight = + \ s:eval(a:profile, a:profile['other_window_winheight']) + endif + catch /^Vim\%((\a\+)\)\=:E36/ " Not enough room + call GoldenView#zl#print#warning('GoldenView: ' . v:exception) + endtry +endfunction + + + + + +" ============================================================================ +" Split: ⟨⟨⟨1 +" ============================================================================ +function! GoldenView#Split() + call GoldenView#zl#window#split_nicely() +endfunction + + + +" ============================================================================ +" Switch: ⟨⟨⟨1 +" ============================================================================ +function! GoldenView#SwitchMain(...) + let opts = { + \ 'from_bufnr' : bufnr('%') , + \} + if a:0 >= 1 && type(a:1) == type({}) + call extend(opts, a:1) + endif + + let window_count = winnr('$') + if window_count < 2 + return + endif + + let current_winnr = winnr() + let switched = 0 + + let saved_lazyredraw = &lazyredraw + set lazyredraw + for i in range(1, window_count) + silent noautocmd exec i 'wincmd w' + + if ! GoldenView#IsIgnore() + let switched = GoldenView#zl#window#switch_buffer( + \ opts['from_bufnr'], winbufnr(i)) + break + endif + endfor + + redraw + let &lazyredraw = saved_lazyredraw + + if switched + call GoldenView#Resize({'event' : 'WinEnter'}) + else + silent noautocmd exec current_winnr 'wincmd w' + endif +endfunction + +" ============================================================================ +" Helper Functions: ⟨⟨⟨1 +" ============================================================================ + +function! s:eval(profile, val) + if GoldenView#zl#var#is_number(a:val) + return a:val + elseif GoldenView#zl#var#is_funcref(a:val) + return a:val(a:profile) + else + try + return eval(a:val) + catch /^Vim\%((\a\+)\)\=:E/ + throw 'GoldenView: invalid profile value type!' + endtry + endif +endfunction + +function! GoldenView#initialize_tab_variable() + if !exists('t:goldenview') + let t:goldenview = { + \ 'nrwin' : winnr('$') , + \ 'cmdheight' : &cmdheight , + \ 'bufs' : {} , + \ } + endif +endfunction + +function! s:winnr_diff() + call GoldenView#initialize_tab_variable() + + let nrwin = winnr('$') + if nrwin != t:goldenview['nrwin'] + let diff = nrwin - t:goldenview['nrwin'] + let t:goldenview['nrwin'] = nrwin + return diff + else + return 0 + endif +endfunction + + + + +" ============================================================================ +" Debug: ⟨⟨⟨1 +" ============================================================================ + +function! GoldenView#Info() + return { + \ 'buffer' : { + \ 'filetype' : &ft , + \ 'buftype' : &buftype , + \ 'bufname' : bufname('%') , + \ 'winwidth' : winwidth(0) , + \ 'winheight' : winheight(0) , + \ }, + \ 'goldenview' : get(t:, 'goldenview', GoldenView#initialize_tab_variable()), + \ 'setting' : { + \ 'win_count' : winnr('$') , + \ 'lazyredraw' : &lazyredraw , + \ 'cmdheight' : &cmdheight , + \ 'winfixwidth' : &winfixwidth , + \ 'winfixheight' : &winfixheight , + \ 'winwidth' : &winwidth , + \ 'winminwidth' : &winminwidth , + \ 'winheight' : &winheight , + \ 'winminheight' : &winminheight , + \ } + \} +endfunction + + +function! GoldenView#Trace(...) + " -------- - ----------------------------------------------- + " Example : > + " GoldenViewTrace 'WinLeave', a:000 + " -------- - ----------------------------------------------- + + call GoldenView#initialize_tab_variable() + let info = GoldenView#Info() + let info['context'] = get(g:,'GoldenView_zl_context','') + let info['args'] = a:000 + call GoldenView#zl#log#debug(info) +endfunction + +command! -nargs=* -complete=expression GoldenViewTrace + \ exec GoldenView#zl#vim#context() | call GoldenView#Trace() + +" ============================================================================ +" Modeline: ⟨⟨⟨1 +" ============================================================================ +" vim: set ft=vim ts=4 sw=4 tw=78 fdm=syntax fmr=⟨⟨⟨,⟩⟩⟩ fdl=1 : diff --git a/vim/plugins/GoldenView/autoload/GoldenView/zl/list.vim b/vim/plugins/GoldenView/autoload/GoldenView/zl/list.vim new file mode 100644 index 0000000..be0f944 --- /dev/null +++ b/vim/plugins/GoldenView/autoload/GoldenView/zl/list.vim @@ -0,0 +1,126 @@ +" =============== ============================================================ +" Synopsis : list helper functions +" Author : Zhao Cai +" HomePage : https://github.com/zhaocai/zl.vim +" Version : 0.1 +" Date Created : Sat 03 Sep 2011 03:54:00 PM EDT +" Last Modified : Thu 20 Sep 2012 04:25:10 PM EDT +" Tag : [ vim, list ] +" Copyright : (c) 2012 by Zhao Cai, +" Released under current GPL license. +" =============== ============================================================ + + + +" ============================================================================ +" Sort: ⟨⟨⟨1 +" ============================================================================ + +function! GoldenView#zl#list#unique_sort(list, ...) + "--------- ------------------------------------------------ + " Args : list, [func] + " Return : unique sorted list + " Raise : + " + " Refer : http://vim.wikia.com/wiki/Unique_sorting + "--------- ------------------------------------------------ + let list = copy(a:list) + + if exists('a:1') && type(a:1) == type(function('function')) + call sort(list, a:1) + else + call sort(list) + endif + if len(list) <= 1 | return list | endif + let result = [ list[0] ] + let last = list[0] + let i = 1 + while i < len(list) + if last != list[i] + let last = list[i] + call add(result, last) + endif + let i += 1 + endwhile + return result +endfunction + + + +function! GoldenView#zl#list#sort_by(list, expr) + "--------- ------------------------------------------------ + " Desc : sort list by expr + " + " Args : v:val is used in {expr} + " Return : sroted list + " Raise : + " + " Example : > + " let list = [{'a' : 1}, {'a' : 22}, {'a' : 3}] + " echo GoldenView#zl#list#sort_by(list, 'v:val["a"]') + " + " Refer : vital.vim + "--------- ------------------------------------------------ + + let pairs = map(a:list, printf('[v:val, %s]', a:expr)) + return map(GoldenView#zl#list#sort(pairs, + \ 'a:a[1] ==# a:b[1] ? 0 : a:a[1] ># a:b[1] ? 1 : -1'), + \ 'v:val[0]') +endfunction + +function! s:_compare(a, b) + return eval(s:expr) +endfunction + +function! GoldenView#zl#list#sort(list, expr) + "--------- ------------------------------------------------ + " Desc : sort list with expr to compare two values. + " + " Args : a:a and a:b can be used in {expr} + " Return : sroted list + " Raise : + " + " Refer : vital.vim + "--------- ------------------------------------------------ + + if type(a:expr) == type(function('function')) + return sort(a:list, a:expr) + endif + let s:expr = a:expr + return sort(a:list, 's:_compare') +endfunction + + +function! GoldenView#zl#list#uniq(list, ...) + let list = a:0 + \ ? map(copy(a:list), printf('[v:val, %s]', a:1)) + \ : copy(a:list) + let i = 0 + let seen = {} + while i < len(list) + let key = string(a:0 ? list[i][1] : list[i]) + if has_key(seen, key) + call remove(list, i) + else + let seen[key] = 1 + let i += 1 + endif + endwhile + return a:0 ? map(list, 'v:val[0]') : list +endfunction + + + + + + + + + + + + +" ============================================================================ +" Modeline: ⟨⟨⟨1 +" ============================================================================ +" vim: set ft=vim ts=4 sw=4 tw=78 fdm=marker fmr=⟨⟨⟨,⟩⟩⟩ fdl=1 : diff --git a/vim/plugins/GoldenView/autoload/GoldenView/zl/log.vim b/vim/plugins/GoldenView/autoload/GoldenView/zl/log.vim new file mode 100644 index 0000000..ffc5980 --- /dev/null +++ b/vim/plugins/GoldenView/autoload/GoldenView/zl/log.vim @@ -0,0 +1,310 @@ +" =============== ============================================================ +" Name : log.vim +" Synopsis : vim script library: log +" Author : Zhao Cai +" HomePage : https://github.com/zhaocai/zl.vim +" Date Created : Sat 03 Sep 2012 03:54:00 PM EDT +" Last Modified : Sat 27 Apr 2013 06:58:13 PM EDT +" Tag : [ vim, log ] +" Copyright : © 2012 by Zhao Cai, +" Released under current GPL license. +" =============== ============================================================ + + + + + + + +" ============================================================================ +" Logger: [[[1 +" ============================================================================ + + +if !has('ruby') + + function! GoldenView#zl#log#info(...) + call GoldenView#zl#print#warning("GoldenView(log): require vim to be built with +ruby.") + endfunction + function! GoldenView#zl#log#level_info(...) + call GoldenView#zl#print#warning("GoldenView(log): require vim to be built with +ruby.") + endfunction + + + function! GoldenView#zl#log#debug(...) + call GoldenView#zl#print#warning("GoldenView(log): require vim to be built with +ruby.") + endfunction + function! GoldenView#zl#log#level_debug(...) + call GoldenView#zl#print#warning("GoldenView(log): require vim to be built with +ruby.") + endfunction + + + function! GoldenView#zl#log#warn(...) + call GoldenView#zl#print#warning("GoldenView(log): require vim to be built with +ruby.") + endfunction + function! GoldenView#zl#log#level_warn(...) + call GoldenView#zl#print#warning("GoldenView(log): require vim to be built with +ruby.") + endfunction + + + function! GoldenView#zl#log#error(...) + call GoldenView#zl#print#warning("GoldenView(log): require vim to be built with +ruby.") + endfunction + function! GoldenView#zl#log#level_error(...) + call GoldenView#zl#print#warning("GoldenView(log): require vim to be built with +ruby.") + endfunction + + + function! GoldenView#zl#log#fatal(...) + call GoldenView#zl#print#warning("GoldenView(log): require vim to be built with +ruby.") + endfunction + function! GoldenView#zl#log#level_fatal(...) + call GoldenView#zl#print#warning("GoldenView(log): require vim to be built with +ruby.") + endfunction + + +else + + +function! get_logfile() + if GoldenView#zl#sys#is_mac() + let logfile = expand('~/Library/Logs/vim/GoldenView.log') + elseif GoldenView#zl#sys#is_win() + let logfile = "C:/windows/temp/vim/GoldenView.log" + elseif GoldenView#zl#sys#is_linux() + let logfile = expand('/var/log/vim/GoldenView.log') + else + let logfile = input('Please Input logfile: ', '/var/log/vim/GoldenView.log', 'file') + endif + let log_dir = fnamemodify(logfile, ':p:h') + if !isdirectory(log_dir) + call mkdir(log_dir, 'p') + endif + return logfile +endfunction + +let s:GoldenView_zl_ruby_loaded = 0 +function! setup_ruby() + if s:GoldenView_zl_ruby_loaded == 0 + + let logfile = get_logfile() + + ruby << __RUBY__ +# ($LOAD_PATH << File.join(Vim.evaluate('g:GoldenView_zl_autoload_path'), 'lib')).uniq! +require "logger" +require "awesome_print" + +$GoldenView_zl_logger = Logger.new(Vim.evaluate('logfile'), 'weekly') +__RUBY__ + + autocmd VimLeavePre * call cleanup_ruby() + let s:GoldenView_zl_ruby_loaded = 1 + endif +endfunction + +function! cleanup_ruby() + if s:GoldenView_zl_ruby_loaded + ruby $GoldenView_zl_logger.close + endif +endfunction + + +" --------------------------------%>-------------------------------- +" Example: +" function! Trace(...) abort +" let message = {} +" let message['context'] = get(g:,'GoldenView_zl_context','') +" let message['args'] = a:000 +" call GoldenView#zl#log#info(message) +" endfunction +" +" command! -nargs=* -complete=expression Trace +" \ exec GoldenView#zl#vim#context() | call GoldenView#zl#log#info() +" --------------------------------%<-------------------------------- + + + + +function! GoldenView#zl#log#info(...) + call setup_ruby() + ruby << __RUBY__ + +args = Vim.evaluate('a:000') + +case args.size +when 0 + return +when 1 + $GoldenView_zl_logger.info("GoldenView") { args[0].ai(:plain => true) } +when 2 + $GoldenView_zl_logger.info(args[0]) { args[1].ai(:plain => true) } +else + $GoldenView_zl_logger.info(args[0]) { args[1].ai(:plain => true) } +end +__RUBY__ + +endfunction + +function! GoldenView#zl#log#level_info() + ruby $GoldenView_zl_logger.level = Logger::INFO +endfunction + + + + + + + + + + + +function! GoldenView#zl#log#debug(...) + call setup_ruby() + ruby << __RUBY__ + +args = Vim.evaluate('a:000') + +case args.size +when 0 + return +when 1 + $GoldenView_zl_logger.debug("GoldenView") { args[0].ai(:plain => true) } +when 2 + $GoldenView_zl_logger.debug(args[0]) { args[1].ai(:plain => true) } +else + $GoldenView_zl_logger.debug(args[0]) { args[1].ai(:plain => true) } +end +__RUBY__ + +endfunction + +function! GoldenView#zl#log#level_debug() + ruby $GoldenView_zl_logger.level = Logger::DEBUG +endfunction + + + + + + + + + + + +function! GoldenView#zl#log#warn(...) + call setup_ruby() + ruby << __RUBY__ + +args = Vim.evaluate('a:000') + +case args.size +when 0 + return +when 1 + $GoldenView_zl_logger.warn("GoldenView") { args[0].ai(:plain => true) } +when 2 + $GoldenView_zl_logger.warn(args[0]) { args[1].ai(:plain => true) } +else + $GoldenView_zl_logger.warn(args[0]) { args[1].ai(:plain => true) } +end +__RUBY__ + +endfunction + +function! GoldenView#zl#log#level_warn() + ruby $GoldenView_zl_logger.level = Logger::WARN +endfunction + + + + + + + + + + + +function! GoldenView#zl#log#error(...) + call setup_ruby() + ruby << __RUBY__ + +args = Vim.evaluate('a:000') + +case args.size +when 0 + return +when 1 + $GoldenView_zl_logger.error("GoldenView") { args[0].ai(:plain => true) } +when 2 + $GoldenView_zl_logger.error(args[0]) { args[1].ai(:plain => true) } +else + $GoldenView_zl_logger.error(args[0]) { args[1].ai(:plain => true) } +end +__RUBY__ + +endfunction + +function! GoldenView#zl#log#level_error() + ruby $GoldenView_zl_logger.level = Logger::ERROR +endfunction + + + + + + + + + + + +function! GoldenView#zl#log#fatal(...) + call setup_ruby() + ruby << __RUBY__ + +args = Vim.evaluate('a:000') + +case args.size +when 0 + return +when 1 + $GoldenView_zl_logger.fatal("GoldenView") { args[0].ai(:plain => true) } +when 2 + $GoldenView_zl_logger.fatal(args[0]) { args[1].ai(:plain => true) } +else + $GoldenView_zl_logger.fatal(args[0]) { args[1].ai(:plain => true) } +end +__RUBY__ + +endfunction + +function! GoldenView#zl#log#level_fatal() + ruby $GoldenView_zl_logger.level = Logger::FATAL +endfunction + + + + + + + + + + + + + + + +endif + + +" ============================================================================ +" Modeline: [[[1 +" ============================================================================ +" vim: set ts=4 sw=4 tw=78 fdm=marker fmr=[[[,]]] fdl=1 : + + diff --git a/vim/plugins/GoldenView/autoload/GoldenView/zl/print.vim b/vim/plugins/GoldenView/autoload/GoldenView/zl/print.vim new file mode 100644 index 0000000..68bc9a2 --- /dev/null +++ b/vim/plugins/GoldenView/autoload/GoldenView/zl/print.vim @@ -0,0 +1,69 @@ +" =============== ============================================================ +" Name : print.vim +" Synopsis : vim script library: print +" Author : Zhao Cai +" HomePage : https://github.com/zhaocai/zl.vim +" Date Created : Sat 03 Sep 2011 03:54:00 PM EDT +" Last Modified : Thu 20 Sep 2012 04:25:11 PM EDT +" Tag : [ vim, print ] +" Copyright : © 2012 by Zhao Cai, +" Released under current GPL license. +" =============== ============================================================ + + + + + +" ============================================================================ +" Echo Message: ⟨⟨⟨1 +" ============================================================================ + +function! GoldenView#zl#print#echomsg(message, ...) + "--------- ------------------------------------------------ + " Desc : echomsg wrapper + " + " Args : + " - message to print + " - opts : > + " { + " 'hl' : 'MoreMsg' , + " } + " Return : + " Raise : + "--------- ------------------------------------------------ + + if empty(a:message) | return | endif + let opts = { + \ 'hl' : 'MoreMsg', + \ } + if a:0 >= 1 && type(a:1) == type({}) + call extend(opts, a:1) + endif + + execute 'echohl ' . opts.hl + for m in split(a:message, "\n") + echomsg m + endfor + echohl NONE +endfunction + +function! GoldenView#zl#print#warning(message) + call GoldenView#zl#print#echomsg(a:message, {'hl':'WarningMsg'}) +endfunction +function! GoldenView#zl#print#error(message) + call GoldenView#zl#print#echomsg(a:message, {'hl':'ErrorMsg'}) +endfunction +function! GoldenView#zl#print#moremsg(message) + call GoldenView#zl#print#echomsg(a:message, {'hl':'MoreMsg'}) +endfunction + + + + + +" ============================================================================ +" Modeline: ⟨⟨⟨1 +" ============================================================================ +" vim: set ts=4 sw=4 tw=78 fdm=marker fmr=⟨⟨⟨,⟩⟩⟩ fdl=1 : + + diff --git a/vim/plugins/GoldenView/autoload/GoldenView/zl/rc.vim b/vim/plugins/GoldenView/autoload/GoldenView/zl/rc.vim new file mode 100644 index 0000000..5eaf483 --- /dev/null +++ b/vim/plugins/GoldenView/autoload/GoldenView/zl/rc.vim @@ -0,0 +1,222 @@ +" =============== ============================================================ +" Description : vim script library +" Author : Zhao Cai +" HomePage : https://github.com/zhaocai/zl.vim +" Date Created : Mon 03 Sep 2012 09:05:14 AM EDT +" Last Modified : Thu 18 Apr 2013 03:16:39 PM EDT +" Tag : [ vim, library ] +" Copyright : © 2012 by Zhao Cai, +" Released under current GPL license. +" =============== ============================================================ + +" ============================================================================ +" Initialization: [[[1 +" ============================================================================ + +let s:GOLDENVIEW_ZL_VERSION_CURRENT = 140 + +let s:VERSION_FACTOR = str2float('0.01') + + +function! GoldenView#zl#rc#init() abort + if exists('g:loaded_GoldenView_zl') + return + endif + + if v:version < 700 + echoerr "zl.vim: requires Vim >= 7" + return + endif + + + if !exists("g:GoldenView_zl_force_reload") + let g:GoldenView_zl_force_reload = 0 + endif + + if !exists("g:GoldenView_zl_debug_mode") + let g:GoldenView_zl_debug_mode = 0 + endif + + let g:loaded_GoldenView_zl = s:GOLDENVIEW_ZL_VERSION_CURRENT * s:VERSION_FACTOR + +endfunction + + + +function! GoldenView#zl#rc#load_guard(prefix, vim_version, GoldenView_zl_version,exprs,...) + "--------- ------------------------------------------------ + " Desc : gereric script load guard function + " + " Args : + " - prefix : to generate loaded_var_name + " - vim_version : minmium vim version requirement + " - GoldenView_zl_version : minmium zl.vim version requirement. + " set 0 to ignore. + " - exprs : assert list of expresses to be true + " - ... scope : 'g' , 'b', ... + " + " Return : + " - 1 : unloaded + " - 0 : already loaded + " + " Raise : + " + " Example : > + " try | if !GoldenView#zl#rc#load_guard(expand(':t:r'), 703, 140, ['!&cp']) + " finish + " endif + " catch /^Vim\%((\a\+)\)\=:E117/ + " " E117: Unknown Function + " throw 'zl.vim is required!' + " endtry + " + " Details : + " g:loaded_{script name} is defined as 1 if: + " - vim version > 702 + " - zl version > 100 + " - test !&cp is true + " + " Refer : + "--------- ------------------------------------------------ + +" call Dfunc('GoldenView#zl#rc#load_guard(' . a:prefix .' '. a:vim_version .' '. a:GoldenView_zl_version .' '. join(a:exprs)) + + let l:scope = a:0 >= 1 ? a:1 : 'g' + + let l:loaded_var_name = l:scope . ':loaded_' + \ . substitute(a:prefix, '[^0-9a-zA-Z_]', '_', 'g') +" call Decho("loaded_var_name: " . l:loaded_var_name) + + if exists(l:loaded_var_name) && g:GoldenView_zl_force_reload == 0 +" call Decho(l:loaded_var_name . ' loaded: return 0') +" call Dret('GoldenView#zl#rc#load_guard') + return 0 + endif + + if a:vim_version > 0 && a:vim_version > v:version + echoerr l:loaded_var_name . ' requires Vim version ' + \ . string(a:vim_version * s:VERSION_FACTOR) + return 0 + elseif a:GoldenView_zl_version > 0 + if !exists("g:loaded_GoldenView_zl") + echoerr 'zl.vim is required but not loaded' + return 0 + endif + + if (a:GoldenView_zl_version > s:GOLDENVIEW_ZL_VERSION_CURRENT) + echoerr l:loaded_var_name . ' requires zl library version ' + \ . string(a:GoldenView_zl_version * s:VERSION_FACTOR) + return 0 + endif + endif + for expr in a:exprs + if !eval(expr) + echoerr l:loaded_var_name . ' requires: ' . expr +" call Dret('GoldenView#zl#rc#load_guard') + return 0 + endif + endfor + let {l:loaded_var_name} = 1 +" call Dret('GoldenView#zl#rc#load_guard') + return 1 +endfunction + +function! GoldenView#zl#rc#script_force_reload(...) + "--------- ------------------------------------------------ + " Desc : Call to ignore GoldenView#zl#rc#load_guard() and source. + " + " Args : script path or current script by default + " Return : + " Raise : E484: cannot open file + " + "--------- ------------------------------------------------ + let script = a:0 >= 1 ? a:1 : '%' + + let l:saved = g:GoldenView_zl_force_reload + let g:GoldenView_zl_force_reload = 1 + + exec "so " . script + + let g:GoldenView_zl_force_reload = l:saved +endfunction + + + + +function! GoldenView#zl#rc#init_python() + if has("python3") + let g:GoldenView_zl_py = 'py3' + let g:GoldenView_zl_pyeval = 'py3eval' + elseif has("python") + let g:GoldenView_zl_py = 'py' + let g:GoldenView_zl_pyeval = 'pyeval' + else + let g:GoldenView_zl_py = '' + let g:GoldenView_zl_pyeval = '' + endif +endfunction + + + +" ============================================================================ +" Set Initialization Default Variables: [[[1 +" ============================================================================ +function! GoldenView#zl#rc#set_default(var, ...) + "--------- ------------------------------------------------ + " Desc : Set Initialization Default Variables + " + " Args : ('var', val) || ( {dict} ) + " Return : + " Raise : 'zl.vim ***' + " + " Pitfall : avoid 's:' variables, which will be defined in + " this rc.vim script bur your script + " + " Example : > + " call GoldenView#zl#rc#set_default({ + " \ 'g:xxx_yyy' : { + " \ 'abc' : 1, + " \ } + " \ + " \ , 'g:yyy_zzz' : 'bcd' + " \ }) + "--------- ------------------------------------------------ + + if type(a:var) == type({}) + for key in keys(a:var) + call set_default(key, a:var[key]) + endfor + elseif type(a:var) == type("") + if a:0 >= 1 + call set_default(a:var, a:1) + else + throw "zl.vim should call with default value for " . a:var + endif + else + throw "zl.vim unsupported type: " . type(a:var) + endif +endfunction + +function! s:set_default(var,val) + if !exists(a:var) || type({a:var}) != type(a:val) + let {a:var} = a:val + endif +endfunction + + + + + + +" +" Note: +" add this call to other files if they need to check g:loaded_GoldenView_zl +" or g:GoldenView_zl_install_path +" +call GoldenView#zl#rc#init() + + +" ============================================================================ +" Modeline: [[[1 +" ============================================================================ +" vim: set ft=vim ts=4 sw=4 tw=78 fdm=marker fmr=[[[,]]] fdl=1 : diff --git a/vim/plugins/GoldenView/autoload/GoldenView/zl/regex.vim b/vim/plugins/GoldenView/autoload/GoldenView/zl/regex.vim new file mode 100644 index 0000000..df3cc82 --- /dev/null +++ b/vim/plugins/GoldenView/autoload/GoldenView/zl/regex.vim @@ -0,0 +1,94 @@ +" =============== ============================================================ +" Name : regex.vim +" Description : vim library: Regular Expression +" Author : Zhao Cai +" HomePage : https://github.com/zhaocai/zl.vim +" Date Created : Mon 03 Sep 2012 09:05:14 AM EDT +" Last Modified : Thu 20 Sep 2012 04:25:12 PM EDT +" Tag : [ vim, library, regex ] +" Copyright : © 2012 by Zhao Cai, +" Released under current GPL license. +" =============== ============================================================ + + + + + + + + +" ============================================================================ +" Regex Escape: ⟨⟨⟨1 +" ============================================================================ +function! GoldenView#zl#regex#escape(text, ...) " (text, ?magic='m') ⟨⟨⟨2 + "--------- ------------------------------------------------ + " Desc : escape common special characters. + " + " Args : + " + " - text to escape + " - magic : one of m, M, v, V. See :help 'magic' + " + " Return : escaped text + " Raise : + " + " Example : echo GoldenView#zl#regex#escape('I|||love&you\\\', 'v') + " + " Refer : + "--------- ------------------------------------------------ + + let l:magic = a:0 >= 1 ? a:1 : 'm' + + if l:magic =~# '^\\\?m$' + return escape(a:text, '^$.*\[]~') + elseif l:magic =~# '^\\\?M$' + return escape(a:text, '^$\') + elseif l:magic =~# '^\\\?V$' + return escape(a:text, '\') + elseif l:magic =~# '^\\\?v$' + return substitute(a:text, '[^0-9a-zA-Z_]', '\\&', 'g') + else + throw 'unsupported magic type' + return a:text + endif +endfunction " ⟩⟩⟩ + + + +" ---------------------------------------------------------------------------- +" Regex Builder: ⟨⟨⟨1 + + +function! GoldenView#zl#regex#or(list, ...) "⟨⟨⟨ + let opts = + \ { 'is_capturing' : 0 + \ , 'magic' : 'm' + \ } + if a:0 >= 1 && GoldenView#zl#var#is_dict(a:1) + call extend(opts, a:1) + endif + + let begin = opts['is_capturing'] ? '\(' : '\%(' + let or = '\|' + let end = '\)' + + if opts['magic'] =~# '^\\\?v$' + let begin = opts['is_capturing'] ? '(' : '%(' + let or = '|' + let end = ')' + endif + + return begin + \ . join(map( + \ a:list, 'GoldenView#zl#regex#escape(v:val, "' . opts['magic'] . '")'), + \ or) + \ . end +endfunction "⟩⟩⟩ + +" ⟩⟩⟩ + + +" ============================================================================ +" Modeline: ⟨⟨⟨1 +" ============================================================================ +" vim: set ft=vim ts=4 sw=4 tw=78 fdm=marker fmr=⟨⟨⟨,⟩⟩⟩ fdl=1 : diff --git a/vim/plugins/GoldenView/autoload/GoldenView/zl/rule.vim b/vim/plugins/GoldenView/autoload/GoldenView/zl/rule.vim new file mode 100644 index 0000000..4da76f1 --- /dev/null +++ b/vim/plugins/GoldenView/autoload/GoldenView/zl/rule.vim @@ -0,0 +1,331 @@ +" =============== ============================================================ +" Name : rule.vim +" Synopsis : vim script library: rule +" Author : Zhao Cai +" HomePage : https://github.com/zhaocai/zl.vim +" Date Created : Sat 03 Sep 2011 03:54:00 PM EDT +" Last Modified : Sat 29 Sep 2012 01:03:24 AM EDT +" Tag : [ vim, rule ] +" Copyright : © 2012 by Zhao Cai, +" Released under current GPL license. +" =============== ============================================================ + + + +" ============================================================================ +" Rule: [[[1 +" ============================================================================ + +" [TODO]( list for at type ) @zhaocai @start(2012-09-27 08:05) + +let s:rule_types = [ + \ 'filetype', 'buftype', 'mode' , 'cword', + \ 'bufname' , 'at' , 'syntax', 'expr' , + \ ] +let s:nrule = { + \ 'eval_order' : copy(s:rule_types), + \ 'eval_negate' : [] , + \ 'logic' : 'or' , + \ 'rule' : {} , + \ } + +function! GoldenView#zl#rule#norm(urule, ...) + "--------- ------------------------------------------------ + " Desc : normalize rules + " + " Rule : + " - "urule" : "Unnormalized RULE", rules written by users. + " - "nrule" : "Nnormalized RULE", rules completed with + " optional items and internal items. + " + " Args : + " - urule: un-normalized rule + " - opts : + " - eval_order : order in s:rule_types, + " - eval_negate : reverse eval result + " - logic : + " - {or} : 'v:filetype || v:bufname || ...' + " - {and} : 'v:filetype && v:bufname && ...' + " - {string} : similar to v:val for filter() + " + " Return : normalized rules + " Raise : + " + " Example : > + " + " Refer : + "--------- ------------------------------------------------ + let nrule = deepcopy(s:nrule) + + if a:0 >= 1 && GoldenView#zl#var#is_dict(a:1) + call extend(nrule, a:1) + endif + + let type_expr = { + \ 'buftype' : '&buftype' , + \ 'filetype' : '&ft' , + \ 'bufname' : "bufname('%')" , + \ 'cword' : "expand('')" , + \ } + + let type_pat = {} + for type in ['filetype', 'buftype', 'syntax'] + if has_key(a:urule, type) + let type_pat[type] = '^\%(' . join(a:urule[type], '\|') . '\)$' + endif + endfor + for type in ['bufname', 'cword'] + if has_key(a:urule, type) + let type_pat[type] = '^\%(' + \ . join(map(a:urule[type], 'GoldenView#zl#regex#escape(v:val)'), '\|') + \ . '\)$' + endif + endfor + + + " normalize each type of rules + for type in ['mode'] + if has_key(a:urule, type) + let nrule.rule[type] = a:urule[type] + endif + endfor + + for type in ['filetype', 'buftype', 'bufname', 'cword'] + if has_key(a:urule, type) + let nrule.rule[type] = + \ { + \ 'eval_expr' : 1 , + \ 'expr' : type_expr[type] , + \ 'pat' : type_pat[type] , + \ } + endif + endfor + + + for type in ['syntax'] + if has_key(a:urule, type) + let nrule.rule[type] = type_pat[type] + endif + endfor + + for type in ['mode', 'at'] + if has_key(a:urule, type) + let nrule.rule[type] = a:urule[type] + endif + endfor + + for type in ['expr'] + if has_key(a:urule, type) + try | let nrule.rule[type] = + \ join( + \ map( + \ map( + \ copy(a:urule[type]) + \ ,"join(v:val,' || ')" + \ ) + \ , "'('.v:val.')'" + \ ) + \ ,' && ' + \ ) + catch /^Vim\%((\a\+)\)\=:E714/ " E714: List required + throw 'zl(rule): expr rule should be written as list of lists.' + endtry + endif + endfor + + call filter( + \ nrule['eval_order'] + \ , 'has_key(nrule.rule, v:val) && !empty(nrule.rule[v:val])' + \ ) + + return nrule +endfunction + + +function! GoldenView#zl#rule#is_true(nrule, ...) + try + return call('GoldenView#zl#rule#logic_'.a:nrule['logic'], [a:nrule] + a:000) + catch /^Vim\%((\a\+)\)\=:E129/ + throw 'zl(rule): undefined logic funcref' + endtry +endfunction + + +function! GoldenView#zl#rule#is_false(nrule, ...) + return !call('GoldenView#zl#rule#is_true', [a:nrule] + a:000) +endfunction + + +" rule logic +function! s:_return(nrule, type, ret) + return + \ index(a:nrule.eval_negate, a:type) >= 0 + \ ? !a:ret + \ : a:ret +endfunction + +function! GoldenView#zl#rule#logic_or(nrule, ...) + let opts = {} + if a:0 >= 1 && GoldenView#zl#var#is_dict(a:1) + call extend(opts, a:1) + endif + + for type in a:nrule['eval_order'] + if s:_return(a:nrule, type, s:eval_{type}(a:nrule['rule'], opts)) + return 1 + endif + endfor + return 0 +endfunction + +function! GoldenView#zl#rule#logic_and(nrule, ...) + let opts = {} + if a:0 >= 1 && GoldenView#zl#var#is_dict(a:1) + call extend(opts, a:1) + endif + + for type in a:nrule['eval_order'] + if !s:_return(a:nrule, type, s:eval_{type}(a:nrule['rule'], opts)) + return 0 + endif + endfor + return 1 +endfunction + +function! GoldenView#zl#rule#logic_expr(nrule, ...) + let opts = {} + if a:0 >= 1 && GoldenView#zl#var#is_dict(a:1) + call extend(opts, a:1) + endif + + let str = a:nrule['expr'] + for type in a:nrule['eval_order'] + let str = substitute(str + \ , 'v:'.type + \ , string( + \ s:_return(a:nrule, type, + \ s:eval_{type}(a:nrule['rule'], opts) + \ ) + \ ) + \ , 'ge' + \ ) + endfor + + try + return eval(str) + catch /^Vim\%((\a\+)\)\=:E/ + throw printf('zl(rule): eval(%s) raises %s', str, v:exception) + endtry +endfunction + + + +" nrule eval +function! s:eval_filetype(nrule, ...) + return call('s:_eval_match', ['filetype', a:nrule] + a:000) +endfunction + +function! s:eval_cword(nrule, ...) + return call('s:_eval_match', ['cword', a:nrule] + a:000) +endfunction + +function! s:eval_buftype(nrule, ...) + return call('s:_eval_match', ['buftype', a:nrule] + a:000) +endfunction + +function! s:eval_bufname(nrule, ...) + return call('s:_eval_match', ['bufname', a:nrule] + a:000) +endfunction + + +function! s:eval_at(nrule, ...) + return search(get(a:nrule, 'at', '\%#'), 'bcnW') +endfunction + +function! s:eval_mode(nrule, ...) + let mode_pat = get(a:nrule, 'mode', []) + let mode_expr = + \ a:0 >= 1 && GoldenView#zl#var#is_dict(a:1) + \ ? get(a:1, 'mode', mode()) + \ : mode() + + return + \ !empty( + \ filter( + \ mode_pat + \ , 'stridx(mode_expr, v:val) == -1' + \ ) + \ ) +endfunction + +function! s:eval_syntax(nrule, ...) + let pat = get(a:nrule, 'syntax', '') + + let opts = {} + if a:0 >= 1 && GoldenView#zl#var#is_dict(a:1) + call extend(opts, a:1) + endif + let syn_names = GoldenView#zl#syntax#synstack_names(opts) + + return !empty(filter(syn_names, 'match(v:val, pat) != -1')) +endfunction + +function! s:eval_expr(nrule, ...) + try + return eval(get(a:nrule, 'expr', 1)) + catch /^Vim\%((\a\+)\)\=:E/ + return 0 + endtry +endfunction + +function! s:_eval_match(type, nrule, ...) + "--------- ------------------------------------------------ + " Desc : internal match evluation + " Rule : + " { 'type' : + " { + " 'eval_expr' : (1|0) , + " 'expr' : {expr} , + " 'pat' : {pat} , + " } + " } + " + " Args : [{type}, {nrule}[, {opts}]] + " Return : + " - 0 : false + " - 1 : true + " Raise : zl(rule) + " + " Refer : vimhelp:match() + "--------- ------------------------------------------------ + + let rule = copy(get(a:nrule, a:type, {})) + if empty(rule) + throw 'zl(rule): ' . v:exception + endif + + " opt for {expr} from runtime opts + if a:0 >= 1 && GoldenView#zl#var#is_dict(a:1) && has_key(a:1, a:type) + let rt_rule = a:1[a:type] + if GoldenView#zl#var#is_dict(rt_rule) + call extend(rule, rt_rule) + elseif GoldenView#zl#var#is_string(rt_rule) + let rule['expr'] = rt_rule + let rule['eval_expr'] = 0 + endif + endif + if rule['eval_expr'] + let rule['expr'] = eval(rule['expr']) + endif + try + return call('match', [rule['expr'], rule['pat']]) != -1 + catch /^Vim\%((\a\+)\)\=:E/ + throw 'zl(rule): ' . v:exception + endtry +endfunction + + +" ============================================================================ +" Modeline: [[[1 +" ============================================================================ +" vim: set ft=vim ts=4 sw=4 tw=78 fdm=marker fmr=[[[,]]] fdl=1 : diff --git a/vim/plugins/GoldenView/autoload/GoldenView/zl/sys.vim b/vim/plugins/GoldenView/autoload/GoldenView/zl/sys.vim new file mode 100644 index 0000000..74dcdf5 --- /dev/null +++ b/vim/plugins/GoldenView/autoload/GoldenView/zl/sys.vim @@ -0,0 +1,78 @@ +" =============== ============================================================ +" Name : sys.vim +" Description : vim library +" Author : Zhao Cai +" HomePage : https://github.com/zhaocai/zl.vim +" Date Created : Mon 03 Sep 2012 09:05:14 AM EDT +" Last Modified : Thu 20 Sep 2012 04:25:15 PM EDT +" Tag : [ vim, library ] +" Copyright : © 2012 by Zhao Cai, +" Released under current GPL license. +" =============== ============================================================ + + + + + + + + + + +" ============================================================================ +" Environment: [[[1 +" ============================================================================ + +function! GoldenView#zl#sys#ostype() + "--------- ------------------------------------------------ + " Args : + " Return : + " - Mac, Windows, Linux, FreeBSD, SunOS, Unix, + " - undefined + " Raise : + " + " Example : > + " call GoldenView#zl#rc#set_default('g:os_type', GoldenView#zl#sys#ostype()) + "--------- ------------------------------------------------ + if (has("win32") || has("win95") || has("win64") || has("win16")) + let s:os_type = "Windows" + elseif has('mac') + let s:os_type="Mac" + elseif has('unix') + let arch = system("uname | tr -d '\n'") + if ( arch=="Linux" ) + let s:os_type="Linux" + elseif ( arch=="FreeBSD" ) + let s:os_type="FreeBSD" + elseif ( arch=="SunOS" ) + let s:os_type="SunOS" + elseif ( arch=="Darwin" ) + let s:os_type="Mac" + else + let s:os_type="Unix" + endif + endif + return s:os_type +endfunction + +function! GoldenView#zl#sys#is_cygwin() + return s:is_cygwin +endfunction + +function! GoldenView#zl#sys#is_win() + return s:os_type == 'Windows' +endfunction +function! GoldenView#zl#sys#is_mac() + return s:os_type == 'Mac' +endfunction +function! GoldenView#zl#sys#is_linux() + return s:os_type == 'Linux' +endfunction + +let s:os_type = GoldenView#zl#sys#ostype() +let s:is_cygwin = has('win32unix') + +" ============================================================================ +" Modeline: [[[1 +" ============================================================================ +" vim: set ft=vim ts=4 sw=4 tw=78 fdm=marker fmr=[[[,]]] fdl=1 : diff --git a/vim/plugins/GoldenView/autoload/GoldenView/zl/var.vim b/vim/plugins/GoldenView/autoload/GoldenView/zl/var.vim new file mode 100644 index 0000000..77c6d03 --- /dev/null +++ b/vim/plugins/GoldenView/autoload/GoldenView/zl/var.vim @@ -0,0 +1,86 @@ +" =============== ============================================================ +" Name : var.vim +" Synopsis : vim script library: variable +" Author : Zhao Cai +" HomePage : https://github.com/zhaocai/zl.vim +" Date Created : Sat 03 Sep 2011 03:54:00 PM EDT +" Last Modified : Thu 20 Sep 2012 04:25:16 PM EDT +" Tag : [ vim, variable ] +" Copyright : © 2012 by Zhao Cai, +" Released under current GPL license. +" =============== ============================================================ + + + + +" ============================================================================ +" Type: [[[1 +" ============================================================================ + + +"--------- ------------------------------------------------ +" Desc : Wrapper functions for type() +" +" Refer : vital.vim +"--------- ------------------------------------------------ + +let [ +\ s:__TYPE_NUMBER, +\ s:__TYPE_STRING, +\ s:__TYPE_FUNCREF, +\ s:__TYPE_LIST, +\ s:__TYPE_DICT, +\ s:__TYPE_FLOAT +\] = [ +\ type(3), +\ type(""), +\ type(function('tr')), +\ type([]), +\ type({}), +\ has('float') ? type(str2float('0')) : -1 +\] +" __TYPE_FLOAT = -1 when -float +" This doesn't match to anything. + +" Number or Float +function! GoldenView#zl#var#is_numeric(Value) + let _ = type(a:Value) + return _ ==# s:__TYPE_NUMBER + \ || _ ==# s:__TYPE_FLOAT +endfunction +" Number +function! GoldenView#zl#var#is_integer(Value) + return type(a:Value) ==# s:__TYPE_NUMBER +endfunction +function! GoldenView#zl#var#is_number(Value) + return type(a:Value) ==# s:__TYPE_NUMBER +endfunction +" Float +function! GoldenView#zl#var#is_float(Value) + return type(a:Value) ==# s:__TYPE_FLOAT +endfunction +" String +function! GoldenView#zl#var#is_string(Value) + return type(a:Value) ==# s:__TYPE_STRING +endfunction +" Funcref +function! GoldenView#zl#var#is_funcref(Value) + return type(a:Value) ==# s:__TYPE_FUNCREF +endfunction +" List +function! GoldenView#zl#var#is_list(Value) + return type(a:Value) ==# s:__TYPE_LIST +endfunction +" Dictionary +function! GoldenView#zl#var#is_dict(Value) + return type(a:Value) ==# s:__TYPE_DICT +endfunction + + + + + +" ============================================================================ +" Modeline: [[[1 +" ============================================================================ +" vim: set ft=vim ts=4 sw=4 tw=78 fdm=marker fmr=[[[,]]] fdl=1 : diff --git a/vim/plugins/GoldenView/autoload/GoldenView/zl/vim.vim b/vim/plugins/GoldenView/autoload/GoldenView/zl/vim.vim new file mode 100644 index 0000000..8334121 --- /dev/null +++ b/vim/plugins/GoldenView/autoload/GoldenView/zl/vim.vim @@ -0,0 +1,50 @@ +" =============== ============================================================ +" Description : vim library: vim +" Author : Zhao Cai +" HomePage : https://github.com/zhaocai/zl.vim +" Date Created : Mon 03 Sep 2012 09:05:14 AM EDT +" Last Modified : Thu 20 Sep 2012 06:01:48 PM EDT +" Tag : [ vim, library, debug ] +" Copyright : © 2012 by Zhao Cai, +" Released under current GPL license. +" =============== ============================================================ + + + + + + + + +" ============================================================================ +" Context: [[[1 +" ============================================================================ +function! GoldenView#zl#vim#context() + " -------- - ----------------------------------------------- + " Desc : generate context + " + " Example : > + " function BeTraced(...) + " exec GoldenView#zl#vim#context() | call XXX#Trace(a:000) + " endfunction + " + " function XXX#Trace(...) + " let context = g:GoldenView_zl_context + " "... + " endfunction + " Refer : + " -------- - ----------------------------------------------- + return + \'try + \| throw "" + \|catch + \| let g:GoldenView_zl_context = v:throwpoint + \|endtry + \' +endfunction + + +" ============================================================================ +" Modeline: [[[1 +" ============================================================================ +" vim: set ft=vim ts=4 sw=4 tw=78 fdm=marker fmr=[[[,]]] fdl=1 : diff --git a/vim/plugins/GoldenView/autoload/GoldenView/zl/window.vim b/vim/plugins/GoldenView/autoload/GoldenView/zl/window.vim new file mode 100644 index 0000000..a8e7e04 --- /dev/null +++ b/vim/plugins/GoldenView/autoload/GoldenView/zl/window.vim @@ -0,0 +1,432 @@ +" =============== ============================================================ +" Name : window.vim +" Synopsis : vim script library: window +" Author : Zhao Cai +" HomePage : https://github.com/zhaocai/zl.vim +" Version : 0.1 +" Date Created : Sat 03 Sep 2011 03:54:00 PM EDT +" Last Modified : Tue 23 Oct 2012 04:59:06 PM EDT +" Tag : [ vim, syntax ] +" Copyright : © 2012 by Zhao Cai, +" Released under current GPL license. +" =============== ============================================================ + + + +" ============================================================================ +" Status: ⟨⟨⟨1 +" ============================================================================ +call GoldenView#zl#rc#set_default({ + \ 'g:GoldenView_zl_window__ignore_urule' : { + \ 'filetype' : [ + \ '' , + \ 'qf' , 'vimpager', 'undotree', 'tagbar', + \ 'nerdtree', 'vimshell', 'vimfiler', 'voom' , + \ 'tabman' , 'unite' , 'quickrun', 'Decho' , + \ ], + \ 'buftype' : [ + \ 'nofile' , + \ ], + \ 'bufname' : [ + \ 'GoToFile' , 'diffpanel_\d\+' , + \ '__Gundo_Preview__' , '__Gundo__' , + \ '\[LustyExplorer-Buffers\]' , '\-MiniBufExplorer\-' , + \ '_VOOM\d\+$' , '__Urannotate_\d\+__' , + \ '__MRU_Files__' , + \ ], + \ }, + \ }) + +let s:GoldenView_zl_window__ignore_nrule = GoldenView#zl#rule#norm( + \ g:GoldenView_zl_window__ignore_urule, { + \ 'logic' : 'or', + \ } + \ ) + +function! GoldenView#zl#window#is_last_visible() + "--------- ------------------------------------------------ + " Desc : check if no visible buffer left + " + " Args : + " + " Return : + " - 0 : false + " - 1 : true + " Raise : + " + "--------- ------------------------------------------------ + + for i in range(tabpagenr('$')) + let tabnr = i + 1 + for bufnr in tabpagebuflist(tabnr) + let ft = getbufvar(bufnr, '&ft') + let buftype = getbufvar(bufnr, '&buftype') + if empty(ft) && empty(buftype) + continue + endif + if ! GoldenView#zl#rule#is_true(s:GoldenView_zl_window__ignore_nrule) + return 0 + endif + endfor + endfor + + return 1 +endfunction + + + + + +" ============================================================================ +" Move: ⟨⟨⟨1 +" ============================================================================ +let s:golden_ratio = 1.618 +function! GoldenView#zl#window#next_window_or_tab() + if tabpagenr('$') == 1 && winnr('$') == 1 + call GoldenView#zl#window#split_nicely() + elseif winnr() < winnr("$") + wincmd w + else + tabnext + wincmd w + endif +endfunction + +function! GoldenView#zl#window#previous_window_or_tab() + if winnr() > 1 + wincmd W + else + tabprevious + execute winnr("$") . "wincmd w" + endif +endfunction + + + +" ============================================================================ +" Size: ⟨⟨⟨1 +" ============================================================================ +function! GoldenView#zl#window#golden_ratio_width() + return float2nr(&columns / s:golden_ratio) +endfunction + +function! GoldenView#zl#window#golden_ratio_height() + return float2nr(&lines / s:golden_ratio) +endfunction + +function! GoldenView#zl#window#textwidth() + return &tw == 0 ? 78 : &tw +endfunction + +" ============================================================================ +" Split: ⟨⟨⟨1 +" ============================================================================ + +function! GoldenView#zl#window#nicely_split_cmd(...) + let opts = { + \ 'winnr' : 0 , + \} + if a:0 >= 1 && type(a:1) == type({}) + call extend(opts, a:1) + endif + + let ww = winwidth(opts['winnr']) + let tw = &textwidth + + if tw != 0 && ww > s:golden_ratio * tw + return 'vsplit' + endif + + if ww > &columns / s:golden_ratio + return 'vsplit' + endif + + return 'split' +endfunction + +function! GoldenView#zl#window#split_nicely() + let split_cmd = GoldenView#zl#window#nicely_split_cmd() + try + exec split_cmd + catch /^Vim\%((\a\+)\)\=:E36/ + if split_cmd == 'split' + let &winminheight = &winminheight / 2 + else + let &winminwidth = &winminwidth / 2 + endif + exec split_cmd + endtry + wincmd p +endfunction + +function! GoldenView#zl#window#toggle_split() + let prev_name = winnr() + silent! wincmd w + if prev_name == winnr() + split + else + call GoldenView#zl#buf#quit() + endif +endfunction + + + +" ============================================================================ +" Sort: ⟨⟨⟨1 +" ============================================================================ +function! GoldenView#zl#window#sort_by(...) + "--------- ------------------------------------------------ + " Desc : sort buffer by size, height, or width + " + " Args : + " - opts : > ↓ + " { + " 'by' : size|height|width|winnr|bufnr , + " 'tabnr' : tabpagenr() , + " 'width_weight' : s:golden_ratio , + " 'height_weight' : 1 , + " } + " + " Return : sorted list of + " { + " 'bufnr' : bufnr , + " 'winnr' : winnr , + " 'width' : width , + " 'height' : height , + " 'size' : size , + " } + " + " Raise : + " + "--------- ------------------------------------------------ + + let opts = { + \ 'by' : 'size' , + \ 'tabnr' : tabpagenr() , + \ 'width_weight' : s:golden_ratio , + \ 'height_weight' : 1 , + \} + if a:0 >= 1 && type(a:1) == type({}) + call extend(opts, a:1) + endif + + let list = [] + for bufnr in tabpagebuflist(opts['tabnr']) + let winnr = bufwinnr(bufnr) + let width = winwidth(winnr) + let height = winheight(winnr) + let size = width * opts['width_weight'] + \ + height * opts['height_weight'] + + call add(list, { + \ 'bufnr' : bufnr , + \ 'winnr' : winnr , + \ 'width' : width , + \ 'height' : height , + \ 'size' : size , + \ }) + endfor + + return GoldenView#zl#list#sort_by(list,'v:val["'.opts['by'].'"]') +endfunction + + +" ============================================================================ +" Switch: ⟨⟨⟨1 +" ============================================================================ + +function! GoldenView#zl#window#switch_buffer_toggle(...) + "--------- ------------------------------------------------ + " Desc : toggle buffer switch + " + " Args : + " - opts : > + " { + " 'with' : 'largest' , + " } + " + " Return : + " Raise : + " + " Example : > + " nnoremap + " \ :call GoldenView#zl#window#switch_buffer_toggle() + "--------- ------------------------------------------------ + + let opts = { + \ 'with' : 'largest', + \} + if a:0 >= 1 && type(a:1) == type({}) + call extend(opts, a:1) + endif + + let bufnr = bufnr('%') + if exists('b:switch_buffer') + \ && bufwinnr(b:switch_buffer['bufnr']) == b:switch_buffer['winnr'] + call GoldenView#zl#window#switch_buffer(bufnr, b:switch_buffer['bufnr']) + else + try + let fn = 'GoldenView#zl#window#switch_buffer_with_'.opts['with'] + exec 'call ' . fn . '()' + catch /^Vim%((a+))=:E700/ + throw "zl: function " . fn . 'for ' . opts['with'] + \ . ' is not implemented!' + endtry + + endif +endfunction + + +function! GoldenView#zl#window#switch_buffer_with_sorted_by_size_index(index, ...) + "--------- ------------------------------------------------ + " Desc : switch buffer with the largest window + " + " Args : + " - opts : > + " { + " 'bufnr' : bufnr('%') , + " 'by' : 'size'|'height'|'width' , + " 'tabnr' : tabpagenr() , + " 'width_weight' : s:golden_ratio , + " 'height_weight' : 1 , + " } + " + " Return : + " Raise : + " + " Example : > + " nnoremap + " \ :call GoldenView#zl#window#switch_buffer_with_largest() + "--------- ------------------------------------------------ + + + let opts = { + \ 'bufnr' : bufnr('%') , + \ 'by' : 'size' , + \ 'tabnr' : tabpagenr() , + \ 'width_weight' : s:golden_ratio , + \ 'height_weight' : 1 , + \} + if a:0 >= 1 && type(a:1) == type({}) + call extend(opts, a:1) + endif + + let sorted = GoldenView#zl#window#sort_by(filter(copy(opts),'v:key != "bufnr"')) + let bufnr_to = sorted[a:index]['bufnr'] + call GoldenView#zl#window#switch_buffer(opts['bufnr'], bufnr_to) +endfunction + + +function! GoldenView#zl#window#switch_buffer_with_largest(...) + call GoldenView#zl#window#switch_buffer_with_sorted_by_size_index(-1, a:000) +endfunction + +function! GoldenView#zl#window#switch_buffer_with_smallest(...) + call GoldenView#zl#window#switch_buffer_with_sorted_by_size_index(0, a:000) +endfunction + +function! GoldenView#zl#window#switch_buffer(bufnr1, bufnr2) + "--------- ------------------------------------------------ + " Desc : switch buffer window if both are visible + " + " Args : bufnr1 <-> bufnr2 + " Return : + " - 0 : fail + " - 1 : success + " Raise : + " + " Example : > + " + " Refer : + "--------- ------------------------------------------------ + let winnr1 = bufwinnr(a:bufnr1) + let winnr2 = bufwinnr(a:bufnr2) + if winnr1 != -1 && winnr2 != -1 + + silent noautocmd exec winnr1 'wincmd w' + if bufnr('%') != a:bufnr2 + silent noautocmd exec 'buffer' a:bufnr2 + let b:switch_buffer = { + \ 'bufnr' : a:bufnr1 , + \ 'winnr' : winnr2 , + \ } + endif + silent noautocmd exec winnr2 'wincmd w' + if bufnr('%') != a:bufnr1 + silent noautocmd exec 'buffer' a:bufnr1 + + " need filetype detect (maybe) because bufnr1 disappears for a + " moment + silent filetype detect + + let b:switch_buffer = { + \ 'bufnr' : a:bufnr2 , + \ 'winnr' : winnr1 , + \ } + endif + + return 1 + else + return 0 + endif +endfunction + +function! GoldenView#zl#window#alternate_buffer() + if bufnr('%') != bufnr('#') && buflisted(bufnr('#')) + buffer # + else + let cnt = 0 + let pos = 1 + let current = 0 + while pos <= bufnr('$') + if buflisted(pos) + if pos == bufnr('%') + let current = cnt + endif + + let cnt += 1 + endif + + let pos += 1 + endwhile + + if current > cnt / 2 + bprevious + else + bnext + endif + endif +endfunction + +" ============================================================================ +" Scroll: ⟨⟨⟨1 +" ============================================================================ + +function! GoldenView#zl#window#scroll_other_window(direction) + execute 'wincmd' (winnr('#') == 0 ? 'w' : 'p') + execute (a:direction ? "normal! \" : "normal! \") + wincmd p +endfunction + +" ============================================================================ +" View: ⟨⟨⟨1 +" ============================================================================ +function! GoldenView#zl#window#save_view_command(command) range + let view = winsaveview() + + let range = '' + if a:firstline != a:lastline + let range = a:firstline.','.a:lastline + endif + try + keepjumps execute range.a:command + finally + call winrestview(view) + endtry +endfunction + +" ============================================================================ +" Modeline: ⟨⟨⟨1 +" ============================================================================ +" vim: set ft=vim ts=4 sw=4 tw=78 fdm=marker fmr=⟨⟨⟨,⟩⟩⟩ fdl=1 : + diff --git a/vim/plugins/GoldenView/doc/GoldenView.txt b/vim/plugins/GoldenView/doc/GoldenView.txt new file mode 100644 index 0000000..2a085ae --- /dev/null +++ b/vim/plugins/GoldenView/doc/GoldenView.txt @@ -0,0 +1,366 @@ +*GoldenView.txt* Always have a nice view for vim split windows + +=============================================================================== +CONTENTS *goldenview-contents* + + 1. Introduction |goldenview-introduction| + 2. Features |goldenview-features| + 1. 1. AutoResizing |goldenview-1.-autoresizing| + 2. 2. Tiled Windows Management |goldenview-2.-tiled-windows-management| + 3. Installation |goldenview-installation| + 1. Option A - With Plugin Manager [4] ( recommanded ) + 2. Option B - Without Plugin Manager [4] + 4. Quick Start |goldenview-quick-start| + 1. |g:goldenview__enable_default_mapping| + 2. |g:goldenview__enable_at_startup| + 5. More Commands and Mappings |goldenview-more-commands-and-mappings| + 1. |:ToggleGoldenViewAutoResize| + 2. |:DisableGoldenViewAutoResize| + 3. |:EnableGoldenViewAutoResize| + 4. |:GoldenViewResize| + 5. |:SwitchGoldenViewLargest| + 6. |:SwitchGoldenViewSmallest| + 6. Rules |goldenview-rules| + 1. |g:goldenview__ignore_urule| + 2. |g:goldenview__restore_urule| + 7. Profiles |goldenview-profiles| + 1. |g:goldenview__active_profile| + 2. |g:goldenview__reset_profile| + 8. Troubleshooting: |goldenview-troubleshooting:| + 1. Please do not resize me! |goldenview-please-do-not-resize-me| + 2. minibufexpl.vim [6] takes 5+ lines |goldenview-minibufexpl.vim-6-takes-5-lines| + 3. I still have Issues: |goldenview-i-still-have-issues:| + 9. Contributors |goldenview-contributors| + 10. RELEASE HISTORY |goldenview-release-history| + 11. LICENSE: |goldenview-license:| + +=============================================================================== +INTRODUCTION *goldenview-introduction* +> + ------------- - ----------------------------------------------- + Plugin : GoldenView.vim + Author : Zhao Cai + EMail : caizhaoff@gmail.com + URL : http://zhaocai.github.io/GoldenView.Vim/ + Version : 1.2.2 + Date Created : Tue 18 Sep 2012 05:23:13 PM EDT + Last Modified : Wed 17 Apr 2013 09:52:45 PM EDT + ------------- - ----------------------------------------------- + +The initial motive for GoldenView [1] comes from the frustration of using +other vim plugins to auto-resize split windows. The idea is deadly simple and +very useful: resize the focused window to a proper size. However, in practice, +many hiccups makes auto-resizing not a smooth experience. Below are a list of +issues GoldenView [1] attempts to solve: + +First and the most important one, auto-resizing should play nicely with +existing plugins like 'tagbar', 'vimfiler', 'unite', 'VOoM', 'quickfix', +'undotree', 'gundo', etc. These windows should manage there own window size. + +Second, auto-resizing should take care of the other windows too. Resizing the +focused window may cause the other windows become too small. When you have 4+ +split windows, auto-resizing may just make a mess out of it. + + GoldView Screencast, see reference [2] + +GoldView Screencast + +=============================================================================== +FEATURES *goldenview-features* + +GoldenView [1] has preliminarily solved the issues described above. It also +provides other features. Bascally, it does two things: + +------------------------------------------------------------------------------- +1. AUTORESIZING *goldenview-1.-autoresizing* + +First of all, it automatically resize the focused split window to a "golden" +view based on golden ratio [3] and 'textwidth'. + +------------------------------------------------------------------------------- +2. TILED WINDOWS MANAGEMENT *goldenview-2.-tiled-windows-management* + +Second, it maps a single key ('' by default) to nicely split windows to +tiled windows. +> + ----+----------------+------------+---+ + | | | | | + | F | | S1 | T | + | I | +------------| A | + | L | | S2 | G | + | E | MAIN PANE +------------+ B | + | R | | S3 | A | + | | | | R | + | | | | | + +---+----------------+------------+---+ + +To get this view, just hit '' 4 times. or, if you have a large monitor, +you may get tiled windows below. +> + ----+---------------+--------------+------------+---+ + | | | | | | + | F | | | S1 | T | + | I | | +------------| A | + | L | | M2 | S2 | G | + | E | MAIN PANE | +------------+ B | + | R | | | S3 | A | + | | | | | B | + | | | | | | + +---+---------------+--------------+------------+---+ + +To quickly switch between those windows, a few keys are mapped to + +- Focus to the main window + +- Switch with the 'MAIN PANE', the largest, smallest, etc. + +- Jump to the next and previous window + +=============================================================================== +INSTALLATION *goldenview-installation* + +Install GoldenView [1] is the same as installing other vim plugins. If +experienced with vim, you can skim the example below and move to next section. + +------------------------------------------------------------------------------- +OPTION A - WITH PLUGIN MANAGER [4] ( RECOMMANDED ) + +If you use plugin managers like Pathogen, vundle, neobundle, +vim-addon-manager, etc., just unarchive the zip file or clone the GoldenView +[1] repo from 'git://github.com/zhaocai/GoldenView.git' into your local plugin +installation directory (most likely '~/.vim/bundle/'). Then add corresponding +scripts in .vimrc for the bundle manager you are using. + +Example: + +- neobundle: +> + NeoBundle 'zhaocai/GoldenView.Vim' "Always have a nice view for vim split windows + +- vundle: +> + Bundle 'zhaocai/GoldenView.Vim' + +- vim-addon-manager: +> + call vam#ActivateAddons(['GoldenView.Vim'], {'auto_install' : 1}) + +------------------------------------------------------------------------------- +OPTION B - WITHOUT PLUGIN MANAGER [4] + +Unarchive the zip file into a directory that is under 'runtimepath' of your +vim, '~/.vim' for example. + +=============================================================================== +QUICK START *goldenview-quick-start* + +GoldenView [1] should work out of the box without configuration. It should +automatically start to resize focused window to golden ratio [3] based on +'textwidth' and vim available size. You may start to play with it now. + +To get you started, a few default keys are mapped as below: +> + " 1. split to tiled windows + nmap GoldenViewSplit + + " 2. quickly switch current window with the main pane + " and toggle back + nmap GoldenViewSwitchMain + nmap GoldenViewSwitchToggle + + " 3. jump to next and previous window + nmap GoldenViewNext + nmap GoldenViewPrevious + +The meaning of those keys are self-explaining. A general workflow would be +'GoldenViewSplit' key to quickly and nicely split windows to the layout +as below. Then you may open your files. +> + ----+----------------+------------+---+ + | | | | | + | F | | S1 | T | + | I | +------------| A | + | L | | S2 | G | + | E | MAIN PANE +------------+ B | + | R | | S3 | A | + | | | | R | + | | | | | + +---+----------------+------------+---+ + +To switch 'S1' with 'MAIN PANE', in 'S1' and hit 'GoldenViewSwitchMain'. +To switch back, hit 'GoldenViewSwitchToggle' in either 'MAIN PAIN' or +'S1' + +------------------------------------------------------------------------------- +*g:goldenview__enable_default_mapping* + +Every experienced vim user has a different set of key mappings. If you you are +(most likely) unhappy about some of the mappings, map you own keys as below: +> + let g:goldenview__enable_default_mapping = 0 + + nmap GoldenViewSplit + " ... and so on + +------------------------------------------------------------------------------- +*g:goldenview__enable_at_startup* + +if you do not want to start auto-resizing automatically, you can put 'let +g:goldenview__enable_at_startup = 0' in your vimrc. + +=============================================================================== +MORE COMMANDS AND MAPPINGS *goldenview-more-commands-and-mappings* + +------------------------------------------------------------------------------- +*:ToggleGoldenViewAutoResize* + +------------------------------------------------------------------------------- +*:DisableGoldenViewAutoResize* + +------------------------------------------------------------------------------- +*:EnableGoldenViewAutoResize* + +These commands toggle, enable, and disable GoldenView auto-resizing. + +------------------------------------------------------------------------------- +*:GoldenViewResize* + +this command do manual resizing of focused window. + +You can also map a key for this as below: +> + nmap GoldenViewResize + +------------------------------------------------------------------------------- +*:SwitchGoldenViewLargest* + +------------------------------------------------------------------------------- +*:SwitchGoldenViewSmallest* + +these commands do as it named. + +You can also add mappings as below. ( no default keys for these mappings) +```vim nmap GoldenViewSwitchWithLargest nmap GoldenViewSwitchWithSmallest + +``` + +Other switch rules can be easily defined. If you have some ideas, please post +to github issue [5] for discussion. + +=============================================================================== +RULES *goldenview-rules* + +GoldenView [1] defines two rules: + +------------------------------------------------------------------------------- +*g:goldenview__ignore_urule* + +is to "ignore" - allow those special buffers to manage their own window size. + +------------------------------------------------------------------------------- +*g:goldenview__restore_urule* + +is to "restore" - restore window size of some of special buffers. + +The 'urule' (user rules) are like this, which will be normalize at runtime for +faster processing. +> + \{ + \ 'filetype' : [ + \ '' , + \ 'qf' , 'vimpager', 'undotree', 'tagbar', + \ 'nerdtree', 'vimshell', 'vimfiler', 'voom' , + \ 'tabman' , 'unite' , 'quickrun', 'Decho' , + \ ], + \ 'buftype' : [ + \ 'nofile' , + \ ], + \ 'bufname' : [ + \ 'GoToFile' , 'diffpanel_\d\+' , + \ '__Gundo_Preview__' , '__Gundo__' , + \ '\[LustyExplorer-Buffers\]' , '\-MiniBufExplorer\-' , + \ '_VOOM\d\+$' , '__Urannotate_\d\+__' , + \ '__MRU_Files__' , + \ ], + \}, + +=============================================================================== +PROFILES *goldenview-profiles* + +GoldenView [1] defines two profile: + +------------------------------------------------------------------------------- +*g:goldenview__active_profile* + +defines the functions and preferences to auto resize windows. + +------------------------------------------------------------------------------- +*g:goldenview__reset_profile* + +defines reset preferences to restore everything to default. + +'function GoldenView#ExtendProfile()' is provided to customize preferences. + +For more details, please read the source code! :) + +=============================================================================== +TROUBLESHOOTING: *goldenview-troubleshooting:* + +------------------------------------------------------------------------------- +PLEASE DO NOT RESIZE ME! *goldenview-please-do-not-resize-me* + +GoldenView [1] maintains rules for "common" cases. But vim offers a great +variety of plugins which defines buffers for special purposes. If you find +some special buffers which is supposed to not be auto-resized. Please check +|g:goldenview__ignore_urule|. You may extend the |g:goldenview__active_profile| +or post the issue to github issue [5] for adding it to builtin support. + +------------------------------------------------------------------------------- +MINIBUFEXPL.VIM [6] TAKES 5+ LINES *goldenview-minibufexpl.vim-6-takes-5-lines* + +Check my fork minibufexpl.vim [6] to see if it is working for you. I have send +pull request to the origin repo. + +------------------------------------------------------------------------------- +I STILL HAVE ISSUES: *goldenview-i-still-have-issues:* + +If you have any issues, please post it to github issue [5] for discussion. + +=============================================================================== +CONTRIBUTORS *goldenview-contributors* + +=============================================================================== +RELEASE HISTORY *goldenview-release-history* + +Refer to History.md [7] + +=============================================================================== +LICENSE: *goldenview-license:* + +Copyright (c) 2013 Zhao Cai + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see 'http://www.gnu.org/licenses/' [8]. + +=============================================================================== +REFERENCES *goldenview-references* + +[1] http://zhaocai.github.io/GoldenView.Vim/ +[2] http://dl.dropboxusercontent.com/u/1897501/Screencasts/GoldenView.gif +[3] http://en.wikipedia.org/wiki/Golden_ratio +[4] http://vim-scripts.org/vim/tools.html +[5] https://github.com/zhaocai/GoldenView.Vim/issues +[6] https://github.com/zhaocai/minibufexpl.vim +[7] https://github.com/zhaocai/GoldenView.Vim/blob/master/History.md +[8] http://www.gnu.org/licenses/ + +vim: ft=help diff --git a/vim/plugins/GoldenView/plugin/GoldenView.vim b/vim/plugins/GoldenView/plugin/GoldenView.vim new file mode 100644 index 0000000..ae244fb --- /dev/null +++ b/vim/plugins/GoldenView/plugin/GoldenView.vim @@ -0,0 +1,177 @@ +" =============== ============================================================ +" Name : GoldenView +" Description : Golden view for vim split windows +" Author : Zhao Cai +" HomePage : https://github.com/zhaocai/GoldenView.Vim +" Date Created : Tue 18 Sep 2012 10:25:23 AM EDT +" Last Modified : Sat 29 Sep 2012 01:23:02 AM EDT +" Tag : [ vim, window, size, golden-ratio ] +" Copyright : © 2012 by Zhao Cai, +" Released under current GPL license. +" =============== ============================================================ + +" ============================================================================ +" Load Guard: ⟨⟨⟨1 +" ============================================================================ +if !GoldenView#zl#rc#load_guard( + \ expand(':t:r'), 700, 130, ['!&cp', "has('float')"]) + finish +endif + +let s:save_cpo = &cpo +set cpo&vim + + +" ============================================================================ +" Settings: ⟨⟨⟨1 +" ============================================================================ + +call GoldenView#zl#rc#set_default({ + \ 'g:goldenview__enable_at_startup' : 1 , + \ 'g:goldenview__enable_default_mapping' : 1 , + \ 'g:goldenview__active_profile' : 'default' , + \ 'g:goldenview__reset_profile' : 'reset' , + \ 'g:goldenview__ignore_urule' : { + \ 'filetype' : [ + \ '' , + \ 'qf' , 'vimpager', 'undotree', 'tagbar', + \ 'nerdtree', 'vimshell', 'vimfiler', 'voom' , + \ 'tabman' , 'unite' , 'quickrun', 'Decho' , + \ 'ControlP', 'diff' , 'extradite' + \ ], + \ 'buftype' : [ + \ 'nofile' , + \ ], + \ 'bufname' : [ + \ 'GoToFile' , 'diffpanel_\d\+' , + \ '__Gundo_Preview__' , '__Gundo__' , + \ '\[LustyExplorer-Buffers\]' , '\-MiniBufExplorer\-' , + \ '_VOOM\d\+$' , '__Urannotate_\d\+__' , + \ '__MRU_Files__' , 'FencView_\d\+$' + \ ], + \ }, + \ 'g:goldenview__restore_urule' : { + \ 'filetype' : [ + \ 'nerdtree', 'vimfiler', + \ ], + \ 'bufname' : [ + \ '__MRU_Files__' , + \ ], + \ }, + \ + \ }) + + + +" ============================================================================ +" Public Interface: ⟨⟨⟨1 +" ============================================================================ + + + +" Auto Resize: +" ------------ +command! -nargs=0 ToggleGoldenViewAutoResize +\ call GoldenView#ToggleAutoResize() + +command! -nargs=0 DisableGoldenViewAutoResize +\ call GoldenView#DisableAutoResize() + +command! -nargs=0 EnableGoldenViewAutoResize +\ call GoldenView#EnableAutoResize() + +nnoremap ToggleGoldenViewAutoResize +\ :ToggleGoldenViewAutoResize + + + +" Manual Resize: +" -------------- +command! -nargs=0 GoldenViewResize +\ call GoldenView#EnableAutoResize() +\|call GoldenView#DisableAutoResize() + +nnoremap GoldenViewResize +\ :GoldenViewResize + + + +" Layout Split: +" ------------- +nnoremap GoldenViewSplit +\ :call GoldenView#Split() +" [TODO]( define comfortable width &tw * 4/3) @zhaocai @start(2012-09-29 01:17) + + + +" Goto Window: +" ------------ +nnoremap GoldenViewNext +\ :call GoldenView#zl#window#next_window_or_tab() + +nnoremap GoldenViewPrevious +\ :call GoldenView#zl#window#previous_window_or_tab() + + + +" Switch Window: +" -------------- +nnoremap GoldenViewSwitchMain +\ :call GoldenView#SwitchMain() +command! -nargs=0 SwitchGoldenViewMain +\ call GoldenView#SwitchMain() + + +nnoremap GoldenViewSwitchToggle +\ :call GoldenView#zl#window#switch_buffer_toggle() +command! -nargs=0 SwitchGoldenViewToggle +\ call GoldenView#zl#window#switch_buffer_toggle() + + +nnoremap GoldenViewSwitchWithLargest +\ :call GoldenView#zl#window#switch_buffer_with_largest() +command! -nargs=0 SwitchGoldenViewLargest +\ call GoldenView#zl#window#switch_buffer_with_largest() + + +nnoremap GoldenViewSwitchWithSmallest +\ :call GoldenView#zl#window#switch_buffer_with_smallest() +command! -nargs=0 SwitchGoldenViewSmallest +\ call GoldenView#zl#window#switch_buffer_with_smallest() + + + + +" ============================================================================ +" Initialization: ⟨⟨⟨1 +" ============================================================================ +if g:goldenview__enable_at_startup == 1 + call GoldenView#EnableAutoResize() +endif + +if g:goldenview__enable_default_mapping == 1 + nmap GoldenViewNext + nmap GoldenViewPrevious + + nmap GoldenViewSwitchMain + nmap GoldenViewSwitchToggle + + nmap GoldenViewSplit +endif + + + + + + + + + +let &cpo = s:save_cpo +unlet s:save_cpo + +" ============================================================================ +" Modeline: ⟨⟨⟨1 +" ============================================================================ +" vim: set ft=vim ts=4 sw=4 tw=78 fdm=marker fmr=⟨⟨⟨,⟩⟩⟩ fdl=1 : + diff --git a/vim/plugins/GoldenView/plugin/zl/bootstrap.vim b/vim/plugins/GoldenView/plugin/zl/bootstrap.vim new file mode 100644 index 0000000..33694e8 --- /dev/null +++ b/vim/plugins/GoldenView/plugin/zl/bootstrap.vim @@ -0,0 +1,5 @@ +if !exists('g:GoldenView_zl_bundle_path') + let g:GoldenView_zl_bundle_path = fnamemodify(expand(""), ":p:h:h:h") + let g:GoldenView_zl_autoload_path = expand(g:GoldenView_zl_bundle_path . '/autoload/GoldenView/zl') +end + diff --git a/vim/plugins/auto-pairs/.gitignore b/vim/plugins/auto-pairs/.gitignore new file mode 100644 index 0000000..926ccaa --- /dev/null +++ b/vim/plugins/auto-pairs/.gitignore @@ -0,0 +1 @@ +doc/tags diff --git a/vim/plugins/auto-pairs/README.md b/vim/plugins/auto-pairs/README.md new file mode 100644 index 0000000..7cdcbf9 --- /dev/null +++ b/vim/plugins/auto-pairs/README.md @@ -0,0 +1,325 @@ +Auto Pairs +========== +Insert or delete brackets, parens, quotes in pair. + +Installation +------------ +copy plugin/auto-pairs.vim to ~/.vim/plugin + +or if you are using `pathogen`: + +```git clone git://github.com/jiangmiao/auto-pairs.git ~/.vim/bundle/auto-pairs``` + +Features +-------- +* Insert in pair + + input: [ + output: [|] + +* Delete in pair + + input: foo[] + output: foo + +* Insert new indented line after Return + + input: {|} (press at |) + output: { + | + } + +* Insert spaces before closing characters, only for [], (), {} + + input: {|} (press at |) + output: { | } + + input: {|} (press foo} at |) + output: { foo }| + + input: '|' (press at |) + output: ' |' + +* Skip ' when inside a word + + input: foo| (press ' at |) + output: foo' + +* Skip closed bracket. + + input: [] + output: [] + +* Ignore auto pair when previous character is \ + + input: "\' + output: "\'" + +* Fast Wrap + + input: |'hello' (press ( at |) + output: ('hello') + + wrap string, only support c style string + input: |'h\\el\'lo' (press ( at |) + output ('h\\ello\'') + + input: |[foo, bar()] (press ( at |) + output: ([foo, bar()]) + +* Quick move char to closed pair + + input: (|){["foo"]} (press at |) + output: ({["foo"]}|) + + input: |[foo, bar()] (press ( at |) + output: ([foo, bar()]|) + +* Quick jump to closed pair. + + input: + { + something;| + } + + (press } at |) + + output: + { + + }| + +* Support ``` ''' and """ + + input: + ''' + + output: + '''|''' + +* Delete Repeated Pairs in one time + + input: """|""" (press at |) + output: | + + input: {{|}} (press at |) + output: | + + input: [[[[[[|]]]]]] (press at |) + output: | + +* Fly Mode + + input: if(a[3) + output: if(a[3])| (In Fly Mode) + output: if(a[3)]) (Without Fly Mode) + + input: + { + hello();| + world(); + } + + (press } at |) + + output: + { + hello(); + world(); + }| + + (then press at | to do backinsert) + output: + { + hello();}| + world(); + } + + See Fly Mode section for details + +Fly Mode +-------- +Fly Mode will always force closed-pair jumping instead of inserting. only for ")", "}", "]" + +If jumps in mistake, could use AutoPairsBackInsert(Default Key: ``) to jump back and insert closed pair. + +the most situation maybe want to insert single closed pair in the string, eg ")" + +Fly Mode is DISABLED by default. + +add **let g:AutoPairsFlyMode = 1** .vimrc to turn it on + +Default Options: + + let g:AutoPairsFlyMode = 0 + let g:AutoPairsShortcutBackInsert = '' + +Shortcuts +--------- + + System Shortcuts: + : Insert new indented line after return if cursor in blank brackets or quotes. + : Delete brackets in pair + : Toggle Autopairs (g:AutoPairsShortcutToggle) + : Fast Wrap (g:AutoPairsShortcutFastWrap) + : Jump to next closed pair (g:AutoPairsShortcutJump) + : BackInsert (g:AutoPairsShortcutBackInsert) + + If or conflict with another keys or want to bind to another keys, add + + let g:AutoPairsShortcutToggle = '' + + to .vimrc, if the key is empty string '', then the shortcut will be disabled. + +Options +------- +* g:AutoPairs + + Default: {'(':')', '[':']', '{':'}',"'":"'",'"':'"', '`':'`'} + +* b:AutoPairs + + Default: g:AutoPairs + + Buffer level pairs set. + +* g:AutoPairsShortcutToggle + + Default: '' + + The shortcut to toggle autopairs. + +* g:AutoPairsShortcutFastWrap + + Default: '' + + Fast wrap the word. all pairs will be consider as a block (include <>). + (|)'hello' after fast wrap at |, the word will be ('hello') + (|) after fast wrap at |, the word will be () + +* g:AutoPairsShortcutJump + + Default: '' + + Jump to the next closed pair + +* g:AutoPairsMapBS + + Default : 1 + + Map to delete brackets, quotes in pair + execute 'inoremap =AutoPairsDelete()' + +* g:AutoPairsMapCh + + Default : 1 + + Map to delete brackets, quotes in pair + +* g:AutoPairsMapCR + + Default : 1 + + Map to insert a new indented line if cursor in (|), {|} [|], '|', "|" + execute 'inoremap =AutoPairsReturn()' + +* g:AutoPairsCenterLine + + Default : 1 + + When g:AutoPairsMapCR is on, center current line after return if the line is at the bottom 1/3 of the window. + +* g:AutoPairsMapSpace + + Default : 1 + + Map to insert a space after the opening character and before the closing one. + execute 'inoremap =AutoPairsSpace()' + +* g:AutoPairsFlyMode + + Default : 0 + + set it to 1 to enable FlyMode. + see FlyMode section for details. + +* g:AutoPairsMultilineClose + + Default : 1 + + When you press the key for the closing pair (e.g. `)`) it jumps past it. + If set to 1, then it'll jump to the next line, if there is only whitespace. + If set to 0, then it'll only jump to a closing pair on the same line. + +* g:AutoPairsShortcutBackInsert + + Default : + + Work with FlyMode, insert the key at the Fly Mode jumped postion + +* g:AutoPairsMoveCharacter + + Default: "()[]{}\"'" + + Map to + move character under the cursor to the pair. + +Buffer Level Pairs Setting +-------------------------- + +Set b:AutoPairs before BufEnter + +eg: + + " When the filetype is FILETYPE then make AutoPairs only match for parenthesis + au Filetype FILETYPE let b:AutoPairs = {"(": ")"} + +TroubleShooting +--------------- + The script will remap keys ([{'"}]) , + If auto pairs cannot work, use :imap ( to check if the map is corrected. + The correct map should be =AutoPairsInsert("\(") + Or the plugin conflict with some other plugins. + use command :call AutoPairsInit() to remap the keys. + + +* How to insert parens purely + + There are 3 ways + + 1. use Ctrl-V ) to insert paren without trigger the plugin. + + 2. use Alt-P to turn off the plugin. + + 3. use DEL or x to delete the character insert by plugin. + +* Swedish Character Conflict + + Because AutoPairs uses Meta(Alt) key as shortcut, it is conflict with some Swedish character such as å. + To fix the issue, you need remap or disable the related shortcut. + +Known Issues +----------------------- +Breaks '.' - [issue #3](https://github.com/jiangmiao/auto-pairs/issues/3) + + Description: After entering insert mode and inputing `[hello` then leave insert + mode by ``. press '.' will insert 'hello' instead of '[hello]'. + Reason: `[` actually equals `[]\` and \ will break '.'. + After version 7.4.849, Vim implements new keyword U to avoid the break + Solution: Update Vim to 7.4.849+ + +Contributors +------------ +* [camthompson](https://github.com/camthompson) + + +License +------- + +Copyright (C) 2011-2013 Miao Jiang + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vim/plugins/auto-pairs/doc/AutoPairs.txt b/vim/plugins/auto-pairs/doc/AutoPairs.txt new file mode 100644 index 0000000..49ff549 --- /dev/null +++ b/vim/plugins/auto-pairs/doc/AutoPairs.txt @@ -0,0 +1,356 @@ +*AutoPairs.txt* Insert or delete brackets, parens, quotes in pair + +Author: jiangmiao +License: MIT +URL: https://github.com/jiangmiao/auto-pairs + +============================================================================== +CONTENTS *autopairs-contents* + + 1. Installation ............................. |autopairs-installation| + 2. Features ..................................... |autopairs-features| + 3. Fly Mode ..................................... |autopairs-fly-mode| + 4. Shortcuts ................................... |autopairs-shortcuts| + 5. Options ....................................... |autopairs-options| + 6. Troubleshooting ...................... |autopairs-troubleshooting| + +============================================================================== +1. Introduction *autopairs-installation* + +Copy `plugin/auto-pairs.vim` to `~/.vim/plugin`. + +Or if you are using `pathogen`: > + + git clone git://github.com/jiangmiao/auto-pairs.git ~/.vim/bundle/auto-pairs + +============================================================================== +2. Features *autopairs-features* + +Insert in pair: > + + input: [ + output: [|] + +Delete in pair: > + + input: foo[] + output: foo + +Insert new indented line after Return: > + + input: {|} (press at |) + output: { + | + } + +Insert spaces before closing characters, only for [], (), {}: > + + input: {|} (press at |) + output: { | } + + input: {|} (press foo} at |) + output: { foo }| + + input: '|' (press at |) + output: ' |' + +Skip ' when inside a word: > + + input: foo| (press ' at |) + output: foo' + +Skip closed bracket: > + + input: [] + output: [] + +Ignore auto pair when previous character is '\': > + + input: "\' + output: "\'" + +Fast Wrap: > + + input: |'hello' (press ( at |) + output: ('hello') + + Wrap string, only support c style string. + input: |'h\\el\'lo' (press ( at |) + output ('h\\ello\'') + + input: |[foo, bar()] (press ( at |) + output: ([foo, bar()]) + +Quick jump to closed pair: > + + input: + { + something;| + } + + (press } at |) + + output: + { + + }| + +Support ```, ''' and """: > + + input: + ''' + + output: + '''|''' + +Delete Repeated Pairs in one time: > + + input: """|""" (press at |) + output: | + + input: {{|}} (press at |) + output: | + + input: [[[[[[|]]]]]] (press at |) + output: | + +Fly Mode (|autopairs-flymode|): > + + input: if(a[3) + output: if(a[3])| (In Fly Mode) + output: if(a[3)]) (Without Fly Mode) + + input: + { + hello();| + world(); + } + + (press } at |) + + output: + { + hello(); + world(); + }| + + (then press at | to do backinsert) + output: + { + hello();}| + world(); + } + + See |Fly Mode| section for details + +============================================================================== +3. Fly Mode *autopairs-flymode* + +Fly Mode will always force closed-pair jumping instead of inserting. Only for +")", "}", "]". If jumps in mistake, you can use |g:AutoPairsBackInsert| (default +Key: ) to jump back and insert closed pair. + +The most situation maybe you want to insert single closed pair in the string, +eg: > + + ")" + +Fly Mode is DISABLED by default. To enable Fly Mode add following to your +'.vimrc': > + + let g:AutoPairsFlyMode = 1 + +Default Options: > + + let g:AutoPairsFlyMode = 0 + let g:AutoPairsShortcutBackInsert = '' + +============================================================================== +4. Shortcuts *autopairs-shortcuts* + +System Shortcuts: + : Insert new indented line after return if cursor in blank brackets + or quotes. + : Delete brackets in pair + : Toggle Autopairs (|g:AutoPairsShortcutToggle|) + : Fast Wrap (|g:AutoPairsShortcutFastWrap|) + : Jump to next closed pair (|g:AutoPairsShortcutJump|) + : BackInsert (|g:AutoPairsShortcutBackInsert|) + + + To rebind keys , or or in case of conflicts conflicts with + another keys: + + let g:AutoPairsShortcutToggle = '' + + If the key is empty string '', then the shortcut will be disabled. + +============================================================================== +5. Options *autopairs-options* + + *g:AutoPairs* +|g:AutoPairs| dict + +Default: > + {'(':')', '[':']', '{':'}',"'":"'",'"':'"', '`':'`'} + +Specifies which symbols should be automatically paired. + +To append new pairs without overwriting defaults, add values in your `.vimrc`.: + + let g:AutoPairs['<']='>' + +This example will enable matching of `<` with `>`. + + + *b:AutoPairs* +|b:AutoPairs| dict + +Default: |g:AutoPairs| + +Buffer level pairs set. + +You can set |b:AutoPairs| before |BufEnter|: > + + au Filetype FILETYPE let b:AutoPairs = {"(": ")"} + +This sets |AutoPairs| to only match for parenthesis for 'FILETYPE'. + + + + *g:AutoPairsShortcutToggle* +|g:AutoPairsShortcutToggle| string + +Default: + +The shortcut to toggle autopairs. + + + + *g:AutoPairsShortcutFastWrap* +|g:AutoPairsShortcutFastWrap| string + +Default: + +Fast wrap the word. All pairs will be considered as a block (including <>). + + (|)'hello' after fast wrap at |, the word will be ('hello') + (|) after fast wrap at |, the word will be () + + + + *g:AutoPairsShortcutJump* +|g:AutoPairsShortcutJump| string + +Default: + +Jump to the next closed pair. + + + *g:AutoPairsShortcutBackInsert* +|g:AutoPairsShortcutBackInsert| string + +Default: + +Work with |autopairs-flymode|, insert the key at the Fly Mode jumped position. + + + + *g:AutoPairsMapBS* +|g:AutoPairsMapBS| int + +Default: 1 + +Map to delete brackets and quotes in pair, executes: + + inoremap =AutoPairsDelete() + + + *g:AutoPairsMapCh* +|g:AutoPairsMapCh| int + +Default: 1 + +Map to delete brackets and quotes in pair. + + + *g:AutoPairsMapCR* +|g:AutoPairsMapCR| int + +Default: 1 + +Map to insert a new indented line if cursor in (|), {|} [|], '|', "|". +Executes: + + inoremap =AutoPairsReturn() + + + *g:AutoPairsCenterLine* +|g:AutoPairsCenterLine| int + +Default: 1 + +When |g:AutoPairsMapCR| is on, center current line after return if the line +is at the bottom 1/3 of the window. + + + *g:AutoPairsMapSpace* +|g:AutoPairsMapSpace| int + +Default: 1 + +Map to insert a space after the opening character and before the +closing one. + +Executes: + + inoremap =AutoPairsSpace() + + + *g:AutoPairsFlyMode* +|g:AutoPairsFlyMode| int + +Default: 0 + +Set it to 1 to enable |autopairs-flymode|. + + + *g:AutoPairsMultilineClose* +|g:AutoPairsMultilineClose| int + +Default: 1 + +When you press the key for the closing pair (e.g. `)`) it jumps past it. +If set to 1, then it'll jump to the next line, if there is only 'whitespace'. +If set to 0, then it'll only jump to a closing pair on the same line. + +============================================================================== +6. Troubleshooting *autopairs-troubleshooting* + +This plugin remaps keys `([{'"}]) ` + +If auto pairs cannot work, use |:imap| to check if the map is corrected. + +The correct map should be: > + + =AutoPairsInsert("\(") + +Or the plugin conflicts with some other plugins. Use command: > + + :call AutoPairsInit() to remap the keys. + +--- How to insert parens purely? --- + +There are 3 ways: + + 1. Use Ctrl-V ) to insert paren without trigger the plugin. + + 2. Use Alt-P to turn off the plugin. + + 3. Use DEL or x to delete the character insert by plugin. + +--- Swedish Character Conflict --- + +Because AutoPairs uses Meta(Alt) key as a shortcut, it conflicts with some +Swedish character such as å. To fix the issue, you need remap or disable the +related shortcut. diff --git a/vim/plugins/auto-pairs/plugin/auto-pairs.vim b/vim/plugins/auto-pairs/plugin/auto-pairs.vim new file mode 100644 index 0000000..b2a9af7 --- /dev/null +++ b/vim/plugins/auto-pairs/plugin/auto-pairs.vim @@ -0,0 +1,582 @@ +" Insert or delete brackets, parens, quotes in pairs. +" Maintainer: JiangMiao +" Contributor: camthompson +" Last Change: 2017-06-17 +" Version: 1.3.3 +" Homepage: http://www.vim.org/scripts/script.php?script_id=3599 +" Repository: https://github.com/jiangmiao/auto-pairs +" License: MIT + +if exists('g:AutoPairsLoaded') || &cp + finish +end +let g:AutoPairsLoaded = 1 + +if !exists('g:AutoPairs') + let g:AutoPairs = {'(':')', '[':']', '{':'}',"'":"'",'"':'"', '`':'`'} +end + +if !exists('g:AutoPairsParens') + let g:AutoPairsParens = {'(':')', '[':']', '{':'}'} +end + +if !exists('g:AutoPairsMapBS') + let g:AutoPairsMapBS = 1 +end + +" Map as the same BS +if !exists('g:AutoPairsMapCh') + let g:AutoPairsMapCh = 1 +end + +if !exists('g:AutoPairsMapCR') + let g:AutoPairsMapCR = 1 +end + +if !exists('g:AutoPairsMapSpace') + let g:AutoPairsMapSpace = 1 +end + +if !exists('g:AutoPairsCenterLine') + let g:AutoPairsCenterLine = 1 +end + +if !exists('g:AutoPairsShortcutToggle') + let g:AutoPairsShortcutToggle = '' +end + +if !exists('g:AutoPairsShortcutFastWrap') + let g:AutoPairsShortcutFastWrap = '' +end + +if !exists('g:AutoPairsMoveCharacter') + let g:AutoPairsMoveCharacter = "()[]{}\"'" +end + +if !exists('g:AutoPairsShortcutJump') + let g:AutoPairsShortcutJump = '' +endif + +" Fly mode will for closed pair to jump to closed pair instead of insert. +" also support AutoPairsBackInsert to insert pairs where jumped. +if !exists('g:AutoPairsFlyMode') + let g:AutoPairsFlyMode = 0 +endif + +" When skipping the closed pair, look at the current and +" next line as well. +if !exists('g:AutoPairsMultilineClose') + let g:AutoPairsMultilineClose = 1 +endif + +" Work with Fly Mode, insert pair where jumped +if !exists('g:AutoPairsShortcutBackInsert') + let g:AutoPairsShortcutBackInsert = '' +endif + +if !exists('g:AutoPairsSmartQuotes') + let g:AutoPairsSmartQuotes = 1 +endif + +" 7.4.849 support U to avoid breaking '.' +" Issue talk: https://github.com/jiangmiao/auto-pairs/issues/3 +" Vim note: https://github.com/vim/vim/releases/tag/v7.4.849 +if v:version > 704 || v:version == 704 && has("patch849") + let s:Go = "\U" +else + let s:Go = "" +endif + +let s:Left = s:Go."\" +let s:Right = s:Go."\" + + +" Will auto generated {']' => '[', ..., '}' => '{'}in initialize. +let g:AutoPairsClosedPairs = {} + + +function! AutoPairsInsert(key) + if !b:autopairs_enabled + return a:key + end + + let line = getline('.') + let pos = col('.') - 1 + let before = strpart(line, 0, pos) + let after = strpart(line, pos) + let next_chars = split(after, '\zs') + let current_char = get(next_chars, 0, '') + let next_char = get(next_chars, 1, '') + let prev_chars = split(before, '\zs') + let prev_char = get(prev_chars, -1, '') + + let eol = 0 + if col('$') - col('.') <= 1 + let eol = 1 + end + + " Ignore auto close if prev character is \ + if prev_char == '\' + return a:key + end + + " The key is difference open-pair, then it means only for ) ] } by default + if !has_key(b:AutoPairs, a:key) + let b:autopairs_saved_pair = [a:key, getpos('.')] + + " Skip the character if current character is the same as input + if current_char == a:key + return s:Right + end + + if !g:AutoPairsFlyMode + " Skip the character if next character is space + if current_char == ' ' && next_char == a:key + return s:Right.s:Right + end + + " Skip the character if closed pair is next character + if current_char == '' + if g:AutoPairsMultilineClose + let next_lineno = line('.')+1 + let next_line = getline(nextnonblank(next_lineno)) + let next_char = matchstr(next_line, '\s*\zs.') + else + let next_char = matchstr(line, '\s*\zs.') + end + if next_char == a:key + return "\e^a" + endif + endif + endif + + " Fly Mode, and the key is closed-pairs, search closed-pair and jump + if g:AutoPairsFlyMode && has_key(b:AutoPairsClosedPairs, a:key) + let n = stridx(after, a:key) + if n != -1 + return repeat(s:Right, n+1) + end + if search(a:key, 'W') + " force break the '.' when jump to different line + return "\" + endif + endif + + " Insert directly if the key is not an open key + return a:key + end + + let open = a:key + let close = b:AutoPairs[open] + + if current_char == close && open == close + return s:Right + end + + " Ignore auto close ' if follows a word + " MUST after closed check. 'hello|' + if a:key == "'" && prev_char =~ '\v\w' + return a:key + end + + " support for ''' ``` and """ + if open == close + " The key must be ' " ` + let pprev_char = line[col('.')-3] + if pprev_char == open && prev_char == open + " Double pair found + return repeat(a:key, 4) . repeat(s:Left, 3) + end + end + + let quotes_num = 0 + " Ignore comment line for vim file + if &filetype == 'vim' && a:key == '"' + if before =~ '^\s*$' + return a:key + end + if before =~ '^\s*"' + let quotes_num = -1 + end + end + + " Keep quote number is odd. + " Because quotes should be matched in the same line in most of situation + if g:AutoPairsSmartQuotes && open == close + " Remove \\ \" \' + let cleaned_line = substitute(line, '\v(\\.)', '', 'g') + let n = quotes_num + let pos = 0 + while 1 + let pos = stridx(cleaned_line, open, pos) + if pos == -1 + break + end + let n = n + 1 + let pos = pos + 1 + endwhile + if n % 2 == 1 + return a:key + endif + endif + + return open.close.s:Left +endfunction + +function! AutoPairsDelete() + if !b:autopairs_enabled + return "\" + end + + let line = getline('.') + let pos = col('.') - 1 + let current_char = get(split(strpart(line, pos), '\zs'), 0, '') + let prev_chars = split(strpart(line, 0, pos), '\zs') + let prev_char = get(prev_chars, -1, '') + let pprev_char = get(prev_chars, -2, '') + + if pprev_char == '\' + return "\" + end + + " Delete last two spaces in parens, work with MapSpace + if has_key(b:AutoPairs, pprev_char) && prev_char == ' ' && current_char == ' ' + return "\\" + endif + + " Delete Repeated Pair eg: '''|''' [[|]] {{|}} + if has_key(b:AutoPairs, prev_char) + let times = 0 + let p = -1 + while get(prev_chars, p, '') == prev_char + let p = p - 1 + let times = times + 1 + endwhile + + let close = b:AutoPairs[prev_char] + let left = repeat(prev_char, times) + let right = repeat(close, times) + + let before = strpart(line, pos-times, times) + let after = strpart(line, pos, times) + if left == before && right == after + return repeat("\\", times) + end + end + + + if has_key(b:AutoPairs, prev_char) + let close = b:AutoPairs[prev_char] + if match(line,'^\s*'.close, col('.')-1) != -1 + " Delete (|___) + let space = matchstr(line, '^\s*', col('.')-1) + return "\". repeat("\", len(space)+1) + elseif match(line, '^\s*$', col('.')-1) != -1 + " Delete (|__\n___) + let nline = getline(line('.')+1) + if nline =~ '^\s*'.close + if &filetype == 'vim' && prev_char == '"' + " Keep next line's comment + return "\" + end + + let space = matchstr(nline, '^\s*') + return "\\". repeat("\", len(space)+1) + end + end + end + + return "\" +endfunction + +function! AutoPairsJump() + call search('["\]'')}]','W') +endfunction +" string_chunk cannot use standalone +let s:string_chunk = '\v%(\\\_.|[^\1]|[\r\n]){-}' +let s:ss_pattern = '\v''' . s:string_chunk . '''' +let s:ds_pattern = '\v"' . s:string_chunk . '"' + +func! s:RegexpQuote(str) + return substitute(a:str, '\v[\[\{\(\<\>\)\}\]]', '\\&', 'g') +endf + +func! s:RegexpQuoteInSquare(str) + return substitute(a:str, '\v[\[\]]', '\\&', 'g') +endf + +" Search next open or close pair +func! s:FormatChunk(open, close) + let open = s:RegexpQuote(a:open) + let close = s:RegexpQuote(a:close) + let open2 = s:RegexpQuoteInSquare(a:open) + let close2 = s:RegexpQuoteInSquare(a:close) + if open == close + return '\v'.open.s:string_chunk.close + else + return '\v%(' . s:ss_pattern . '|' . s:ds_pattern . '|' . '[^'.open2.close2.']|[\r\n]' . '){-}(['.open2.close2.'])' + end +endf + +" Fast wrap the word in brackets +function! AutoPairsFastWrap() + let line = getline('.') + let current_char = line[col('.')-1] + let next_char = line[col('.')] + let open_pair_pattern = '\v[({\[''"]' + let at_end = col('.') >= col('$') - 1 + normal! x + " Skip blank + if next_char =~ '\v\s' || at_end + call search('\v\S', 'W') + let line = getline('.') + let next_char = line[col('.')-1] + end + + if has_key(b:AutoPairs, next_char) + let followed_open_pair = next_char + let inputed_close_pair = current_char + let followed_close_pair = b:AutoPairs[next_char] + if followed_close_pair != followed_open_pair + " TODO replace system searchpair to skip string and nested pair. + " eg: (|){"hello}world"} will transform to ({"hello})world"} + call searchpair('\V'.followed_open_pair, '', '\V'.followed_close_pair, 'W') + else + call search(s:FormatChunk(followed_open_pair, followed_close_pair), 'We') + end + return s:Right.inputed_close_pair.s:Left + else + normal! he + return s:Right.current_char.s:Left + end +endfunction + +function! AutoPairsMap(key) + " | is special key which separate map command from text + let key = a:key + if key == '|' + let key = '' + end + let escaped_key = substitute(key, "'", "''", 'g') + " use expr will cause search() doesn't work + execute 'inoremap '.key." =AutoPairsInsert('".escaped_key."')" + +endfunction + +function! AutoPairsToggle() + if b:autopairs_enabled + let b:autopairs_enabled = 0 + echo 'AutoPairs Disabled.' + else + let b:autopairs_enabled = 1 + echo 'AutoPairs Enabled.' + end + return '' +endfunction + +function! AutoPairsMoveCharacter(key) + let c = getline(".")[col(".")-1] + let escaped_key = substitute(a:key, "'", "''", 'g') + return "\\:call search("."'".escaped_key."'".")\a".c."\" +endfunction + +function! AutoPairsReturn() + if b:autopairs_enabled == 0 + return '' + end + let line = getline('.') + let pline = getline(line('.')-1) + let prev_char = pline[strlen(pline)-1] + let cmd = '' + let cur_char = line[col('.')-1] + if has_key(b:AutoPairs, prev_char) && b:AutoPairs[prev_char] == cur_char + if g:AutoPairsCenterLine && winline() * 3 >= winheight(0) * 2 + " Recenter before adding new line to avoid replacing line content + let cmd = "zz" + end + + " If equalprg has been set, then avoid call = + " https://github.com/jiangmiao/auto-pairs/issues/24 + if &equalprg != '' + return "\".cmd."O" + endif + + " conflict with javascript and coffee + " javascript need indent new line + " coffeescript forbid indent new line + if &filetype == 'coffeescript' || &filetype == 'coffee' + return "\".cmd."k==o" + else + return "\".cmd."=ko" + endif + end + return '' +endfunction + +function! AutoPairsSpace() + let line = getline('.') + let prev_char = line[col('.')-2] + let cmd = '' + let cur_char =line[col('.')-1] + if has_key(g:AutoPairsParens, prev_char) && g:AutoPairsParens[prev_char] == cur_char + let cmd = "\".s:Left + endif + return "\".cmd +endfunction + +function! AutoPairsBackInsert() + if exists('b:autopairs_saved_pair') + let pair = b:autopairs_saved_pair[0] + let pos = b:autopairs_saved_pair[1] + call setpos('.', pos) + return pair + endif + return '' +endfunction + +function! AutoPairsInit() + let b:autopairs_loaded = 1 + if !exists('b:autopairs_enabled') + let b:autopairs_enabled = 1 + end + let b:AutoPairsClosedPairs = {} + + if !exists('b:AutoPairs') + let b:AutoPairs = g:AutoPairs + end + + if !exists('b:AutoPairsMoveCharacter') + let b:AutoPairsMoveCharacter = g:AutoPairsMoveCharacter + end + + " buffer level map pairs keys + for [open, close] in items(b:AutoPairs) + call AutoPairsMap(open) + if open != close + call AutoPairsMap(close) + end + let b:AutoPairsClosedPairs[close] = open + endfor + + for key in split(b:AutoPairsMoveCharacter, '\s*') + let escaped_key = substitute(key, "'", "''", 'g') + execute 'inoremap =AutoPairsMoveCharacter('".escaped_key."')" + endfor + + " Still use level mapping for + if g:AutoPairsMapBS + " Use instead of for issue #14 sometimes press BS output strange words + execute 'inoremap =AutoPairsDelete()' + end + + if g:AutoPairsMapCh + execute 'inoremap =AutoPairsDelete()' + endif + + if g:AutoPairsMapSpace + " Try to respect abbreviations on a + let do_abbrev = "" + if v:version == 703 && has("patch489") || v:version > 703 + let do_abbrev = "" + endif + execute 'inoremap '.do_abbrev.'=AutoPairsSpace()' + end + + if g:AutoPairsShortcutFastWrap != '' + execute 'inoremap '.g:AutoPairsShortcutFastWrap.' =AutoPairsFastWrap()' + end + + if g:AutoPairsShortcutBackInsert != '' + execute 'inoremap '.g:AutoPairsShortcutBackInsert.' =AutoPairsBackInsert()' + end + + if g:AutoPairsShortcutToggle != '' + " use to ensure showing the status when toggle + execute 'inoremap '.g:AutoPairsShortcutToggle.' AutoPairsToggle()' + execute 'noremap '.g:AutoPairsShortcutToggle.' :call AutoPairsToggle()' + end + + if g:AutoPairsShortcutJump != '' + execute 'inoremap ' . g:AutoPairsShortcutJump. ' :call AutoPairsJump()a' + execute 'noremap ' . g:AutoPairsShortcutJump. ' :call AutoPairsJump()' + end + +endfunction + +function! s:ExpandMap(map) + let map = a:map + let map = substitute(map, '\(\w\+\)', '\=maparg(submatch(1), "i")', 'g') + return map +endfunction + +function! AutoPairsTryInit() + if exists('b:autopairs_loaded') + return + end + + " for auto-pairs starts with 'a', so the priority is higher than supertab and vim-endwise + " + " vim-endwise doesn't support AutoPairsReturn + " when use AutoPairsReturn will cause isn't expanded + " + " supertab doesn't support AutoPairsReturn + " when use AutoPairsReturn will cause Duplicated + " + " and when load after vim-endwise will cause unexpected endwise inserted. + " so always load AutoPairs at last + + " Buffer level keys mapping + " comptible with other plugin + if g:AutoPairsMapCR + if v:version == 703 && has('patch32') || v:version > 703 + " VIM 7.3 supports advancer maparg which could get info + " then auto-pairs could remap in any case. + let info = maparg('', 'i', 0, 1) + if empty(info) + let old_cr = '' + let is_expr = 0 + else + let old_cr = info['rhs'] + let old_cr = s:ExpandMap(old_cr) + let old_cr = substitute(old_cr, '', '' . info['sid'] . '_', 'g') + let is_expr = info['expr'] + let wrapper_name = 'AutoPairsOldCRWrapper73' + endif + else + " VIM version less than 7.3 + " the mapping's info is lost, so guess it is expr or not, it's + " not accurate. + let old_cr = maparg('', 'i') + if old_cr == '' + let old_cr = '' + let is_expr = 0 + else + let old_cr = s:ExpandMap(old_cr) + " old_cr contain (, I guess the old cr is in expr mode + let is_expr = old_cr =~ '\V(' && toupper(old_cr) !~ '\V' + + " The old_cr start with " it must be in expr mode + let is_expr = is_expr || old_cr =~ '\v^"' + let wrapper_name = 'AutoPairsOldCRWrapper' + end + end + + if old_cr !~ 'AutoPairsReturn' + if is_expr + " remap to `name` to avoid mix expr and non-expr mode + execute 'inoremap ', '', 'g') + let res = '' + let max = 0 + let mx = '\(]\{-}>\)\|\(<\/td>\)\|\(]\{-}>\)\|\(<\/div>\)' + let m = split(buf, mx) + for str in m + let c = split(str, '<[^>]*?>') + let str = substitute(str, '<[^>]\{-}>', ' ', 'g') + let str = substitute(str, '>', '>', 'g') + let str = substitute(str, '<', '<', 'g') + let str = substitute(str, '"', '"', 'g') + let str = substitute(str, ''', '''', 'g') + let str = substitute(str, ' ', ' ', 'g') + let str = substitute(str, '¥', '\¥', 'g') + let str = substitute(str, '&', '\&', 'g') + let str = substitute(str, '^\s*\(.*\)\s*$', '\1', '') + let str = substitute(str, '\s\+', ' ', 'g') + let l = len(str) + if l > threshold_len + let per = (l+0.0) / len(c) + if max < l && per > threshold_per + let max = l + let res = str + endif + endif + endfor + let res = substitute(res, '^\s*\(.*\)\s*$', '\1', 'g') + return res +endfunction + +function! emmet#util#getImageSize(fn) abort + let fn = a:fn + + if emmet#util#isImageMagickInstalled() + return emmet#util#imageSizeWithImageMagick(fn) + endif + + if filereadable(fn) + let hex = substitute(system('xxd -p "'.fn.'"'), '\n', '', 'g') + else + if fn !~# '^\w\+://' + let path = fnamemodify(expand('%'), ':p:gs?\\?/?') + if has('win32') || has('win64') | + let path = tolower(path) + endif + for k in keys(g:emmet_docroot) + let root = fnamemodify(k, ':p:gs?\\?/?') + if has('win32') || has('win64') | + let root = tolower(root) + endif + if stridx(path, root) == 0 + let v = g:emmet_docroot[k] + let fn = (len(v) == 0 ? k : v) . fn + break + endif + endfor + endif + let hex = substitute(system(g:emmet_curl_command.' "'.fn.'" | xxd -p'), '\n', '', 'g') + endif + + let [width, height] = [-1, -1] + if hex =~# '^89504e470d0a1a0a' + let width = eval('0x'.hex[32:39]) + let height = eval('0x'.hex[40:47]) + endif + if hex =~# '^ffd8' + let pos = 4 + while pos < len(hex) + let bs = hex[pos+0:pos+3] + let pos += 4 + if bs ==# 'ffc0' || bs ==# 'ffc2' + let pos += 6 + let height = eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3]) + let pos += 4 + let width = eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3]) + break + elseif bs =~# 'ffd[9a]' + break + elseif bs =~# 'ff\(e[0-9a-e]\|fe\|db\|dd\|c4\)' + let pos += (eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3])) * 2 + endif + endwhile + endif + if hex =~# '^47494638' + let width = eval('0x'.hex[14:15].hex[12:13]) + let height = eval('0x'.hex[18:19].hex[16:17]) + endif + + return [width, height] +endfunction + +function! emmet#util#imageSizeWithImageMagick(fn) abort + let img_info = system('identify -format "%wx%h" "'.a:fn.'"') + let img_size = split(substitute(img_info, '\n', '', ''), 'x') + if len(img_size) != 2 + return [-1, -1] + endif + return img_size +endfunction + +function! emmet#util#isImageMagickInstalled() abort + if !get(g:, 'emmet_use_identify', 1) + return 0 + endif + return executable('identify') +endfunction + +function! emmet#util#unique(arr) abort + let m = {} + let r = [] + for i in a:arr + if !has_key(m, i) + let m[i] = 1 + call add(r, i) + endif + endfor + return r +endfunction + +let s:seed = localtime() +function! emmet#util#srand(seed) abort + let s:seed = a:seed +endfunction + +function! emmet#util#rand() abort + let s:seed = s:seed * 214013 + 2531011 + return (s:seed < 0 ? s:seed - 0x80000000 : s:seed) / 0x10000 % 0x8000 +endfunction + +function! emmet#util#cache(name, ...) abort + let content = get(a:000, 0, '') + let dir = expand('~/.emmet/cache') + if !isdirectory(dir) + call mkdir(dir, 'p', 0700) + endif + let file = dir . '/' . substitute(a:name, '\W', '_', 'g') + if len(content) == 0 + if !filereadable(file) + return '' + endif + return join(readfile(file), "\n") + endif + call writefile(split(content, "\n"), file) +endfunction + +function! emmet#util#getcurpos() abort + let pos = getpos('.') + if mode(0) ==# 'i' && pos[2] > 0 + let pos[2] -=1 + endif + return pos +endfunction + +function! emmet#util#closePopup() abort + return pumvisible() ? "\" : '' +endfunction diff --git a/vim/plugins/emmet-vim/doc/emmet.txt b/vim/plugins/emmet-vim/doc/emmet.txt new file mode 100644 index 0000000..ffa5e0a --- /dev/null +++ b/vim/plugins/emmet-vim/doc/emmet.txt @@ -0,0 +1,1773 @@ +*emmet.txt* *Emmet* for Vim + + ------------------------------------------------------- + Emmet: vim plugins for HTML and CSS hi-speed coding + ------------------------------------------------------- + +Author: Yasuhiro Matsumoto +WebSite: http://mattn.kaoriya.net/ +Repository: https://github.com/mattn/emmet-vim +Site: https://mattn.github.com/emmet-vim +License: BSD style license + +============================================================================== +CONTENTS *emmet-contents* + +Introduction |emmet-introduction| +Install |emmet-install| +Tutorial |emmet-tutorial| + 1. Expand abbreviation |emmet-expand-abbr| |,| + 2. Expand word |emmet-expand-word| |;| + 3. Update tag |emmet-update-tag| |u| + 4. Wrap with abbreviation |emmet-wrap-with-abbreviation| |v_,| + 5. Balance tag inward |emmet-balance-tag-inward| |d| + 6. Balance tag outward |emmet-balance-tag-outward| |D| + 7. Go to next edit point |emmet-goto-next-point| |n| + 8. Go to previous edit point |emmet-goto-previous-point| |N| + 9. Add and update size |emmet-update-image-size| |i| + 10. Merge lines |emmet-merge-lines| |m| + 11. Remove tag |emmet-remove-tag| |k| + 12. Split/join tag |emmet-split-join-tag| |j| + 13. Toggle comment |emmet-toggle-comment| |/| + 14. Make anchor from URL |emmet-make-anchor-url| |a| + 15. Make quoted text from URL |emmet-quoted-text-url| |A| + 16. Code pretty |emmet-code-pretty| |c| + 17. Lorem ipsum |emmet-lorem-ipsum| +HTML expression syntax |emmet-html-expression-syntax| + 1. Elements |emmet-html-syntax-elements| + 2. Nesting operators |emmet-html-syntax-nesting-operators| + 2.1. Child |emmet->| + 2.2. Sibling |emmet-+| + 2.3. Climb-up |emmet-^| + 2.4. Multiplication |emmet-star| + 2.5. Grouping |emmet-()| + 3. Attribute operators |emmet-html-syntax-attribute-operators| + 3.1. ID and CLASS |emmet-.| |emmet-#| + 3.2. Custom attributes |emmet-[]| + 3.3. Item numbering |emmet-$| + 3.3.1. Changing numbering origin and direction |emmet-@| + 3.4. Quote character |emmet-html-attr-quote-char| + 4. Text |emmet-{}| + 5. Implicit tag names |emmet-html-implicit-tag-names| + 6. Notes on abbreviation formatting |emmet-html-syntax-notes| + 7. Choose position to insert text when wrap abbreviation |emmet-$#| +CSS expression syntax |emmet-css-expression-syntax| + 1. Properties |emmet-css-properties| + 2. Values |emmet-css-values| + 3. Units |emmet-css-units| + 4. Vendor prefixes |emmet-css-vendor-prefixes| +Commands |emmet-commands| + :Emmet |:Emmet| + :EmmetInstall |:EmmetInstall| +Variables |emmet-variables| + g:emmet_html5 |g:emmet_html5| + g:emmet_docroot |g:emmet_docroot| + g:emmet_curl_command |g:emmet_curl_command| + g:user_emmet_complete_tag |g:user_emmet_complete_tag| + g:user_emmet_leader_key |g:user_emmet_leader_key| + g:user_emmet_install_global |g:user_emmet_install_global| + g:user_emmet_install_command |g:user_emmet_install_command| + g:user_emmet_settings |g:user_emmet_settings| + g:user_emmet_mode |g:user_emmet_mode| +Customize |emmet-customize| + 1. Key mappings |emmet-customize-key-mappings| + 2. Indent size |emmet-indent-size| + 3. Define tag's behavior |emmet-define-tags-behavior| + 4. Adding custom snippets |emmet-custom-snippets| +Filters |emmet-filters-list| + Escapes XML-unsafe characters |emmet-filter-e| + Add comments around 'important tags' |emmet-filter-c| + Outputs as a single line |emmet-filter-s| + Trim list markers |emmet-filter-t| +Links |emmet-links| +ToDo |emmet-todo| + +============================================================================== +INTRODUCTION *emmet-introduction* *emmet* + +Emmet is an editor plugin for high-speed HTML, XML, XSL (or any other +structured code format) coding and editing. The core of this plugin is a +powerful abbreviation engine which allows you to expand expressions, +similar to CSS selectors, into HTML code: +> + div#page>div.logo+ul#navigation>li*5>a +< +can be expanded into: +> +
+ + +
+< +Read more about current Emmet syntax + |emmet-html-expression-syntax| + |emmet-css-expression-syntax| + http://docs.emmet.io/abbreviations/ + +Abbreviation engine has a modular structure which allows you +to expand abbreviations into different languages. +Emmet currently supports CSS, HTML, XML/XSL and HAML, Slim languages +via filters (see |emmet-filter|). + +============================================================================== +INSTALL *emmet-install* + +Install the distributed files into Vim runtime directory which is usually +'~/.vim/', or '$HOME/vimfiles' on Windows. + +If you install pathogen (https://github.com/tpope/vim-pathogen) +that provided by Tim Pope, you should extract the +file into 'bundle' directory. + +============================================================================== +TUTORIAL *emmet-tutorial* + +If you are seeing this file as :help, then you can't edit this file. +You should copy this section and create new buffer, paste and write as +'emmet-tutor.txt'. Formally, open the file to start tutorial. + +1. Expand abbreviation *emmet-expand-abbr* *,* + + Type abbreviation as 'div>p#foo$*3>a' and type ','. +> +
+

+ +

+

+ +

+

+ +

+
+< +2. Expand abbreviation *emmet-expand-word* *;* + + When you want to expand word except html tokens like below, use this. +> + foo +< + This will be expanded like: +> + + +3. Update tag *emmet-update-tag* *u* + + The begining of tags '
' on below +> +
foo
+< + Type 'u' request 'Enter Abbreviation:'. Then type +> + .global +< + This will be expanded like: +> +
foo
+< +4. Wrap with abbreviation *emmet-wrap-with-abbreviation* *v_,* + + Write as below. +> + test1 + test2 + test3 +< + Then do visual select (line wise) and type ','. + If you request 'Tag:', then type +> + ul>li* +< + Result: +> +
    +
  • test1
  • +
  • test2
  • +
  • test3
  • +
+< + If you type tag name, for example +> + blockquote +< + then you'll see as following: +> +
+ test1 + test2 + test3 +
+< + See also: |emmet-filter-t|, |emmet-$#| + +5. Balance tag inward *emmet-balance-tag-inward* *d* + + To select inward of '
    ' tag, type 'd' in insert mode. +> +
      + *
    • +
    • +
    • +
    +< + If cursor is at '*', 'd' select from begin of '
      ' to end of '
    '. + If cursor is at first of '
  • ', it select '
  • '. + +6. Balance tag outward *emmet-balance-tag-outward* *D* + + To select outward of '
      ' tag type 'D' in insert mode. +> +
        + *
      • +
      • +
      • +
      +< + If cursor is at '*', 'D' select from next letter of '
        ' + to previous letter of '
      '. + If cursor is at first of '
    • ', it select '
    • '. + +7. Go to next edit point *emmet-goto-next-point* *n* + + To jump next point that need to edit, type 'n' in insert mode. +> + *
      foo
      +
      +< + If cursor is at '*', type 'n' to move a cursor + into attribute value of '
      ' specified id as 'foo'. + And type again 'n' to move a cursor + into inner of '
      ' specified id as 'bar'. + +8. Go to previous edit point *emmet-goto-previous-point* *N* + + To jump previous point that need to edit, type 'N' in insert mode. +> +
      foo
      +
      * +< + If cursor is at '*', type 'N' to move a cursor + into '
      ' specified id as 'bar'. + And type again 'N' to move a cursor + into attribute value of 'foo'. + +9. Add and update size *emmet-update-image-size* *i* + + To add or update 'width' and 'height' attributes of image, + type 'i' on '' tag +> + +< + Type 'i' on '' tag +> + +< + If you change image, then type it again. it will be following. +> + +< + Image size retrieved using 'identify' (ImageMagick.org) (if available) + or |xxd|. + +10. Merge lines *emmet-merge-lines* *m* + + To join multi line text like following, type |J|. +> +
        +
      • +
      • +
      • +
      +< + If you select part of line include '
    • ' and type |m|, + it will be following. +> +
        +
      • +
      +< +11. Remove tag *emmet-remove-tag* *k* + + To remove tag in the block, type 'k'. +> + +< + Type 'k' in insert mode, then +> +
      + +
      +< + And type 'k' in there again, then '
      ' will be removed. + +12. Split/join tag *emmet-split-join-tag* *j* + + To join block, type 'j'. +> +
      + cursor is here +
      +< + Type 'j' in insert mode. Then, +> +
      +< + And type 'j' in there again. +> +
      +
      +< +13. Toggle comment *emmet-toggle-comment* */* + + Move cursor to block +> +
      + hello world +
      +< + Type '/' in insert mode. +> + +< + Type '/' in there again. +> +
      + hello world +
      +< +14. Make anchor from URL *emmet-make-anchor-url* *a* + + Move cursor to URL +> + http://www.google.com/ +< + Type 'a' +> + Google +< + Text retrieved using command, specified by |g:emmet_curl_command|. + +15. Make quoted text from URL *emmet-quoted-text-url* *A* + + Move cursor to URL +> + https://github.com/ +< + Type 'A' +> +
      + Secure source code hosting and collaborative development - GitHub
      +

      How does it work? Get up and running in seconds by forking a project, pushing an existing repository...

      + https://github.com/ +
      +< + Text retrieved using command, specified by |g:emmet_curl_command|. + +16. Code pretty *emmet-code-pretty* *c* + + Select code block, for example select following code from 'int main()'. +> +

      Writing in C language

      + + int main() { + puts("hello world"); + } +< + Type 'c' +> + int main() {
      +   puts("hello world");
      + }
      +< + To convert text into html used command |:TOhtml|. + +17. Lorem ipsum *emmet-lorem-ipsum* + + To insert dummy text (30 words by default). +> + div>lorem +< + Type |,| +> +
      Adipisicing asperiores deleniti ipsum fuga deserunt perferendis + molestiae sunt excepturi aut quo nihil! Optio accusantium corporis molestiae + deserunt ab, veritatis commodi. Eius nobis ab deserunt magni iure quo + laboriosam laboriosam.
      +< + For japanese user, put like follow into your |g:user_emmet_settings|: +> + let g:user_emmet_settings = { + ... + + \ 'custom_expands1' : { + \ '^\%(lorem\|lipsum\)\(\d*\)$' : function('emmet#lorem#ja#expand'), + \ }, + + ... +< + You will get japanese dummy text. Text retrieved from url + 'http://www.aozora.gr.jp/cards/000081/files/470_15407.html' + using command, specified by |g:emmet_curl_command|. + + To insert 3 words of dummy text. +> + div>lorem3 +< + Type |,| +> +
      + Elit libero id. +
      +< +============================================================================== +HTML EXPRESSION SYNTAX *emmet-html-expression-syntax* + +Emmet uses syntax similar to CSS selectors for describing elements' positions +inside generated tree and elements' attributes. + +1. Elements *emmet-html-syntax-elements* + + You can use elements' names like 'div' or 'p' to generate HTML tags. +> + p ->

      + div ->
      +< + You can write any word and transform it into a tag: +> + foo -> + bar -> +< + Emmet knowns set of empty elements: +> + br ->
      or
      + meta -> or +< + To choose between HTML '>' and XHTML ' />' use |g:emmet_html5| or + |g:user_emmet_settings|: +> + let g:user_emmet_settings = { + \ ... + \ 'html': { + \ ... + \ 'empty_element_suffix': ' />', + \ ... + \ }, + \ ... + \} +< + Emmet will automatically insert some attributes: +> + a -> + link -> +< + Set of inserted attributes can be changed using |g:user_emmet_settings|: +> + let s:emmet_settings = { + \ ... + \ 'html': { + \ ... + \ 'default_attributes': { + \ ... + \ 'a': {'href': ''}, + \ 'ins': {'datetime': '${datetime}'}, + \ 'iframe': [{'src': ''}, {'frameborder': '0'}], + \ 'textarea': [{'name': ''}, {'id': ''}, {'cols': '30'}, {'rows': '10'}], + \ ... + \ }, + \ ... + \ }, + \ ... + \} +< +2. Nesting operators *emmet-html-syntax-nesting-operators* + + Nesting operators are used to position abbreviation elements + inside generated tree: whether it should be placed + inside or near the context element. + + Operator Description Link ~ + > Child |emmet->| + + Sibling |emmet-+| + ^ Climb-up |emmet-^| + * Multiplication |emmet-star| + () Grouping |emmet-()| + +2.1. Child *emmet->* + + You can use '>' operator to nest elements inside each other: +> + div>ul>li +< + will produce +> +
      +
        +
      • +
      +
      +< +2.2. Sibling *emmet-+* + + Use '+' operator to place elements near each other, on the same level: +> + div+p+bq +< + will output +> +
      +

      +
      +< +2.3. Climb-up *emmet-^* + + With '>' operator you're descending down the generated tree and + positions of all sibling elements will be resolved + against the most deepest element: +> + div+div>p>span+em +< + will be expanded to +> +
      +
      +

      + + +

      +
      +< + With '^' operator, you can climb one level up the tree and change context + where following elements should appear: +> + div+div>p>span+em^bq +< + outputs to +> +
      +
      +

      + + +

      +
      +
      +< + You can use as many '^' operators as you like, + each operator will move one level up: +> + div+div>p>span+em^^^bq +< + will output to +> +
      +
      +

      + + +

      +
      +
      +< +2.4. Multiplication *emmet-star* + + With '*' operator you can define how many times element should be outputted: +> + ul>li*5 +< + outputs to +> +
        +
      • +
      • +
      • +
      • +
      • +
      +< + Expression may contain several '*' operators: +> + tr*2>td*3 +< + become +> + + + + + + + + + + +< +2.5. Grouping *emmet-()* + + Parentheses '()' are used by Emmets' power users for grouping subtrees + in complex abbreviations: +> + div>(header>ul>li*2>a)+footer>p +< + expands to +> +
      +
      +
        +
      • +
      • +
      +
      +
      +

      +
      +
      +< + If you're working with browser's DOM, you may think of groups + as Document Fragments: each group contains abbreviation subtree and + all the following elements are inserted at the same level + as the first element of group. + + You can nest groups inside each other and + combine them with multiplication '*' operator: +> + (div>dl>(dt+dd)*3)+footer>p +< + produces +> +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      +
      +< + With groups, you can literally write full page mark-up + with a single abbreviation, but please don't do that. + +3. Attribute operators *emmet-html-syntax-attribute-operators* + + Attribute operators are used to modify attributes of outputted elements. + For example, in HTML and XML you can quickly add 'class' attribute + to generated element. + + Operator Description Link ~ + . Attribute 'class' |emmet-.| + # Attribute 'id' |emmet-#| + [] Custom attributes |emmet-[]| + $ Number |emmet-$| + @ Number origin and direction |emmet-@| + +3.1. ID and CLASS *emmet-.* *emmet-#* + + In CSS, you use 'elem#id' and 'elem.class' notation to reach the elements + with specified 'id' or 'class' attributes. + In Emmet, you can use the very same syntax to add these attributes + to specified element: +> + span.class1 -> + span.class1.class2 -> + div#wrapper ->
      + div#wrapper.content ->
      +< + More complex expression: +> + div#header+div.page+div#footer.class1.class2.class3 +< + will output +> + +
      + +< +3.2. Custom attributes *emmet-[]* + + You can use '[attr]' notation (as in CSS) + to add custom attributes to your element: +> + td[title="Hello world!" colspan=3] +< + outputs +> + +< + You can place as many attributes as you like inside square brackets. + + Attribute values may be omitted: +> + td[colspan title] +< + will produce +> + +< + You can use single or double quotes for quoting attribute values. +> + div[a='value1' b="value2"] +< + become +> +
      +< + You don't need to quote values if they don't contain spaces: +> + td[title=hello colspan=3] +< + will output +> + +< +3.3. Item numbering *emmet-$* + + With multiplication '*' operator you can repeat elements, + but with '$' you can number them. + Place '$' operator inside element's name, attribute's name or + attribute's value to output current number of repeated element: +> + ul>li.item_$*5 +< + outputs to +> +
        +
      • +
      • +
      • +
      • +
      • +
      +< + You can use multiple '$' in a row to pad number with zeroes: +> + ul>li.item_$$$*5 +< + outputs to +> +
        +
      • +
      • +
      • +
      • +
      • +
      +< + Also '$' can be used in element name and in text (|emmet-{}|): +> + h$[title=item$]{Header $}*3 +< + transformed to +> +

      Header 1

      +

      Header 2

      +

      Header 3

      +< +3.3.1. Changing numbering origin and direction *emmet-@* + + With '@' modifier, you can change + - numbering direction (ascending or descending) and + - origin (i. e. start value). + + For example, to change direction, add '@-' after '$': +> + ul>li.item_$@-*5 +< + outputs to +> +
        +
      • +
      • +
      • +
      • +
      • +
      +< + To change counter origin value, add '@N' modifier to '$': +> + ul>li.item_$@3*5 +< + transforms to +> +
        +
      • +
      • +
      • +
      • +
      • +
      +< + You can use these modifiers together: +> + ul>li.item_$@-3*5 +< + is transformed to +> +
        +
      • +
      • +
      • +
      • +
      • +
      +> +3.4. Quote character *emmet-html-attr-quote-char* + + |g:user_emmet_settings| may be used to change attribute quote character: +> + let g:user_emmet_settings = { + ... + \ 'html' : { + ... + \ 'quote_char': "'", + ... + \ }, + ... + \} +< + Then abbreviation +> + a[target=_blank] +< + will expand to +> + +< + instead of +> + +< + Default quote is '"'. + +4. Text *emmet-{}* + + You can use curly braces to add text to element: +> + a{Click me} +< + will produce +> + Click me +< + Note that '{text}' is used and parsed as a separate element + (like, 'div', 'p' etc), but has a special meaning + when written right after element. For example, +> + a{click} +< + and +> + a>{click} +< + will produce the same output, but +> + a{click}+b{here} +< + and +> + a>{click}+b{here} +< + won't: +> + + clickhere + + + clickhere +< + In second example the '' element is placed inside '' element. + And that's the difference: when '{text}' is written right after element, + it doesn't change parent context. + Here's more complex example showing why it is important: +> + p>{Click }+a{here}+{ to continue} +< + produces +> +

      Click here to continue

      +< + In this example, to write 'Click here to continue' inside '

      ' element + we have explicitly move down the tree with '>' operator after 'p', + but in case of 'a' element we don't have to, since we need '' element + with here word only, without changing parent context. + + For comparison, here's the same abbreviation + written without child '>' operator: +> + p{Click }+a{here}+{ to continue} +< + produces +> +

      Click

      + here to continue +< +5. Implicit tag names *emmet-html-implicit-tag-names* + + Even with such a powerful abbreviation engine, + which can expand large HTML structures from short abbreviation, + writing tag names may be very tedious. + + In many cases you can skip typing tag names and + Emmet will substitute it for you. + For example, instead of > + div.content +< you can simply write > + .content +< and expand it into > +
      +< + Other examples: +> + .wrapper ->
      + #popup -> +< + When you expand abbreviation, Emmet tries to grab parent context, + e. g. the HTML element, inside which you're expanding the abbreviation. + If the context was grabbed successfully, + Emmet uses its name to resolve implicit names. + Emmet looks at the parent tag name every time + you're expanding the abbreviation with an implicit name. + Here's how it resolves the names for some parent elements: + + Inserted element Parent elements ~ + li ul, ol + tr table, tbody, thead, tfoot + td tr + option select, optgroup + span Inline elements + div Block elements + + Take a look at some abbreviations equivalents + with implicit and explicit tag names: +> + .wrap>.content -> div.wrap>div.content + em>.info -> em>span.info + ul>.item*3 -> ul>li.item*3 + table>.row>.col -> table>tr.row>td.col + table>#row$*4>[colspan=2] -> table>tr#row$*4>td[colspan=2] +< +6. Notes on abbreviation formatting *emmet-html-syntax-notes* + + When you get familiar with Emmet's abbreviations syntax, + you may want to use some formatting to make your abbreviations more readable. + For example, use spaces between elements and operators, like this: +> + (header > ul.nav > li*5) + footer +< + But it won't work, because space is a stop symbol + where Emmet stops abbreviation parsing. + + Many users mistakenly think that each abbreviation + should be written in a new line, but they are wrong: + you can type and expand abbreviation anywhere in the text: + + This is why Emmet needs some indicators (like spaces) + where it should stop parsing to not expand anything that you don't need. + If you're still thinking that such formatting is required + for complex abbreviations to make them more readable: + - abbreviations are not a template language, + they don't have to be "readable", + they have to be "quickly expandable and removable"; + - you don't really need to write complex abbreviations. + Stop thinking that "typing" is the slowest process in web-development. + You'll quickly find out that constructing a single complex abbreviation + is much slower and error-prone than constructing and typing + a few short ones. + +7. Choose position to insert text when wrap abbreviation *emmet-$#* + + When wrap abbreviation (|emmet-wrap-with-abbreviation|) you can choose + position to insert text using '$#' operator. + Operator '$#' may be used only inside |emmet-[]| and/or |emmet-{}|. + + For example, do visual select (line wise) following text: +> + First + Second + Third +< + Then press ',' and type +> + ul>li[ title="[$#]" ]* +< + Result: +> +
        +
      • First
      • +
      • Second
      • +
      • Third
      • +
      +< + You may type +> + input[ type=input value=$# ] +< + to get +> + + + +< + Using '$#' you can type text (|emmet-{}|) only once: +> + a[title=$#]{foo} +< + will be expanded to +> + foo +< +============================================================================== +CSS EXPRESSION SYNTAX *emmet-css-expression-syntax* + +1. Properties *emmet-css-properties* + + Emmet has a lot of predefined snippets for CSS properties. +> + +< + become +> + +< + In above example '|' denotes a cursor (caret) position. + + Other examples: +> + t -> top: ; + d -> display: ; + o -> outline: ; + ov -> overflow: ; + cu -> cursor: ; + bdrs -> border-radius: ; +< + '+' operator may be used to insert number of properties: +> + m1+p2 +< + become +> + margin: 1px; + padding: 2px; +< +2. Values *emmet-css-values* + + Some properties have default values: +> + c -> color: #000; + bgc -> background-color: #FFF; + zoo -> zoom: 1; +< + To insert predefined property value after abbreviation + type colon ':' and first character of predefined keyword: +> + d:n -> display: none; + d:b -> display: block; + d:i -> display: inline; +< + Numerical value can be typed directly after abbreviation: +> + m10 -> margin: 10px; + m2e -> margin: 2em; +< + Use a hyphen '-' to separate some numerical values: +> + m10-20 -> margin: 10px 20px; + p1-2-3 -> padding: 1px 2px 3px; +< + To negative values + precede the first value with hyphen and all the rest with double hyphens: +> + m-10 -> margin: -10px; + m-1--2 -> margin: -1px -2px; + p-2--1-0-1 -> padding: -2px -1px 0 1px; +< + To insert '!important' append '!' to property abbreviation: +> + m! -> margin: !important; + bac! -> background: !important; +< + You can use special abbreviation 'lg(...)' + to insert definition of linear gradient. Example: +> + lg(left, #fc0 30%, red) +< + will expand to +> + background-image: -webkit-gradient(left, 0 0, 0 100, from(#fc0 30%), to(red)); + background-image: -webkit-linear-gradient(#fc0 30%, red); + background-image: -moz-linear-gradient(#fc0 30%, red); + background-image: -o-linear-gradient(#fc0 30%, red); + background-image: linear-gradient(#fc0 30%, red); +< +3. Units *emmet-css-units* + + By default, when you expand an abbreviation with integer value, + Emmet outputs it with a 'px' unit: +> + bor2 -> border: 2px; + fs100 -> font-size: 100px; + miw20 -> min-width: 20px; +< + By default, if you're expanding an abbreviation with a float value, + it is outputted with an 'em' unit: +> + fs1.5 -> font-style: 1.5em; +< + But you can explicitly provide the unit name + by putting one of characters right after value: + + Character Unit ~ + p % + e em + + Examples: +> + fs2e -> font-style: 2em; + w100p -> width: 100%; +< +4. Vendor prefixes *emmet-css-vendor-prefixes* + + To automatically create vendor-prefixed copies of property, + precede abbreviation with a hyphen '-'. For example, abbreviation +> + -bdrs +< + will be expanded into +> + -webkit-border-radius: ; + -moz-border-radius: ; + border-radius: ; +< +============================================================================== +COMMANDS *emmet-commands* + +:Emmet {expression} *:Emmet* + Expand {expression} and insert result under cursor. + {expression} is |emmet-html-expression|. + Also see |g:user_emmet_install_command|. + +:EmmetInstall *:EmmetInstall* + Create Emmet mappings to current buffer + (|mapping|, |:map-|) and, + if set |g:user_emmet_complete_tag|, + change |'omnifunc'| option to emmet#completeTag() + +============================================================================== +VARIABLES *emmet-variables* + +g:emmet_html5 *g:emmet_html5* + If set to 1, enable HTML 5 support: + - use ">" instead of "/>": > + + +< - omit some HTML 4 attributes: > + +endsnippet + +snippet sub "" w +$1 +endsnippet + +snippet sup "" w +$1 +endsnippet + +snippet table "HTML " w +
      + ${0:${VISUAL}} +
      +endsnippet + +snippet tbody "" +$1 +endsnippet + +snippet td "table cell" w +${0:${VISUAL}} +endsnippet + +snippet template "