From 6574151a510c06a948b6cade8222a4f4ea8b92db Mon Sep 17 00:00:00 2001 From: colben Date: Sun, 29 Aug 2021 00:05:19 +0800 Subject: [PATCH] first commit --- autoload/gocomplete.vim | 87 ++ autoload/nerdtree.vim | 200 +++++ autoload/nerdtree/ui_glue.vim | 649 ++++++++++++++ colors/atom-dark-256.vim | 1314 ++++++++++++++++++++++++++++ colors/atom-dark.vim | 115 +++ ctags.conf | 5 + doc/NERDTree.txt | 1328 +++++++++++++++++++++++++++++ doc/NERD_tree.txt | 1238 +++++++++++++++++++++++++++ doc/asyncrun.txt | 431 ++++++++++ doc/buffergator.txt | 335 ++++++++ ftplugin/go/gocomplete.vim | 1 + gvimrc | 430 ++++++++++ lib/nerdtree/bookmark.vim | 354 ++++++++ lib/nerdtree/creator.vim | 389 +++++++++ lib/nerdtree/event.vim | 13 + lib/nerdtree/flag_set.vim | 58 ++ lib/nerdtree/key_map.vim | 163 ++++ lib/nerdtree/menu_controller.vim | 186 ++++ lib/nerdtree/menu_item.vim | 114 +++ lib/nerdtree/nerdtree.vim | 208 +++++ lib/nerdtree/notifier.vim | 34 + lib/nerdtree/opener.vim | 352 ++++++++ lib/nerdtree/path.vim | 869 +++++++++++++++++++ lib/nerdtree/tree_dir_node.vim | 679 +++++++++++++++ lib/nerdtree/tree_file_node.vim | 347 ++++++++ lib/nerdtree/ui.vim | 516 +++++++++++ nerdtree_plugin/exec_menuitem.vim | 40 + nerdtree_plugin/fs_menu.vim | 368 ++++++++ plugin/NERD_tree.vim | 242 ++++++ plugin/asyncrun.vim | 1118 ++++++++++++++++++++++++ plugin/buffergator.vim | 132 +++ plugin/template.vim | 66 ++ syntax/c.vim | 36 + syntax/go.vim | 404 +++++++++ syntax/nerdtree.vim | 91 ++ templates/common/ext/html | 10 + templates/dynamic/ext/c | 9 + templates/dynamic/ext/h | 14 + templates/dynamic/ext/py | 19 + templates/dynamic/ext/sh | 49 ++ templates/dynamic/full/.gitignore | 10 + templates/dynamic/full/MAKEFILE | 1 + templates/dynamic/full/Makefile | 33 + templates/dynamic/full/makefile | 1 + vimrc | 425 +++++++++ 45 files changed, 13483 insertions(+) create mode 100644 autoload/gocomplete.vim create mode 100644 autoload/nerdtree.vim create mode 100644 autoload/nerdtree/ui_glue.vim create mode 100644 colors/atom-dark-256.vim create mode 100644 colors/atom-dark.vim create mode 100644 ctags.conf create mode 100644 doc/NERDTree.txt create mode 100644 doc/NERD_tree.txt create mode 100644 doc/asyncrun.txt create mode 100644 doc/buffergator.txt create mode 100644 ftplugin/go/gocomplete.vim create mode 100644 gvimrc create mode 100644 lib/nerdtree/bookmark.vim create mode 100644 lib/nerdtree/creator.vim create mode 100644 lib/nerdtree/event.vim create mode 100644 lib/nerdtree/flag_set.vim create mode 100644 lib/nerdtree/key_map.vim create mode 100644 lib/nerdtree/menu_controller.vim create mode 100644 lib/nerdtree/menu_item.vim create mode 100644 lib/nerdtree/nerdtree.vim create mode 100644 lib/nerdtree/notifier.vim create mode 100644 lib/nerdtree/opener.vim create mode 100644 lib/nerdtree/path.vim create mode 100644 lib/nerdtree/tree_dir_node.vim create mode 100644 lib/nerdtree/tree_file_node.vim create mode 100644 lib/nerdtree/ui.vim create mode 100644 nerdtree_plugin/exec_menuitem.vim create mode 100644 nerdtree_plugin/fs_menu.vim create mode 100644 plugin/NERD_tree.vim create mode 100644 plugin/asyncrun.vim create mode 100644 plugin/buffergator.vim create mode 100644 plugin/template.vim create mode 100644 syntax/c.vim create mode 100644 syntax/go.vim create mode 100644 syntax/nerdtree.vim create mode 100644 templates/common/ext/html create mode 100755 templates/dynamic/ext/c create mode 100755 templates/dynamic/ext/h create mode 100755 templates/dynamic/ext/py create mode 100755 templates/dynamic/ext/sh create mode 100755 templates/dynamic/full/.gitignore create mode 120000 templates/dynamic/full/MAKEFILE create mode 100755 templates/dynamic/full/Makefile create mode 120000 templates/dynamic/full/makefile create mode 100644 vimrc diff --git a/autoload/gocomplete.vim b/autoload/gocomplete.vim new file mode 100644 index 0000000..59f6868 --- /dev/null +++ b/autoload/gocomplete.vim @@ -0,0 +1,87 @@ +if exists('g:loaded_gocode') + finish +endif +let g:loaded_gocode = 1 + +fu! s:gocodeCurrentBuffer() + let buf = getline(1, '$') + if &encoding != 'utf-8' + let buf = map(buf, 'iconv(v:val, &encoding, "utf-8")') + endif + if &l:fileformat == 'dos' + " XXX: line2byte() depend on 'fileformat' option. + " so if fileformat is 'dos', 'buf' must include '\r'. + let buf = map(buf, 'v:val."\r"') + endif + let file = tempname() + call writefile(buf, file) + return file +endf + +let s:vim_system = get(g:, 'gocomplete#system_function', 'system') + +fu! s:system(str, ...) + return call(s:vim_system, [a:str] + a:000) +endf + +fu! s:gocodeShellescape(arg) + try + let ssl_save = &shellslash + set noshellslash + return shellescape(a:arg) + finally + let &shellslash = ssl_save + endtry +endf + +fu! s:gocodeCommand(cmd, preargs, args) + for i in range(0, len(a:args) - 1) + let a:args[i] = s:gocodeShellescape(a:args[i]) + endfor + for i in range(0, len(a:preargs) - 1) + let a:preargs[i] = s:gocodeShellescape(a:preargs[i]) + endfor + let result = s:system(printf('gocode %s %s %s', join(a:preargs), a:cmd, join(a:args))) + if v:shell_error != 0 + return "[\"0\", []]" + else + if &encoding != 'utf-8' + let result = iconv(result, 'utf-8', &encoding) + endif + return result + endif +endf + +fu! s:gocodeCurrentBufferOpt(filename) + return '-in=' . a:filename +endf + +fu! s:gocodeCursor() + if &encoding != 'utf-8' + let c = col('.') + let buf = line('.') == 1 ? "" : (join(getline(1, line('.')-1), "\n") . "\n") + let buf .= c == 1 ? "" : getline('.')[:c-2] + return printf('%d', len(iconv(buf, &encoding, "utf-8"))) + endif + return printf('%d', line2byte(line('.')) + (col('.')-2)) +endf + +fu! s:gocodeAutocomplete() + let filename = s:gocodeCurrentBuffer() + let result = s:gocodeCommand('autocomplete', + \ [s:gocodeCurrentBufferOpt(filename), '-f=vim'], + \ [expand('%:p'), s:gocodeCursor()]) + call delete(filename) + return result +endf + +fu! gocomplete#Complete(findstart, base) + "findstart = 1 when we need to get the text length + if a:findstart == 1 + execute "silent let g:gocomplete_completions = " . s:gocodeAutocomplete() + return col('.') - g:gocomplete_completions[0] - 1 + "findstart = 0 when we need to return the list of completions + else + return g:gocomplete_completions[1] + endif +endf diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim new file mode 100644 index 0000000..bdf3deb --- /dev/null +++ b/autoload/nerdtree.vim @@ -0,0 +1,200 @@ +if exists("g:loaded_nerdtree_autoload") + finish +endif +let g:loaded_nerdtree_autoload = 1 + +function! nerdtree#version() + return '5.0.0' +endfunction + +" SECTION: General Functions {{{1 +"============================================================ + +"FUNCTION: nerdtree#checkForBrowse(dir) {{{2 +"inits a window tree in the current buffer if appropriate +function! nerdtree#checkForBrowse(dir) + if !isdirectory(a:dir) + return + endif + + if s:reuseWin(a:dir) + return + endif + + call g:NERDTreeCreator.CreateWindowTree(a:dir) +endfunction + +"FUNCTION: s:reuseWin(dir) {{{2 +"finds a NERDTree buffer with root of dir, and opens it. +function! s:reuseWin(dir) abort + let path = g:NERDTreePath.New(fnamemodify(a:dir, ":p")) + + for i in range(1, bufnr("$")) + unlet! nt + let nt = getbufvar(i, "NERDTree") + if empty(nt) + continue + endif + + if nt.isWinTree() && nt.root.path.equals(path) + call nt.setPreviousBuf(bufnr("#")) + exec "buffer " . i + return 1 + endif + endfor + + return 0 +endfunction + +" FUNCTION: nerdtree#completeBookmarks(A,L,P) {{{2 +" completion function for the bookmark commands +function! nerdtree#completeBookmarks(A,L,P) + return filter(g:NERDTreeBookmark.BookmarkNames(), 'v:val =~# "^' . a:A . '"') +endfunction + +"FUNCTION: nerdtree#compareNodes(dir) {{{2 +function! nerdtree#compareNodes(n1, n2) + return a:n1.path.compareTo(a:n2.path) +endfunction + +"FUNCTION: nerdtree#compareNodesBySortKey(n1, n2) {{{2 +function! nerdtree#compareNodesBySortKey(n1, n2) + let sortKey1 = a:n1.path.getSortKey() + let sortKey2 = a:n2.path.getSortKey() + let i = 0 + while i < min([len(sortKey1), len(sortKey2)]) + " Compare chunks upto common length. + " If chunks have different type, the one which has + " integer type is the lesser. + if type(sortKey1[i]) == type(sortKey2[i]) + if sortKey1[i] <# sortKey2[i] + return - 1 + elseif sortKey1[i] ># sortKey2[i] + return 1 + endif + elseif type(sortKey1[i]) == v:t_number + return -1 + elseif type(sortKey2[i]) == v:t_number + return 1 + endif + let i = i + 1 + endwhile + + " Keys are identical upto common length. + " The key which has smaller chunks is the lesser one. + if len(sortKey1) < len(sortKey2) + return -1 + elseif len(sortKey1) > len(sortKey2) + return 1 + else + return 0 + endif +endfunction + +" FUNCTION: nerdtree#deprecated(func, [msg]) {{{2 +" Issue a deprecation warning for a:func. If a second arg is given, use this +" as the deprecation message +function! nerdtree#deprecated(func, ...) + let msg = a:0 ? a:func . ' ' . a:1 : a:func . ' is deprecated' + + if !exists('s:deprecationWarnings') + let s:deprecationWarnings = {} + endif + if !has_key(s:deprecationWarnings, a:func) + let s:deprecationWarnings[a:func] = 1 + echomsg msg + endif +endfunction + +" FUNCTION: nerdtree#exec(cmd) {{{2 +" Same as :exec cmd but with eventignore set for the duration +" to disable the autocommands used by NERDTree (BufEnter, +" BufLeave and VimEnter) +function! nerdtree#exec(cmd) + let old_ei = &ei + set ei=BufEnter,BufLeave,VimEnter + exec a:cmd + let &ei = old_ei +endfunction + +" FUNCTION: nerdtree#has_opt(options, name) {{{2 +function! nerdtree#has_opt(options, name) + return has_key(a:options, a:name) && a:options[a:name] == 1 +endfunction + +" FUNCTION: nerdtree#loadClassFiles() {{{2 +function! nerdtree#loadClassFiles() + runtime lib/nerdtree/path.vim + runtime lib/nerdtree/menu_controller.vim + runtime lib/nerdtree/menu_item.vim + runtime lib/nerdtree/key_map.vim + runtime lib/nerdtree/bookmark.vim + runtime lib/nerdtree/tree_file_node.vim + runtime lib/nerdtree/tree_dir_node.vim + runtime lib/nerdtree/opener.vim + runtime lib/nerdtree/creator.vim + runtime lib/nerdtree/flag_set.vim + runtime lib/nerdtree/nerdtree.vim + runtime lib/nerdtree/ui.vim + runtime lib/nerdtree/event.vim + runtime lib/nerdtree/notifier.vim +endfunction + +" FUNCTION: nerdtree#postSourceActions() {{{2 +function! nerdtree#postSourceActions() + call g:NERDTreeBookmark.CacheBookmarks(1) + call nerdtree#ui_glue#createDefaultBindings() + + "load all nerdtree plugins + runtime! nerdtree_plugin/**/*.vim +endfunction + +"FUNCTION: nerdtree#runningWindows(dir) {{{2 +function! nerdtree#runningWindows() + return has("win16") || has("win32") || has("win64") +endfunction + +"FUNCTION: nerdtree#runningCygwin(dir) {{{2 +function! nerdtree#runningCygwin() + return has("win32unix") +endfunction + +" SECTION: View Functions {{{1 +"============================================================ + +"FUNCTION: nerdtree#echo {{{2 +"A wrapper for :echo. Appends 'NERDTree:' on the front of all messages +" +"Args: +"msg: the message to echo +function! nerdtree#echo(msg) + redraw + echomsg "NERDTree: " . a:msg +endfunction + +"FUNCTION: nerdtree#echoError {{{2 +"Wrapper for nerdtree#echo, sets the message type to errormsg for this message +"Args: +"msg: the message to echo +function! nerdtree#echoError(msg) + echohl errormsg + call nerdtree#echo(a:msg) + echohl normal +endfunction + +"FUNCTION: nerdtree#echoWarning {{{2 +"Wrapper for nerdtree#echo, sets the message type to warningmsg for this message +"Args: +"msg: the message to echo +function! nerdtree#echoWarning(msg) + echohl warningmsg + call nerdtree#echo(a:msg) + echohl normal +endfunction + +"FUNCTION: nerdtree#renderView {{{2 +function! nerdtree#renderView() + call b:NERDTree.render() +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/autoload/nerdtree/ui_glue.vim b/autoload/nerdtree/ui_glue.vim new file mode 100644 index 0000000..12dd9ae --- /dev/null +++ b/autoload/nerdtree/ui_glue.vim @@ -0,0 +1,649 @@ +if exists("g:loaded_nerdtree_ui_glue_autoload") + finish +endif +let g:loaded_nerdtree_ui_glue_autoload = 1 + +" FUNCTION: nerdtree#ui_glue#createDefaultBindings() {{{1 +function! nerdtree#ui_glue#createDefaultBindings() + let s = '' . s:SID() . '_' + + call NERDTreeAddKeyMap({ 'key': '', 'scope': 'all', 'callback': s . 'handleMiddleMouse' }) + call NERDTreeAddKeyMap({ 'key': '', 'scope': "all", 'callback': s."handleLeftClick" }) + call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "DirNode", 'callback': s."activateDirNode" }) + call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "FileNode", 'callback': s."activateFileNode" }) + call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "Bookmark", 'callback': s."activateBookmark" }) + call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "all", 'callback': s."activateAll" }) + + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "DirNode", 'callback': s."activateDirNode" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "FileNode", 'callback': s."activateFileNode" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "Bookmark", 'callback': s."activateBookmark" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "all", 'callback': s."activateAll" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenSplit, 'scope': "Node", 'callback': s."openHSplit" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenVSplit, 'scope': "Node", 'callback': s."openVSplit" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreview, 'scope': "Node", 'callback': s."previewNodeCurrent" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewVSplit, 'scope': "Node", 'callback': s."previewNodeVSplit" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewSplit, 'scope': "Node", 'callback': s."previewNodeHSplit" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenRecursively, 'scope': "DirNode", 'callback': s."openNodeRecursively" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapUpdir, 'scope': 'all', 'callback': s . 'upDirCurrentRootClosed' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapUpdirKeepOpen, 'scope': 'all', 'callback': s . 'upDirCurrentRootOpen' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapChangeRoot, 'scope': 'Node', 'callback': s . 'chRoot' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapChdir, 'scope': "Node", 'callback': s."chCwd" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapQuit, 'scope': "all", 'callback': s."closeTreeWindow" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCWD, 'scope': "all", 'callback': "nerdtree#ui_glue#chRootCwd" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapRefreshRoot, 'scope': "all", 'callback': s."refreshRoot" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapRefresh, 'scope': "Node", 'callback': s."refreshCurrent" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapHelp, 'scope': "all", 'callback': s."displayHelp" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleZoom, 'scope': "all", 'callback': s."toggleZoom" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleHidden, 'scope': "all", 'callback': s."toggleShowHidden" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleFilters, 'scope': "all", 'callback': s."toggleIgnoreFilter" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleFiles, 'scope': "all", 'callback': s."toggleShowFiles" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleBookmarks, 'scope': "all", 'callback': s."toggleShowBookmarks" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCloseDir, 'scope': "Node", 'callback': s."closeCurrentDir" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCloseChildren, 'scope': "DirNode", 'callback': s."closeChildren" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapMenu, 'scope': "Node", 'callback': s."showMenu" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpParent, 'scope': "Node", 'callback': s."jumpToParent" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpFirstChild, 'scope': "Node", 'callback': s."jumpToFirstChild" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpLastChild, 'scope': "Node", 'callback': s."jumpToLastChild" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpRoot, 'scope': "all", 'callback': s."jumpToRoot" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpNextSibling, 'scope': "Node", 'callback': s."jumpToNextSibling" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpPrevSibling, 'scope': "Node", 'callback': s."jumpToPrevSibling" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': 'Node', 'callback': s . 'openInNewTab' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': 'Node', 'callback': s . 'openInNewTabSilent' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': 'Bookmark', 'callback': s . 'openInNewTab' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': 'Bookmark', 'callback': s . 'openInNewTabSilent' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenExpl, 'scope': "DirNode", 'callback': s."openExplorer" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapDeleteBookmark, 'scope': "Bookmark", 'callback': s."deleteBookmark" }) +endfunction + + +"SECTION: Interface bindings {{{1 +"============================================================ + +"FUNCTION: s:activateAll() {{{1 +"handle the user activating the updir line +function! s:activateAll() + if getline(".") ==# g:NERDTreeUI.UpDirLine() + return nerdtree#ui_glue#upDir(0) + endif +endfunction + +" FUNCTION: s:activateDirNode(directoryNode) {{{1 +function! s:activateDirNode(directoryNode) + + if a:directoryNode.isRoot() && a:directoryNode.isOpen + call nerdtree#echo('cannot close tree root') + return + endif + + call a:directoryNode.activate() +endfunction + +"FUNCTION: s:activateFileNode() {{{1 +"handle the user activating a tree node +function! s:activateFileNode(node) + call a:node.activate({'reuse': 'all', 'where': 'p'}) +endfunction + +"FUNCTION: s:activateBookmark() {{{1 +"handle the user activating a bookmark +function! s:activateBookmark(bm) + call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'p'} : {}) +endfunction + +" FUNCTION: nerdtree#ui_glue#bookmarkNode(name) {{{1 +" Associate the current node with the given name +function! nerdtree#ui_glue#bookmarkNode(...) + let currentNode = g:NERDTreeFileNode.GetSelected() + if currentNode != {} + let name = a:1 + if empty(name) + let name = currentNode.path.getLastPathComponent(0) + endif + try + call currentNode.bookmark(name) + call b:NERDTree.render() + catch /^NERDTree.IllegalBookmarkNameError/ + call nerdtree#echo("bookmark names must not contain spaces") + endtry + else + call nerdtree#echo("select a node first") + endif +endfunction + +" FUNCTION: s:chCwd(node) {{{1 +function! s:chCwd(node) + try + call a:node.path.changeToDir() + catch /^NERDTree.PathChangeError/ + call nerdtree#echoWarning("could not change cwd") + endtry +endfunction + +" FUNCTION: s:chRoot(node) {{{1 +" changes the current root to the selected one +function! s:chRoot(node) + call b:NERDTree.changeRoot(a:node) +endfunction + +" FUNCTION: s:nerdtree#ui_glue#chRootCwd() {{{1 +" Change the NERDTree root to match the current working directory. +function! nerdtree#ui_glue#chRootCwd() + NERDTreeCWD +endfunction + +" FUNCTION: nnerdtree#ui_glue#clearBookmarks(bookmarks) {{{1 +function! nerdtree#ui_glue#clearBookmarks(bookmarks) + if a:bookmarks ==# '' + let currentNode = g:NERDTreeFileNode.GetSelected() + if currentNode != {} + call currentNode.clearBookmarks() + endif + else + for name in split(a:bookmarks, ' ') + let bookmark = g:NERDTreeBookmark.BookmarkFor(name) + call bookmark.delete() + endfor + endif + call b:NERDTree.root.refresh() + call b:NERDTree.render() +endfunction + +" FUNCTION: s:closeChildren(node) {{{1 +" closes all childnodes of the current node +function! s:closeChildren(node) + call a:node.closeChildren() + call b:NERDTree.render() + call a:node.putCursorHere(0, 0) +endfunction + +" FUNCTION: s:closeCurrentDir(node) {{{1 +" Close the parent directory of the current node. +function! s:closeCurrentDir(node) + + if a:node.isRoot() + call nerdtree#echo('cannot close parent of tree root') + return + endif + + let l:parent = a:node.parent + + while l:parent.isCascadable() + let l:parent = l:parent.parent + endwhile + + if l:parent.isRoot() + call nerdtree#echo('cannot close tree root') + return + endif + + call l:parent.close() + call b:NERDTree.render() + call l:parent.putCursorHere(0, 0) +endfunction + +" FUNCTION: s:closeTreeWindow() {{{1 +" close the tree window +function! s:closeTreeWindow() + if b:NERDTree.isWinTree() && b:NERDTree.previousBuf() != -1 + exec "buffer " . b:NERDTree.previousBuf() + else + if winnr("$") > 1 + call g:NERDTree.Close() + else + call nerdtree#echo("Cannot close last window") + endif + endif +endfunction + +" FUNCTION: s:deleteBookmark(bookmark) {{{1 +" Prompt the user to confirm the deletion of the selected bookmark. +function! s:deleteBookmark(bookmark) + let l:message = "Delete the bookmark \"" . a:bookmark.name + \ . "\" from the bookmark list?" + + let l:choices = "&Yes\n&No" + + echo | redraw + let l:selection = confirm(l:message, l:choices, 1, 'Warning') + + if l:selection != 1 + call nerdtree#echo('bookmark not deleted') + return + endif + + try + call a:bookmark.delete() + silent call b:NERDTree.root.refresh() + call b:NERDTree.render() + echo | redraw + catch /^NERDTree/ + call nerdtree#echoWarning('could not remove bookmark') + endtry +endfunction + +" FUNCTION: s:displayHelp() {{{1 +" toggles the help display +function! s:displayHelp() + call b:NERDTree.ui.toggleHelp() + call b:NERDTree.render() + call b:NERDTree.ui.centerView() +endfunction + +" FUNCTION: s:findAndRevealPath(pathStr) {{{1 +function! s:findAndRevealPath(pathStr) + let l:pathStr = !empty(a:pathStr) ? a:pathStr : expand('%:p') + + if empty(l:pathStr) + call nerdtree#echoWarning('no file for the current buffer') + return + endif + + try + let l:pathStr = g:NERDTreePath.Resolve(l:pathStr) + let l:pathObj = g:NERDTreePath.New(l:pathStr) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echoWarning('invalid path') + return + endtry + + if !g:NERDTree.ExistsForTab() + try + let l:cwd = g:NERDTreePath.New(getcwd()) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echo('current directory does not exist.') + let l:cwd = l:pathObj.getParent() + endtry + + if l:pathObj.isUnder(l:cwd) + call g:NERDTreeCreator.CreateTabTree(l:cwd.str()) + else + call g:NERDTreeCreator.CreateTabTree(l:pathObj.getParent().str()) + endif + else + NERDTreeFocus + + if !l:pathObj.isUnder(b:NERDTree.root.path) + call s:chRoot(g:NERDTreeDirNode.New(l:pathObj.getParent(), b:NERDTree)) + endif + endif + + if l:pathObj.isHiddenUnder(b:NERDTree.root.path) + call b:NERDTree.ui.setShowHidden(1) + endif + + let l:node = b:NERDTree.root.reveal(l:pathObj) + call b:NERDTree.render() + call l:node.putCursorHere(1, 0) +endfunction + +"FUNCTION: s:handleLeftClick() {{{1 +"Checks if the click should open the current node +function! s:handleLeftClick() + let currentNode = g:NERDTreeFileNode.GetSelected() + if currentNode != {} + + "the dir arrows are multibyte chars, and vim's string functions only + "deal with single bytes - so split the line up with the hack below and + "take the line substring manually + let line = split(getline(line(".")), '\zs') + let startToCur = "" + for i in range(0,len(line)-1) + let startToCur .= line[i] + endfor + + if currentNode.path.isDirectory + if startToCur =~# g:NERDTreeUI.MarkupReg() && startToCur =~# '[+~'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.'] \?$' + call currentNode.activate() + return + endif + endif + + if (g:NERDTreeMouseMode ==# 2 && currentNode.path.isDirectory) || g:NERDTreeMouseMode ==# 3 + let char = strpart(startToCur, strlen(startToCur)-1, 1) + if char !~# g:NERDTreeUI.MarkupReg() + if currentNode.path.isDirectory + call currentNode.activate() + else + call currentNode.activate({'reuse': 'all', 'where': 'p'}) + endif + return + endif + endif + endif +endfunction + +" FUNCTION: s:handleMiddleMouse() {{{1 +function! s:handleMiddleMouse() + + " A middle mouse click does not automatically position the cursor as one + " would expect. Forcing the execution of a regular left mouse click here + " fixes this problem. + execute "normal! \" + + let l:currentNode = g:NERDTreeFileNode.GetSelected() + if empty(l:currentNode) + call nerdtree#echoError('use the pointer to select a node') + return + endif + + if l:currentNode.path.isDirectory + call l:currentNode.openExplorer() + else + call l:currentNode.open({'where': 'h'}) + endif +endfunction + +" FUNCTION: nerdtree#ui_glue#invokeKeyMap(key) {{{1 +"this is needed since I cant figure out how to invoke dict functions from a +"key map +function! nerdtree#ui_glue#invokeKeyMap(key) + call g:NERDTreeKeyMap.Invoke(a:key) +endfunction + +" FUNCTION: s:jumpToFirstChild(node) {{{1 +function! s:jumpToFirstChild(node) + call s:jumpToChild(a:node, 0) +endfunction + +" FUNCTION: s:jumpToLastChild(node) {{{1 +function! s:jumpToLastChild(node) + call s:jumpToChild(a:node, 1) +endfunction + +" FUNCTION: s:jumpToChild(node, last) {{{2 +" Jump to the first or last child node at the same file system level. +" +" Args: +" node: the node on which the cursor currently sits +" last: 1 (true) if jumping to last child, 0 (false) if jumping to first +function! s:jumpToChild(node, last) + let l:node = a:node.path.isDirectory ? a:node.getCascadeRoot() : a:node + + if l:node.isRoot() + return + endif + + let l:parent = l:node.parent + let l:children = l:parent.getVisibleChildren() + + let l:target = a:last ? l:children[len(l:children) - 1] : l:children[0] + + call l:target.putCursorHere(1, 0) + call b:NERDTree.ui.centerView() +endfunction + +" FUNCTION: s:jumpToParent(node) {{{1 +" Move the cursor to the parent of the specified node. For a cascade, move to +" the parent of the cascade's first node. At the root node, do nothing. +function! s:jumpToParent(node) + let l:node = a:node.path.isDirectory ? a:node.getCascadeRoot() : a:node + + if l:node.isRoot() + return + endif + + if empty(l:node.parent) + call nerdtree#echo('could not jump to parent node') + return + endif + + call l:node.parent.putCursorHere(1, 0) + call b:NERDTree.ui.centerView() +endfunction + +" FUNCTION: s:jumpToRoot() {{{1 +" moves the cursor to the root node +function! s:jumpToRoot() + call b:NERDTree.root.putCursorHere(1, 0) + call b:NERDTree.ui.centerView() +endfunction + +" FUNCTION: s:jumpToNextSibling(node) {{{1 +function! s:jumpToNextSibling(node) + call s:jumpToSibling(a:node, 1) +endfunction + +" FUNCTION: s:jumpToPrevSibling(node) {{{1 +function! s:jumpToPrevSibling(node) + call s:jumpToSibling(a:node, 0) +endfunction + +" FUNCTION: s:jumpToSibling(node, forward) {{{2 +" Move the cursor to the next or previous node at the same file system level. +" +" Args: +" node: the node on which the cursor currently sits +" forward: 0 to jump to previous sibling, 1 to jump to next sibling +function! s:jumpToSibling(node, forward) + let l:node = a:node.path.isDirectory ? a:node.getCascadeRoot() : a:node + let l:sibling = l:node.findSibling(a:forward) + + if empty(l:sibling) + return + endif + + call l:sibling.putCursorHere(1, 0) + call b:NERDTree.ui.centerView() +endfunction + +" FUNCTION: nerdtree#ui_glue#openBookmark(name) {{{1 +" Open the Bookmark that has the specified name. This function provides the +" implementation for the ":OpenBookmark" command. +function! nerdtree#ui_glue#openBookmark(name) + try + let l:bookmark = g:NERDTreeBookmark.BookmarkFor(a:name) + catch /^NERDTree.BookmarkNotFoundError/ + call nerdtree#echoError('bookmark "' . a:name . '" not found') + return + endtry + if l:bookmark.path.isDirectory + call l:bookmark.open(b:NERDTree) + else + call l:bookmark.open(b:NERDTree, {'where': 'p'}) + endif +endfunction + +" FUNCTION: s:openHSplit(target) {{{1 +function! s:openHSplit(target) + call a:target.activate({'where': 'h'}) +endfunction + +" FUNCTION: s:openVSplit(target) {{{1 +function! s:openVSplit(target) + call a:target.activate({'where': 'v'}) +endfunction + +" FUNCTION: s:openExplorer(node) {{{1 +function! s:openExplorer(node) + call a:node.openExplorer() +endfunction + +" FUNCTION: s:openInNewTab(target) {{{1 +function! s:openInNewTab(target) + let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't'}) + call l:opener.open(a:target) +endfunction + +" FUNCTION: s:openInNewTabSilent(target) {{{1 +function! s:openInNewTabSilent(target) + let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't', 'stay': 1}) + call l:opener.open(a:target) +endfunction + +" FUNCTION: s:openNodeRecursively(node) {{{1 +function! s:openNodeRecursively(node) + call nerdtree#echo("Recursively opening node. Please wait...") + call a:node.openRecursively() + call b:NERDTree.render() + redraw + call nerdtree#echo("Recursively opening node. Please wait... DONE") +endfunction + +"FUNCTION: s:previewNodeCurrent(node) {{{1 +function! s:previewNodeCurrent(node) + call a:node.open({'stay': 1, 'where': 'p', 'keepopen': 1}) +endfunction + +"FUNCTION: s:previewNodeHSplit(node) {{{1 +function! s:previewNodeHSplit(node) + call a:node.open({'stay': 1, 'where': 'h', 'keepopen': 1}) +endfunction + +"FUNCTION: s:previewNodeVSplit(node) {{{1 +function! s:previewNodeVSplit(node) + call a:node.open({'stay': 1, 'where': 'v', 'keepopen': 1}) +endfunction + +" FUNCTION: nerdtree#ui_glue#revealBookmark(name) {{{1 +" put the cursor on the node associate with the given name +function! nerdtree#ui_glue#revealBookmark(name) + try + let targetNode = g:NERDTreeBookmark.GetNodeForName(a:name, 0, b:NERDTree) + call targetNode.putCursorHere(0, 1) + catch /^NERDTree.BookmarkNotFoundError/ + call nerdtree#echo("Bookmark isnt cached under the current root") + endtry +endfunction + +" FUNCTION: s:refreshRoot() {{{1 +" Reloads the current root. All nodes below this will be lost and the root dir +" will be reloaded. +function! s:refreshRoot() + if !g:NERDTree.IsOpen() + return + endif + call nerdtree#echo("Refreshing the root node. This could take a while...") + + let l:curWin = winnr() + call nerdtree#exec(g:NERDTree.GetWinNum() . "wincmd w") + call b:NERDTree.root.refresh() + call b:NERDTree.render() + redraw + call nerdtree#exec(l:curWin . "wincmd w") + call nerdtree#echo("Refreshing the root node. This could take a while... DONE") +endfunction + +" FUNCTION: s:refreshCurrent(node) {{{1 +" refreshes the root for the current node +function! s:refreshCurrent(node) + let node = a:node + if !node.path.isDirectory + let node = node.parent + endif + + call nerdtree#echo("Refreshing node. This could take a while...") + call node.refresh() + call b:NERDTree.render() + redraw + call nerdtree#echo("Refreshing node. This could take a while... DONE") +endfunction + +" FUNCTION: nerdtree#ui_glue#setupCommands() {{{1 +function! nerdtree#ui_glue#setupCommands() + command! -n=? -complete=dir -bar NERDTree :call g:NERDTreeCreator.CreateTabTree('') + command! -n=? -complete=dir -bar NERDTreeToggle :call g:NERDTreeCreator.ToggleTabTree('') + command! -n=0 -bar NERDTreeClose :call g:NERDTree.Close() + command! -n=1 -complete=customlist,nerdtree#completeBookmarks -bar NERDTreeFromBookmark call g:NERDTreeCreator.CreateTabTree('') + command! -n=0 -bar NERDTreeMirror call g:NERDTreeCreator.CreateMirror() + command! -n=? -complete=file -bar NERDTreeFind call s:findAndRevealPath('') + command! -n=0 -bar NERDTreeRefreshRoot call s:refreshRoot() + command! -n=0 -bar NERDTreeFocus call NERDTreeFocus() + command! -n=0 -bar NERDTreeCWD call NERDTreeCWD() +endfunction + +" Function: s:SID() {{{1 +function s:SID() + if !exists("s:sid") + let s:sid = matchstr(expand(''), '\zs\d\+\ze_SID$') + endif + return s:sid +endfun + +" FUNCTION: s:showMenu(node) {{{1 +function! s:showMenu(node) + let mc = g:NERDTreeMenuController.New(g:NERDTreeMenuItem.AllEnabled()) + call mc.showMenu() +endfunction + +" FUNCTION: s:toggleIgnoreFilter() {{{1 +function! s:toggleIgnoreFilter() + call b:NERDTree.ui.toggleIgnoreFilter() +endfunction + +" FUNCTION: s:toggleShowBookmarks() {{{1 +function! s:toggleShowBookmarks() + call b:NERDTree.ui.toggleShowBookmarks() +endfunction + +" FUNCTION: s:toggleShowFiles() {{{1 +function! s:toggleShowFiles() + call b:NERDTree.ui.toggleShowFiles() +endfunction + +" FUNCTION: s:toggleShowHidden() {{{1 +" toggles the display of hidden files +function! s:toggleShowHidden() + call b:NERDTree.ui.toggleShowHidden() +endfunction + +" FUNCTION: s:toggleZoom() {{{1 +function! s:toggleZoom() + call b:NERDTree.ui.toggleZoom() +endfunction + +" FUNCTION: nerdtree#ui_glue#upDir(preserveState) {{{1 +" Move the NERDTree up one level. +" +" Args: +" preserveState: if 1, the current root is left open when the new tree is +" rendered; if 0, the current root node is closed +function! nerdtree#ui_glue#upDir(preserveState) + + try + call b:NERDTree.root.cacheParent() + catch /^NERDTree.CannotCacheParentError/ + call nerdtree#echo('already at root directory') + return + endtry + + let l:oldRoot = b:NERDTree.root + let l:newRoot = b:NERDTree.root.parent + + call l:newRoot.open() + call l:newRoot.transplantChild(l:oldRoot) + + if !a:preserveState + call l:oldRoot.close() + endif + + call b:NERDTree.changeRoot(l:newRoot) + call l:oldRoot.putCursorHere(0, 0) +endfunction + +" FUNCTION: s:upDirCurrentRootOpen() {{{1 +function! s:upDirCurrentRootOpen() + call nerdtree#ui_glue#upDir(1) +endfunction + +" FUNCTION: s:upDirCurrentRootClosed() {{{1 +function! s:upDirCurrentRootClosed() + call nerdtree#ui_glue#upDir(0) +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/colors/atom-dark-256.vim b/colors/atom-dark-256.vim new file mode 100644 index 0000000..e460fb5 --- /dev/null +++ b/colors/atom-dark-256.vim @@ -0,0 +1,1314 @@ +" This scheme was created by CSApproxSnapshot +" on mié, 03 dic 2014 + +hi clear +if exists("syntax_on") + syntax reset +endif + +if v:version < 700 + let g:colors_name = expand(":t:r") + command! -nargs=+ CSAHi exe "hi" substitute(substitute(, "undercurl", "underline", "g"), "guisp\\S\\+", "", "g") +else + let g:colors_name = expand(":t:r") + command! -nargs=+ CSAHi exe "hi" +endif + +function! s:old_kde() + " Konsole only used its own palette up til KDE 4.2.0 + if executable('kde4-config') && system('kde4-config --kde-version') =~ '^4.[10].' + return 1 + elseif executable('kde-config') && system('kde-config --version') =~# 'KDE: 3.' + return 1 + else + return 0 + endif +endfunction + +if 0 +elseif has("gui_running") || (&t_Co == 256 && (&term ==# "xterm" || &term =~# "^screen") && exists("g:CSApprox_konsole") && g:CSApprox_konsole) || (&term =~? "^konsole" && s:old_kde()) + CSAHi Normal term=NONE cterm=NONE ctermbg=234 ctermfg=231 gui=NONE guibg=#1D1F21 guifg=#F8F8F2 + CSAHi vimFiletype term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimExecute term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimFunction term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_0_tabsel term=bold cterm=bold ctermbg=235 ctermfg=148 gui=bold guibg=#262626 guifg=#afdf00 + CSAHi LightLineLeft_normal_tabsel_0 term=bold cterm=bold ctermbg=148 ctermfg=235 gui=bold guibg=#afdf00 guifg=#262626 + CSAHi LightLineLeft_normal_1 term=NONE cterm=NONE ctermbg=240 ctermfg=231 gui=NONE guibg=#585858 guifg=#ffffff + CSAHi LightLineLeft_normal_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=240 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineLeft_normal_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineLeft_normal_tabsel_1 term=NONE cterm=NONE ctermbg=240 ctermfg=235 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineMiddle_normal term=NONE cterm=NONE ctermbg=236 ctermfg=245 gui=NONE guibg=#303030 guifg=#8a8a8a + CSAHi LightLineRight_normal_0_1 term=NONE cterm=NONE ctermbg=240 ctermfg=252 gui=NONE guibg=#585858 guifg=#d0d0d0 + CSAHi LightLineRight_normal_0 term=NONE cterm=NONE ctermbg=252 ctermfg=241 gui=NONE guibg=#d0d0d0 guifg=#606060 + CSAHi LightLineRight_normal_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=252 gui=NONE guibg=#262626 guifg=#d0d0d0 + CSAHi SpecialKey term=bold cterm=NONE ctermbg=bg ctermfg=66 gui=NONE guibg=bg guifg=#465457 + CSAHi NonText term=bold cterm=bold ctermbg=bg ctermfg=66 gui=bold guibg=bg guifg=#465457 + CSAHi Directory term=bold cterm=NONE ctermbg=bg ctermfg=248 gui=NONE guibg=bg guifg=#AAAAAA + CSAHi ErrorMsg term=NONE cterm=NONE ctermbg=235 ctermfg=153 gui=NONE guibg=#232526 guifg=#92C5F7 + CSAHi IncSearch term=reverse cterm=reverse ctermbg=187 ctermfg=16 gui=reverse guibg=#000000 guifg=#C4BE89 + CSAHi Search term=reverse cterm=NONE ctermbg=193 ctermfg=16 gui=NONE guibg=#B4EC85 guifg=#000000 + CSAHi MoreMsg term=bold cterm=bold ctermbg=bg ctermfg=156 gui=bold guibg=bg guifg=#A8FF60 + CSAHi ModeMsg term=bold cterm=bold ctermbg=bg ctermfg=156 gui=bold guibg=bg guifg=#A8FF60 + CSAHi LineNr term=underline cterm=NONE ctermbg=235 ctermfg=66 gui=NONE guibg=#232526 guifg=#465457 + CSAHi LightLineRight_insert_0 term=NONE cterm=NONE ctermbg=153 ctermfg=30 gui=NONE guibg=#87dfff guifg=#005f5f + CSAHi LightLineRight_insert_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=153 gui=NONE guibg=#262626 guifg=#87dfff + CSAHi LightLineRight_insert_tabsel_0 term=NONE cterm=NONE ctermbg=153 ctermfg=235 gui=NONE guibg=#87dfff guifg=#262626 + CSAHi LightLineRight_insert_1_2 term=NONE cterm=NONE ctermbg=31 ctermfg=37 gui=NONE guibg=#005f87 guifg=#0087af + CSAHi LightLineRight_insert_1 term=NONE cterm=NONE ctermbg=37 ctermfg=153 gui=NONE guibg=#0087af guifg=#87dfff + CSAHi LightLineRight_insert_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=37 gui=NONE guibg=#262626 guifg=#0087af + CSAHi LightLineRight_insert_tabsel_1 term=NONE cterm=NONE ctermbg=37 ctermfg=235 gui=NONE guibg=#0087af guifg=#262626 + CSAHi LightLineRight_insert_2_3 term=NONE cterm=NONE ctermbg=31 ctermfg=31 gui=NONE guibg=#005f87 guifg=#005f87 + CSAHi LightLineRight_insert_2 term=NONE cterm=NONE ctermbg=31 ctermfg=153 gui=NONE guibg=#005f87 guifg=#87dfff + CSAHi LightLineRight_insert_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=31 gui=NONE guibg=#262626 guifg=#005f87 + CSAHi vimClusterName term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi SpellRare term=reverse cterm=undercurl ctermbg=bg ctermfg=231 gui=undercurl guibg=bg guifg=fg guisp=#FFFFFF + CSAHi SpellLocal term=underline cterm=undercurl ctermbg=bg ctermfg=123 gui=undercurl guibg=bg guifg=fg guisp=#70F0F0 + CSAHi Pmenu term=NONE cterm=NONE ctermbg=16 ctermfg=117 gui=NONE guibg=#000000 guifg=#66D9EF + CSAHi PmenuSel term=NONE cterm=NONE ctermbg=244 ctermfg=fg gui=NONE guibg=#808080 guifg=fg + CSAHi vimSynKeyRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi PmenuThumb term=NONE cterm=NONE ctermbg=16 ctermfg=117 gui=NONE guibg=Black guifg=#66D9EF + CSAHi TabLine term=underline cterm=NONE ctermbg=234 ctermfg=244 gui=NONE guibg=#1D1F21 guifg=#808080 + CSAHi TabLineSel term=bold cterm=bold ctermbg=bg ctermfg=fg gui=bold guibg=bg guifg=fg + CSAHi TabLineFill term=reverse cterm=reverse ctermbg=234 ctermfg=234 gui=reverse guibg=#1D1F21 guifg=#1D1F21 + CSAHi CursorColumn term=reverse cterm=NONE ctermbg=59 ctermfg=fg gui=NONE guibg=#293739 guifg=fg + CSAHi Identifier term=underline cterm=NONE ctermbg=bg ctermfg=189 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi NERDTreeLink term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimOperParen term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynLine term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_tabsel_0 term=NONE cterm=NONE ctermbg=252 ctermfg=235 gui=NONE guibg=#d0d0d0 guifg=#262626 + CSAHi LightLineRight_normal_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=240 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineRight_normal_1 term=NONE cterm=NONE ctermbg=240 ctermfg=250 gui=NONE guibg=#585858 guifg=#bcbcbc + CSAHi LightLineRight_normal_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineRight_normal_tabsel_1 term=NONE cterm=NONE ctermbg=240 ctermfg=235 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineRight_normal_2_3 term=NONE cterm=NONE ctermbg=236 ctermfg=236 gui=NONE guibg=#303030 guifg=#303030 + CSAHi LightLineRight_normal_2 term=NONE cterm=NONE ctermbg=236 ctermfg=247 gui=NONE guibg=#303030 guifg=#9e9e9e + CSAHi LightLineRight_normal_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_normal_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_normal_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_insert_tabsel_2 term=NONE cterm=NONE ctermbg=31 ctermfg=235 gui=NONE guibg=#005f87 guifg=#262626 + CSAHi LightLineLeft_insert_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_insert_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_insert_tabsel_2 term=NONE cterm=NONE ctermbg=31 ctermfg=235 gui=NONE guibg=#005f87 guifg=#262626 + CSAHi LightLineLeft_insert_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=31 gui=NONE guibg=#262626 guifg=#005f87 + CSAHi LightLineRight_insert_tabsel_3 term=NONE cterm=NONE ctermbg=31 ctermfg=235 gui=NONE guibg=#005f87 guifg=#262626 + CSAHi LightLineRight_insert_3_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=31 gui=NONE guibg=#262626 guifg=#005f87 + CSAHi LightLineLeft_insert_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_insert_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_insert_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynMatchRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynMtchCchar term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynMtchGroup term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi ColorColumn term=reverse cterm=NONE ctermbg=252 ctermfg=fg gui=NONE guibg=lightgray guifg=fg + CSAHi MatchParen term=reverse cterm=NONE ctermbg=238 ctermfg=188 gui=NONE guibg=#444444 guifg=#B7B9B8 + CSAHi Comment term=bold cterm=NONE ctermbg=bg ctermfg=244 gui=NONE guibg=bg guifg=#7C7C7C + CSAHi Constant term=underline cterm=NONE ctermbg=bg ctermfg=151 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Special term=bold cterm=NONE ctermbg=234 ctermfg=117 gui=NONE guibg=bg guifg=#66D9EF + CSAHi vimSynRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Statement term=bold cterm=NONE ctermbg=bg ctermfg=153 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi PreProc term=underline cterm=NONE ctermbg=bg ctermfg=187 gui=NONE guibg=bg guifg=#DAD085 + CSAHi Type term=underline cterm=NONE ctermbg=bg ctermfg=117 gui=NONE guibg=bg guifg=#66D9EF + CSAHi LightLineLeft_inactive_0 term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineLeft_inactive_0_1 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi vimMenuRhs term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAugroup term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAugroupError term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_normal_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_normal_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_normal_tabsel_3 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_normal_3_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineLeft_normal_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_normal_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi Repeat term=NONE cterm=NONE ctermbg=bg ctermfg=153 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi LightLineLeft_insert_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiBang term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynPatMod term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSyncLines term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Underlined term=underline cterm=underline ctermbg=bg ctermfg=244 gui=underline guibg=bg guifg=#808080 + CSAHi Ignore term=NONE cterm=NONE ctermbg=234 ctermfg=244 gui=NONE guibg=bg guifg=#808080 + CSAHi Error term=reverse cterm=NONE ctermbg=52 ctermfg=156 gui=NONE guibg=#1E0010 guifg=#A8FF60 + CSAHi vimSyncLinecont term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi String term=NONE cterm=NONE ctermbg=bg ctermfg=156 gui=NONE guibg=bg guifg=#A8FF60 + CSAHi Character term=NONE cterm=NONE ctermbg=bg ctermfg=156 gui=NONE guibg=bg guifg=#A8FF60 + CSAHi Number term=NONE cterm=NONE ctermbg=bg ctermfg=151 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Boolean term=NONE cterm=NONE ctermbg=bg ctermfg=151 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Float term=NONE cterm=NONE ctermbg=bg ctermfg=151 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Function term=NONE cterm=NONE ctermbg=bg ctermfg=187 gui=NONE guibg=bg guifg=#DAD085 + CSAHi vimMenuMap term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_inactive_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_inactive_tabsel_0 term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineMiddle_inactive term=NONE cterm=NONE ctermbg=236 ctermfg=245 gui=NONE guibg=#303030 guifg=#8a8a8a + CSAHi LightLineRight_inactive_0_1 term=NONE cterm=NONE ctermbg=235 ctermfg=241 gui=NONE guibg=#262626 guifg=#606060 + CSAHi LightLineRight_inactive_0 term=NONE cterm=NONE ctermbg=241 ctermfg=235 gui=NONE guibg=#606060 guifg=#262626 + CSAHi LightLineRight_inactive_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=241 gui=NONE guibg=#262626 guifg=#606060 + CSAHi LightLineRight_inactive_tabsel_0 term=NONE cterm=NONE ctermbg=241 ctermfg=235 gui=NONE guibg=#606060 guifg=#262626 + CSAHi LightLineRight_inactive_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_inactive_1 term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineRight_inactive_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi vimEcho term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimIf term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_3 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_3_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiLink term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Conditional term=NONE cterm=NONE ctermbg=bg ctermfg=153 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi vimHiKeyList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Label term=NONE cterm=NONE ctermbg=bg ctermfg=156 gui=NONE guibg=bg guifg=#A8FF60 + CSAHi Operator term=NONE cterm=NONE ctermbg=bg ctermfg=153 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi Keyword term=NONE cterm=NONE ctermbg=bg ctermfg=153 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi Exception term=NONE cterm=NONE ctermbg=bg ctermfg=187 gui=NONE guibg=bg guifg=#DAD085 + CSAHi Define term=NONE cterm=NONE ctermbg=bg ctermfg=117 gui=NONE guibg=bg guifg=#66D9EF + CSAHi Macro term=NONE cterm=NONE ctermbg=bg ctermfg=187 gui=NONE guibg=bg guifg=#C4BE89 + CSAHi PreCondit term=NONE cterm=NONE ctermbg=bg ctermfg=187 gui=NONE guibg=bg guifg=#DAD085 + CSAHi LightLineRight_inactive_tabsel_1 term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_inactive_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_inactive_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_inactive_tabsel_1 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_inactive_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_inactive_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_inactive_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineLeft_inactive_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_inactive_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_command_0 term=bold cterm=bold ctermbg=148 ctermfg=28 gui=bold guibg=#afdf00 guifg=#005f00 + CSAHi vimFuncBody term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimFuncBlank term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimEscapeBrace term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSetEqual term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstRep term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstRange term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiTermcap term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi CursorLine term=underline cterm=NONE ctermbg=59 ctermfg=fg gui=NONE guibg=#293739 guifg=fg + CSAHi LightLineRight_insert_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiCtermColor term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiFontname term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiGuiFontname term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Structure term=NONE cterm=NONE ctermbg=bg ctermfg=117 gui=NONE guibg=bg guifg=#66D9EF + CSAHi Typedef term=NONE cterm=NONE ctermbg=bg ctermfg=117 gui=NONE guibg=bg guifg=#66D9EF + CSAHi Tag term=NONE cterm=NONE ctermbg=bg ctermfg=153 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi SpecialChar term=NONE cterm=NONE ctermbg=bg ctermfg=153 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi Delimiter term=NONE cterm=NONE ctermbg=bg ctermfg=245 gui=NONE guibg=bg guifg=#8F8F8F + CSAHi SpecialComment term=NONE cterm=NONE ctermbg=bg ctermfg=244 gui=NONE guibg=bg guifg=#7C7C7C + CSAHi Debug term=NONE cterm=NONE ctermbg=bg ctermfg=181 gui=NONE guibg=bg guifg=#BCA3A3 + CSAHi Cursor term=NONE cterm=NONE ctermbg=243 ctermfg=255 gui=NONE guibg=#777777 guifg=#F1F1F1 + CSAHi iCursor term=NONE cterm=NONE ctermbg=243 ctermfg=255 gui=NONE guibg=#777777 guifg=#F1F1F1 + CSAHi PmenuSbar term=NONE cterm=NONE ctermbg=232 ctermfg=fg gui=NONE guibg=#080808 guifg=fg + CSAHi LightLineLeft_command_0_1 term=NONE cterm=NONE ctermbg=240 ctermfg=148 gui=NONE guibg=#585858 guifg=#afdf00 + CSAHi LightLineLeft_command_0_tabsel term=bold cterm=bold ctermbg=235 ctermfg=148 gui=bold guibg=#262626 guifg=#afdf00 + CSAHi LightLineLeft_command_tabsel_0 term=bold cterm=bold ctermbg=148 ctermfg=235 gui=bold guibg=#afdf00 guifg=#262626 + CSAHi LightLineLeft_command_1 term=NONE cterm=NONE ctermbg=240 ctermfg=231 gui=NONE guibg=#585858 guifg=#ffffff + CSAHi LightLineLeft_command_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=240 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineLeft_command_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineLeft_command_tabsel_1 term=NONE cterm=NONE ctermbg=240 ctermfg=235 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineMiddle_command term=NONE cterm=NONE ctermbg=236 ctermfg=245 gui=NONE guibg=#303030 guifg=#8a8a8a + CSAHi LightLineRight_command_0_1 term=NONE cterm=NONE ctermbg=240 ctermfg=252 gui=NONE guibg=#585858 guifg=#d0d0d0 + CSAHi LightLineRight_command_0 term=NONE cterm=NONE ctermbg=252 ctermfg=241 gui=NONE guibg=#d0d0d0 guifg=#606060 + CSAHi LightLineRight_normal_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCommentTitleLeader term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimGlobal term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=252 gui=NONE guibg=#262626 guifg=#d0d0d0 + CSAHi LightLineRight_command_tabsel_0 term=NONE cterm=NONE ctermbg=252 ctermfg=235 gui=NONE guibg=#d0d0d0 guifg=#262626 + CSAHi LightLineRight_command_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=240 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineRight_command_1 term=NONE cterm=NONE ctermbg=240 ctermfg=250 gui=NONE guibg=#585858 guifg=#bcbcbc + CSAHi LightLineRight_command_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineRight_command_tabsel_1 term=NONE cterm=NONE ctermbg=240 ctermfg=235 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineRight_command_2_3 term=NONE cterm=NONE ctermbg=236 ctermfg=236 gui=NONE guibg=#303030 guifg=#303030 + CSAHi LightLineRight_command_2 term=NONE cterm=NONE ctermbg=236 ctermfg=247 gui=NONE guibg=#303030 guifg=#9e9e9e + CSAHi LightLineRight_command_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_command_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_command_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimPatRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCollection term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstPat term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstRep4 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSyncMatch term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSyncLinebreak term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Todo term=NONE cterm=NONE ctermbg=234 ctermfg=231 gui=NONE guibg=bg guifg=#FFFFFF + CSAHi vimSyncRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimExtCmd term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimFilter term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSet term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_command_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_command_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_command_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_command_tabsel_3 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_command_3_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineLeft_command_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_command_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_command_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCollClass term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi pythonSpaceError term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi pythonSync term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMapLhs term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAutoCmdSpace term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAutoEventList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAutoCmdSfxList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMapRhs term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMapRhsExtend term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi StorageClass term=NONE cterm=NONE ctermbg=bg ctermfg=189 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi LightLineLeft_normal_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimPythonRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAugroupSyncA term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_3 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_3_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimGroupList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMenuBang term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMenuPriority term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi CursorLineNr term=bold cterm=NONE ctermbg=bg ctermfg=189 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi Question term=NONE cterm=bold ctermbg=bg ctermfg=117 gui=bold guibg=bg guifg=#66D9EF + CSAHi StatusLine term=bold,reverse cterm=NONE ctermbg=231 ctermfg=66 gui=NONE guibg=fg guifg=#455354 + CSAHi StatusLineNC term=reverse cterm=reverse ctermbg=244 ctermfg=232 gui=reverse guibg=#080808 guifg=#808080 + CSAHi VertSplit term=reverse cterm=reverse ctermbg=244 ctermfg=232 gui=reverse guibg=#080808 guifg=#808080 + CSAHi Title term=bold cterm=NONE ctermbg=bg ctermfg=189 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi Visual term=reverse cterm=NONE ctermbg=59 ctermfg=fg gui=NONE guibg=#403D3D guifg=fg + CSAHi VisualNOS term=NONE cterm=NONE ctermbg=59 ctermfg=fg gui=NONE guibg=#403D3D guifg=fg + CSAHi WarningMsg term=NONE cterm=NONE ctermbg=59 ctermfg=231 gui=NONE guibg=#333333 guifg=#FFFFFF + CSAHi WildMenu term=NONE cterm=NONE ctermbg=16 ctermfg=117 gui=NONE guibg=#000000 guifg=#66D9EF + CSAHi LightLineLeft_normal_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_3 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_3_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAuSyntax term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimUserCmd term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCmdSep term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimIsCommand term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_0 term=bold cterm=bold ctermbg=148 ctermfg=28 gui=bold guibg=#afdf00 guifg=#005f00 + CSAHi LightLineLeft_normal_0_1 term=NONE cterm=NONE ctermbg=240 ctermfg=148 gui=NONE guibg=#585858 guifg=#afdf00 + CSAHi LightLineLeft_insert_0 term=bold cterm=bold ctermbg=231 ctermfg=30 gui=bold guibg=#ffffff guifg=#005f5f + CSAHi LightLineLeft_insert_0_1 term=NONE cterm=NONE ctermbg=37 ctermfg=231 gui=NONE guibg=#0087af guifg=#ffffff + CSAHi LightLineLeft_insert_0_tabsel term=bold cterm=bold ctermbg=235 ctermfg=231 gui=bold guibg=#262626 guifg=#ffffff + CSAHi LightLineLeft_insert_tabsel_0 term=bold cterm=bold ctermbg=231 ctermfg=235 gui=bold guibg=#ffffff guifg=#262626 + CSAHi LightLineLeft_insert_1 term=NONE cterm=NONE ctermbg=37 ctermfg=231 gui=NONE guibg=#0087af guifg=#ffffff + CSAHi LightLineLeft_insert_1_2 term=NONE cterm=NONE ctermbg=31 ctermfg=37 gui=NONE guibg=#005f87 guifg=#0087af + CSAHi LightLineLeft_insert_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=37 gui=NONE guibg=#262626 guifg=#0087af + CSAHi LightLineLeft_insert_tabsel_1 term=NONE cterm=NONE ctermbg=37 ctermfg=235 gui=NONE guibg=#0087af guifg=#262626 + CSAHi LightLineMiddle_insert term=NONE cterm=NONE ctermbg=31 ctermfg=153 gui=NONE guibg=#005f87 guifg=#87dfff + CSAHi LightLineRight_insert_0_1 term=NONE cterm=NONE ctermbg=37 ctermfg=153 gui=NONE guibg=#0087af guifg=#87dfff + CSAHi vimNormCmds term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Folded term=NONE cterm=NONE ctermbg=16 ctermfg=66 gui=NONE guibg=#000000 guifg=#465457 + CSAHi FoldColumn term=NONE cterm=NONE ctermbg=16 ctermfg=66 gui=NONE guibg=#000000 guifg=#465457 + CSAHi DiffAdd term=bold cterm=NONE ctermbg=23 ctermfg=fg gui=NONE guibg=#13354A guifg=fg + CSAHi DiffChange term=bold cterm=NONE ctermbg=59 ctermfg=144 gui=NONE guibg=#4C4745 guifg=#89807D + CSAHi DiffDelete term=bold cterm=bold ctermbg=52 ctermfg=126 gui=bold guibg=#1E0010 guifg=#960050 + CSAHi DiffText term=reverse cterm=NONE ctermbg=59 ctermfg=fg gui=NONE guibg=#4C4745 guifg=fg + CSAHi SignColumn term=NONE cterm=NONE ctermbg=235 ctermfg=187 gui=NONE guibg=#232526 guifg=#DAD085 + CSAHi Conceal term=NONE cterm=NONE ctermbg=248 ctermfg=252 gui=NONE guibg=DarkGrey guifg=LightGrey + CSAHi SpellBad term=reverse cterm=undercurl ctermbg=bg ctermfg=196 gui=undercurl guibg=bg guifg=fg guisp=#FF0000 + CSAHi SpellCap term=reverse cterm=undercurl ctermbg=bg ctermfg=105 gui=undercurl guibg=bg guifg=fg guisp=#7070F0 +elseif has("gui_running") || (&t_Co == 256 && (&term ==# "xterm" || &term =~# "^screen") && exists("g:CSApprox_eterm") && g:CSApprox_eterm) || &term =~? "^eterm" + CSAHi Normal term=NONE cterm=NONE ctermbg=234 ctermfg=255 gui=NONE guibg=#1D1F21 guifg=#F8F8F2 + CSAHi vimFiletype term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimExecute term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimFunction term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_0_tabsel term=bold cterm=bold ctermbg=235 ctermfg=190 gui=bold guibg=#262626 guifg=#afdf00 + CSAHi LightLineLeft_normal_tabsel_0 term=bold cterm=bold ctermbg=190 ctermfg=235 gui=bold guibg=#afdf00 guifg=#262626 + CSAHi LightLineLeft_normal_1 term=NONE cterm=NONE ctermbg=240 ctermfg=255 gui=NONE guibg=#585858 guifg=#ffffff + CSAHi LightLineLeft_normal_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=240 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineLeft_normal_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineLeft_normal_tabsel_1 term=NONE cterm=NONE ctermbg=240 ctermfg=235 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineMiddle_normal term=NONE cterm=NONE ctermbg=236 ctermfg=245 gui=NONE guibg=#303030 guifg=#8a8a8a + CSAHi LightLineRight_normal_0_1 term=NONE cterm=NONE ctermbg=240 ctermfg=252 gui=NONE guibg=#585858 guifg=#d0d0d0 + CSAHi LightLineRight_normal_0 term=NONE cterm=NONE ctermbg=252 ctermfg=241 gui=NONE guibg=#d0d0d0 guifg=#606060 + CSAHi LightLineRight_normal_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=252 gui=NONE guibg=#262626 guifg=#d0d0d0 + CSAHi SpecialKey term=bold cterm=NONE ctermbg=bg ctermfg=102 gui=NONE guibg=bg guifg=#465457 + CSAHi NonText term=bold cterm=bold ctermbg=bg ctermfg=102 gui=bold guibg=bg guifg=#465457 + CSAHi Directory term=bold cterm=NONE ctermbg=bg ctermfg=188 gui=NONE guibg=bg guifg=#AAAAAA + CSAHi ErrorMsg term=NONE cterm=NONE ctermbg=235 ctermfg=159 gui=NONE guibg=#232526 guifg=#92C5F7 + CSAHi IncSearch term=reverse cterm=reverse ctermbg=223 ctermfg=16 gui=reverse guibg=#000000 guifg=#C4BE89 + CSAHi Search term=reverse cterm=NONE ctermbg=193 ctermfg=16 gui=NONE guibg=#B4EC85 guifg=#000000 + CSAHi MoreMsg term=bold cterm=bold ctermbg=bg ctermfg=192 gui=bold guibg=bg guifg=#A8FF60 + CSAHi ModeMsg term=bold cterm=bold ctermbg=bg ctermfg=192 gui=bold guibg=bg guifg=#A8FF60 + CSAHi LineNr term=underline cterm=NONE ctermbg=235 ctermfg=102 gui=NONE guibg=#232526 guifg=#465457 + CSAHi LightLineRight_insert_0 term=NONE cterm=NONE ctermbg=159 ctermfg=30 gui=NONE guibg=#87dfff guifg=#005f5f + CSAHi LightLineRight_insert_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=159 gui=NONE guibg=#262626 guifg=#87dfff + CSAHi LightLineRight_insert_tabsel_0 term=NONE cterm=NONE ctermbg=159 ctermfg=235 gui=NONE guibg=#87dfff guifg=#262626 + CSAHi LightLineRight_insert_1_2 term=NONE cterm=NONE ctermbg=31 ctermfg=38 gui=NONE guibg=#005f87 guifg=#0087af + CSAHi LightLineRight_insert_1 term=NONE cterm=NONE ctermbg=38 ctermfg=159 gui=NONE guibg=#0087af guifg=#87dfff + CSAHi LightLineRight_insert_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=38 gui=NONE guibg=#262626 guifg=#0087af + CSAHi LightLineRight_insert_tabsel_1 term=NONE cterm=NONE ctermbg=38 ctermfg=235 gui=NONE guibg=#0087af guifg=#262626 + CSAHi LightLineRight_insert_2_3 term=NONE cterm=NONE ctermbg=31 ctermfg=31 gui=NONE guibg=#005f87 guifg=#005f87 + CSAHi LightLineRight_insert_2 term=NONE cterm=NONE ctermbg=31 ctermfg=159 gui=NONE guibg=#005f87 guifg=#87dfff + CSAHi LightLineRight_insert_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=31 gui=NONE guibg=#262626 guifg=#005f87 + CSAHi vimClusterName term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi SpellRare term=reverse cterm=undercurl ctermbg=bg ctermfg=255 gui=undercurl guibg=bg guifg=fg guisp=#FFFFFF + CSAHi SpellLocal term=underline cterm=undercurl ctermbg=bg ctermfg=159 gui=undercurl guibg=bg guifg=fg guisp=#70F0F0 + CSAHi Pmenu term=NONE cterm=NONE ctermbg=16 ctermfg=123 gui=NONE guibg=#000000 guifg=#66D9EF + CSAHi PmenuSel term=NONE cterm=NONE ctermbg=244 ctermfg=fg gui=NONE guibg=#808080 guifg=fg + CSAHi vimSynKeyRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi PmenuThumb term=NONE cterm=NONE ctermbg=16 ctermfg=123 gui=NONE guibg=Black guifg=#66D9EF + CSAHi TabLine term=underline cterm=NONE ctermbg=234 ctermfg=244 gui=NONE guibg=#1D1F21 guifg=#808080 + CSAHi TabLineSel term=bold cterm=bold ctermbg=bg ctermfg=fg gui=bold guibg=bg guifg=fg + CSAHi TabLineFill term=reverse cterm=reverse ctermbg=234 ctermfg=234 gui=reverse guibg=#1D1F21 guifg=#1D1F21 + CSAHi CursorColumn term=reverse cterm=NONE ctermbg=59 ctermfg=fg gui=NONE guibg=#293739 guifg=fg + CSAHi Identifier term=underline cterm=NONE ctermbg=bg ctermfg=189 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi NERDTreeLink term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimOperParen term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynLine term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_tabsel_0 term=NONE cterm=NONE ctermbg=252 ctermfg=235 gui=NONE guibg=#d0d0d0 guifg=#262626 + CSAHi LightLineRight_normal_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=240 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineRight_normal_1 term=NONE cterm=NONE ctermbg=240 ctermfg=250 gui=NONE guibg=#585858 guifg=#bcbcbc + CSAHi LightLineRight_normal_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineRight_normal_tabsel_1 term=NONE cterm=NONE ctermbg=240 ctermfg=235 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineRight_normal_2_3 term=NONE cterm=NONE ctermbg=236 ctermfg=236 gui=NONE guibg=#303030 guifg=#303030 + CSAHi LightLineRight_normal_2 term=NONE cterm=NONE ctermbg=236 ctermfg=247 gui=NONE guibg=#303030 guifg=#9e9e9e + CSAHi LightLineRight_normal_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_normal_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_normal_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_insert_tabsel_2 term=NONE cterm=NONE ctermbg=31 ctermfg=235 gui=NONE guibg=#005f87 guifg=#262626 + CSAHi LightLineLeft_insert_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_insert_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_insert_tabsel_2 term=NONE cterm=NONE ctermbg=31 ctermfg=235 gui=NONE guibg=#005f87 guifg=#262626 + CSAHi LightLineLeft_insert_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=31 gui=NONE guibg=#262626 guifg=#005f87 + CSAHi LightLineRight_insert_tabsel_3 term=NONE cterm=NONE ctermbg=31 ctermfg=235 gui=NONE guibg=#005f87 guifg=#262626 + CSAHi LightLineRight_insert_3_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=31 gui=NONE guibg=#262626 guifg=#005f87 + CSAHi LightLineLeft_insert_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_insert_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_insert_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynMatchRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynMtchCchar term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynMtchGroup term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi ColorColumn term=reverse cterm=NONE ctermbg=231 ctermfg=fg gui=NONE guibg=lightgray guifg=fg + CSAHi MatchParen term=reverse cterm=NONE ctermbg=238 ctermfg=188 gui=NONE guibg=#444444 guifg=#B7B9B8 + CSAHi Comment term=bold cterm=NONE ctermbg=bg ctermfg=145 gui=NONE guibg=bg guifg=#7C7C7C + CSAHi Constant term=underline cterm=NONE ctermbg=bg ctermfg=194 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Special term=bold cterm=NONE ctermbg=234 ctermfg=123 gui=NONE guibg=bg guifg=#66D9EF + CSAHi vimSynRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Statement term=bold cterm=NONE ctermbg=bg ctermfg=159 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi PreProc term=underline cterm=NONE ctermbg=bg ctermfg=229 gui=NONE guibg=bg guifg=#DAD085 + CSAHi Type term=underline cterm=NONE ctermbg=bg ctermfg=123 gui=NONE guibg=bg guifg=#66D9EF + CSAHi LightLineLeft_inactive_0 term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineLeft_inactive_0_1 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi vimMenuRhs term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAugroup term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAugroupError term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_normal_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_normal_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_normal_tabsel_3 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_normal_3_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineLeft_normal_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_normal_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi Repeat term=NONE cterm=NONE ctermbg=bg ctermfg=159 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi LightLineLeft_insert_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiBang term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynPatMod term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSyncLines term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Underlined term=underline cterm=underline ctermbg=bg ctermfg=244 gui=underline guibg=bg guifg=#808080 + CSAHi Ignore term=NONE cterm=NONE ctermbg=234 ctermfg=244 gui=NONE guibg=bg guifg=#808080 + CSAHi Error term=reverse cterm=NONE ctermbg=52 ctermfg=192 gui=NONE guibg=#1E0010 guifg=#A8FF60 + CSAHi vimSyncLinecont term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi String term=NONE cterm=NONE ctermbg=bg ctermfg=192 gui=NONE guibg=bg guifg=#A8FF60 + CSAHi Character term=NONE cterm=NONE ctermbg=bg ctermfg=192 gui=NONE guibg=bg guifg=#A8FF60 + CSAHi Number term=NONE cterm=NONE ctermbg=bg ctermfg=194 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Boolean term=NONE cterm=NONE ctermbg=bg ctermfg=194 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Float term=NONE cterm=NONE ctermbg=bg ctermfg=194 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Function term=NONE cterm=NONE ctermbg=bg ctermfg=229 gui=NONE guibg=bg guifg=#DAD085 + CSAHi vimMenuMap term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_inactive_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_inactive_tabsel_0 term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineMiddle_inactive term=NONE cterm=NONE ctermbg=236 ctermfg=245 gui=NONE guibg=#303030 guifg=#8a8a8a + CSAHi LightLineRight_inactive_0_1 term=NONE cterm=NONE ctermbg=235 ctermfg=241 gui=NONE guibg=#262626 guifg=#606060 + CSAHi LightLineRight_inactive_0 term=NONE cterm=NONE ctermbg=241 ctermfg=235 gui=NONE guibg=#606060 guifg=#262626 + CSAHi LightLineRight_inactive_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=241 gui=NONE guibg=#262626 guifg=#606060 + CSAHi LightLineRight_inactive_tabsel_0 term=NONE cterm=NONE ctermbg=241 ctermfg=235 gui=NONE guibg=#606060 guifg=#262626 + CSAHi LightLineRight_inactive_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_inactive_1 term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineRight_inactive_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi vimEcho term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimIf term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_3 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_3_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiLink term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Conditional term=NONE cterm=NONE ctermbg=bg ctermfg=159 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi vimHiKeyList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Label term=NONE cterm=NONE ctermbg=bg ctermfg=192 gui=NONE guibg=bg guifg=#A8FF60 + CSAHi Operator term=NONE cterm=NONE ctermbg=bg ctermfg=159 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi Keyword term=NONE cterm=NONE ctermbg=bg ctermfg=159 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi Exception term=NONE cterm=NONE ctermbg=bg ctermfg=229 gui=NONE guibg=bg guifg=#DAD085 + CSAHi Define term=NONE cterm=NONE ctermbg=bg ctermfg=123 gui=NONE guibg=bg guifg=#66D9EF + CSAHi Macro term=NONE cterm=NONE ctermbg=bg ctermfg=223 gui=NONE guibg=bg guifg=#C4BE89 + CSAHi PreCondit term=NONE cterm=NONE ctermbg=bg ctermfg=229 gui=NONE guibg=bg guifg=#DAD085 + CSAHi LightLineRight_inactive_tabsel_1 term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_inactive_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_inactive_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_inactive_tabsel_1 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_inactive_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_inactive_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_inactive_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineLeft_inactive_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_inactive_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_command_0 term=bold cterm=bold ctermbg=190 ctermfg=28 gui=bold guibg=#afdf00 guifg=#005f00 + CSAHi vimFuncBody term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimFuncBlank term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimEscapeBrace term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSetEqual term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstRep term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstRange term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiTermcap term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi CursorLine term=underline cterm=NONE ctermbg=60 ctermfg=fg gui=NONE guibg=#293739 guifg=fg + CSAHi LightLineRight_insert_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiCtermColor term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiFontname term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiGuiFontname term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Structure term=NONE cterm=NONE ctermbg=bg ctermfg=123 gui=NONE guibg=bg guifg=#66D9EF + CSAHi Typedef term=NONE cterm=NONE ctermbg=bg ctermfg=123 gui=NONE guibg=bg guifg=#66D9EF + CSAHi Tag term=NONE cterm=NONE ctermbg=bg ctermfg=159 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi SpecialChar term=NONE cterm=NONE ctermbg=bg ctermfg=159 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi Delimiter term=NONE cterm=NONE ctermbg=bg ctermfg=245 gui=NONE guibg=bg guifg=#8F8F8F + CSAHi SpecialComment term=NONE cterm=NONE ctermbg=bg ctermfg=145 gui=NONE guibg=bg guifg=#7C7C7C + CSAHi Debug term=NONE cterm=NONE ctermbg=bg ctermfg=188 gui=NONE guibg=bg guifg=#BCA3A3 + CSAHi Cursor term=NONE cterm=NONE ctermbg=243 ctermfg=255 gui=NONE guibg=#777777 guifg=#F1F1F1 + CSAHi iCursor term=NONE cterm=NONE ctermbg=243 ctermfg=255 gui=NONE guibg=#777777 guifg=#F1F1F1 + CSAHi PmenuSbar term=NONE cterm=NONE ctermbg=232 ctermfg=fg gui=NONE guibg=#080808 guifg=fg + CSAHi LightLineLeft_command_0_1 term=NONE cterm=NONE ctermbg=240 ctermfg=190 gui=NONE guibg=#585858 guifg=#afdf00 + CSAHi LightLineLeft_command_0_tabsel term=bold cterm=bold ctermbg=235 ctermfg=190 gui=bold guibg=#262626 guifg=#afdf00 + CSAHi LightLineLeft_command_tabsel_0 term=bold cterm=bold ctermbg=190 ctermfg=235 gui=bold guibg=#afdf00 guifg=#262626 + CSAHi LightLineLeft_command_1 term=NONE cterm=NONE ctermbg=240 ctermfg=255 gui=NONE guibg=#585858 guifg=#ffffff + CSAHi LightLineLeft_command_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=240 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineLeft_command_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineLeft_command_tabsel_1 term=NONE cterm=NONE ctermbg=240 ctermfg=235 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineMiddle_command term=NONE cterm=NONE ctermbg=236 ctermfg=245 gui=NONE guibg=#303030 guifg=#8a8a8a + CSAHi LightLineRight_command_0_1 term=NONE cterm=NONE ctermbg=240 ctermfg=252 gui=NONE guibg=#585858 guifg=#d0d0d0 + CSAHi LightLineRight_command_0 term=NONE cterm=NONE ctermbg=252 ctermfg=241 gui=NONE guibg=#d0d0d0 guifg=#606060 + CSAHi LightLineRight_normal_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCommentTitleLeader term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimGlobal term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=252 gui=NONE guibg=#262626 guifg=#d0d0d0 + CSAHi LightLineRight_command_tabsel_0 term=NONE cterm=NONE ctermbg=252 ctermfg=235 gui=NONE guibg=#d0d0d0 guifg=#262626 + CSAHi LightLineRight_command_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=240 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineRight_command_1 term=NONE cterm=NONE ctermbg=240 ctermfg=250 gui=NONE guibg=#585858 guifg=#bcbcbc + CSAHi LightLineRight_command_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineRight_command_tabsel_1 term=NONE cterm=NONE ctermbg=240 ctermfg=235 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineRight_command_2_3 term=NONE cterm=NONE ctermbg=236 ctermfg=236 gui=NONE guibg=#303030 guifg=#303030 + CSAHi LightLineRight_command_2 term=NONE cterm=NONE ctermbg=236 ctermfg=247 gui=NONE guibg=#303030 guifg=#9e9e9e + CSAHi LightLineRight_command_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_command_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_command_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimPatRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCollection term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstPat term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstRep4 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSyncMatch term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSyncLinebreak term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Todo term=NONE cterm=NONE ctermbg=234 ctermfg=255 gui=NONE guibg=bg guifg=#FFFFFF + CSAHi vimSyncRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimExtCmd term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimFilter term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSet term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_command_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_command_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_command_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_command_tabsel_3 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_command_3_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineLeft_command_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_command_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_command_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCollClass term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi pythonSpaceError term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi pythonSync term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMapLhs term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAutoCmdSpace term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAutoEventList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAutoCmdSfxList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMapRhs term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMapRhsExtend term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi StorageClass term=NONE cterm=NONE ctermbg=bg ctermfg=189 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi LightLineLeft_normal_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimPythonRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAugroupSyncA term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_3 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_3_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimGroupList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMenuBang term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMenuPriority term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi CursorLineNr term=bold cterm=NONE ctermbg=bg ctermfg=189 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi Question term=NONE cterm=bold ctermbg=bg ctermfg=123 gui=bold guibg=bg guifg=#66D9EF + CSAHi StatusLine term=bold,reverse cterm=NONE ctermbg=255 ctermfg=102 gui=NONE guibg=fg guifg=#455354 + CSAHi StatusLineNC term=reverse cterm=reverse ctermbg=244 ctermfg=232 gui=reverse guibg=#080808 guifg=#808080 + CSAHi VertSplit term=reverse cterm=reverse ctermbg=244 ctermfg=232 gui=reverse guibg=#080808 guifg=#808080 + CSAHi Title term=bold cterm=NONE ctermbg=bg ctermfg=189 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi Visual term=reverse cterm=NONE ctermbg=95 ctermfg=fg gui=NONE guibg=#403D3D guifg=fg + CSAHi VisualNOS term=NONE cterm=NONE ctermbg=95 ctermfg=fg gui=NONE guibg=#403D3D guifg=fg + CSAHi WarningMsg term=NONE cterm=NONE ctermbg=236 ctermfg=255 gui=NONE guibg=#333333 guifg=#FFFFFF + CSAHi WildMenu term=NONE cterm=NONE ctermbg=16 ctermfg=123 gui=NONE guibg=#000000 guifg=#66D9EF + CSAHi LightLineLeft_normal_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_3 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_3_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAuSyntax term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimUserCmd term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCmdSep term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimIsCommand term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_0 term=bold cterm=bold ctermbg=190 ctermfg=28 gui=bold guibg=#afdf00 guifg=#005f00 + CSAHi LightLineLeft_normal_0_1 term=NONE cterm=NONE ctermbg=240 ctermfg=190 gui=NONE guibg=#585858 guifg=#afdf00 + CSAHi LightLineLeft_insert_0 term=bold cterm=bold ctermbg=255 ctermfg=30 gui=bold guibg=#ffffff guifg=#005f5f + CSAHi LightLineLeft_insert_0_1 term=NONE cterm=NONE ctermbg=38 ctermfg=255 gui=NONE guibg=#0087af guifg=#ffffff + CSAHi LightLineLeft_insert_0_tabsel term=bold cterm=bold ctermbg=235 ctermfg=255 gui=bold guibg=#262626 guifg=#ffffff + CSAHi LightLineLeft_insert_tabsel_0 term=bold cterm=bold ctermbg=255 ctermfg=235 gui=bold guibg=#ffffff guifg=#262626 + CSAHi LightLineLeft_insert_1 term=NONE cterm=NONE ctermbg=38 ctermfg=255 gui=NONE guibg=#0087af guifg=#ffffff + CSAHi LightLineLeft_insert_1_2 term=NONE cterm=NONE ctermbg=31 ctermfg=38 gui=NONE guibg=#005f87 guifg=#0087af + CSAHi LightLineLeft_insert_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=38 gui=NONE guibg=#262626 guifg=#0087af + CSAHi LightLineLeft_insert_tabsel_1 term=NONE cterm=NONE ctermbg=38 ctermfg=235 gui=NONE guibg=#0087af guifg=#262626 + CSAHi LightLineMiddle_insert term=NONE cterm=NONE ctermbg=31 ctermfg=159 gui=NONE guibg=#005f87 guifg=#87dfff + CSAHi LightLineRight_insert_0_1 term=NONE cterm=NONE ctermbg=38 ctermfg=159 gui=NONE guibg=#0087af guifg=#87dfff + CSAHi vimNormCmds term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Folded term=NONE cterm=NONE ctermbg=16 ctermfg=102 gui=NONE guibg=#000000 guifg=#465457 + CSAHi FoldColumn term=NONE cterm=NONE ctermbg=16 ctermfg=102 gui=NONE guibg=#000000 guifg=#465457 + CSAHi DiffAdd term=bold cterm=NONE ctermbg=24 ctermfg=fg gui=NONE guibg=#13354A guifg=fg + CSAHi DiffChange term=bold cterm=NONE ctermbg=102 ctermfg=145 gui=NONE guibg=#4C4745 guifg=#89807D + CSAHi DiffDelete term=bold cterm=bold ctermbg=52 ctermfg=162 gui=bold guibg=#1E0010 guifg=#960050 + CSAHi DiffText term=reverse cterm=NONE ctermbg=102 ctermfg=fg gui=NONE guibg=#4C4745 guifg=fg + CSAHi SignColumn term=NONE cterm=NONE ctermbg=235 ctermfg=229 gui=NONE guibg=#232526 guifg=#DAD085 + CSAHi Conceal term=NONE cterm=NONE ctermbg=248 ctermfg=231 gui=NONE guibg=DarkGrey guifg=LightGrey + CSAHi SpellBad term=reverse cterm=undercurl ctermbg=bg ctermfg=196 gui=undercurl guibg=bg guifg=fg guisp=#FF0000 + CSAHi SpellCap term=reverse cterm=undercurl ctermbg=bg ctermfg=147 gui=undercurl guibg=bg guifg=fg guisp=#7070F0 +elseif has("gui_running") || &t_Co == 256 + CSAHi Normal term=NONE cterm=NONE ctermbg=234 ctermfg=231 gui=NONE guibg=#1D1F21 guifg=#F8F8F2 + CSAHi vimFiletype term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimExecute term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimFunction term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_0_tabsel term=bold cterm=bold ctermbg=235 ctermfg=148 gui=bold guibg=#262626 guifg=#afdf00 + CSAHi LightLineLeft_normal_tabsel_0 term=bold cterm=bold ctermbg=148 ctermfg=235 gui=bold guibg=#afdf00 guifg=#262626 + CSAHi LightLineLeft_normal_1 term=NONE cterm=NONE ctermbg=240 ctermfg=231 gui=NONE guibg=#585858 guifg=#ffffff + CSAHi LightLineLeft_normal_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=240 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineLeft_normal_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineLeft_normal_tabsel_1 term=NONE cterm=NONE ctermbg=240 ctermfg=235 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineMiddle_normal term=NONE cterm=NONE ctermbg=236 ctermfg=245 gui=NONE guibg=#303030 guifg=#8a8a8a + CSAHi LightLineRight_normal_0_1 term=NONE cterm=NONE ctermbg=240 ctermfg=252 gui=NONE guibg=#585858 guifg=#d0d0d0 + CSAHi LightLineRight_normal_0 term=NONE cterm=NONE ctermbg=252 ctermfg=59 gui=NONE guibg=#d0d0d0 guifg=#606060 + CSAHi LightLineRight_normal_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=252 gui=NONE guibg=#262626 guifg=#d0d0d0 + CSAHi SpecialKey term=bold cterm=NONE ctermbg=bg ctermfg=59 gui=NONE guibg=bg guifg=#465457 + CSAHi NonText term=bold cterm=bold ctermbg=bg ctermfg=59 gui=bold guibg=bg guifg=#465457 + CSAHi Directory term=bold cterm=NONE ctermbg=bg ctermfg=248 gui=NONE guibg=bg guifg=#AAAAAA + CSAHi ErrorMsg term=NONE cterm=NONE ctermbg=235 ctermfg=117 gui=NONE guibg=#232526 guifg=#92C5F7 + CSAHi IncSearch term=reverse cterm=reverse ctermbg=180 ctermfg=16 gui=reverse guibg=#000000 guifg=#C4BE89 + CSAHi Search term=reverse cterm=NONE ctermbg=156 ctermfg=16 gui=NONE guibg=#B4EC85 guifg=#000000 + CSAHi MoreMsg term=bold cterm=bold ctermbg=bg ctermfg=155 gui=bold guibg=bg guifg=#A8FF60 + CSAHi ModeMsg term=bold cterm=bold ctermbg=bg ctermfg=155 gui=bold guibg=bg guifg=#A8FF60 + CSAHi LineNr term=underline cterm=NONE ctermbg=235 ctermfg=59 gui=NONE guibg=#232526 guifg=#465457 + CSAHi LightLineRight_insert_0 term=NONE cterm=NONE ctermbg=117 ctermfg=23 gui=NONE guibg=#87dfff guifg=#005f5f + CSAHi LightLineRight_insert_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=117 gui=NONE guibg=#262626 guifg=#87dfff + CSAHi LightLineRight_insert_tabsel_0 term=NONE cterm=NONE ctermbg=117 ctermfg=235 gui=NONE guibg=#87dfff guifg=#262626 + CSAHi LightLineRight_insert_1_2 term=NONE cterm=NONE ctermbg=24 ctermfg=31 gui=NONE guibg=#005f87 guifg=#0087af + CSAHi LightLineRight_insert_1 term=NONE cterm=NONE ctermbg=31 ctermfg=117 gui=NONE guibg=#0087af guifg=#87dfff + CSAHi LightLineRight_insert_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=31 gui=NONE guibg=#262626 guifg=#0087af + CSAHi LightLineRight_insert_tabsel_1 term=NONE cterm=NONE ctermbg=31 ctermfg=235 gui=NONE guibg=#0087af guifg=#262626 + CSAHi LightLineRight_insert_2_3 term=NONE cterm=NONE ctermbg=24 ctermfg=24 gui=NONE guibg=#005f87 guifg=#005f87 + CSAHi LightLineRight_insert_2 term=NONE cterm=NONE ctermbg=24 ctermfg=117 gui=NONE guibg=#005f87 guifg=#87dfff + CSAHi LightLineRight_insert_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=24 gui=NONE guibg=#262626 guifg=#005f87 + CSAHi vimClusterName term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi SpellRare term=reverse cterm=undercurl ctermbg=bg ctermfg=231 gui=undercurl guibg=bg guifg=fg guisp=#FFFFFF + CSAHi SpellLocal term=underline cterm=undercurl ctermbg=bg ctermfg=87 gui=undercurl guibg=bg guifg=fg guisp=#70F0F0 + CSAHi Pmenu term=NONE cterm=NONE ctermbg=16 ctermfg=81 gui=NONE guibg=#000000 guifg=#66D9EF + CSAHi PmenuSel term=NONE cterm=NONE ctermbg=244 ctermfg=fg gui=NONE guibg=#808080 guifg=fg + CSAHi vimSynKeyRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi PmenuThumb term=NONE cterm=NONE ctermbg=16 ctermfg=81 gui=NONE guibg=Black guifg=#66D9EF + CSAHi TabLine term=underline cterm=NONE ctermbg=234 ctermfg=244 gui=NONE guibg=#1D1F21 guifg=#808080 + CSAHi TabLineSel term=bold cterm=bold ctermbg=bg ctermfg=fg gui=bold guibg=bg guifg=fg + CSAHi TabLineFill term=reverse cterm=reverse ctermbg=234 ctermfg=234 gui=reverse guibg=#1D1F21 guifg=#1D1F21 + CSAHi CursorColumn term=reverse cterm=NONE ctermbg=23 ctermfg=fg gui=NONE guibg=#293739 guifg=fg + CSAHi Identifier term=underline cterm=NONE ctermbg=bg ctermfg=146 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi NERDTreeLink term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimOperParen term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynLine term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_tabsel_0 term=NONE cterm=NONE ctermbg=252 ctermfg=235 gui=NONE guibg=#d0d0d0 guifg=#262626 + CSAHi LightLineRight_normal_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=240 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineRight_normal_1 term=NONE cterm=NONE ctermbg=240 ctermfg=250 gui=NONE guibg=#585858 guifg=#bcbcbc + CSAHi LightLineRight_normal_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineRight_normal_tabsel_1 term=NONE cterm=NONE ctermbg=240 ctermfg=235 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineRight_normal_2_3 term=NONE cterm=NONE ctermbg=236 ctermfg=236 gui=NONE guibg=#303030 guifg=#303030 + CSAHi LightLineRight_normal_2 term=NONE cterm=NONE ctermbg=236 ctermfg=247 gui=NONE guibg=#303030 guifg=#9e9e9e + CSAHi LightLineRight_normal_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_normal_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_normal_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_insert_tabsel_2 term=NONE cterm=NONE ctermbg=24 ctermfg=235 gui=NONE guibg=#005f87 guifg=#262626 + CSAHi LightLineLeft_insert_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_insert_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_insert_tabsel_2 term=NONE cterm=NONE ctermbg=24 ctermfg=235 gui=NONE guibg=#005f87 guifg=#262626 + CSAHi LightLineLeft_insert_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=24 gui=NONE guibg=#262626 guifg=#005f87 + CSAHi LightLineRight_insert_tabsel_3 term=NONE cterm=NONE ctermbg=24 ctermfg=235 gui=NONE guibg=#005f87 guifg=#262626 + CSAHi LightLineRight_insert_3_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=24 gui=NONE guibg=#262626 guifg=#005f87 + CSAHi LightLineLeft_insert_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_insert_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_insert_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynMatchRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynMtchCchar term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynMtchGroup term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi ColorColumn term=reverse cterm=NONE ctermbg=235 ctermfg=160 gui=NONE guibg=lightgray guifg=fg + CSAHi MatchParen term=reverse cterm=NONE ctermbg=238 ctermfg=145 gui=NONE guibg=#444444 guifg=#B7B9B8 + CSAHi Comment term=bold cterm=NONE ctermbg=bg ctermfg=244 gui=NONE guibg=bg guifg=#7C7C7C + CSAHi Constant term=underline cterm=NONE ctermbg=bg ctermfg=114 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Special term=bold cterm=NONE ctermbg=234 ctermfg=81 gui=NONE guibg=bg guifg=#66D9EF + CSAHi vimSynRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Statement term=bold cterm=NONE ctermbg=bg ctermfg=117 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi PreProc term=underline cterm=NONE ctermbg=bg ctermfg=186 gui=NONE guibg=bg guifg=#DAD085 + CSAHi Type term=underline cterm=NONE ctermbg=bg ctermfg=81 gui=NONE guibg=bg guifg=#66D9EF + CSAHi LightLineLeft_inactive_0 term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineLeft_inactive_0_1 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi vimMenuRhs term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAugroup term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAugroupError term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_normal_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_normal_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_normal_tabsel_3 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_normal_3_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineLeft_normal_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_normal_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi Repeat term=NONE cterm=NONE ctermbg=bg ctermfg=117 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi LightLineLeft_insert_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiBang term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynPatMod term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSyncLines term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Underlined term=underline cterm=underline ctermbg=bg ctermfg=244 gui=underline guibg=bg guifg=#808080 + CSAHi Ignore term=NONE cterm=NONE ctermbg=234 ctermfg=244 gui=NONE guibg=bg guifg=#808080 + CSAHi Error term=reverse cterm=NONE ctermbg=16 ctermfg=155 gui=NONE guibg=#1E0010 guifg=#A8FF60 + CSAHi vimSyncLinecont term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi String term=NONE cterm=NONE ctermbg=bg ctermfg=155 gui=NONE guibg=bg guifg=#A8FF60 + CSAHi Character term=NONE cterm=NONE ctermbg=bg ctermfg=155 gui=NONE guibg=bg guifg=#A8FF60 + CSAHi Number term=NONE cterm=NONE ctermbg=bg ctermfg=114 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Boolean term=NONE cterm=NONE ctermbg=bg ctermfg=114 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Float term=NONE cterm=NONE ctermbg=bg ctermfg=114 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Function term=NONE cterm=NONE ctermbg=bg ctermfg=186 gui=NONE guibg=bg guifg=#DAD085 + CSAHi vimMenuMap term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_inactive_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_inactive_tabsel_0 term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineMiddle_inactive term=NONE cterm=NONE ctermbg=236 ctermfg=245 gui=NONE guibg=#303030 guifg=#8a8a8a + CSAHi LightLineRight_inactive_0_1 term=NONE cterm=NONE ctermbg=235 ctermfg=59 gui=NONE guibg=#262626 guifg=#606060 + CSAHi LightLineRight_inactive_0 term=NONE cterm=NONE ctermbg=59 ctermfg=235 gui=NONE guibg=#606060 guifg=#262626 + CSAHi LightLineRight_inactive_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=59 gui=NONE guibg=#262626 guifg=#606060 + CSAHi LightLineRight_inactive_tabsel_0 term=NONE cterm=NONE ctermbg=59 ctermfg=235 gui=NONE guibg=#606060 guifg=#262626 + CSAHi LightLineRight_inactive_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_inactive_1 term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineRight_inactive_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi vimEcho term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimIf term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_3 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_3_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiLink term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Conditional term=NONE cterm=NONE ctermbg=bg ctermfg=117 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi vimHiKeyList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Label term=NONE cterm=NONE ctermbg=bg ctermfg=155 gui=NONE guibg=bg guifg=#A8FF60 + CSAHi Operator term=NONE cterm=NONE ctermbg=bg ctermfg=117 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi Keyword term=NONE cterm=NONE ctermbg=bg ctermfg=117 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi Exception term=NONE cterm=NONE ctermbg=bg ctermfg=186 gui=NONE guibg=bg guifg=#DAD085 + CSAHi Define term=NONE cterm=NONE ctermbg=bg ctermfg=81 gui=NONE guibg=bg guifg=#66D9EF + CSAHi Macro term=NONE cterm=NONE ctermbg=bg ctermfg=180 gui=NONE guibg=bg guifg=#C4BE89 + CSAHi PreCondit term=NONE cterm=NONE ctermbg=bg ctermfg=186 gui=NONE guibg=bg guifg=#DAD085 + CSAHi LightLineRight_inactive_tabsel_1 term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_inactive_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_inactive_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_inactive_tabsel_1 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_inactive_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_inactive_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_inactive_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineLeft_inactive_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_inactive_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_command_0 term=bold cterm=bold ctermbg=148 ctermfg=22 gui=bold guibg=#afdf00 guifg=#005f00 + CSAHi vimFuncBody term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimFuncBlank term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimEscapeBrace term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSetEqual term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstRep term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstRange term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiTermcap term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi CursorLine term=NONE cterm=NONE ctermbg=238 ctermfg=NONE gui=NONE guibg=#293739 guifg=fg + CSAHi LightLineRight_insert_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiCtermColor term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiFontname term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiGuiFontname term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Structure term=NONE cterm=NONE ctermbg=bg ctermfg=81 gui=NONE guibg=bg guifg=#66D9EF + CSAHi Typedef term=NONE cterm=NONE ctermbg=bg ctermfg=81 gui=NONE guibg=bg guifg=#66D9EF + CSAHi Tag term=NONE cterm=NONE ctermbg=bg ctermfg=117 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi SpecialChar term=NONE cterm=NONE ctermbg=bg ctermfg=117 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi Delimiter term=NONE cterm=NONE ctermbg=bg ctermfg=245 gui=NONE guibg=bg guifg=#8F8F8F + CSAHi SpecialComment term=NONE cterm=NONE ctermbg=bg ctermfg=244 gui=NONE guibg=bg guifg=#7C7C7C + CSAHi Debug term=NONE cterm=NONE ctermbg=bg ctermfg=145 gui=NONE guibg=bg guifg=#BCA3A3 + CSAHi Cursor term=NONE cterm=NONE ctermbg=243 ctermfg=255 gui=NONE guibg=#777777 guifg=#F1F1F1 + CSAHi iCursor term=NONE cterm=NONE ctermbg=243 ctermfg=255 gui=NONE guibg=#777777 guifg=#F1F1F1 + CSAHi PmenuSbar term=NONE cterm=NONE ctermbg=232 ctermfg=fg gui=NONE guibg=#080808 guifg=fg + CSAHi LightLineLeft_command_0_1 term=NONE cterm=NONE ctermbg=240 ctermfg=148 gui=NONE guibg=#585858 guifg=#afdf00 + CSAHi LightLineLeft_command_0_tabsel term=bold cterm=bold ctermbg=235 ctermfg=148 gui=bold guibg=#262626 guifg=#afdf00 + CSAHi LightLineLeft_command_tabsel_0 term=bold cterm=bold ctermbg=148 ctermfg=235 gui=bold guibg=#afdf00 guifg=#262626 + CSAHi LightLineLeft_command_1 term=NONE cterm=NONE ctermbg=240 ctermfg=231 gui=NONE guibg=#585858 guifg=#ffffff + CSAHi LightLineLeft_command_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=240 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineLeft_command_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineLeft_command_tabsel_1 term=NONE cterm=NONE ctermbg=240 ctermfg=235 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineMiddle_command term=NONE cterm=NONE ctermbg=236 ctermfg=245 gui=NONE guibg=#303030 guifg=#8a8a8a + CSAHi LightLineRight_command_0_1 term=NONE cterm=NONE ctermbg=240 ctermfg=252 gui=NONE guibg=#585858 guifg=#d0d0d0 + CSAHi LightLineRight_command_0 term=NONE cterm=NONE ctermbg=252 ctermfg=59 gui=NONE guibg=#d0d0d0 guifg=#606060 + CSAHi LightLineRight_normal_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCommentTitleLeader term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimGlobal term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_0_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=252 gui=NONE guibg=#262626 guifg=#d0d0d0 + CSAHi LightLineRight_command_tabsel_0 term=NONE cterm=NONE ctermbg=252 ctermfg=235 gui=NONE guibg=#d0d0d0 guifg=#262626 + CSAHi LightLineRight_command_1_2 term=NONE cterm=NONE ctermbg=236 ctermfg=240 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineRight_command_1 term=NONE cterm=NONE ctermbg=240 ctermfg=250 gui=NONE guibg=#585858 guifg=#bcbcbc + CSAHi LightLineRight_command_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=240 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineRight_command_tabsel_1 term=NONE cterm=NONE ctermbg=240 ctermfg=235 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineRight_command_2_3 term=NONE cterm=NONE ctermbg=236 ctermfg=236 gui=NONE guibg=#303030 guifg=#303030 + CSAHi LightLineRight_command_2 term=NONE cterm=NONE ctermbg=236 ctermfg=247 gui=NONE guibg=#303030 guifg=#9e9e9e + CSAHi LightLineRight_command_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_command_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_command_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimPatRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCollection term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstPat term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstRep4 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSyncMatch term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSyncLinebreak term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Todo term=NONE cterm=NONE ctermbg=234 ctermfg=231 gui=NONE guibg=bg guifg=#FFFFFF + CSAHi vimSyncRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimExtCmd term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimFilter term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSet term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_command_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=250 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_command_tabsel_2 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_command_2_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_command_tabsel_3 term=NONE cterm=NONE ctermbg=236 ctermfg=235 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_command_3_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=236 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineLeft_command_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_command_tabsel_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=235 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_command_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCollClass term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi pythonSpaceError term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi pythonSync term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMapLhs term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAutoCmdSpace term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAutoEventList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAutoCmdSfxList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMapRhs term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMapRhsExtend term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi StorageClass term=NONE cterm=NONE ctermbg=bg ctermfg=146 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi LightLineLeft_normal_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimPythonRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAugroupSyncA term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_3 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_3_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimGroupList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMenuBang term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMenuPriority term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi CursorLineNr term=bold cterm=NONE ctermbg=bg ctermfg=146 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi Question term=NONE cterm=bold ctermbg=bg ctermfg=81 gui=bold guibg=bg guifg=#66D9EF + CSAHi StatusLine term=bold,reverse cterm=NONE ctermbg=231 ctermfg=59 gui=NONE guibg=fg guifg=#455354 + CSAHi StatusLineNC term=reverse cterm=reverse ctermbg=244 ctermfg=232 gui=reverse guibg=#080808 guifg=#808080 + CSAHi VertSplit term=reverse cterm=reverse ctermbg=244 ctermfg=232 gui=reverse guibg=#080808 guifg=#808080 + CSAHi Title term=bold cterm=NONE ctermbg=bg ctermfg=146 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi Visual term=reverse cterm=NONE ctermbg=59 ctermfg=fg gui=NONE guibg=#403D3D guifg=fg + CSAHi VisualNOS term=NONE cterm=NONE ctermbg=59 ctermfg=fg gui=NONE guibg=#403D3D guifg=fg + CSAHi WarningMsg term=NONE cterm=NONE ctermbg=236 ctermfg=231 gui=NONE guibg=#333333 guifg=#FFFFFF + CSAHi WildMenu term=NONE cterm=NONE ctermbg=16 ctermfg=81 gui=NONE guibg=#000000 guifg=#66D9EF + CSAHi LightLineLeft_normal_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_3 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_3_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAuSyntax term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimUserCmd term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCmdSep term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimIsCommand term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_0 term=bold cterm=bold ctermbg=148 ctermfg=22 gui=bold guibg=#afdf00 guifg=#005f00 + CSAHi LightLineLeft_normal_0_1 term=NONE cterm=NONE ctermbg=240 ctermfg=148 gui=NONE guibg=#585858 guifg=#afdf00 + CSAHi LightLineLeft_insert_0 term=bold cterm=bold ctermbg=231 ctermfg=23 gui=bold guibg=#ffffff guifg=#005f5f + CSAHi LightLineLeft_insert_0_1 term=NONE cterm=NONE ctermbg=31 ctermfg=231 gui=NONE guibg=#0087af guifg=#ffffff + CSAHi LightLineLeft_insert_0_tabsel term=bold cterm=bold ctermbg=235 ctermfg=231 gui=bold guibg=#262626 guifg=#ffffff + CSAHi LightLineLeft_insert_tabsel_0 term=bold cterm=bold ctermbg=231 ctermfg=235 gui=bold guibg=#ffffff guifg=#262626 + CSAHi LightLineLeft_insert_1 term=NONE cterm=NONE ctermbg=31 ctermfg=231 gui=NONE guibg=#0087af guifg=#ffffff + CSAHi LightLineLeft_insert_1_2 term=NONE cterm=NONE ctermbg=24 ctermfg=31 gui=NONE guibg=#005f87 guifg=#0087af + CSAHi LightLineLeft_insert_1_tabsel term=NONE cterm=NONE ctermbg=235 ctermfg=31 gui=NONE guibg=#262626 guifg=#0087af + CSAHi LightLineLeft_insert_tabsel_1 term=NONE cterm=NONE ctermbg=31 ctermfg=235 gui=NONE guibg=#0087af guifg=#262626 + CSAHi LightLineMiddle_insert term=NONE cterm=NONE ctermbg=24 ctermfg=117 gui=NONE guibg=#005f87 guifg=#87dfff + CSAHi LightLineRight_insert_0_1 term=NONE cterm=NONE ctermbg=31 ctermfg=117 gui=NONE guibg=#0087af guifg=#87dfff + CSAHi vimNormCmds term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Folded term=NONE cterm=NONE ctermbg=16 ctermfg=59 gui=NONE guibg=#000000 guifg=#465457 + CSAHi FoldColumn term=NONE cterm=NONE ctermbg=16 ctermfg=59 gui=NONE guibg=#000000 guifg=#465457 + CSAHi DiffAdd term=bold cterm=NONE ctermbg=23 ctermfg=fg gui=NONE guibg=#13354A guifg=fg + CSAHi DiffChange term=bold cterm=NONE ctermbg=59 ctermfg=102 gui=NONE guibg=#4C4745 guifg=#89807D + CSAHi DiffDelete term=bold cterm=bold ctermbg=16 ctermfg=89 gui=bold guibg=#1E0010 guifg=#960050 + CSAHi DiffText term=reverse cterm=NONE ctermbg=59 ctermfg=fg gui=NONE guibg=#4C4745 guifg=fg + CSAHi SignColumn term=NONE cterm=NONE ctermbg=235 ctermfg=186 gui=NONE guibg=#232526 guifg=#DAD085 + CSAHi Conceal term=NONE cterm=NONE ctermbg=248 ctermfg=252 gui=NONE guibg=DarkGrey guifg=LightGrey + CSAHi SpellBad term=reverse cterm=undercurl ctermbg=bg ctermfg=196 gui=undercurl guibg=bg guifg=fg guisp=#FF0000 + CSAHi SpellCap term=reverse cterm=undercurl ctermbg=bg ctermfg=63 gui=undercurl guibg=bg guifg=fg guisp=#7070F0 +elseif has("gui_running") || &t_Co == 88 + CSAHi Normal term=NONE cterm=NONE ctermbg=80 ctermfg=79 gui=NONE guibg=#1D1F21 guifg=#F8F8F2 + CSAHi vimFiletype term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimExecute term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimFunction term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_0_tabsel term=bold cterm=bold ctermbg=80 ctermfg=56 gui=bold guibg=#262626 guifg=#afdf00 + CSAHi LightLineLeft_normal_tabsel_0 term=bold cterm=bold ctermbg=56 ctermfg=80 gui=bold guibg=#afdf00 guifg=#262626 + CSAHi LightLineLeft_normal_1 term=NONE cterm=NONE ctermbg=81 ctermfg=79 gui=NONE guibg=#585858 guifg=#ffffff + CSAHi LightLineLeft_normal_1_2 term=NONE cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineLeft_normal_1_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineLeft_normal_tabsel_1 term=NONE cterm=NONE ctermbg=81 ctermfg=80 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineMiddle_normal term=NONE cterm=NONE ctermbg=80 ctermfg=83 gui=NONE guibg=#303030 guifg=#8a8a8a + CSAHi LightLineRight_normal_0_1 term=NONE cterm=NONE ctermbg=81 ctermfg=86 gui=NONE guibg=#585858 guifg=#d0d0d0 + CSAHi LightLineRight_normal_0 term=NONE cterm=NONE ctermbg=86 ctermfg=81 gui=NONE guibg=#d0d0d0 guifg=#606060 + CSAHi LightLineRight_normal_0_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=86 gui=NONE guibg=#262626 guifg=#d0d0d0 + CSAHi SpecialKey term=bold cterm=NONE ctermbg=bg ctermfg=81 gui=NONE guibg=bg guifg=#465457 + CSAHi NonText term=bold cterm=bold ctermbg=bg ctermfg=81 gui=bold guibg=bg guifg=#465457 + CSAHi Directory term=bold cterm=NONE ctermbg=bg ctermfg=84 gui=NONE guibg=bg guifg=#AAAAAA + CSAHi ErrorMsg term=NONE cterm=NONE ctermbg=80 ctermfg=43 gui=NONE guibg=#232526 guifg=#92C5F7 + CSAHi IncSearch term=reverse cterm=reverse ctermbg=57 ctermfg=16 gui=reverse guibg=#000000 guifg=#C4BE89 + CSAHi Search term=reverse cterm=NONE ctermbg=61 ctermfg=16 gui=NONE guibg=#B4EC85 guifg=#000000 + CSAHi MoreMsg term=bold cterm=bold ctermbg=bg ctermfg=45 gui=bold guibg=bg guifg=#A8FF60 + CSAHi ModeMsg term=bold cterm=bold ctermbg=bg ctermfg=45 gui=bold guibg=bg guifg=#A8FF60 + CSAHi LineNr term=underline cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#232526 guifg=#465457 + CSAHi LightLineRight_insert_0 term=NONE cterm=NONE ctermbg=43 ctermfg=21 gui=NONE guibg=#87dfff guifg=#005f5f + CSAHi LightLineRight_insert_0_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=43 gui=NONE guibg=#262626 guifg=#87dfff + CSAHi LightLineRight_insert_tabsel_0 term=NONE cterm=NONE ctermbg=43 ctermfg=80 gui=NONE guibg=#87dfff guifg=#262626 + CSAHi LightLineRight_insert_1_2 term=NONE cterm=NONE ctermbg=21 ctermfg=22 gui=NONE guibg=#005f87 guifg=#0087af + CSAHi LightLineRight_insert_1 term=NONE cterm=NONE ctermbg=22 ctermfg=43 gui=NONE guibg=#0087af guifg=#87dfff + CSAHi LightLineRight_insert_1_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=22 gui=NONE guibg=#262626 guifg=#0087af + CSAHi LightLineRight_insert_tabsel_1 term=NONE cterm=NONE ctermbg=22 ctermfg=80 gui=NONE guibg=#0087af guifg=#262626 + CSAHi LightLineRight_insert_2_3 term=NONE cterm=NONE ctermbg=21 ctermfg=21 gui=NONE guibg=#005f87 guifg=#005f87 + CSAHi LightLineRight_insert_2 term=NONE cterm=NONE ctermbg=21 ctermfg=43 gui=NONE guibg=#005f87 guifg=#87dfff + CSAHi LightLineRight_insert_2_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=21 gui=NONE guibg=#262626 guifg=#005f87 + CSAHi vimClusterName term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi SpellRare term=reverse cterm=undercurl ctermbg=bg ctermfg=79 gui=undercurl guibg=bg guifg=fg guisp=#FFFFFF + CSAHi SpellLocal term=underline cterm=undercurl ctermbg=bg ctermfg=47 gui=undercurl guibg=bg guifg=fg guisp=#70F0F0 + CSAHi Pmenu term=NONE cterm=NONE ctermbg=16 ctermfg=43 gui=NONE guibg=#000000 guifg=#66D9EF + CSAHi PmenuSel term=NONE cterm=NONE ctermbg=83 ctermfg=fg gui=NONE guibg=#808080 guifg=fg + CSAHi vimSynKeyRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi PmenuThumb term=NONE cterm=NONE ctermbg=16 ctermfg=43 gui=NONE guibg=Black guifg=#66D9EF + CSAHi TabLine term=underline cterm=NONE ctermbg=80 ctermfg=83 gui=NONE guibg=#1D1F21 guifg=#808080 + CSAHi TabLineSel term=bold cterm=bold ctermbg=bg ctermfg=fg gui=bold guibg=bg guifg=fg + CSAHi TabLineFill term=reverse cterm=reverse ctermbg=80 ctermfg=80 gui=reverse guibg=#1D1F21 guifg=#1D1F21 + CSAHi CursorColumn term=reverse cterm=NONE ctermbg=80 ctermfg=fg gui=NONE guibg=#293739 guifg=fg + CSAHi Identifier term=underline cterm=NONE ctermbg=bg ctermfg=59 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi NERDTreeLink term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimOperParen term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynLine term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_tabsel_0 term=NONE cterm=NONE ctermbg=86 ctermfg=80 gui=NONE guibg=#d0d0d0 guifg=#262626 + CSAHi LightLineRight_normal_1_2 term=NONE cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineRight_normal_1 term=NONE cterm=NONE ctermbg=81 ctermfg=85 gui=NONE guibg=#585858 guifg=#bcbcbc + CSAHi LightLineRight_normal_1_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineRight_normal_tabsel_1 term=NONE cterm=NONE ctermbg=81 ctermfg=80 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineRight_normal_2_3 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#303030 guifg=#303030 + CSAHi LightLineRight_normal_2 term=NONE cterm=NONE ctermbg=80 ctermfg=84 gui=NONE guibg=#303030 guifg=#9e9e9e + CSAHi LightLineRight_normal_2_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_normal_tabsel_2 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_normal_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=85 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_insert_tabsel_2 term=NONE cterm=NONE ctermbg=21 ctermfg=80 gui=NONE guibg=#005f87 guifg=#262626 + CSAHi LightLineLeft_insert_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=85 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_insert_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=85 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_insert_tabsel_2 term=NONE cterm=NONE ctermbg=21 ctermfg=80 gui=NONE guibg=#005f87 guifg=#262626 + CSAHi LightLineLeft_insert_2_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=21 gui=NONE guibg=#262626 guifg=#005f87 + CSAHi LightLineRight_insert_tabsel_3 term=NONE cterm=NONE ctermbg=21 ctermfg=80 gui=NONE guibg=#005f87 guifg=#262626 + CSAHi LightLineRight_insert_3_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=21 gui=NONE guibg=#262626 guifg=#005f87 + CSAHi LightLineLeft_insert_tabsel_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_insert_tabsel_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_insert_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynMatchRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynMtchCchar term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynMtchGroup term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi ColorColumn term=reverse cterm=NONE ctermbg=86 ctermfg=fg gui=NONE guibg=lightgray guifg=fg + CSAHi MatchParen term=reverse cterm=NONE ctermbg=80 ctermfg=85 gui=NONE guibg=#444444 guifg=#B7B9B8 + CSAHi Comment term=bold cterm=NONE ctermbg=bg ctermfg=82 gui=NONE guibg=bg guifg=#7C7C7C + CSAHi Constant term=underline cterm=NONE ctermbg=bg ctermfg=41 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Special term=bold cterm=NONE ctermbg=80 ctermfg=43 gui=NONE guibg=bg guifg=#66D9EF + CSAHi vimSynRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Statement term=bold cterm=NONE ctermbg=bg ctermfg=43 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi PreProc term=underline cterm=NONE ctermbg=bg ctermfg=57 gui=NONE guibg=bg guifg=#DAD085 + CSAHi Type term=underline cterm=NONE ctermbg=bg ctermfg=43 gui=NONE guibg=bg guifg=#66D9EF + CSAHi LightLineLeft_inactive_0 term=NONE cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineLeft_inactive_0_1 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#303030 guifg=#262626 + CSAHi vimMenuRhs term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAugroup term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAugroupError term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=85 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_normal_tabsel_2 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_normal_2_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_normal_tabsel_3 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_normal_3_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineLeft_normal_tabsel_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_normal_tabsel_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#262626 + CSAHi Repeat term=NONE cterm=NONE ctermbg=bg ctermfg=43 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi LightLineLeft_insert_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiBang term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSynPatMod term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSyncLines term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Underlined term=underline cterm=underline ctermbg=bg ctermfg=83 gui=underline guibg=bg guifg=#808080 + CSAHi Ignore term=NONE cterm=NONE ctermbg=80 ctermfg=83 gui=NONE guibg=bg guifg=#808080 + CSAHi Error term=reverse cterm=NONE ctermbg=16 ctermfg=45 gui=NONE guibg=#1E0010 guifg=#A8FF60 + CSAHi vimSyncLinecont term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi String term=NONE cterm=NONE ctermbg=bg ctermfg=45 gui=NONE guibg=bg guifg=#A8FF60 + CSAHi Character term=NONE cterm=NONE ctermbg=bg ctermfg=45 gui=NONE guibg=bg guifg=#A8FF60 + CSAHi Number term=NONE cterm=NONE ctermbg=bg ctermfg=41 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Boolean term=NONE cterm=NONE ctermbg=bg ctermfg=41 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Float term=NONE cterm=NONE ctermbg=bg ctermfg=41 gui=NONE guibg=bg guifg=#99CC99 + CSAHi Function term=NONE cterm=NONE ctermbg=bg ctermfg=57 gui=NONE guibg=bg guifg=#DAD085 + CSAHi vimMenuMap term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_inactive_0_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_inactive_tabsel_0 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineMiddle_inactive term=NONE cterm=NONE ctermbg=80 ctermfg=83 gui=NONE guibg=#303030 guifg=#8a8a8a + CSAHi LightLineRight_inactive_0_1 term=NONE cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#262626 guifg=#606060 + CSAHi LightLineRight_inactive_0 term=NONE cterm=NONE ctermbg=81 ctermfg=80 gui=NONE guibg=#606060 guifg=#262626 + CSAHi LightLineRight_inactive_0_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#262626 guifg=#606060 + CSAHi LightLineRight_inactive_tabsel_0 term=NONE cterm=NONE ctermbg=81 ctermfg=80 gui=NONE guibg=#606060 guifg=#262626 + CSAHi LightLineRight_inactive_1_2 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_inactive_1 term=NONE cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineRight_inactive_1_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#262626 + CSAHi vimEcho term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimIf term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_raw_3 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_insert_3_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiLink term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Conditional term=NONE cterm=NONE ctermbg=bg ctermfg=43 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi vimHiKeyList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Label term=NONE cterm=NONE ctermbg=bg ctermfg=45 gui=NONE guibg=bg guifg=#A8FF60 + CSAHi Operator term=NONE cterm=NONE ctermbg=bg ctermfg=43 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi Keyword term=NONE cterm=NONE ctermbg=bg ctermfg=43 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi Exception term=NONE cterm=NONE ctermbg=bg ctermfg=57 gui=NONE guibg=bg guifg=#DAD085 + CSAHi Define term=NONE cterm=NONE ctermbg=bg ctermfg=43 gui=NONE guibg=bg guifg=#66D9EF + CSAHi Macro term=NONE cterm=NONE ctermbg=bg ctermfg=57 gui=NONE guibg=bg guifg=#C4BE89 + CSAHi PreCondit term=NONE cterm=NONE ctermbg=bg ctermfg=57 gui=NONE guibg=bg guifg=#DAD085 + CSAHi LightLineRight_inactive_tabsel_1 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_inactive_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=85 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_inactive_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=85 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_inactive_tabsel_1 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_inactive_1_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_inactive_tabsel_2 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_inactive_2_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineLeft_inactive_tabsel_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_inactive_tabsel_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_command_0 term=bold cterm=bold ctermbg=56 ctermfg=20 gui=bold guibg=#afdf00 guifg=#005f00 + CSAHi vimFuncBody term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimFuncBlank term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimEscapeBrace term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSetEqual term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstRep term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstRange term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiTermcap term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi CursorLine term=underline cterm=NONE ctermbg=80 ctermfg=fg gui=NONE guibg=#293739 guifg=fg + CSAHi LightLineRight_insert_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiCtermColor term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiFontname term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimHiGuiFontname term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Structure term=NONE cterm=NONE ctermbg=bg ctermfg=43 gui=NONE guibg=bg guifg=#66D9EF + CSAHi Typedef term=NONE cterm=NONE ctermbg=bg ctermfg=43 gui=NONE guibg=bg guifg=#66D9EF + CSAHi Tag term=NONE cterm=NONE ctermbg=bg ctermfg=43 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi SpecialChar term=NONE cterm=NONE ctermbg=bg ctermfg=43 gui=NONE guibg=bg guifg=#92C5F7 + CSAHi Delimiter term=NONE cterm=NONE ctermbg=bg ctermfg=83 gui=NONE guibg=bg guifg=#8F8F8F + CSAHi SpecialComment term=NONE cterm=NONE ctermbg=bg ctermfg=82 gui=NONE guibg=bg guifg=#7C7C7C + CSAHi Debug term=NONE cterm=NONE ctermbg=bg ctermfg=53 gui=NONE guibg=bg guifg=#BCA3A3 + CSAHi Cursor term=NONE cterm=NONE ctermbg=82 ctermfg=87 gui=NONE guibg=#777777 guifg=#F1F1F1 + CSAHi iCursor term=NONE cterm=NONE ctermbg=82 ctermfg=87 gui=NONE guibg=#777777 guifg=#F1F1F1 + CSAHi PmenuSbar term=NONE cterm=NONE ctermbg=16 ctermfg=fg gui=NONE guibg=#080808 guifg=fg + CSAHi LightLineLeft_command_0_1 term=NONE cterm=NONE ctermbg=81 ctermfg=56 gui=NONE guibg=#585858 guifg=#afdf00 + CSAHi LightLineLeft_command_0_tabsel term=bold cterm=bold ctermbg=80 ctermfg=56 gui=bold guibg=#262626 guifg=#afdf00 + CSAHi LightLineLeft_command_tabsel_0 term=bold cterm=bold ctermbg=56 ctermfg=80 gui=bold guibg=#afdf00 guifg=#262626 + CSAHi LightLineLeft_command_1 term=NONE cterm=NONE ctermbg=81 ctermfg=79 gui=NONE guibg=#585858 guifg=#ffffff + CSAHi LightLineLeft_command_1_2 term=NONE cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineLeft_command_1_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineLeft_command_tabsel_1 term=NONE cterm=NONE ctermbg=81 ctermfg=80 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineMiddle_command term=NONE cterm=NONE ctermbg=80 ctermfg=83 gui=NONE guibg=#303030 guifg=#8a8a8a + CSAHi LightLineRight_command_0_1 term=NONE cterm=NONE ctermbg=81 ctermfg=86 gui=NONE guibg=#585858 guifg=#d0d0d0 + CSAHi LightLineRight_command_0 term=NONE cterm=NONE ctermbg=86 ctermfg=81 gui=NONE guibg=#d0d0d0 guifg=#606060 + CSAHi LightLineRight_normal_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_insert_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCommentTitleLeader term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimGlobal term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_0_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=86 gui=NONE guibg=#262626 guifg=#d0d0d0 + CSAHi LightLineRight_command_tabsel_0 term=NONE cterm=NONE ctermbg=86 ctermfg=80 gui=NONE guibg=#d0d0d0 guifg=#262626 + CSAHi LightLineRight_command_1_2 term=NONE cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#303030 guifg=#585858 + CSAHi LightLineRight_command_1 term=NONE cterm=NONE ctermbg=81 ctermfg=85 gui=NONE guibg=#585858 guifg=#bcbcbc + CSAHi LightLineRight_command_1_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=81 gui=NONE guibg=#262626 guifg=#585858 + CSAHi LightLineRight_command_tabsel_1 term=NONE cterm=NONE ctermbg=81 ctermfg=80 gui=NONE guibg=#585858 guifg=#262626 + CSAHi LightLineRight_command_2_3 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#303030 guifg=#303030 + CSAHi LightLineRight_command_2 term=NONE cterm=NONE ctermbg=80 ctermfg=84 gui=NONE guibg=#303030 guifg=#9e9e9e + CSAHi LightLineRight_command_2_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_command_tabsel_2 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_command_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimPatRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCollection term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstPat term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSubstRep4 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSyncMatch term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSyncLinebreak term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Todo term=NONE cterm=NONE ctermbg=80 ctermfg=79 gui=NONE guibg=bg guifg=#FFFFFF + CSAHi vimSyncRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimExtCmd term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimFilter term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimSet term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=85 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineRight_command_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=85 gui=NONE guibg=#262626 guifg=#bcbcbc + CSAHi LightLineLeft_command_tabsel_2 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineLeft_command_2_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineRight_command_tabsel_3 term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#303030 guifg=#262626 + CSAHi LightLineRight_command_3_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#303030 + CSAHi LightLineLeft_command_tabsel_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineRight_command_tabsel_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=80 gui=NONE guibg=#262626 guifg=#262626 + CSAHi LightLineLeft_command_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCollClass term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_1_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_0_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_0 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi pythonSpaceError term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_1 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi pythonSync term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMapLhs term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAutoCmdSpace term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAutoEventList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAutoCmdSfxList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMapRhs term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMapRhsExtend term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi StorageClass term=NONE cterm=NONE ctermbg=bg ctermfg=59 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi LightLineLeft_normal_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimPythonRegion term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAugroupSyncA term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_tabsel_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_tabsel term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_2 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_3 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_3_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_command_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_command_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimGroupList term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMenuBang term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimMenuPriority term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi CursorLineNr term=bold cterm=NONE ctermbg=bg ctermfg=59 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi Question term=NONE cterm=bold ctermbg=bg ctermfg=43 gui=bold guibg=bg guifg=#66D9EF + CSAHi StatusLine term=bold,reverse cterm=NONE ctermbg=79 ctermfg=21 gui=NONE guibg=fg guifg=#455354 + CSAHi StatusLineNC term=reverse cterm=reverse ctermbg=83 ctermfg=16 gui=reverse guibg=#080808 guifg=#808080 + CSAHi VertSplit term=reverse cterm=reverse ctermbg=83 ctermfg=16 gui=reverse guibg=#080808 guifg=#808080 + CSAHi Title term=bold cterm=NONE ctermbg=bg ctermfg=59 gui=NONE guibg=bg guifg=#B6B7EB + CSAHi Visual term=reverse cterm=NONE ctermbg=80 ctermfg=fg gui=NONE guibg=#403D3D guifg=fg + CSAHi VisualNOS term=NONE cterm=NONE ctermbg=80 ctermfg=fg gui=NONE guibg=#403D3D guifg=fg + CSAHi WarningMsg term=NONE cterm=NONE ctermbg=80 ctermfg=79 gui=NONE guibg=#333333 guifg=#FFFFFF + CSAHi WildMenu term=NONE cterm=NONE ctermbg=16 ctermfg=43 gui=NONE guibg=#000000 guifg=#66D9EF + CSAHi LightLineLeft_normal_2_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_3 term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_3_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimAuSyntax term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineRight_normal_raw_raw term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimUserCmd term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimCmdSep term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi vimIsCommand term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi LightLineLeft_normal_0 term=bold cterm=bold ctermbg=56 ctermfg=20 gui=bold guibg=#afdf00 guifg=#005f00 + CSAHi LightLineLeft_normal_0_1 term=NONE cterm=NONE ctermbg=81 ctermfg=56 gui=NONE guibg=#585858 guifg=#afdf00 + CSAHi LightLineLeft_insert_0 term=bold cterm=bold ctermbg=79 ctermfg=21 gui=bold guibg=#ffffff guifg=#005f5f + CSAHi LightLineLeft_insert_0_1 term=NONE cterm=NONE ctermbg=22 ctermfg=79 gui=NONE guibg=#0087af guifg=#ffffff + CSAHi LightLineLeft_insert_0_tabsel term=bold cterm=bold ctermbg=80 ctermfg=79 gui=bold guibg=#262626 guifg=#ffffff + CSAHi LightLineLeft_insert_tabsel_0 term=bold cterm=bold ctermbg=79 ctermfg=80 gui=bold guibg=#ffffff guifg=#262626 + CSAHi LightLineLeft_insert_1 term=NONE cterm=NONE ctermbg=22 ctermfg=79 gui=NONE guibg=#0087af guifg=#ffffff + CSAHi LightLineLeft_insert_1_2 term=NONE cterm=NONE ctermbg=21 ctermfg=22 gui=NONE guibg=#005f87 guifg=#0087af + CSAHi LightLineLeft_insert_1_tabsel term=NONE cterm=NONE ctermbg=80 ctermfg=22 gui=NONE guibg=#262626 guifg=#0087af + CSAHi LightLineLeft_insert_tabsel_1 term=NONE cterm=NONE ctermbg=22 ctermfg=80 gui=NONE guibg=#0087af guifg=#262626 + CSAHi LightLineMiddle_insert term=NONE cterm=NONE ctermbg=21 ctermfg=43 gui=NONE guibg=#005f87 guifg=#87dfff + CSAHi LightLineRight_insert_0_1 term=NONE cterm=NONE ctermbg=22 ctermfg=43 gui=NONE guibg=#0087af guifg=#87dfff + CSAHi vimNormCmds term=NONE cterm=NONE ctermbg=bg ctermfg=fg gui=NONE guibg=bg guifg=fg + CSAHi Folded term=NONE cterm=NONE ctermbg=16 ctermfg=81 gui=NONE guibg=#000000 guifg=#465457 + CSAHi FoldColumn term=NONE cterm=NONE ctermbg=16 ctermfg=81 gui=NONE guibg=#000000 guifg=#465457 + CSAHi DiffAdd term=bold cterm=NONE ctermbg=17 ctermfg=fg gui=NONE guibg=#13354A guifg=fg + CSAHi DiffChange term=bold cterm=NONE ctermbg=36 ctermfg=37 gui=NONE guibg=#4C4745 guifg=#89807D + CSAHi DiffDelete term=bold cterm=bold ctermbg=16 ctermfg=33 gui=bold guibg=#1E0010 guifg=#960050 + CSAHi DiffText term=reverse cterm=NONE ctermbg=36 ctermfg=fg gui=NONE guibg=#4C4745 guifg=fg + CSAHi SignColumn term=NONE cterm=NONE ctermbg=80 ctermfg=57 gui=NONE guibg=#232526 guifg=#DAD085 + CSAHi Conceal term=NONE cterm=NONE ctermbg=84 ctermfg=86 gui=NONE guibg=DarkGrey guifg=LightGrey + CSAHi SpellBad term=reverse cterm=undercurl ctermbg=bg ctermfg=64 gui=undercurl guibg=bg guifg=fg guisp=#FF0000 + CSAHi SpellCap term=reverse cterm=undercurl ctermbg=bg ctermfg=39 gui=undercurl guibg=bg guifg=fg guisp=#7070F0 +endif + +if 1 + delcommand CSAHi +endif +set background=dark diff --git a/colors/atom-dark.vim b/colors/atom-dark.vim new file mode 100644 index 0000000..bf1da9a --- /dev/null +++ b/colors/atom-dark.vim @@ -0,0 +1,115 @@ +" Vim color file +" +" Author: Federico Ramirez +" https://github.com/gosukiwi/vim-atom-dark +" +" Note: Based on the Monokai theme variation by Tomas Restrepo +" https://github.com/tomasr/molokai + +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="atom-dark" + +hi Boolean guifg=#99CC99 +hi Character guifg=#A8FF60 +hi Number guifg=#99CC99 +hi String guifg=#A8FF60 +hi Conditional guifg=#92C5F7 gui=none +hi Constant guifg=#99CC99 gui=none +hi Cursor guifg=#F1F1F1 guibg=#777777 +hi iCursor guifg=#F1F1F1 guibg=#777777 +hi Debug guifg=#BCA3A3 gui=none +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=none + +hi Directory guifg=#AAAAAA gui=none +hi Error guifg=#A8FF60 guibg=#1E0010 +hi ErrorMsg guifg=#92C5F7 guibg=#232526 gui=none +hi Exception guifg=#DAD085 gui=none +hi Float guifg=#99CC99 +hi FoldColumn guifg=#465457 guibg=#000000 +hi Folded guifg=#465457 guibg=#000000 +hi Function guifg=#DAD085 +hi Identifier guifg=#B6B7EB +hi Ignore guifg=#808080 guibg=bg +hi IncSearch guifg=#C4BE89 guibg=#000000 + +hi Keyword guifg=#92C5F7 gui=none +hi Label guifg=#A8FF60 gui=none +hi Macro guifg=#C4BE89 gui=none +hi SpecialKey guifg=#66D9EF gui=none + +hi MatchParen guifg=#B7B9B8 guibg=#444444 gui=none +hi ModeMsg guifg=#A8FF60 +hi MoreMsg guifg=#A8FF60 +hi Operator guifg=#92C5F7 + +" complete menu +hi Pmenu guifg=#66D9EF guibg=#000000 +hi PmenuSel guibg=#808080 +hi PmenuSbar guibg=#080808 +hi PmenuThumb guifg=#66D9EF + +hi PreCondit guifg=#DAD085 gui=none +hi PreProc guifg=#DAD085 +hi Question guifg=#66D9EF +hi Repeat guifg=#92C5F7 gui=none +hi Search guifg=#000000 guibg=#B4EC85 +" marks +hi SignColumn guifg=#DAD085 guibg=#232526 +hi SpecialChar guifg=#92C5F7 gui=none +hi SpecialComment guifg=#7C7C7C gui=none +hi Special guifg=#66D9EF guibg=bg gui=none +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=#92C5F7 gui=none +hi StatusLine guifg=#455354 guibg=fg gui=none +hi StatusLineNC guifg=#808080 guibg=#080808 +hi StorageClass guifg=#B6B7EB gui=none +hi Structure guifg=#66D9EF +hi Tag guifg=#92C5F7 gui=none +hi Title guifg=#B6B7EB gui=none +hi Todo guifg=#FFFFFF guibg=bg gui=none + +hi Typedef guifg=#66D9EF +hi Type guifg=#66D9EF gui=none +hi Underlined guifg=#808080 gui=underline + +hi VertSplit guifg=#808080 guibg=#080808 +hi VisualNOS guibg=#403D3D +hi Visual guibg=#403D3D +hi WarningMsg guifg=#FFFFFF guibg=#333333 +hi WildMenu guifg=#66D9EF guibg=#000000 + +hi TabLineFill guifg=#1D1F21 guibg=#1D1F21 +hi TabLine guibg=#1D1F21 guifg=#808080 gui=none + +hi Normal guifg=#F8F8F2 guibg=#1D1F21 +hi Comment guifg=#7C7C7C +hi CursorLine guibg=#293739 +hi CursorLineNr guifg=#B6B7EB gui=none +hi CursorColumn guibg=#293739 +hi ColorColumn guifg=#B62323 guibg=#232526 +hi LineNr guifg=#465457 guibg=#232526 +hi NonText guifg=#465457 +hi SpecialKey guifg=#465457 + +" 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/ctags.conf b/ctags.conf new file mode 100644 index 0000000..c06e1db --- /dev/null +++ b/ctags.conf @@ -0,0 +1,5 @@ +--langdef=Go +--langmap=Go:.go +--regex-Go=/func([ \t]+[)]+)?[ \t]+([a-zA-Z0-9_]+)/\2/f,func/ +--regex-Go=/var[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/v,var/ +--regex-Go=/type[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/t,type/ diff --git a/doc/NERDTree.txt b/doc/NERDTree.txt new file mode 100644 index 0000000..42c31cc --- /dev/null +++ b/doc/NERDTree.txt @@ -0,0 +1,1328 @@ +*NERDTree.txt* A tree explorer plugin that owns your momma! + + + + omg its ... ~ + + ________ ________ _ ____________ ____ __________ ____________~ + /_ __/ / / / ____/ / | / / ____/ __ \/ __ \ /_ __/ __ \/ ____/ ____/~ + / / / /_/ / __/ / |/ / __/ / /_/ / / / / / / / /_/ / __/ / __/ ~ + / / / __ / /___ / /| / /___/ _, _/ /_/ / / / / _, _/ /___/ /___ ~ + /_/ /_/ /_/_____/ /_/ |_/_____/_/ |_/_____/ /_/ /_/ |_/_____/_____/ ~ + + + Reference Manual~ + + + + +============================================================================== +CONTENTS *NERDTree-contents* + + 1.Intro...................................|NERDTree| + 2.Functionality provided..................|NERDTreeFunctionality| + 2.1.Global commands...................|NERDTreeGlobalCommands| + 2.2.Bookmarks.........................|NERDTreeBookmarks| + 2.2.1.The bookmark table..........|NERDTreeBookmarkTable| + 2.2.2.Bookmark commands...........|NERDTreeBookmarkCommands| + 2.2.3.Invalid bookmarks...........|NERDTreeInvalidBookmarks| + 2.3.NERD tree mappings................|NERDTreeMappings| + 2.4.The NERD tree menu................|NERDTreeMenu| + 3.Options.................................|NERDTreeOptions| + 3.1.Option summary....................|NERDTreeOptionSummary| + 3.2.Option details....................|NERDTreeOptionDetails| + 4.The NERD tree API.......................|NERDTreeAPI| + 4.1.Key map API.......................|NERDTreeKeymapAPI| + 4.2.Menu API..........................|NERDTreeMenuAPI| + 4.3.Menu API..........................|NERDTreeAddPathFilter()| + 4.4.Path Listener API.................|NERDTreePathListenerAPI| + 5.About...................................|NERDTreeAbout| + 6.License.................................|NERDTreeLicense| + +============================================================================== +1. Intro *NERDTree* + +What is this "NERD tree"?? + +The NERD tree allows you to explore your filesystem and to open files and +directories. It presents the filesystem to you in the form of a tree which you +manipulate with the keyboard and/or mouse. It also allows you to perform +simple filesystem operations. + +The following features and functionality are provided by the NERD tree: + * Files and directories are displayed in a hierarchical tree structure + * Different highlighting is provided for the following types of nodes: + * files + * directories + * sym-links + * windows .lnk files + * read-only files + * executable files + * Many (customisable) mappings are provided to manipulate the tree: + * Mappings to open/close/explore directory nodes + * Mappings to open files in new/existing windows/tabs + * Mappings to change the current root of the tree + * Mappings to navigate around the tree + * ... + * Directories and files can be bookmarked. + * Most NERD tree navigation can also be done with the mouse + * Filtering of tree content (can be toggled at runtime) + * custom file filters to prevent e.g. vim backup files being displayed + * optional displaying of hidden files (. files) + * files can be "turned off" so that only directories are displayed + * The position and size of the NERD tree window can be customised + * The order in which the nodes in the tree are listed can be customised. + * A model of your filesystem is created/maintained as you explore it. This + has several advantages: + * All filesystem information is cached and is only re-read on demand + * If you revisit a part of the tree that you left earlier in your + session, the directory nodes will be opened/closed as you left them + * The script remembers the cursor position and window position in the NERD + tree so you can toggle it off (or just close the tree window) and then + reopen it (with NERDTreeToggle) the NERD tree window will appear exactly + as you left it + * You can have a separate NERD tree for each tab, share trees across tabs, + or a mix of both. + * By default the script overrides the default file browser (netrw), so if + you :edit a directory a (slightly modified) NERD tree will appear in the + current window + * A programmable menu system is provided (simulates right clicking on a + node) + * one default menu plugin is provided to perform basic filesystem + operations (create/delete/move/copy files/directories) + * There's an API for adding your own keymappings + + +============================================================================== +2. Functionality provided *NERDTreeFunctionality* + +------------------------------------------------------------------------------ +2.1. Global Commands *NERDTreeGlobalCommands* + +:NERDTree [ | ] *:NERDTree* + Opens a fresh NERD tree. The root of the tree depends on the argument + given. There are 3 cases: If no argument is given, the current directory + will be used. If a directory is given, that will be used. If a bookmark + name is given, the corresponding directory will be used. For example: > + :NERDTree /home/marty/vim7/src + :NERDTree foo (foo is the name of a bookmark) +< +:NERDTreeFromBookmark *:NERDTreeFromBookmark* + Opens a fresh NERD tree with the root initialized to the dir for + . The only reason to use this command over :NERDTree is for + the completion (which is for bookmarks rather than directories). + +:NERDTreeToggle [ | ] *:NERDTreeToggle* + If a NERD tree already exists for this tab, it is reopened and rendered + again. If no NERD tree exists for this tab then this command acts the + same as the |:NERDTree| command. + +:NERDTreeFocus *:NERDTreeFocus* + Opens (or reopens) the NERD Tree if it is not currently visible; + otherwise, the cursor is moved to the already-open NERD Tree. + +:NERDTreeMirror *:NERDTreeMirror* + Shares an existing NERD tree, from another tab, in the current tab. + Changes made to one tree are reflected in both as they are actually the + same buffer. + + If only one other NERD tree exists, that tree is automatically mirrored. + If more than one exists, the script will ask which tree to mirror. + +:NERDTreeClose *:NERDTreeClose* + Close the NERD tree in this tab. + +:NERDTreeFind [] *:NERDTreeFind* + Without the optional argument, find and reveal the file for the active + buffer in the NERDTree window. With the argument, find and + reveal the specified path. + + Focus will be shifted to the NERDTree window, and the cursor will be + placed on the tree node for the determined path. If a NERDTree for the + current tab does not exist, a new one will be initialized. + +:NERDTreeCWD *:NERDTreeCWD* + Change the NERDTree root to the current working directory. If no + NERDTree exists for this tab, a new one is opened. + +:NERDTreeRefreshRoot *:NERDTreeRefreshRoot* + Refreshes the NERD tree root node. + +------------------------------------------------------------------------------ +2.2. Bookmarks *NERDTreeBookmarks* + +Bookmarks in the NERD tree are a way to tag files or directories of interest. +For example, you could use bookmarks to tag all of your project directories. + +------------------------------------------------------------------------------ +2.2.1. The Bookmark Table *NERDTreeBookmarkTable* + +If the bookmark table is active (see |NERDTree-B| and +|'NERDTreeShowBookmarks'|), it will be rendered above the tree. You can double +click bookmarks or use the |NERDTree-o| mapping to activate them. See also, +|NERDTree-t| and |NERDTree-T| + +------------------------------------------------------------------------------ +2.2.2. Bookmark commands *NERDTreeBookmarkCommands* + +Note: The following commands are only available within the NERDTree buffer. + +:Bookmark [] + Bookmark the current node as . If there is already a + bookmark, it is overwritten. must not contain spaces. + If is not provided, it defaults to the file or directory name. + For directories, a trailing slash is present. + +:BookmarkToRoot + Make the directory corresponding to the new root. If a treenode + corresponding to is already cached somewhere in the tree then + the current tree will be used, otherwise a fresh tree will be opened. + Note that if points to a file then its parent will be used + instead. + +:RevealBookmark + If the node is cached under the current root then it will be revealed + (i.e. directory nodes above it will be opened) and the cursor will be + placed on it. + +:OpenBookmark + The Bookmark named is opened as if |NERDTree-o| was applied to + its entry in the Bookmark table. If the Bookmark points to a directory, + it is made the new root of the current NERDTree. If the Bookmark points + to a file, that file is opened for editing in another window. + +:ClearBookmarks [] + Remove all the given bookmarks. If no bookmarks are given then remove all + bookmarks on the current node. + +:ClearAllBookmarks + Remove all bookmarks. + +:ReadBookmarks + Re-read the bookmarks in the |'NERDTreeBookmarksFile'|. + +See also |:NERDTree| and |:NERDTreeFromBookmark|. + +------------------------------------------------------------------------------ +2.2.3. Invalid Bookmarks *NERDTreeInvalidBookmarks* + +If invalid bookmarks are detected, the script will issue an error message and +the invalid bookmarks will become unavailable for use. + +These bookmarks will still be stored in the bookmarks file (see +|'NERDTreeBookmarksFile'|), down the bottom. There will always be a blank line +after the valid bookmarks but before the invalid ones. + +Each line in the bookmarks file represents one bookmark. The proper format is: + + +After you have corrected any invalid bookmarks, either restart vim, or go +:ReadBookmarks from the NERD tree window. + +------------------------------------------------------------------------------ +2.3. NERD tree Mappings *NERDTreeMappings* + +Default Description~ help-tag~ +Key~ + +o.......Open files, directories and bookmarks....................|NERDTree-o| +go......Open selected file, but leave cursor in the NERDTree.....|NERDTree-go| +t.......Open selected node/bookmark in a new tab.................|NERDTree-t| +T.......Same as 't' but keep the focus on the current tab........|NERDTree-T| +i.......Open selected file in a split window.....................|NERDTree-i| +gi......Same as i, but leave the cursor on the NERDTree..........|NERDTree-gi| +s.......Open selected file in a new vsplit.......................|NERDTree-s| +gs......Same as s, but leave the cursor on the NERDTree..........|NERDTree-gs| +O.......Recursively open the selected directory..................|NERDTree-O| +x.......Close the current nodes parent...........................|NERDTree-x| +X.......Recursively close all children of the current node.......|NERDTree-X| +e.......Edit the current dir.....................................|NERDTree-e| + +...............same as |NERDTree-o|. +double-click.......same as the |NERDTree-o| map. +middle-click.......same as |NERDTree-i| for files, same as + |NERDTree-e| for dirs. + +D.......Delete the current bookmark .............................|NERDTree-D| + +P.......Jump to the root node....................................|NERDTree-P| +p.......Jump to current nodes parent.............................|NERDTree-p| +K.......Jump up inside directories at the current tree depth.....|NERDTree-K| +J.......Jump down inside directories at the current tree depth...|NERDTree-J| +...Jump down to the next sibling of the current directory...|NERDTree-C-J| +...Jump up to the previous sibling of the current directory.|NERDTree-C-K| + +C.......Change the tree root to the selected dir.................|NERDTree-C| +u.......Move the tree root up one directory......................|NERDTree-u| +U.......Same as 'u' except the old root node is left open........|NERDTree-U| +r.......Recursively refresh the current directory................|NERDTree-r| +R.......Recursively refresh the current root.....................|NERDTree-R| +m.......Display the NERD tree menu...............................|NERDTree-m| +cd......Change the CWD to the dir of the selected node...........|NERDTree-cd| +CD......Change tree root to the CWD..............................|NERDTree-CD| + +I.......Toggle whether hidden files displayed....................|NERDTree-I| +f.......Toggle whether the file filters are used.................|NERDTree-f| +F.......Toggle whether files are displayed.......................|NERDTree-F| +B.......Toggle whether the bookmark table is displayed...........|NERDTree-B| + +q.......Close the NERDTree window................................|NERDTree-q| +A.......Zoom (maximize/minimize) the NERDTree window.............|NERDTree-A| +?.......Toggle the display of the quick help.....................|NERDTree-?| + +------------------------------------------------------------------------------ + *NERDTree-o* +Default key: o +Map option: NERDTreeMapActivateNode +Applies to: files and directories. + +If a file node is selected, it is opened in the previous window. + +If a directory is selected it is opened or closed depending on its current +state. + +If a bookmark that links to a directory is selected then that directory +becomes the new root. + +If a bookmark that links to a file is selected then that file is opened in the +previous window. + +------------------------------------------------------------------------------ + *NERDTree-go* +Default key: go +Map option: NERDTreeMapPreview +Applies to: files. + +If a file node is selected, it is opened in the previous window, but the +cursor does not move. + +The default key combo for this mapping is "g" + NERDTreeMapActivateNode (see +|NERDTree-o|). + +------------------------------------------------------------------------------ + *NERDTree-t* +Default key: t +Map option: NERDTreeMapOpenInTab +Applies to: files and directories. + +Opens the selected file in a new tab. If a directory is selected, a fresh +NERD Tree for that directory is opened in a new tab. + +If a bookmark which points to a directory is selected, open a NERD tree for +that directory in a new tab. If the bookmark points to a file, open that file +in a new tab. + +------------------------------------------------------------------------------ + *NERDTree-T* +Default key: T +Map option: NERDTreeMapOpenInTabSilent +Applies to: files and directories. + +The same as |NERDTree-t| except that the focus is kept in the current tab. + +------------------------------------------------------------------------------ + *NERDTree-i* +Default key: i +Map option: NERDTreeMapOpenSplit +Applies to: files. + +Opens the selected file in a new split window and puts the cursor in the new +window. + +------------------------------------------------------------------------------ + *NERDTree-gi* +Default key: gi +Map option: NERDTreeMapPreviewSplit +Applies to: files. + +The same as |NERDTree-i| except that the cursor is not moved. + +The default key combo for this mapping is "g" + NERDTreeMapOpenSplit (see +|NERDTree-i|). + +------------------------------------------------------------------------------ + *NERDTree-s* +Default key: s +Map option: NERDTreeMapOpenVSplit +Applies to: files. + +Opens the selected file in a new vertically split window and puts the cursor in +the new window. + +------------------------------------------------------------------------------ + *NERDTree-gs* +Default key: gs +Map option: NERDTreeMapPreviewVSplit +Applies to: files. + +The same as |NERDTree-s| except that the cursor is not moved. + +The default key combo for this mapping is "g" + NERDTreeMapOpenVSplit (see +|NERDTree-s|). + +------------------------------------------------------------------------------ + *NERDTree-O* +Default key: O +Map option: NERDTreeMapOpenRecursively +Applies to: directories. + +Recursively opens the selected directory. + +All files and directories are cached, but if a directory would not be +displayed due to file filters (see |'NERDTreeIgnore'| |NERDTree-f|) or the +hidden file filter (see |'NERDTreeShowHidden'|) then its contents are not +cached. This is handy, especially if you have .svn directories. + +------------------------------------------------------------------------------ + *NERDTree-x* +Default key: x +Map option: NERDTreeMapCloseDir +Applies to: files and directories. + +Closes the parent of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-X* +Default key: X +Map option: NERDTreeMapCloseChildren +Applies to: directories. + +Recursively closes all children of the selected directory. + +Tip: To quickly "reset" the tree, use |NERDTree-P| with this mapping. + +------------------------------------------------------------------------------ + *NERDTree-e* +Default key: e +Map option: NERDTreeMapOpenExpl +Applies to: files and directories. + +|:edit|s the selected directory, or the selected file's directory. This could +result in a NERD tree or a netrw being opened, depending on +|'NERDTreeHijackNetrw'|. + +------------------------------------------------------------------------------ + *NERDTree-D* +Default key: D +Map option: NERDTreeMapDeleteBookmark +Applies to: lines in the bookmarks table + +Deletes the currently selected bookmark. + +------------------------------------------------------------------------------ + *NERDTree-P* +Default key: P +Map option: NERDTreeMapJumpRoot +Applies to: no restrictions. + +Jump to the tree root. + +------------------------------------------------------------------------------ + *NERDTree-p* +Default key: p +Map option: NERDTreeMapJumpParent +Applies to: files and directories. + +Jump to the parent node of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-K* +Default key: K +Map option: NERDTreeMapJumpFirstChild +Applies to: files and directories. + +Jump to the first child of the current nodes parent. + +If the cursor is already on the first node then do the following: + * loop back thru the siblings of the current nodes parent until we find an + open dir with children + * go to the first child of that node + +------------------------------------------------------------------------------ + *NERDTree-J* +Default key: J +Map option: NERDTreeMapJumpLastChild +Applies to: files and directories. + +Jump to the last child of the current nodes parent. + +If the cursor is already on the last node then do the following: + * loop forward thru the siblings of the current nodes parent until we find + an open dir with children + * go to the last child of that node + +------------------------------------------------------------------------------ + *NERDTree-C-J* +Default key: +Map option: NERDTreeMapJumpNextSibling +Applies to: files and directories. + +Jump to the next sibling of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-C-K* +Default key: +Map option: NERDTreeMapJumpPrevSibling +Applies to: files and directories. + +Jump to the previous sibling of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-C* +Default key: C +Map option: NERDTreeMapChangeRoot +Applies to: files and directories. + +Make the selected directory node the new tree root. If a file is selected, its +parent is used. + +------------------------------------------------------------------------------ + *NERDTree-u* +Default key: u +Map option: NERDTreeMapUpdir +Applies to: no restrictions. + +Move the tree root up a dir (like doing a "cd .."). + +------------------------------------------------------------------------------ + *NERDTree-U* +Default key: U +Map option: NERDTreeMapUpdirKeepOpen +Applies to: no restrictions. + +Like |NERDTree-u| except that the old tree root is kept open. + +------------------------------------------------------------------------------ + *NERDTree-r* +Default key: r +Map option: NERDTreeMapRefresh +Applies to: files and directories. + +If a dir is selected, recursively refresh that dir, i.e. scan the filesystem +for changes and represent them in the tree. + +If a file node is selected then the above is done on it's parent. + +------------------------------------------------------------------------------ + *NERDTree-R* +Default key: R +Map option: NERDTreeMapRefreshRoot +Applies to: no restrictions. + +Recursively refresh the tree root. + +------------------------------------------------------------------------------ + *NERDTree-m* +Default key: m +Map option: NERDTreeMapMenu +Applies to: files and directories. + +Display the NERD tree menu. See |NERDTreeMenu| for details. + +------------------------------------------------------------------------------ + *NERDTree-cd* +Default key: cd +Map option: NERDTreeMapChdir +Applies to: files and directories. + +Change Vim's current working directory to that of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-CD* +Default key: CD +Map option: NERDTreeMapCWD +Applies to: no restrictions. + +Change the NERDTree root to Vim's current working directory. + +------------------------------------------------------------------------------ + *NERDTree-I* +Default key: I +Map option: NERDTreeMapToggleHidden +Applies to: no restrictions. + +Toggles whether hidden files (i.e. "dot files") are displayed. + +------------------------------------------------------------------------------ + *NERDTree-f* +Default key: f +Map option: NERDTreeMapToggleFilters +Applies to: no restrictions. + +Toggles whether file filters are used. See |'NERDTreeIgnore'| for details. + +------------------------------------------------------------------------------ + *NERDTree-F* +Default key: F +Map option: NERDTreeMapToggleFiles +Applies to: no restrictions. + +Toggles whether file nodes are displayed. + +------------------------------------------------------------------------------ + *NERDTree-B* +Default key: B +Map option: NERDTreeMapToggleBookmarks +Applies to: no restrictions. + +Toggles whether the bookmarks table is displayed. + +------------------------------------------------------------------------------ + *NERDTree-q* +Default key: q +Map option: NERDTreeMapQuit +Applies to: no restrictions. + +Closes the NERDtree window. + +------------------------------------------------------------------------------ + *NERDTree-A* +Default key: A +Map option: NERDTreeMapToggleZoom +Applies to: no restrictions. + +Maximize (zoom) and minimize the NERDtree window. + +------------------------------------------------------------------------------ + *NERDTree-?* +Default key: ? +Map option: NERDTreeMapHelp +Applies to: no restrictions. + +Toggles whether the quickhelp is displayed. + +------------------------------------------------------------------------------ +2.3. The NERD tree menu *NERDTreeMenu* + +The NERD tree has a menu that can be programmed via the an API (see +|NERDTreeMenuAPI|). The idea is to simulate the "right click" menus that most +file explorers have. + +The script comes with two default menu plugins: exec_menuitem.vim and +fs_menu.vim. fs_menu.vim adds some basic filesystem operations to the menu for +creating/deleting/moving/copying files and dirs. exec_menuitem.vim provides a +menu item to execute executable files. + +Related tags: |NERDTree-m| |NERDTreeApi| + +============================================================================== +3. Customisation *NERDTreeOptions* + + +------------------------------------------------------------------------------ +3.1. Customisation summary *NERDTreeOptionSummary* + +The script provides the following options that can customise the behaviour the +NERD tree. These options should be set in your vimrc. + +|'loaded_nerd_tree'| Turns off the script. + +|'NERDTreeAutoCenter'| Controls whether the NERD tree window centers + when the cursor moves within a specified + distance to the top/bottom of the window. + +|'NERDTreeAutoCenterThreshold'| Controls the sensitivity of autocentering. + +|'NERDTreeCaseSensitiveSort'| Tells the NERD tree whether to be case + sensitive or not when sorting nodes. + +|'NERDTreeNaturalSort'| Tells the NERD tree whether to use + natural sort order or not when sorting nodes. + +|'NERDTreeSortHiddenFirst'| Tells the NERD tree whether to take the dot + at the beginning of the hidden file names + into account when sorting nodes. + +|'NERDTreeChDirMode'| Tells the NERD tree if/when it should change + vim's current working directory. + +|'NERDTreeHighlightCursorline'| Tell the NERD tree whether to highlight the + current cursor line. + +|'NERDTreeHijackNetrw'| Tell the NERD tree whether to replace the netrw + autocommands for exploring local directories. + +|'NERDTreeIgnore'| Tells the NERD tree which files to ignore. + +|'NERDTreeRespectWildIgnore'| Tells the NERD tree to respect |'wildignore'|. + +|'NERDTreeBookmarksFile'| Where the bookmarks are stored. + +|'NERDTreeBookmarksSort'| Control how the Bookmark table is sorted. + +|'NERDTreeMarkBookmarks'| Render bookmarked nodes with markers. + +|'NERDTreeMouseMode'| Manage the interpretation of mouse clicks. + +|'NERDTreeQuitOnOpen'| Closes the tree window after opening a file. + +|'NERDTreeShowBookmarks'| Tells the NERD tree whether to display the + bookmarks table on startup. + +|'NERDTreeShowFiles'| Tells the NERD tree whether to display files + in the tree on startup. + +|'NERDTreeShowHidden'| Tells the NERD tree whether to display hidden + files on startup. + +|'NERDTreeShowLineNumbers'| Tells the NERD tree whether to display line + numbers in the tree window. + +|'NERDTreeSortOrder'| Tell the NERD tree how to sort the nodes in + the tree. + +|'NERDTreeStatusline'| Set a statusline for NERD tree windows. + +|'NERDTreeWinPos'| Tells the script where to put the NERD tree + window. + +|'NERDTreeWinSize'| Sets the window size when the NERD tree is + opened. + +|'NERDTreeMinimalUI'| Disables display of the 'Bookmarks' label and + 'Press ? for help' text. + +|'NERDTreeCascadeSingleChildDir'| + Collapses on the same line directories that + have only one child directory. + +|'NERDTreeCascadeOpenSingleChildDir'| + Cascade open while selected directory has only + one child that also is a directory. + +|'NERDTreeAutoDeleteBuffer'| Tells the NERD tree to automatically remove + a buffer when a file is being deleted or renamed + via a context menu command. + +|'NERDTreeCreatePrefix'| Specify a prefix to be used when creating the + NERDTree window. + +|'NERDTreeRemoveFileCmd'| Specify a custom shell command to be used when + deleting files. Note that it should include + one space character at the end of the command + and it applies only to files. + +|'NERDTreeRemoveDirCmd'| Specify a custom shell command to be used when + deleting directories. Note that it should + include one space character at the end of the + command and it applies only to directories. + +------------------------------------------------------------------------------ +3.2. Customisation details *NERDTreeOptionDetails* + +To enable any of the below options you should put the given line in your +~/.vimrc + + *'loaded_nerd_tree'* +If this plugin is making you feel homicidal, it may be a good idea to turn it +off with this line in your vimrc: > + let loaded_nerd_tree=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeAutoCenter'* +Values: 0 or 1. +Default: 1 + +If set to 1, the NERD tree window will center around the cursor if it moves to +within |'NERDTreeAutoCenterThreshold'| lines of the top/bottom of the window. + +This is ONLY done in response to tree navigation mappings, +i.e. |NERDTree-J| |NERDTree-K| |NERDTree-C-J| |NERDTree-C-K| |NERDTree-p| +|NERDTree-P| + +The centering is done with a |zz| operation. + +------------------------------------------------------------------------------ + *'NERDTreeAutoCenterThreshold'* +Values: Any natural number. +Default: 3 + +This option controls the "sensitivity" of the NERD tree auto centering. See +|'NERDTreeAutoCenter'| for details. + +------------------------------------------------------------------------------ + *'NERDTreeCaseSensitiveSort'* +Values: 0 or 1. +Default: 0. + +By default the NERD tree does not sort nodes case sensitively, i.e. nodes +could appear like this: > + bar.c + Baz.c + blarg.c + boner.c + Foo.c +< +But, if you set this option to 1 then the case of the nodes will be taken into +account. The above nodes would then be sorted like this: > + Baz.c + Foo.c + bar.c + blarg.c + boner.c +< +------------------------------------------------------------------------------ + *'NERDTreeNaturalSort'* +Values: 0 or 1. +Default: 0. + +By default the NERD tree does not sort nodes in natural sort order, i.e. nodes +could appear like this: > + z1.txt + z10.txt + z100.txt + z11.txt + z110.txt + z2.txt + z20.txt + z3.txt +< +But if you set this option to 1 then the natural sort order will be used. The +above nodes would then be sorted like this: > + z1.txt + z2.txt + z3.txt + z10.txt + z11.txt + z20.txt + z100.txt + z110.txt +< +------------------------------------------------------------------------------ + *'NERDTreeChDirMode'* + +Values: 0, 1 or 2. +Default: 0. + +Use this option to tell the script when (if at all) to change the current +working directory (CWD) for vim. + +If it is set to 0 then the CWD is never changed by the NERD tree. + +If set to 1 then the CWD is changed when the NERD tree is first loaded to the +directory it is initialized in. For example, if you start the NERD tree with > + :NERDTree /home/marty/foobar +< +then the CWD will be changed to /home/marty/foobar and will not be changed +again unless you init another NERD tree with a similar command. + +If the option is set to 2 then it behaves the same as if set to 1 except that +the CWD is changed whenever the tree root is changed. For example, if the CWD +is /home/marty/foobar and you make the node for /home/marty/foobar/baz the new +root then the CWD will become /home/marty/foobar/baz. + +------------------------------------------------------------------------------ + *'NERDTreeHighlightCursorline'* +Values: 0 or 1. +Default: 1. + +If set to 1, the current cursor line in the NERD tree buffer will be +highlighted. This is done using the |'cursorline'| option. + +------------------------------------------------------------------------------ + *'NERDTreeHijackNetrw'* +Values: 0 or 1. +Default: 1. + +If set to 1, doing a > + :edit +< +will open up a window level NERD tree instead of a netrw in the target window. + +Window level trees behaves slightly different from a regular trees in the +following respects: + 1. 'o' will open the selected file in the same window as the tree, + replacing it. + 2. you can have one tree per window - instead of per tab. + +------------------------------------------------------------------------------ + *'NERDTreeIgnore'* +Values: a list of regular expressions. +Default: ['\~$']. + +This option is used to specify which files the NERD tree should ignore. It +must be a list of regular expressions. When the NERD tree is rendered, any +files/dirs that match any of the regex's in 'NERDTreeIgnore' wont be +displayed. + +For example if you put the following line in your vimrc: > + let NERDTreeIgnore=['\.vim$', '\~$'] +< +then all files ending in .vim or ~ will be ignored. + +There are 2 magic flags that can be appended to the end of each regular +expression to specify that the regex should match only files or only dirs. +These flags are "[[dir]]" and "[[file]]". Example: > + let NERDTreeIgnore=['\.d$[[dir]]', '\.o$[[file]]'] +< +This will cause all dirs ending in ".d" to be ignored and all files ending in +".o" to be ignored. + +Note: to tell the NERD tree not to ignore any files you must use the following +line: > + let NERDTreeIgnore=[] +< + +The file filters can be turned on and off dynamically with the |NERDTree-f| +mapping. + +------------------------------------------------------------------------------ + *'NERDTreeRespectWildIgnore'* +Values: 0 or 1. +Default: 0. + +If set to 1, the |'wildignore'| setting is respected. + +------------------------------------------------------------------------------ + *'NERDTreeBookmarksFile'* +Values: a path +Default: $HOME/.NERDTreeBookmarks + +This is where bookmarks are saved. See |NERDTreeBookmarkCommands|. + +------------------------------------------------------------------------------ + *'NERDTreeBookmarksSort'* +Values: 0, 1, or 2 +Default: 1 + +This option controls the method by which the list of user bookmarks is +sorted. When sorted, bookmarks will render in alphabetical order by name. + +If set to 0, the bookmarks list is not sorted. +If set to 1, the bookmarks list is sorted in a case-insensitive manner. +If set to 2, the bookmarks list is sorted in a case-sensitive manner. + +------------------------------------------------------------------------------ + *'NERDTreeMarkBookmarks'* +Values: 0 or 1 +Default: 1 + +If set to 1, Bookmarks will be specially marked whenever the NERDTree is +rendered. Users of the |'NERDTreeMinimalUI'| setting may prefer to disable +this setting for even less visual clutter. + +------------------------------------------------------------------------------ + *'NERDTreeMouseMode'* +Values: 1, 2 or 3. +Default: 1. + +If set to 1 then a double click on a node is required to open it. +If set to 2 then a single click will open directory nodes, while a double +click will still be required for file nodes. +If set to 3 then a single click will open any node. + +Note: a double click anywhere on a line that a tree node is on will +activate it, but all single-click activations must be done on name of the node +itself. For example, if you have the following node: > + | | |-application.rb +< +then (to single click activate it) you must click somewhere in +'application.rb'. + +------------------------------------------------------------------------------ + *'NERDTreeQuitOnOpen'* + +Values: 0 or 1. +Default: 0 + +If set to 1, the NERD tree window will close after opening a file with the +|NERDTree-o|, |NERDTree-i|, |NERDTree-t| and |NERDTree-T| mappings. + +------------------------------------------------------------------------------ + *'NERDTreeShowBookmarks'* +Values: 0 or 1. +Default: 0. + +If this option is set to 1 then the bookmarks table will be displayed. + +This option can be toggled dynamically, per tree, with the |NERDTree-B| +mapping. + +------------------------------------------------------------------------------ + *'NERDTreeShowFiles'* +Values: 0 or 1. +Default: 1. + +If this option is set to 1 then files are displayed in the NERD tree. If it is +set to 0 then only directories are displayed. + +This option can be toggled dynamically, per tree, with the |NERDTree-F| +mapping and is useful for drastically shrinking the tree when you are +navigating to a different part of the tree. + +------------------------------------------------------------------------------ + *'NERDTreeShowHidden'* +Values: 0 or 1. +Default: 0. + +This option tells vim whether to display hidden files by default. This option +can be dynamically toggled, per tree, with the |NERDTree-I| mapping. Use one +of the follow lines to set this option: > + let NERDTreeShowHidden=0 + let NERDTreeShowHidden=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeShowLineNumbers'* +Values: 0 or 1. +Default: 0. + +This option tells vim whether to display line numbers for the NERD tree +window. Use one of the follow lines to set this option: > + let NERDTreeShowLineNumbers=0 + let NERDTreeShowLineNumbers=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeSortOrder'* +Values: a list of regular expressions. +Default: ['\/$', '*', '\.swp$', '\.bak$', '\~$'] + +This option is set to a list of regular expressions which are used to +specify the order of nodes under their parent. + +For example, if the option is set to: > + ['\.vim$', '\.c$', '\.h$', '*', 'foobar'] +< +then all .vim files will be placed at the top, followed by all .c files then +all .h files. All files containing the string 'foobar' will be placed at the +end. The star is a special flag: it tells the script that every node that +doesnt match any of the other regexps should be placed here. + +If no star is present in 'NERDTreeSortOrder' then one is automatically +appended to the array. + +The regex '\/$' should be used to match directory nodes. + +A special flag can be used to sort by the modification timestamps of files and +directories. It is either '[[timestamp]]' for ascending, or '[[-timestamp]]' +for descending. If placed at the beginning of the list, files and directories +are sorted by timestamp, and then by the remaining items in the sort order +list. If this flag is in any other position of the list, timestamp sorting is +done secondarily. See examples 4, 5, and 6 below. + +After this sorting is done, the files in each group are sorted alphabetically. + +Other examples: > + (1) ['*', '\/$'] + (2) [] + (3) ['\/$', '\.rb$', '\.php$', '*', '\.swp$', '\.bak$', '\~$'] + (4) ['[[timestamp]]'] + (5) ['\/$', '*', '[[-timestamp]]'] + (6) ['\.md$', '\.c$', '[[-timestamp]]', '*'] +< +1. Directories will appear last, everything else will appear above. +2. Everything will simply appear in alphabetical order. +3. Dirs will appear first, then ruby and php. Swap files, bak files and vim + backup files will appear last with everything else preceding them. +4. All files and directories are sorted by timestamp, oldest first. If any + files have identical timestamps, they are sorted alphabetically. +5. Directories are first, newest to oldest, then everything else, newest to + oldest. +6. Markdown files first, followed by C source files, then everything else. + Each group is shown newest to oldest. + +------------------------------------------------------------------------------ + *'NERDTreeStatusline'* +Values: Any valid |'statusline'| setting. +Default: %{exists('b:NERDTree')?b:NERDTree.root.path.str():''} + +Defines the value for the |'statusline'| setting in NERDTree windows. + +Note: The setting is actually applied using |:let-&|, not |:set|, so +escaping spaces is not necessary. + +Setting this option to -1 will deactivate it so that your global +|'statusline'| setting is used. + +------------------------------------------------------------------------------ + *'NERDTreeWinPos'* +Values: "left" or "right" +Default: "left". + +This option is used to determine where NERD tree window is placed on the +screen. + +This option makes it possible to use two different explorer plugins +simultaneously. For example, you could have the taglist plugin on the left of +the window and the NERD tree on the right. + +------------------------------------------------------------------------------ + *'NERDTreeWinSize'* +Values: a positive integer. +Default: 31. + +This option is used to change the size of the NERD tree when it is loaded. + +------------------------------------------------------------------------------ + *'NERDTreeMinimalUI'* +Values: 0 or 1 +Default: 0 + +This options disables the 'Bookmarks' label 'Press ? for help' text. Use one +of the following lines to set this option: > + let NERDTreeMinimalUI=0 + let NERDTreeMinimalUI=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeCascadeSingleChildDir'* +Values: 0 or 1 +Default: 1. + +When displaying dir nodes, this option tells NERDTree to collapse dirs that +have only one child. Use one of the follow lines to set this option: > + let NERDTreeCascadeSingleChildDir=0 + let NERDTreeCascadeSingleChildDir=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeCascadeOpenSingleChildDir'* +Values: 0 or 1 +Default: 1. + +When opening dir nodes, this option tells NERDTree to recursively open dirs +that have only one child which is also a dir. NERDTree will stop when it finds +a dir that contains anything but another single dir. This option also causes +the |NERDTree-x| mapping to close dirs in the same manner. This option may be +useful for Java projects. Use one of the follow lines to set this option: > + let NERDTreeCascadeOpenSingleChildDir=0 + let NERDTreeCascadeOpenSingleChildDir=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeAutoDeleteBuffer'* +Values: 0 or 1 +Default: 0. + +When using a context menu to delete or rename a file you may also want to delete +the buffer which is no more valid. If the option is not set you will see a +confirmation if you really want to delete an old buffer. If you always press 'y' +then it worths to set this option to 1. Use one of the follow lines to set this +option: > + let NERDTreeAutoDeleteBuffer=0 + let NERDTreeAutoDeleteBuffer=1 +< +------------------------------------------------------------------------------ + *'NERDTreeCreatePrefix'* +Values: Any valid command prefix. +Default: "silent". + +Internally, NERDTree uses the |:edit| command to create a buffer in which to +display its tree view. You can augment this behavior by specifying a prefix +string such as "keepalt" or similar. For example, to have NERDTree create its +tree window using `silent keepalt keepjumps edit`: + let NERDTreeCreatePrefix='silent keepalt keepjumps' +< + +============================================================================== +4. The NERD tree API *NERDTreeAPI* + +The NERD tree script allows you to add custom key mappings and menu items via +a set of API calls. Any scripts that use this API should be placed in +~/.vim/nerdtree_plugin/ (*nix) or ~/vimfiles/nerdtree_plugin (windows). + +The script exposes some prototype objects that can be used to manipulate the +tree and/or get information from it: > + g:NERDTreePath + g:NERDTreeDirNode + g:NERDTreeFileNode + g:NERDTreeBookmark +< +See the code/comments in NERD_tree.vim to find how to use these objects. The +following code conventions are used: + * class members start with a capital letter + * instance members start with a lower case letter + * private members start with an underscore + +See this blog post for more details: + http://got-ravings.blogspot.com/2008/09/vim-pr0n-prototype-based-objects.html + +------------------------------------------------------------------------------ +4.1. Key map API *NERDTreeKeymapAPI* + +NERDTreeAddKeyMap({options}) *NERDTreeAddKeyMap()* + Adds a new keymapping for all NERD tree buffers. + {options} must be a dictionary, and must contain the following keys: + "key" - the trigger key for the new mapping + "callback" - the function the new mapping will be bound to + "quickhelpText" - the text that will appear in the quickhelp (see + |NERDTree-?|) + "override" - if 1 then this new mapping will override whatever previous + mapping was defined for the key/scope combo. Useful for overriding the + default mappings. + + Additionally, a "scope" argument may be supplied. This constrains the + mapping so that it is only activated if the cursor is on a certain object. + That object is then passed into the handling method. Possible values are: + + "FileNode" .... a file node + "DirNode" ..... a directory node + "Node" ........ a file node OR a directory node + "Bookmark" .... a bookmark + "all" ......... global scope; handler receives no arguments (default) + + Example: > + call NERDTreeAddKeyMap({ + \ 'key': 'foo', + \ 'callback': 'NERDTreeCDHandler', + \ 'quickhelpText': 'echo full path of current node', + \ 'scope': 'DirNode' }) + + function! NERDTreeCDHandler(dirnode) + call a:dirnode.changeToDir() + endfunction +< + This code should sit in a file like ~/.vim/nerdtree_plugin/mymapping.vim. + It adds a (redundant) mapping on 'foo' which changes vim's CWD to that of + the current dir node. Note this mapping will only fire when the cursor is + on a directory node. + +------------------------------------------------------------------------------ +4.2. Menu API *NERDTreeMenuAPI* + +NERDTreeAddSubmenu({options}) *NERDTreeAddSubmenu()* + Creates and returns a new submenu. + + {options} must be a dictionary and must contain the following keys: + "text" - the text of the submenu that the user will see + "shortcut" - a shortcut key for the submenu (need not be unique) + + The following keys are optional: + "isActiveCallback" - a function that will be called to determine whether + this submenu item will be displayed or not. The callback function must return + 0 or 1. + "parent" - the parent submenu of the new submenu (returned from a previous + invocation of NERDTreeAddSubmenu()). If this key is left out then the new + submenu will sit under the top level menu. + + See below for an example. + +NERDTreeAddMenuItem({options}) *NERDTreeAddMenuItem()* + Adds a new menu item to the NERD tree menu (see |NERDTreeMenu|). + + {options} must be a dictionary and must contain the + following keys: + "text" - the text of the menu item which the user will see + "shortcut" - a shortcut key for the menu item (need not be unique) + "callback" - the function that will be called when the user activates the + menu item. + + The following keys are optional: + "isActiveCallback" - a function that will be called to determine whether + this menu item will be displayed or not. The callback function must return + 0 or 1. + "parent" - if the menu item belongs under a submenu then this key must be + specified. This value for this key will be the object that + was returned when the submenu was created with |NERDTreeAddSubmenu()|. + + See below for an example. + +NERDTreeAddMenuSeparator([{options}]) *NERDTreeAddMenuSeparator()* + Adds a menu separator (a row of dashes). + + {options} is an optional dictionary that may contain the following keys: + "isActiveCallback" - see description in |NERDTreeAddMenuItem()|. + +Below is an example of the menu API in action. > + call NERDTreeAddMenuSeparator() + + call NERDTreeAddMenuItem({ + \ 'text': 'a (t)op level menu item', + \ 'shortcut': 't', + \ 'callback': 'SomeFunction' }) + + let submenu = NERDTreeAddSubmenu({ + \ 'text': 'a (s)ub menu', + \ 'shortcut': 's' }) + + call NERDTreeAddMenuItem({ + \ 'text': '(n)ested item 1', + \ 'shortcut': 'n', + \ 'callback': 'SomeFunction', + \ 'parent': submenu }) + + call NERDTreeAddMenuItem({ + \ 'text': '(n)ested item 2', + \ 'shortcut': 'n', + \ 'callback': 'SomeFunction', + \ 'parent': submenu }) +< +This will create the following menu: > + -------------------- + a (t)op level menu item + a (s)ub menu +< +Where selecting "a (s)ub menu" will lead to a second menu: > + (n)ested item 1 + (n)ested item 2 +< +When any of the 3 concrete menu items are selected the function "SomeFunction" +will be called. + +------------------------------------------------------------------------------ +4.3 NERDTreeAddPathFilter(callback) *NERDTreeAddPathFilter()* + +Path filters are essentially a more powerful version of |NERDTreeIgnore|. +If the simple regex matching in |NERDTreeIgnore| is not enough then use +|NERDTreeAddPathFilter()| to add a callback function that paths will be +checked against when the decision to ignore them is made. Example > + + call NERDTreeAddPathFilter('MyFilter') + + function! MyFilter(params) + "params is a dict containing keys: 'nerdtree' and 'path' which are + "g:NERDTree and g:NERDTreePath objects + + "return 1 to ignore params['path'] or 0 otherwise + endfunction +< +------------------------------------------------------------------------------ +4.4 Path Listener API *NERDTreePathListenerAPI* + +Use this API if you want to run a callback for events on Path objects. E.G > + + call g:NERDTreePathNotifier.AddListener("init", "MyListener") + + ".... + + function! MyListener(event) + "This function will be called whenever a Path object is created. + + "a:event is an object that contains a bunch of relevant info - + "including the path in question. See lib/nerdtree/event.vim for details. + endfunction +< +Current events supported: + init ~ + refresh ~ + refreshFlags ~ + +------------------------------------------------------------------------------ +NERDTreeRender() *NERDTreeRender()* + Re-renders the NERD tree buffer. Useful if you change the state of the + tree and you want to it to be reflected in the UI. + +============================================================================== +5. About *NERDTreeAbout* + +The author of the NERD tree is a terrible terrible monster called Martyzilla +who gobbles up small children with milk and sugar for breakfast. + +He can be reached at martin.grenfell at gmail dot com. He would love to hear +from you, so feel free to send him suggestions and/or comments about this +plugin. Don't be shy --- the worst he can do is slaughter you and stuff you in +the fridge for later ;) + +The latest stable versions can be found at + http://www.vim.org/scripts/script.php?script_id=1658 + +The latest dev versions are on github + http://github.com/scrooloose/nerdtree + +============================================================================== +6. License *NERDTreeLicense* + +The NERD tree is released under the wtfpl. +See http://sam.zoy.org/wtfpl/COPYING. diff --git a/doc/NERD_tree.txt b/doc/NERD_tree.txt new file mode 100644 index 0000000..bf1ab5a --- /dev/null +++ b/doc/NERD_tree.txt @@ -0,0 +1,1238 @@ +*NERD_tree.txt* A tree explorer plugin that owns your momma! + + + + omg its ... ~ + + ________ ________ _ ____________ ____ __________ ____________~ + /_ __/ / / / ____/ / | / / ____/ __ \/ __ \ /_ __/ __ \/ ____/ ____/~ + / / / /_/ / __/ / |/ / __/ / /_/ / / / / / / / /_/ / __/ / __/ ~ + / / / __ / /___ / /| / /___/ _, _/ /_/ / / / / _, _/ /___/ /___ ~ + /_/ /_/ /_/_____/ /_/ |_/_____/_/ |_/_____/ /_/ /_/ |_/_____/_____/ ~ + + + Reference Manual~ + + + + +============================================================================== +CONTENTS *NERDTree-contents* + + 1.Intro...................................|NERDTree| + 2.Functionality provided..................|NERDTreeFunctionality| + 2.1.Global commands...................|NERDTreeGlobalCommands| + 2.2.Bookmarks.........................|NERDTreeBookmarks| + 2.2.1.The bookmark table..........|NERDTreeBookmarkTable| + 2.2.2.Bookmark commands...........|NERDTreeBookmarkCommands| + 2.2.3.Invalid bookmarks...........|NERDTreeInvalidBookmarks| + 2.3.NERD tree mappings................|NERDTreeMappings| + 2.4.The NERD tree menu................|NERDTreeMenu| + 3.Options.................................|NERDTreeOptions| + 3.1.Option summary....................|NERDTreeOptionSummary| + 3.2.Option details....................|NERDTreeOptionDetails| + 4.The NERD tree API.......................|NERDTreeAPI| + 4.1.Key map API.......................|NERDTreeKeymapAPI| + 4.2.Menu API..........................|NERDTreeMenuAPI| + 4.3.Menu API..........................|NERDTreeAddPathFilter()| + 4.4.Path Listener API.................|NERDTreePathListenerAPI| + 5.About...................................|NERDTreeAbout| + 6.License.................................|NERDTreeLicense| + +============================================================================== +1. Intro *NERDTree* + +What is this "NERD tree"?? + +The NERD tree allows you to explore your filesystem and to open files and +directories. It presents the filesystem to you in the form of a tree which you +manipulate with the keyboard and/or mouse. It also allows you to perform +simple filesystem operations. + +The following features and functionality are provided by the NERD tree: + * Files and directories are displayed in a hierarchical tree structure + * Different highlighting is provided for the following types of nodes: + * files + * directories + * sym-links + * windows .lnk files + * read-only files + * executable files + * Many (customisable) mappings are provided to manipulate the tree: + * Mappings to open/close/explore directory nodes + * Mappings to open files in new/existing windows/tabs + * Mappings to change the current root of the tree + * Mappings to navigate around the tree + * ... + * Directories and files can be bookmarked. + * Most NERD tree navigation can also be done with the mouse + * Filtering of tree content (can be toggled at runtime) + * custom file filters to prevent e.g. vim backup files being displayed + * optional displaying of hidden files (. files) + * files can be "turned off" so that only directories are displayed + * The position and size of the NERD tree window can be customised + * The order in which the nodes in the tree are listed can be customised. + * A model of your filesystem is created/maintained as you explore it. This + has several advantages: + * All filesystem information is cached and is only re-read on demand + * If you revisit a part of the tree that you left earlier in your + session, the directory nodes will be opened/closed as you left them + * The script remembers the cursor position and window position in the NERD + tree so you can toggle it off (or just close the tree window) and then + reopen it (with NERDTreeToggle) the NERD tree window will appear exactly + as you left it + * You can have a separate NERD tree for each tab, share trees across tabs, + or a mix of both. + * By default the script overrides the default file browser (netrw), so if + you :edit a directory a (slightly modified) NERD tree will appear in the + current window + * A programmable menu system is provided (simulates right clicking on a + node) + * one default menu plugin is provided to perform basic filesystem + operations (create/delete/move/copy files/directories) + * There's an API for adding your own keymappings + + +============================================================================== +2. Functionality provided *NERDTreeFunctionality* + +------------------------------------------------------------------------------ +2.1. Global Commands *NERDTreeGlobalCommands* + +:NERDTree [ | ] *:NERDTree* + Opens a fresh NERD tree. The root of the tree depends on the argument + given. There are 3 cases: If no argument is given, the current directory + will be used. If a directory is given, that will be used. If a bookmark + name is given, the corresponding directory will be used. For example: > + :NERDTree /home/marty/vim7/src + :NERDTree foo (foo is the name of a bookmark) +< +:NERDTreeFromBookmark *:NERDTreeFromBookmark* + Opens a fresh NERD tree with the root initialized to the dir for + . The only reason to use this command over :NERDTree is for + the completion (which is for bookmarks rather than directories). + +:NERDTreeToggle [ | ] *:NERDTreeToggle* + If a NERD tree already exists for this tab, it is reopened and rendered + again. If no NERD tree exists for this tab then this command acts the + same as the |:NERDTree| command. + +:NERDTreeMirror *:NERDTreeMirror* + Shares an existing NERD tree, from another tab, in the current tab. + Changes made to one tree are reflected in both as they are actually the + same buffer. + + If only one other NERD tree exists, that tree is automatically mirrored. If + more than one exists, the script will ask which tree to mirror. + +:NERDTreeClose *:NERDTreeClose* + Close the NERD tree in this tab. + +:NERDTreeFind *:NERDTreeFind* + Find the current file in the tree. + + If no tree exists and the current file is under vim's CWD, then init a + tree at the CWD and reveal the file. Otherwise init a tree in the current + file's directory. + + In any case, the current file is revealed and the cursor is placed on it. + +:NERDTreeCWD *:NERDTreeCWD* + Change tree root to current directory. If no NERD tree exists for this + tab, a new tree will be opened. + +------------------------------------------------------------------------------ +2.2. Bookmarks *NERDTreeBookmarks* + +Bookmarks in the NERD tree are a way to tag files or directories of interest. +For example, you could use bookmarks to tag all of your project directories. + +------------------------------------------------------------------------------ +2.2.1. The Bookmark Table *NERDTreeBookmarkTable* + +If the bookmark table is active (see |NERDTree-B| and +|'NERDTreeShowBookmarks'|), it will be rendered above the tree. You can double +click bookmarks or use the |NERDTree-o| mapping to activate them. See also, +|NERDTree-t| and |NERDTree-T| + +------------------------------------------------------------------------------ +2.2.2. Bookmark commands *NERDTreeBookmarkCommands* + +Note that the following commands are only available in the NERD tree buffer. + +:Bookmark [] + Bookmark the current node as . If there is already a + bookmark, it is overwritten. must not contain spaces. + If is not provided, it defaults to the file or directory name. + For directories, a trailing slash is present. + +:BookmarkToRoot + Make the directory corresponding to the new root. If a treenode + corresponding to is already cached somewhere in the tree then + the current tree will be used, otherwise a fresh tree will be opened. + Note that if points to a file then its parent will be used + instead. + +:RevealBookmark + If the node is cached under the current root then it will be revealed + (i.e. directory nodes above it will be opened) and the cursor will be + placed on it. + +:OpenBookmark + must point to a file. The file is opened as though |NERDTree-o| + was applied. If the node is cached under the current root then it will be + revealed and the cursor will be placed on it. + +:ClearBookmarks [] + Remove all the given bookmarks. If no bookmarks are given then remove all + bookmarks on the current node. + +:ClearAllBookmarks + Remove all bookmarks. + +:ReadBookmarks + Re-read the bookmarks in the |'NERDTreeBookmarksFile'|. + +See also |:NERDTree| and |:NERDTreeFromBookmark|. + +------------------------------------------------------------------------------ +2.2.3. Invalid Bookmarks *NERDTreeInvalidBookmarks* + +If invalid bookmarks are detected, the script will issue an error message and +the invalid bookmarks will become unavailable for use. + +These bookmarks will still be stored in the bookmarks file (see +|'NERDTreeBookmarksFile'|), down the bottom. There will always be a blank line +after the valid bookmarks but before the invalid ones. + +Each line in the bookmarks file represents one bookmark. The proper format is: + + +After you have corrected any invalid bookmarks, either restart vim, or go +:ReadBookmarks from the NERD tree window. + +------------------------------------------------------------------------------ +2.3. NERD tree Mappings *NERDTreeMappings* + +Default Description~ help-tag~ +Key~ + +o.......Open files, directories and bookmarks....................|NERDTree-o| +go......Open selected file, but leave cursor in the NERDTree.....|NERDTree-go| +t.......Open selected node/bookmark in a new tab.................|NERDTree-t| +T.......Same as 't' but keep the focus on the current tab........|NERDTree-T| +i.......Open selected file in a split window.....................|NERDTree-i| +gi......Same as i, but leave the cursor on the NERDTree..........|NERDTree-gi| +s.......Open selected file in a new vsplit.......................|NERDTree-s| +gs......Same as s, but leave the cursor on the NERDTree..........|NERDTree-gs| +O.......Recursively open the selected directory..................|NERDTree-O| +x.......Close the current nodes parent...........................|NERDTree-x| +X.......Recursively close all children of the current node.......|NERDTree-X| +e.......Edit the current dir.....................................|NERDTree-e| + +...............same as |NERDTree-o|. +double-click.......same as the |NERDTree-o| map. +middle-click.......same as |NERDTree-i| for files, same as + |NERDTree-e| for dirs. + +D.......Delete the current bookmark .............................|NERDTree-D| + +P.......Jump to the root node....................................|NERDTree-P| +p.......Jump to current nodes parent.............................|NERDTree-p| +K.......Jump up inside directories at the current tree depth.....|NERDTree-K| +J.......Jump down inside directories at the current tree depth...|NERDTree-J| +...Jump down to the next sibling of the current directory...|NERDTree-C-J| +...Jump up to the previous sibling of the current directory.|NERDTree-C-K| + +C.......Change the tree root to the selected dir.................|NERDTree-C| +u.......Move the tree root up one directory......................|NERDTree-u| +U.......Same as 'u' except the old root node is left open........|NERDTree-U| +r.......Recursively refresh the current directory................|NERDTree-r| +R.......Recursively refresh the current root.....................|NERDTree-R| +m.......Display the NERD tree menu...............................|NERDTree-m| +cd......Change the CWD to the dir of the selected node...........|NERDTree-cd| +CD......Change tree root to the CWD..............................|NERDTree-CD| + +I.......Toggle whether hidden files displayed....................|NERDTree-I| +f.......Toggle whether the file filters are used.................|NERDTree-f| +F.......Toggle whether files are displayed.......................|NERDTree-F| +B.......Toggle whether the bookmark table is displayed...........|NERDTree-B| + +q.......Close the NERDTree window................................|NERDTree-q| +A.......Zoom (maximize/minimize) the NERDTree window.............|NERDTree-A| +?.......Toggle the display of the quick help.....................|NERDTree-?| + +------------------------------------------------------------------------------ + *NERDTree-o* +Default key: o +Map option: NERDTreeMapActivateNode +Applies to: files and directories. + +If a file node is selected, it is opened in the previous window. + +If a directory is selected it is opened or closed depending on its current +state. + +If a bookmark that links to a directory is selected then that directory +becomes the new root. + +If a bookmark that links to a file is selected then that file is opened in the +previous window. + +------------------------------------------------------------------------------ + *NERDTree-go* +Default key: go +Map option: None +Applies to: files. + +If a file node is selected, it is opened in the previous window, but the +cursor does not move. + +The key combo for this mapping is always "g" + NERDTreeMapActivateNode (see +|NERDTree-o|). + +------------------------------------------------------------------------------ + *NERDTree-t* +Default key: t +Map option: NERDTreeMapOpenInTab +Applies to: files and directories. + +Opens the selected file in a new tab. If a directory is selected, a fresh +NERD Tree for that directory is opened in a new tab. + +If a bookmark which points to a directory is selected, open a NERD tree for +that directory in a new tab. If the bookmark points to a file, open that file +in a new tab. + +------------------------------------------------------------------------------ + *NERDTree-T* +Default key: T +Map option: NERDTreeMapOpenInTabSilent +Applies to: files and directories. + +The same as |NERDTree-t| except that the focus is kept in the current tab. + +------------------------------------------------------------------------------ + *NERDTree-i* +Default key: i +Map option: NERDTreeMapOpenSplit +Applies to: files. + +Opens the selected file in a new split window and puts the cursor in the new +window. + +------------------------------------------------------------------------------ + *NERDTree-gi* +Default key: gi +Map option: None +Applies to: files. + +The same as |NERDTree-i| except that the cursor is not moved. + +The key combo for this mapping is always "g" + NERDTreeMapOpenSplit (see +|NERDTree-i|). + +------------------------------------------------------------------------------ + *NERDTree-s* +Default key: s +Map option: NERDTreeMapOpenVSplit +Applies to: files. + +Opens the selected file in a new vertically split window and puts the cursor in +the new window. + +------------------------------------------------------------------------------ + *NERDTree-gs* +Default key: gs +Map option: None +Applies to: files. + +The same as |NERDTree-s| except that the cursor is not moved. + +The key combo for this mapping is always "g" + NERDTreeMapOpenVSplit (see +|NERDTree-s|). + +------------------------------------------------------------------------------ + *NERDTree-O* +Default key: O +Map option: NERDTreeMapOpenRecursively +Applies to: directories. + +Recursively opens the selected directory. + +All files and directories are cached, but if a directory would not be +displayed due to file filters (see |'NERDTreeIgnore'| |NERDTree-f|) or the +hidden file filter (see |'NERDTreeShowHidden'|) then its contents are not +cached. This is handy, especially if you have .svn directories. + +------------------------------------------------------------------------------ + *NERDTree-x* +Default key: x +Map option: NERDTreeMapCloseDir +Applies to: files and directories. + +Closes the parent of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-X* +Default key: X +Map option: NERDTreeMapCloseChildren +Applies to: directories. + +Recursively closes all children of the selected directory. + +Tip: To quickly "reset" the tree, use |NERDTree-P| with this mapping. + +------------------------------------------------------------------------------ + *NERDTree-e* +Default key: e +Map option: NERDTreeMapOpenExpl +Applies to: files and directories. + +|:edit|s the selected directory, or the selected file's directory. This could +result in a NERD tree or a netrw being opened, depending on +|'NERDTreeHijackNetrw'|. + +------------------------------------------------------------------------------ + *NERDTree-D* +Default key: D +Map option: NERDTreeMapDeleteBookmark +Applies to: lines in the bookmarks table + +Deletes the currently selected bookmark. + +------------------------------------------------------------------------------ + *NERDTree-P* +Default key: P +Map option: NERDTreeMapJumpRoot +Applies to: no restrictions. + +Jump to the tree root. + +------------------------------------------------------------------------------ + *NERDTree-p* +Default key: p +Map option: NERDTreeMapJumpParent +Applies to: files and directories. + +Jump to the parent node of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-K* +Default key: K +Map option: NERDTreeMapJumpFirstChild +Applies to: files and directories. + +Jump to the first child of the current nodes parent. + +If the cursor is already on the first node then do the following: + * loop back thru the siblings of the current nodes parent until we find an + open dir with children + * go to the first child of that node + +------------------------------------------------------------------------------ + *NERDTree-J* +Default key: J +Map option: NERDTreeMapJumpLastChild +Applies to: files and directories. + +Jump to the last child of the current nodes parent. + +If the cursor is already on the last node then do the following: + * loop forward thru the siblings of the current nodes parent until we find + an open dir with children + * go to the last child of that node + +------------------------------------------------------------------------------ + *NERDTree-C-J* +Default key: +Map option: NERDTreeMapJumpNextSibling +Applies to: files and directories. + +Jump to the next sibling of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-C-K* +Default key: +Map option: NERDTreeMapJumpPrevSibling +Applies to: files and directories. + +Jump to the previous sibling of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-C* +Default key: C +Map option: NERDTreeMapChangeRoot +Applies to: files and directories. + +Make the selected directory node the new tree root. If a file is selected, its +parent is used. + +------------------------------------------------------------------------------ + *NERDTree-u* +Default key: u +Map option: NERDTreeMapUpdir +Applies to: no restrictions. + +Move the tree root up a dir (like doing a "cd .."). + +------------------------------------------------------------------------------ + *NERDTree-U* +Default key: U +Map option: NERDTreeMapUpdirKeepOpen +Applies to: no restrictions. + +Like |NERDTree-u| except that the old tree root is kept open. + +------------------------------------------------------------------------------ + *NERDTree-r* +Default key: r +Map option: NERDTreeMapRefresh +Applies to: files and directories. + +If a dir is selected, recursively refresh that dir, i.e. scan the filesystem +for changes and represent them in the tree. + +If a file node is selected then the above is done on it's parent. + +------------------------------------------------------------------------------ + *NERDTree-R* +Default key: R +Map option: NERDTreeMapRefreshRoot +Applies to: no restrictions. + +Recursively refresh the tree root. + +------------------------------------------------------------------------------ + *NERDTree-m* +Default key: m +Map option: NERDTreeMapMenu +Applies to: files and directories. + +Display the NERD tree menu. See |NERDTreeMenu| for details. + +------------------------------------------------------------------------------ + *NERDTree-cd* +Default key: cd +Map option: NERDTreeMapChdir +Applies to: files and directories. + +Change vims current working directory to that of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-CD* +Default key: CD +Map option: NERDTreeMapCWD +Applies to: no restrictions. + +Change tree root to vims current working directory. + +------------------------------------------------------------------------------ + *NERDTree-I* +Default key: I +Map option: NERDTreeMapToggleHidden +Applies to: no restrictions. + +Toggles whether hidden files (i.e. "dot files") are displayed. + +------------------------------------------------------------------------------ + *NERDTree-f* +Default key: f +Map option: NERDTreeMapToggleFilters +Applies to: no restrictions. + +Toggles whether file filters are used. See |'NERDTreeIgnore'| for details. + +------------------------------------------------------------------------------ + *NERDTree-F* +Default key: F +Map option: NERDTreeMapToggleFiles +Applies to: no restrictions. + +Toggles whether file nodes are displayed. + +------------------------------------------------------------------------------ + *NERDTree-B* +Default key: B +Map option: NERDTreeMapToggleBookmarks +Applies to: no restrictions. + +Toggles whether the bookmarks table is displayed. + +------------------------------------------------------------------------------ + *NERDTree-q* +Default key: q +Map option: NERDTreeMapQuit +Applies to: no restrictions. + +Closes the NERDtree window. + +------------------------------------------------------------------------------ + *NERDTree-A* +Default key: A +Map option: NERDTreeMapToggleZoom +Applies to: no restrictions. + +Maximize (zoom) and minimize the NERDtree window. + +------------------------------------------------------------------------------ + *NERDTree-?* +Default key: ? +Map option: NERDTreeMapHelp +Applies to: no restrictions. + +Toggles whether the quickhelp is displayed. + +------------------------------------------------------------------------------ +2.3. The NERD tree menu *NERDTreeMenu* + +The NERD tree has a menu that can be programmed via the an API (see +|NERDTreeMenuAPI|). The idea is to simulate the "right click" menus that most +file explorers have. + +The script comes with two default menu plugins: exec_menuitem.vim and +fs_menu.vim. fs_menu.vim adds some basic filesystem operations to the menu for +creating/deleting/moving/copying files and dirs. exec_menuitem.vim provides a +menu item to execute executable files. + +Related tags: |NERDTree-m| |NERDTreeApi| + +============================================================================== +3. Customisation *NERDTreeOptions* + + +------------------------------------------------------------------------------ +3.1. Customisation summary *NERDTreeOptionSummary* + +The script provides the following options that can customise the behaviour the +NERD tree. These options should be set in your vimrc. + +|'loaded_nerd_tree'| Turns off the script. + +|'NERDTreeAutoCenter'| Controls whether the NERD tree window centers + when the cursor moves within a specified + distance to the top/bottom of the window. + +|'NERDTreeAutoCenterThreshold'| Controls the sensitivity of autocentering. + +|'NERDTreeCaseSensitiveSort'| Tells the NERD tree whether to be case + sensitive or not when sorting nodes. + +|'NERDTreeSortHiddenFirst'| Tells the NERD tree whether to take the dot + at the beginning of the hidden file names + into account when sorting nodes. + +|'NERDTreeChDirMode'| Tells the NERD tree if/when it should change + vim's current working directory. + +|'NERDTreeHighlightCursorline'| Tell the NERD tree whether to highlight the + current cursor line. + +|'NERDTreeHijackNetrw'| Tell the NERD tree whether to replace the netrw + autocommands for exploring local directories. + +|'NERDTreeIgnore'| Tells the NERD tree which files to ignore. + +|'NERDTreeRespectWildIgnore'| Tells the NERD tree to respect |'wildignore'|. + +|'NERDTreeBookmarksFile'| Where the bookmarks are stored. + +|'NERDTreeBookmarksSort'| Whether the bookmarks list is sorted on + display. + +|'NERDTreeMouseMode'| Tells the NERD tree how to handle mouse + clicks. + +|'NERDTreeQuitOnOpen'| Closes the tree window after opening a file. + +|'NERDTreeShowBookmarks'| Tells the NERD tree whether to display the + bookmarks table on startup. + +|'NERDTreeShowFiles'| Tells the NERD tree whether to display files + in the tree on startup. + +|'NERDTreeShowHidden'| Tells the NERD tree whether to display hidden + files on startup. + +|'NERDTreeShowLineNumbers'| Tells the NERD tree whether to display line + numbers in the tree window. + +|'NERDTreeSortOrder'| Tell the NERD tree how to sort the nodes in + the tree. + +|'NERDTreeStatusline'| Set a statusline for NERD tree windows. + +|'NERDTreeWinPos'| Tells the script where to put the NERD tree + window. + +|'NERDTreeWinSize'| Sets the window size when the NERD tree is + opened. + +|'NERDTreeMinimalUI'| Disables display of the 'Bookmarks' label and + 'Press ? for help' text. + +|'NERDTreeCascadeOpenSingleChildDir'| + Cascade open while selected directory has only + one child that also is a directory. + +|'NERDTreeAutoDeleteBuffer'| Tells the NERD tree to automatically remove + a buffer when a file is being deleted or renamed + via a context menu command. + +|'NERDTreeCreatePrefix'| Specify a prefix to be used when creating the + NERDTree window. + +------------------------------------------------------------------------------ +3.2. Customisation details *NERDTreeOptionDetails* + +To enable any of the below options you should put the given line in your +~/.vimrc + + *'loaded_nerd_tree'* +If this plugin is making you feel homicidal, it may be a good idea to turn it +off with this line in your vimrc: > + let loaded_nerd_tree=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeAutoCenter'* +Values: 0 or 1. +Default: 1 + +If set to 1, the NERD tree window will center around the cursor if it moves to +within |'NERDTreeAutoCenterThreshold'| lines of the top/bottom of the window. + +This is ONLY done in response to tree navigation mappings, +i.e. |NERDTree-J| |NERDTree-K| |NERDTree-C-J| |NERDTree-C-K| |NERDTree-p| +|NERDTree-P| + +The centering is done with a |zz| operation. + +------------------------------------------------------------------------------ + *'NERDTreeAutoCenterThreshold'* +Values: Any natural number. +Default: 3 + +This option controls the "sensitivity" of the NERD tree auto centering. See +|'NERDTreeAutoCenter'| for details. + +------------------------------------------------------------------------------ + *'NERDTreeCaseSensitiveSort'* +Values: 0 or 1. +Default: 0. + +By default the NERD tree does not sort nodes case sensitively, i.e. nodes +could appear like this: > + bar.c + Baz.c + blarg.c + boner.c + Foo.c +< +But, if you set this option to 1 then the case of the nodes will be taken into +account. The above nodes would then be sorted like this: > + Baz.c + Foo.c + bar.c + blarg.c + boner.c +< +------------------------------------------------------------------------------ + *'NERDTreeChDirMode'* + +Values: 0, 1 or 2. +Default: 0. + +Use this option to tell the script when (if at all) to change the current +working directory (CWD) for vim. + +If it is set to 0 then the CWD is never changed by the NERD tree. + +If set to 1 then the CWD is changed when the NERD tree is first loaded to the +directory it is initialized in. For example, if you start the NERD tree with > + :NERDTree /home/marty/foobar +< +then the CWD will be changed to /home/marty/foobar and will not be changed +again unless you init another NERD tree with a similar command. + +If the option is set to 2 then it behaves the same as if set to 1 except that +the CWD is changed whenever the tree root is changed. For example, if the CWD +is /home/marty/foobar and you make the node for /home/marty/foobar/baz the new +root then the CWD will become /home/marty/foobar/baz. + +------------------------------------------------------------------------------ + *'NERDTreeHighlightCursorline'* +Values: 0 or 1. +Default: 1. + +If set to 1, the current cursor line in the NERD tree buffer will be +highlighted. This is done using the |'cursorline'| option. + +------------------------------------------------------------------------------ + *'NERDTreeHijackNetrw'* +Values: 0 or 1. +Default: 1. + +If set to 1, doing a > + :edit +< +will open up a window level NERD tree instead of a netrw in the target window. + +Window level trees behaves slightly different from a regular trees in the +following respects: + 1. 'o' will open the selected file in the same window as the tree, + replacing it. + 2. you can have one tree per window - instead of per tab. + +------------------------------------------------------------------------------ + *'NERDTreeIgnore'* +Values: a list of regular expressions. +Default: ['\~$']. + +This option is used to specify which files the NERD tree should ignore. It +must be a list of regular expressions. When the NERD tree is rendered, any +files/dirs that match any of the regex's in 'NERDTreeIgnore' wont be +displayed. + +For example if you put the following line in your vimrc: > + let NERDTreeIgnore=['\.vim$', '\~$'] +< +then all files ending in .vim or ~ will be ignored. + +There are 2 magic flags that can be appended to the end of each regular +expression to specify that the regex should match only files or only dirs. +These flags are "[[dir]]" and "[[file]]". Example: > + let NERDTreeIgnore=['.d$[[dir]]', '.o$[[file]]'] +< +This will cause all dirs ending in ".d" to be ignored and all files ending in +".o" to be ignored. + +Note: to tell the NERD tree not to ignore any files you must use the following +line: > + let NERDTreeIgnore=[] +< + +The file filters can be turned on and off dynamically with the |NERDTree-f| +mapping. + +------------------------------------------------------------------------------ + *'NERDTreeRespectWildIgnore'* +Values: 0 or 1. +Default: 0. + +If set to 1, the |'wildignore'| setting is respected. + +------------------------------------------------------------------------------ + *'NERDTreeBookmarksFile'* +Values: a path +Default: $HOME/.NERDTreeBookmarks + +This is where bookmarks are saved. See |NERDTreeBookmarkCommands|. + +------------------------------------------------------------------------------ + *'NERDTreeBookmarksSort'* +Values: 0 or 1 +Default: 1 + +If set to 0 then the bookmarks list is not sorted. +If set to 1 the bookmarks list is sorted. + +------------------------------------------------------------------------------ + *'NERDTreeMouseMode'* +Values: 1, 2 or 3. +Default: 1. + +If set to 1 then a double click on a node is required to open it. +If set to 2 then a single click will open directory nodes, while a double +click will still be required for file nodes. +If set to 3 then a single click will open any node. + +Note: a double click anywhere on a line that a tree node is on will +activate it, but all single-click activations must be done on name of the node +itself. For example, if you have the following node: > + | | |-application.rb +< +then (to single click activate it) you must click somewhere in +'application.rb'. + +------------------------------------------------------------------------------ + *'NERDTreeQuitOnOpen'* + +Values: 0 or 1. +Default: 0 + +If set to 1, the NERD tree window will close after opening a file with the +|NERDTree-o|, |NERDTree-i|, |NERDTree-t| and |NERDTree-T| mappings. + +------------------------------------------------------------------------------ + *'NERDTreeShowBookmarks'* +Values: 0 or 1. +Default: 0. + +If this option is set to 1 then the bookmarks table will be displayed. + +This option can be toggled dynamically, per tree, with the |NERDTree-B| +mapping. + +------------------------------------------------------------------------------ + *'NERDTreeShowFiles'* +Values: 0 or 1. +Default: 1. + +If this option is set to 1 then files are displayed in the NERD tree. If it is +set to 0 then only directories are displayed. + +This option can be toggled dynamically, per tree, with the |NERDTree-F| +mapping and is useful for drastically shrinking the tree when you are +navigating to a different part of the tree. + +------------------------------------------------------------------------------ + *'NERDTreeShowHidden'* +Values: 0 or 1. +Default: 0. + +This option tells vim whether to display hidden files by default. This option +can be dynamically toggled, per tree, with the |NERDTree-I| mapping. Use one +of the follow lines to set this option: > + let NERDTreeShowHidden=0 + let NERDTreeShowHidden=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeShowLineNumbers'* +Values: 0 or 1. +Default: 0. + +This option tells vim whether to display line numbers for the NERD tree +window. Use one of the follow lines to set this option: > + let NERDTreeShowLineNumbers=0 + let NERDTreeShowLineNumbers=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeSortOrder'* +Values: a list of regular expressions. +Default: ['\/$', '*', '\.swp$', '\.bak$', '\~$'] + +This option is set to a list of regular expressions which are used to +specify the order of nodes under their parent. + +For example, if the option is set to: > + ['\.vim$', '\.c$', '\.h$', '*', 'foobar'] +< +then all .vim files will be placed at the top, followed by all .c files then +all .h files. All files containing the string 'foobar' will be placed at the +end. The star is a special flag: it tells the script that every node that +doesnt match any of the other regexps should be placed here. + +If no star is present in 'NERDTreeSortOrder' then one is automatically +appended to the array. + +The regex '\/$' should be used to match directory nodes. + +After this sorting is done, the files in each group are sorted alphabetically. + +Other examples: > + (1) ['*', '\/$'] + (2) [] + (3) ['\/$', '\.rb$', '\.php$', '*', '\.swp$', '\.bak$', '\~$'] +< +1. Directories will appear last, everything else will appear above. +2. Everything will simply appear in alphabetical order. +3. Dirs will appear first, then ruby and php. Swap files, bak files and vim + backup files will appear last with everything else preceding them. + +------------------------------------------------------------------------------ + *'NERDTreeStatusline'* +Values: Any valid statusline setting. +Default: %{b:NERDTree.root.path.strForOS(0)} + +Tells the script what to use as the |'statusline'| setting for NERD tree +windows. + +Note that the statusline is set using |:let-&| not |:set| so escaping spaces +isn't necessary. + +Setting this option to -1 will will deactivate it so that your global +statusline setting is used instead. + +------------------------------------------------------------------------------ + *'NERDTreeWinPos'* +Values: "left" or "right" +Default: "left". + +This option is used to determine where NERD tree window is placed on the +screen. + +This option makes it possible to use two different explorer plugins +simultaneously. For example, you could have the taglist plugin on the left of +the window and the NERD tree on the right. + +------------------------------------------------------------------------------ + *'NERDTreeWinSize'* +Values: a positive integer. +Default: 31. + +This option is used to change the size of the NERD tree when it is loaded. + +------------------------------------------------------------------------------ + *'NERDTreeMinimalUI'* +Values: 0 or 1 +Default: 0 + +This options disables the 'Bookmarks' label 'Press ? for help' text. Use one +of the following lines to set this option: > + let NERDTreeMinimalUI=0 + let NERDTreeMinimalUI=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeCascadeOpenSingleChildDir'* +Values: 0 or 1 +Default: 1. + +When opening dir nodes, this option tells NERDTree to recursively open dirs +that have only one child which is also a dir. NERDTree will stop when it finds +a dir that contains anything but another single dir. This option also causes +the |NERDTree-x| mapping to close dirs in the same manner. This option may be +useful for Java projects. Use one of the follow lines to set this option: > + let NERDTreeCascadeOpenSingleChildDir=0 + let NERDTreeCascadeOpenSingleChildDir=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeAutoDeleteBuffer'* +Values: 0 or 1 +Default: 0. + +When using a context menu to delete or rename a file you may also want to delete +the buffer which is no more valid. If the option is not set you will see a +confirmation if you really want to delete an old buffer. If you always press 'y' +then it worths to set this option to 1. Use one of the follow lines to set this +option: > + let NERDTreeAutoDeleteBuffer=0 + let NERDTreeAutoDeleteBuffer=1 +< +------------------------------------------------------------------------------ + *'NERDTreeCreatePrefix'* +Values: Any valid command prefix. +Default: "silent". + +Internally, NERDTree uses the |:edit| command to create a buffer in which to +display its tree view. You can augment this behavior by specifying a prefix +string such as "keepalt" or similar. For example, to have NERDTree create its +tree window using `silent keepalt keepjumps edit`: + let NERDTreeCreatePrefix='silent keepalt keepjumps' +< + +============================================================================== +4. The NERD tree API *NERDTreeAPI* + +The NERD tree script allows you to add custom key mappings and menu items via +a set of API calls. Any scripts that use this API should be placed in +~/.vim/nerdtree_plugin/ (*nix) or ~/vimfiles/nerdtree_plugin (windows). + +The script exposes some prototype objects that can be used to manipulate the +tree and/or get information from it: > + g:NERDTreePath + g:NERDTreeDirNode + g:NERDTreeFileNode + g:NERDTreeBookmark +< +See the code/comments in NERD_tree.vim to find how to use these objects. The +following code conventions are used: + * class members start with a capital letter + * instance members start with a lower case letter + * private members start with an underscore + +See this blog post for more details: + http://got-ravings.blogspot.com/2008/09/vim-pr0n-prototype-based-objects.html + +------------------------------------------------------------------------------ +4.1. Key map API *NERDTreeKeymapAPI* + +NERDTreeAddKeyMap({options}) *NERDTreeAddKeyMap()* + Adds a new keymapping for all NERD tree buffers. + {options} must be a dictionary, and must contain the following keys: + "key" - the trigger key for the new mapping + "callback" - the function the new mapping will be bound to + "quickhelpText" - the text that will appear in the quickhelp (see + |NERDTree-?|) + "override" - if 1 then this new mapping will override whatever previous + mapping was defined for the key/scope combo. Useful for overriding the + default mappings. + + Additionally, a "scope" argument may be supplied. This constrains the + mapping so that it is only activated if the cursor is on a certain object. + That object is then passed into the handling method. Possible values are: + "FileNode" - a file node + "DirNode" - a directory node + "Node" - a file or directory node + "Bookmark" - A bookmark + "all" - the keymap is not constrained to any scope (default). When + thei is used, the handling function is not passed any arguments. + + + Example: > + call NERDTreeAddKeyMap({ + \ 'key': 'foo', + \ 'callback': 'NERDTreeCDHandler', + \ 'quickhelpText': 'echo full path of current node', + \ 'scope': 'DirNode' }) + + function! NERDTreeCDHandler(dirnode) + call a:dirnode.changeToDir() + endfunction +< + This code should sit in a file like ~/.vim/nerdtree_plugin/mymapping.vim. + It adds a (redundant) mapping on 'foo' which changes vim's CWD to that of + the current dir node. Note this mapping will only fire when the cursor is + on a directory node. + +------------------------------------------------------------------------------ +4.2. Menu API *NERDTreeMenuAPI* + +NERDTreeAddSubmenu({options}) *NERDTreeAddSubmenu()* + Creates and returns a new submenu. + + {options} must be a dictionary and must contain the following keys: + "text" - the text of the submenu that the user will see + "shortcut" - a shortcut key for the submenu (need not be unique) + + The following keys are optional: + "isActiveCallback" - a function that will be called to determine whether + this submenu item will be displayed or not. The callback function must return + 0 or 1. + "parent" - the parent submenu of the new submenu (returned from a previous + invocation of NERDTreeAddSubmenu()). If this key is left out then the new + submenu will sit under the top level menu. + + See below for an example. + +NERDTreeAddMenuItem({options}) *NERDTreeAddMenuItem()* + Adds a new menu item to the NERD tree menu (see |NERDTreeMenu|). + + {options} must be a dictionary and must contain the + following keys: + "text" - the text of the menu item which the user will see + "shortcut" - a shortcut key for the menu item (need not be unique) + "callback" - the function that will be called when the user activates the + menu item. + + The following keys are optional: + "isActiveCallback" - a function that will be called to determine whether + this menu item will be displayed or not. The callback function must return + 0 or 1. + "parent" - if the menu item belongs under a submenu then this key must be + specified. This value for this key will be the object that + was returned when the submenu was created with |NERDTreeAddSubmenu()|. + + See below for an example. + +NERDTreeAddMenuSeparator([{options}]) *NERDTreeAddMenuSeparator()* + Adds a menu separator (a row of dashes). + + {options} is an optional dictionary that may contain the following keys: + "isActiveCallback" - see description in |NERDTreeAddMenuItem()|. + +Below is an example of the menu API in action. > + call NERDTreeAddMenuSeparator() + + call NERDTreeAddMenuItem({ + \ 'text': 'a (t)op level menu item', + \ 'shortcut': 't', + \ 'callback': 'SomeFunction' }) + + let submenu = NERDTreeAddSubmenu({ + \ 'text': 'a (s)ub menu', + \ 'shortcut': 's' }) + + call NERDTreeAddMenuItem({ + \ 'text': '(n)ested item 1', + \ 'shortcut': 'n', + \ 'callback': 'SomeFunction', + \ 'parent': submenu }) + + call NERDTreeAddMenuItem({ + \ 'text': '(n)ested item 2', + \ 'shortcut': 'n', + \ 'callback': 'SomeFunction', + \ 'parent': submenu }) +< +This will create the following menu: > + -------------------- + a (t)op level menu item + a (s)ub menu +< +Where selecting "a (s)ub menu" will lead to a second menu: > + (n)ested item 1 + (n)ested item 2 +< +When any of the 3 concrete menu items are selected the function "SomeFunction" +will be called. + +------------------------------------------------------------------------------ +4.3 NERDTreeAddPathFilter(callback) *NERDTreeAddPathFilter()* + +Path filters are essentially a more powerful version of |NERDTreeIgnore|. +If the simple regex matching in |NERDTreeIgnore| is not enough then use +|NERDTreeAddPathFilter()| to add a callback function that paths will be +checked against when the decision to ignore them is made. Example > + + call NERDTreeAddPathFilter('MyFilter') + + function! MyFilter(params) + "params is a dict containing keys: 'nerdtree' and 'path' which are + "g:NERDTree and g:NERDTreePath objects + + "return 1 to ignore params['path'] or 0 otherwise + endfunction +< +------------------------------------------------------------------------------ +4.4 Path Listener API *NERDTreePathListenerAPI* + +Use this API if you want to run a callback for events on Path objects. E.G > + + call g:NERDTreePathNotifier.AddListener("init", "MyListener") + + ".... + + function! MyListener(event) + "This function will be called whenever a Path object is created. + + "a:event is an object that contains a bunch of relevant info - + "including the path in question. See lib/nerdtree/event.vim for details. + endfunction +< +Current events supported: + init ~ + refresh ~ + refreshFlags ~ + +------------------------------------------------------------------------------ +NERDTreeRender() *NERDTreeRender()* + Re-renders the NERD tree buffer. Useful if you change the state of the + tree and you want to it to be reflected in the UI. + +============================================================================== +5. About *NERDTreeAbout* + +The author of the NERD tree is a terrible terrible monster called Martyzilla +who gobbles up small children with milk and sugar for breakfast. + +He can be reached at martin.grenfell at gmail dot com. He would love to hear +from you, so feel free to send him suggestions and/or comments about this +plugin. Don't be shy --- the worst he can do is slaughter you and stuff you in +the fridge for later ;) + +The latest stable versions can be found at + http://www.vim.org/scripts/script.php?script_id=1658 + +The latest dev versions are on github + http://github.com/scrooloose/nerdtree + +============================================================================== +6. License *NERDTreeLicense* + +The NERD tree is released under the wtfpl. +See http://sam.zoy.org/wtfpl/COPYING. diff --git a/doc/asyncrun.txt b/doc/asyncrun.txt new file mode 100644 index 0000000..449c5ba --- /dev/null +++ b/doc/asyncrun.txt @@ -0,0 +1,431 @@ +*asyncrun.txt* asyncrun.vim: Run Async Shell Commands in Vim 8.0 and Output to Quickfix Window + +=============================================================================== +Contents ~ + + 1. Introduction |asyncrun-introduction| + 2. Preface |asyncrun-43-preface| + 3. News |asyncrun-44-news| + 4. Install |asyncrun-45-install| + 5. Example |asyncrun-46-example| + 6. Tutorials |asyncrun-48-tutorials| + 1. Async run gcc to compile current file |asyncrun-49-async-run-gcc-to-compile-current-file| + 2. Async run make |asyncrun-50-async-run-make| + 3. Grep key word |asyncrun-51-grep-key-word| + 4. Compile go project |asyncrun-52-compile-go-project| + 5. Lookup man page |asyncrun-53-lookup-man-page| + 6. Git push |asyncrun-54-git-push| + 7. Setup '' to compile file |F7| + 7. Manual |asyncrun-56-manual| + 1. AsyncRun - Run shell command |57-asyncrun-run-shell-command| + 2. AsyncStop - Stop the running job |asyncrun-58-asyncstop-stop-running-job| + 3. Settings: |asyncrun-59-settings| + 4. Variables: |asyncrun-61-variables| + 5. Requirements: |asyncrun-62-requirements| + 6. Cooperate with vim-fugitive: |asyncrun-63-cooperate-with-vim-fugitive| + 8. More |asyncrun-66-more| + 9. Further |asyncrun-75-further| + 10. History |asyncrun-77-history| + 11. Credits |asyncrun-78-credits| + 12. References |asyncrun-references| + +=============================================================================== + *asyncrun-introduction* +Introduction ~ + + +Run Async Shell Commands in Vim 8.0 and Output to Quickfix Window + +=============================================================================== + *asyncrun-43-preface* +Preface ~ + +This plugin takes the advantage of new apis in Vim 8 (and NeoVim) to enable you +to run shell commands in background and read output in the quickfix window in +realtime: + +- Easy to use, just start your background command by ':AsyncRun' (just like + old "!" cmd). + +- Command is done in the background, no need to wait for the entire process + to finish. + +- Output are displayed in the quickfix window, errors are matched with + 'errorformat'. + +- You can explore the error output immediately or keep working in vim while + executing. + +- Ring the bell or play a sound to notify you job finished while you're + focusing on editing. + +- Fast and lightweight, just a single self-contained 'asyncrun.vim' source + file. + +- Provide corresponding user experience vim, neovim, gvim and macvim. + +If that doesn't excite you, then perhaps this GIF screen capture below will +change your mind. + +=============================================================================== + *asyncrun-44-news* +News ~ + +- 2016/10/17 Glad to announce that 'asyncrun.vim' supports NeoVim now. +- 2016/10/15 'asyncrun.vim' can cooperate with 'vim-fugitive', see the bottom + of the README. + +=============================================================================== + *asyncrun-45-install* +Install ~ + +Copy 'asyncrun.vim' to your '~/.vim/plugin' or use Vundle to install it from +'skywind3000/asyncrun.vim' . + +=============================================================================== + *asyncrun-46-example* +Example ~ + + Image: [47] + +=============================================================================== + *asyncrun-48-tutorials* +Tutorials ~ + +------------------------------------------------------------------------------- + *asyncrun-49-async-run-gcc-to-compile-current-file* +Async run gcc to compile current file ~ +> + :AsyncRun gcc % -o %< + :AsyncRun g++ -O3 "%" -o "%<" -lpthread +< +This command will run gcc in the background and output to the quickfix window +in realtime. Macro ''%'' stands for filename and ''%>'' represents filename +without extension. + +------------------------------------------------------------------------------- + *asyncrun-50-async-run-make* +Async run make ~ +> + :AsyncRun make + :AsyncRun make -f makefile +< +------------------------------------------------------------------------------- + *asyncrun-51-grep-key-word* +Grep key word ~ +> + :AsyncRun! grep -R word . + :AsyncRun! grep -R . +< +when '!' is included, auto-scroll in quickfix will be disabled. '' +represents current word under cursor. + +------------------------------------------------------------------------------- + *asyncrun-52-compile-go-project* +Compile go project ~ +> + :AsyncRun go build "%:p:h" +< +Macro ''%:p:h'' stands for current file dir. + +------------------------------------------------------------------------------- + *asyncrun-53-lookup-man-page* +Lookup man page ~ +> + :AsyncRun! man -S 3:2:1 +< +------------------------------------------------------------------------------- + *asyncrun-54-git-push* +Git push ~ +> + :AsyncRun git push origin master +< +------------------------------------------------------------------------------- +Setup '<*F7*>' to compile file +> + :noremap :AsyncRun gcc "%" -o "%<" +< +File name may contain spaces, therefore, it's safe to quote them. + +=============================================================================== + *asyncrun-56-manual* +Manual ~ + +There are two vim commands: ':AsyncRun' and ':AsyncStop' to control async jobs. + +------------------------------------------------------------------------------- + *57-asyncrun-run-shell-command* +AsyncRun - Run shell command ~ +> + :AsyncRun[!] [options] {cmd} ... +< +run shell command in background and output to quickfix. when '!' is included, +auto-scroll in quickfix will be disabled. Parameters are splited by space, if a +parameter contains space, it should be **quoted** or escaped as backslash + +space (unix only). + +Parameters accept macros start with ''%'', ''#'' or ''<'' : +> + %:p - File name of current buffer with full path + %:t - File name of current buffer without path + %:p:h - File path of current buffer without file name + %:e - File extension of current buffer + %:t:r - File name of current buffer without path and extension + % - File name relativize to current directory + %:h:. - File path relativize to current directory + - Current directory + - Current word under cursor + - Current file name under cursor +< +Environment variables are set before executing: +> + $VIM_FILEPATH - File name of current buffer with full path + $VIM_FILENAME - File name of current buffer without path + $VIM_FILEDIR - Full path of current buffer without the file name + $VIM_FILEEXT - File extension of current buffer + $VIM_FILENOEXT - File name of current buffer without path and extension + $VIM_CWD - Current directory + $VIM_RELDIR - File path relativize to current directory + $VIM_RELNAME - File name relativize to current directory + $VIM_CWORD - Current word under cursor + $VIM_CFILE - Current filename under cursor + $VIM_GUI - Is running under gui ? + $VIM_VERSION - Value of v:version + $VIM_COLUMNS - How many columns in vim's screen + $VIM_LINES - How many lines in vim's screen + $VIM_SVRNAME - Value of v:servername for +clientserver usage +< +These environment variables wrapped by '$(...)' (eg. '$(VIM_FILENAME)') will +also be expanded in the parameters. + +There can be some options before your '[cmd]': +> + -mode=0/1/2 - start mode: 0(async, default), 1(:make), 2(:!) + -cwd=? - initial directory, (use current directory if unset) + -save=0/1 - non-zero to save unsaved files before executing + -program=? - set to `make` to use `&makeprg`, `grep` to use `&grepprg` + -post=? - vimscript to exec after this job finished, spaces **must** be escaped to '\ ' +< +All options must start with a minus and position **before** '[cmd]'. Since no +shell command string starts with a minus. So they can be distinguished from +shell command easily without any ambiguity. + +Don't worry if you do have a shell command starting with '-', Just put a +placeholder '@' before your command to tell asyncrun explicitly: "stop parsing +options now, the following string is all my command". + +------------------------------------------------------------------------------- + *asyncrun-58-asyncstop-stop-running-job* +AsyncStop - Stop the running job ~ +> + :AsyncStop[!] +< +stop the running job, when "!" is included, job will be stopped by signal KILL + +------------------------------------------------------------------------------- + *asyncrun-59-settings* +Settings: ~ + +- g:asyncrun_exit - script will be executed after finished +- g:asyncrun_bell - non-zero to ring a bell after finished +- g:asyncrun_mode - 0:async(require vim 7.4.1829) 1:sync 2:shell +- g:asyncrun_encs - set shell encoding if it's different from '&encoding', + see here [60] +- g:asyncrun_trim - non-zero to trim the empty lines in the quickfix window. + +------------------------------------------------------------------------------- + *asyncrun-61-variables* +Variables: ~ + +- g:asyncrun_code - exit code +- g:asyncrun_status - 'running', 'success' or 'failure' + +------------------------------------------------------------------------------- + *asyncrun-62-requirements* +Requirements: ~ + +Vim 7.4.1829 is minimal version to support async mode. If you are use older +versions, 'g:asyncrun_mode' will fall back from '0/async' to '1/sync'. NeoVim +0.1.4 or later is also supported. + +Recommend to use Vim 8.0 or later. + +------------------------------------------------------------------------------- + *asyncrun-63-cooperate-with-vim-fugitive* +Cooperate with vim-fugitive: ~ + +asyncrun.vim can cooperate with 'vim-fugitive', see here [64]. + + Image: [65] + +=============================================================================== + *asyncrun-66-more* +More ~ + +- Additional examples (background ctags updating, pdf conversion, ...) [67] +- Notify user job finished by playing a sound [68] +- View progress in status line or vim airline [69] +- Best practice with quickfix windows [70] +- Scroll the quickfix window only if the cursor is on the last line [71] +- Cooperate with vim-fugitive [64] +- Replace old ':make' command with asyncrun [72] +- Quickfix encoding problem when using Chinese or Japanese [60] +- Example for updating and adding cscope files [73] + +Don't forget to read the Frequently Asked Questions [74]. + +=============================================================================== + *asyncrun-75-further* +Further ~ + +- Experiment: get netrw using asyncrun to save remote files [76] + +=============================================================================== + *asyncrun-77-history* +History ~ + +- 1.3.3 (2016-10-28): prevent job who reads stdin getting hanging, fixed an + issue in fast exiting jobs. + +- 1.3.2 (2016-10-19): new "-post" option to run a vimscript after the job + finished + +- 1.3.1 (2016-10-18): fixed few issues of arguments passing in different + modes + +- 1.3.0 (2016-10-17): add support to neovim, better CJK characters handling. + +- 1.2.0 (2016-10-16): refactor, correct arguments parsing, cmd options and + &makeprg supports + +- 1.1.1 (2016-10-13): use the vim native &shell and &shellcmdflag config to + execute commands. + +- 1.1.0 (2016-10-12): quickfix window scroll only if cursor is on the last + line + +- 1.0.3 (2016-10-10): reduce quickfix output latency. + +- 1.0.2 (2016-10-09): fixed an issue in replacing macros in parameters. + +- 1.0.1 (2016-10-07): Add a convenient way to toggle quickfix window + (asyncrun#quickfix_toggle) + +- 1.0.0 (2016-09-21): can fall back to sync mode to compatible older vim + versions. + +- 0.0.3 (2016-09-15): new arguments now accept environment variables wrapped + by $(...) + +- 0.0.2 (2016-09-12): some improvements and more documents for a tiny + tutorial. + +- 0.0.1 (2016-09-08): improve arguments parsing + +- 0.0.0 (2016-08-24): initial version + +=============================================================================== + *asyncrun-78-credits* +Credits ~ + +Trying best to provide the most simply and convenience experience in the +asynchronous-jobs. + +Author: skywind3000 Please vote it if you like it: +http://www.vim.org/scripts/script.php?script_id=5431 + + +=============================================================================== + *asyncrun-references* +References ~ + +[1] https://github.com/skywind3000/asyncrun.vim#start-of-content +[2] https://github.com/ +[3] https://github.com/personal +[4] https://github.com/open-source +[5] https://github.com/business +[6] https://github.com/explore +[7] https://github.com/join?source=header-repo +[8] https://github.com/login?return_to=%2Fskywind3000%2Fasyncrun.vim +[9] https://github.com/pricing +[10] https://github.com/blog +[11] https://help.github.com +[12] https://github.com/search +[13] https://github.com/skywind3000/asyncrun.vim/watchers +[14] https://github.com/skywind3000/asyncrun.vim/stargazers +[15] https://github.com/skywind3000/asyncrun.vim/network +[16] https://github.com/skywind3000/asyncrun.vim +[17] https://github.com/skywind3000/asyncrun.vim/issues +[18] https://github.com/skywind3000/asyncrun.vim/pulls +[19] https://github.com/skywind3000/asyncrun.vim/projects +[20] https://github.com/skywind3000/asyncrun.vim/wiki +[21] https://github.com/skywind3000/asyncrun.vim/pulse +[22] https://github.com/skywind3000/asyncrun.vim/graphs +[23] https://github.com/skywind3000/asyncrun.vim/commits/master +[24] https://github.com/skywind3000/asyncrun.vim/branches +[25] https://github.com/skywind3000/asyncrun.vim/releases +[26] https://github.com/skywind3000/asyncrun.vim/graphs/contributors +[27] https://github.com/skywind3000/asyncrun.vim/blob/master/LICENSE +[28] https://github.com/skywind3000/asyncrun.vim/search?l=vim +[29] https://help.github.com/articles/which-remote-url-should-i-use +[30] https://github.com/skywind3000/asyncrun.vim/archive/master.zip +[31] https://github.com/skywind3000/asyncrun.vim/find/master +[32] https://github.com/skywind3000/asyncrun.vim/tree/master +[33] https://github.com/skywind3000/asyncrun.vim/commit/1edc42699bcb8a1b17398c2590a27636e327531d +[34] https://camo.githubusercontent.com/a08cc422099cb8fd2a030bc7e6da7732e483e336/68747470733a2f2f322e67726176617461722e636f6d2f6176617461722f33313761636661306235663764643563623831363331303365326266623366363f643d68747470732533412532462532466173736574732d63646e2e6769746875622e636f6d253246696d6167657325324667726176617461727325324667726176617461722d757365722d3432302e706e6726723d7826733d313430 +[35] https://github.com/skywind3000/asyncrun.vim/tree/1edc42699bcb8a1b17398c2590a27636e327531d +[36] https://assets-cdn.github.com/images/spinners/octocat-spinner-32.gif +[37] https://github.com/skywind3000/asyncrun.vim/tree/master/doc +[38] https://github.com/skywind3000/asyncrun.vim/commit/7b906e89f42b811176007a52a8affdfd11c76a93 +[39] https://github.com/skywind3000/asyncrun.vim/tree/master/plugin +[40] https://github.com/skywind3000/asyncrun.vim/commit/c9bb3b9a1909a7e3bcc53817cefa94460cd4a85e +[41] https://github.com/skywind3000/asyncrun.vim/commit/e4f207983822abb58df9f3577cf0b3fbacdf0231 +[42] https://github.com/skywind3000/asyncrun.vim/blob/master/README.md +[43] https://github.com/skywind3000/asyncrun.vim#preface +[44] https://github.com/skywind3000/asyncrun.vim#news +[45] https://github.com/skywind3000/asyncrun.vim#install +[46] https://github.com/skywind3000/asyncrun.vim#example +[47] https://raw.githubusercontent.com/skywind3000/asyncrun.vim/master/doc/screenshot.gif +[48] https://github.com/skywind3000/asyncrun.vim#tutorials +[49] https://github.com/skywind3000/asyncrun.vim#async-run-gcc-to-compile-current-file +[50] https://github.com/skywind3000/asyncrun.vim#async-run-make +[51] https://github.com/skywind3000/asyncrun.vim#grep-key-word +[52] https://github.com/skywind3000/asyncrun.vim#compile-go-project +[53] https://github.com/skywind3000/asyncrun.vim#lookup-man-page +[54] https://github.com/skywind3000/asyncrun.vim#git-push +[55] https://github.com/skywind3000/asyncrun.vim#setup-f7-to-compile-file +[56] https://github.com/skywind3000/asyncrun.vim#manual +[57] https://github.com/skywind3000/asyncrun.vim#asyncrun---run-shell-command +[58] https://github.com/skywind3000/asyncrun.vim#asyncstop---stop-the-running-job +[59] https://github.com/skywind3000/asyncrun.vim#settings +[60] https://github.com/skywind3000/asyncrun.vim/wiki/Quickfix-encoding-problem-when-using-Chinese-or-Japanese +[61] https://github.com/skywind3000/asyncrun.vim#variables +[62] https://github.com/skywind3000/asyncrun.vim#requirements +[63] https://github.com/skywind3000/asyncrun.vim#cooperate-with-vim-fugitive +[64] https://github.com/skywind3000/asyncrun.vim/wiki/Cooperate-with-vim-fugitive +[65] https://raw.githubusercontent.com/skywind3000/asyncrun.vim/master/doc/cooperate_with_fugitive.gif +[66] https://github.com/skywind3000/asyncrun.vim#more +[67] https://github.com/skywind3000/asyncrun.vim/wiki/Additional-Examples +[68] https://github.com/skywind3000/asyncrun.vim/wiki/Playing-Sound +[69] https://github.com/skywind3000/asyncrun.vim/wiki/Display-Progress-in-Status-Line-or-Airline +[70] https://github.com/skywind3000/asyncrun.vim/wiki/Quickfix-Best-Practice +[71] https://github.com/skywind3000/asyncrun.vim/wiki/Scroll-the-quickfix-window-only-if-cursor-is-on-the-last-line +[72] https://github.com/skywind3000/asyncrun.vim/wiki/Replace-old-make-command-with-AsyncRun +[73] https://github.com/skywind3000/asyncrun.vim/wiki/Example-for-updating-and-adding-cscope +[74] https://github.com/skywind3000/asyncrun.vim/wiki/FAQ +[75] https://github.com/skywind3000/asyncrun.vim#further +[76] https://github.com/skywind3000/asyncrun.vim/wiki/Get-netrw-using-asyncrun-to-save-remote-files +[77] https://github.com/skywind3000/asyncrun.vim#history +[78] https://github.com/skywind3000/asyncrun.vim#credits +[79] https://github.com/contact +[80] https://developer.github.com +[81] https://training.github.com +[82] https://shop.github.com +[83] https://github.com/about +[84] https://github.com +[85] https://github.com/site/terms +[86] https://github.com/site/privacy +[87] https://github.com/security +[88] https://status.github.com/ + +vim: ft=help diff --git a/doc/buffergator.txt b/doc/buffergator.txt new file mode 100644 index 0000000..a4426fa --- /dev/null +++ b/doc/buffergator.txt @@ -0,0 +1,335 @@ +*buffergator.txt* Buffer indexing and navigation plugin. + +=============================================================================== + *buffergator* *buffergator-contents* +CONTENTS~ + + 1. Introduction ........................... |buffergator-introduction| + 2. Commands ............................... |buffergator-commands| + 3. Key Mappings (Global) .................. |buffergator-global-keys| + 4. Key Mappings (Buffer Catalog) .......... |buffergator-buffer-keys| + 5. Key Mappings (Tab Page Catalog) ........ |buffergator-tabpage-keys| + 6. Options and Settings ................... |buffergator-options| + +=============================================================================== + *buffergator-introduction* +INTRODUCTION~ + +Buffergator is a plugin for listing, navigating between, and selecting buffers +to edit. Upon invocation (using the command, ":BuffergatorOpen" or +"BuffergatorToggle", or the provided key mapping, "b"), a "catalog" of +listed buffers are displayed in a separate new window split (vertical or +horizontal, based on user options; default = vertical). From this "buffer +catalog", a buffer can be selected and opened in an existing window, a new +window split (vertical or horizontal), or a new tab page. + +Selected buffers can be "previewed", i.e. opened in a window or tab page, but +with focus remaining in the buffer catalog. Even better, you can "walk" up and +down the list of buffers shown in the catalog by using (or ) / + (or ). These keys select the next/previous buffer in succession, +respectively, opening it for preview without leaving the buffer catalog +viewer. + +Buffergator also provides a way to list tab pages and buffers associated with +windows in tab pages (the "tab page catalog", which can be invoked using the +command ":BuffergatorTabsOpen" or the provided key mapping, "to"). + +By default, Buffergator provides global key maps that invoke its main +commands: "b" to open and "B" to close the buffer catalog, and +"to" to open and "tc" to close the tab page catalog. If you +prefer to map other keys, or do not want any keys mapped at all, set +"g:buffergator_suppress_keymaps" to 1 in your $VIMRUNTIME. + +=============================================================================== + *buffergator-commands* +COMMANDS~ + +These following commands are provided globally by Buffergator: + +:BuffergatorOpen + Open the buffer catalog, or go to it if it is already open. + +:BuffergatorClose + Close the buffer catalog if it is already open. + +:BuffergatorToggle + Open the buffer catalog if it is closed, or close it if + it is already open. + +:BuffergatorTabsOpen + Open the tab page catalog, or go to it if it is already open. + +:BuffergatorTabsClose + Close the tab page catalog if it is already open. + +:BuffergatorTabsToggle + Open the tab page catalog if it is closed, or close it if + it is already open. + +=============================================================================== + *buffergator-global-keys* +KEY MAPPINGS (GLOBAL)~ + +Unless "g:buffergator_suppress_keymaps" is set to 1, then the following +key mappings are defined: + +b Invokes ":BuffergatorOpen": open the buffer catalog, or go + to it if it is already open. + +B Invokes ":BuffergatorClose": close the buffer catalog. + +to Invokes ":BuffergatorTabsOpen": open the tab page catalog, + or go to it if it is already open. + +tc Invokes ":BuffergatorTabsClose": close the tab page + catalog. + +[b, Invokes ":BuffergatorMruCyclePrev": cycle to an older + buffer in the most-recently used (MRU) buffer list. + most-recently used buffer. If + "g:buffergator_mru_cycle_loop" is set to 1 (default), then + this will loop, i.e. returning to the initial buffer after + reaching the oldest buffer. + +]b, Invokes ":BuffergatorMruCycleNext": cycle to a newer + buffer in the most-recently used (MRU) buffer list. + most-recently used buffer. If + "g:buffergator_mru_cycle_loop" is set to 1 (default), then + this will loop, i.e. returning to the oldest buffer after + reaching the newest buffer. + +=============================================================================== + *buffergator-buffer-keys* +KEY MAPPINGS (BUFFER CATALOG)~ + +Invoking Buffergator results in the listed buffers being displayed in a +special Buffergator window, which is referred to as a "buffer catalog viewer". +The following key mappings are available when in the viewer. + +------------------------------------------------------------------------------- +Catalog Management~ + +cs Cycle through sort regimes. +cd Cycle through display regimes. +cp Toggle showing full paths (only "basename" display regime) +cw Cycle through window (viewport) split modes. +cq Cycle through quit (autodismiss-on-select) policies. +r Update (rebuild/refresh) index. +d Delete the selected buffer. +D Unconditionally delete the selected buffer. +x Wipe the selected buffer. +X Unconditionally wipe the selected buffer. +q Quit the index/catalog window. + +------------------------------------------------------------------------------- +Open Selected Buffer~ + +The following keys all open the currently-selected buffer and switch focus to +it. If the key presses are preceded by a number, then the buffer with that +number will be selected and opened instead of the current buffer. The catalog +buffer will be closed if 'g:buffergator_autodismiss_on_select' evaluates to +true; otherwise it will be kept open. + +, o Open the currently-selected buffer (or, if [count] is + given, buffer with number [count]), in previous window. +s Open the currently-selected buffer (or, if [count] is + given, buffer with number [count]), in a new vertical + split. + As above (compatibility with Ctrl-P/Command-T) +i Open the currently-selected buffer (or, if [count] is + given, buffer with number [count]), in a new split. + As above (compatibility with Ctrl-P/Command-T) +t Open the currently-selected buffer (or, if [count] is + given, buffer with number [count]), in a new tab page. + As above (compatibility with Ctrl-P/Command-T) + +------------------------------------------------------------------------------- +Preview Selected Buffer~ + +The following keys all open the currently-selected buffer, but retain focus on +the catalog viewer. If the key presses are preceded by a number, than the +buffer with that number will be opened. + +O, go Preview the currently-selected buffer (or, if [count] is + given, buffer with number [count]), in the previous + window. +S, gs Preview the currently-selected buffer (or, if [count] is + given, buffer with number [count]), is a new vertical + split. +I, gi Preview the currently-selected buffer (or, if [count] is + given, buffer with number [count]), in a new split +T Preview the currently-selected buffer (or, if [count] is + given, buffer with number [count]), in a new tab + page. +, Go to the next buffer entry (or, if [count] is + given, buffer with number [count]), and preview it in the + previous window. +, Go to the previous buffer entry (or, if [count] is + given, buffer with number [count]), and preview it in the + previous window. + +------------------------------------------------------------------------------- +Open and Switch Focus to Selected Buffer~ + +The following keys all open the currently-selected buffer and switch focus to +it, keeping the catalog viewe open, regardless of the +'g:buffergator_autodismiss_on_select' setting. If the key presses are preceded +by a number, than the buffer with that number will be opened. + +po Open the currently-selected buffer (or, if [count] is + given, buffer with number [count]), in the previous + window, and switch focus to it, keeping the catalog + viewer open. +ps Open the currently-selected buffer (or, if [count] is + given, buffer with number [count]), is a new vertical + split, and switch focus to it, keeping the catalog + viewer open. +pi Open the currently-selected buffer (or, if [count] is + given, buffer with number [count]), in a new split, + and switch focus to it, keeping the catalog + viewer open. + +------------------------------------------------------------------------------- +Go to Existing Viewport Showing Buffer~ + +The following keys will try to find the selected buffer in an existing +viewport (whether on the current tab page or another). If the key presses are +preceded by a number, then the buffer with that number will be the target +buffer. + +eo If currently-selected buffer (or, if [count] is + given, buffer with number [count]), is showing in an existing + viewport on this or any other tab page, go to it; + otherwise show it in the previous window. +es If currently-selected buffer (or, if [count] is + given, buffer with number [count]), is showing in an existing + viewport on this or any other tab page, go to it; + otherwise show it in a new vertical split. +ei If currently-selected buffer (or, if [count] is + given, buffer with number [count]), is showing in an existing + viewport on this or any other tab page, go to it; + otherwise show it in a new horizontal split. +et If currently-selected buffer (or, if [count] is + given, buffer with number [count]), is showing in an existing + viewport on this or any other tab page, go to it; + otherwise show it in a new tab page. +E If currently-selected buffer (or, if [count] is + given, buffer with number [count]), is showing in an existing + viewport on this or any other tab page, go to it; + otherwise do nothing. + +------------------------------------------------------------------------------- +Window Control~ + +A Zoom/unzoom window, expanding to full height (if + horizontally split) or full width (if vertically split) + +=============================================================================== + *buffergator-tabpage-keys* +KEY MAPPINGS (TAB PAGE CATALOG)~ + +------------------------------------------------------------------------------- +Catalog Management~ + +cd Cycle through display regimes. +r Update (rebuild/refresh) index. +q Quit the index/catalog window. + +------------------------------------------------------------------------------- +Open Selected Tab Page or Tab Page Window~ + +The following keys all open the currently-selected tab page or window. + +, o Open the currently-selected tab page or window. + Select the next tab page entry. + Select the previous tab page entry. + Select the next tab page window entry. + Select the previous tab page window entry. + +------------------------------------------------------------------------------- +Window Control~ + +A Zoom/unzoom window, expanding to full height (if + horizontally split) or full width (if vertically split) + + +=============================================================================== + *buffergator-options* +OPTIONS AND SETTINGS~ + +The following options can be used to customize the behavior of this plugin: + +g:buffergator_viewport_split_policy~ + Default: "L" + Determines how a new Buffergator window will be opened. Can be one of the + following values: + "L" : vertical left (full screen height) + "R" : vertical right (full screen height) + "T" : horizontal top (full screen width) + "B" : horizontal bottom (full screen width) + +g:buffergator_autodismiss_on_select~ + Default: 1 + If true, then selection an entry with will close the catalog. Otherwise, + catalog stays open. Default is 1. + +g:buffergator_autoexpand_on_split~ + Default: 1 + If true and running in GUI mode, then the application screen will be expanded + to accommodate the Buffergator window. + +g:buffergator_autoupdate~ + Default: 0 + If true, then the Buffergator window will be updated when the buffer list + changes. + +g:buffergator_split_size~ + Default: 40 + If greater than 0, this will be the width of the Buffergator window in any + vertical splitting mode, or its height in any horizontal splitting mode. + +g:buffergator_vsplit_size~ + Default: 40 + If greater than 0, this will be the width of the Buffergator window in + any vertical splitting mode. + +g:buffergator_hsplit_size~ + Default: 20 + If greater than 0, this will be the height of the Buffergator window in + any horizontal splitting mode. + +g:buffergator_sort_regime~ + Default: "bufnum" + Sets the default sort regime for buffer listing: + "bufnum" : sort by buffer number [default] + "basename": sort by buffer file basename (followed by directory) + "filepath": sort by full buffer filepath + "extension": sort by buffer filename extension (followed by full + filepath) + "mru": sort by most recently used + +g:buffergator_display_regime~ + Default: "basename" + Sets the default display regime for buffer listing: + "basename": display buffer basename first, + followed by directory [default] + "filepath": display full buffer filepath + "bufname": display buffer name + +g:buffergator_show_full_directory_path~ + Default: 1 + If true, then show the full path of each buffer. Otherwise, show the + relative path. + Only relevant when the display regime is "basename". + +g:buffergator_suppress_keymaps~ + Default: 0 + If true, then Buffergator will not automatically map "b" to + open the Buffergator catalog and "B" to close it. + +g:buffergator_mru_cycle_local_to_window~ + Default: 1 + If true, then the most recently used list will include only buffers + within the window. Otherwise, it will incude all buffers. + + vim:tw=78:ts=8:ft=help:norl: diff --git a/ftplugin/go/gocomplete.vim b/ftplugin/go/gocomplete.vim new file mode 100644 index 0000000..ffe2b48 --- /dev/null +++ b/ftplugin/go/gocomplete.vim @@ -0,0 +1 @@ +setlocal omnifunc=gocomplete#Complete diff --git a/gvimrc b/gvimrc new file mode 100644 index 0000000..822c3f8 --- /dev/null +++ b/gvimrc @@ -0,0 +1,430 @@ +"---------------------------------------------------------------- +" New Filetypes +"""""""""""""""""""""""" +au BufNewFile,BufRead *.h setf c + +"---------------------------------------------------------------- +" Common +"""""""""""""""""""""""" +set fileencodings=utf-8,gb18030 " 兼容txt +set nocompatible " 关闭 vi 兼容模式 +syntax on " 自动语法高亮 +colorscheme atom-dark-256 " 设定配色方案 +set number " 显示行号 +"set number relativenumber " 显示相对行号 +set cursorline " 突出显示当前行 +set ruler " 打开状态栏标尺 +set tabstop=4 " 设定 tab 长度为 4 +set softtabstop=4 " 使得按退格键时可以一次删掉 4 个空格 +set shiftwidth=4 " 设定 > 命令移动时的宽度为 4 +set expandtab +set nobackup " 覆盖文件时不备份 +set autochdir " 自动切换当前目录为当前文件所在的目录 +filetype plugin indent on " 开启插件 +set smartindent " 开启新行时使用智能自动缩进 +set backupcopy=yes " 设置备份时的行为为覆盖 +set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感 +set nowrapscan " 禁止在搜索到文件两端时重新搜索 +set incsearch " 输入搜索内容时就显示搜索结果 +set hlsearch " 搜索时高亮显示被找到的文本 +set noerrorbells " 关闭错误信息响铃 +set novisualbell " 关闭使用可视响铃代替呼叫 +set t_vb= " 置空错误铃声的终端代码 +"set showmatch " 插入括号时,短暂地跳转到匹配的对应括号 +"set matchtime=1 " 短暂跳转到匹配括号的时间 +set magic " 设置魔术 +set hidden " 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存 +set backspace=indent,eol,start " 不设定在插入状态无法用退格键和 Delete 键删除回车符 +set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏) +set cmdheight=1 " 设定状态栏命令行的行数为 1 +"set showtabline=2 " 显示标签栏 +"set mouse=a " 开启鼠标模式 +set guifont=YaHei\ Consolas\ Hybrid\ 12 +set guioptions-=T " 隐藏工具栏 +set guioptions-=m " 隐藏菜单栏 +set guioptions-=L " 隐藏左侧滚动条 +set guioptions-=r " 隐藏右侧滚动条 + +"---------------------------------------------------------------- +"Status Line +"""""""""""""""""""""""" +set statusline=%F " 文件的路径 +set statusline+=%= " 切换到右边 +set statusline+=%{&fileencoding} " 文件的编码 +set statusline+=\ " 分隔符 +set statusline+=%c " 当前列 +set statusline+=\, " 分隔符 +set statusline+=%l " 当前行 +set statusline+=/ " 分隔符 +set statusline+=%L " 总行数 +set statusline+=\ " 分隔符 +set statusline+=%P " 当前位置 + +"---------------------------------------------------------------- +" Vim Shotcuts +"""""""""""""""""""""""" +inoremap :NERDTreeToggle +nnoremap :NERDTreeToggle + +nnoremap :tabp +nnoremap n :tabn +nnoremap :vertical resize +2 +nnoremap :vertical resize -2 +nnoremap :resize +2 +nnoremap :resize -2 + +au Syntax python set makeprg=python3\ -u\ %\ +au Syntax go set makeprg=go\ install\ +au Syntax rust set makeprg=rustc\ %\ +au Syntax lua set makeprg=lua5.1\ %\ +au Syntax sh set makeprg=bash\ %\ +au Syntax c,python,go,rust,lua,sh nnoremap :execute "normal! ".QuickFix() + +au Syntax c,go,rust nnoremap e :cn +au Syntax c,go,rust nnoremap E :cp +au Syntax go nnoremap H :!go doc +au Syntax python nnoremap H :!pydoc3 + +"---------------------------------------------------------------- +" Fold +"""""""""""""""""""""""" +set fdm=marker +set foldmarker=<>FOLD>> +nnoremap @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo') + +"---------------------------------------------------------------- +" Complement +"""""""""""""""""""""""" +" HTML +au Syntax html,css,javascript,xml inoremap > >%lyiwh%apa>%i +au Syntax html,css,javascript,xml inoremap > >%lyiwopa>^d0k^y0j0Pk$ +au Syntax html,css,javascript,xml inoremap { :s/ *$//g:nohlsA {}O +au Syntax html,css,javascript,xml inoremap ; A; +" PHP +au Syntax php inoremap > >%lyiwh%apa>%i +au Syntax php inoremap > >%lyiwopa>^d0k^y0j0Pk$ +au Syntax php inoremap >p 2hi +au Syntax php inoremap >P ?>O +au Syntax php inoremap #I include '';hi +au Syntax php inoremap #R require '';hi +au Syntax php inoremap ; A; +" SQL +au Syntax sql,plsql inoremap #I IF THENEND IF;khhhi +au Syntax sql,plsql inoremap #C CASE WHEN THENELSEEND CASE;kkkA +au Syntax sql,plsql inoremap #L LOOPEND LOOP;O +au Syntax sql,plsql inoremap #P DBMS_OUTPUT.PUT_LINE();hi +au Syntax sql,plsql inoremap ; A; +" C +au Syntax c inoremap #< #include<>i +au Syntax c inoremap #" #include ""i +au Syntax c inoremap #M int main(int argc,char *argv[]){return 0;}kO +au Syntax c inoremap { :s/ *$//g:nohlsA{}O +au Syntax c inoremap ; A; +" GO +au Syntax go inoremap { :s/ *$//g:nohlsA {}O +au Syntax go inoremap { {}O +au Syntax go inoremap ( :s/ *$//g:nohlsA ()O +au Syntax go inoremap ; A; +" RUST +au Syntax rust inoremap { :s/ *$//g:nohlsA {}O +au Syntax rust inoremap ; A; +" SH +au Syntax sh inoremap { :s/ *$//g:nohlsA {}O +" PYTHON +au Syntax python inoremap : =PythonColon() +" LUA +au Syntax lua inoremap #fu function ()endOreturn k$F(i +au Syntax lua inoremap #if if thenendk$F i +au Syntax lua inoremap #fo for doendk$F i +au Syntax lua inoremap #wh while doendk$F i + +"---------------------------------------------------------------- +" Operators +"""""""""""""""""""""""" +" PHP +au Syntax php inoremap .= .= +au Syntax php inoremap === === +au Syntax php inoremap !== !== +au Syntax php inoremap <= <= +au Syntax php inoremap >= >= +au Syntax php inoremap != != +au Syntax php inoremap \|\| \|\| +au Syntax php inoremap == == +au Syntax php inoremap += += +au Syntax php inoremap -= -= +au Syntax php inoremap *= *= +au Syntax php inoremap /= /= +au Syntax php inoremap && && +" C +au Syntax c inoremap <= <= +au Syntax c inoremap >= >= +au Syntax c inoremap != != +au Syntax c inoremap \|\| \|\| +au Syntax c inoremap == == +au Syntax c inoremap += += +au Syntax c inoremap -= -= +au Syntax c inoremap *= *= +au Syntax c inoremap /= /= +au Syntax c inoremap &= &= +au Syntax c inoremap \|= \|= +au Syntax c inoremap ~= ~= +au Syntax c inoremap ^= ^= +au Syntax c inoremap && && +au Syntax c inoremap -> -> +au Syntax c inoremap >> >> +au Syntax c inoremap << << +" GO +au Syntax go inoremap := := +au Syntax go inoremap <= <= +au Syntax go inoremap >= >= +au Syntax go inoremap != != +au Syntax go inoremap \|\| \|\| +au Syntax go inoremap == == +au Syntax go inoremap += += +au Syntax go inoremap -= -= +au Syntax go inoremap *= *= +au Syntax go inoremap /= /= +au Syntax go inoremap &= &= +au Syntax go inoremap \|= \|= +au Syntax go inoremap ~= ~= +au Syntax go inoremap ^= ^= +au Syntax go inoremap && && +au Syntax go inoremap -> -> +au Syntax go inoremap >> >> +au Syntax go inoremap << << +" RUST +au Syntax rust inoremap <= <= +au Syntax rust inoremap >= >= +au Syntax rust inoremap != != +au Syntax rust inoremap \|\| \|\| +au Syntax rust inoremap == == +au Syntax rust inoremap += += +au Syntax rust inoremap -= -= +au Syntax rust inoremap *= *= +au Syntax rust inoremap /= /= +au Syntax rust inoremap &= &= +au Syntax rust inoremap \|= \|= +au Syntax rust inoremap ~= ~= +au Syntax rust inoremap ^= ^= +au Syntax rust inoremap && && +au Syntax rust inoremap -> -> +au Syntax rust inoremap >> >> +au Syntax rust inoremap << << +" PYTHON +au Syntax python inoremap <= <= +au Syntax python inoremap >= >= +au Syntax python inoremap != != +au Syntax python inoremap \|\| \|\| +au Syntax python inoremap == == +au Syntax python inoremap += += +au Syntax python inoremap -= -= +au Syntax python inoremap *= *= +au Syntax python inoremap /= /= +au Syntax python inoremap &= &= +au Syntax python inoremap \|= \|= +au Syntax python inoremap ~= ~= +au Syntax python inoremap ^= ^= +au Syntax python inoremap && && +" LUA +au Syntax lua inoremap <= <= +au Syntax lua inoremap >= >= +au Syntax lua inoremap != != +au Syntax lua inoremap \|\| \|\| +au Syntax lua inoremap == == +au Syntax lua inoremap += += +au Syntax lua inoremap -= -= +au Syntax lua inoremap *= *= +au Syntax lua inoremap /= /= +au Syntax lua inoremap &= &= +au Syntax lua inoremap \|= \|= +au Syntax lua inoremap ~= ~= +au Syntax lua inoremap ^= ^= +au Syntax lua inoremap && && +" SQL +au Syntax sql,plsql inoremap := := +au Syntax sql,plsql inoremap <= <= +au Syntax sql,plsql inoremap >= >= +au Syntax sql,plsql inoremap != != +au Syntax sql,plsql inoremap \|\| \|\| + +"---------------------------------------------------------------- +" Comments +"""""""""""""""""""""""" +" Html +au Syntax html nnoremap - V +au Syntax html vnoremap - :call setpos(".",[0,line("'<"),0,0])I +au Syntax html nnoremap == $?3x:nohls +" Sql +au Syntax sql,plsql nnoremap - 0 +au Syntax sql,plsql nnoremap = 0 +au Syntax sql,plsql vnoremap - I-- +au Syntax sql,plsql vnoremap = :s:--:::nohls0 +" C +au Syntax c nnoremap - 0 +au Syntax c nnoremap = 0 +au Syntax c vnoremap - I// +au Syntax c vnoremap = :s://:::nohls0 +au Syntax c nnoremap - 0 +au Syntax c nnoremap = 0 +" GO +au Syntax go nnoremap - 0 +au Syntax go nnoremap = 0 +au Syntax go vnoremap - I// +au Syntax go vnoremap = :s://:::nohls0 +" RUST +au Syntax rust nnoremap - 0 +au Syntax rust nnoremap = 0 +au Syntax rust vnoremap - I// +au Syntax rust vnoremap = :s://:::nohls0 +" LUA +au Syntax lua nnoremap - 0 +au Syntax lua nnoremap = 0 +au Syntax lua vnoremap - I-- +au Syntax lua vnoremap = :s:--:::nohls0 + +"----------------------------------------------------------------- +" Matching Pairs +""""""""""""""""""""""""" +inoremap " =QuoteDelim('"') +inoremap ' =QuoteDelim("'") +inoremap ( ()i +inoremap ) =ClosePair(')') +inoremap [ []i +inoremap ] =ClosePair(']') +inoremap { {}i +inoremap } =ClosePair('}') +au Syntax html,css,js,php,xml set mps+=<:> +au Syntax html,css,js,php,xml inoremap > =ClosePair('>') +au Syntax vim inoremap " " + +"------------------------------------------------------------------------------ +" Ctags +""""""""""""""""""""""" +" C +au syntax c nnoremap t :let $SRC=input("Enter source dir:") +au syntax c nnoremap T :!ctags -R -f /tmp/c_sys_tags -I __THROW --extra=+f --languages=c --langmap=c:+.h --c-kinds=+px --fields=+aiKSz --exclude=/usr/include/c++ --exclude=/usr/include/libio.h /usr/include +au syntax c set tags=/tmp/c_cur_tags,/tmp/c_sys_tags +au BufWrite *.c,*.h !ctags -R -f /tmp/c_cur_tags --extra=+f --languages=c --langmap=c:+.h --c-kinds=+px --fields=+aiKSz $SRC +" GO +"au syntax go nnoremap t :let $GOPATH=input("Enter GOPATH dir:") +au syntax go nnoremap t :!ctags -R -f /tmp/go_sys_tags --languages=Go /usr/lib/go/src +au syntax go set tags=/tmp/go_cur_tags,/tmp/go_sys_tags +au BufWrite *.go !ctags -R -f /tmp/go_cur_tags --languages=Go $GOPATH +" PYTHON +au syntax python nnoremap t :let $SRC=input("Enter source dir:") +au syntax python nnoremap T :!ctags -R -f /tmp/python_sys_tags --languages=Python /usr/lib/python3.7 +au syntax python set tags=/tmp/python_cur_tags,/tmp/python_sys_tags +au BufWrite *.py !ctags -R -f /tmp/python_cur_tags --languages=python $SRC + +"------------------------------------------------------------------------------ +" Cscope +"""""""""""""""""""""""" +set cst +set csto=1 +set cscopequickfix=s-,g-,c-,d-,i-,t-,e- +"au BufNewFile,BufRead *.c,*.h nnoremap #SS :cs add $SRC/cscope.out +"au BufWrite *.c,*.h !find $SRC -type f|cscope -bk -i -;mv cscope.out $SRC/cscope.out +"au BufNewFile,BufRead *.c,*.h nnoremap #CC :!echo 'Generating cs tags ...';find $SRC -type f\|cscope -bk -i -;mv cscope.out $SRC +"nnoremap s :cs find s =expand("") "查找本C符号(跳过注释) +"nnoremap g :cs find g =expand("") "查找本定义 +"nnoremap d :cs find d =expand("") "查找本函数调用的函数 +"nnoremap c :cs find c =expand("") "查找调用本函数的函数 +"nnoremap t :cs find t =expand("") "查找本字符串 +"nnoremap e :cs find e =expand("") "查找本 egrep 模式 +"nnoremap f :cs find f =expand("") "查找本文件 +"nnoremap i :cs find i =expand("") "查找包含本文件的文件 + +"------------------------------------------------------------------------------ +" NERDTree +""""""""""""""""""""""" +let NERDChristmasTree = 1 +let NERDTreeAutoCenter = 1 +let NERDTreeQuitOnOpen = 1 +let NERDTreeShowBookmarks = 1 +let NERDTreeHighlightCursorline = 1 +let NERDTreeShowFiles = 1 +let NERDTreeStatusline = 1 +"let NERDTreeShowHidden=1 +"let NERDTreeShowLineNumbers=1 +"let NERDTreeWinSize=30 +" t.......在新Tab中打开选中文件/书签,并跳到新Tab +" T.......在新Tab中打开选中文件/书签,但不跳到新Tab +" i.......split一个新窗口打开选中文件,并跳到该窗口 +" gi......split一个新窗口打开选中文件,但不跳到该窗口 +" s.......vsp一个新窗口打开选中文件,并跳到该窗口 +" gs......vsp一个新窗口打开选中文件,但不跳到该窗口 +" !.......执行当前文件 +" O.......递归打开选中结点下的所有目录 +" x.......合拢选中结点的父目录 +" X.......递归合拢选中结点下的所有目录 + +"------------------------------------------------------------------------------ +" Templates +""""""""""""""""""""""" +let g:enable_template=1 +let g:template_dir="~/.vim/templates" + +"------------------------------------------------------------------------------ +" Functions +""""""""""""""""""""""" +"function QuickFix() +" if exists('g:QuickFixState') && g:QuickFixState +" if exists('g:asyncrun_status') && 'running' == g:asyncrun_status +" return ":AsyncStop!\" +" endif +" let g:QuickFixState = 0 +" if 'c' == &filetype +" return ":cclose\:make clean\\" +" elseif 'go' == &filetype +" return ":cclose\:!go clean\\" +" else +" return ":cclose\" +" endif +" else +" let g:QuickFixState = 1 +" if 0 <= index(['c', 'python', 'go', 'rust', 'lua', 'sh'], &filetype) +" let b:argvs = input("Enter arguments:") +" if matchstr(v:version, '^8') +" return ":w!\\\:copen 15\\k:AsyncRun ".&makeprg.b:argvs."\" +" else +" return ":w!\\\:make! ".b:argvs."\\:copen 15\\k" +" endif +" else +" let g:QuickFixState = 0 +" return "\" +" endif +" endif +"endf + +"function PythonColon() +" let KeyWords = ['if', 'elif', 'else', 'for', 'while', 'class', 'def', 'with', 'try', 'except', 'finally'] +" let FirstWord = split(getline('.'))[0] +" if FirstWord == 'try' +" return "\A:\except Exception, e:\<A:\" +" endif +"endf + +"function ClosePair(char) +" if getline('.')[col('.') - 1] == a:char +" return "\" +" else +" return a:char +" endif +"endf + +"function QuoteDelim(char) +" let line = getline('.') +" let col = col('.') +" if line[col - 2] == "\\" +" return a:char +" elseif line[col - 1] == a:char +" return "\" +" else +" return a:char.a:char."\" +" endif +"endf + +"------------------------------------------------------------------------------ +"------------------------------------------------------------------------------ diff --git a/lib/nerdtree/bookmark.vim b/lib/nerdtree/bookmark.vim new file mode 100644 index 0000000..2e0aab0 --- /dev/null +++ b/lib/nerdtree/bookmark.vim @@ -0,0 +1,354 @@ +" ============================================================================ +" CLASS: Bookmark +" +" The Bookmark class serves two purposes: +" (1) It is the top-level prototype for new, concrete Bookmark objects. +" (2) It provides an interface for client code to query and manipulate the +" global list of Bookmark objects within the current Vim session. +" ============================================================================ + + +let s:Bookmark = {} +let g:NERDTreeBookmark = s:Bookmark + +" FUNCTION: Bookmark.activate(nerdtree) {{{1 +function! s:Bookmark.activate(nerdtree, ...) + call self.open(a:nerdtree, a:0 ? a:1 : {}) +endfunction + +" FUNCTION: Bookmark.AddBookmark(name, path) {{{1 +" Class method to add a new bookmark to the list, if a previous bookmark exists +" with the same name, just update the path for that bookmark +function! s:Bookmark.AddBookmark(name, path) + for i in s:Bookmark.Bookmarks() + if i.name ==# a:name + let i.path = a:path + return + endif + endfor + call add(s:Bookmark.Bookmarks(), s:Bookmark.New(a:name, a:path)) +endfunction + +" FUNCTION: Bookmark.Bookmarks() {{{1 +" Class method to get all bookmarks. Lazily initializes the bookmarks global +" variable +function! s:Bookmark.Bookmarks() + if !exists("g:NERDTreeBookmarks") + let g:NERDTreeBookmarks = [] + endif + return g:NERDTreeBookmarks +endfunction + +" FUNCTION: Bookmark.BookmarkExistsFor(name) {{{1 +" class method that returns 1 if a bookmark with the given name is found, 0 +" otherwise +function! s:Bookmark.BookmarkExistsFor(name) + try + call s:Bookmark.BookmarkFor(a:name) + return 1 + catch /^NERDTree.BookmarkNotFoundError/ + return 0 + endtry +endfunction + +" FUNCTION: Bookmark.BookmarkFor(name) {{{1 +" Class method that returns the Bookmark object having the specified name. +" Throws "NERDTree.BookmarkNotFoundError" if no Bookmark is found. +function! s:Bookmark.BookmarkFor(name) + let l:result = {} + for l:bookmark in s:Bookmark.Bookmarks() + if l:bookmark.name ==# a:name + let l:result = l:bookmark + break + endif + endfor + if empty(l:result) + throw 'NERDTree.BookmarkNotFoundError: "' . a:name . '" not found' + endif + return l:result +endfunction + +" FUNCTION: Bookmark.BookmarkNames() {{{1 +" Class method to return an array of all bookmark names +function! s:Bookmark.BookmarkNames() + let names = [] + for i in s:Bookmark.Bookmarks() + call add(names, i.name) + endfor + return names +endfunction + +" FUNCTION: Bookmark.CacheBookmarks(silent) {{{1 +" Class method to read all bookmarks from the bookmarks file initialize +" bookmark objects for each one. +" +" Args: +" silent - dont echo an error msg if invalid bookmarks are found +function! s:Bookmark.CacheBookmarks(silent) + if filereadable(g:NERDTreeBookmarksFile) + let g:NERDTreeBookmarks = [] + let g:NERDTreeInvalidBookmarks = [] + let bookmarkStrings = readfile(g:NERDTreeBookmarksFile) + let invalidBookmarksFound = 0 + for i in bookmarkStrings + + "ignore blank lines + if i != '' + + let name = substitute(i, '^\(.\{-}\) .*$', '\1', '') + let path = substitute(i, '^.\{-} \(.*\)$', '\1', '') + let path = fnamemodify(path, ':p') + + try + let bookmark = s:Bookmark.New(name, g:NERDTreePath.New(path)) + call add(g:NERDTreeBookmarks, bookmark) + catch /^NERDTree.InvalidArgumentsError/ + call add(g:NERDTreeInvalidBookmarks, i) + let invalidBookmarksFound += 1 + endtry + endif + endfor + if invalidBookmarksFound + call s:Bookmark.Write() + if !a:silent + call nerdtree#echo(invalidBookmarksFound . " invalid bookmarks were read. See :help NERDTreeInvalidBookmarks for info.") + endif + endif + endif +endfunction + +" FUNCTION: Bookmark.CompareBookmarksByName(firstBookmark, secondBookmark) {{{1 +" Class method that indicates the relative position of two bookmarks when +" placed in alphabetical order by name. Case-sensitivity is determined by an +" option. Supports the "s:Bookmark.SortBookmarksList()" method. +function! s:Bookmark.CompareBookmarksByName(firstBookmark, secondBookmark) + let l:result = 0 + if g:NERDTreeBookmarksSort == 1 + if a:firstBookmark.name ? a:secondBookmark.name + let l:result = 1 + endif + elseif g:NERDTreeBookmarksSort == 2 + if a:firstBookmark.name <# a:secondBookmark.name + let l:result = -1 + elseif a:firstBookmark.name ># a:secondBookmark.name + let l:result = 1 + endif + endif + return l:result +endfunction + +" FUNCTION: Bookmark.ClearAll() {{{1 +" Class method to delete all bookmarks. +function! s:Bookmark.ClearAll() + for i in s:Bookmark.Bookmarks() + call i.delete() + endfor + call s:Bookmark.Write() +endfunction + +" FUNCTION: Bookmark.delete() {{{1 +" Delete this bookmark. If the node for this bookmark is under the current +" root, then recache bookmarks for its Path object +function! s:Bookmark.delete() + call remove(s:Bookmark.Bookmarks(), index(s:Bookmark.Bookmarks(), self)) + call s:Bookmark.Write() +endfunction + +" FUNCTION: Bookmark.getNode(nerdtree, searchFromAbsoluteRoot) {{{1 +" Returns the tree node object associated with this Bookmark. +" Throws "NERDTree.BookmarkedNodeNotFoundError" if the node is not found. +" +" Args: +" searchFromAbsoluteRoot: boolean flag, search from the highest cached node +" if true and from the current tree root if false +function! s:Bookmark.getNode(nerdtree, searchFromAbsoluteRoot) + if a:searchFromAbsoluteRoot + let l:searchRoot = a:nerdtree.root.AbsoluteTreeRoot() + else + let l:searchRoot = a:nerdtree.root + endif + let l:targetNode = l:searchRoot.findNode(self.path) + if empty(l:targetNode) + throw 'NERDTree.BookmarkedNodeNotFoundError: node for bookmark "' . self.name . '" not found' + endif + return l:targetNode +endfunction + +" FUNCTION: Bookmark.GetNodeForName(name, searchFromAbsoluteRoot, nerdtree) {{{1 +" Class method that returns the tree node object for the Bookmark with the +" given name. Throws "NERDTree.BookmarkNotFoundError" if a Bookmark with the +" name does not exist. Throws "NERDTree.BookmarkedNodeNotFoundError" if a +" tree node for the named Bookmark could not be found. +function! s:Bookmark.GetNodeForName(name, searchFromAbsoluteRoot, nerdtree) + let l:bookmark = s:Bookmark.BookmarkFor(a:name) + return l:bookmark.getNode(a:nerdtree, a:searchFromAbsoluteRoot) +endfunction + +" FUNCTION: Bookmark.GetSelected() {{{1 +" returns the Bookmark the cursor is over, or {} +function! s:Bookmark.GetSelected() + let line = getline(".") + let name = substitute(line, '^>\(.\{-}\) .\+$', '\1', '') + if name != line + try + return s:Bookmark.BookmarkFor(name) + catch /^NERDTree.BookmarkNotFoundError/ + return {} + endtry + endif + return {} +endfunction + +" FUNCTION: Bookmark.InvalidBookmarks() {{{1 +" Class method to get all invalid bookmark strings read from the bookmarks +" file +function! s:Bookmark.InvalidBookmarks() + if !exists("g:NERDTreeInvalidBookmarks") + let g:NERDTreeInvalidBookmarks = [] + endif + return g:NERDTreeInvalidBookmarks +endfunction + +" FUNCTION: Bookmark.mustExist() {{{1 +function! s:Bookmark.mustExist() + if !self.path.exists() + call s:Bookmark.CacheBookmarks(1) + throw "NERDTree.BookmarkPointsToInvalidLocationError: the bookmark \"". + \ self.name ."\" points to a non existing location: \"". self.path.str() + endif +endfunction + +" FUNCTION: Bookmark.New(name, path) {{{1 +" Create a new bookmark object with the given name and path object +function! s:Bookmark.New(name, path) + if a:name =~# ' ' + throw "NERDTree.IllegalBookmarkNameError: illegal name:" . a:name + endif + + let newBookmark = copy(self) + let newBookmark.name = a:name + let newBookmark.path = a:path + return newBookmark +endfunction + +" FUNCTION: Bookmark.open(nerdtree, [options]) {{{1 +"Args: +" +"nerdtree: the tree to load open the bookmark in +" +"A dictionary containing the following keys (all optional): +" 'where': Specifies whether the node should be opened in new split/tab or in +" the previous window. Can be either 'v' (vertical split), 'h' +" (horizontal split), 't' (new tab) or 'p' (previous window). +" 'reuse': if a window is displaying the file then jump the cursor there +" 'keepopen': dont close the tree window +" 'stay': open the file, but keep the cursor in the tree win +" +function! s:Bookmark.open(nerdtree, ...) + let opts = a:0 ? a:1 : {} + + if self.path.isDirectory && !has_key(opts, 'where') + call self.toRoot(a:nerdtree) + else + let opener = g:NERDTreeOpener.New(self.path, opts) + call opener.open(self) + endif +endfunction + +" FUNCTION: Bookmark.openInNewTab(options) {{{1 +" Create a new bookmark object with the given name and path object +function! s:Bookmark.openInNewTab(options) + call nerdtree#deprecated('Bookmark.openInNewTab', 'is deprecated, use open() instead') + call self.open(a:options) +endfunction + +" FUNCTION: Bookmark.setPath(path) {{{1 +" makes this bookmark point to the given path +function! s:Bookmark.setPath(path) + let self.path = a:path +endfunction + +" FUNCTION: Bookmark.SortBookmarksList() {{{1 +" Class method that sorts the global list of bookmarks alphabetically by name. +" Note that case-sensitivity is determined by a user option. +function! s:Bookmark.SortBookmarksList() + call sort(s:Bookmark.Bookmarks(), s:Bookmark.CompareBookmarksByName, s:Bookmark) +endfunction + +" FUNCTION: Bookmark.str() {{{1 +" Get the string that should be rendered in the view for this bookmark +function! s:Bookmark.str() + let pathStrMaxLen = winwidth(g:NERDTree.GetWinNum()) - 4 - strdisplaywidth(self.name) + if &nu + let pathStrMaxLen = pathStrMaxLen - &numberwidth + endif + + let pathStr = self.path.str({'format': 'UI'}) + if strdisplaywidth(pathStr) > pathStrMaxLen + while strdisplaywidth(pathStr) > pathStrMaxLen && strchars(pathStr) > 0 + let pathStr = substitute(pathStr, '^.', '', '') + endwhile + let pathStr = '<' . pathStr + endif + return '>' . self.name . ' ' . pathStr +endfunction + +" FUNCTION: Bookmark.toRoot(nerdtree) {{{1 +" Set the root of the given NERDTree to the node for this Bookmark. If a node +" for this Bookmark does not exist, a new one is initialized. +function! s:Bookmark.toRoot(nerdtree) + if self.validate() + try + let l:targetNode = self.getNode(a:nerdtree, 1) + call l:targetNode.closeChildren() + catch /^NERDTree.BookmarkedNodeNotFoundError/ + let l:targetNode = g:NERDTreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path, a:nerdtree) + endtry + call a:nerdtree.changeRoot(l:targetNode) + endif +endfunction + +" FUNCTION: Bookmark.ToRoot(name, nerdtree) {{{1 +" Class method that makes the Bookmark with the given name the root of +" specified NERDTree. +function! s:Bookmark.ToRoot(name, nerdtree) + let l:bookmark = s:Bookmark.BookmarkFor(a:name) + call l:bookmark.toRoot(a:nerdtree) +endfunction + +" FUNCTION: Bookmark.validate() {{{1 +function! s:Bookmark.validate() + if self.path.exists() + return 1 + else + call s:Bookmark.CacheBookmarks(1) + call nerdtree#echo(self.name . "now points to an invalid location. See :help NERDTreeInvalidBookmarks for info.") + return 0 + endif +endfunction + +" FUNCTION: Bookmark.Write() {{{1 +" Class method to write all bookmarks to the bookmarks file +function! s:Bookmark.Write() + let bookmarkStrings = [] + for i in s:Bookmark.Bookmarks() + call add(bookmarkStrings, i.name . ' ' . fnamemodify(i.path.str(), ':~')) + endfor + + "add a blank line before the invalid ones + call add(bookmarkStrings, "") + + for j in s:Bookmark.InvalidBookmarks() + call add(bookmarkStrings, j) + endfor + + try + call writefile(bookmarkStrings, g:NERDTreeBookmarksFile) + catch + call nerdtree#echoError("Failed to write bookmarks file. Make sure g:NERDTreeBookmarksFile points to a valid location.") + endtry +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/lib/nerdtree/creator.vim b/lib/nerdtree/creator.vim new file mode 100644 index 0000000..78dfd9e --- /dev/null +++ b/lib/nerdtree/creator.vim @@ -0,0 +1,389 @@ +" ============================================================================ +" CLASS: Creator +" +" This class is responsible for creating NERDTree instances. The new NERDTree +" may be a tab tree, a window tree, or a mirrored tree. In the process of +" creating a NERDTree, it sets up all of the window and buffer options and key +" mappings etc. +" ============================================================================ + + +let s:Creator = {} +let g:NERDTreeCreator = s:Creator + +" FUNCTION: s:Creator._bindMappings() {{{1 +function! s:Creator._bindMappings() + "make do the same as the activate node mapping + nnoremap :call nerdtree#ui_glue#invokeKeyMap(g:NERDTreeMapActivateNode) + + call g:NERDTreeKeyMap.BindAll() + + command! -buffer -nargs=? Bookmark :call nerdtree#ui_glue#bookmarkNode('') + command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 RevealBookmark :call nerdtree#ui_glue#revealBookmark('') + command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 OpenBookmark call nerdtree#ui_glue#openBookmark('') + command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=* ClearBookmarks call nerdtree#ui_glue#clearBookmarks('') + command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=+ BookmarkToRoot call g:NERDTreeBookmark.ToRoot('', b:NERDTree) + command! -buffer -nargs=0 ClearAllBookmarks call g:NERDTreeBookmark.ClearAll() call b:NERDTree.render() + command! -buffer -nargs=0 ReadBookmarks call g:NERDTreeBookmark.CacheBookmarks(0) call b:NERDTree.render() + command! -buffer -nargs=0 WriteBookmarks call g:NERDTreeBookmark.Write() +endfunction + +" FUNCTION: s:Creator._broadcastInitEvent() {{{1 +function! s:Creator._broadcastInitEvent() + silent doautocmd User NERDTreeInit +endfunction + +" FUNCTION: s:Creator.BufNamePrefix() {{{2 +function! s:Creator.BufNamePrefix() + return 'NERD_tree_' +endfunction + +" FUNCTION: s:Creator.CreateTabTree(a:name) {{{1 +function! s:Creator.CreateTabTree(name) + let creator = s:Creator.New() + call creator.createTabTree(a:name) +endfunction + +" FUNCTION: s:Creator.createTabTree(a:name) {{{1 +" name: the name of a bookmark or a directory +function! s:Creator.createTabTree(name) + let l:path = self._pathForString(a:name) + + " Abort if an exception was thrown (i.e., if the bookmark or directory + " does not exist). + if empty(l:path) + return + endif + + " Obey the user's preferences for changing the working directory. + if g:NERDTreeChDirMode != 0 + call l:path.changeToDir() + endif + + if g:NERDTree.ExistsForTab() + call g:NERDTree.Close() + call self._removeTreeBufForTab() + endif + + call self._createTreeWin() + call self._createNERDTree(l:path, 'tab') + call b:NERDTree.render() + call b:NERDTree.root.putCursorHere(0, 0) + + call self._broadcastInitEvent() +endfunction + +" FUNCTION: s:Creator.CreateWindowTree(dir) {{{1 +function! s:Creator.CreateWindowTree(dir) + let creator = s:Creator.New() + call creator.createWindowTree(a:dir) +endfunction + +" FUNCTION: s:Creator.createWindowTree(dir) {{{1 +function! s:Creator.createWindowTree(dir) + try + let path = g:NERDTreePath.New(a:dir) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echo("Invalid directory name:" . a:name) + return + endtry + + "we want the directory buffer to disappear when we do the :edit below + setlocal bufhidden=wipe + + let previousBuf = expand("#") + + "we need a unique name for each window tree buffer to ensure they are + "all independent + exec g:NERDTreeCreatePrefix . " edit " . self._nextBufferName() + + call self._createNERDTree(path, "window") + let b:NERDTree._previousBuf = bufnr(previousBuf) + call self._setCommonBufOptions() + + call b:NERDTree.render() + + call self._broadcastInitEvent() +endfunction + +" FUNCTION: s:Creator._createNERDTree(path) {{{1 +function! s:Creator._createNERDTree(path, type) + let b:NERDTree = g:NERDTree.New(a:path, a:type) + + " TODO: This assignment is kept for compatibility reasons. Many other + " plugins use "b:NERDTreeRoot" instead of "b:NERDTree.root". Remove this + " assignment in the future. + let b:NERDTreeRoot = b:NERDTree.root + + call b:NERDTree.root.open() +endfunction + +" FUNCTION: s:Creator.CreateMirror() {{{1 +function! s:Creator.CreateMirror() + let creator = s:Creator.New() + call creator.createMirror() +endfunction + +" FUNCTION: s:Creator.createMirror() {{{1 +function! s:Creator.createMirror() + "get the names off all the nerd tree buffers + let treeBufNames = [] + for i in range(1, tabpagenr("$")) + let nextName = self._tabpagevar(i, 'NERDTreeBufName') + if nextName != -1 && (!exists("t:NERDTreeBufName") || nextName != t:NERDTreeBufName) + call add(treeBufNames, nextName) + endif + endfor + let treeBufNames = self._uniq(treeBufNames) + + "map the option names (that the user will be prompted with) to the nerd + "tree buffer names + let options = {} + let i = 0 + while i < len(treeBufNames) + let bufName = treeBufNames[i] + let treeRoot = getbufvar(bufName, "NERDTree").root + let options[i+1 . '. ' . treeRoot.path.str() . ' (buf name: ' . bufName . ')'] = bufName + let i = i + 1 + endwhile + + "work out which tree to mirror, if there is more than 1 then ask the user + let bufferName = '' + if len(keys(options)) > 1 + let choices = ["Choose a tree to mirror"] + let choices = extend(choices, sort(keys(options))) + let choice = inputlist(choices) + if choice < 1 || choice > len(options) || choice ==# '' + return + endif + + let bufferName = options[sort(keys(options))[choice-1]] + elseif len(keys(options)) ==# 1 + let bufferName = values(options)[0] + else + call nerdtree#echo("No trees to mirror") + return + endif + + if g:NERDTree.ExistsForTab() && g:NERDTree.IsOpen() + call g:NERDTree.Close() + endif + + let t:NERDTreeBufName = bufferName + call self._createTreeWin() + exec 'buffer ' . bufferName + if !&hidden + call b:NERDTree.render() + endif +endfunction + +" FUNCTION: s:Creator._createTreeWin() {{{1 +" Initialize the NERDTree window. Open the window, size it properly, set all +" local options, etc. +function! s:Creator._createTreeWin() + let l:splitLocation = g:NERDTreeWinPos ==# 'left' ? 'topleft ' : 'botright ' + let l:splitSize = g:NERDTreeWinSize + + if !g:NERDTree.ExistsForTab() + let t:NERDTreeBufName = self._nextBufferName() + silent! execute l:splitLocation . 'vertical ' . l:splitSize . ' new' + silent! execute 'edit ' . t:NERDTreeBufName + else + silent! execute l:splitLocation . 'vertical ' . l:splitSize . ' split' + silent! execute 'buffer ' . t:NERDTreeBufName + endif + + call self._setCommonBufOptions() + + if has('patch-7.4.1925') + clearjumps + endif + + setlocal winfixwidth +endfunction + +" FUNCTION: s:Creator._isBufHidden(nr) {{{1 +function! s:Creator._isBufHidden(nr) + redir => bufs + silent ls! + redir END + + return bufs =~ a:nr . '..h' +endfunction + +" FUNCTION: s:Creator.New() {{{1 +function! s:Creator.New() + let newCreator = copy(self) + return newCreator +endfunction + +" FUNCTION: s:Creator._nextBufferName() {{{2 +" returns the buffer name for the next nerd tree +function! s:Creator._nextBufferName() + let name = s:Creator.BufNamePrefix() . self._nextBufferNumber() + return name +endfunction + +" FUNCTION: s:Creator._nextBufferNumber() {{{2 +" the number to add to the nerd tree buffer name to make the buf name unique +function! s:Creator._nextBufferNumber() + if !exists("s:Creator._NextBufNum") + let s:Creator._NextBufNum = 1 + else + let s:Creator._NextBufNum += 1 + endif + + return s:Creator._NextBufNum +endfunction + +" FUNCTION: s:Creator._pathForString(str) {{{1 +" find a bookmark or adirectory for the given string +function! s:Creator._pathForString(str) + let path = {} + if g:NERDTreeBookmark.BookmarkExistsFor(a:str) + let path = g:NERDTreeBookmark.BookmarkFor(a:str).path + else + let dir = a:str ==# '' ? getcwd() : a:str + + "hack to get an absolute path if a relative path is given + if dir =~# '^\.' + let dir = getcwd() . g:NERDTreePath.Slash() . dir + endif + let dir = g:NERDTreePath.Resolve(dir) + + try + let path = g:NERDTreePath.New(dir) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echo("No bookmark or directory found for: " . a:str) + return {} + endtry + endif + if !path.isDirectory + let path = path.getParent() + endif + + return path +endfunction + +" Function: s:Creator._removeTreeBufForTab() {{{1 +function! s:Creator._removeTreeBufForTab() + let buf = bufnr(t:NERDTreeBufName) + + "if &hidden is not set then it will already be gone + if buf != -1 + + "nerdtree buf may be mirrored/displayed elsewhere + if self._isBufHidden(buf) + exec "bwipeout " . buf + endif + + endif + + unlet t:NERDTreeBufName +endfunction + +" FUNCTION: s:Creator._setCommonBufOptions() {{{1 +function! s:Creator._setCommonBufOptions() + + " Options for a non-file/control buffer. + setlocal bufhidden=hide + setlocal buftype=nofile + setlocal noswapfile + + " Options for controlling buffer/window appearance. + setlocal foldcolumn=0 + setlocal foldmethod=manual + setlocal nobuflisted + setlocal nofoldenable + setlocal nolist + setlocal nospell + setlocal nowrap + + if g:NERDTreeShowLineNumbers + setlocal nu + else + setlocal nonu + if v:version >= 703 + setlocal nornu + endif + endif + + iabc + + if g:NERDTreeHighlightCursorline + setlocal cursorline + endif + + call self._setupStatusline() + call self._bindMappings() + + setlocal filetype=nerdtree +endfunction + +" FUNCTION: s:Creator._setupStatusline() {{{1 +function! s:Creator._setupStatusline() + if g:NERDTreeStatusline != -1 + let &l:statusline = g:NERDTreeStatusline + endif +endfunction + +" FUNCTION: s:Creator._tabpagevar(tabnr, var) {{{1 +function! s:Creator._tabpagevar(tabnr, var) + let currentTab = tabpagenr() + let old_ei = &ei + set ei=all + + exec "tabnext " . a:tabnr + let v = -1 + if exists('t:' . a:var) + exec 'let v = t:' . a:var + endif + exec "tabnext " . currentTab + + let &ei = old_ei + + return v +endfunction + +" FUNCTION: s:Creator.ToggleTabTree(dir) {{{1 +function! s:Creator.ToggleTabTree(dir) + let creator = s:Creator.New() + call creator.toggleTabTree(a:dir) +endfunction + +" FUNCTION: s:Creator.toggleTabTree(dir) {{{1 +" Toggles the NERD tree. I.e the NERD tree is open, it is closed, if it is +" closed it is restored or initialized (if it doesnt exist) +" +" Args: +" dir: the full path for the root node (is only used if the NERD tree is being +" initialized. +function! s:Creator.toggleTabTree(dir) + if g:NERDTree.ExistsForTab() + if !g:NERDTree.IsOpen() + call self._createTreeWin() + if !&hidden + call b:NERDTree.render() + endif + call b:NERDTree.ui.restoreScreenState() + else + call g:NERDTree.Close() + endif + else + call self.createTabTree(a:dir) + endif +endfunction + +" Function: s:Creator._uniq(list) {{{1 +" returns a:list without duplicates +function! s:Creator._uniq(list) + let uniqlist = [] + for elem in a:list + if index(uniqlist, elem) ==# -1 + let uniqlist += [elem] + endif + endfor + return uniqlist +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/lib/nerdtree/event.vim b/lib/nerdtree/event.vim new file mode 100644 index 0000000..964e8ff --- /dev/null +++ b/lib/nerdtree/event.vim @@ -0,0 +1,13 @@ +"CLASS: Event +"============================================================ +let s:Event = {} +let g:NERDTreeEvent = s:Event + +function! s:Event.New(nerdtree, subject, action, params) abort + let newObj = copy(self) + let newObj.nerdtree = a:nerdtree + let newObj.subject = a:subject + let newObj.action = a:action + let newObj.params = a:params + return newObj +endfunction diff --git a/lib/nerdtree/flag_set.vim b/lib/nerdtree/flag_set.vim new file mode 100644 index 0000000..bc6e887 --- /dev/null +++ b/lib/nerdtree/flag_set.vim @@ -0,0 +1,58 @@ +"CLASS: FlagSet +"============================================================ +let s:FlagSet = {} +let g:NERDTreeFlagSet = s:FlagSet + +"FUNCTION: FlagSet.addFlag(scope, flag) {{{1 +function! s:FlagSet.addFlag(scope, flag) + let flags = self._flagsForScope(a:scope) + if index(flags, a:flag) == -1 + call add(flags, a:flag) + end +endfunction + +"FUNCTION: FlagSet.clearFlags(scope) {{{1 +function! s:FlagSet.clearFlags(scope) + let self._flags[a:scope] = [] +endfunction + +"FUNCTION: FlagSet._flagsForScope(scope) {{{1 +function! s:FlagSet._flagsForScope(scope) + if !has_key(self._flags, a:scope) + let self._flags[a:scope] = [] + endif + return self._flags[a:scope] +endfunction + +"FUNCTION: FlagSet.New() {{{1 +function! s:FlagSet.New() + let newObj = copy(self) + let newObj._flags = {} + return newObj +endfunction + +"FUNCTION: FlagSet.removeFlag(scope, flag) {{{1 +function! s:FlagSet.removeFlag(scope, flag) + let flags = self._flagsForScope(a:scope) + + let i = index(flags, a:flag) + if i >= 0 + call remove(flags, i) + endif +endfunction + +"FUNCTION: FlagSet.renderToString() {{{1 +function! s:FlagSet.renderToString() + let flagstring = "" + for i in values(self._flags) + let flagstring .= join(i) + endfor + + if len(flagstring) == 0 + return "" + endif + + return '[' . flagstring . ']' +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/lib/nerdtree/key_map.vim b/lib/nerdtree/key_map.vim new file mode 100644 index 0000000..1ca478d --- /dev/null +++ b/lib/nerdtree/key_map.vim @@ -0,0 +1,163 @@ +"CLASS: KeyMap +"============================================================ +let s:KeyMap = {} +let g:NERDTreeKeyMap = s:KeyMap +let s:keyMaps = {} + +"FUNCTION: KeyMap.All() {{{1 +function! s:KeyMap.All() + let sortedKeyMaps = values(s:keyMaps) + call sort(sortedKeyMaps, s:KeyMap.Compare, s:KeyMap) + + return sortedKeyMaps +endfunction + +"FUNCTION: KeyMap.Compare(keyMap1, keyMap2) {{{1 +function! s:KeyMap.Compare(keyMap1, keyMap2) + + if a:keyMap1.key >? a:keyMap2.key + return 1 + endif + + if a:keyMap1.key ' notation, we + " must replace each of the '<' characters with '' to ensure the string + " is not translated into its corresponding keycode during the later part + " of the map command below + " :he <> + let specialNotationRegex = '\m<\([[:alnum:]_-]\+>\)' + if self.key =~# specialNotationRegex + let keymapInvokeString = substitute(self.key, specialNotationRegex, '\1', 'g') + else + let keymapInvokeString = self.key + endif + + let premap = self.key == "" ? " " : " " + + exec 'nnoremap '. self.key . premap . ':call nerdtree#ui_glue#invokeKeyMap("'. keymapInvokeString .'")' +endfunction + +"FUNCTION: KeyMap.Remove(key, scope) {{{1 +function! s:KeyMap.Remove(key, scope) + return remove(s:keyMaps, a:key . a:scope) +endfunction + +"FUNCTION: KeyMap.invoke() {{{1 +"Call the KeyMaps callback function +function! s:KeyMap.invoke(...) + let Callback = function(self.callback) + if a:0 + call Callback(a:1) + else + call Callback() + endif +endfunction + +"FUNCTION: KeyMap.Invoke() {{{1 +"Find a keymapping for a:key and the current scope invoke it. +" +"Scope is determined as follows: +" * if the cursor is on a dir node then "DirNode" +" * if the cursor is on a file node then "FileNode" +" * if the cursor is on a bookmark then "Bookmark" +" +"If a keymap has the scope of "all" then it will be called if no other keymap +"is found for a:key and the scope. +function! s:KeyMap.Invoke(key) + + "required because clicking the command window below another window still + "invokes the mapping - but changes the window cursor + "is in first + " + "TODO: remove this check when the vim bug is fixed + if !g:NERDTree.ExistsForBuf() + return {} + endif + + let node = g:NERDTreeFileNode.GetSelected() + if !empty(node) + + "try file node + if !node.path.isDirectory + let km = s:KeyMap.FindFor(a:key, "FileNode") + if !empty(km) + return km.invoke(node) + endif + endif + + "try dir node + if node.path.isDirectory + let km = s:KeyMap.FindFor(a:key, "DirNode") + if !empty(km) + return km.invoke(node) + endif + endif + + "try generic node + let km = s:KeyMap.FindFor(a:key, "Node") + if !empty(km) + return km.invoke(node) + endif + + endif + + "try bookmark + let bm = g:NERDTreeBookmark.GetSelected() + if !empty(bm) + let km = s:KeyMap.FindFor(a:key, "Bookmark") + if !empty(km) + return km.invoke(bm) + endif + endif + + "try all + let km = s:KeyMap.FindFor(a:key, "all") + if !empty(km) + return km.invoke() + endif +endfunction + +"FUNCTION: KeyMap.Create(options) {{{1 +function! s:KeyMap.Create(options) + let opts = extend({'scope': 'all', 'quickhelpText': ''}, copy(a:options)) + + "dont override other mappings unless the 'override' option is given + if get(opts, 'override', 0) == 0 && !empty(s:KeyMap.FindFor(opts['key'], opts['scope'])) + return + end + + let newKeyMap = copy(self) + let newKeyMap.key = opts['key'] + let newKeyMap.quickhelpText = opts['quickhelpText'] + let newKeyMap.callback = opts['callback'] + let newKeyMap.scope = opts['scope'] + + call s:KeyMap.Add(newKeyMap) +endfunction + +"FUNCTION: KeyMap.Add(keymap) {{{1 +function! s:KeyMap.Add(keymap) + let s:keyMaps[a:keymap.key . a:keymap.scope] = a:keymap +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/lib/nerdtree/menu_controller.vim b/lib/nerdtree/menu_controller.vim new file mode 100644 index 0000000..68e4d30 --- /dev/null +++ b/lib/nerdtree/menu_controller.vim @@ -0,0 +1,186 @@ +"CLASS: MenuController +"============================================================ +let s:MenuController = {} +let g:NERDTreeMenuController = s:MenuController + +"FUNCTION: MenuController.New(menuItems) {{{1 +"create a new menu controller that operates on the given menu items +function! s:MenuController.New(menuItems) + let newMenuController = copy(self) + if a:menuItems[0].isSeparator() + let newMenuController.menuItems = a:menuItems[1:-1] + else + let newMenuController.menuItems = a:menuItems + endif + return newMenuController +endfunction + +" FUNCTION: MenuController.showMenu() {{{1 +" Enter the main loop of the NERDTree menu, prompting the user to select +" a menu item. +function! s:MenuController.showMenu() + call self._saveOptions() + + try + let self.selection = 0 + let l:done = 0 + + while !l:done + redraw! + call self._echoPrompt() + + let l:key = nr2char(getchar()) + let l:done = self._handleKeypress(l:key) + endwhile + finally + call self._restoreOptions() + + " Redraw when "Ctrl-C" or "Esc" is received. + if !l:done || self.selection == -1 + redraw! + endif + endtry + + if self.selection != -1 + let l:m = self._current() + call l:m.execute() + endif +endfunction + +"FUNCTION: MenuController._echoPrompt() {{{1 +function! s:MenuController._echoPrompt() + echo "NERDTree Menu. Use j/k/enter and the shortcuts indicated" + echo "==========================================================" + + for i in range(0, len(self.menuItems)-1) + if self.selection == i + echo "> " . self.menuItems[i].text + else + echo " " . self.menuItems[i].text + endif + endfor +endfunction + +"FUNCTION: MenuController._current(key) {{{1 +"get the MenuItem that is currently selected +function! s:MenuController._current() + return self.menuItems[self.selection] +endfunction + +"FUNCTION: MenuController._handleKeypress(key) {{{1 +"change the selection (if appropriate) and return 1 if the user has made +"their choice, 0 otherwise +function! s:MenuController._handleKeypress(key) + if a:key == 'j' + call self._cursorDown() + elseif a:key == 'k' + call self._cursorUp() + elseif a:key == nr2char(27) "escape + let self.selection = -1 + return 1 + elseif a:key == "\r" || a:key == "\n" "enter and ctrl-j + return 1 + else + let index = self._nextIndexFor(a:key) + if index != -1 + let self.selection = index + if len(self._allIndexesFor(a:key)) == 1 + return 1 + endif + endif + endif + + return 0 +endfunction + +"FUNCTION: MenuController._allIndexesFor(shortcut) {{{1 +"get indexes to all menu items with the given shortcut +function! s:MenuController._allIndexesFor(shortcut) + let toReturn = [] + + for i in range(0, len(self.menuItems)-1) + if self.menuItems[i].shortcut == a:shortcut + call add(toReturn, i) + endif + endfor + + return toReturn +endfunction + +"FUNCTION: MenuController._nextIndexFor(shortcut) {{{1 +"get the index to the next menu item with the given shortcut, starts from the +"current cursor location and wraps around to the top again if need be +function! s:MenuController._nextIndexFor(shortcut) + for i in range(self.selection+1, len(self.menuItems)-1) + if self.menuItems[i].shortcut == a:shortcut + return i + endif + endfor + + for i in range(0, self.selection) + if self.menuItems[i].shortcut == a:shortcut + return i + endif + endfor + + return -1 +endfunction + +"FUNCTION: MenuController._setCmdheight() {{{1 +"sets &cmdheight to whatever is needed to display the menu +function! s:MenuController._setCmdheight() + let &cmdheight = len(self.menuItems) + 3 +endfunction + +"FUNCTION: MenuController._saveOptions() {{{1 +"set any vim options that are required to make the menu work (saving their old +"values) +function! s:MenuController._saveOptions() + let self._oldLazyredraw = &lazyredraw + let self._oldCmdheight = &cmdheight + set nolazyredraw + call self._setCmdheight() +endfunction + +"FUNCTION: MenuController._restoreOptions() {{{1 +"restore the options we saved in _saveOptions() +function! s:MenuController._restoreOptions() + let &cmdheight = self._oldCmdheight + let &lazyredraw = self._oldLazyredraw +endfunction + +"FUNCTION: MenuController._cursorDown() {{{1 +"move the cursor to the next menu item, skipping separators +function! s:MenuController._cursorDown() + let done = 0 + while !done + if self.selection < len(self.menuItems)-1 + let self.selection += 1 + else + let self.selection = 0 + endif + + if !self._current().isSeparator() + let done = 1 + endif + endwhile +endfunction + +"FUNCTION: MenuController._cursorUp() {{{1 +"move the cursor to the previous menu item, skipping separators +function! s:MenuController._cursorUp() + let done = 0 + while !done + if self.selection > 0 + let self.selection -= 1 + else + let self.selection = len(self.menuItems)-1 + endif + + if !self._current().isSeparator() + let done = 1 + endif + endwhile +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/lib/nerdtree/menu_item.vim b/lib/nerdtree/menu_item.vim new file mode 100644 index 0000000..92c1bbb --- /dev/null +++ b/lib/nerdtree/menu_item.vim @@ -0,0 +1,114 @@ +"CLASS: MenuItem +"============================================================ +let s:MenuItem = {} +let g:NERDTreeMenuItem = s:MenuItem + +"FUNCTION: MenuItem.All() {{{1 +"get all top level menu items +function! s:MenuItem.All() + if !exists("s:menuItems") + let s:menuItems = [] + endif + return s:menuItems +endfunction + +"FUNCTION: MenuItem.AllEnabled() {{{1 +"get all top level menu items that are currently enabled +function! s:MenuItem.AllEnabled() + let toReturn = [] + for i in s:MenuItem.All() + if i.enabled() + call add(toReturn, i) + endif + endfor + return toReturn +endfunction + +"FUNCTION: MenuItem.Create(options) {{{1 +"make a new menu item and add it to the global list +function! s:MenuItem.Create(options) + let newMenuItem = copy(self) + + let newMenuItem.text = a:options['text'] + let newMenuItem.shortcut = a:options['shortcut'] + let newMenuItem.children = [] + + let newMenuItem.isActiveCallback = -1 + if has_key(a:options, 'isActiveCallback') + let newMenuItem.isActiveCallback = a:options['isActiveCallback'] + endif + + let newMenuItem.callback = -1 + if has_key(a:options, 'callback') + let newMenuItem.callback = a:options['callback'] + endif + + if has_key(a:options, 'parent') + call add(a:options['parent'].children, newMenuItem) + else + call add(s:MenuItem.All(), newMenuItem) + endif + + return newMenuItem +endfunction + +"FUNCTION: MenuItem.CreateSeparator(options) {{{1 +"make a new separator menu item and add it to the global list +function! s:MenuItem.CreateSeparator(options) + let standard_options = { 'text': '--------------------', + \ 'shortcut': -1, + \ 'callback': -1 } + let options = extend(a:options, standard_options, "force") + + return s:MenuItem.Create(options) +endfunction + +"FUNCTION: MenuItem.CreateSubmenu(options) {{{1 +"make a new submenu and add it to global list +function! s:MenuItem.CreateSubmenu(options) + let standard_options = { 'callback': -1 } + let options = extend(a:options, standard_options, "force") + + return s:MenuItem.Create(options) +endfunction + +"FUNCTION: MenuItem.enabled() {{{1 +"return 1 if this menu item should be displayed +" +"delegates off to the isActiveCallback, and defaults to 1 if no callback was +"specified +function! s:MenuItem.enabled() + if self.isActiveCallback != -1 + return {self.isActiveCallback}() + endif + return 1 +endfunction + +"FUNCTION: MenuItem.execute() {{{1 +"perform the action behind this menu item, if this menuitem has children then +"display a new menu for them, otherwise deletegate off to the menuitem's +"callback +function! s:MenuItem.execute() + if len(self.children) + let mc = g:NERDTreeMenuController.New(self.children) + call mc.showMenu() + else + if self.callback != -1 + call {self.callback}() + endif + endif +endfunction + +"FUNCTION: MenuItem.isSeparator() {{{1 +"return 1 if this menuitem is a separator +function! s:MenuItem.isSeparator() + return self.callback == -1 && self.children == [] +endfunction + +"FUNCTION: MenuItem.isSubmenu() {{{1 +"return 1 if this menuitem is a submenu +function! s:MenuItem.isSubmenu() + return self.callback == -1 && !empty(self.children) +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/lib/nerdtree/nerdtree.vim b/lib/nerdtree/nerdtree.vim new file mode 100644 index 0000000..fcabcb9 --- /dev/null +++ b/lib/nerdtree/nerdtree.vim @@ -0,0 +1,208 @@ +"CLASS: NERDTree +"============================================================ +let s:NERDTree = {} +let g:NERDTree = s:NERDTree + +"FUNCTION: s:NERDTree.AddPathFilter() {{{1 +function! s:NERDTree.AddPathFilter(callback) + call add(s:NERDTree.PathFilters(), a:callback) +endfunction + +"FUNCTION: s:NERDTree.changeRoot(node) {{{1 +function! s:NERDTree.changeRoot(node) + if a:node.path.isDirectory + let self.root = a:node + else + call a:node.cacheParent() + let self.root = a:node.parent + endif + + call self.root.open() + + "change dir to the dir of the new root if instructed to + if g:NERDTreeChDirMode ==# 2 + call self.root.path.changeToDir() + endif + + call self.render() + call self.root.putCursorHere(0, 0) + + silent doautocmd User NERDTreeNewRoot +endfunction + +"FUNCTION: s:NERDTree.Close() {{{1 +"Closes the tab tree window for this tab +function! s:NERDTree.Close() + if !s:NERDTree.IsOpen() + return + endif + + if winnr("$") != 1 + " Use the window ID to identify the currently active window or fall + " back on the buffer ID if win_getid/win_gotoid are not available, in + " which case we'll focus an arbitrary window showing the buffer. + let l:useWinId = exists('*win_getid') && exists('*win_gotoid') + + if winnr() == s:NERDTree.GetWinNum() + call nerdtree#exec("wincmd p") + let l:activeBufOrWin = l:useWinId ? win_getid() : bufnr("") + call nerdtree#exec("wincmd p") + else + let l:activeBufOrWin = l:useWinId ? win_getid() : bufnr("") + endif + + call nerdtree#exec(s:NERDTree.GetWinNum() . " wincmd w") + close + if l:useWinId + call nerdtree#exec("call win_gotoid(" . l:activeBufOrWin . ")") + else + call nerdtree#exec(bufwinnr(l:activeBufOrWin) . " wincmd w") + endif + else + close + endif +endfunction + +"FUNCTION: s:NERDTree.CloseIfQuitOnOpen() {{{1 +"Closes the NERD tree window if the close on open option is set +function! s:NERDTree.CloseIfQuitOnOpen() + if g:NERDTreeQuitOnOpen && s:NERDTree.IsOpen() + call s:NERDTree.Close() + endif +endfunction + +"FUNCTION: s:NERDTree.CursorToBookmarkTable(){{{1 +"Places the cursor at the top of the bookmarks table +function! s:NERDTree.CursorToBookmarkTable() + if !b:NERDTree.ui.getShowBookmarks() + throw "NERDTree.IllegalOperationError: cant find bookmark table, bookmarks arent active" + endif + + if g:NERDTreeMinimalUI + return cursor(1, 2) + endif + + let rootNodeLine = b:NERDTree.ui.getRootLineNum() + + let line = 1 + while getline(line) !~# '^>-\+Bookmarks-\+$' + let line = line + 1 + if line >= rootNodeLine + throw "NERDTree.BookmarkTableNotFoundError: didnt find the bookmarks table" + endif + endwhile + call cursor(line, 2) +endfunction + +"FUNCTION: s:NERDTree.CursorToTreeWin(){{{1 +"Places the cursor in the nerd tree window +function! s:NERDTree.CursorToTreeWin() + call g:NERDTree.MustBeOpen() + call nerdtree#exec(g:NERDTree.GetWinNum() . "wincmd w") +endfunction + +" Function: s:NERDTree.ExistsForBuffer() {{{1 +" Returns 1 if a nerd tree root exists in the current buffer +function! s:NERDTree.ExistsForBuf() + return exists("b:NERDTree") +endfunction + +" Function: s:NERDTree.ExistsForTab() {{{1 +" Returns 1 if a nerd tree root exists in the current tab +function! s:NERDTree.ExistsForTab() + if !exists("t:NERDTreeBufName") + return + end + + "check b:NERDTree is still there and hasn't been e.g. :bdeleted + return !empty(getbufvar(bufnr(t:NERDTreeBufName), 'NERDTree')) +endfunction + +function! s:NERDTree.ForCurrentBuf() + if s:NERDTree.ExistsForBuf() + return b:NERDTree + else + return {} + endif +endfunction + +"FUNCTION: s:NERDTree.ForCurrentTab() {{{1 +function! s:NERDTree.ForCurrentTab() + if !s:NERDTree.ExistsForTab() + return + endif + + let bufnr = bufnr(t:NERDTreeBufName) + return getbufvar(bufnr, "NERDTree") +endfunction + +"FUNCTION: s:NERDTree.getRoot() {{{1 +function! s:NERDTree.getRoot() + return self.root +endfunction + +"FUNCTION: s:NERDTree.GetWinNum() {{{1 +"gets the nerd tree window number for this tab +function! s:NERDTree.GetWinNum() + if exists("t:NERDTreeBufName") + return bufwinnr(t:NERDTreeBufName) + endif + + return -1 +endfunction + +"FUNCTION: s:NERDTree.IsOpen() {{{1 +function! s:NERDTree.IsOpen() + return s:NERDTree.GetWinNum() != -1 +endfunction + +"FUNCTION: s:NERDTree.isTabTree() {{{1 +function! s:NERDTree.isTabTree() + return self._type == "tab" +endfunction + +"FUNCTION: s:NERDTree.isWinTree() {{{1 +function! s:NERDTree.isWinTree() + return self._type == "window" +endfunction + +"FUNCTION: s:NERDTree.MustBeOpen() {{{1 +function! s:NERDTree.MustBeOpen() + if !s:NERDTree.IsOpen() + throw "NERDTree.TreeNotOpen" + endif +endfunction + +"FUNCTION: s:NERDTree.New() {{{1 +function! s:NERDTree.New(path, type) + let newObj = copy(self) + let newObj.ui = g:NERDTreeUI.New(newObj) + let newObj.root = g:NERDTreeDirNode.New(a:path, newObj) + let newObj._type = a:type + return newObj +endfunction + +"FUNCTION: s:NERDTree.PathFilters() {{{1 +function! s:NERDTree.PathFilters() + if !exists('s:NERDTree._PathFilters') + let s:NERDTree._PathFilters = [] + endif + return s:NERDTree._PathFilters +endfunction + +"FUNCTION: s:NERDTree.previousBuf() {{{1 +function! s:NERDTree.previousBuf() + return self._previousBuf +endfunction + +function! s:NERDTree.setPreviousBuf(bnum) + let self._previousBuf = a:bnum +endfunction + +"FUNCTION: s:NERDTree.render() {{{1 +"A convenience function - since this is called often +function! s:NERDTree.render() + call self.ui.render() +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/lib/nerdtree/notifier.vim b/lib/nerdtree/notifier.vim new file mode 100644 index 0000000..d24fc8f --- /dev/null +++ b/lib/nerdtree/notifier.vim @@ -0,0 +1,34 @@ +"CLASS: Notifier +"============================================================ +let s:Notifier = {} + +function! s:Notifier.AddListener(event, funcname) + let listeners = s:Notifier.GetListenersForEvent(a:event) + if listeners == [] + let listenersMap = s:Notifier.GetListenersMap() + let listenersMap[a:event] = listeners + endif + call add(listeners, a:funcname) +endfunction + +function! s:Notifier.NotifyListeners(event, path, nerdtree, params) + let event = g:NERDTreeEvent.New(a:nerdtree, a:path, a:event, a:params) + + for listener in s:Notifier.GetListenersForEvent(a:event) + call {listener}(event) + endfor +endfunction + +function! s:Notifier.GetListenersMap() + if !exists("s:refreshListenersMap") + let s:refreshListenersMap = {} + endif + return s:refreshListenersMap +endfunction + +function! s:Notifier.GetListenersForEvent(name) + let listenersMap = s:Notifier.GetListenersMap() + return get(listenersMap, a:name, []) +endfunction + +let g:NERDTreePathNotifier = deepcopy(s:Notifier) diff --git a/lib/nerdtree/opener.vim b/lib/nerdtree/opener.vim new file mode 100644 index 0000000..ef357ef --- /dev/null +++ b/lib/nerdtree/opener.vim @@ -0,0 +1,352 @@ +" ============================================================================ +" CLASS: Opener +" +" The Opener class defines an API for "opening" operations. +" ============================================================================ + + +let s:Opener = {} +let g:NERDTreeOpener = s:Opener + +" FUNCTION: s:Opener._bufInWindows(bnum) {{{1 +" [[STOLEN FROM VTREEEXPLORER.VIM]] +" Determine the number of windows open to this buffer number. +" Care of Yegappan Lakshman. Thanks! +" +" Args: +" bnum: the subject buffers buffer number +function! s:Opener._bufInWindows(bnum) + let cnt = 0 + let winnum = 1 + while 1 + let bufnum = winbufnr(winnum) + if bufnum < 0 + break + endif + if bufnum ==# a:bnum + let cnt = cnt + 1 + endif + let winnum = winnum + 1 + endwhile + + return cnt +endfunction + +" FUNCTION: Opener._checkToCloseTree(newtab) {{{1 +" Check the class options and global options (i.e. NERDTreeQuitOnOpen) to see +" if the tree should be closed now. +" +" Args: +" a:newtab - boolean. If set, only close the tree now if we are opening the +" target in a new tab. This is needed because we have to close tree before we +" leave the tab +function! s:Opener._checkToCloseTree(newtab) + if self._keepopen + return + endif + + if (a:newtab && self._where == 't') || !a:newtab + call g:NERDTree.CloseIfQuitOnOpen() + endif +endfunction + +" FUNCTION: s:Opener._firstUsableWindow() {{{1 +" find the window number of the first normal window +function! s:Opener._firstUsableWindow() + let i = 1 + while i <= winnr("$") + let bnum = winbufnr(i) + if bnum != -1 && getbufvar(bnum, '&buftype') ==# '' + \ && !getwinvar(i, '&previewwindow') + \ && (!getbufvar(bnum, '&modified') || &hidden) + return i + endif + + let i += 1 + endwhile + return -1 +endfunction + +" FUNCTION: Opener._gotoTargetWin() {{{1 +function! s:Opener._gotoTargetWin() + if b:NERDTree.isWinTree() + if self._where == 'v' + vsplit + elseif self._where == 'h' + split + elseif self._where == 't' + tabnew + endif + else + call self._checkToCloseTree(1) + + if self._where == 'v' + call self._newVSplit() + elseif self._where == 'h' + call self._newSplit() + elseif self._where == 't' + tabnew + elseif self._where == 'p' + call self._previousWindow() + endif + + call self._checkToCloseTree(0) + endif +endfunction + +" FUNCTION: s:Opener._isWindowUsable(winnumber) {{{1 +" Returns 0 if opening a file from the tree in the given window requires it to +" be split, 1 otherwise +" +" Args: +" winnumber: the number of the window in question +function! s:Opener._isWindowUsable(winnumber) + "gotta split if theres only one window (i.e. the NERD tree) + if winnr("$") ==# 1 + return 0 + endif + + let oldwinnr = winnr() + call nerdtree#exec(a:winnumber . "wincmd p") + let specialWindow = getbufvar("%", '&buftype') != '' || getwinvar('%', '&previewwindow') + let modified = &modified + call nerdtree#exec(oldwinnr . "wincmd p") + + "if its a special window e.g. quickfix or another explorer plugin then we + "have to split + if specialWindow + return 0 + endif + + if &hidden + return 1 + endif + + return !modified || self._bufInWindows(winbufnr(a:winnumber)) >= 2 +endfunction + +" FUNCTION: Opener.New(path, opts) {{{1 +" Instantiate a new NERDTreeOpener object. +" Args: +" a:path: the path object that is to be opened +" a:opts: a dictionary containing the following optional keys... +" 'where': specifies whether the node should be opened in new split, in +" a new tab or, in the last window; takes values "v", "h", or "t" +" 'reuse': if file is already shown in a window, jump there; takes values +" "all", "currenttab", or empty +" 'keepopen': boolean (0 or 1); if true, the tree window will not be closed +" 'stay': boolean (0 or 1); if true, remain in tree window after opening +function! s:Opener.New(path, opts) + let l:newOpener = copy(self) + + let l:newOpener._keepopen = nerdtree#has_opt(a:opts, 'keepopen') + let l:newOpener._nerdtree = b:NERDTree + let l:newOpener._path = a:path + let l:newOpener._reuse = has_key(a:opts, 'reuse') ? a:opts['reuse'] : '' + let l:newOpener._stay = nerdtree#has_opt(a:opts, 'stay') + let l:newOpener._where = has_key(a:opts, 'where') ? a:opts['where'] : '' + + call l:newOpener._saveCursorPos() + + return l:newOpener +endfunction + +" FUNCTION: Opener._newSplit() {{{1 +function! s:Opener._newSplit() + " Save the user's settings for splitbelow and splitright + let savesplitbelow=&splitbelow + let savesplitright=&splitright + + " 'there' will be set to a command to move from the split window + " back to the explorer window + " + " 'back' will be set to a command to move from the explorer window + " back to the newly split window + " + " 'right' and 'below' will be set to the settings needed for + " splitbelow and splitright IF the explorer is the only window. + " + let there= g:NERDTreeWinPos ==# "left" ? "wincmd h" : "wincmd l" + let back = g:NERDTreeWinPos ==# "left" ? "wincmd l" : "wincmd h" + let right= g:NERDTreeWinPos ==# "left" + let below=0 + + " Attempt to go to adjacent window + call nerdtree#exec(back) + + let onlyOneWin = (winnr("$") ==# 1) + + " If no adjacent window, set splitright and splitbelow appropriately + if onlyOneWin + let &splitright=right + let &splitbelow=below + else + " found adjacent window - invert split direction + let &splitright=!right + let &splitbelow=!below + endif + + let splitMode = onlyOneWin ? "vertical" : "" + + " Open the new window + try + exec(splitMode." sp ") + catch /^Vim\%((\a\+)\)\=:E37/ + call g:NERDTree.CursorToTreeWin() + throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self._path.str() ." is already open and modified." + catch /^Vim\%((\a\+)\)\=:/ + "do nothing + endtry + + "resize the tree window if no other window was open before + if onlyOneWin + let size = exists("b:NERDTreeOldWindowSize") ? b:NERDTreeOldWindowSize : g:NERDTreeWinSize + call nerdtree#exec(there) + exec("silent ". splitMode ." resize ". size) + call nerdtree#exec('wincmd p') + endif + + " Restore splitmode settings + let &splitbelow=savesplitbelow + let &splitright=savesplitright +endfunction + +" FUNCTION: Opener._newVSplit() {{{1 +function! s:Opener._newVSplit() + let l:winwidth = winwidth('.') + + if winnr('$') == 1 + let l:winwidth = g:NERDTreeWinSize + endif + + call nerdtree#exec('wincmd p') + vnew + + let l:currentWindowNumber = winnr() + + " Restore the NERDTree to its original width. + call g:NERDTree.CursorToTreeWin() + execute 'silent vertical resize ' . l:winwidth + + call nerdtree#exec(l:currentWindowNumber . 'wincmd w') +endfunction + +" FUNCTION: Opener.open(target) {{{1 +function! s:Opener.open(target) + if self._path.isDirectory + call self._openDirectory(a:target) + return + endif + + call self._openFile() +endfunction + +" FUNCTION: Opener._openFile() {{{1 +function! s:Opener._openFile() + if !self._stay && !g:NERDTreeQuitOnOpen && exists("b:NERDTreeZoomed") && b:NERDTreeZoomed + call b:NERDTree.ui.toggleZoom() + endif + + if self._reuseWindow() + return + endif + + call self._gotoTargetWin() + + if self._stay + silent call self._path.edit() + call self._restoreCursorPos() + return + endif + + call self._path.edit() +endfunction + +" FUNCTION: Opener._openDirectory(node) {{{1 +function! s:Opener._openDirectory(node) + call self._gotoTargetWin() + + if self._nerdtree.isWinTree() + call g:NERDTreeCreator.CreateWindowTree(a:node.path.str()) + else + if empty(self._where) + call b:NERDTree.changeRoot(a:node) + elseif self._where == 't' + call g:NERDTreeCreator.CreateTabTree(a:node.path.str()) + else + call g:NERDTreeCreator.CreateWindowTree(a:node.path.str()) + endif + endif + + if self._stay + call self._restoreCursorPos() + endif +endfunction + +" FUNCTION: Opener._previousWindow() {{{1 +function! s:Opener._previousWindow() + if !self._isWindowUsable(winnr("#")) && self._firstUsableWindow() ==# -1 + call self._newSplit() + else + try + if !self._isWindowUsable(winnr("#")) + call nerdtree#exec(self._firstUsableWindow() . "wincmd w") + else + call nerdtree#exec('wincmd p') + endif + catch /^Vim\%((\a\+)\)\=:E37/ + call g:NERDTree.CursorToTreeWin() + throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self._path.str() ." is already open and modified." + catch /^Vim\%((\a\+)\)\=:/ + echo v:exception + endtry + endif +endfunction + +" FUNCTION: Opener._restoreCursorPos() {{{1 +function! s:Opener._restoreCursorPos() + call nerdtree#exec(self._tabnr . 'tabnext') + call nerdtree#exec(bufwinnr(self._bufnr) . 'wincmd w') +endfunction + +" FUNCTION: Opener._reuseWindow() {{{1 +" put the cursor in the first window we find for this file +" +" return 1 if we were successful +function! s:Opener._reuseWindow() + if empty(self._reuse) + return 0 + endif + + "check the current tab for the window + let winnr = bufwinnr('^' . self._path.str() . '$') + if winnr != -1 + call nerdtree#exec(winnr . "wincmd w") + call self._checkToCloseTree(0) + return 1 + endif + + if self._reuse == 'currenttab' + return 0 + endif + + "check other tabs + let tabnr = self._path.tabnr() + if tabnr + call self._checkToCloseTree(1) + call nerdtree#exec(tabnr . 'tabnext') + let winnr = bufwinnr('^' . self._path.str() . '$') + call nerdtree#exec(winnr . "wincmd w") + return 1 + endif + + return 0 +endfunction + +" FUNCTION: Opener._saveCursorPos() {{{1 +function! s:Opener._saveCursorPos() + let self._bufnr = bufnr("") + let self._tabnr = tabpagenr() +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim new file mode 100644 index 0000000..d997c31 --- /dev/null +++ b/lib/nerdtree/path.vim @@ -0,0 +1,869 @@ +" ============================================================================ +" CLASS: Path +" +" The Path class provides an abstracted representation of a file system +" pathname. Various operations on pathnames are provided and a number of +" representations of a given path name can be accessed here. +" ============================================================================ + + +let s:Path = {} +let g:NERDTreePath = s:Path + +" FUNCTION: Path.AbsolutePathFor(pathStr) {{{1 +function! s:Path.AbsolutePathFor(pathStr) + let l:prependWorkingDir = 0 + + if nerdtree#runningWindows() + let l:prependWorkingDir = a:pathStr !~# '^.:\(\\\|\/\)' && a:pathStr !~# '^\(\\\\\|\/\/\)' + else + let l:prependWorkingDir = a:pathStr !~# '^/' + endif + + let l:result = a:pathStr + + if l:prependWorkingDir + let l:result = getcwd() . s:Path.Slash() . a:pathStr + endif + + return l:result +endfunction + +" FUNCTION: Path.bookmarkNames() {{{1 +function! s:Path.bookmarkNames() + if !exists("self._bookmarkNames") + call self.cacheDisplayString() + endif + return self._bookmarkNames +endfunction + +" FUNCTION: Path.cacheDisplayString() {{{1 +function! s:Path.cacheDisplayString() abort + let self.cachedDisplayString = g:NERDTreeNodeDelimiter . self.getLastPathComponent(1) + + if self.isExecutable + let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . '*' + endif + + let self._bookmarkNames = [] + for i in g:NERDTreeBookmark.Bookmarks() + if i.path.equals(self) + call add(self._bookmarkNames, i.name) + endif + endfor + if !empty(self._bookmarkNames) && g:NERDTreeMarkBookmarks == 1 + let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . ' {' . join(self._bookmarkNames) . '}' + endif + + if self.isSymLink + let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . ' -> ' . self.symLinkDest + endif + + if self.isReadOnly + let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . ' ['.g:NERDTreeGlyphReadOnly.']' + endif +endfunction + +" FUNCTION: Path.addDelimiter() {{{1 +function! s:Path.addDelimiter(line) + if a:line =~# '\(.*' . g:NERDTreeNodeDelimiter . '\)\{2}' + return a:line + else + return a:line . g:NERDTreeNodeDelimiter + endif +endfunction + +" FUNCTION: Path.changeToDir() {{{1 +function! s:Path.changeToDir() + let dir = self.str({'format': 'Cd'}) + if self.isDirectory ==# 0 + let dir = self.getParent().str({'format': 'Cd'}) + endif + + try + execute "cd " . dir + call nerdtree#echo("CWD is now: " . getcwd()) + catch + throw "NERDTree.PathChangeError: cannot change CWD to " . dir + endtry +endfunction + +" FUNCTION: Path.compareTo() {{{1 +" +" Compares this Path to the given path and returns 0 if they are equal, -1 if +" this Path is "less than" the given path, or 1 if it is "greater". +" +" Args: +" path: the path object to compare this to +" +" Return: +" 1, -1 or 0 +function! s:Path.compareTo(path) + let thisPath = self.getLastPathComponent(1) + let thatPath = a:path.getLastPathComponent(1) + + "if the paths are the same then clearly we return 0 + if thisPath ==# thatPath + return 0 + endif + + let thisSS = self.getSortOrderIndex() + let thatSS = a:path.getSortOrderIndex() + + "compare the sort sequences, if they are different then the return + "value is easy + if thisSS < thatSS + return -1 + elseif thisSS > thatSS + return 1 + else + if !g:NERDTreeSortHiddenFirst + let thisPath = substitute(thisPath, '^[._]', '', '') + let thatPath = substitute(thatPath, '^[._]', '', '') + endif + "if the sort sequences are the same then compare the paths + "alphabetically + let pathCompare = g:NERDTreeCaseSensitiveSort ? thisPath <# thatPath : thisPath $" + endif + + return " \\`\|\"#%&,?()\*^<>[]$" +endfunction + +" FUNCTION: Path.getDir() {{{1 +" +" Returns this path if it is a directory, else this paths parent. +" +" Return: +" a Path object +function! s:Path.getDir() + if self.isDirectory + return self + else + return self.getParent() + endif +endfunction + +" FUNCTION: Path.getParent() {{{1 +" +" Returns a new path object for this paths parent +" +" Return: +" a new Path object +function! s:Path.getParent() + if nerdtree#runningWindows() + let path = self.drive . '\' . join(self.pathSegments[0:-2], '\') + else + let path = '/'. join(self.pathSegments[0:-2], '/') + endif + + return s:Path.New(path) +endfunction + +" FUNCTION: Path.getLastPathComponent(dirSlash) {{{1 +" +" Gets the last part of this path. +" +" Args: +" dirSlash: if 1 then a trailing slash will be added to the returned value for +" directory nodes. +function! s:Path.getLastPathComponent(dirSlash) + if empty(self.pathSegments) + return '' + endif + let toReturn = self.pathSegments[-1] + if a:dirSlash && self.isDirectory + let toReturn = toReturn . '/' + endif + return toReturn +endfunction + +" FUNCTION: Path.getSortOrderIndex() {{{1 +" returns the index of the pattern in g:NERDTreeSortOrder that this path matches +function! s:Path.getSortOrderIndex() + let i = 0 + while i < len(g:NERDTreeSortOrder) + if self.getLastPathComponent(1) =~# g:NERDTreeSortOrder[i] + return i + endif + let i = i + 1 + endwhile + + return index(g:NERDTreeSortOrder, '*') +endfunction + +" FUNCTION: Path._splitChunks(path) {{{1 +" returns a list of path chunks +function! s:Path._splitChunks(path) + let chunks = split(a:path, '\(\D\+\|\d\+\)\zs') + let i = 0 + while i < len(chunks) + "convert number literals to numbers + if match(chunks[i], '^\d\+$') == 0 + let chunks[i] = str2nr(chunks[i]) + endif + let i = i + 1 + endwhile + return chunks +endfunction + +" FUNCTION: Path.getSortKey() {{{1 +" returns a key used in compare function for sorting +function! s:Path.getSortKey() + let l:ascending = index(g:NERDTreeSortOrder,'[[timestamp]]') + let l:descending = index(g:NERDTreeSortOrder,'[[-timestamp]]') + if !exists("self._sortKey") || g:NERDTreeSortOrder !=# g:NERDTreeOldSortOrder || l:ascending >= 0 || l:descending >= 0 + let self._sortKey = [self.getSortOrderIndex()] + + if l:descending >= 0 + call insert(self._sortKey, -getftime(self.str()), l:descending == 0 ? 0 : len(self._sortKey)) + elseif l:ascending >= 0 + call insert(self._sortKey, getftime(self.str()), l:ascending == 0 ? 0 : len(self._sortKey)) + endif + + let path = self.getLastPathComponent(1) + if !g:NERDTreeSortHiddenFirst + let path = substitute(path, '^[._]', '', '') + endif + if !g:NERDTreeCaseSensitiveSort + let path = tolower(path) + endif + + call extend(self._sortKey, (g:NERDTreeNaturalSort ? self._splitChunks(path) : [path])) + endif + return self._sortKey +endfunction + +" FUNCTION: Path.isHiddenUnder(path) {{{1 +function! s:Path.isHiddenUnder(path) + + if !self.isUnder(a:path) + return 0 + endif + + let l:startIndex = len(a:path.pathSegments) + let l:segments = self.pathSegments[l:startIndex : ] + + for l:segment in l:segments + + if l:segment =~# '^\.' + return 1 + endif + endfor + + return 0 +endfunction + +" FUNCTION: Path.isUnixHiddenFile() {{{1 +" check for unix hidden files +function! s:Path.isUnixHiddenFile() + return self.getLastPathComponent(0) =~# '^\.' +endfunction + +" FUNCTION: Path.isUnixHiddenPath() {{{1 +" check for unix path with hidden components +function! s:Path.isUnixHiddenPath() + if self.getLastPathComponent(0) =~# '^\.' + return 1 + else + for segment in self.pathSegments + if segment =~# '^\.' + return 1 + endif + endfor + return 0 + endif +endfunction + +" FUNCTION: Path.ignore(nerdtree) {{{1 +" returns true if this path should be ignored +function! s:Path.ignore(nerdtree) + "filter out the user specified paths to ignore + if a:nerdtree.ui.isIgnoreFilterEnabled() + for i in g:NERDTreeIgnore + if self._ignorePatternMatches(i) + return 1 + endif + endfor + + for callback in g:NERDTree.PathFilters() + if {callback}({'path': self, 'nerdtree': a:nerdtree}) + return 1 + endif + endfor + endif + + "dont show hidden files unless instructed to + if !a:nerdtree.ui.getShowHidden() && self.isUnixHiddenFile() + return 1 + endif + + if a:nerdtree.ui.getShowFiles() ==# 0 && self.isDirectory ==# 0 + return 1 + endif + + return 0 +endfunction + +" FUNCTION: Path._ignorePatternMatches(pattern) {{{1 +" returns true if this path matches the given ignore pattern +function! s:Path._ignorePatternMatches(pattern) + let pat = a:pattern + if strpart(pat,len(pat)-7) == '[[dir]]' + if !self.isDirectory + return 0 + endif + let pat = strpart(pat,0, len(pat)-7) + elseif strpart(pat,len(pat)-8) == '[[file]]' + if self.isDirectory + return 0 + endif + let pat = strpart(pat,0, len(pat)-8) + endif + + return self.getLastPathComponent(0) =~# pat +endfunction + +" FUNCTION: Path.isAncestor(path) {{{1 +" return 1 if this path is somewhere above the given path in the filesystem. +" +" a:path should be a dir +function! s:Path.isAncestor(path) + if !self.isDirectory + return 0 + endif + + let this = self.str() + let that = a:path.str() + return stridx(that, this) == 0 +endfunction + +" FUNCTION: Path.isUnder(path) {{{1 +" return 1 if this path is somewhere under the given path in the filesystem. +function! s:Path.isUnder(path) + if a:path.isDirectory == 0 + return 0 + endif + + let this = self.str() + let that = a:path.str() + return stridx(this, that . s:Path.Slash()) == 0 +endfunction + +" FUNCTION: Path.JoinPathStrings(...) {{{1 +function! s:Path.JoinPathStrings(...) + let components = [] + for i in a:000 + let components = extend(components, split(i, '/')) + endfor + return '/' . join(components, '/') +endfunction + +" FUNCTION: Path.equals() {{{1 +" +" Determines whether 2 path objects are "equal". +" They are equal if the paths they represent are the same +" +" Args: +" path: the other path obj to compare this with +function! s:Path.equals(path) + return self.str() ==# a:path.str() +endfunction + +" FUNCTION: Path.New(pathStr) {{{1 +function! s:Path.New(pathStr) + let l:newPath = copy(self) + + call l:newPath.readInfoFromDisk(s:Path.AbsolutePathFor(a:pathStr)) + + let l:newPath.cachedDisplayString = '' + let l:newPath.flagSet = g:NERDTreeFlagSet.New() + + return l:newPath +endfunction + +" FUNCTION: Path.Slash() {{{1 +" Return the path separator used by the underlying file system. Special +" consideration is taken for the use of the 'shellslash' option on Windows +" systems. +function! s:Path.Slash() + + if nerdtree#runningWindows() + if exists('+shellslash') && &shellslash + return '/' + endif + + return '\' + endif + + return '/' +endfunction + +" FUNCTION: Path.Resolve() {{{1 +" Invoke the vim resolve() function and return the result +" This is necessary because in some versions of vim resolve() removes trailing +" slashes while in other versions it doesn't. This always removes the trailing +" slash +function! s:Path.Resolve(path) + let tmp = resolve(a:path) + return tmp =~# '.\+/$' ? substitute(tmp, '/$', '', '') : tmp +endfunction + +" FUNCTION: Path.readInfoFromDisk(fullpath) {{{1 +" +" +" Throws NERDTree.Path.InvalidArguments exception. +function! s:Path.readInfoFromDisk(fullpath) + call self.extractDriveLetter(a:fullpath) + + let fullpath = s:Path.WinToUnixPath(a:fullpath) + + if getftype(fullpath) ==# "fifo" + throw "NERDTree.InvalidFiletypeError: Cant handle FIFO files: " . a:fullpath + endif + + let self.pathSegments = filter(split(fullpath, '/'), '!empty(v:val)') + + let self.isReadOnly = 0 + if isdirectory(a:fullpath) + let self.isDirectory = 1 + elseif filereadable(a:fullpath) + let self.isDirectory = 0 + let self.isReadOnly = filewritable(a:fullpath) ==# 0 + else + throw "NERDTree.InvalidArgumentsError: Invalid path = " . a:fullpath + endif + + let self.isExecutable = 0 + if !self.isDirectory + let self.isExecutable = getfperm(a:fullpath) =~# 'x' + endif + + "grab the last part of the path (minus the trailing slash) + let lastPathComponent = self.getLastPathComponent(0) + + "get the path to the new node with the parent dir fully resolved + let hardPath = s:Path.Resolve(self.strTrunk()) . '/' . lastPathComponent + + "if the last part of the path is a symlink then flag it as such + let self.isSymLink = (s:Path.Resolve(hardPath) != hardPath) + if self.isSymLink + let self.symLinkDest = s:Path.Resolve(fullpath) + + "if the link is a dir then slap a / on the end of its dest + if isdirectory(self.symLinkDest) + + "we always wanna treat MS windows shortcuts as files for + "simplicity + if hardPath !~# '\.lnk$' + + let self.symLinkDest = self.symLinkDest . '/' + endif + endif + endif +endfunction + +" FUNCTION: Path.refresh(nerdtree) {{{1 +function! s:Path.refresh(nerdtree) + call self.readInfoFromDisk(self.str()) + call g:NERDTreePathNotifier.NotifyListeners('refresh', self, a:nerdtree, {}) + call self.cacheDisplayString() +endfunction + +" FUNCTION: Path.refreshFlags(nerdtree) {{{1 +function! s:Path.refreshFlags(nerdtree) + call g:NERDTreePathNotifier.NotifyListeners('refreshFlags', self, a:nerdtree, {}) + call self.cacheDisplayString() +endfunction + +" FUNCTION: Path.rename() {{{1 +" +" Renames this node on the filesystem +function! s:Path.rename(newPath) + if a:newPath ==# '' + throw "NERDTree.InvalidArgumentsError: Invalid newPath for renaming = ". a:newPath + endif + + call s:Path.createParentDirectories(a:newPath) + + let success = rename(self.str(), a:newPath) + if success != 0 + throw "NERDTree.PathRenameError: Could not rename: '" . self.str() . "'" . 'to:' . a:newPath + endif + call self.readInfoFromDisk(a:newPath) + + for i in self.bookmarkNames() + let b = g:NERDTreeBookmark.BookmarkFor(i) + call b.setPath(copy(self)) + endfor + call g:NERDTreeBookmark.Write() +endfunction + +" FUNCTION: Path.str() {{{1 +" Return a string representation of this Path object. +" +" Args: +" This function takes a single dictionary (optional) with keys and values that +" specify how the returned pathname should be formatted. +" +" The dictionary may have the following keys: +" 'format' +" 'escape' +" 'truncateTo' +" +" The 'format' key may have a value of: +" 'Cd' - a string to be used with ":cd" and similar commands +" 'Edit' - a string to be used with ":edit" and similar commands +" 'UI' - a string to be displayed in the NERDTree user interface +" +" The 'escape' key, if specified, will cause the output to be escaped with +" Vim's internal "shellescape()" function. +" +" The 'truncateTo' key shortens the length of the path to that given by the +" value associated with 'truncateTo'. A '<' is prepended. +function! s:Path.str(...) + let options = a:0 ? a:1 : {} + let toReturn = "" + + if has_key(options, 'format') + let format = options['format'] + if has_key(self, '_strFor' . format) + exec 'let toReturn = self._strFor' . format . '()' + else + throw 'NERDTree.UnknownFormatError: unknown format "'. format .'"' + endif + else + let toReturn = self._str() + endif + + if nerdtree#has_opt(options, 'escape') + let toReturn = shellescape(toReturn) + endif + + if has_key(options, 'truncateTo') + let limit = options['truncateTo'] + if strdisplaywidth(toReturn) > limit-1 + while strdisplaywidth(toReturn) > limit-1 && strchars(toReturn) > 0 + let toReturn = substitute(toReturn, '^.', '', '') + endwhile + if len(split(toReturn, '/')) > 1 + let toReturn = ' 0) ? a:1 : {} + + call self.toggleOpen(l:options) + + " Note that we only re-render the NERDTree for this node if we did NOT + " create a new node and render it in a new window or tab. In the latter + " case, rendering the NERDTree for this node could overwrite the text of + " the new NERDTree! + if !has_key(l:options, 'where') || empty(l:options['where']) + call self.getNerdtree().render() + call self.putCursorHere(0, 0) + endif +endfunction + +" FUNCTION: TreeDirNode.addChild(treenode, inOrder) {{{1 +" Adds the given treenode to the list of children for this node +" +" Args: +" -treenode: the node to add +" -inOrder: 1 if the new node should be inserted in sorted order +function! s:TreeDirNode.addChild(treenode, inOrder) + call add(self.children, a:treenode) + let a:treenode.parent = self + + if a:inOrder + call self.sortChildren() + endif +endfunction + +" FUNCTION: TreeDirNode.close() {{{1 +" Mark this TreeDirNode as closed. +function! s:TreeDirNode.close() + + " Close all directories in this directory node's cascade. This is + " necessary to ensure consistency when cascades are rendered. + for l:dirNode in self.getCascade() + let l:dirNode.isOpen = 0 + endfor +endfunction + +" FUNCTION: TreeDirNode.closeChildren() {{{1 +" Recursively close any directory nodes that are descendants of this node. +function! s:TreeDirNode.closeChildren() + for l:child in self.children + if l:child.path.isDirectory + call l:child.close() + call l:child.closeChildren() + endif + endfor +endfunction + +" FUNCTION: TreeDirNode.createChild(path, inOrder) {{{1 +" Instantiates a new child node for this node with the given path. The new +" nodes parent is set to this node. +" +" Args: +" path: a Path object that this node will represent/contain +" inOrder: 1 if the new node should be inserted in sorted order +" +" Returns: +" the newly created node +function! s:TreeDirNode.createChild(path, inOrder) + let newTreeNode = g:NERDTreeFileNode.New(a:path, self.getNerdtree()) + call self.addChild(newTreeNode, a:inOrder) + return newTreeNode +endfunction + +" FUNCTION: TreeDirNode.displayString() {{{1 +" Assemble and return a string that can represent this TreeDirNode object in +" the NERDTree window. +function! s:TreeDirNode.displayString() + let l:result = '' + + " Build a label that identifies this TreeDirNode. + let l:label = '' + let l:cascade = self.getCascade() + for l:dirNode in l:cascade + let l:next = l:dirNode.path.displayString() + let l:label .= l:label == '' ? l:next : strcharpart(l:next,1) + endfor + + " Select the appropriate open/closed status indicator symbol. + if l:cascade[-1].isOpen + let l:symbol = g:NERDTreeDirArrowCollapsible + else + let l:symbol = g:NERDTreeDirArrowExpandable + endif + + let l:flags = l:cascade[-1].path.flagSet.renderToString() + + let l:result = l:symbol . ' ' . l:flags . l:label + return l:result +endfunction + +" FUNCTION: TreeDirNode.findNode(path) {{{1 +" Will find one of the children (recursively) that has the given path +" +" Args: +" path: a path object +unlet s:TreeDirNode.findNode +function! s:TreeDirNode.findNode(path) + if a:path.equals(self.path) + return self + endif + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return {} + endif + + if self.path.isDirectory + for i in self.children + let retVal = i.findNode(a:path) + if retVal != {} + return retVal + endif + endfor + endif + return {} +endfunction + +" FUNCTION: TreeDirNode.getCascade() {{{1 +" Return an array of dir nodes (starting from self) that can be cascade opened. +function! s:TreeDirNode.getCascade() + if !self.isCascadable() + return [self] + endif + + let vc = self.getVisibleChildren() + let visChild = vc[0] + + return [self] + visChild.getCascade() +endfunction + +" FUNCTION: TreeDirNode.getCascadeRoot() {{{1 +" Return the first directory node in the cascade in which this directory node +" is rendered. +function! s:TreeDirNode.getCascadeRoot() + + " Don't search above the current NERDTree root node. + if self.isRoot() + return self + endif + + let l:cascadeRoot = self + let l:parent = self.parent + + while !empty(l:parent) && !l:parent.isRoot() + + if index(l:parent.getCascade(), self) == -1 + break + endif + + let l:cascadeRoot = l:parent + let l:parent = l:parent.parent + endwhile + + return l:cascadeRoot +endfunction + +" FUNCTION: TreeDirNode.getChildCount() {{{1 +" Returns the number of children this node has +function! s:TreeDirNode.getChildCount() + return len(self.children) +endfunction + +" FUNCTION: TreeDirNode.getChild(path) {{{1 +" Returns child node of this node that has the given path or {} if no such node +" exists. +" +" This function doesnt not recurse into child dir nodes +" +" Args: +" path: a path object +function! s:TreeDirNode.getChild(path) + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return {} + endif + + let index = self.getChildIndex(a:path) + if index ==# -1 + return {} + else + return self.children[index] + endif + +endfunction + +" FUNCTION: TreeDirNode.getChildByIndex(indx, visible) {{{1 +" returns the child at the given index +" +" Args: +" indx: the index to get the child from +" visible: 1 if only the visible children array should be used, 0 if all the +" children should be searched. +function! s:TreeDirNode.getChildByIndex(indx, visible) + let array_to_search = a:visible? self.getVisibleChildren() : self.children + if a:indx > len(array_to_search) + throw "NERDTree.InvalidArgumentsError: Index is out of bounds." + endif + return array_to_search[a:indx] +endfunction + +" FUNCTION: TreeDirNode.getChildIndex(path) {{{1 +" Returns the index of the child node of this node that has the given path or +" -1 if no such node exists. +" +" This function doesnt not recurse into child dir nodes +" +" Args: +" path: a path object +function! s:TreeDirNode.getChildIndex(path) + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return -1 + endif + + "do a binary search for the child + let a = 0 + let z = self.getChildCount() + while a < z + let mid = (a+z)/2 + let diff = a:path.compareTo(self.children[mid].path) + + if diff ==# -1 + let z = mid + elseif diff ==# 1 + let a = mid+1 + else + return mid + endif + endwhile + return -1 +endfunction + +" FUNCTION: TreeDirNode._glob(pattern, all) {{{1 +" Return a list of strings naming the descendants of the directory in this +" TreeDirNode object that match the specified glob pattern. +" +" Args: +" pattern: (string) the glob pattern to apply +" all: (0 or 1) if 1, include "." and ".." if they match "pattern"; if 0, +" always exclude them +" +" Note: If the pathnames in the result list are below the working directory, +" they are returned as pathnames relative to that directory. This is because +" this function, internally, attempts to obey 'wildignore' rules that use +" relative paths. +function! s:TreeDirNode._glob(pattern, all) + + " Construct a path specification such that "globpath()" will return + " relative pathnames, if possible. + if self.path.str() == getcwd() + let l:pathSpec = ',' + else + let l:pathSpec = escape(fnamemodify(self.path.str({'format': 'Glob'}), ':.'), ',') + + " On Windows, the drive letter may be removed by "fnamemodify()". + if nerdtree#runningWindows() && l:pathSpec[0] == g:NERDTreePath.Slash() + let l:pathSpec = self.path.drive . l:pathSpec + endif + endif + + let l:globList = [] + + " See ":h version7.txt" and ":h version8.txt" for details on the + " development of the "glob()" and "globpath()" functions. + if v:version > 704 || (v:version == 704 && has('patch654')) + let l:globList = globpath(l:pathSpec, a:pattern, !g:NERDTreeRespectWildIgnore, 1, 0) + elseif v:version == 704 && has('patch279') + let l:globList = globpath(l:pathSpec, a:pattern, !g:NERDTreeRespectWildIgnore, 1) + elseif v:version > 702 || (v:version == 702 && has('patch051')) + let l:globString = globpath(l:pathSpec, a:pattern, !g:NERDTreeRespectWildIgnore) + let l:globList = split(l:globString, "\n") + else + let l:globString = globpath(l:pathSpec, a:pattern) + let l:globList = split(l:globString, "\n") + endif + + " If "a:all" is false, filter "." and ".." from the output. + if !a:all + let l:toRemove = [] + + for l:file in l:globList + let l:tail = fnamemodify(l:file, ':t') + + " If l:file has a trailing slash, then its :tail will be ''. Use + " :h to drop the slash and the empty string after it; then use :t + " to get the directory name. + if l:tail == '' + let l:tail = fnamemodify(l:file, ':h:t') + endif + + if l:tail == '.' || l:tail == '..' + call add(l:toRemove, l:file) + if len(l:toRemove) == 2 + break + endif + endif + endfor + + for l:file in l:toRemove + call remove(l:globList, index(l:globList, l:file)) + endfor + endif + + return l:globList +endfunction + +" FUNCTION: TreeDirNode.GetSelected() {{{1 +" Returns the current node if it is a dir node, or else returns the current +" nodes parent +unlet s:TreeDirNode.GetSelected +function! s:TreeDirNode.GetSelected() + let currentDir = g:NERDTreeFileNode.GetSelected() + if currentDir != {} && !currentDir.isRoot() + if currentDir.path.isDirectory ==# 0 + let currentDir = currentDir.parent + endif + endif + return currentDir +endfunction + +" FUNCTION: TreeDirNode.getVisibleChildCount() {{{1 +" Returns the number of visible children this node has +function! s:TreeDirNode.getVisibleChildCount() + return len(self.getVisibleChildren()) +endfunction + +" FUNCTION: TreeDirNode.getVisibleChildren() {{{1 +" Returns a list of children to display for this node, in the correct order +" +" Return: +" an array of treenodes +function! s:TreeDirNode.getVisibleChildren() + let toReturn = [] + for i in self.children + if i.path.ignore(self.getNerdtree()) ==# 0 + call add(toReturn, i) + endif + endfor + return toReturn +endfunction + +" FUNCTION: TreeDirNode.hasVisibleChildren() {{{1 +" returns 1 if this node has any childre, 0 otherwise.. +function! s:TreeDirNode.hasVisibleChildren() + return self.getVisibleChildCount() != 0 +endfunction + +" FUNCTION: TreeDirNode.isCascadable() {{{1 +" true if this dir has only one visible child - which is also a dir +function! s:TreeDirNode.isCascadable() + if g:NERDTreeCascadeSingleChildDir == 0 + return 0 + endif + + let c = self.getVisibleChildren() + return len(c) == 1 && c[0].path.isDirectory +endfunction + +" FUNCTION: TreeDirNode._initChildren() {{{1 +" Removes all childen from this node and re-reads them +" +" Args: +" silent: 1 if the function should not echo any "please wait" messages for +" large directories +" +" Return: the number of child nodes read +function! s:TreeDirNode._initChildren(silent) + "remove all the current child nodes + let self.children = [] + + let files = self._glob('*', 1) + self._glob('.*', 0) + + if !a:silent && len(files) > g:NERDTreeNotificationThreshold + call nerdtree#echo("Please wait, caching a large dir ...") + endif + + let invalidFilesFound = 0 + for i in files + try + let path = g:NERDTreePath.New(i) + call self.createChild(path, 0) + call g:NERDTreePathNotifier.NotifyListeners('init', path, self.getNerdtree(), {}) + catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ + let invalidFilesFound += 1 + endtry + endfor + + call self.sortChildren() + + if !a:silent && len(files) > g:NERDTreeNotificationThreshold + call nerdtree#echo("Please wait, caching a large dir ... DONE (". self.getChildCount() ." nodes cached).") + endif + + if invalidFilesFound + call nerdtree#echoWarning(invalidFilesFound . " file(s) could not be loaded into the NERD tree") + endif + return self.getChildCount() +endfunction + +" FUNCTION: TreeDirNode.New(path, nerdtree) {{{1 +" Return a new TreeDirNode object with the given path and parent. +" +" Args: +" path: dir that the node represents +" nerdtree: the tree the node belongs to +function! s:TreeDirNode.New(path, nerdtree) + if a:path.isDirectory != 1 + throw "NERDTree.InvalidArgumentsError: A TreeDirNode object must be instantiated with a directory Path object." + endif + + let newTreeNode = copy(self) + let newTreeNode.path = a:path + + let newTreeNode.isOpen = 0 + let newTreeNode.children = [] + + let newTreeNode.parent = {} + let newTreeNode._nerdtree = a:nerdtree + + return newTreeNode +endfunction + +" FUNCTION: TreeDirNode.open([options]) {{{1 +" Open this directory node in the current tree or elsewhere if special options +" are provided. Return 0 if options were processed. Otherwise, return the +" number of new cached nodes. +function! s:TreeDirNode.open(...) + let l:options = a:0 ? a:1 : {} + + " If special options were specified, process them and return. + if has_key(l:options, 'where') && !empty(l:options['where']) + let l:opener = g:NERDTreeOpener.New(self.path, l:options) + call l:opener.open(self) + return 0 + endif + + " Open any ancestors of this node that render within the same cascade. + let l:parent = self.parent + while !empty(l:parent) && !l:parent.isRoot() + if index(l:parent.getCascade(), self) >= 0 + let l:parent.isOpen = 1 + let l:parent = l:parent.parent + else + break + endif + endwhile + + let self.isOpen = 1 + + let l:numChildrenCached = 0 + if empty(self.children) + let l:numChildrenCached = self._initChildren(0) + endif + + return l:numChildrenCached +endfunction + +" FUNCTION: TreeDirNode.openAlong([opts]) {{{1 +" recursive open the dir if it has only one directory child. +" +" return the level of opened directories. +function! s:TreeDirNode.openAlong(...) + let opts = a:0 ? a:1 : {} + let level = 0 + + let node = self + while node.path.isDirectory + call node.open(opts) + let level += 1 + if node.getVisibleChildCount() == 1 + let node = node.getChildByIndex(0, 1) + else + break + endif + endwhile + return level +endfunction + +" FUNCTION: TreeDirNode.openExplorer() {{{1 +" Open an explorer window for this node in the previous window. The explorer +" can be a NERDTree window or a netrw window. +function! s:TreeDirNode.openExplorer() + call self.open({'where': 'p'}) +endfunction + +" FUNCTION: TreeDirNode.openInNewTab(options) {{{1 +unlet s:TreeDirNode.openInNewTab +function! s:TreeDirNode.openInNewTab(options) + call nerdtree#deprecated('TreeDirNode.openInNewTab', 'is deprecated, use open() instead') + call self.open({'where': 't'}) +endfunction + +" FUNCTION: TreeDirNode._openInNewTab() {{{1 +function! s:TreeDirNode._openInNewTab() + tabnew + call g:NERDTreeCreator.CreateTabTree(self.path.str()) +endfunction + +" FUNCTION: TreeDirNode.openRecursively() {{{1 +" Open this directory node and any descendant directory nodes whose pathnames +" are not ignored. +function! s:TreeDirNode.openRecursively() + silent call self.open() + + for l:child in self.children + if l:child.path.isDirectory && !l:child.path.ignore(l:child.getNerdtree()) + call l:child.openRecursively() + endif + endfor +endfunction + +" FUNCTION: TreeDirNode.refresh() {{{1 +function! s:TreeDirNode.refresh() + call self.path.refresh(self.getNerdtree()) + + "if this node was ever opened, refresh its children + if self.isOpen || !empty(self.children) + let files = self._glob('*', 1) + self._glob('.*', 0) + let newChildNodes = [] + let invalidFilesFound = 0 + for i in files + try + "create a new path and see if it exists in this nodes children + let path = g:NERDTreePath.New(i) + let newNode = self.getChild(path) + if newNode != {} + call newNode.refresh() + call add(newChildNodes, newNode) + + "the node doesnt exist so create it + else + let newNode = g:NERDTreeFileNode.New(path, self.getNerdtree()) + let newNode.parent = self + call add(newChildNodes, newNode) + endif + catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ + let invalidFilesFound = 1 + endtry + endfor + + "swap this nodes children out for the children we just read/refreshed + let self.children = newChildNodes + call self.sortChildren() + + if invalidFilesFound + call nerdtree#echoWarning("some files could not be loaded into the NERD tree") + endif + endif +endfunction + +" FUNCTION: TreeDirNode.refreshFlags() {{{1 +unlet s:TreeDirNode.refreshFlags +function! s:TreeDirNode.refreshFlags() + call self.path.refreshFlags(self.getNerdtree()) + for i in self.children + call i.refreshFlags() + endfor +endfunction + +" FUNCTION: TreeDirNode.refreshDirFlags() {{{1 +function! s:TreeDirNode.refreshDirFlags() + call self.path.refreshFlags(self.getNerdtree()) +endfunction + +" FUNCTION: TreeDirNode.reveal(path) {{{1 +" reveal the given path, i.e. cache and open all treenodes needed to display it +" in the UI +" Returns the revealed node +function! s:TreeDirNode.reveal(path, ...) + let opts = a:0 ? a:1 : {} + + if !a:path.isUnder(self.path) + throw "NERDTree.InvalidArgumentsError: " . a:path.str() . " should be under " . self.path.str() + endif + + call self.open() + + if self.path.equals(a:path.getParent()) + let n = self.findNode(a:path) + if has_key(opts, "open") + call n.open() + endif + return n + endif + + let p = a:path + while !p.getParent().equals(self.path) + let p = p.getParent() + endwhile + + let n = self.findNode(p) + return n.reveal(a:path, opts) +endfunction + +" FUNCTION: TreeDirNode.removeChild(treenode) {{{1 +" Remove the given treenode from "self.children". +" Throws "NERDTree.ChildNotFoundError" if the node is not found. +" +" Args: +" treenode: the node object to remove +function! s:TreeDirNode.removeChild(treenode) + for i in range(0, self.getChildCount()-1) + if self.children[i].equals(a:treenode) + call remove(self.children, i) + return + endif + endfor + + throw "NERDTree.ChildNotFoundError: child node was not found" +endfunction + +" FUNCTION: TreeDirNode.sortChildren() {{{1 +" Sort "self.children" by alphabetical order and directory priority. +function! s:TreeDirNode.sortChildren() + if count(g:NERDTreeSortOrder, '*') < 1 + call add(g:NERDTreeSortOrder, '*') + endif + let CompareFunc = function("nerdtree#compareNodesBySortKey") + call sort(self.children, CompareFunc) + let g:NERDTreeOldSortOrder = g:NERDTreeSortOrder +endfunction + +" FUNCTION: TreeDirNode.toggleOpen([options]) {{{1 +" Opens this directory if it is closed and vice versa +function! s:TreeDirNode.toggleOpen(...) + let opts = a:0 ? a:1 : {} + if self.isOpen ==# 1 + call self.close() + else + if g:NERDTreeCascadeOpenSingleChildDir == 0 + call self.open(opts) + else + call self.openAlong(opts) + endif + endif +endfunction + +" FUNCTION: TreeDirNode.transplantChild(newNode) {{{1 +" Replaces the child of this with the given node (where the child node's full +" path matches a:newNode's fullpath). The search for the matching node is +" non-recursive +" +" Arg: +" newNode: the node to graft into the tree +function! s:TreeDirNode.transplantChild(newNode) + for i in range(0, self.getChildCount()-1) + if self.children[i].equals(a:newNode) + let self.children[i] = a:newNode + let a:newNode.parent = self + break + endif + endfor +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/lib/nerdtree/tree_file_node.vim b/lib/nerdtree/tree_file_node.vim new file mode 100644 index 0000000..d4c060f --- /dev/null +++ b/lib/nerdtree/tree_file_node.vim @@ -0,0 +1,347 @@ +" ============================================================================ +" CLASS: TreeFileNode +" +" This class is the parent of the "TreeDirNode" class and is the "Component" +" part of the composite design pattern between the NERDTree node classes. +" ============================================================================ + + +let s:TreeFileNode = {} +let g:NERDTreeFileNode = s:TreeFileNode + +" FUNCTION: TreeFileNode.activate(...) {{{1 +function! s:TreeFileNode.activate(...) + call self.open(a:0 ? a:1 : {}) +endfunction + +" FUNCTION: TreeFileNode.bookmark(name) {{{1 +" bookmark this node with a:name +function! s:TreeFileNode.bookmark(name) + + " if a bookmark exists with the same name and the node is cached then save + " it so we can update its display string + let oldMarkedNode = {} + try + let oldMarkedNode = g:NERDTreeBookmark.GetNodeForName(a:name, 1, self.getNerdtree()) + catch /^NERDTree.BookmarkNotFoundError/ + catch /^NERDTree.BookmarkedNodeNotFoundError/ + endtry + + call g:NERDTreeBookmark.AddBookmark(a:name, self.path) + call self.path.cacheDisplayString() + call g:NERDTreeBookmark.Write() + + if !empty(oldMarkedNode) + call oldMarkedNode.path.cacheDisplayString() + endif +endfunction + +" FUNCTION: TreeFileNode.cacheParent() {{{1 +" initializes self.parent if it isnt already +function! s:TreeFileNode.cacheParent() + if empty(self.parent) + let parentPath = self.path.getParent() + if parentPath.equals(self.path) + throw "NERDTree.CannotCacheParentError: already at root" + endif + let self.parent = s:TreeFileNode.New(parentPath, self.getNerdtree()) + endif +endfunction + +" FUNCTION: TreeFileNode.clearBookmarks() {{{1 +function! s:TreeFileNode.clearBookmarks() + for i in g:NERDTreeBookmark.Bookmarks() + if i.path.equals(self.path) + call i.delete() + end + endfor + call self.path.cacheDisplayString() +endfunction + +" FUNCTION: TreeFileNode.copy(dest) {{{1 +function! s:TreeFileNode.copy(dest) + call self.path.copy(a:dest) + let newPath = g:NERDTreePath.New(a:dest) + let parent = self.getNerdtree().root.findNode(newPath.getParent()) + if !empty(parent) + call parent.refresh() + return parent.findNode(newPath) + else + return {} + endif +endfunction + +" FUNCTION: TreeFileNode.delete {{{1 +" Removes this node from the tree and calls the Delete method for its path obj +function! s:TreeFileNode.delete() + call self.path.delete() + call self.parent.removeChild(self) +endfunction + +" FUNCTION: TreeFileNode.displayString() {{{1 +" +" Returns a string that specifies how the node should be represented as a +" string +" +" Return: +" a string that can be used in the view to represent this node +function! s:TreeFileNode.displayString() + return self.path.flagSet.renderToString() . self.path.displayString() +endfunction + +" FUNCTION: TreeFileNode.equals(treenode) {{{1 +" +" Compares this treenode to the input treenode and returns 1 if they are the +" same node. +" +" Use this method instead of == because sometimes when the treenodes contain +" many children, vim seg faults when doing == +" +" Args: +" treenode: the other treenode to compare to +function! s:TreeFileNode.equals(treenode) + return self.path.str() ==# a:treenode.path.str() +endfunction + +" FUNCTION: TreeFileNode.findNode(path) {{{1 +" Returns self if this node.path.Equals the given path. +" Returns {} if not equal. +" +" Args: +" path: the path object to compare against +function! s:TreeFileNode.findNode(path) + if a:path.equals(self.path) + return self + endif + return {} +endfunction + +" FUNCTION: TreeFileNode.findSibling(direction) {{{1 +" Find the next or previous sibling of this node. +" +" Args: +" direction: 0 for previous, 1 for next +" +" Return: +" The next/previous TreeFileNode object or an empty dictionary if not found. +function! s:TreeFileNode.findSibling(direction) + + " There can be no siblings if there is no parent. + if empty(self.parent) + return {} + endif + + let l:nodeIndex = self.parent.getChildIndex(self.path) + + if l:nodeIndex == -1 + return {} + endif + + " Get the next index to begin the search. + let l:nodeIndex += a:direction ? 1 : -1 + + while 0 <= l:nodeIndex && l:nodeIndex < self.parent.getChildCount() + + " Return the next node if it is not ignored. + if !self.parent.children[l:nodeIndex].path.ignore(self.getNerdtree()) + return self.parent.children[l:nodeIndex] + endif + + let l:nodeIndex += a:direction ? 1 : -1 + endwhile + + return {} +endfunction + +" FUNCTION: TreeFileNode.getNerdtree(){{{1 +function! s:TreeFileNode.getNerdtree() + return self._nerdtree +endfunction + +" FUNCTION: TreeFileNode.GetRootForTab(){{{1 +" get the root node for this tab +function! s:TreeFileNode.GetRootForTab() + if g:NERDTree.ExistsForTab() + return getbufvar(t:NERDTreeBufName, 'NERDTree').root + end + return {} +endfunction + +" FUNCTION: TreeFileNode.GetSelected() {{{1 +" If the cursor is currently positioned on a tree node, return the node. +" Otherwise, return the empty dictionary. +function! s:TreeFileNode.GetSelected() + + try + let l:path = b:NERDTree.ui.getPath(line('.')) + + if empty(l:path) + return {} + endif + + return b:NERDTree.root.findNode(l:path) + catch + return {} + endtry +endfunction + +" FUNCTION: TreeFileNode.isVisible() {{{1 +" returns 1 if this node should be visible according to the tree filters and +" hidden file filters (and their on/off status) +function! s:TreeFileNode.isVisible() + return !self.path.ignore(self.getNerdtree()) +endfunction + +" FUNCTION: TreeFileNode.isRoot() {{{1 +function! s:TreeFileNode.isRoot() + if !g:NERDTree.ExistsForBuf() + throw "NERDTree.NoTreeError: No tree exists for the current buffer" + endif + + return self.equals(self.getNerdtree().root) +endfunction + +" FUNCTION: TreeFileNode.New(path, nerdtree) {{{1 +" Returns a new TreeNode object with the given path and parent +" +" Args: +" path: file/dir that the node represents +" nerdtree: the tree the node belongs to +function! s:TreeFileNode.New(path, nerdtree) + if a:path.isDirectory + return g:NERDTreeDirNode.New(a:path, a:nerdtree) + else + let newTreeNode = copy(self) + let newTreeNode.path = a:path + let newTreeNode.parent = {} + let newTreeNode._nerdtree = a:nerdtree + return newTreeNode + endif +endfunction + +" FUNCTION: TreeFileNode.open() {{{1 +function! s:TreeFileNode.open(...) + let opts = a:0 ? a:1 : {} + let opener = g:NERDTreeOpener.New(self.path, opts) + call opener.open(self) +endfunction + +" FUNCTION: TreeFileNode.openSplit() {{{1 +" Open this node in a new window +function! s:TreeFileNode.openSplit() + call nerdtree#deprecated('TreeFileNode.openSplit', 'is deprecated, use .open() instead.') + call self.open({'where': 'h'}) +endfunction + +" FUNCTION: TreeFileNode.openVSplit() {{{1 +" Open this node in a new vertical window +function! s:TreeFileNode.openVSplit() + call nerdtree#deprecated('TreeFileNode.openVSplit', 'is deprecated, use .open() instead.') + call self.open({'where': 'v'}) +endfunction + +" FUNCTION: TreeFileNode.openInNewTab(options) {{{1 +function! s:TreeFileNode.openInNewTab(options) + call nerdtree#deprecated('TreeFileNode.openinNewTab', 'is deprecated, use .open() instead.') + call self.open(extend({'where': 't'}, a:options)) +endfunction + +" FUNCTION: TreeFileNode.putCursorHere(isJump, recurseUpward){{{1 +" Places the cursor on the line number this node is rendered on +" +" Args: +" isJump: 1 if this cursor movement should be counted as a jump by vim +" recurseUpward: try to put the cursor on the parent if the this node isnt +" visible +function! s:TreeFileNode.putCursorHere(isJump, recurseUpward) + let ln = self.getNerdtree().ui.getLineNum(self) + if ln != -1 + if a:isJump + mark ' + endif + call cursor(ln, col(".")) + else + if a:recurseUpward + let node = self + while node != {} && self.getNerdtree().ui.getLineNum(node) ==# -1 + let node = node.parent + call node.open() + endwhile + call self._nerdtree.render() + call node.putCursorHere(a:isJump, 0) + endif + endif +endfunction + +" FUNCTION: TreeFileNode.refresh() {{{1 +function! s:TreeFileNode.refresh() + call self.path.refresh(self.getNerdtree()) +endfunction + +" FUNCTION: TreeFileNode.refreshFlags() {{{1 +function! s:TreeFileNode.refreshFlags() + call self.path.refreshFlags(self.getNerdtree()) +endfunction + +" FUNCTION: TreeFileNode.rename() {{{1 +" Calls the rename method for this nodes path obj +function! s:TreeFileNode.rename(newName) + let newName = substitute(a:newName, '\(\\\|\/\)$', '', '') + call self.path.rename(newName) + call self.parent.removeChild(self) + + let parentPath = self.path.getParent() + let newParent = self.getNerdtree().root.findNode(parentPath) + + if newParent != {} + call newParent.createChild(self.path, 1) + call newParent.refresh() + endif +endfunction + +" FUNCTION: TreeFileNode.renderToString {{{1 +" returns a string representation for this tree to be rendered in the view +function! s:TreeFileNode.renderToString() + return self._renderToString(0, 0) +endfunction + +" Args: +" depth: the current depth in the tree for this call +" drawText: 1 if we should actually draw the line for this node (if 0 then the +" child nodes are rendered only) +" for each depth in the tree +function! s:TreeFileNode._renderToString(depth, drawText) + let output = "" + if a:drawText ==# 1 + + let treeParts = repeat(' ', a:depth - 1) + + if !self.path.isDirectory + let treeParts = treeParts . ' ' + endif + + let line = treeParts . self.displayString() + + let output = output . line . "\n" + endif + + " if the node is an open dir, draw its children + if self.path.isDirectory ==# 1 && self.isOpen ==# 1 + + let childNodesToDraw = self.getVisibleChildren() + + if self.isCascadable() && a:depth > 0 + + let output = output . childNodesToDraw[0]._renderToString(a:depth, 0) + + elseif len(childNodesToDraw) > 0 + for i in childNodesToDraw + let output = output . i._renderToString(a:depth + 1, 1) + endfor + endif + endif + + return output +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim new file mode 100644 index 0000000..32d96d9 --- /dev/null +++ b/lib/nerdtree/ui.vim @@ -0,0 +1,516 @@ +" ============================================================================ +" CLASS: UI +" ============================================================================ + + +let s:UI = {} +let g:NERDTreeUI = s:UI + +" FUNCTION: s:UI.centerView() {{{2 +" centers the nerd tree window around the cursor (provided the nerd tree +" options permit) +function! s:UI.centerView() + if g:NERDTreeAutoCenter + let current_line = winline() + let lines_to_top = current_line + let lines_to_bottom = winheight(g:NERDTree.GetWinNum()) - current_line + if lines_to_top < g:NERDTreeAutoCenterThreshold || lines_to_bottom < g:NERDTreeAutoCenterThreshold + normal! zz + endif + endif +endfunction + +" FUNCTION: s:UI._dumpHelp {{{1 +" prints out the quick help +function! s:UI._dumpHelp() + if self.getShowHelp() + let help = "\" NERDTree (" . nerdtree#version() . ") quickhelp~\n" + let help .= "\" ============================\n" + let help .= "\" File node mappings~\n" + let help .= "\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n" + let help .= "\" ,\n" + if self.nerdtree.isTabTree() + let help .= "\" ". g:NERDTreeMapActivateNode .": open in prev window\n" + else + let help .= "\" ". g:NERDTreeMapActivateNode .": open in current window\n" + endif + if self.nerdtree.isTabTree() + let help .= "\" ". g:NERDTreeMapPreview .": preview\n" + endif + let help .= "\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" + let help .= "\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let help .= "\" middle-click,\n" + let help .= "\" ". g:NERDTreeMapOpenSplit .": open split\n" + let help .= "\" ". g:NERDTreeMapPreviewSplit .": preview split\n" + let help .= "\" ". g:NERDTreeMapOpenVSplit .": open vsplit\n" + let help .= "\" ". g:NERDTreeMapPreviewVSplit .": preview vsplit\n" + + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Directory node mappings~\n" + let help .= "\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n" + let help .= "\" ". g:NERDTreeMapActivateNode .": open & close node\n" + let help .= "\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n" + let help .= "\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" + let help .= "\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let help .= "\" ". g:NERDTreeMapCloseDir .": close parent of node\n" + let help .= "\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n" + let help .= "\" current node recursively\n" + let help .= "\" middle-click,\n" + let help .= "\" ". g:NERDTreeMapOpenExpl.": explore selected dir\n" + + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Bookmark table mappings~\n" + let help .= "\" double-click,\n" + let help .= "\" ". g:NERDTreeMapActivateNode .": open bookmark\n" + let help .= "\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" + let help .= "\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let help .= "\" ". g:NERDTreeMapDeleteBookmark .": delete bookmark\n" + + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Tree navigation mappings~\n" + let help .= "\" ". g:NERDTreeMapJumpRoot .": go to root\n" + let help .= "\" ". g:NERDTreeMapJumpParent .": go to parent\n" + let help .= "\" ". g:NERDTreeMapJumpFirstChild .": go to first child\n" + let help .= "\" ". g:NERDTreeMapJumpLastChild .": go to last child\n" + let help .= "\" ". g:NERDTreeMapJumpNextSibling .": go to next sibling\n" + let help .= "\" ". g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n" + + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Filesystem mappings~\n" + let help .= "\" ". g:NERDTreeMapChangeRoot .": change tree root to the\n" + let help .= "\" selected dir\n" + let help .= "\" ". g:NERDTreeMapUpdir .": move tree root up a dir\n" + let help .= "\" ". g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n" + let help .= "\" but leave old root open\n" + let help .= "\" ". g:NERDTreeMapRefresh .": refresh cursor dir\n" + let help .= "\" ". g:NERDTreeMapRefreshRoot .": refresh current root\n" + let help .= "\" ". g:NERDTreeMapMenu .": Show menu\n" + let help .= "\" ". g:NERDTreeMapChdir .":change the CWD to the\n" + let help .= "\" selected dir\n" + let help .= "\" ". g:NERDTreeMapCWD .":change tree root to CWD\n" + + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Tree filtering mappings~\n" + let help .= "\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (self.getShowHidden() ? "on" : "off") . ")\n" + let help .= "\" ". g:NERDTreeMapToggleFilters .": file filters (" . (self.isIgnoreFilterEnabled() ? "on" : "off") . ")\n" + let help .= "\" ". g:NERDTreeMapToggleFiles .": files (" . (self.getShowFiles() ? "on" : "off") . ")\n" + let help .= "\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (self.getShowBookmarks() ? "on" : "off") . ")\n" + + " add quickhelp entries for each custom key map + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Custom mappings~\n" + for i in g:NERDTreeKeyMap.All() + if !empty(i.quickhelpText) + let help .= "\" ". i.key .": ". i.quickhelpText ."\n" + endif + endfor + + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Other mappings~\n" + let help .= "\" ". g:NERDTreeMapQuit .": Close the NERDTree window\n" + let help .= "\" ". g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n" + let help .= "\" the NERDTree window\n" + let help .= "\" ". g:NERDTreeMapHelp .": toggle help\n" + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Bookmark commands~\n" + let help .= "\" :Bookmark []\n" + let help .= "\" :BookmarkToRoot \n" + let help .= "\" :RevealBookmark \n" + let help .= "\" :OpenBookmark \n" + let help .= "\" :ClearBookmarks []\n" + let help .= "\" :ClearAllBookmarks\n" + silent! put =help + elseif !self.isMinimal() + let help ="\" Press ". g:NERDTreeMapHelp ." for help\n" + silent! put =help + endif +endfunction + + +" FUNCTION: s:UI.new(nerdtree) {{{1 +function! s:UI.New(nerdtree) + let newObj = copy(self) + let newObj.nerdtree = a:nerdtree + let newObj._showHelp = 0 + let newObj._ignoreEnabled = 1 + let newObj._showFiles = g:NERDTreeShowFiles + let newObj._showHidden = g:NERDTreeShowHidden + let newObj._showBookmarks = g:NERDTreeShowBookmarks + + return newObj +endfunction + +" FUNCTION: s:UI.getPath(ln) {{{1 +" Return the "Path" object for the node that is rendered on the given line +" number. If the "up a dir" line is selected, return the "Path" object for +" the parent of the root. Return the empty dictionary if the given line +" does not reference a tree node. +function! s:UI.getPath(ln) + let line = getline(a:ln) + + let rootLine = self.getRootLineNum() + + if a:ln == rootLine + return self.nerdtree.root.path + endif + + if line ==# s:UI.UpDirLine() + return self.nerdtree.root.path.getParent() + endif + + if a:ln < rootLine + return {} + endif + + let indent = self._indentLevelFor(line) + + " remove the tree parts and the leading space + let curFile = self._stripMarkup(line) + + let dir = "" + let lnum = a:ln + while lnum > 0 + let lnum = lnum - 1 + let curLine = getline(lnum) + let curLineStripped = self._stripMarkup(curLine) + + " have we reached the top of the tree? + if lnum == rootLine + let dir = self.nerdtree.root.path.str({'format': 'UI'}) . dir + break + endif + if curLineStripped =~# '/$' + let lpindent = self._indentLevelFor(curLine) + if lpindent < indent + let indent = indent - 1 + + let dir = substitute (curLineStripped,'^\\', "", "") . dir + continue + endif + endif + endwhile + let curFile = self.nerdtree.root.path.drive . dir . curFile + let toReturn = g:NERDTreePath.New(curFile) + return toReturn +endfunction + +" FUNCTION: s:UI.getLineNum(node) {{{1 +" Return the line number where the given node is rendered. Return -1 if the +" given node is not visible. +function! s:UI.getLineNum(node) + + if a:node.isRoot() + return self.getRootLineNum() + endif + + let l:pathComponents = [substitute(self.nerdtree.root.path.str({'format': 'UI'}), '/\s*$', '', '')] + let l:currentPathComponent = 1 + + let l:fullPath = a:node.path.str({'format': 'UI'}) + + for l:lineNumber in range(self.getRootLineNum() + 1, line('$')) + let l:currentLine = getline(l:lineNumber) + let l:indentLevel = self._indentLevelFor(l:currentLine) + + if l:indentLevel != l:currentPathComponent + continue + endif + + let l:currentLine = self._stripMarkup(l:currentLine) + let l:currentPath = join(l:pathComponents, '/') . '/' . l:currentLine + + " Directories: If the current path "starts with" the full path, then + " either the paths are equal or the line is a cascade containing the + " full path. + if l:fullPath[-1:] == '/' && stridx(l:currentPath, l:fullPath) == 0 + return l:lineNumber + endif + + " Files: The paths must exactly match. + if l:fullPath ==# l:currentPath + return l:lineNumber + endif + + " Otherwise: If the full path starts with the current path and the + " current path is a directory, we add a new path component. + if stridx(l:fullPath, l:currentPath) == 0 && l:currentPath[-1:] == '/' + let l:currentLine = substitute(l:currentLine, '/\s*$', '', '') + call add(l:pathComponents, l:currentLine) + let l:currentPathComponent += 1 + endif + endfor + + return -1 +endfunction + +" FUNCTION: s:UI.getRootLineNum(){{{1 +" gets the line number of the root node +function! s:UI.getRootLineNum() + let rootLine = 1 + while getline(rootLine) !~# '^\(/\|<\)' + let rootLine = rootLine + 1 + endwhile + return rootLine +endfunction + +" FUNCTION: s:UI.getShowBookmarks() {{{1 +function! s:UI.getShowBookmarks() + return self._showBookmarks +endfunction + +" FUNCTION: s:UI.getShowFiles() {{{1 +function! s:UI.getShowFiles() + return self._showFiles +endfunction + +" FUNCTION: s:UI.getShowHelp() {{{1 +function! s:UI.getShowHelp() + return self._showHelp +endfunction + +" FUNCTION: s:UI.getShowHidden() {{{1 +function! s:UI.getShowHidden() + return self._showHidden +endfunction + +" FUNCTION: s:UI._indentLevelFor(line) {{{1 +function! s:UI._indentLevelFor(line) + " have to do this work around because match() returns bytes, not chars + let numLeadBytes = match(a:line, '\M\[^ '.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.']') + " The next line is a backward-compatible workaround for strchars(a:line(0:numLeadBytes-1]). strchars() is in 7.3+ + let leadChars = len(split(a:line[0:numLeadBytes-1], '\zs')) + + return leadChars / s:UI.IndentWid() +endfunction + +" FUNCTION: s:UI.IndentWid() {{{1 +function! s:UI.IndentWid() + return 2 +endfunction + +" FUNCTION: s:UI.isIgnoreFilterEnabled() {{{1 +function! s:UI.isIgnoreFilterEnabled() + return self._ignoreEnabled == 1 +endfunction + +" FUNCTION: s:UI.isMinimal() {{{1 +function! s:UI.isMinimal() + return g:NERDTreeMinimalUI +endfunction + +" FUNCTION: s:UI.MarkupReg() {{{1 +function! s:UI.MarkupReg() + return '^ *['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.']\? ' +endfunction + +" FUNCTION: s:UI._renderBookmarks {{{1 +function! s:UI._renderBookmarks() + + if !self.isMinimal() + call setline(line(".")+1, ">----------Bookmarks----------") + call cursor(line(".")+1, col(".")) + endif + + if g:NERDTreeBookmarksSort == 1 || g:NERDTreeBookmarksSort == 2 + call g:NERDTreeBookmark.SortBookmarksList() + endif + + for i in g:NERDTreeBookmark.Bookmarks() + call setline(line(".")+1, i.str()) + call cursor(line(".")+1, col(".")) + endfor + + call setline(line(".")+1, '') + call cursor(line(".")+1, col(".")) +endfunction + +" FUNCTION: s:UI.restoreScreenState() {{{1 +" +" Sets the screen state back to what it was when nerdtree#saveScreenState was last +" called. +" +" Assumes the cursor is in the NERDTree window +function! s:UI.restoreScreenState() + if !has_key(self, '_screenState') + return + endif + exec("silent vertical resize " . self._screenState['oldWindowSize']) + + let old_scrolloff=&scrolloff + let &scrolloff=0 + call cursor(self._screenState['oldTopLine'], 0) + normal! zt + call setpos(".", self._screenState['oldPos']) + let &scrolloff=old_scrolloff +endfunction + +" FUNCTION: s:UI.saveScreenState() {{{1 +" Saves the current cursor position in the current buffer and the window +" scroll position +function! s:UI.saveScreenState() + let win = winnr() + call g:NERDTree.CursorToTreeWin() + let self._screenState = {} + let self._screenState['oldPos'] = getpos(".") + let self._screenState['oldTopLine'] = line("w0") + let self._screenState['oldWindowSize']= winwidth("") + call nerdtree#exec(win . "wincmd w") +endfunction + +" FUNCTION: s:UI.setShowHidden(val) {{{1 +function! s:UI.setShowHidden(val) + let self._showHidden = a:val +endfunction + +" FUNCTION: s:UI._stripMarkup(line){{{1 +" find the filename in the given line, and return it. +" +" Args: +" line: the subject line +function! s:UI._stripMarkup(line) + let l:line = substitute(a:line, '^.\{-}' . g:NERDTreeNodeDelimiter, '', '') + return substitute(l:line, g:NERDTreeNodeDelimiter.'.*$', '', '') +endfunction + +" FUNCTION: s:UI.render() {{{1 +function! s:UI.render() + setlocal noreadonly modifiable + + " remember the top line of the buffer and the current line so we can + " restore the view exactly how it was + let curLine = line(".") + let curCol = col(".") + let topLine = line("w0") + + " delete all lines in the buffer (being careful not to clobber a register) + silent 1,$delete _ + + call self._dumpHelp() + + " delete the blank line before the help and add one after it + if !self.isMinimal() + call setline(line(".")+1, "") + call cursor(line(".")+1, col(".")) + endif + + if self.getShowBookmarks() + call self._renderBookmarks() + endif + + " add the 'up a dir' line + if !self.isMinimal() + call setline(line(".")+1, s:UI.UpDirLine()) + call cursor(line(".")+1, col(".")) + endif + + " draw the header line + let header = self.nerdtree.root.path.str({'format': 'UI', 'truncateTo': winwidth(0)}) + call setline(line(".")+1, header) + call cursor(line(".")+1, col(".")) + + " draw the tree + silent put =self.nerdtree.root.renderToString() + + " delete the blank line at the top of the buffer + silent 1,1delete _ + + " restore the view + let old_scrolloff=&scrolloff + let &scrolloff=0 + call cursor(topLine, 1) + normal! zt + call cursor(curLine, curCol) + let &scrolloff = old_scrolloff + + setlocal readonly nomodifiable +endfunction + + +" FUNCTION: UI.renderViewSavingPosition {{{1 +" Renders the tree and ensures the cursor stays on the current node or the +" current nodes parent if it is no longer available upon re-rendering +function! s:UI.renderViewSavingPosition() + let currentNode = g:NERDTreeFileNode.GetSelected() + + " go up the tree till we find a node that will be visible or till we run + " out of nodes + while currentNode != {} && !currentNode.isVisible() && !currentNode.isRoot() + let currentNode = currentNode.parent + endwhile + + call self.render() + + if currentNode != {} + call currentNode.putCursorHere(0, 0) + endif +endfunction + +" FUNCTION: s:UI.toggleHelp() {{{1 +function! s:UI.toggleHelp() + let self._showHelp = !self._showHelp +endfunction + +" FUNCTION: s:UI.toggleIgnoreFilter() {{{1 +" toggles the use of the NERDTreeIgnore option +function! s:UI.toggleIgnoreFilter() + let self._ignoreEnabled = !self._ignoreEnabled + call self.renderViewSavingPosition() + call self.centerView() +endfunction + +" FUNCTION: s:UI.toggleShowBookmarks() {{{1 +" Toggle the visibility of the Bookmark table. +function! s:UI.toggleShowBookmarks() + let self._showBookmarks = !self._showBookmarks + + if self.getShowBookmarks() + call self.nerdtree.render() + call g:NERDTree.CursorToBookmarkTable() + else + + if empty(g:NERDTreeFileNode.GetSelected()) + call b:NERDTree.root.putCursorHere(0, 0) + normal! 0 + endif + + call self.renderViewSavingPosition() + endif + + call self.centerView() +endfunction + +" FUNCTION: s:UI.toggleShowFiles() {{{1 +" toggles the display of hidden files +function! s:UI.toggleShowFiles() + let self._showFiles = !self._showFiles + call self.renderViewSavingPosition() + call self.centerView() +endfunction + +" FUNCTION: s:UI.toggleShowHidden() {{{1 +" toggles the display of hidden files +function! s:UI.toggleShowHidden() + let self._showHidden = !self._showHidden + call self.renderViewSavingPosition() + call self.centerView() +endfunction + +" FUNCTION: s:UI.toggleZoom() {{{1 +" zoom (maximize/minimize) the NERDTree window +function! s:UI.toggleZoom() + if exists("b:NERDTreeZoomed") && b:NERDTreeZoomed + let size = exists("b:NERDTreeOldWindowSize") ? b:NERDTreeOldWindowSize : g:NERDTreeWinSize + exec "silent vertical resize ". size + let b:NERDTreeZoomed = 0 + else + exec "vertical resize" + let b:NERDTreeZoomed = 1 + endif +endfunction + +" FUNCTION: s:UI.UpDirLine() {{{1 +function! s:UI.UpDirLine() + return '.. (up a dir)' +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/nerdtree_plugin/exec_menuitem.vim b/nerdtree_plugin/exec_menuitem.vim new file mode 100644 index 0000000..c53650a --- /dev/null +++ b/nerdtree_plugin/exec_menuitem.vim @@ -0,0 +1,40 @@ +" ============================================================================ +" File: exec_menuitem.vim +" Description: plugin for NERD Tree that provides an execute file menu item +" Maintainer: Martin Grenfell +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +" ============================================================================ +if exists("g:loaded_nerdtree_exec_menuitem") + finish +endif +let g:loaded_nerdtree_exec_menuitem = 1 + +call NERDTreeAddMenuItem({ + \ 'text': '(!)Execute file', + \ 'shortcut': '!', + \ 'callback': 'NERDTreeExecFile', + \ 'isActiveCallback': 'NERDTreeExecFileActive' }) + +function! NERDTreeExecFileActive() + let node = g:NERDTreeFileNode.GetSelected() + return !node.path.isDirectory && node.path.isExecutable +endfunction + +function! NERDTreeExecFile() + let treenode = g:NERDTreeFileNode.GetSelected() + echo "==========================================================\n" + echo "Complete the command to execute (add arguments etc):\n" + let cmd = treenode.path.str({'escape': 1}) + let cmd = input(':!', cmd . ' ') + + if cmd != '' + exec ':!' . cmd + else + echo "Aborted" + endif +endfunction diff --git a/nerdtree_plugin/fs_menu.vim b/nerdtree_plugin/fs_menu.vim new file mode 100644 index 0000000..ef261ca --- /dev/null +++ b/nerdtree_plugin/fs_menu.vim @@ -0,0 +1,368 @@ +" ============================================================================ +" File: fs_menu.vim +" Description: plugin for the NERD Tree that provides a file system menu +" Maintainer: Martin Grenfell +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +" ============================================================================ +if exists("g:loaded_nerdtree_fs_menu") + finish +endif +let g:loaded_nerdtree_fs_menu = 1 + +"Automatically delete the buffer after deleting or renaming a file +if !exists("g:NERDTreeAutoDeleteBuffer") + let g:NERDTreeAutoDeleteBuffer = 0 +endif + +call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callback': 'NERDTreeAddNode'}) +call NERDTreeAddMenuItem({'text': '(m)ove the current node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'}) +call NERDTreeAddMenuItem({'text': '(d)elete the current node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'}) + +if has("gui_mac") || has("gui_macvim") || has("mac") + call NERDTreeAddMenuItem({'text': '(r)eveal in Finder the current node', 'shortcut': 'r', 'callback': 'NERDTreeRevealInFinder'}) + call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFile'}) + call NERDTreeAddMenuItem({'text': '(q)uicklook the current node', 'shortcut': 'q', 'callback': 'NERDTreeQuickLook'}) +endif + +if executable("xdg-open") + call NERDTreeAddMenuItem({'text': '(r)eveal the current node in file manager', 'shortcut': 'r', 'callback': 'NERDTreeRevealFileLinux'}) + call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFileLinux'}) +endif + +if g:NERDTreePath.CopyingSupported() + call NERDTreeAddMenuItem({'text': '(c)opy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'}) +endif + +if has("unix") || has("osx") + call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNode'}) +else + call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNodeWin32'}) +endif + +"FUNCTION: s:promptToDelBuffer(bufnum, msg){{{1 +"prints out the given msg and, if the user responds by pushing 'y' then the +"buffer with the given bufnum is deleted +" +"Args: +"bufnum: the buffer that may be deleted +"msg: a message that will be echoed to the user asking them if they wish to +" del the buffer +function! s:promptToDelBuffer(bufnum, msg) + echo a:msg + if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y' + " 1. ensure that all windows which display the just deleted filename + " now display an empty buffer (so a layout is preserved). + " Is not it better to close single tabs with this file only ? + let s:originalTabNumber = tabpagenr() + let s:originalWindowNumber = winnr() + " Go to the next buffer in buffer list if at least one extra buffer is listed + " Otherwise open a new empty buffer + if v:version >= 800 + let l:listedBufferCount = len(getbufinfo({'buflisted':1})) + elseif v:version >= 702 + let l:listedBufferCount = len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) + else + " Ignore buffer count in this case to make sure we keep the old + " behavior + let l:listedBufferCount = 0 + endif + if l:listedBufferCount > 1 + exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec ':bnext! ' | endif" + else + exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec ':enew! ' | endif" + endif + exec "tabnext " . s:originalTabNumber + exec s:originalWindowNumber . "wincmd w" + " 3. We don't need a previous buffer anymore + exec "bwipeout! " . a:bufnum + endif +endfunction + +"FUNCTION: s:renameBuffer(bufNum, newNodeName, isDirectory){{{1 +"The buffer with the given bufNum is replaced with a new one +" +"Args: +"bufNum: the buffer that may be deleted +"newNodeName: the name given to the renamed node +"isDirectory: determines how to do the create the new filenames +function! s:renameBuffer(bufNum, newNodeName, isDirectory) + if a:isDirectory + let quotedFileName = fnameescape(a:newNodeName . '/' . fnamemodify(bufname(a:bufNum),':t')) + let editStr = g:NERDTreePath.New(a:newNodeName . '/' . fnamemodify(bufname(a:bufNum),':t')).str({'format': 'Edit'}) + else + let quotedFileName = fnameescape(a:newNodeName) + let editStr = g:NERDTreePath.New(a:newNodeName).str({'format': 'Edit'}) + endif + " 1. ensure that a new buffer is loaded + exec "badd " . quotedFileName + " 2. ensure that all windows which display the just deleted filename + " display a buffer for a new filename. + let s:originalTabNumber = tabpagenr() + let s:originalWindowNumber = winnr() + exec "tabdo windo if winbufnr(0) == " . a:bufNum . " | exec ':e! " . editStr . "' | endif" + exec "tabnext " . s:originalTabNumber + exec s:originalWindowNumber . "wincmd w" + " 3. We don't need a previous buffer anymore + exec "bwipeout! " . a:bufNum +endfunction +"FUNCTION: NERDTreeAddNode(){{{1 +function! NERDTreeAddNode() + let curDirNode = g:NERDTreeDirNode.GetSelected() + + let newNodeName = input("Add a childnode\n". + \ "==========================================================\n". + \ "Enter the dir/file name to be created. Dirs end with a '/'\n" . + \ "", curDirNode.path.str() . g:NERDTreePath.Slash(), "file") + + if newNodeName ==# '' + call nerdtree#echo("Node Creation Aborted.") + return + endif + + try + let newPath = g:NERDTreePath.Create(newNodeName) + let parentNode = b:NERDTree.root.findNode(newPath.getParent()) + + let newTreeNode = g:NERDTreeFileNode.New(newPath, b:NERDTree) + " Emptying g:NERDTreeOldSortOrder forces the sort to + " recalculate the cached sortKey so nodes sort correctly. + let g:NERDTreeOldSortOrder = [] + if empty(parentNode) + call b:NERDTree.root.refresh() + call b:NERDTree.render() + elseif parentNode.isOpen || !empty(parentNode.children) + call parentNode.addChild(newTreeNode, 1) + call NERDTreeRender() + call newTreeNode.putCursorHere(1, 0) + endif + catch /^NERDTree/ + call nerdtree#echoWarning("Node Not Created.") + endtry +endfunction + +"FUNCTION: NERDTreeMoveNode(){{{1 +function! NERDTreeMoveNode() + let curNode = g:NERDTreeFileNode.GetSelected() + let newNodePath = input("Rename the current node\n" . + \ "==========================================================\n" . + \ "Enter the new path for the node: \n" . + \ "", curNode.path.str(), "file") + + if newNodePath ==# '' + call nerdtree#echo("Node Renaming Aborted.") + return + endif + + try + if curNode.path.isDirectory + let l:openBuffers = filter(range(1,bufnr("$")),'bufexists(v:val) && fnamemodify(bufname(v:val),":p") =~# curNode.path.str() . "/.*"') + else + let l:openBuffers = filter(range(1,bufnr("$")),'bufexists(v:val) && fnamemodify(bufname(v:val),":p") ==# curNode.path.str()') + endif + + call curNode.rename(newNodePath) + " Emptying g:NERDTreeOldSortOrder forces the sort to + " recalculate the cached sortKey so nodes sort correctly. + let g:NERDTreeOldSortOrder = [] + call b:NERDTree.root.refresh() + call NERDTreeRender() + + " If the file node is open, or files under the directory node are + " open, ask the user if they want to replace the file(s) with the + " renamed files. + if !empty(l:openBuffers) + if curNode.path.isDirectory + echo "\nDirectory renamed.\n\nFiles with the old directory name are open in buffers " . join(l:openBuffers, ', ') . ". Replace these buffers with the new files? (yN)" + else + echo "\nFile renamed.\n\nThe old file is open in buffer " . l:openBuffers[0] . ". Replace this buffer with the new file? (yN)" + endif + if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y' + for bufNum in l:openBuffers + call s:renameBuffer(bufNum, newNodePath, curNode.path.isDirectory) + endfor + endif + endif + + call curNode.putCursorHere(1, 0) + + redraw + catch /^NERDTree/ + call nerdtree#echoWarning("Node Not Renamed.") + endtry +endfunction + +" FUNCTION: NERDTreeDeleteNode() {{{1 +function! NERDTreeDeleteNode() + let currentNode = g:NERDTreeFileNode.GetSelected() + let confirmed = 0 + + if currentNode.path.isDirectory && ((currentNode.isOpen && currentNode.getChildCount() > 0) || + \ (len(currentNode._glob('*', 1)) > 0)) + let choice =input("Delete the current node\n" . + \ "==========================================================\n" . + \ "STOP! Directory is not empty! To delete, type 'yes'\n" . + \ "" . currentNode.path.str() . ": ") + let confirmed = choice ==# 'yes' + else + echo "Delete the current node\n" . + \ "==========================================================\n". + \ "Are you sure you wish to delete the node:\n" . + \ "" . currentNode.path.str() . " (yN):" + let choice = nr2char(getchar()) + let confirmed = choice ==# 'y' + endif + + + if confirmed + try + call currentNode.delete() + call NERDTreeRender() + + "if the node is open in a buffer, ask the user if they want to + "close that buffer + let bufnum = bufnr("^".currentNode.path.str()."$") + if buflisted(bufnum) + let prompt = "\nNode deleted.\n\nThe file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Delete this buffer? (yN)" + call s:promptToDelBuffer(bufnum, prompt) + endif + + redraw + catch /^NERDTree/ + call nerdtree#echoWarning("Could not remove node") + endtry + else + call nerdtree#echo("delete aborted") + endif + +endfunction + +" FUNCTION: NERDTreeListNode() {{{1 +function! NERDTreeListNode() + let treenode = g:NERDTreeFileNode.GetSelected() + if !empty(treenode) + let s:uname = system("uname") + let stat_cmd = 'stat -c "%s" ' + + if s:uname =~? "Darwin" + let stat_cmd = 'stat -f "%z" ' + endif + + let cmd = 'size=$(' . stat_cmd . shellescape(treenode.path.str()) . ') && ' . + \ 'size_with_commas=$(echo $size | sed -e :a -e "s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta") && ' . + \ 'ls -ld ' . shellescape(treenode.path.str()) . ' | sed -e "s/ $size / $size_with_commas /"' + + let metadata = split(system(cmd),'\n') + call nerdtree#echo(metadata[0]) + else + call nerdtree#echo("No information available") + endif +endfunction + +" FUNCTION: NERDTreeListNodeWin32() {{{1 +function! NERDTreeListNodeWin32() + let l:node = g:NERDTreeFileNode.GetSelected() + + if !empty(l:node) + let l:path = l:node.path.str() + call nerdtree#echo(printf("%s:%s MOD:%s BYTES:%d PERMISSIONS:%s", + \ toupper(getftype(l:path)), + \ fnamemodify(l:path, ':t'), + \ strftime("%c", getftime(l:path)), + \ getfsize(l:path), + \ getfperm(l:path))) + return + endif + + call nerdtree#echo('node not recognized') +endfunction + +" FUNCTION: NERDTreeCopyNode() {{{1 +function! NERDTreeCopyNode() + let currentNode = g:NERDTreeFileNode.GetSelected() + let newNodePath = input("Copy the current node\n" . + \ "==========================================================\n" . + \ "Enter the new path to copy the node to: \n" . + \ "", currentNode.path.str(), "file") + + if newNodePath != "" + "strip trailing slash + let newNodePath = substitute(newNodePath, '\/$', '', '') + + let confirmed = 1 + if currentNode.path.copyingWillOverwrite(newNodePath) + call nerdtree#echo("Warning: copying may overwrite files! Continue? (yN)") + let choice = nr2char(getchar()) + let confirmed = choice ==# 'y' + endif + + if confirmed + try + let newNode = currentNode.copy(newNodePath) + " Emptying g:NERDTreeOldSortOrder forces the sort to + " recalculate the cached sortKey so nodes sort correctly. + let g:NERDTreeOldSortOrder = [] + if empty(newNode) + call b:NERDTree.root.refresh() + call b:NERDTree.render() + else + call NERDTreeRender() + call newNode.putCursorHere(0, 0) + endif + catch /^NERDTree/ + call nerdtree#echoWarning("Could not copy node") + endtry + endif + else + call nerdtree#echo("Copy aborted.") + endif + redraw +endfunction + +" FUNCTION: NERDTreeQuickLook() {{{1 +function! NERDTreeQuickLook() + let treenode = g:NERDTreeFileNode.GetSelected() + if treenode != {} + call system("qlmanage -p 2>/dev/null '" . treenode.path.str() . "'") + endif +endfunction + +" FUNCTION: NERDTreeRevealInFinder() {{{1 +function! NERDTreeRevealInFinder() + let treenode = g:NERDTreeFileNode.GetSelected() + if treenode != {} + call system("open -R '" . treenode.path.str() . "'") + endif +endfunction + +" FUNCTION: NERDTreeExecuteFile() {{{1 +function! NERDTreeExecuteFile() + let treenode = g:NERDTreeFileNode.GetSelected() + if treenode != {} + call system("open '" . treenode.path.str() . "'") + endif +endfunction + +" FUNCTION: NERDTreeRevealFileLinux() {{{1 +function! NERDTreeRevealFileLinux() + let treenode = g:NERDTreeFileNode.GetSelected() + let parentnode = treenode.parent + if parentnode != {} + call system("xdg-open '" . parentnode.path.str() . "' &") + endif +endfunction + +" FUNCTION: NERDTreeExecuteFileLinux() {{{1 +function! NERDTreeExecuteFileLinux() + let treenode = g:NERDTreeFileNode.GetSelected() + if treenode != {} + call system("xdg-open '" . treenode.path.str() . "' &") + endif +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: + diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim new file mode 100644 index 0000000..62506e5 --- /dev/null +++ b/plugin/NERD_tree.vim @@ -0,0 +1,242 @@ +" ============================================================================ +" File: NERD_tree.vim +" Maintainer: Martin Grenfell +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +" ============================================================================ +" +" SECTION: Script init stuff {{{1 +"============================================================ +if exists("loaded_nerd_tree") + finish +endif +if v:version < 700 + echoerr "NERDTree: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!" + finish +endif +let loaded_nerd_tree = 1 + +"for line continuation - i.e dont want C in &cpo +let s:old_cpo = &cpo +set cpo&vim + +"Function: s:initVariable() function {{{2 +"This function is used to initialise a given variable to a given value. The +"variable is only initialised if it does not exist prior +" +"Args: +"var: the name of the var to be initialised +"value: the value to initialise var to +" +"Returns: +"1 if the var is set, 0 otherwise +function! s:initVariable(var, value) + if !exists(a:var) + exec 'let ' . a:var . ' = ' . "'" . substitute(a:value, "'", "''", "g") . "'" + return 1 + endif + return 0 +endfunction + +"SECTION: Init variable calls and other random constants {{{2 +call s:initVariable("g:NERDTreeAutoCenter", 1) +call s:initVariable("g:NERDTreeAutoCenterThreshold", 3) +call s:initVariable("g:NERDTreeCaseSensitiveSort", 0) +call s:initVariable("g:NERDTreeNaturalSort", 0) +call s:initVariable("g:NERDTreeSortHiddenFirst", 1) +call s:initVariable("g:NERDTreeChDirMode", 0) +call s:initVariable("g:NERDTreeCreatePrefix", "silent") +call s:initVariable("g:NERDTreeMinimalUI", 0) +if !exists("g:NERDTreeIgnore") + let g:NERDTreeIgnore = ['\~$'] +endif +call s:initVariable("g:NERDTreeBookmarksFile", expand('$HOME') . '/.NERDTreeBookmarks') +call s:initVariable("g:NERDTreeBookmarksSort", 1) +call s:initVariable("g:NERDTreeHighlightCursorline", 1) +call s:initVariable("g:NERDTreeHijackNetrw", 1) +call s:initVariable('g:NERDTreeMarkBookmarks', 1) +call s:initVariable("g:NERDTreeMouseMode", 1) +call s:initVariable("g:NERDTreeNotificationThreshold", 100) +call s:initVariable("g:NERDTreeQuitOnOpen", 0) +call s:initVariable("g:NERDTreeRespectWildIgnore", 0) +call s:initVariable("g:NERDTreeShowBookmarks", 0) +call s:initVariable("g:NERDTreeShowFiles", 1) +call s:initVariable("g:NERDTreeShowHidden", 0) +call s:initVariable("g:NERDTreeShowLineNumbers", 0) +call s:initVariable("g:NERDTreeSortDirs", 1) + +if !nerdtree#runningWindows() && !nerdtree#runningCygwin() + call s:initVariable("g:NERDTreeDirArrowExpandable", "▸") + call s:initVariable("g:NERDTreeDirArrowCollapsible", "▾") +else + call s:initVariable("g:NERDTreeDirArrowExpandable", "+") + call s:initVariable("g:NERDTreeDirArrowCollapsible", "~") +endif +call s:initVariable("g:NERDTreeCascadeOpenSingleChildDir", 1) +call s:initVariable("g:NERDTreeCascadeSingleChildDir", 1) + +if !exists("g:NERDTreeSortOrder") + let g:NERDTreeSortOrder = ['\/$', '*', '\.swp$', '\.bak$', '\~$'] +endif +let g:NERDTreeOldSortOrder = [] + +call s:initVariable("g:NERDTreeGlyphReadOnly", "RO") + +" ASCII 160: non-breaking space used to delimit items in the tree's nodes. +call s:initVariable("g:NERDTreeNodeDelimiter", "\u00a0") + +if !exists('g:NERDTreeStatusline') + + "the exists() crap here is a hack to stop vim spazzing out when + "loading a session that was created with an open nerd tree. It spazzes + "because it doesnt store b:NERDTree(its a b: var, and its a hash) + let g:NERDTreeStatusline = "%{exists('b:NERDTree')?b:NERDTree.root.path.str():''}" + +endif +call s:initVariable("g:NERDTreeWinPos", "left") +call s:initVariable("g:NERDTreeWinSize", 31) + +"init the shell commands that will be used to copy nodes, and remove dir trees +" +"Note: the space after the command is important +if nerdtree#runningWindows() + call s:initVariable("g:NERDTreeRemoveDirCmd", 'rmdir /s /q ') + call s:initVariable("g:NERDTreeCopyDirCmd", 'xcopy /s /e /i /y /q ') + call s:initVariable("g:NERDTreeCopyFileCmd", 'copy /y ') +else + call s:initVariable("g:NERDTreeRemoveDirCmd", 'rm -rf ') + call s:initVariable("g:NERDTreeCopyCmd", 'cp -r ') +endif + + +"SECTION: Init variable calls for key mappings {{{2 +call s:initVariable("g:NERDTreeMapActivateNode", "o") +call s:initVariable("g:NERDTreeMapChangeRoot", "C") +call s:initVariable("g:NERDTreeMapChdir", "cd") +call s:initVariable("g:NERDTreeMapCloseChildren", "X") +call s:initVariable("g:NERDTreeMapCloseDir", "x") +call s:initVariable("g:NERDTreeMapDeleteBookmark", "D") +call s:initVariable("g:NERDTreeMapMenu", "m") +call s:initVariable("g:NERDTreeMapHelp", "?") +call s:initVariable("g:NERDTreeMapJumpFirstChild", "K") +call s:initVariable("g:NERDTreeMapJumpLastChild", "J") +call s:initVariable("g:NERDTreeMapJumpNextSibling", "") +call s:initVariable("g:NERDTreeMapJumpParent", "p") +call s:initVariable("g:NERDTreeMapJumpPrevSibling", "") +call s:initVariable("g:NERDTreeMapJumpRoot", "P") +call s:initVariable("g:NERDTreeMapOpenExpl", "e") +call s:initVariable("g:NERDTreeMapOpenInTab", "t") +call s:initVariable("g:NERDTreeMapOpenInTabSilent", "T") +call s:initVariable("g:NERDTreeMapOpenRecursively", "O") +call s:initVariable("g:NERDTreeMapOpenSplit", "i") +call s:initVariable("g:NERDTreeMapOpenVSplit", "s") +call s:initVariable("g:NERDTreeMapPreview", "g" . NERDTreeMapActivateNode) +call s:initVariable("g:NERDTreeMapPreviewSplit", "g" . NERDTreeMapOpenSplit) +call s:initVariable("g:NERDTreeMapPreviewVSplit", "g" . NERDTreeMapOpenVSplit) +call s:initVariable("g:NERDTreeMapQuit", "q") +call s:initVariable("g:NERDTreeMapRefresh", "r") +call s:initVariable("g:NERDTreeMapRefreshRoot", "R") +call s:initVariable("g:NERDTreeMapToggleBookmarks", "B") +call s:initVariable("g:NERDTreeMapToggleFiles", "F") +call s:initVariable("g:NERDTreeMapToggleFilters", "f") +call s:initVariable("g:NERDTreeMapToggleHidden", "I") +call s:initVariable("g:NERDTreeMapToggleZoom", "A") +call s:initVariable("g:NERDTreeMapUpdir", "u") +call s:initVariable("g:NERDTreeMapUpdirKeepOpen", "U") +call s:initVariable("g:NERDTreeMapCWD", "CD") + +"SECTION: Load class files{{{2 +call nerdtree#loadClassFiles() + +" SECTION: Commands {{{1 +"============================================================ +call nerdtree#ui_glue#setupCommands() + +" SECTION: Auto commands {{{1 +"============================================================ +augroup NERDTree + "Save the cursor position whenever we close the nerd tree + exec "autocmd BufLeave ". g:NERDTreeCreator.BufNamePrefix() ."* if g:NERDTree.IsOpen() | call b:NERDTree.ui.saveScreenState() | endif" + + "disallow insert mode in the NERDTree + exec "autocmd BufEnter ". g:NERDTreeCreator.BufNamePrefix() ."* stopinsert" +augroup END + +if g:NERDTreeHijackNetrw + augroup NERDTreeHijackNetrw + autocmd VimEnter * silent! autocmd! FileExplorer + au BufEnter,VimEnter * call nerdtree#checkForBrowse(expand("")) + augroup END +endif + +" SECTION: Public API {{{1 +"============================================================ +function! NERDTreeAddMenuItem(options) + call g:NERDTreeMenuItem.Create(a:options) +endfunction + +function! NERDTreeAddMenuSeparator(...) + let opts = a:0 ? a:1 : {} + call g:NERDTreeMenuItem.CreateSeparator(opts) +endfunction + +function! NERDTreeAddSubmenu(options) + return g:NERDTreeMenuItem.Create(a:options) +endfunction + +function! NERDTreeAddKeyMap(options) + call g:NERDTreeKeyMap.Create(a:options) +endfunction + +function! NERDTreeRender() + call nerdtree#renderView() +endfunction + +function! NERDTreeFocus() + if g:NERDTree.IsOpen() + call g:NERDTree.CursorToTreeWin() + else + call g:NERDTreeCreator.ToggleTabTree("") + endif +endfunction + +function! NERDTreeCWD() + + if empty(getcwd()) + call nerdtree#echoWarning('current directory does not exist') + return + endif + + try + let l:cwdPath = g:NERDTreePath.New(getcwd()) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echoWarning('current directory does not exist') + return + endtry + + call NERDTreeFocus() + + if b:NERDTree.root.path.equals(l:cwdPath) + return + endif + + let l:newRoot = g:NERDTreeFileNode.New(l:cwdPath, b:NERDTree) + call b:NERDTree.changeRoot(l:newRoot) + normal! ^ +endfunction + +function! NERDTreeAddPathFilter(callback) + call g:NERDTree.AddPathFilter(a:callback) +endfunction + +" SECTION: Post Source Actions {{{1 +call nerdtree#postSourceActions() + +"reset &cpo back to users setting +let &cpo = s:old_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/plugin/asyncrun.vim b/plugin/asyncrun.vim new file mode 100644 index 0000000..84449f6 --- /dev/null +++ b/plugin/asyncrun.vim @@ -0,0 +1,1118 @@ +" asyncrun.vim - Run shell commands in background and output to quickfix +" +" Maintainer: skywind3000 (at) gmail.com +" Homepage: http://www.vim.org/scripts/script.php?script_id=5431 +" +" Last change: 2016.12.23 +" +" Run shell command in background and output to quickfix: +" :AsyncRun[!] [options] {cmd} ... +" +" when "!" is included, auto-scroll in quickfix will be disabled +" parameters are splited by space, if a parameter contains space, +" it should be quoted or escaped as backslash + space (unix only). +" +" Parameters will be expanded if they start with '%', '#' or '<' : +" %:p - File name of current buffer with full path +" %:t - File name of current buffer without path +" %:p:h - File path of current buffer without file name +" %:e - File extension of current buffer +" %:t:r - File name of current buffer without path and extension +" % - File name relativize to current directory +" %:h:. - File path relativize to current directory +" - Current directory +" - Current word under cursor +" - Current file name under cursor +" +" Environment variables are set before executing: +" $VIM_FILEPATH - File name of current buffer with full path +" $VIM_FILENAME - File name of current buffer without path +" $VIM_FILEDIR - Full path of current buffer without the file name +" $VIM_FILEEXT - File extension of current buffer +" $VIM_FILENOEXT - File name of current buffer without path and extension +" $VIM_CWD - Current directory +" $VIM_RELDIR - File path relativize to current directory +" $VIM_RELNAME - File name relativize to current directory +" $VIM_CWORD - Current word under cursor +" $VIM_CFILE - Current filename under cursor +" $VIM_GUI - Is running under gui ? +" $VIM_VERSION - Value of v:version +" $VIM_MODE - Execute via 0:!, 1:makeprg, 2:system(), 3:silent +" $VIM_COLUMNS - How many columns in vim's screen +" $VIM_LINES - How many lines in vim's screen +" +" parameters also accept these environment variables wrapped by +" "$(...)", and "$(VIM_FILEDIR)" will be expanded as file directory +" +" There can be some options before [cmd]: +" -mode=0/1/2 - start mode: 0(async, default), 1(makeprg), 2(!) +" -cwd=? - initial directory, (use current directory if unset) +" -save=0/1 - non-zero to save unsaved files before executing +" -program=? - set to 'make' to use '&makeprg' +" +" All options must start with a minus and position **before** `[cmd]`. +" Since no shell command starts with a minus. So they can be +" distinguished from shell command easily without any ambiguity. +" +" Stop the running job by signal TERM: +" :AsyncStop[!] +" +" when "!" is included, job will be stopped by signal KILL +" +" Settings: +" g:asyncrun_exit - script will be executed after finished +" g:asyncrun_bell - non-zero to ring a bell after finished +" g:asyncrun_mode - 0:async(require vim 7.4.1829) 1:sync 2:shell +" g:asyncrun_encs - shell program output encoding +" +" Variables: +" g:asyncrun_code - exit code +" g:asyncrun_status - 'running', 'success' or 'failure' +" +" Requirements: +" vim 7.4.1829 is minimal version to support async mode +" +" Examples: +" :AsyncRun gcc % -o %< +" :AsyncRun make -f Mymakefile +" :AsyncRun! grep -R . +" :noremap :AsyncRun gcc % -o %< +" +" Additional: +" AsyncRun uses quickfix window to show job outputs, in order to +" see the outputs in realtime, you need open quickfix window at +" first by using :copen (see :help copen/cclose). Or use +" ':call asyncrun#quickfix_toggle(8)' to open/close it rapidly. +" + +"---------------------------------------------------------------------- +"- Global Settings & Variables +"---------------------------------------------------------------------- +if !exists('g:asyncrun_exit') + let g:asyncrun_exit = '' +endif + +if !exists('g:asyncrun_bell') + let g:asyncrun_bell = 0 +endif + +if !exists('g:asyncrun_stop') + let g:asyncrun_stop = '' +endif + +if !exists('g:asyncrun_mode') + let g:asyncrun_mode = 0 +endif + +if !exists('g:asyncrun_hook') + let g:asyncrun_hook = '' +endif + +if !exists('g:asyncrun_last') + let g:asyncrun_last = 0 +endif + +if !exists('g:asyncrun_timer') + let g:asyncrun_timer = 25 +endif + +if !exists('g:asyncrun_code') + let g:asyncrun_code = '' +endif + +if !exists('g:asyncrun_status') + let g:asyncrun_status = '' +endif + +if !exists('g:asyncrun_encs') + let g:asyncrun_encs = '' +endif + +if !exists('g:asyncrun_trim') + let g:asyncrun_trim = 0 +endif + +if !exists('g:asyncrun_text') + let g:asyncrun_text = '' +endif + +if !exists('g:asyncrun_local') + let g:asyncrun_local = 1 +endif + +if !exists('g:asyncrun_auto') + let g:asyncrun_auto = '' +endif + +if !exists('g:asyncrun_shell') + let g:asyncrun_shell = '' +endif + +if !exists('g:asyncrun_shellflag') + let g:asyncrun_shellflag = '' +endif + + + +"---------------------------------------------------------------------- +"- Internal Functions +"---------------------------------------------------------------------- + +" error message +function! s:ErrorMsg(msg) + echohl ErrorMsg + echom 'ERROR: '. a:msg + echohl NONE +endfunc + +" show not support message +function! s:NotSupport() + let msg = "required: +timers +channel +job +reltime and vim >= 7.4.1829" + call s:ErrorMsg(msg) +endfunc + +" run autocmd +function! s:AutoCmd(name) + if has('autocmd') + exec 'silent doautocmd User AsyncRun'.a:name + endif +endfunc + +let s:asyncrun_windows = 0 +let g:asyncrun_windows = 0 +let s:asyncrun_support = 0 +let g:asyncrun_support = 0 + +" check running in windows +if has('win32') || has('win64') || has('win95') || has('win16') + let s:asyncrun_windows = 1 + let g:asyncrun_windows = 1 +endif + +" check has advanced mode +if (v:version >= 800 || has('patch-7.4.1829')) && (!has('nvim')) + if has('job') && has('channel') && has('timers') && has('reltime') + let s:asyncrun_support = 1 + let g:asyncrun_support = 1 + endif +elseif has('nvim') + let s:asyncrun_support = 1 + let g:asyncrun_support = 1 +endif + + +"---------------------------------------------------------------------- +"- build in background +"---------------------------------------------------------------------- +let s:async_nvim = has('nvim')? 1 : 0 +let s:async_info = { 'text':"", 'post':'', 'postsave':'' } +let s:async_output = {} +let s:async_head = 0 +let s:async_tail = 0 +let s:async_code = 0 +let s:async_state = 0 +let s:async_start = 0.0 +let s:async_debug = 0 +let s:async_quick = 0 +let s:async_scroll = 0 +let s:async_hold = 0 +let s:async_congest = 0 +let s:async_efm = &errorformat + +" check :cbottom available, cursor in quick need to hold ? +if s:async_nvim == 0 + let s:async_quick = (v:version >= 800 || has('patch-7.4.1997'))? 1 : 0 + let s:async_hold = (v:version >= 800 || has('patch-7.4.2100'))? 0 : 1 +else + let s:async_quick = 0 + let s:async_hold = 1 +endif + +" check if we have vim 8.0.100 +if s:async_nvim == 0 && v:version >= 800 + let s:async_congest = has('patch-8.0.100')? 1 : 0 + let s:async_congest = 0 +endif + +" scroll quickfix down +function! s:AsyncRun_Job_Scroll() + if &buftype == 'quickfix' + silent exec 'normal! G' + endif +endfunc + +" quickfix window cursor check +function! s:AsyncRun_Job_Cursor() + if &buftype == 'quickfix' + if s:async_hold != 0 + let w:asyncrun_qfview = winsaveview() + endif + if line('.') != line('$') + let s:async_check_last = 0 + endif + endif +endfunc + +" find quickfix window and scroll to the bottom then return last window +function! s:AsyncRun_Job_AutoScroll() + if s:async_quick == 0 + let l:winnr = winnr() + noautocmd windo call s:AsyncRun_Job_Scroll() + noautocmd silent exec ''.l:winnr.'wincmd w' + else + cbottom + endif +endfunc + +" restore view in old vim/neovim +function! s:AsyncRun_Job_ViewReset() + if &buftype == 'quickfix' + if exists('w:asyncrun_qfview') + call winrestview(w:asyncrun_qfview) + unlet w:asyncrun_qfview + endif + endif +endfunc + +" it will reset cursor when caddexpr is invoked +function! s:AsyncRun_Job_QuickReset() + if &buftype == 'quickfix' + call s:AsyncRun_Job_ViewReset() + else + let l:winnr = winnr() + noautocmd windo call s:AsyncRun_Job_ViewReset() + noautocmd silent! exec ''.l:winnr.'wincmd w' + endif +endfunc + +" check if quickfix window can scroll now +function! s:AsyncRun_Job_CheckScroll() + if g:asyncrun_last == 0 + if &buftype == 'quickfix' + if s:async_hold != 0 + let w:asyncrun_qfview = winsaveview() + endif + return (line('.') == line('$')) + else + return 1 + endif + elseif g:asyncrun_last == 1 + let s:async_check_last = 1 + let l:winnr = winnr() + noautocmd windo call s:AsyncRun_Job_Cursor() + noautocmd silent! exec ''.l:winnr.'wincmd w' + return s:async_check_last + elseif g:asyncrun_last == 2 + return 1 + else + if &buftype == 'quickfix' + if s:async_hold != 0 + let w:asyncrun_qfview = winsaveview() + endif + return (line('.') == line('$')) + else + return (!pumvisible()) + endif + endif +endfunc + +" invoked on timer or finished +function! s:AsyncRun_Job_Update(count) + let l:iconv = (g:asyncrun_encs != "")? 1 : 0 + let l:count = 0 + let l:total = 0 + let l:empty = [{'text':''}] + let l:check = s:AsyncRun_Job_CheckScroll() + let l:efm1 = &g:efm + let l:efm2 = &l:efm + if g:asyncrun_encs == &encoding + let l:iconv = 0 + endif + if &g:efm != s:async_efm && g:asyncrun_local != 0 + let &l:efm = s:async_efm + let &g:efm = s:async_efm + endif + let l:raw = (s:async_efm == '')? 1 : 0 + while s:async_tail < s:async_head + let l:text = s:async_output[s:async_tail] + if l:iconv != 0 + try + let l:text = iconv(l:text, g:asyncrun_encs, &encoding) + catch /.*/ + endtry + endif + if l:text != '' + if l:raw == 0 + caddexpr l:text + else + call setqflist([{'text':l:text}], 'a') + endif + elseif g:asyncrun_trim == 0 + call setqflist(l:empty, 'a') + endif + let l:total += 1 + unlet s:async_output[s:async_tail] + let s:async_tail += 1 + let l:count += 1 + if a:count > 0 && l:count >= a:count + break + endif + endwhile + if g:asyncrun_local != 0 + if l:efm1 != &g:efm | let &g:efm = l:efm1 | endif + if l:efm2 != &l:efm | let &l:efm = l:efm2 | endif + endif + if s:async_scroll != 0 && l:total > 0 && l:check != 0 + call s:AsyncRun_Job_AutoScroll() + elseif s:async_hold != 0 + call s:AsyncRun_Job_QuickReset() + endif + return l:count +endfunc + +" trigger autocmd +function! s:AsyncRun_Job_AutoCmd(mode, auto) + if !has('autocmd') | return | endif + let name = (a:auto == '')? g:asyncrun_auto : a:auto + if name !~ '^\w\+$' || name == 'NONE' || name == '' + return + endif + if a:mode == 0 + silent exec 'doautocmd QuickFixCmdPre '. name + else + silent exec 'doautocmd QuickFixCmdPost '. name + endif +endfunc + +" invoked on timer +function! g:AsyncRun_Job_OnTimer(id) + let limit = (g:asyncrun_timer < 10)? 10 : g:asyncrun_timer + " check on command line window + if &ft == 'vim' && &buftype == 'nofile' + return + endif + if s:async_nvim == 0 + if exists('s:async_job') + call job_status(s:async_job) + endif + endif + call s:AsyncRun_Job_Update(limit) + if and(s:async_state, 7) == 7 + if s:async_head == s:async_tail + call s:AsyncRun_Job_OnFinish() + endif + endif +endfunc + +" invoked on "callback" when job output +function! s:AsyncRun_Job_OnCallback(channel, text) + if !exists("s:async_job") + return + endif + if type(a:text) != 1 + return + endif + let s:async_output[s:async_head] = a:text + let s:async_head += 1 + if s:async_congest != 0 + call s:AsyncRun_Job_Update(-1) + endif +endfunc + +" because exit_cb and close_cb are disorder, we need OnFinish to guarantee +" both of then have already invoked +function! s:AsyncRun_Job_OnFinish() + " caddexpr '(OnFinish): '.a:what.' '.s:async_state + if s:async_state == 0 + return -1 + endif + if exists('s:async_job') + unlet s:async_job + endif + if exists('s:async_timer') + call timer_stop(s:async_timer) + unlet s:async_timer + endif + call s:AsyncRun_Job_Update(-1) + let l:current = float2nr(reltimefloat(reltime())) + let l:last = l:current - s:async_start + let l:check = s:AsyncRun_Job_CheckScroll() + if s:async_code == 0 + let l:text = "[Finished in ".l:last." seconds]" + call setqflist([{'text':l:text}], 'a') + let g:asyncrun_status = "success" + else + let l:text = 'with code '.s:async_code + let l:text = "[Finished in ".l:last." seconds ".l:text."]" + call setqflist([{'text':l:text}], 'a') + let g:asyncrun_status = "failure" + endif + let s:async_state = 0 + if s:async_scroll != 0 && l:check != 0 + call s:AsyncRun_Job_AutoScroll() + elseif s:async_hold != 0 + call s:AsyncRun_Job_QuickReset() + endif + let g:asyncrun_code = s:async_code + if g:asyncrun_bell != 0 + exec "norm! \" + endif + if s:async_info.post != '' + exec s:async_info.post + let s:async_info.post = '' + endif + if g:asyncrun_exit != "" + exec g:asyncrun_exit + endif + call s:AsyncRun_Job_AutoCmd(1, s:async_info.auto) + call s:AutoCmd('Stop') + redrawstatus! + redraw +endfunc + +" invoked on "close_cb" when channel closed +function! s:AsyncRun_Job_OnClose(channel) + " caddexpr "[close]" + let s:async_debug = 1 + let l:limit = 128 + let l:options = {'timeout':0} + while ch_status(a:channel) == 'buffered' + let l:text = ch_read(a:channel, l:options) + if l:text == '' " important when child process is killed + let l:limit -= 1 + if l:limit < 0 | break | endif + else + call s:AsyncRun_Job_OnCallback(a:channel, l:text) + endif + endwhile + let s:async_debug = 0 + if exists('s:async_job') + call job_status(s:async_job) + endif + let s:async_state = or(s:async_state, 4) +endfunc + +" invoked on "exit_cb" when job exited +function! s:AsyncRun_Job_OnExit(job, message) + " caddexpr "[exit]: ".a:message." ".type(a:message) + let s:async_code = a:message + let s:async_state = or(s:async_state, 2) +endfunc + +" invoked on neovim when stderr/stdout/exit +function! s:AsyncRun_Job_NeoVim(job_id, data, event) + if a:event == 'stdout' || a:event == 'stderr' + let l:index = 0 + let l:size = len(a:data) + while l:index < l:size + let s:text = a:data[l:index] + if s:asyncrun_windows != 0 + let s:text = substitute(s:text, '\r$', '', 'g') + endif + let s:async_output[s:async_head] = s:text + let s:async_head += 1 + let l:index += 1 + endwhile + elseif a:event == 'exit' + if type(a:data) == type(1) + let s:async_code = a:data + endif + let s:async_state = or(s:async_state, 6) + endif +endfunc + + +"---------------------------------------------------------------------- +" AsyncRun Interface +"---------------------------------------------------------------------- + +" start background build +function! s:AsyncRun_Job_Start(cmd) + let l:running = 0 + let l:empty = 0 + if s:asyncrun_support == 0 + call s:NotSupport() + return -1 + endif + if exists('s:async_job') + if !has('nvim') + if job_status(s:async_job) == 'run' + let l:running = 1 + endif + else + if s:async_job > 0 + let l:running = 1 + endif + endif + endif + if type(a:cmd) == 1 + if a:cmd == '' | let l:empty = 1 | endif + elseif type(a:cmd) == 3 + if a:cmd == [] | let l:empty = 1 | endif + endif + if s:async_state != 0 || l:running != 0 + call s:ErrorMsg("background job is still running") + return -2 + endif + if l:empty != 0 + call s:ErrorMsg("empty arguments") + return -3 + endif + if g:asyncrun_shell == '' + if !executable(&shell) + let l:text = "invalid config in &shell and &shellcmdflag" + call s:ErrorMsg(l:text . ", &shell must be an executable.") + return -4 + endif + let l:args = [&shell, &shellcmdflag] + else + if !executable(g:asyncrun_shell) + let l:text = "invalid config in g:asyncrun_shell" + call s:ErrorMsg(l:text . ", it must be an executable.") + return -4 + endif + let l:args = [g:asyncrun_shell, g:asyncrun_shellflag] + endif + let l:name = [] + if type(a:cmd) == 1 + let l:name = a:cmd + if s:asyncrun_windows == 0 + let l:args += [a:cmd] + else + let l:tmp = fnamemodify(tempname(), ':h') . '\asyncrun.cmd' + let l:run = ['@echo off', a:cmd] + call writefile(l:run, l:tmp) + let l:args += [l:tmp] + endif + elseif type(a:cmd) == 3 + if s:asyncrun_windows == 0 + let l:temp = [] + for l:item in a:cmd + if index(['|', '`'], l:item) < 0 + let l:temp += [fnameescape(l:item)] + else + let l:temp += ['|'] + endif + endfor + let l:args += [join(l:temp, ' ')] + else + let l:args += a:cmd + endif + let l:vector = [] + for l:x in a:cmd + let l:vector += ['"'.l:x.'"'] + endfor + let l:name = join(l:vector, ', ') + endif + let s:async_efm = &errorformat + call s:AutoCmd('Pre') + if s:async_nvim == 0 + let l:options = {} + let l:options['callback'] = function('s:AsyncRun_Job_OnCallback') + let l:options['close_cb'] = function('s:AsyncRun_Job_OnClose') + let l:options['exit_cb'] = function('s:AsyncRun_Job_OnExit') + let l:options['out_io'] = 'pipe' + let l:options['err_io'] = 'out' + let l:options['in_io'] = 'null' + let l:options['out_mode'] = 'nl' + let l:options['err_mode'] = 'nl' + let l:options['stoponexit'] = 'term' + if g:asyncrun_stop != '' + let l:options['stoponexit'] = g:asyncrun_stop + endif + let s:async_job = job_start(l:args, l:options) + let l:success = (job_status(s:async_job) != 'fail')? 1 : 0 + else + let l:callbacks = {'shell': 'AsyncRun'} + let l:callbacks['on_stdout'] = function('s:AsyncRun_Job_NeoVim') + let l:callbacks['on_stderr'] = function('s:AsyncRun_Job_NeoVim') + let l:callbacks['on_exit'] = function('s:AsyncRun_Job_NeoVim') + let s:async_job = jobstart(l:args, l:callbacks) + let l:success = (s:async_job > 0)? 1 : 0 + endif + if l:success != 0 + let s:async_output = {} + let s:async_head = 0 + let s:async_tail = 0 + let l:arguments = "[".l:name."]" + let l:title = ':AsyncRun '.l:name + if s:async_nvim == 0 + if v:version >= 800 || has('patch-7.4.2210') + call setqflist([], ' ', {'title':l:title}) + else + call setqflist([], '') + endif + else + call setqflist([], ' ', l:title) + endif + call setqflist([{'text':l:arguments}], 'a') + let s:async_start = float2nr(reltimefloat(reltime())) + let l:name = 'g:AsyncRun_Job_OnTimer' + let s:async_timer = timer_start(100, l:name, {'repeat':-1}) + let s:async_state = 1 + let g:asyncrun_status = "running" + let s:async_info.post = s:async_info.postsave + let s:async_info.auto = s:async_info.autosave + let s:async_info.postsave = '' + let s:async_info.autosave = '' + let g:asyncrun_text = s:async_info.text + call s:AsyncRun_Job_AutoCmd(0, s:async_info.auto) + call s:AutoCmd('Start') + redrawstatus! + else + unlet s:async_job + call s:ErrorMsg("Background job start failed '".a:cmd."'") + redrawstatus! + return -5 + endif + return 0 +endfunc + + +" stop background job +function! s:AsyncRun_Job_Stop(how) + let l:how = (a:how != '')? a:how : 'term' + if s:asyncrun_support == 0 + call s:NotSupport() + return -1 + endif + while s:async_head > s:async_tail + let s:async_head -= 1 + unlet s:async_output[s:async_head] + endwhile + if exists('s:async_job') + if s:async_nvim == 0 + if job_status(s:async_job) == 'run' + if job_stop(s:async_job, l:how) + return 0 + else + return -2 + endif + else + return -3 + endif + else + if s:async_job > 0 + call jobstop(s:async_job) + endif + endif + else + return -4 + endif + return 0 +endfunc + + +" get job status +function! s:AsyncRun_Job_Status() + if exists('s:async_job') + if s:async_nvim == 0 + return job_status(s:async_job) + else + return 'run' + endif + else + return 'none' + endif +endfunc + + + +"---------------------------------------------------------------------- +" Utilities +"---------------------------------------------------------------------- + +" Replace string +function! s:StringReplace(text, old, new) + let l:data = split(a:text, a:old, 1) + return join(l:data, a:new) +endfunc + +" Trim leading and tailing spaces +function! s:StringStrip(text) + return substitute(a:text, '^\s*\(.\{-}\)\s*$', '\1', '') +endfunc + +" extract options from command +function! s:ExtractOpt(command) + let cmd = a:command + let opts = {} + while cmd =~# '^-\%(\w\+\)\%([= ]\|$\)' + let opt = matchstr(cmd, '^-\zs\w\+') + if cmd =~ '^-\w\+=' + let val = matchstr(cmd, '^-\w\+=\zs\%(\\.\|\S\)*') + else + let val = (opt == 'cwd')? '' : 1 + endif + let opts[opt] = substitute(val, '\\\(\s\)', '\1', 'g') + let cmd = substitute(cmd, '^-\w\+\%(=\%(\\.\|\S\)*\)\=\s*', '', '') + endwhile + let cmd = substitute(cmd, '^\s*\(.\{-}\)\s*$', '\1', '') + let cmd = substitute(cmd, '^@\s*', '', '') + let opts.cwd = get(opts, 'cwd', '') + let opts.mode = get(opts, 'mode', '') + let opts.save = get(opts, 'save', '') + let opts.program = get(opts, 'program', '') + let opts.post = get(opts, 'post', '') + let opts.text = get(opts, 'text', '') + let opts.auto = get(opts, 'auto', '') + if 0 + echom 'cwd:'. opts.cwd + echom 'mode:'. opts.mode + echom 'save:'. opts.save + echom 'program:'. opts.program + echom 'command:'. cmd + endif + return [cmd, opts] +endfunc + +" write script to a file and return filename +function! s:ScriptWrite(command, pause) + let l:tmp = fnamemodify(tempname(), ':h') . '\asyncrun.cmd' + if s:asyncrun_windows != 0 + let l:line = ['@echo off', 'call '.a:command] + if a:pause != 0 + let l:line += ['pause'] + endif + else + let l:line = ['#! '.&shell] + let l:line += [a:command] + if a:pause != 0 + let l:line += ['read -n1 -rsp "press any key to confinue ..."'] + endif + let l:tmp = tempname() + endif + if v:version >= 700 + call writefile(l:line, l:tmp) + else + exe 'redir ! > '.fnameescape(l:tmp) + for l:index in range(len(l:line)) + silent echo l:line[l:index] + endfor + redir END + endif + return l:tmp +endfunc + + +"---------------------------------------------------------------------- +" asyncrun - run +"---------------------------------------------------------------------- +function! asyncrun#run(bang, opts, args) + let l:macros = {} + let l:macros['VIM_FILEPATH'] = expand("%:p") + let l:macros['VIM_FILENAME'] = expand("%:t") + let l:macros['VIM_FILEDIR'] = expand("%:p:h") + let l:macros['VIM_FILENOEXT'] = expand("%:t:r") + let l:macros['VIM_FILEEXT'] = "." . expand("%:e") + let l:macros['VIM_CWD'] = getcwd() + let l:macros['VIM_RELDIR'] = expand("%:h:.") + let l:macros['VIM_RENAME'] = expand("%:p:.") + let l:macros['VIM_CWORD'] = expand("") + let l:macros['VIM_CFILE'] = expand("") + let l:macros['VIM_VERSION'] = ''.v:version + let l:macros['VIM_SVRNAME'] = v:servername + let l:macros['VIM_COLUMNS'] = ''.&columns + let l:macros['VIM_LINES'] = ''.&lines + let l:macros['VIM_GUI'] = has('gui_running')? 1 : 0 + let l:macros[''] = getcwd() + let l:command = s:StringStrip(a:args) + let cd = haslocaldir()? 'lcd ' : 'cd ' + let l:retval = '' + + " extract options + let [l:command, l:opts] = s:ExtractOpt(l:command) + + " replace macros and setup environment variables + for [l:key, l:val] in items(l:macros) + let l:replace = (l:key[0] != '<')? '$('.l:key.')' : l:key + if l:key[0] != '<' + exec 'let $'.l:key.' = l:val' + endif + let l:command = s:StringReplace(l:command, l:replace, l:val) + let l:opts.cwd = s:StringReplace(l:opts.cwd, l:replace, l:val) + let l:opts.text = s:StringReplace(l:opts.text, l:replace, l:val) + endfor + + " combine options + if type(a:opts) == type({}) + for [l:key, l:val] in items(a:opts) + let l:opts[l:key] = l:val + endfor + endif + + " check if need to save + let l:save = get(l:opts, 'save', '') + if l:save + try + if l:save == '1' + silent! update + else + silent! wall + endif + catch /.*/ + endtry + endif + + if a:bang == '!' + let s:async_scroll = 0 + else + let s:async_scroll = 1 + endif + + " check mode + let l:mode = g:asyncrun_mode + + if l:opts.mode != '' + let l:mode = l:opts.mode + endif + + " process makeprg/grepprg in -program=? + let l:program = "" + + if l:opts.program == 'make' + let l:program = &makeprg + elseif l:opts.program == 'grep' + let l:program = &grepprg + endif + + if l:program != '' + if l:program =~# '\$\*' + let l:command = s:StringReplace(l:program, '\$\*', l:command) + elseif l:command != '' + let l:command = l:program . ' ' . l:command + else + let l:command = l:program + endif + let l:command = s:StringStrip(l:command) + endif + + if l:command =~ '^\s*$' + echohl ErrorMsg + echom "E471: Command required" + echohl NONE + return + endif + + if l:mode >= 10 + let l:opts.cmd = l:command + let l:opts.mode = l:mode + if g:asyncrun_hook != '' + exec 'call '. g:asyncrun_hook .'(l:opts)' + endif + return + endif + + if l:opts.cwd != '' + let l:opts.savecwd = getcwd() + try + silent exec cd . fnameescape(l:opts.cwd) + catch /.*/ + echohl ErrorMsg + echom "E344: Can't find directory \"".l:opts.cwd."\" in -cwd" + echohl NONE + return + endtry + endif + + if l:mode == 0 && s:asyncrun_support != 0 + let s:async_info.postsave = opts.post + let s:async_info.autosave = opts.auto + let s:async_info.text = opts.text + if s:AsyncRun_Job_Start(l:command) != 0 + call s:AutoCmd('Error') + endif + elseif l:mode <= 1 && has('quickfix') + call s:AutoCmd('Pre') + call s:AutoCmd('Start') + let l:makesave = &l:makeprg + let l:script = s:ScriptWrite(l:command, 0) + if s:asyncrun_windows != 0 + let &l:makeprg = shellescape(l:script) + else + let &l:makeprg = 'source '. shellescape(l:script) + endif + if has('autocmd') + call s:AsyncRun_Job_AutoCmd(0, opts.auto) + exec "noautocmd make!" + call s:AsyncRun_Job_AutoCmd(1, opts.auto) + else + exec "make!" + endif + let &l:makeprg = l:makesave + if s:asyncrun_windows == 0 + try | call delete(l:script) | catch | endtry + endif + let g:asyncrun_text = opts.text + if opts.post != '' + exec opts.post + endif + call s:AutoCmd('Stop') + elseif l:mode <= 2 + call s:AutoCmd('Pre') + call s:AutoCmd('Start') + exec '!'. escape(l:command, '%#') + let g:asyncrun_text = opts.text + if opts.post != '' + exec opts.post + endif + call s:AutoCmd('Stop') + elseif l:mode == 3 + if s:asyncrun_windows != 0 && has('python') + let l:script = s:ScriptWrite(l:command, 0) + py import subprocess, vim + py argv = {'args': vim.eval('l:script'), 'shell': True} + py argv['stdout'] = subprocess.PIPE + py argv['stderr'] = subprocess.STDOUT + py p = subprocess.Popen(**argv) + py text = p.stdout.read() + py p.stdout.close() + py p.wait() + if has('patch-7.4.145') + let l:retval = pyeval('text') + else + py text = text.replace('\\', '\\\\').replace('"', '\\"') + py text = text.replace('\n', '\\n').replace('\r', '\\r') + py vim.command('let l:retval = "%s"'%text) + endif + elseif s:asyncrun_windows != 0 && has('python3') + let l:script = s:ScriptWrite(l:command, 0) + py3 import subprocess, vim + py3 argv = {'args': vim.eval('l:script'), 'shell': True} + py3 argv['stdout'] = subprocess.PIPE + py3 argv['stderr'] = subprocess.STDOUT + py3 p = subprocess.Popen(**argv) + py3 text = p.stdout.read() + py3 p.stdout.close() + py3 p.wait() + if has('patch-7.4.145') + let l:retval = py3eval('text') + else + py3 text = text.replace('\\', '\\\\').replace('"', '\\"') + py3 text = text.replace('\n', '\\n').replace('\r', '\\r') + py3 vim.command('let l:retval = "%s"'%text) + endif + else + let l:retval = system(l:command) + endif + let g:asyncrun_text = opts.text + if opts.post != '' + exec opts.post + endif + elseif l:mode <= 5 + if s:asyncrun_windows != 0 && (has('gui_running') || has('nvim')) + let l:ccc = shellescape(s:ScriptWrite(l:command, 1)) + if l:mode == 4 + silent exec '!start cmd /C '. l:ccc + else + silent exec '!start /b cmd /C '. l:ccc + endif + redraw + else + if l:mode == 4 + exec '!' . escape(l:command, '%#') + else + call system(l:command . ' &') + endif + endif + let g:asyncrun_text = opts.text + if opts.post != '' + exec opts.post + endif + endif + + if l:opts.cwd != '' + silent exec cd fnameescape(l:opts.savecwd) + endif + + return l:retval +endfunc + + +"---------------------------------------------------------------------- +" asyncrun - stop +"---------------------------------------------------------------------- +function! asyncrun#stop(bang) + if a:bang == '' + return s:AsyncRun_Job_Stop('term') + else + return s:AsyncRun_Job_Stop('kill') + endif +endfunc + + + +"---------------------------------------------------------------------- +" asyncrun - status +"---------------------------------------------------------------------- +function! asyncrun#status() + return s:AsyncRun_Job_Status() +endfunc + + + +"---------------------------------------------------------------------- +" asyncrun -version +"---------------------------------------------------------------------- +function! asyncrun#version() + return '1.3.0' +endfunc + + +"---------------------------------------------------------------------- +" Commands +"---------------------------------------------------------------------- +command! -bang -nargs=+ -complete=file AsyncRun + \ call asyncrun#run('', '', ) + +command! -bang -nargs=0 AsyncStop call asyncrun#stop('') + + + +"---------------------------------------------------------------------- +" Fast command to toggle quickfix +"---------------------------------------------------------------------- +function! asyncrun#quickfix_toggle(size, ...) + let l:mode = (a:0 == 0)? 2 : (a:1) + function! s:WindowCheck(mode) + if &buftype == 'quickfix' + let s:quickfix_open = 1 + return + endif + if a:mode == 0 + let w:quickfix_save = winsaveview() + else + if exists('w:quickfix_save') + call winrestview(w:quickfix_save) + unlet w:quickfix_save + endif + endif + endfunc + let s:quickfix_open = 0 + let l:winnr = winnr() + noautocmd windo call s:WindowCheck(0) + noautocmd silent! exec ''.l:winnr.'wincmd w' + if l:mode == 0 + if s:quickfix_open != 0 + silent! cclose + endif + elseif l:mode == 1 + if s:quickfix_open == 0 + exec 'botright copen '. ((a:size > 0)? a:size : ' ') + wincmd k + endif + elseif l:mode == 2 + if s:quickfix_open == 0 + exec 'botright copen '. ((a:size > 0)? a:size : ' ') + wincmd k + else + silent! cclose + endif + endif + noautocmd windo call s:WindowCheck(1) + noautocmd silent! exec ''.l:winnr.'wincmd w' +endfunc + + + + diff --git a/plugin/buffergator.vim b/plugin/buffergator.vim new file mode 100644 index 0000000..70a269c --- /dev/null +++ b/plugin/buffergator.vim @@ -0,0 +1,132 @@ +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +"" Buffergator +"" +"" Vim document buffer navigation utility +"" +"" Copyright 2011 Jeet Sukumaran. +"" +"" 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. +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +" Reload and Compatibility Guard <>FOLD>> + +" Global MRU Initialization <')) +autocmd BufRead * call BuffergatorUpdateMRU(expand('')) +autocmd BufNewFile * call BuffergatorUpdateMRU(expand('')) +autocmd BufWritePost * call BuffergatorUpdateMRU(expand('')) +augroup NONE + +" >>FOLD>> + +" Public Command and Key Maps <") +" command! -nargs=* BuffergatorMruCycleNext :call buffergator#BuffergatorCycleMru(1, "") +" command! -nargs=? -bang BuffergatorMruList :call buffergator#BuffergatorEchoMruList('') + +" if !exists('g:buffergator_suppress_keymaps') || !g:buffergator_suppress_keymaps +" " nnoremap :BuffergatorToggle +" nnoremap b :BuffergatorOpen +" nnoremap B :BuffergatorClose +" nnoremap t :BuffergatorTabsOpen +" nnoremap to :BuffergatorTabsOpen +" nnoremap tc :BuffergatorTabsClose +" nnoremap T :BuffergatorTabsClose +" if !exists('g:buffergator_suppress_mru_switching_keymaps') || !g:buffergator_suppress_mru_switching_keymaps +" nnoremap :BuffergatorMruCyclePrev +" nnoremap :BuffergatorMruCycleNext +" if !exists('g:buffergator_keep_old_mru_switching_keymaps') || !g:buffergator_keep_old_mru_switching_keymaps +" nnoremap gb :BuffergatorMruCyclePrev +" nnoremap gB :BuffergatorMruCycleNext +" else +" nnoremap [b :BuffergatorMruCyclePrev +" nnoremap ]b :BuffergatorMruCycleNext +" endif +" endif +" if !exists('g:buffergator_suppress_mru_switch_into_splits_keymaps') || !g:buffergator_suppress_mru_switch_into_splits_keymaps +" nnoremap :BuffergatorMruCyclePrev leftabove vert sbuffer +" nnoremap :BuffergatorMruCyclePrev leftabove sbuffer +" nnoremap :BuffergatorMruCyclePrev rightbelow vert sbuffer +" nnoremap :BuffergatorMruCyclePrev rightbelow sbuffer +" nnoremap :BuffergatorMruCycleNext leftabove vert sbuffer +" nnoremap :BuffergatorMruCycleNext leftabove sbuffer +" nnoremap :BuffergatorMruCycleNext rightbelow vert sbuffer +" nnoremap :BuffergatorMruCycleNext rightbelow sbuffer +" endif +" endif + +" >>FOLD>> + +" Restore State <>FOLD>> + +" vim:foldlevel=4: diff --git a/plugin/template.vim b/plugin/template.vim new file mode 100644 index 0000000..b15d1dc --- /dev/null +++ b/plugin/template.vim @@ -0,0 +1,66 @@ +" File: template.vim +" Author: Wonder +" Description: +" Generates template for new files. +" 这里主要根据文件名加载模板, 而不是根据 vim 识别到的文件类型. +" .c 和 .h 文件可能会被识别为相同类型, 显然它们需要不同的模板. +" Rules: +" *先看整个文件名(不含路径), 再看扩展名. +" 例如 main.cc 文件中会定义 main 函数, 其他 .cc 文件则未必然. +" *先看是否有普通的静态模板, 再看是否有动态模板. + +if exists("g:enable_template") && g:enable_template == 1 && exists("g:template_dir") + augroup Template_Generator + autocmd! Template_Generator + autocmd BufNewFile * call Read_template() + augroup END +else + finish +endif + +let s:common_tpl_dir = g:template_dir . "/common" +let s:dynamic_tpl_dir = g:template_dir . "/dynamic" + +function! Read_template() + let filename = expand("%:t") + let extname = expand("%:e") + + " 先检查是否存在[普通的][全名]匹配模板(例如 main.cc). + let common_tpl_file = expand(s:common_tpl_dir . "/full/" . filename) + if filereadable(common_tpl_file) + call Read_template_file(common_tpl_file) + return + endif + + " 再检查是否存在[动态的][全名]匹配模板. + let dynamic_template_generator = expand(s:dynamic_tpl_dir . "/full/" .filename) + if executable(dynamic_template_generator) + call Read_dynamic_template(dynamic_template_generator, filename) + return + endif + + " 再检查是否存在[普通的][后缀]匹配模板. + let common_tpl_file = expand(s:common_tpl_dir . "/ext/" . extname) + if filereadable(common_tpl_file) + call Read_template_file(common_tpl_file) + return + endif + + " 最后检查是否存在[动态的][后缀]匹配模板. + let dynamic_template_generator = expand(s:dynamic_tpl_dir . "/ext/" . extname) + if executable(dynamic_template_generator) + call Read_dynamic_template(dynamic_template_generator, filename) + return + endif +endfunction + +function! Read_template_file(filename) + silent execute "0r " . a:filename +endfunction + +" 读取模板生成器动态生成的模板. +" generator参数指定生成器程序的路径. +" 同时还把文件名传递给生成器. +function! Read_dynamic_template(generator, filename) + silent execute "0r !" . a:generator . " " . a:filename +endfunction diff --git a/syntax/c.vim b/syntax/c.vim new file mode 100644 index 0000000..ca0b1bc --- /dev/null +++ b/syntax/c.vim @@ -0,0 +1,36 @@ +"======================================================== +" Highlight All Function +"======================================================== +syn keyword cSystemCall pid_t pthread_t pthread_mutex_t pthread_cond_t sem_t fd_set libnet_t libnet_ptag_t pcap_t size_t socklen_t +hi def link cSystemCall Type +"======================================================== +" Highlight All Function +"======================================================== +syn match cFunctions display"[a-zA-Z_][a-zA-Z_0-9]\{-1,}\s\{-0,}(\{1}"ms=s,me=e-1 +hi def link cFunctions Special +"======================================================== +" Highlight All Math Operator +"======================================================== +" C math operators +syn match cMathOperator display "[-+/*\%=]" +" C pointer operators +syn match cPointerOperator display "->\|\." +" C logical operators - boolean results +syn match cLogicalOperator display "[!<>]=\=" +syn match cLogicalOperator display "==" +" C bit operators +syn match cBinaryOperator display "\(&\||\|\^\|<<\|>>\)=\=" +syn match cBinaryOperator display "\~" +syn match cBinaryOperatorError display "\~=" +" More C logical operators - highlight in preference to binary +syn match cLogicalOperator display "&&\|||" +syn match cLogicalOperatorError display "\(&&\|||\)=" + +" Math Operator +hi cMathOperator guifg=#3EFFE2 +hi cPointerOperator guifg=#3EFFE2 +hi cLogicalOperator guifg=#3EFFE2 +hi cBinaryOperator guifg=#3EFFE2 +hi cBinaryOperatorError guifg=#3EFFE2 +hi cLogicalOperator guifg=#3EFFE2 +hi cLogicalOperatorError guifg=#3EFFE2 diff --git a/syntax/go.vim b/syntax/go.vim new file mode 100644 index 0000000..1dd7695 --- /dev/null +++ b/syntax/go.vim @@ -0,0 +1,404 @@ +" Copyright 2009 The Go Authors. All rights reserved. +" Use of this source code is governed by a BSD-style +" license that can be found in the LICENSE file. +" +" go.vim: Vim syntax file for Go. +" +" Options: +" There are some options for customizing the highlighting; the recommended +" settings are the default values, but you can write: +" let OPTION_NAME = 0 +" in your ~/.vimrc file to disable particular options. You can also write: +" let OPTION_NAME = 1 +" to enable particular options. +" At present, all options default to on, except highlight of: +" functions, methods, structs, operators, build constraints and interfaces. +" +" - go_highlight_array_whitespace_error +" Highlights white space after "[]". +" - go_highlight_chan_whitespace_error +" Highlights white space around the communications operator that don't follow +" the standard style. +" - go_highlight_extra_types +" Highlights commonly used library types (io.Reader, etc.). +" - go_highlight_space_tab_error +" Highlights instances of tabs following spaces. +" - go_highlight_trailing_whitespace_error +" Highlights trailing white space. +" - go_highlight_string_spellcheck +" Specifies that strings should be spell checked +" - go_highlight_format_strings +" Highlights printf-style operators inside string literals. + +" Quit when a (custom) syntax file was already loaded +if exists("b:current_syntax") + finish +endif + +if !exists("g:go_highlight_array_whitespace_error") + let g:go_highlight_array_whitespace_error = 1 +endif + +if !exists("g:go_highlight_chan_whitespace_error") + let g:go_highlight_chan_whitespace_error = 1 +endif + +if !exists("g:go_highlight_extra_types") + let g:go_highlight_extra_types = 1 +endif + +if !exists("g:go_highlight_space_tab_error") + let g:go_highlight_space_tab_error = 1 +endif + +if !exists("g:go_highlight_trailing_whitespace_error") + let g:go_highlight_trailing_whitespace_error = 1 +endif + +if !exists("g:go_highlight_operators") + let g:go_highlight_operators = 1 "Colben changed to 1 +endif + +if !exists("g:go_highlight_functions") + let g:go_highlight_functions = 1 "Colben changed to 1 +endif + +if !exists("g:go_highlight_methods") + let g:go_highlight_methods = 1 "Colben changed to 1 +endif + +if !exists("g:go_highlight_fields") + let g:go_highlight_fields = 1 "Colben changed to 1 +endif + +if !exists("g:go_highlight_types") + let g:go_highlight_types = 1 "Colben changed to 1 +endif + +if !exists("g:go_highlight_build_constraints") + let g:go_highlight_build_constraints = 1 "Colben changed to 1 +endif + +if !exists("g:go_highlight_string_spellcheck") + let g:go_highlight_string_spellcheck = 1 +endif + +if !exists("g:go_highlight_format_strings") + let g:go_highlight_format_strings = 1 +endif + +if !exists("g:go_highlight_generate_tags") + let g:go_highlight_generate_tags = 1 "Colben changed to 1 +endif + +syn case match + +syn keyword goDirective package import +syn keyword goDeclaration var const + +hi def link goDirective Statement +hi def link goDeclaration Keyword + +" Keywords within functions +syn keyword goStatement defer go goto return break continue fallthrough +syn keyword goConditional if else switch select +syn keyword goLabel case default +syn keyword goRepeat for range + +hi def link goStatement Statement +hi def link goConditional Conditional +hi def link goLabel Label +hi def link goRepeat Repeat + +" Predefined types +syn keyword goType chan map bool string error +syn keyword goSignedInts int int8 int16 int32 int64 rune +syn keyword goUnsignedInts byte uint uint8 uint16 uint32 uint64 uintptr +syn keyword goFloats float32 float64 +syn keyword goComplexes complex64 complex128 + +hi def link goType Type +hi def link goSignedInts Type +hi def link goUnsignedInts Type +hi def link goFloats Type +hi def link goComplexes Type + + +" Predefined functions and values +syn match goBuiltins /\<\v(append|cap|close|complex|copy|delete|imag|len)\ze\(/ +syn match goBuiltins /\<\v(make|new|panic|print|println|real|recover)\ze\(/ +syn keyword goBoolean true false +syn keyword goPredefinedIdentifiers nil iota + +hi def link goBuiltins Keyword +hi def link goBoolean Boolean +hi def link goPredefinedIdentifiers goBoolean + +" Comments; their contents +syn keyword goTodo contained TODO FIXME XXX BUG +syn cluster goCommentGroup contains=goTodo +syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell +syn region goComment start="//" end="$" contains=goGenerate,@goCommentGroup,@Spell + +hi def link goComment Comment +hi def link goTodo Todo + +if g:go_highlight_generate_tags != 0 + syn match goGenerateVariables contained /\(\$GOARCH\|\$GOOS\|\$GOFILE\|\$GOLINE\|\$GOPACKAGE\|\$DOLLAR\)\>/ + syn region goGenerate start="^\s*//go:generate" end="$" contains=goGenerateVariables + hi def link goGenerate PreProc + hi def link goGenerateVariables Special +endif + +" Go escapes +syn match goEscapeOctal display contained "\\[0-7]\{3}" +syn match goEscapeC display contained +\\[abfnrtv\\'"]+ +syn match goEscapeX display contained "\\x\x\{2}" +syn match goEscapeU display contained "\\u\x\{4}" +syn match goEscapeBigU display contained "\\U\x\{8}" +syn match goEscapeError display contained +\\[^0-7xuUabfnrtv\\'"]+ + +hi def link goEscapeOctal goSpecialString +hi def link goEscapeC goSpecialString +hi def link goEscapeX goSpecialString +hi def link goEscapeU goSpecialString +hi def link goEscapeBigU goSpecialString +hi def link goSpecialString Special +hi def link goEscapeError Error + +" Strings and their contents +syn cluster goStringGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU,goEscapeError +if g:go_highlight_string_spellcheck != 0 + syn region goString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup,@Spell + syn region goRawString start=+`+ end=+`+ contains=@Spell +else + syn region goString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup + syn region goRawString start=+`+ end=+`+ +endif + +if g:go_highlight_format_strings != 0 + syn match goFormatSpecifier /\([^%]\(%%\)*\)\@<=%[-#0 +]*\%(\*\|\d\+\)\=\%(\.\%(\*\|\d\+\)\)*[vTtbcdoqxXUeEfgGsp]/ contained containedin=goString + hi def link goFormatSpecifier goSpecialString +endif + +hi def link goString String +hi def link goRawString String + +" Characters; their contents +syn cluster goCharacterGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU +syn region goCharacter start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@goCharacterGroup + +hi def link goCharacter Character + +" Regions +syn region goBlock start="{" end="}" transparent fold +syn region goParen start='(' end=')' transparent + +" Integers +syn match goDecimalInt "\<-\=\d\+\%([Ee][-+]\=\d\+\)\=\>" +syn match goHexadecimalInt "\<-\=0[xX]\x\+\>" +syn match goOctalInt "\<-\=0\o\+\>" +syn match goOctalError "\<-\=0\o*[89]\d*\>" + +hi def link goDecimalInt Integer +hi def link goHexadecimalInt Integer +hi def link goOctalInt Integer +hi def link goOctalError Error +hi def link Integer Number + +" Floating point +syn match goFloat "\<-\=\d\+\.\d*\%([Ee][-+]\=\d\+\)\=\>" +syn match goFloat "\<-\=\.\d\+\%([Ee][-+]\=\d\+\)\=\>" + +hi def link goFloat Float + +" Imaginary literals +syn match goImaginary "\<-\=\d\+i\>" +syn match goImaginary "\<-\=\d\+[Ee][-+]\=\d\+i\>" +syn match goImaginaryFloat "\<-\=\d\+\.\d*\%([Ee][-+]\=\d\+\)\=i\>" +syn match goImaginaryFloat "\<-\=\.\d\+\%([Ee][-+]\=\d\+\)\=i\>" + +hi def link goImaginary Number +hi def link goImaginaryFloat Float + +" Spaces after "[]" +if g:go_highlight_array_whitespace_error != 0 + syn match goSpaceError display "\(\[\]\)\@<=\s\+" +endif + +" Spacing errors around the 'chan' keyword +if g:go_highlight_chan_whitespace_error != 0 + " receive-only annotation on chan type + " + " \(\\)\@\)\@\)\@=" + + " send-only annotation on chan type + " + " \(<-\)\@ (only pick chan when it doesn't come after an arrow) + " this prevents picking up '<-chan <-chan' but not 'chan <-' + syn match goSpaceError display "\(\(<-\)\@\)\@<=\s\+\(<-\)\@=" + + " value-ignoring receives in a few contexts + syn match goSpaceError display "\(\(^\|[={(,;]\)\s*<-\)\@<=\s\+" +endif + +" Extra types commonly seen +if g:go_highlight_extra_types != 0 + syn match goExtraType /\/ + syn match goExtraType /\/ + syn match goExtraType /\/ + syn match goExtraType /\/ +endif + +" Space-tab error +if g:go_highlight_space_tab_error != 0 + syn match goSpaceError display " \+\t"me=e-1 +endif + +" Trailing white space error +if g:go_highlight_trailing_whitespace_error != 0 + syn match goSpaceError display excludenl "\s\+$" +endif + +hi def link goExtraType Type +hi def link goSpaceError Error + + + +" included from: https://github.com/athom/more-colorful.vim/blob/master/after/syntax/go.vim +" +" Comments; their contents +syn keyword goTodo contained NOTE +hi def link goTodo Todo + +syn match goVarArgs /\.\.\./ + +" Operators; +if g:go_highlight_operators != 0 + " match single-char operators: - + % < > ! & | ^ * = + " and corresponding two-char operators: -= += %= <= >= != &= |= ^= *= == + syn match goOperator /[-+%<>!&|^*=]=\?/ + " match / and /= + syn match goOperator /\/\%(=\|\ze[^/*]\)/ + " match two-char operators: << >> &^ + " and corresponding three-char operators: <<= >>= &^= + syn match goOperator /\%(<<\|>>\|&^\)=\?/ + " match remaining two-char operators: := && || <- ++ -- + syn match goOperator /:=\|||\|<-\|++\|--/ + " match ... + + hi def link goPointerOperator goOperator + hi def link goVarArgs goOperator +endif +hi def link goOperator Operator + +" Functions; +if g:go_highlight_functions != 0 + syn match goDeclaration /\/ nextgroup=goReceiver,goFunction skipwhite skipnl + syn match goReceiver /(\(\w\|[ *]\)\+)/ contained nextgroup=goFunction contains=goReceiverVar skipwhite skipnl + syn match goReceiverVar /\w\+/ nextgroup=goPointerOperator,goReceiverType skipwhite skipnl contained + syn match goPointerOperator /\*/ nextgroup=goReceiverType contained skipwhite skipnl + syn match goReceiverType /\w\+/ contained + syn match goFunction /\w\+/ contained + syn match goFunctionCall /\w\+\ze(/ +else + syn keyword goDeclaration func +endif +hi def link goFunction Function +hi def link goFunctionCall Type + +" Methods; +if g:go_highlight_methods != 0 + syn match goMethod /\.\w\+\ze(/hs=s+1 +endif +hi def link goMethod Type + +" Fields; +if g:go_highlight_fields != 0 + syn match goField /\.\w\+\([.\ \n\r\:\)\[,]\)\@=/hs=s+1 +endif +hi def link goField Identifier + +" Structs & Interfaces; +if g:go_highlight_types != 0 + syn match goTypeConstructor /\<\w\+{/he=e-1 + syn match goTypeDecl /\/ nextgroup=goTypeName skipwhite skipnl + syn match goTypeName /\w\+/ contained nextgroup=goDeclType skipwhite skipnl + syn match goDeclType /\/ contained skipwhite skipnl + hi def link goReceiverType Type +else + syn keyword goDeclType struct interface + syn keyword goDeclaration type +endif +hi def link goTypeConstructor Type +hi def link goTypeName Type +hi def link goTypeDecl Keyword +hi def link goDeclType Keyword + +" Build Constraints +if g:go_highlight_build_constraints != 0 + syn match goBuildKeyword display contained "+build" + " Highlight the known values of GOOS, GOARCH, and other +build options. + syn keyword goBuildDirectives contained + \ android darwin dragonfly freebsd linux nacl netbsd openbsd plan9 + \ solaris windows 386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 + \ ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc + \ s390 s390x sparc sparc64 cgo ignore race + + " Other words in the build directive are build tags not listed above, so + " avoid highlighting them as comments by using a matchgroup just for the + " start of the comment. + " The rs=s+2 option lets the \s*+build portion be part of the inner region + " instead of the matchgroup so it will be highlighted as a goBuildKeyword. + syn region goBuildComment matchgroup=goBuildCommentStart + \ start="//\s*+build\s"rs=s+2 end="$" + \ contains=goBuildKeyword,goBuildDirectives + hi def link goBuildCommentStart Comment + hi def link goBuildDirectives Type + hi def link goBuildKeyword PreProc + + " One or more line comments that are followed immediately by a "package" + " declaration are treated like package documentation, so these must be + " matched as comments to avoid looking like working build constraints. + " The he, me, and re options let the "package" itself be highlighted by + " the usual rules. + syn region goPackageComment start=/\v(\/\/.*\n)+\s*package/ + \ end=/\v\n\s*package/he=e-7,me=e-7,re=e-7 + \ contains=@goCommentGroup,@Spell + hi def link goPackageComment Comment +endif + +" :GoCoverage commands +hi def link goCoverageNormalText Comment + +function! s:hi() + " :GoSameIds + if &background == 'dark' + hi def goSameId term=bold cterm=bold ctermbg=white ctermfg=black guibg=white guifg=black + else + hi def goSameId term=bold cterm=bold ctermbg=14 guibg=Cyan + endif + + " :GoCoverage commands + hi def goCoverageCovered ctermfg=green guifg=#A6E22E + hi def goCoverageUncover ctermfg=red guifg=#F92672 +endfunction + +augroup vim-go-hi + autocmd! + autocmd ColorScheme * call s:hi() +augroup end +call s:hi() + +" Search backwards for a global declaration to start processing the syntax. +"syn sync match goSync grouphere NONE /^\(const\|var\|type\|func\)\>/ + +" There's a bug in the implementation of grouphere. For now, use the +" following as a more expensive/less precise workaround. +syn sync minlines=500 + +let b:current_syntax = "go" + +" vim: sw=2 ts=2 et diff --git a/syntax/nerdtree.vim b/syntax/nerdtree.vim new file mode 100644 index 0000000..dddce6d --- /dev/null +++ b/syntax/nerdtree.vim @@ -0,0 +1,91 @@ +let s:tree_up_dir_line = '.. (up a dir)' +syn match NERDTreeIgnore #\~# +exec 'syn match NERDTreeIgnore #\['.g:NERDTreeGlyphReadOnly.'\]#' + +"highlighting for the .. (up dir) line at the top of the tree +execute "syn match NERDTreeUp #\\V". s:tree_up_dir_line ."#" + +"quickhelp syntax elements +syn match NERDTreeHelpKey #" \{1,2\}[^ ]*:#ms=s+2,me=e-1 +syn match NERDTreeHelpKey #" \{1,2\}[^ ]*,#ms=s+2,me=e-1 +syn match NERDTreeHelpTitle #" .*\~$#ms=s+2,me=e-1 +syn match NERDTreeToggleOn #(on)#ms=s+1,he=e-1 +syn match NERDTreeToggleOff #(off)#ms=e-3,me=e-1 +syn match NERDTreeHelpCommand #" :.\{-}\>#hs=s+3 +syn match NERDTreeHelp #^".*# contains=NERDTreeHelpKey,NERDTreeHelpTitle,NERDTreeIgnore,NERDTreeToggleOff,NERDTreeToggleOn,NERDTreeHelpCommand + +"highlighting for sym links +syn match NERDTreeLinkTarget #->.*# containedin=NERDTreeDir,NERDTreeFile +syn match NERDTreeLinkFile #.* ->#me=e-3 containedin=NERDTreeFile +syn match NERDTreeLinkDir #.*/ ->#me=e-3 containedin=NERDTreeDir + +"highlighing for directory nodes and file nodes +syn match NERDTreeDirSlash #/# containedin=NERDTreeDir + +exec 'syn match NERDTreeClosable #' . escape(g:NERDTreeDirArrowCollapsible, '~') . '\ze .*/# containedin=NERDTreeDir,NERDTreeFile' +exec 'syn match NERDTreeOpenable #' . escape(g:NERDTreeDirArrowExpandable, '~') . '\ze .*/# containedin=NERDTreeDir,NERDTreeFile' + +let s:dirArrows = escape(g:NERDTreeDirArrowCollapsible, '~]\-').escape(g:NERDTreeDirArrowExpandable, '~]\-') +exec 'syn match NERDTreeDir #[^'.s:dirArrows.' ].*/#' +syn match NERDTreeExecFile #^ .*\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmark +exec 'syn match NERDTreeFile #^[^"\.'.s:dirArrows.'] *[^'.s:dirArrows.']*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile' + +"highlighting for readonly files +exec 'syn match NERDTreeRO # *\zs.*\ze \['.g:NERDTreeGlyphReadOnly.'\]# contains=NERDTreeIgnore,NERDTreeBookmark,NERDTreeFile' + +syn match NERDTreeFlags #^ *\zs\[.\]# containedin=NERDTreeFile,NERDTreeExecFile +syn match NERDTreeFlags #\[.\]# containedin=NERDTreeDir + +"highlighing to conceal the delimiter around the file/dir name +if has("conceal") + exec 'syn match NERDTreeNodeDelimiters #' . g:NERDTreeNodeDelimiter . '# conceal containedin=NERDTreeFile,NERDTreeLinkFile,NERDTreeExecFile,NERDTreeRO,NERDTreeDir' + setlocal conceallevel=2 concealcursor=nvic +else + exec 'syn match NERDTreeNodeDelimiters #' . g:NERDTreeNodeDelimiter . '# containedin=NERDTreeFile,NERDTreeLinkFile,NERDTreeExecFile,NERDTreeRO,NERDTreeDir' + hi! link NERDTreeNodeDelimiters Ignore +endif + +syn match NERDTreeCWD #^[# +syn match NERDTreeBookmarksHeader #^>-\+Bookmarks-\+$# contains=NERDTreeBookmarksLeader +syn match NERDTreeBookmarkName #^>.\{-} #he=e-1 contains=NERDTreeBookmarksLeader +syn match NERDTreeBookmark #^>.*$# contains=NERDTreeBookmarksLeader,NERDTreeBookmarkName,NERDTreeBookmarksHeader + +hi def link NERDTreePart Special +hi def link NERDTreePartFile Type +hi def link NERDTreeExecFile Title +hi def link NERDTreeDirSlash Identifier + +hi def link NERDTreeBookmarksHeader statement +hi def link NERDTreeBookmarksLeader ignore +hi def link NERDTreeBookmarkName Identifier +hi def link NERDTreeBookmark normal + +hi def link NERDTreeHelp String +hi def link NERDTreeHelpKey Identifier +hi def link NERDTreeHelpCommand Identifier +hi def link NERDTreeHelpTitle Macro +hi def link NERDTreeToggleOn Question +hi def link NERDTreeToggleOff WarningMsg + +hi def link NERDTreeLinkTarget Type +hi def link NERDTreeLinkFile Macro +hi def link NERDTreeLinkDir Macro + +hi def link NERDTreeDir Directory +hi def link NERDTreeUp Directory +hi def link NERDTreeFile Normal +hi def link NERDTreeCWD Statement +hi def link NERDTreeOpenable Directory +hi def link NERDTreeClosable Directory +hi def link NERDTreeIgnore ignore +hi def link NERDTreeRO WarningMsg +hi def link NERDTreeBookmark Statement +hi def link NERDTreeFlags Number + +hi def link NERDTreeCurrentNode Search diff --git a/templates/common/ext/html b/templates/common/ext/html new file mode 100644 index 0000000..1251340 --- /dev/null +++ b/templates/common/ext/html @@ -0,0 +1,10 @@ + + + + + + +
+
+ + diff --git a/templates/dynamic/ext/c b/templates/dynamic/ext/c new file mode 100755 index 0000000..c706c7a --- /dev/null +++ b/templates/dynamic/ext/c @@ -0,0 +1,9 @@ +#!/bin/sh +cat< 命令移动时的宽度为 4 +set expandtab +set nobackup " 覆盖文件时不备份 +set autochdir " 自动切换当前目录为当前文件所在的目录 +filetype plugin indent on " 开启插件 +set smartindent " 开启新行时使用智能自动缩进 +set backupcopy=yes " 设置备份时的行为为覆盖 +set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感 +set nowrapscan " 禁止在搜索到文件两端时重新搜索 +set incsearch " 输入搜索内容时就显示搜索结果 +set hlsearch " 搜索时高亮显示被找到的文本 +set noerrorbells " 关闭错误信息响铃 +set novisualbell " 关闭使用可视响铃代替呼叫 +set t_vb= " 置空错误铃声的终端代码 +"set showmatch " 插入括号时,短暂地跳转到匹配的对应括号 +"set matchtime=1 " 短暂跳转到匹配括号的时间 +set magic " 设置魔术 +set hidden " 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存 +set backspace=indent,eol,start " 不设定在插入状态无法用退格键和 Delete 键删除回车符 +set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏) +set cmdheight=1 " 设定状态栏命令行的行数为 1 +"set showtabline=2 " 显示标签栏 +"set mouse=a " 开启鼠标模式 + +"---------------------------------------------------------------- +"Status Line +"""""""""""""""""""""""" +set statusline=%F " 文件的路径 +set statusline+=%= " 切换到右边 +set statusline+=%{&fileencoding} " 文件的编码 +set statusline+=\ " 分隔符 +set statusline+=%c " 当前列 +set statusline+=\, " 分隔符 +set statusline+=%l " 当前行 +set statusline+=/ " 分隔符 +set statusline+=%L " 总行数 +set statusline+=\ " 分隔符 +set statusline+=%P " 当前位置 + +"---------------------------------------------------------------- +" Vim Shotcuts +"""""""""""""""""""""""" +inoremap :NERDTreeToggle +nnoremap :NERDTreeToggle + +nnoremap :tabp +nnoremap n :tabn +nnoremap :vertical resize +2 +nnoremap :vertical resize -2 +nnoremap :resize +2 +nnoremap :resize -2 + +au Syntax python set makeprg=python3\ -u\ %\ +au Syntax go set makeprg=go\ install\ +au Syntax rust set makeprg=rustc\ %\ +au Syntax lua set makeprg=lua5.1\ %\ +au Syntax sh set makeprg=bash\ %\ +au Syntax c,python,go,rust,lua,sh nnoremap :execute "normal! ".QuickFix() + +au Syntax c,go,rust nnoremap e :cn +au Syntax c,go,rust nnoremap E :cp +au Syntax go nnoremap H :!go doc +au Syntax python nnoremap H :!pydoc3 + +"---------------------------------------------------------------- +" Fold +"""""""""""""""""""""""" +set fdm=marker +set foldmarker=<>FOLD>> +nnoremap @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo') + +"---------------------------------------------------------------- +" Complement +"""""""""""""""""""""""" +" HTML +au Syntax html,css,javascript,xml inoremap > >%lyiwh%apa>%i +au Syntax html,css,javascript,xml inoremap > >%lyiwopa>^d0k^y0j0Pk$ +au Syntax html,css,javascript,xml inoremap { :s/ *$//g:nohlsA {}O +au Syntax html,css,javascript,xml inoremap ; A; +" PHP +au Syntax php inoremap > >%lyiwh%apa>%i +au Syntax php inoremap > >%lyiwopa>^d0k^y0j0Pk$ +au Syntax php inoremap >p 2hi +au Syntax php inoremap >P ?>O +au Syntax php inoremap #I include '';hi +au Syntax php inoremap #R require '';hi +au Syntax php inoremap ; A; +" SQL +au Syntax sql,plsql inoremap #I IF THENEND IF;khhhi +au Syntax sql,plsql inoremap #C CASE WHEN THENELSEEND CASE;kkkA +au Syntax sql,plsql inoremap #L LOOPEND LOOP;O +au Syntax sql,plsql inoremap #P DBMS_OUTPUT.PUT_LINE();hi +au Syntax sql,plsql inoremap ; A; +" C +au Syntax c inoremap #< #include<>i +au Syntax c inoremap #" #include ""i +au Syntax c inoremap #M int main(int argc,char *argv[]){return 0;}kO +au Syntax c inoremap { :s/ *$//g:nohlsA{}O +au Syntax c inoremap ; A; +" GO +au Syntax go inoremap { :s/ *$//g:nohlsA {}O +au Syntax go inoremap { {}O +au Syntax go inoremap ( :s/ *$//g:nohlsA ()O +au Syntax go inoremap ; A; +" RUST +au Syntax rust inoremap { :s/ *$//g:nohlsA {}O +au Syntax rust inoremap ; A; +" SH +au Syntax sh inoremap { :s/ *$//g:nohlsA {}O +" PYTHON +au Syntax python inoremap : =PythonColon() +" LUA +au Syntax lua inoremap #fu function ()endOreturn k$F(i +au Syntax lua inoremap #if if thenendk$F i +au Syntax lua inoremap #fo for doendk$F i +au Syntax lua inoremap #wh while doendk$F i + +"---------------------------------------------------------------- +" Operators +"""""""""""""""""""""""" +" PHP +au Syntax php inoremap .= .= +au Syntax php inoremap === === +au Syntax php inoremap !== !== +au Syntax php inoremap <= <= +au Syntax php inoremap >= >= +au Syntax php inoremap != != +au Syntax php inoremap \|\| \|\| +au Syntax php inoremap == == +au Syntax php inoremap += += +au Syntax php inoremap -= -= +au Syntax php inoremap *= *= +au Syntax php inoremap /= /= +au Syntax php inoremap && && +" C +au Syntax c inoremap <= <= +au Syntax c inoremap >= >= +au Syntax c inoremap != != +au Syntax c inoremap \|\| \|\| +au Syntax c inoremap == == +au Syntax c inoremap += += +au Syntax c inoremap -= -= +au Syntax c inoremap *= *= +au Syntax c inoremap /= /= +au Syntax c inoremap &= &= +au Syntax c inoremap \|= \|= +au Syntax c inoremap ~= ~= +au Syntax c inoremap ^= ^= +au Syntax c inoremap && && +au Syntax c inoremap -> -> +au Syntax c inoremap >> >> +au Syntax c inoremap << << +" GO +au Syntax go inoremap := := +au Syntax go inoremap <= <= +au Syntax go inoremap >= >= +au Syntax go inoremap != != +au Syntax go inoremap \|\| \|\| +au Syntax go inoremap == == +au Syntax go inoremap += += +au Syntax go inoremap -= -= +au Syntax go inoremap *= *= +au Syntax go inoremap /= /= +au Syntax go inoremap &= &= +au Syntax go inoremap \|= \|= +au Syntax go inoremap ~= ~= +au Syntax go inoremap ^= ^= +au Syntax go inoremap && && +au Syntax go inoremap -> -> +au Syntax go inoremap >> >> +au Syntax go inoremap << << +" RUST +au Syntax rust inoremap <= <= +au Syntax rust inoremap >= >= +au Syntax rust inoremap != != +au Syntax rust inoremap \|\| \|\| +au Syntax rust inoremap == == +au Syntax rust inoremap += += +au Syntax rust inoremap -= -= +au Syntax rust inoremap *= *= +au Syntax rust inoremap /= /= +au Syntax rust inoremap &= &= +au Syntax rust inoremap \|= \|= +au Syntax rust inoremap ~= ~= +au Syntax rust inoremap ^= ^= +au Syntax rust inoremap && && +au Syntax rust inoremap -> -> +au Syntax rust inoremap >> >> +au Syntax rust inoremap << << +" PYTHON +au Syntax python inoremap <= <= +au Syntax python inoremap >= >= +au Syntax python inoremap != != +au Syntax python inoremap \|\| \|\| +au Syntax python inoremap == == +au Syntax python inoremap += += +au Syntax python inoremap -= -= +au Syntax python inoremap *= *= +au Syntax python inoremap /= /= +au Syntax python inoremap &= &= +au Syntax python inoremap \|= \|= +au Syntax python inoremap ~= ~= +au Syntax python inoremap ^= ^= +au Syntax python inoremap && && +" LUA +au Syntax lua inoremap <= <= +au Syntax lua inoremap >= >= +au Syntax lua inoremap != != +au Syntax lua inoremap \|\| \|\| +au Syntax lua inoremap == == +au Syntax lua inoremap += += +au Syntax lua inoremap -= -= +au Syntax lua inoremap *= *= +au Syntax lua inoremap /= /= +au Syntax lua inoremap &= &= +au Syntax lua inoremap \|= \|= +au Syntax lua inoremap ~= ~= +au Syntax lua inoremap ^= ^= +au Syntax lua inoremap && && +" SQL +au Syntax sql,plsql inoremap := := +au Syntax sql,plsql inoremap <= <= +au Syntax sql,plsql inoremap >= >= +au Syntax sql,plsql inoremap != != +au Syntax sql,plsql inoremap \|\| \|\| + +"---------------------------------------------------------------- +" Comments +"""""""""""""""""""""""" +" Html +au Syntax html nnoremap - V +au Syntax html vnoremap - :call setpos(".",[0,line("'<"),0,0])I +au Syntax html nnoremap == $?3x:nohls +" Sql +au Syntax sql,plsql nnoremap - 0 +au Syntax sql,plsql nnoremap = 0 +au Syntax sql,plsql vnoremap - I-- +au Syntax sql,plsql vnoremap = :s:--:::nohls0 +" C +au Syntax c nnoremap - 0 +au Syntax c nnoremap = 0 +au Syntax c vnoremap - I// +au Syntax c vnoremap = :s://:::nohls0 +au Syntax c nnoremap - 0 +au Syntax c nnoremap = 0 +" GO +au Syntax go nnoremap - 0 +au Syntax go nnoremap = 0 +au Syntax go vnoremap - I// +au Syntax go vnoremap = :s://:::nohls0 +" RUST +au Syntax rust nnoremap - 0 +au Syntax rust nnoremap = 0 +au Syntax rust vnoremap - I// +au Syntax rust vnoremap = :s://:::nohls0 +" LUA +au Syntax lua nnoremap - 0 +au Syntax lua nnoremap = 0 +au Syntax lua vnoremap - I-- +au Syntax lua vnoremap = :s:--:::nohls0 + +"----------------------------------------------------------------- +" Matching Pairs +""""""""""""""""""""""""" +inoremap " =QuoteDelim('"') +inoremap ' =QuoteDelim("'") +inoremap ( ()i +inoremap ) =ClosePair(')') +inoremap [ []i +inoremap ] =ClosePair(']') +inoremap { {}i +inoremap } =ClosePair('}') +au Syntax html,css,js,php,xml set mps+=<:> +au Syntax html,css,js,php,xml inoremap > =ClosePair('>') +au Syntax vim inoremap " " + +"------------------------------------------------------------------------------ +" Ctags +""""""""""""""""""""""" +" C +au syntax c nnoremap t :let $SRC=input("Enter source dir:") +au syntax c nnoremap T :!ctags -R -f /tmp/c_sys_tags -I __THROW --extra=+f --languages=c --langmap=c:+.h --c-kinds=+px --fields=+aiKSz --exclude=/usr/include/c++ --exclude=/usr/include/libio.h /usr/include +au syntax c set tags=/tmp/c_cur_tags,/tmp/c_sys_tags +au BufWrite *.c,*.h !ctags -R -f /tmp/c_cur_tags --extra=+f --languages=c --langmap=c:+.h --c-kinds=+px --fields=+aiKSz $SRC +" GO +"au syntax go nnoremap t :let $GOPATH=input("Enter GOPATH dir:") +au syntax go nnoremap t :!ctags -R -f /tmp/go_sys_tags --languages=Go /usr/lib/go/src +au syntax go set tags=/tmp/go_cur_tags,/tmp/go_sys_tags +au BufWrite *.go !ctags -R -f /tmp/go_cur_tags --languages=Go $GOPATH +" PYTHON +au syntax python nnoremap t :let $SRC=input("Enter source dir:") +au syntax python nnoremap T :!ctags -R -f /tmp/python_sys_tags --languages=Python /usr/lib/python3.7 +au syntax python set tags=/tmp/python_cur_tags,/tmp/python_sys_tags +au BufWrite *.py !ctags -R -f /tmp/python_cur_tags --languages=python $SRC + +"------------------------------------------------------------------------------ +" Cscope +"""""""""""""""""""""""" +set cst +set csto=1 +set cscopequickfix=s-,g-,c-,d-,i-,t-,e- +"au BufNewFile,BufRead *.c,*.h nnoremap #SS :cs add $SRC/cscope.out +"au BufWrite *.c,*.h !find $SRC -type f|cscope -bk -i -;mv cscope.out $SRC/cscope.out +"au BufNewFile,BufRead *.c,*.h nnoremap #CC :!echo 'Generating cs tags ...';find $SRC -type f\|cscope -bk -i -;mv cscope.out $SRC +"nnoremap s :cs find s =expand("") "查找本C符号(跳过注释) +"nnoremap g :cs find g =expand("") "查找本定义 +"nnoremap d :cs find d =expand("") "查找本函数调用的函数 +"nnoremap c :cs find c =expand("") "查找调用本函数的函数 +"nnoremap t :cs find t =expand("") "查找本字符串 +"nnoremap e :cs find e =expand("") "查找本 egrep 模式 +"nnoremap f :cs find f =expand("") "查找本文件 +"nnoremap i :cs find i =expand("") "查找包含本文件的文件 + +"------------------------------------------------------------------------------ +" NERDTree +""""""""""""""""""""""" +let NERDChristmasTree = 1 +let NERDTreeAutoCenter = 1 +let NERDTreeQuitOnOpen = 1 +let NERDTreeShowBookmarks = 1 +let NERDTreeHighlightCursorline = 1 +let NERDTreeShowFiles = 1 +let NERDTreeStatusline = 1 +"let NERDTreeShowHidden=1 +"let NERDTreeShowLineNumbers=1 +"let NERDTreeWinSize=30 +" t.......在新Tab中打开选中文件/书签,并跳到新Tab +" T.......在新Tab中打开选中文件/书签,但不跳到新Tab +" i.......split一个新窗口打开选中文件,并跳到该窗口 +" gi......split一个新窗口打开选中文件,但不跳到该窗口 +" s.......vsp一个新窗口打开选中文件,并跳到该窗口 +" gs......vsp一个新窗口打开选中文件,但不跳到该窗口 +" !.......执行当前文件 +" O.......递归打开选中结点下的所有目录 +" x.......合拢选中结点的父目录 +" X.......递归合拢选中结点下的所有目录 + +"------------------------------------------------------------------------------ +" Templates +""""""""""""""""""""""" +let g:enable_template=1 +let g:template_dir="~/.vim/templates" + +"------------------------------------------------------------------------------ +" Functions +""""""""""""""""""""""" +function QuickFix() + if exists('g:QuickFixState') && g:QuickFixState + if exists('g:asyncrun_status') && 'running' == g:asyncrun_status + return ":AsyncStop!\" + endif + let g:QuickFixState = 0 + if 'c' == &filetype + return ":cclose\:make clean\\" + elseif 'go' == &filetype + return ":cclose\:!go clean\\" + else + return ":cclose\" + endif + else + let g:QuickFixState = 1 + if 0 <= index(['c', 'python', 'go', 'rust', 'lua', 'sh'], &filetype) + let b:argvs = input("Enter arguments:") + if matchstr(v:version, '^8') + return ":w!\\\:copen 15\\k:AsyncRun ".&makeprg.b:argvs."\" + else + return ":w!\\\:make! ".b:argvs."\\:copen 15\\k" + endif + else + let g:QuickFixState = 0 + return "\" + endif + endif +endf + +function PythonColon() + let KeyWords = ['if', 'elif', 'else', 'for', 'while', 'class', 'def', 'with', 'try', 'except', 'finally'] + let FirstWord = split(getline('.'))[0] + if FirstWord == 'try' + return "\A:\except Exception, e:\<A:\" + endif +endf + +function ClosePair(char) + if getline('.')[col('.') - 1] == a:char + return "\" + else + return a:char + endif +endf + +function QuoteDelim(char) + let line = getline('.') + let col = col('.') + if line[col - 2] == "\\" + return a:char + elseif line[col - 1] == a:char + return "\" + else + return a:char.a:char."\" + endif +endf + +"------------------------------------------------------------------------------ +"------------------------------------------------------------------------------