Post- dos2unix, Tabify, and Trim. --- a/qname.1.2.vim 2025-08-03 20:12:24.629096223 -0400 +++ b/qname.1.2.vim 2025-11-04 11:19:39.070454407 -0500 @@ -7,7 +7,30 @@ " License: Vim License " ============================================================================= +" https://www.vim.org/scripts/script.php?script_id=2317 +" " Change Log +" EDIT: +" 2025-06-24: +" Remove redraw on update +" Don't wrap around in the list +" ls! -> ls +" -> +" Take out built-in hotkey +" 2025-08-05: +" Use path relative to current dir +" Match against file path +" 2025-08-13: +" Sort buffers by most recently used +" Add bind to "flatten" the list +" Replace fmatch() with built-in matchfuzzy() (speedup) +" Fix logic to not include buffers with modifiable off +" 2025-10-30: +" Treat the same as +" 2025-11-04: +" Open selected buffer in the current window, even if the same buffer is +" already open in another window. +" " 1.2 2013-01-03 " ADD: and moves selection like and " ADD: Use mapping to keep cmdline clear @@ -30,12 +53,6 @@ finish endif -if !exists("g:qname_hotkey") || g:qname_hotkey == "" - let g:qname_hotkey = "" -endif -exe "nmap" g:qname_hotkey ":cal QNameInit(1):~" -let s:qname_hotkey = eval('"\'.g:qname_hotkey.'"') - if exists("g:qname_loaded") && g:qname_loaded finish endif @@ -53,7 +70,7 @@ " use case-sensitive equality operator, otherwise looks like " if 'ignorecase' is set - if _key ==# "\" + if _key ==# "\" || _key ==# "\" let s:inp = s:inp[:-2] elseif _key ==# "\" let s:inp = "" @@ -70,16 +87,19 @@ call s:swb(str2nr(matchstr(s:s[_sel], '<\zs\d\+\ze>'))) endif call QNameInit(0) - elseif _key ==# "\" || _key ==# "\" + elseif _key ==# "\" || _key ==# "\" call s:colPrinter.vert(-1) - elseif _key ==# "\" || _key ==# "\" + elseif _key ==# "\" || _key ==# "\" call s:colPrinter.vert(1) elseif _key ==# "\" call s:colPrinter.horz(-1) elseif _key ==# "\" call s:colPrinter.horz(1) - elseif _key ==# s:qname_hotkey - call QNameInit(0) + elseif _key ==# "\" + let s:flat = 1 - s:flat + let prev_sel = s:colPrinter.sel + call s:build() + let s:colPrinter.sel = prev_sel else call s:build() endif @@ -88,7 +108,6 @@ cal QNameInit(0) finally " clean up screen after dismissing search window - redraw! call inputrestore() endtry endfunc @@ -99,6 +118,7 @@ let s:cmdh = &cmdheight if a:start != -1 let s:inp = "" + let s:flat = 0 endif call s:baselist() call s:build() @@ -112,16 +132,27 @@ function! s:build() let s:s = [] let s:n = [] + let s:sp = [] + let s:np = [] let s:blen = 0 let _cmp = tolower(tr(s:inp, '\', '/')) for _line in s:ls - let _name = matchstr(_line, '^.\{-}\ze \+<') - if s:fmatch(tolower(_name), _cmp) + " Match everthing before || Match everthing after space. + let _match = matchlist(_line, '^.\{-}\ze \+<.*> \+\(.*\)') + let _name = _match[0] + let _path = _match[1] + if strlen(_cmp) == 0 || s:fmatch(tolower(_name), _cmp) cal add(s:s, _line) cal add(s:n, _name) + elseif s:fmatch(tolower(_path), _cmp) + cal add(s:sp, _line) + cal add(s:np, _name) endif endfor - if len(s:n) > s:colPrinter.trow + " Put filename matches before path matches. + let s:n = s:n + s:np + let s:s = s:s + s:sp + if !s:flat && len(s:n) > s:colPrinter.trow cal s:colPrinter.put(s:n) else cal s:colPrinter.put(s:s) @@ -129,45 +160,32 @@ endfunc function! s:swb(bno) - if bufwinnr(a:bno) == -1 - exe "hid b" a:bno - else - exe bufwinnr(a:bno) . "winc w" - endif + exe "hid b" a:bno endfunc function! s:fmatch(src,pat) - let _si = strlen(a:src)-1 - let _pi = strlen(a:pat)-1 - while _si>=0 && _pi>=0 - if a:src[_si] == a:pat[_pi] - let _pi -= 1 - endif - let _si -= 1 - endwhile - return _pi < 0 + return len(matchfuzzy([a:src], a:pat)) > 0 endfunc function! s:baselist() let s:ls = [] - redir => l:bufs | silent ls! | redir END + redir => l:bufs | silent ls t | redir END for _line in split(l:bufs, "\n") - if _line[3]!='u' || _line[6]!='-' + if _line[6] != '-' let _bno = matchstr(_line, '^ *\zs\d*')+0 let _fname = substitute(expand("#"._bno.":p"), '\', '/', 'g') if _fname == "" let _fname = "|".matchstr(_line, '"\[\zs[^\]]*')."|" endif let _name = fnamemodify(_fname,":t") - cal add(s:ls, _name." <"._bno."> ".fnamemodify(_fname,":h")) + cal add(s:ls, _name." <"._bno."> ".fnamemodify(_fname,":.")) endif endfor let _align = max(map(copy(s:ls),'stridx(v:val,">")')) call map(s:ls, 'substitute(v:val, " <", repeat(" ",_align-stridx(v:val,">"))." <", "")') - cal sort(s:ls, 1) endfunc -let s:colPrinter = {"trow": 4} +let s:colPrinter = {"trow": 5} function! s:colPrinter.put(its) dict let _cols = [] let _trow = self.trow @@ -224,11 +242,7 @@ function! s:colPrinter.vert(mv) dict let _t = self.sel + a:mv let _len = self.len - if _t < 0 && _len > 0 - let self.sel = _len-1 - elseif _t >= _len - let self.sel = 0 - else + if _t >= 0 && _t < _len let self.sel = _t endif endfunc @@ -244,7 +258,7 @@ let _t = _sel/_trow let _cpos = self.cpos let _lcol = self.lcol - let _tcol = &columns + let _tcol = s:flat ? 1 : &columns if _cpos[_lcol]+_tcol < _cpos[_t+1] let _rcol = _t let _pos = _cpos[_t+1]-_tcol-2