Skip to content

Map multiple key sequences to the same callback #1442

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 39 additions & 17 deletions lib/nerdtree/key_map.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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 <? a:keyMap2.key
return -1
if type(k1) == type([])
let k1 = k1[0]
endif
if type(k2) == type([])
let k2 = k2[0]
endif

return 0
return (k1 >? k2) ? 1 : ((k1 <? k2) ? -1 : 0)
endfunction

"FUNCTION: KeyMap.FindFor(key, scope) {{{1
function! s:KeyMap.FindFor(key, scope)
return get(s:keyMaps, a:key . a:scope, {})
if type(a:key) == type([])
for i in a:key
let result = get(s:keyMaps, i . a:scope, {})
if result != {}
return result
endif
endfor
return {}
else
return get(s:keyMaps, a:key . a:scope, {})
endif
endfunction

"FUNCTION: KeyMap.BindAll() {{{1
Expand All @@ -45,17 +57,21 @@ function! s:KeyMap.bind()
" 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, '<lt>\1', 'g')
else
let keymapInvokeString = self.key
endif
let keymapInvokeString = escape(keymapInvokeString, '\"')

let premap = self.key ==# '<LeftRelease>' ? ' <LeftRelease>' : ' '
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, '<lt>\1', 'g')
else
let keymapInvokeString = _key
endif
let keymapInvokeString = escape(keymapInvokeString, '\"')

let premap = _key ==# '<LeftRelease>' ? ' <LeftRelease>' : ' '

exec 'nnoremap <buffer> <silent> '. self.key . premap . ':call nerdtree#ui_glue#invokeKeyMap("'. keymapInvokeString .'")<cr>'
exec 'nnoremap <buffer> <silent> '. _key . premap . ':call nerdtree#ui_glue#invokeKeyMap("'. keymapInvokeString .'")<cr>'
endfor
endfunction

"FUNCTION: KeyMap.Remove(key, scope) {{{1
Expand Down Expand Up @@ -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:
116 changes: 61 additions & 55 deletions lib/nerdtree/ui.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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 [<name>]\n"
Expand All @@ -134,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
Expand Down