key_map.vim (4481B)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | "CLASS: KeyMap "============================================================ let s:KeyMap = {} let g:NERDTreeKeyMap = s:KeyMap "FUNCTION: KeyMap.All() {{{1 function! s:KeyMap.All() if !exists("s:keyMaps") let s:keyMaps = [] endif return s:keyMaps endfunction "FUNCTION: KeyMap.FindFor(key, scope) {{{1 function! s:KeyMap.FindFor(key, scope) for i in s:KeyMap.All() if i.key ==# a:key && i.scope ==# a:scope return i endif endfor return {} endfunction "FUNCTION: KeyMap.BindAll() {{{1 function! s:KeyMap.BindAll() for i in s:KeyMap.All() call i.bind() endfor endfunction "FUNCTION: KeyMap.bind() {{{1 function! s:KeyMap.bind() " If the key sequence we're trying to map contains any '<>' notation, we " must replace each of the '<' characters with '<lt>' 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, '<lt>\1', 'g') else let keymapInvokeString = self.key endif let premap = self.key == "<LeftRelease>" ? " <LeftRelease>" : " " exec 'nnoremap <buffer> <silent> '. self.key . premap . ':call nerdtree#ui_glue#invokeKeyMap("'. keymapInvokeString .'")<cr>' endfunction "FUNCTION: KeyMap.Remove(key, scope) {{{1 function! s:KeyMap.Remove(key, scope) let maps = s:KeyMap.All() for i in range(len(maps)) if maps[i].key ==# a:key && maps[i].scope ==# a:scope return remove(maps, i) endif endfor 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 <LeftRelease> 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) call s:KeyMap.Remove(a:keymap.key, a:keymap.scope) call add(s:KeyMap.All(), a:keymap) endfunction " vim: set sw=4 sts=4 et fdm=marker: |