summaryrefslogtreecommitdiff
path: root/autoload/l9/quickfix.vim
diff options
context:
space:
mode:
Diffstat (limited to 'autoload/l9/quickfix.vim')
-rw-r--r--autoload/l9/quickfix.vim107
1 files changed, 107 insertions, 0 deletions
diff --git a/autoload/l9/quickfix.vim b/autoload/l9/quickfix.vim
new file mode 100644
index 0000000..1758b39
--- /dev/null
+++ b/autoload/l9/quickfix.vim
@@ -0,0 +1,107 @@
+"=============================================================================
+" Copyright (C) 2009-2010 Takeshi NISHIDA
+"
+"=============================================================================
+" LOAD GUARD {{{1
+
+if !l9#guardScriptLoading(expand('<sfile>:p'), 0, 0, [])
+ finish
+endif
+
+" }}}1
+"=============================================================================
+" QUICKFIX {{{1
+
+" Returns non-zero if quickfix window is opened.
+function l9#quickfix#isWindowOpened()
+ return count(map(range(1, winnr('$')), 'getwinvar(v:val, "&buftype")'), 'quickfix') > 0
+endfunction
+
+" Opens quickfix window if quickfix is not empty, and echo the number of errors.
+"
+" a:onlyRecognized: if non-zero, opens only if quickfix has recognized errors.
+" a:holdCursor: if non-zero, the cursor won't move to quickfix window.
+function l9#quickfix#openIfNotEmpty(onlyRecognized, holdCursor)
+ let numErrors = len(filter(getqflist(), 'v:val.valid'))
+ let numOthers = len(getqflist()) - numErrors
+ if numErrors > 0 || (!a:onlyRecognized && numOthers > 0)
+ copen
+ if a:holdCursor
+ wincmd p
+ endif
+ else
+ cclose
+ endif
+ redraw
+ if numOthers > 0
+ echo printf('Quickfix: %d(+%d)', numErrors, numOthers)
+ else
+ echo printf('Quickfix: %d', numErrors)
+ endif
+endfunction
+
+" Toggles Quickfix window
+function l9#quickfix#toggleWindow()
+ if l9#quickfix#isWindowOpened()
+ cclose
+ else
+ call l9#quickfix#openIfNotEmpty(0, 0)
+ endif
+endfunction
+
+" Creates quickfix list form given lines and opens the quickfix window if
+" errors exists.
+"
+" a:lines:
+" a:jump: if non-zero, jump to the first error.
+function l9#quickfix#setMakeResult(lines)
+ cexpr a:lines
+ call l9#quickfix#openIfNotEmpty(0, 1)
+endfunction
+
+" Compares quickfix entries for sorting.
+function l9#quickfix#compareEntries(e0, e1)
+ if a:e0.bufnr != a:e1.bufnr
+ let i0 = bufname(a:e0.bufnr)
+ let i1 = bufname(a:e1.bufnr)
+ elseif a:e0.lnum != a:e1.lnum
+ let i0 = a:e0.lnum
+ let i1 = a:e1.lnum
+ elseif a:e0.col != a:e1.col
+ let i0 = a:e0.col
+ let i1 = a:e1.col
+ else
+ return 0
+ endif
+ return (i0 > i1 ? +1 : -1)
+endfunction
+
+" Sorts quickfix
+function l9#quickfix#sort()
+ call setqflist(sort(getqflist(), 'l9#quickfix#compareEntries'), 'r')
+endfunction
+
+" Highlights Quickfix lines by :sign.
+" Inspired by errormarker plugin.
+"
+" You can customize the highlighting via L9ErrorLine and L9WarningLine
+" highlight groups.
+function l9#quickfix#placeSign()
+ let warnings = []
+ let errors = []
+ for e in filter(getqflist(), 'v:val.valid')
+ let warning = (e.type ==? 'w' || e.text =~? '^\s*warning:')
+ call add((warning ? warnings : errors), [e.bufnr, e.lnum])
+ endfor
+ sign unplace *
+ call l9#placeSign('L9WarningLine', '>>', '', warnings)
+ call l9#placeSign('L9ErrorLine', '>>', '', errors)
+endfunction
+
+highlight default L9ErrorLine ctermfg=white ctermbg=52 guibg=#5F0000
+highlight default L9WarningLine ctermfg=white ctermbg=17 guibg=#00005F
+
+" }}}1
+"=============================================================================
+" vim: set fdm=marker:
+