From 4ea00430a3f339d4d466a0d8cc33934d1b3b3a44 Mon Sep 17 00:00:00 2001 From: michener Date: Fri, 26 Aug 2011 04:13:21 +0000 Subject: [PATCH] Add mako indent, and remove bufexplorer git-svn-id: http://photonzero.com/dotfiles/trunk@101 23f722f6-122a-0410-8cef-c75bd312dd78 --- .vim/indent/mako.vim | 353 ++++++++++++++++++ .vim/plugin/bufexplorer.vim | 869 -------------------------------------------- 2 files changed, 353 insertions(+), 869 deletions(-) create mode 100644 .vim/indent/mako.vim delete mode 100644 .vim/plugin/bufexplorer.vim diff --git a/.vim/indent/mako.vim b/.vim/indent/mako.vim new file mode 100644 index 0000000..bd85ac5 --- /dev/null +++ b/.vim/indent/mako.vim @@ -0,0 +1,353 @@ +" Vim indent file +" Language: Mako +" Author: Scott Torborg +" Version: 0.4 +" License: Do What The Fuck You Want To Public License (WTFPL) +" +" --------------------------------------------------------------------------- +" +" DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE +" Version 2, December 2004 +" +" Copyright (C) 2004 Sam Hocevar +" +" Everyone is permitted to copy and distribute verbatim or modified +" copies of this license document, and changing it is allowed as long +" as the name is changed. +" +" DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE +" TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +" +" 0. You just DO WHAT THE FUCK YOU WANT TO. +" +" --------------------------------------------------------------------------- +" +" This script does more useful indenting for Mako HTML templates. It indents +" inside of control blocks, defs, etc. Note that this indenting style will +" sacrifice readability of the output text for the sake of readability of the +" template. +" +" We'll use HTML indenting globally, python inside <% %> blocks. Inspired by +" the excellent PHP + HTML indentation files such as php.vim by Pim Snel. +" +" Changelog: +" 0.4 - 5 March 2010 +" - Added license information +" 0.3 - 15 September 2009 +" - Added explicit indenting for ## comments, fixed unindenting count, +" thanks to Mike Lewis (@MikeRLewis) for this +" 0.2 - 15 June 2009 +" - Fixed issue where opening and closing mako tags on the same line +" would cause incorrect indenting +" 0.1 - 06 June 2009 +" - Initial public release of mako indent file + +let sw=2 " default shiftwidth of 2 spaces + +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal nosmartindent +setlocal noautoindent +setlocal nocindent +setlocal nolisp + +setlocal indentexpr=GetMakoIndent() +setlocal indentkeys+=*,<>>,,end,: + +" Only define the function once. +if exists("*GetMakoIndent") + finish +endif + +if exists('g:html_indent_tags') + unlet g:html_indent_tags +endif + +function IsInsidePythonBlock(startline) + " Loop until we get a line that's either <% or %> + let lnum = a:startline + while getline(lnum) !~ '\(%>\|<%\)$' && lnum > 0 + let lnum = lnum - 1 + endwhile + + " lnum points to the last control. If it's a <% then we're inside an + " embedded python block, otherwise we're not. + return getline(lnum) =~ '<%$' +endfunction + +function GetMakoIndent() + " Find a non-empty line above the current line + let lnum = prevnonblank(v:lnum - 1) + + " Hit the start of the file, use zero indent. + if lnum == 0 + return 0 + endif + + let line = getline(lnum) " last line + let cline = getline(v:lnum) " current line + let pline = getline(lnum - 1) " previous to last line + let ind = indent(lnum) + if line =~ '^\s*##' + return indent(lnum) + end + + let restore_ic=&ic + let &ic=1 " ignore case + + let ind = HtmlIndentSum(lnum, -1) + let ind = HtmlIndentSum(lnum, -1) + let ind = ind + HtmlIndentSum(v:lnum, 0) + + let &ic=restore_ic + + let ind = indent(lnum) + (&sw * ind) + + " Indent after %anything: or <%anything NOT ending in /> + if line =~ '^\s*%.*:\s*$' + let ind = ind + &sw + endif + + " Unindent before %end* or $' + let scanlnum = lnum + " Scan backwards until we find the beginning of this python block. + while getline(scanlnum) !~ '<%$' && scanlnum > 0 + let scanlnum = scanlnum - 1 + endwhile + let ind = indent(scanlnum) + endif + + " If we're inside a python block and the previous line ends in a colon, + " indent. + if IsInsidePythonBlock(lnum - 1) + " Indent after : + if line =~ '\:$' + let ind = ind + &sw + endif + endif + + return ind +endfunction + + +" [-- helper function to assemble tag list --] +fun! HtmlIndentPush(tag) + if exists('g:html_indent_tags') + let g:html_indent_tags = g:html_indent_tags.'\|'.a:tag + else + let g:html_indent_tags = a:tag + endif +endfun + +fun! MakoIndentPush(tag) + if exists('g:mako_indent_tags') + let g:mako_indent_tags = g:mako_indent_tags.'\|'.a:tag + else + let g:mako_indent_tags = a:tag + endif +endfun + +" [-- --] +call HtmlIndentPush('a') +call HtmlIndentPush('abbr') +call HtmlIndentPush('acronym') +call HtmlIndentPush('address') +call HtmlIndentPush('b') +call HtmlIndentPush('bdo') +call HtmlIndentPush('big') +call HtmlIndentPush('blockquote') +call HtmlIndentPush('button') +call HtmlIndentPush('caption') +call HtmlIndentPush('center') +call HtmlIndentPush('cite') +call HtmlIndentPush('code') +call HtmlIndentPush('colgroup') +call HtmlIndentPush('del') +call HtmlIndentPush('dfn') +call HtmlIndentPush('dir') +call HtmlIndentPush('div') +call HtmlIndentPush('dl') +call HtmlIndentPush('em') +call HtmlIndentPush('fieldset') +call HtmlIndentPush('font') +call HtmlIndentPush('form') +call HtmlIndentPush('frameset') +call HtmlIndentPush('h1') +call HtmlIndentPush('h2') +call HtmlIndentPush('h3') +call HtmlIndentPush('h4') +call HtmlIndentPush('h5') +call HtmlIndentPush('h6') +call HtmlIndentPush('i') +call HtmlIndentPush('iframe') +call HtmlIndentPush('ins') +call HtmlIndentPush('kbd') +call HtmlIndentPush('label') +call HtmlIndentPush('legend') +call HtmlIndentPush('map') +call HtmlIndentPush('menu') +call HtmlIndentPush('noframes') +call HtmlIndentPush('noscript') +call HtmlIndentPush('object') +call HtmlIndentPush('ol') +call HtmlIndentPush('optgroup') +call HtmlIndentPush('pre') +call HtmlIndentPush('q') +call HtmlIndentPush('s') +call HtmlIndentPush('samp') +call HtmlIndentPush('script') +call HtmlIndentPush('select') +call HtmlIndentPush('small') +call HtmlIndentPush('span') +call HtmlIndentPush('strong') +call HtmlIndentPush('style') +call HtmlIndentPush('sub') +call HtmlIndentPush('sup') +call HtmlIndentPush('table') +call HtmlIndentPush('textarea') +call HtmlIndentPush('title') +call HtmlIndentPush('tt') +call HtmlIndentPush('u') +call HtmlIndentPush('ul') +call HtmlIndentPush('var') + +" For some reason the default HTML indentation script doesn't consider these +" elements to be worthy of indentation. +call HtmlIndentPush('p') +call HtmlIndentPush('dt') +call HtmlIndentPush('dd') + + +" [-- --] +if !exists('g:html_indent_strict') + call HtmlIndentPush('body') + call HtmlIndentPush('head') + call HtmlIndentPush('html') + call HtmlIndentPush('tbody') +endif + + +" [-- --] +if !exists('g:html_indent_strict_table') + call HtmlIndentPush('th') + call HtmlIndentPush('td') + call HtmlIndentPush('tr') + call HtmlIndentPush('tfoot') + call HtmlIndentPush('thead') +endif + +" [-- --] +call MakoIndentPush('%def') +call MakoIndentPush('%call') +call MakoIndentPush('%doc') +call MakoIndentPush('%text') +call MakoIndentPush('%.\+:.\+') + +delfun HtmlIndentPush +delfun MakoIndentPush + +set cpo-=C + +" [-- get number of regex matches in a string --] +fun! MatchCount(expr, pat) + let mpos = 0 + let mcount = 0 + let expr = a:expr + while (mpos > -1) + let mend = matchend(expr, a:pat) + if mend > -1 + let mcount = mcount + 1 + endif + if mend == mpos + let mpos = mpos + 1 + else + let mpos = mend + endif + let expr = strpart(expr, mpos) + endwhile + return mcount +endfun + +" [-- count indent-increasing tags of line a:lnum --] +fun! HtmlIndentOpen(lnum) + let s = substitute('x'.getline(a:lnum), + \ '.\{-}\(\(<\)\('.g:html_indent_tags.'\)\>\)', "\1", 'g') + let s = substitute(s, "[^\1].*$", '', '') + return strlen(s) +endfun + +" [-- count indent-decreasing tags of line a:lnum --] +fun! HtmlIndentClose(lnum) + let s = substitute('x'.getline(a:lnum), + \ '.\{-}\(\(<\)/\('.g:html_indent_tags.'\)\>>\)', "\1", 'g') + let s = substitute(s, "[^\1].*$", '', '') + return strlen(s) +endfun + +" [-- count indent-increasing mako tags of line a:lnum --] +fun! MakoIndentOpen(lnum) + let s = substitute('x'.getline(a:lnum), + \ '.\{-}\(\(<\)\('.g:mako_indent_tags.'\)\>\)', "\1", 'g') + let s = substitute(s, "[^\1].*$", '', '') + return strlen(s) +endfun + +" [-- count indent-decreasing mako tags of line a:lnum --] +fun! MakoIndentClose(lnum) + let mcount = MatchCount(getline(a:lnum), '') + let mcount = mcount + MatchCount(getline(a:lnum), '<\('.g:mako_indent_tags.'\)[^>]*/>') + return mcount +endfun + +" [-- count indent-increasing '{' of (java|css) line a:lnum --] +fun! HtmlIndentOpenAlt(lnum) + return strlen(substitute(getline(a:lnum), '[^{]\+', '', 'g')) +endfun + +" [-- count indent-decreasing '}' of (java|css) line a:lnum --] +fun! HtmlIndentCloseAlt(lnum) + return strlen(substitute(getline(a:lnum), '[^}]\+', '', 'g')) +endfun + +" [-- return the sum of indents respecting the syntax of a:lnum --] +fun! HtmlIndentSum(lnum, style) + let open = HtmlIndentOpen(a:lnum) + MakoIndentOpen(a:lnum) + let close = HtmlIndentClose(a:lnum) + MakoIndentClose(a:lnum) + if a:style == match(getline(a:lnum), '^\s*HtmlIndentOpenAlt(a:lnum) - HtmlIndentCloseAlt(a:lnum) + endif + endif + return 0 +endfun + +" vim: set ts=4 sw=4: diff --git a/.vim/plugin/bufexplorer.vim b/.vim/plugin/bufexplorer.vim deleted file mode 100644 index fb7aea9..0000000 --- a/.vim/plugin/bufexplorer.vim +++ /dev/null @@ -1,869 +0,0 @@ -"============================================================================= -" Copyright: Copyright (C) 2001-2008 Jeff Lanzarotta -" Permission is hereby granted to use and distribute this code, -" with or without modifications, provided that this copyright -" notice is copied with it. Like anything else that's free, -" bufexplorer.vim is provided *as is* and comes with no -" warranty of any kind, either expressed or implied. In no -" event will the copyright holder be liable for any damages -" resulting from the use of this software. -" Name Of File: bufexplorer.vim -" Description: Buffer Explorer Vim Plugin -" Maintainer: Jeff Lanzarotta (delux256-vim at yahoo dot com) -" Last Changed: Wednesday, 19 Nov 2008 -" Version: See g:bufexplorer_version for version number. -" Usage: This file should reside in the plugin directory and be -" automatically sourced. -" -" You may use the default keymappings of -" -" be - Opens BufExplorer -" bs - Opens horizontally split window BufExplorer -" bv - Opens vertically split window BufExplorer -" -" Or you can use -" -" ":BufExplorer" - Opens BufExplorer -" ":HSBufExplorer" - Opens horizontally window BufExplorer -" ":VSBufExplorer" - Opens vertically split window BufExplorer -" -" For more help see supplied documentation. -" History: See supplied documentation. -"============================================================================= - -" Exit quickly if already running or when 'compatible' is set. {{{1 -if exists("g:bufexplorer_version") || &cp - finish -endif -"1}}} - -" Version number -let g:bufexplorer_version = "7.2.2" - -" Check for Vim version 700 or greater {{{1 -if v:version < 700 - echo "Sorry, bufexplorer ".g:bufexplorer_version."\nONLY runs with Vim 7.0 and greater." - finish -endif - -" Public Interface {{{1 -nmap be :BufExplorer -nmap bs :HSBufExplorer -nmap bv :VSBufExplorer - -" Create commands {{{1 -command BufExplorer :call StartBufExplorer(has ("gui") ? "drop" : "hide edit") -command HSBufExplorer :call HorizontalSplitBufExplorer() -command VSBufExplorer :call VerticalSplitBufExplorer() - -" Set {{{1 -function s:Set(var, default) - if !exists(a:var) - if type(a:default) - exec "let" a:var "=" string(a:default) - else - exec "let" a:var "=" a:default - endif - - return 1 - endif - - return 0 -endfunction - -" Default values {{{1 -call s:Set("g:bufExplorerDefaultHelp", 1) " Show default help? -call s:Set("g:bufExplorerDetailedHelp", 0) " Show detailed help? -call s:Set("g:bufExplorerFindActive", 1) " When selecting an active buffer, take you to the window where it is active? -call s:Set("g:bufExplorerReverseSort", 0) " sort reverse? -call s:Set("g:bufExplorerShowDirectories", 1) " (Dir's are added by commands like ':e .') -call s:Set("g:bufExplorerShowRelativePath", 0) " Show listings with relative or absolute paths? -call s:Set("g:bufExplorerShowUnlisted", 0) " Show unlisted buffers? -call s:Set("g:bufExplorerSortBy", "mru") " Sorting methods are in s:sort_by: -call s:Set("g:bufExplorerSplitOutPathName", 1) " Split out path and file name? -call s:Set("g:bufExplorerSplitRight", &splitright) " Should vertical splits be on the right or left of current window? -call s:Set("g:bufExplorerSplitBelow", &splitbelow) " Should horizontal splits be below or above current window? - -" Global variables {{{1 -let s:MRUList = [] -let s:running = 0 -let s:sort_by = ["number", "name", "fullpath", "mru", "extension"] -let s:tabSpace = [] -let s:types = {"fullname": ':p', "path": ':p:h', "relativename": ':~:.', "relativepath": ':~:.:h', "shortname": ':t'} -let s:originBuffer = 0 -let s:splitMode = "" - -" Setup the autocommands that handle the MRUList and other stuff. {{{1 -autocmd VimEnter * call s:Setup() - -" Setup {{{1 -function s:Setup() - " Build initial MRUList. - let s:MRUList = range(1, bufnr('$')) - let s:tabSpace = [] - " Now that the MRUList is created, add the other autocmds. - autocmd BufEnter,BufNew * call s:ActivateBuffer() - autocmd BufWipeOut * call s:DeactivateBuffer(1) - autocmd BufDelete * call s:DeactivateBuffer(0) - - autocmd BufWinEnter \[BufExplorer\] call s:Initialize() - autocmd BufWinLeave \[BufExplorer\] call s:Cleanup() -endfunction - -" ActivateBuffer {{{1 -function s:ActivateBuffer() - let b = bufnr("%") - let l = get(s:tabSpace, tabpagenr(), []) - - if empty(l) || index(l, b) == -1 - call add(l, b) - let s:tabSpace[tabpagenr()] = l - endif - - call s:MRUPush(b) -endfunction - -" DeactivateBuffer {{{1 -function s:DeactivateBuffer(remove) - "echom "afile:" expand("") - "echom "bufnr, afile:" bufnr(expand("")) - "echom "buffers:" string(tabpagebuflist()) - "echom "MRU before:" string(s:MRUList) - - let _bufnr = bufnr(expand("")) - let _buftype = getbufvar(_bufnr, "&buftype") - - if empty(_buftype) || _buftype == "nofile" || !buflisted(_bufnr) || empty(bufname(_bufnr)) || fnamemodify(bufname(_bufnr), ":t") == "[BufExplorer]" - return - end - - if a:remove - call s:MRUPop(bufnr(expand(""))) - end -endfunction - -" MRUPop {{{1 -function s:MRUPop(buf) - call filter(s:MRUList, 'v:val != '.a:buf) -endfunction - -" MRUPush {{{1 -function s:MRUPush(buf) - " Skip temporary buffer with buftype set. Don't add the BufExplorer window to the - " list. - if !empty(getbufvar(a:buf, "&buftype")) || - \ !buflisted(a:buf) || empty(bufname(a:buf)) || - \ fnamemodify(bufname(a:buf), ":t") == "[BufExplorer]" - return - end - " Remove the buffer number from the list if it already exists. - call s:MRUPop(a:buf) - " Add the buffer number to the head of the list. - call insert(s:MRUList,a:buf) -endfunction - -" Initialize {{{1 -function s:Initialize() - let s:_insertmode = &insertmode - set noinsertmode - - let s:_showcmd = &showcmd - set noshowcmd - - let s:_cpo = &cpo - set cpo&vim - - let s:_report = &report - let &report = 10000 - - let s:_list = &list - set nolist - - setlocal nonumber - setlocal foldcolumn=0 - setlocal nofoldenable - setlocal cursorline - setlocal nospell - - set nobuflisted - - let s:running = 1 -endfunction - -" Cleanup {{{1 -function s:Cleanup() - let &insertmode = s:_insertmode - let &showcmd = s:_showcmd - let &cpo = s:_cpo - let &report = s:_report - let &list = s:_list - let s:running = 0 - let s:splitMode = "" - - delmarks! -endfunction - -" HorizontalSplitBufExplorer {{{1 -function HorizontalSplitBufExplorer() - let s:splitMode = "sp" - exec "BufExplorer" -endfunction - -" VerticalSplitBufExplorer {{{1 -function VerticalSplitBufExplorer() - let s:splitMode = "vsp" - exec "BufExplorer" -endfunction - -" StartBufExplorer {{{1 -function StartBufExplorer(open) - let name = '[BufExplorer]' - - if !has("win32") - " On non-Windows boxes, escape the name so that is shows up correctly. - let name = escape(name, "[]") - endif - " Make sure there is only one explorer open at a time. - if s:running == 1 - " Go to the open buffer. - if has("gui") - exec "drop" name - endif - - return - endif - - let s:originBuffer = bufnr("%") - silent let s:raw_buffer_listing = s:GetBufferInfo() - - let copy = copy(s:raw_buffer_listing) - - if (g:bufExplorerShowUnlisted == 0) - call filter(copy, 'v:val.attributes !~ "u"') - endif - - if (!empty(copy)) - call filter(copy, 'v:val.shortname !~ "\\\[No Name\\\]"') - endif - - if len(copy) <= 1 - echo "\r" - call s:Warning("Sorry, there are no more buffers to explore") - - return - endif - " We may have to split the current window. - if (s:splitMode != "") - " Save off the original settings. - let [_splitbelow, _splitright] = [&splitbelow, &splitright] - " Set the setting to ours. - let [&splitbelow, &splitright] = [g:bufExplorerSplitBelow, g:bufExplorerSplitRight] - " Do it. - exe s:splitMode - " Restore the original settings. - let [&splitbelow, &splitright] = [_splitbelow, _splitright] - endif - - if !exists("b:displayMode") || b:displayMode != "winmanager" - " Do not use keepalt when opening bufexplorer to allow the buffer that we are - " leaving to become the new alternate buffer - exec "silent keepjumps ".a:open." ".name - endif - - call s:DisplayBufferList() -endfunction - -" DisplayBufferList {{{1 -function s:DisplayBufferList() - setlocal bufhidden=delete - setlocal buftype=nofile - setlocal modifiable - setlocal noswapfile - setlocal nowrap - - call s:SetupSyntax() - call s:MapKeys() - call setline(1, s:CreateHelp()) - call s:BuildBufferList() - call cursor(s:firstBufferLine, 1) - - if !g:bufExplorerResize - normal! zz - endif - - setlocal nomodifiable -endfunction - -" MapKeys {{{1 -function s:MapKeys() - if exists("b:displayMode") && b:displayMode == "winmanager" - nnoremap :call SelectBuffer("tab") - endif - - nnoremap :call ToggleHelp() - nnoremap <2-leftmouse> :call SelectBuffer() - nnoremap :call SelectBuffer() - nnoremap t :call SelectBuffer("tab") - nnoremap :call SelectBuffer("tab") - nnoremap d :call RemoveBuffer("wipe") - nnoremap D :call RemoveBuffer("delete") - nnoremap m :call MRUListShow() - nnoremap p :call ToggleSplitOutPathName() - nnoremap q :call Close() - nnoremap r :call SortReverse() - nnoremap R :call ToggleShowRelativePath() - nnoremap s :call SortSelect() - nnoremap u :call ToggleShowUnlisted() - nnoremap f :call ToggleFindActive() - - for k in ["G", "n", "N", "L", "M", "H"] - exec "nnoremap " k ":keepjumps normal!" k."" - endfor -endfunction - -" SetupSyntax {{{1 -function s:SetupSyntax() - if has("syntax") - syn match bufExplorerHelp "^\".*" contains=bufExplorerSortBy,bufExplorerMapping,bufExplorerTitle,bufExplorerSortType,bufExplorerToggleSplit,bufExplorerToggleOpen - syn match bufExplorerOpenIn "Open in \w\+ window" contained - syn match bufExplorerSplit "\w\+ split" contained - syn match bufExplorerSortBy "Sorted by .*" contained contains=bufExplorerOpenIn,bufExplorerSplit - syn match bufExplorerMapping "\" \zs.\+\ze :" contained - syn match bufExplorerTitle "Buffer Explorer.*" contained - syn match bufExplorerSortType "'\w\{-}'" contained - syn match bufExplorerBufNbr /^\s*\d\+/ - syn match bufExplorerToggleSplit "toggle split type" contained - syn match bufExplorerToggleOpen "toggle open mode" contained - - syn match bufExplorerModBuf /^\s*\d\+.\{4}+.*/ - syn match bufExplorerLockedBuf /^\s*\d\+.\{3}[\-=].*/ - syn match bufExplorerHidBuf /^\s*\d\+.\{2}h.*/ - syn match bufExplorerActBuf /^\s*\d\+.\{2}a.*/ - syn match bufExplorerCurBuf /^\s*\d\+.%.*/ - syn match bufExplorerAltBuf /^\s*\d\+.#.*/ - syn match bufExplorerUnlBuf /^\s*\d\+u.*/ - - hi def link bufExplorerBufNbr Number - hi def link bufExplorerMapping NonText - hi def link bufExplorerHelp Special - hi def link bufExplorerOpenIn Identifier - hi def link bufExplorerSortBy String - hi def link bufExplorerSplit NonText - hi def link bufExplorerTitle NonText - hi def link bufExplorerSortType bufExplorerSortBy - hi def link bufExplorerToggleSplit bufExplorerSplit - hi def link bufExplorerToggleOpen bufExplorerOpenIn - - hi def link bufExplorerActBuf Identifier - hi def link bufExplorerAltBuf String - hi def link bufExplorerCurBuf Type - hi def link bufExplorerHidBuf Constant - hi def link bufExplorerLockedBuf Special - hi def link bufExplorerModBuf Exception - hi def link bufExplorerUnlBuf Comment - endif -endfunction - -" ToggleHelp {{{1 -function s:ToggleHelp() - let g:bufExplorerDetailedHelp = !g:bufExplorerDetailedHelp - - setlocal modifiable - " Save position. - normal! ma - " Remove old header. - if (s:firstBufferLine > 1) - exec "keepjumps 1,".(s:firstBufferLine - 1) "d _" - endif - - call append(0, s:CreateHelp()) - - silent! normal! g`a - delmarks a - - setlocal nomodifiable - - if exists("b:displayMode") && b:displayMode == "winmanager" - call WinManagerForceReSize("BufExplorer") - end -endfunction - -" GetHelpStatus {{{1 -function s:GetHelpStatus() - let ret = '" Sorted by '.((g:bufExplorerReverseSort == 1) ? "reverse " : "").g:bufExplorerSortBy - let ret .= ' | '.((g:bufExplorerFindActive == 0) ? "Don't " : "")."Locate buffer" - let ret .= ((g:bufExplorerShowUnlisted == 0) ? "" : " | Show unlisted") - let ret .= ' | '.((g:bufExplorerShowRelativePath == 0) ? "Absolute" : "Relative") - let ret .= ' '.((g:bufExplorerSplitOutPathName == 0) ? "Full" : "Split")." path" - - return ret -endfunction - -" CreateHelp {{{1 -function s:CreateHelp() - if g:bufExplorerDefaultHelp == 0 && g:bufExplorerDetailedHelp == 0 - let s:firstBufferLine = 1 - return [] - endif - - let header = [] - - if g:bufExplorerDetailedHelp == 1 - call add(header, '" Buffer Explorer ('.g:bufexplorer_version.')') - call add(header, '" --------------------------') - call add(header, '" : toggle this help') - call add(header, '" or Mouse-Double-Click : open buffer under cursor') - call add(header, '" or t : open buffer in another tab') - call add(header, '" d : wipe buffer') - call add(header, '" D : delete buffer') - call add(header, '" p : toggle spliting of file and path name') - call add(header, '" q : quit') - call add(header, '" r : reverse sort') - call add(header, '" R : toggle showing relative or full paths') - call add(header, '" u : toggle showing unlisted buffers') - call add(header, '" s : select sort field '.string(s:sort_by).'') - call add(header, '" f : toggle find active buffer') - else - call add(header, '" Press for Help') - endif - - call add(header, s:GetHelpStatus()) - call add(header, '"=') - - let s:firstBufferLine = len(header) + 1 - - return header -endfunction - -" GetBufferInfo {{{1 -function s:GetBufferInfo() - redir => bufoutput - buffers! - redir END - - let [all, allwidths, listedwidths] = [[], {}, {}] - - for n in keys(s:types) - let allwidths[n] = [] - let listedwidths[n] = [] - endfor - - for buf in split(bufoutput, '\n') - let bits = split(buf, '"') - let b = {"attributes": bits[0], "line": substitute(bits[2], '\s*', '', '')} - - for [key, val] in items(s:types) - let b[key] = fnamemodify(bits[1], val) - endfor - - if getftype(b.fullname) == "dir" && g:bufExplorerShowDirectories == 1 - let b.shortname = "" - end - - call add(all, b) - - for n in keys(s:types) - call add(allwidths[n], len(b[n])) - - if b.attributes !~ "u" - call add(listedwidths[n], len(b[n])) - endif - endfor - endfor - - let [s:allpads, s:listedpads] = [{}, {}] - - for n in keys(s:types) - let s:allpads[n] = repeat(' ', max(allwidths[n])) - let s:listedpads[n] = repeat(' ', max(listedwidths[n])) - endfor - - return all -endfunction - -" BuildBufferList {{{1 -function s:BuildBufferList() - let lines = [] - " Loop through every buffer. - for buf in s:raw_buffer_listing - if (!g:bufExplorerShowUnlisted && buf.attributes =~ "u") - " Skip unlisted buffers if we are not to show them. - continue - endif - - let line = buf.attributes." " - - if g:bufExplorerSplitOutPathName - let type = (g:bufExplorerShowRelativePath) ? "relativepath" : "path" - let path = buf[type] - let pad = (g:bufExplorerShowUnlisted) ? s:allpads.shortname : s:listedpads.shortname - let line .= buf.shortname." ".strpart(pad.path, len(buf.shortname)) - else - let type = (g:bufExplorerShowRelativePath) ? "relativename" : "fullname" - let path = buf[type] - let line .= path - endif - - let pads = (g:bufExplorerShowUnlisted) ? s:allpads : s:listedpads - - if !empty(pads[type]) - let line .= strpart(pads[type], len(path))." " - endif - - let line .= buf.line - - call add(lines, line) - endfor - - call setline(s:firstBufferLine, lines) - - call s:SortListing() -endfunction - -" SelectBuffer {{{1 -function s:SelectBuffer(...) - " Sometimes messages are not cleared when we get here so it looks like an error has - " occurred when it really has not. - echo "" - " Are we on a line with a file name? - if line('.') < s:firstBufferLine - exec "normal! \" - return - endif - - let _bufNbr = str2nr(getline('.')) - - if exists("b:displayMode") && b:displayMode == "winmanager" - let bufname = expand("#"._bufNbr.":p") - - if (a:0 == 1) && (a:1 == "tab") - call WinManagerFileEdit(bufname, 1) - else - call WinManagerFileEdit(bufname, 0) - endif - - return - end - - if bufexists(_bufNbr) - if bufnr("#") == _bufNbr - return s:Close() - endif - - if (a:0 == 1) && (a:1 == "tab") - " Restore [BufExplorer] buffer. - exec "keepjumps silent buffer!".s:originBuffer - - let tabNbr = s:GetTabNbr(_bufNbr) - - if tabNbr == 0 - " _bufNbr is not opened in any tabs. Open a new tab with the selected buffer in it. - exec "999tab split +buffer" . _bufNbr - else - " The _bufNbr is already opened in tab(s), go to that tab. - exec tabNbr . "tabnext" - " Focus window. - exec s:GetWinNbr(tabNbr, _bufNbr) . "wincmd w" - endif - else - if bufloaded(_bufNbr) && g:bufExplorerFindActive - call s:Close() - - let tabNbr = s:GetTabNbr(_bufNbr) - - if tabNbr != 0 - " The buffer is located in a tab. Go to that tab number. - exec tabNbr . "tabnext" - else - let bufname = expand("#"._bufNbr.":p") - exec bufname ? "drop ".escape(bufname, " ") : "buffer "._bufNbr - endif - endif - " Switch to the buffer. - exec "keepalt keepjumps silent b!" _bufNbr - endif - " Make the buffer 'listed' again. - call setbufvar(_bufNbr, "&buflisted", "1") - else - call s:Error("Sorry, that buffer no longer exists, please select another") - call s:DeleteBuffer(_bufNbr, "wipe") - endif -endfunction - -" RemoveBuffer {{{1 -function s:RemoveBuffer(mode) - " Are we on a line with a file name? - if line('.') < s:firstBufferLine - return - endif - " Do not allow this buffer to be deleted if it is the last one. - if len(s:MRUList) == 1 - call s:Error("Sorry, you are not allowed to delete the last buffer") - return - endif - " These commands are to temporarily suspend the activity of winmanager. - if exists("b:displayMode") && b:displayMode == "winmanager" - call WinManagerSuspendAUs() - end - - let _bufNbr = str2nr(getline('.')) - - if getbufvar(_bufNbr, '&modified') == 1 - call s:Error("Sorry, no write since last change for buffer "._bufNbr.", unable to delete") - return - else - " Okay, everything is good, delete or wipe the buffer. - call s:DeleteBuffer(_bufNbr, a:mode) - endif - " Reactivate winmanager autocommand activity. - if exists("b:displayMode") && b:displayMode == "winmanager" - call WinManagerForceReSize("BufExplorer") - call WinManagerResumeAUs() - end -endfunction - -" DeleteBuffer {{{1 -function s:DeleteBuffer(buf, mode) - " This routine assumes that the buffer to be removed is on the current line. - try - if a:mode == "wipe" - exe "silent bw" a:buf - else - exe "silent bd" a:buf - end - - setlocal modifiable - normal! "_dd - setlocal nomodifiable - " Delete the buffer from the raw buffer list. - call filter(s:raw_buffer_listing, 'v:val.attributes !~ " '.a:buf.' "') - catch - call s:Error(v:exception) - endtry -endfunction - -" Close {{{1 -function s:Close() - " Get only the listed buffers. - let listed = filter(copy(s:MRUList), "buflisted(v:val)") - " If we needed to split the main window, close the split one. - if (s:splitMode != "") - exec "wincmd c" - end - - for b in reverse(listed[0:1]) - exec "keepjumps silent b ".b - endfor -endfunction - -" ToggleSplitOutPathName {{{1 -function s:ToggleSplitOutPathName() - let g:bufExplorerSplitOutPathName = !g:bufExplorerSplitOutPathName - call s:RebuildBufferList() - call s:UpdateHelpStatus() -endfunction - -" ToggleShowRelativePath {{{1 -function s:ToggleShowRelativePath() - let g:bufExplorerShowRelativePath = !g:bufExplorerShowRelativePath - call s:RebuildBufferList() - call s:UpdateHelpStatus() -endfunction - -" ToggleShowUnlisted {{{1 -function s:ToggleShowUnlisted() - let g:bufExplorerShowUnlisted = !g:bufExplorerShowUnlisted - let num_bufs = s:RebuildBufferList(g:bufExplorerShowUnlisted == 0) - call s:UpdateHelpStatus() -endfunction - -" ToggleFindActive {{{1 -function s:ToggleFindActive() - let g:bufExplorerFindActive = !g:bufExplorerFindActive - call s:UpdateHelpStatus() -endfunction - -" RebuildBufferList {{{1 -function s:RebuildBufferList(...) - setlocal modifiable - - let curPos = getpos('.') - - if a:0 - " Clear the list first. - exec "keepjumps ".s:firstBufferLine.',$d "_' - endif - - let num_bufs = s:BuildBufferList() - - call setpos('.', curPos) - - setlocal nomodifiable - - return num_bufs -endfunction - -" UpdateHelpStatus {{{1 -function s:UpdateHelpStatus() - setlocal modifiable - - let text = s:GetHelpStatus() - call setline(s:firstBufferLine - 2, text) - - setlocal nomodifiable -endfunction - -" MRUCmp {{{1 -function s:MRUCmp(line1, line2) - return index(s:MRUList, str2nr(a:line1)) - index(s:MRUList, str2nr(a:line2)) -endfunction - -" SortReverse {{{1 -function s:SortReverse() - let g:bufExplorerReverseSort = !g:bufExplorerReverseSort - - call s:ReSortListing() -endfunction - -" SortSelect {{{1 -function s:SortSelect() - let g:bufExplorerSortBy = get(s:sort_by, index(s:sort_by, g:bufExplorerSortBy) + 1, s:sort_by[0]) - - call s:ReSortListing() -endfunction - -" ReSortListing {{{1 -function s:ReSortListing() - setlocal modifiable - - let curPos = getpos('.') - - call s:SortListing() - call s:UpdateHelpStatus() - - call setpos('.', curPos) - - setlocal nomodifiable -endfunction - -" SortListing {{{1 -function s:SortListing() - let sort = s:firstBufferLine.",$sort".((g:bufExplorerReverseSort == 1) ? "!": "") - - if g:bufExplorerSortBy == "number" - " Easiest case. - exec sort 'n' - elseif g:bufExplorerSortBy == "name" - if g:bufExplorerSplitOutPathName - exec sort 'ir /\d.\{7}\zs\f\+\ze/' - else - exec sort 'ir /\zs[^\/\\]\+\ze\s*line/' - endif - elseif g:bufExplorerSortBy == "fullpath" - if g:bufExplorerSplitOutPathName - " Sort twice - first on the file name then on the path. - exec sort 'ir /\d.\{7}\zs\f\+\ze/' - endif - - exec sort 'ir /\zs\f\+\ze\s\+line/' - elseif g:bufExplorerSortBy == "extension" - exec sort 'ir /\.\zs\w\+\ze\s/' - elseif g:bufExplorerSortBy == "mru" - let l = getline(s:firstBufferLine, "$") - - call sort(l, "MRUCmp") - - if g:bufExplorerReverseSort - call reverse(l) - endif - - call setline(s:firstBufferLine, l) - endif -endfunction - -" MRUListShow {{{1 -function s:MRUListShow() - echomsg "MRUList=".string(s:MRUList) -endfunction - -" Error {{{1 -function s:Error(msg) - echohl ErrorMsg | echo a:msg | echohl none -endfunction - -" Warning {{{1 -function s:Warning(msg) - echohl WarningMsg | echo a:msg | echohl none -endfunction - -" GetTabNbr {{{1 -function s:GetTabNbr(bufNbr) - " Searching buffer bufno, in tabs. - for i in range(tabpagenr("$")) - if index(tabpagebuflist(i + 1), a:bufNbr) != -1 - return i + 1 - endif - endfor - - return 0 -endfunction - -" GetWinNbr" {{{1 -function s:GetWinNbr(tabNbr, bufNbr) - " window number in tabpage. - return index(tabpagebuflist(a:tabNbr), a:bufNbr) + 1 -endfunction - -" Winmanager Integration {{{1 -let g:BufExplorer_title = "\[Buf\ List\]" -call s:Set("g:bufExplorerResize", 1) -call s:Set("g:bufExplorerMaxHeight", 25) " Handles dynamic resizing of the window. - -" Function to start display. Set the mode to 'winmanager' for this buffer. -" This is to figure out how this plugin was called. In a standalone fashion -" or by winmanager. -function BufExplorer_Start() - let b:displayMode = "winmanager" - call StartBufExplorer("e") -endfunction - -" Returns whether the display is okay or not. -function BufExplorer_IsValid() - return 0 -endfunction - -" Handles dynamic refreshing of the window. -function BufExplorer_Refresh() - let b:displayMode = "winmanager" - call StartBufExplorer("e") -endfunction - -function BufExplorer_ReSize() - if !g:bufExplorerResize - return - end - - let nlines = min([line("$"), g:bufExplorerMaxHeight]) - - exe nlines." wincmd _" - - " The following lines restore the layout so that the last file line is also - " the last window line. Sometimes, when a line is deleted, although the - " window size is exactly equal to the number of lines in the file, some of - " the lines are pushed up and we see some lagging '~'s. - let pres = getpos(".") - - exe $ - - let _scr = &scrolloff - let &scrolloff = 0 - - normal! z- - - let &scrolloff = _scr - - call setpos(".", pres) -endfunction -"1}}} - -" vim:ft=vim foldmethod=marker sw=2