From 34d2bed7c5d9c9da474fbdcaa591b0c61647ef4b Mon Sep 17 00:00:00 2001 From: Michael Wood Date: Wed, 7 May 2025 13:54:59 +0100 Subject: [PATCH 1/2] Enable key lists in keymap --- lib/nerdtree/key_map.vim | 56 +++++++++++++------ lib/nerdtree/ui.vim | 114 ++++++++++++++++++++------------------- 2 files changed, 99 insertions(+), 71 deletions(-) diff --git a/lib/nerdtree/key_map.vim b/lib/nerdtree/key_map.vim index ed791677..070fa50d 100644 --- a/lib/nerdtree/key_map.vim +++ b/lib/nerdtree/key_map.vim @@ -15,20 +15,32 @@ endfunction "FUNCTION: KeyMap.Compare(keyMap1, keyMap2) {{{1 function! s:KeyMap.Compare(keyMap1, keyMap2) - if a:keyMap1.key >? a:keyMap2.key - return 1 - endif + let k1 = a:keyMap1.key + let k2 = a:keyMap2.key - if a:keyMap1.key ? k2) ? 1 : ((k1 - let specialNotationRegex = '\m<\([[:alnum:]_-]\+>\)' - if self.key =~# specialNotationRegex - let keymapInvokeString = substitute(self.key, specialNotationRegex, '\1', 'g') - else - let keymapInvokeString = self.key - endif - let keymapInvokeString = escape(keymapInvokeString, '\"') - let premap = self.key ==# '' ? ' ' : ' ' + let _keyAsList = type(self.key) == type([]) ? self.key : [self.key] + for _key in _keyAsList + let specialNotationRegex = '\m<\([[:alnum:]_-]\+>\)' + if _key =~# specialNotationRegex + let keymapInvokeString = substitute(_key, specialNotationRegex, '\1', 'g') + else + let keymapInvokeString = _key + endif + let keymapInvokeString = escape(keymapInvokeString, '\"') + + let premap = _key ==# '' ? ' ' : ' ' - exec 'nnoremap '. self.key . premap . ':call nerdtree#ui_glue#invokeKeyMap("'. keymapInvokeString .'")' + exec 'nnoremap '. _key . premap . ':call nerdtree#ui_glue#invokeKeyMap("'. keymapInvokeString .'")' + endfor endfunction "FUNCTION: KeyMap.Remove(key, scope) {{{1 @@ -158,7 +174,13 @@ endfunction "FUNCTION: KeyMap.Add(keymap) {{{1 function! s:KeyMap.Add(keymap) - let s:keyMaps[a:keymap.key . a:keymap.scope] = a:keymap + if type(a:keymap.key) == type([]) + for k in a:keymap.key + let s:keyMaps[k . a:keymap.scope] = a:keymap + endfor + else + let s:keyMaps[a:keymap.key . a:keymap.scope] = a:keymap + endif endfunction " vim: set sw=4 sts=4 et fdm=marker: diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index 867e04b1..1e0473e2 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -6,6 +6,12 @@ let s:UI = {} let g:NERDTreeUI = s:UI +" FUNCTION: s:UI._keyStr() {{{1 +" Converts a keylist (or key) to a single delimited string +function! s:UI._keyStr(key) + return type(a:key) == type([]) ? join(a:key, '|') : a:key +endfunction + " FUNCTION: s:UI.centerView() {{{1 " centers the nerd tree window around the cursor (provided the nerd tree " options permit) @@ -29,98 +35,98 @@ function! s:UI._dumpHelp() let help .= "\" File node mappings~\n" let help .= '" '. (g:NERDTreeMouseMode ==# 3 ? 'single' : 'double') ."-click,\n" if self.nerdtree.isTabTree() - let help .= '" '. g:NERDTreeMapActivateNode .": open in prev window\n" + let help .= '" '. self._keyStr(g:NERDTreeMapActivateNode) .": open in prev window\n" else - let help .= '" '. g:NERDTreeMapActivateNode .": open in current window\n" + let help .= '" '. self._keyStr(g:NERDTreeMapActivateNode) .": open in current window\n" endif if self.nerdtree.isTabTree() - let help .= '" '. g:NERDTreeMapPreview .": preview\n" + let help .= '" '. self._keyStr(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 .= '" '. self._keyStr(g:NERDTreeMapOpenInTab).": open in new tab\n" + let help .= '" '. self._keyStr(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 .= '" '. g:NERDTreeMapCustomOpen .": custom open\n" + let help .= '" '. self._keyStr(g:NERDTreeMapOpenSplit) .": open split\n" + let help .= '" '. self._keyStr(g:NERDTreeMapPreviewSplit) .": preview split\n" + let help .= '" '. self._keyStr(g:NERDTreeMapOpenVSplit) .": open vsplit\n" + let help .= '" '. self._keyStr(g:NERDTreeMapPreviewVSplit) .": preview vsplit\n" + let help .= '" '. self._keyStr(g:NERDTreeMapCustomOpen) .": custom open\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:NERDTreeMapCustomOpen .": custom open\n" - let help .= '" '. g:NERDTreeMapCloseDir .": close parent of node\n" - let help .= '" '. g:NERDTreeMapCloseChildren .": close all child nodes of\n" + let help .= '" '. self._keyStr(g:NERDTreeMapActivateNode) .": open & close node\n" + let help .= '" '. self._keyStr(g:NERDTreeMapOpenRecursively) .": recursively open node\n" + let help .= '" '. self._keyStr(g:NERDTreeMapOpenInTab).": open in new tab\n" + let help .= '" '. self._keyStr(g:NERDTreeMapOpenInTabSilent) .": open in new tab silently\n" + let help .= '" '. self._keyStr(g:NERDTreeMapCustomOpen) .": custom open\n" + let help .= '" '. self._keyStr(g:NERDTreeMapCloseDir) .": close parent of node\n" + let help .= '" '. self._keyStr(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 .= '" '. self._keyStr(g:NERDTreeMapOpenExpl).": explore selected dir\n" let help .= "\"\n\" ----------------------------\n" let help .= "\" Bookmark table mappings~\n" let help .= "\" double-click,\n" - let help .= '" '. g:NERDTreeMapJumpBookmarks .": jump to bookmark table\n" - let help .= '" '. g:NERDTreeMapActivateNode .": open bookmark\n" - let help .= '" '. g:NERDTreeMapPreview .": preview file\n" - let help .= '" '. g:NERDTreeMapPreview .": find dir in tree\n" - let help .= '" '. g:NERDTreeMapOpenInTab.": open in new tab\n" - let help .= '" '. g:NERDTreeMapOpenInTabSilent .": open in new tab silently\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 .= '" '. g:NERDTreeMapCustomOpen .": custom open\n" - let help .= '" '. g:NERDTreeMapDeleteBookmark .": delete bookmark\n" + let help .= '" '. self._keyStr(g:NERDTreeMapJumpBookmarks) .": jump to bookmark table\n" + let help .= '" '. self._keyStr(g:NERDTreeMapActivateNode) .": open bookmark\n" + let help .= '" '. self._keyStr(g:NERDTreeMapPreview) .": preview file\n" + let help .= '" '. self._keyStr(g:NERDTreeMapPreview) .": find dir in tree\n" + let help .= '" '. self._keyStr(g:NERDTreeMapOpenInTab).": open in new tab\n" + let help .= '" '. self._keyStr(g:NERDTreeMapOpenInTabSilent) .": open in new tab silently\n" + let help .= '" '. self._keyStr(g:NERDTreeMapOpenSplit) .": open split\n" + let help .= '" '. self._keyStr(g:NERDTreeMapPreviewSplit) .": preview split\n" + let help .= '" '. self._keyStr(g:NERDTreeMapOpenVSplit) .": open vsplit\n" + let help .= '" '. self._keyStr(g:NERDTreeMapPreviewVSplit) .": preview vsplit\n" + let help .= '" '. self._keyStr(g:NERDTreeMapCustomOpen) .": custom open\n" + let help .= '" '. self._keyStr(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 .= '" '. self._keyStr(g:NERDTreeMapJumpRoot) .": go to root\n" + let help .= '" '. self._keyStr(g:NERDTreeMapJumpParent) .": go to parent\n" + let help .= '" '. self._keyStr(g:NERDTreeMapJumpFirstChild) .": go to first child\n" + let help .= '" '. self._keyStr(g:NERDTreeMapJumpLastChild) .": go to last child\n" + let help .= '" '. self._keyStr(g:NERDTreeMapJumpNextSibling) .": go to next sibling\n" + let help .= '" '. self._keyStr(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 .= '" '. self._keyStr(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 .= '" '. self._keyStr(g:NERDTreeMapUpdir) .": move tree root up a dir\n" + let help .= '" '. self._keyStr(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 .= '" '. self._keyStr(g:NERDTreeMapRefresh) .": refresh cursor dir\n" + let help .= '" '. self._keyStr(g:NERDTreeMapRefreshRoot) .": refresh current root\n" + let help .= '" '. self._keyStr(g:NERDTreeMapMenu) .": Show menu\n" + let help .= '" '. self._keyStr(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 .= '" '. self._keyStr(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" - let help .= '" '. g:NERDTreeMapToggleFileLines .': files lines (' . (self.getShowFileLines() ? 'on' : 'off') . ")\n" + let help .= '" '. self._keyStr(g:NERDTreeMapToggleHidden) .': hidden files (' . (self.getShowHidden() ? 'on' : 'off') . ")\n" + let help .= '" '. self._keyStr(g:NERDTreeMapToggleFilters) .': file filters (' . (self.isIgnoreFilterEnabled() ? 'on' : 'off') . ")\n" + let help .= '" '. self._keyStr(g:NERDTreeMapToggleFiles) .': files (' . (self.getShowFiles() ? 'on' : 'off') . ")\n" + let help .= '" '. self._keyStr(g:NERDTreeMapToggleBookmarks) .': bookmarks (' . (self.getShowBookmarks() ? 'on' : 'off') . ")\n" + let help .= '" '. self._keyStr(g:NERDTreeMapToggleFileLines) .': files lines (' . (self.getShowFileLines() ? '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() + for i in self._keyStr(g:NERDTreeKeyMap).All() if !empty(i.quickhelpText) - let help .= '" '. i.key .': '. i.quickhelpText ."\n" + let help .= '" '. self._keyStr(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 .= '" '. self._keyStr(g:NERDTreeMapQuit) .": Close the NERDTree window\n" + let help .= '" '. self._keyStr(g:NERDTreeMapToggleZoom) .": Zoom (maximize-minimize)\n" let help .= "\" the NERDTree window\n" - let help .= '" '. g:NERDTreeMapHelp .": toggle help\n" + let help .= '" '. self._keyStr(g:NERDTreeMapHelp) .": toggle help\n" let help .= "\"\n\" ----------------------------\n" let help .= "\" Bookmark commands~\n" let help .= "\" :Bookmark []\n" From 83ccaefbfb99a3dd006a9a7bd0cfb27fafbe68af Mon Sep 17 00:00:00 2001 From: Michael Wood Date: Thu, 8 May 2025 02:05:01 +0100 Subject: [PATCH 2/2] Propagate reformatted keylist to tooltip --- lib/nerdtree/ui.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index 1e0473e2..adb4ee49 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -140,7 +140,7 @@ function! s:UI._dumpHelp() let help .= "\" :EditBookmarks\n" silent! put =help elseif !self.isMinimal() - let help ='" Press '. g:NERDTreeMapHelp ." for help\n" + let help ='" Press '. self._keyStr(g:NERDTreeMapHelp) ." for help\n" silent! put =help endif endfunction