From ed72d9597d61f4f32162b7810dc93469bcee1ce8 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Thu, 24 Oct 2019 20:25:58 +0100 Subject: man.vim: pull out s:get_paths() --- runtime/autoload/man.vim | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'runtime') diff --git a/runtime/autoload/man.vim b/runtime/autoload/man.vim index 153f1afed8..ec48d96dd6 100644 --- a/runtime/autoload/man.vim +++ b/runtime/autoload/man.vim @@ -360,14 +360,18 @@ function! man#complete(arg_lead, cmd_line, cursor_pos) abort return s:complete(sect, sect, name) endfunction -function! s:complete(sect, psect, name) abort +function! s:get_paths(sect, name) abort try let mandirs = join(split(s:system(['man', s:find_arg]), ':\|\n'), ',') catch call s:error(v:exception) return endtry - let pages = globpath(mandirs,'man?/'.a:name.'*.'.a:sect.'*', 0, 1) + return globpath(mandirs,'man?/'.a:name.'*.'.a:sect.'*', 0, 1) +endfunction + +function! s:complete(sect, psect, name) abort + let pages = s:get_paths(a:sect, a:name) " We remove duplicates in case the same manpage in different languages was found. return uniq(sort(map(pages, 's:format_candidate(v:val, a:psect)'), 'i')) endfunction -- cgit From 63f0ca326322376271c68f51cf8908daad524339 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Tue, 22 Oct 2019 23:40:16 +0100 Subject: man.vim: use 'tagfunc' instead of remapping man#pop_tag() is also no longer used --- runtime/autoload/man.vim | 23 +++++++++++++++-------- runtime/ftplugin/man.vim | 4 ++-- 2 files changed, 17 insertions(+), 10 deletions(-) (limited to 'runtime') diff --git a/runtime/autoload/man.vim b/runtime/autoload/man.vim index ec48d96dd6..8825719ec7 100644 --- a/runtime/autoload/man.vim +++ b/runtime/autoload/man.vim @@ -264,14 +264,6 @@ function! s:push_tag() abort \ }] endfunction -function! man#pop_tag() abort - if !empty(s:tag_stack) - let tag = remove(s:tag_stack, -1) - execute 'silent' tag['buf'].'buffer' - call cursor(tag['lnum'], tag['col']) - endif -endfunction - " extracts the name and sect out of 'path/name.sect' function! s:extract_sect_and_name_path(path) abort let tail = fnamemodify(a:path, ':t') @@ -410,4 +402,19 @@ function! man#init_pager() abort endif endfunction +function! man#goto_tag(pattern, flags, info) abort + " currently no support for section completion + let sect = "" + + let candidates = s:get_paths(sect, a:pattern) + + return map(candidates, { + \ _, path -> { + \ 'name': s:extract_sect_and_name_path(path)[1], + \ 'filename': 'man://' . path, + \ 'cmd': '1' + \ } + \ }) +endfunction + call s:init() diff --git a/runtime/ftplugin/man.vim b/runtime/ftplugin/man.vim index 6c7f095f62..b3b23833ba 100644 --- a/runtime/ftplugin/man.vim +++ b/runtime/ftplugin/man.vim @@ -20,13 +20,13 @@ setlocal wrap breakindent linebreak setlocal nonumber norelativenumber setlocal foldcolumn=0 colorcolumn=0 nolist nofoldenable +setlocal tagfunc=man#goto_tag + if !exists('g:no_plugin_maps') && !exists('g:no_man_maps') nnoremap j gj nnoremap k gk nnoremap gO :call man#show_toc() - nnoremap :Man nnoremap K :Man - nnoremap :call man#pop_tag() if 1 == bufnr('%') || s:pager nnoremap q :lclose:q else -- cgit From 2f0412e61d3c5113f9c121283a7e94a294706387 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Thu, 24 Oct 2019 20:48:18 +0100 Subject: man.vim: `:Man` preserves the tag stack --- runtime/autoload/man.vim | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) (limited to 'runtime') diff --git a/runtime/autoload/man.vim b/runtime/autoload/man.vim index 8825719ec7..9280474516 100644 --- a/runtime/autoload/man.vim +++ b/runtime/autoload/man.vim @@ -64,8 +64,9 @@ function! man#open_page(count, count1, mods, ...) abort return endtry - call s:push_tag() - let bufname = 'man://'.name.(empty(sect)?'':'('.sect.')') + let fullname = name.(empty(sect)?'':'('.sect.')') + call s:push_tag(fullname) + let bufname = 'man://'.fullname try set eventignore+=BufReadCmd @@ -254,14 +255,30 @@ function! s:verify_exists(sect, name) abort return s:extract_sect_and_name_path(path) + [path] endfunction -let s:tag_stack = [] +function! s:push_tag(name) abort + " emulate vim's tag pushing for cases where we don't use 'tagfunc' + if !&tagstack + return + endif + + let winnr = winnr() + let stack = gettagstack(winnr) + + let curidx = stack.curidx + let items = stack.items + + let newstack = items[0 : curidx - 1] + let newstack += [{ + \ 'bufnr': bufnr('%'), + \ 'from': getpos('.'), + \ 'matchnr': 0, + \ 'tagname': a:name, + \ }] -function! s:push_tag() abort - let s:tag_stack += [{ - \ 'buf': bufnr('%'), - \ 'lnum': line('.'), - \ 'col': col('.'), - \ }] + call settagstack(winnr, { + \ 'length': len(newstack), + \ 'items': newstack, + \ }) endfunction " extracts the name and sect out of 'path/name.sect' -- cgit From 0173bdf98be6f867d1b316d4d2ac87f7a93d95e4 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Thu, 24 Oct 2019 21:15:08 +0100 Subject: man.vim: parse the section from the tag --- runtime/autoload/man.vim | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'runtime') diff --git a/runtime/autoload/man.vim b/runtime/autoload/man.vim index 9280474516..08c6fc1eca 100644 --- a/runtime/autoload/man.vim +++ b/runtime/autoload/man.vim @@ -420,10 +420,9 @@ function! man#init_pager() abort endfunction function! man#goto_tag(pattern, flags, info) abort - " currently no support for section completion - let sect = "" + let [sect, name] = man#extract_sect_and_name_ref(a:pattern) - let candidates = s:get_paths(sect, a:pattern) + let candidates = s:get_paths(sect, name) return map(candidates, { \ _, path -> { -- cgit From c6afad78d39aa77a4d372759336018ef6e101dab Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Tue, 29 Oct 2019 18:41:30 +0000 Subject: man.vim: remove push_tag and simplify man#open_page --- runtime/autoload/man.vim | 50 ++++++------------------------------------------ 1 file changed, 6 insertions(+), 44 deletions(-) (limited to 'runtime') diff --git a/runtime/autoload/man.vim b/runtime/autoload/man.vim index 08c6fc1eca..ecbe4bb374 100644 --- a/runtime/autoload/man.vim +++ b/runtime/autoload/man.vim @@ -64,34 +64,22 @@ function! man#open_page(count, count1, mods, ...) abort return endtry - let fullname = name.(empty(sect)?'':'('.sect.')') - call s:push_tag(fullname) - let bufname = 'man://'.fullname - + let [l:buf, l:save_tfu] = [bufnr(), &tagfunc] try set eventignore+=BufReadCmd + set tagfunc=man#goto_tag + let l:target = l:name . '(' . l:sect . ')' if a:mods !~# 'tab' && s:find_man() - execute 'silent keepalt edit' fnameescape(bufname) + execute 'silent keepalt tag' l:target else - execute 'silent keepalt' a:mods 'split' fnameescape(bufname) + execute 'silent keepalt' a:mods 'stag' l:target endif finally + call setbufvar(l:buf, '&tagfunc', l:save_tfu) set eventignore-=BufReadCmd endtry - try - let page = s:get_page(path) - catch - if a:mods =~# 'tab' || !s:find_man() - " a new window was opened - close - endif - call s:error(v:exception) - return - endtry - let b:man_sect = sect - call s:put_page(page) endfunction function! man#read_page(ref) abort @@ -255,32 +243,6 @@ function! s:verify_exists(sect, name) abort return s:extract_sect_and_name_path(path) + [path] endfunction -function! s:push_tag(name) abort - " emulate vim's tag pushing for cases where we don't use 'tagfunc' - if !&tagstack - return - endif - - let winnr = winnr() - let stack = gettagstack(winnr) - - let curidx = stack.curidx - let items = stack.items - - let newstack = items[0 : curidx - 1] - let newstack += [{ - \ 'bufnr': bufnr('%'), - \ 'from': getpos('.'), - \ 'matchnr': 0, - \ 'tagname': a:name, - \ }] - - call settagstack(winnr, { - \ 'length': len(newstack), - \ 'items': newstack, - \ }) -endfunction - " extracts the name and sect out of 'path/name.sect' function! s:extract_sect_and_name_path(path) abort let tail = fnamemodify(a:path, ':t') -- cgit From aeee41192b4b1e8733f1fa2ebdea32a5dd21dca5 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 13 Nov 2019 21:56:20 +0000 Subject: Remove eventignore - :Man now uses :tag to populate the page --- runtime/autoload/man.vim | 2 -- 1 file changed, 2 deletions(-) (limited to 'runtime') diff --git a/runtime/autoload/man.vim b/runtime/autoload/man.vim index ecbe4bb374..f2d34ab82d 100644 --- a/runtime/autoload/man.vim +++ b/runtime/autoload/man.vim @@ -66,7 +66,6 @@ function! man#open_page(count, count1, mods, ...) abort let [l:buf, l:save_tfu] = [bufnr(), &tagfunc] try - set eventignore+=BufReadCmd set tagfunc=man#goto_tag let l:target = l:name . '(' . l:sect . ')' if a:mods !~# 'tab' && s:find_man() @@ -76,7 +75,6 @@ function! man#open_page(count, count1, mods, ...) abort endif finally call setbufvar(l:buf, '&tagfunc', l:save_tfu) - set eventignore-=BufReadCmd endtry let b:man_sect = sect -- cgit From 18c5f6ab9fa58a69d02a7993dd3ff6f0b9882f26 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 13 Nov 2019 21:57:17 +0000 Subject: Don't attempt swapfiles for man pages This is because we now use :tag to open a man page, which attempts to open a swap file for a path under man://... --- runtime/autoload/man.vim | 1 + 1 file changed, 1 insertion(+) (limited to 'runtime') diff --git a/runtime/autoload/man.vim b/runtime/autoload/man.vim index f2d34ab82d..078ccbb429 100644 --- a/runtime/autoload/man.vim +++ b/runtime/autoload/man.vim @@ -150,6 +150,7 @@ endfunction function! s:put_page(page) abort setlocal modifiable setlocal noreadonly + setlocal noswapfile silent keepjumps %delete _ silent put =a:page while getline(1) =~# '^\s*$' -- cgit From 807e4039cb209539dc71aacbd1718666c18d4552 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 13 Nov 2019 22:00:11 +0000 Subject: Sort man pages by relevance during goto_tag() --- runtime/autoload/man.vim | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'runtime') diff --git a/runtime/autoload/man.vim b/runtime/autoload/man.vim index 078ccbb429..6c74617aca 100644 --- a/runtime/autoload/man.vim +++ b/runtime/autoload/man.vim @@ -381,14 +381,23 @@ function! man#init_pager() abort endfunction function! man#goto_tag(pattern, flags, info) abort - let [sect, name] = man#extract_sect_and_name_ref(a:pattern) + let [l:sect, l:name] = man#extract_sect_and_name_ref(a:pattern) - let candidates = s:get_paths(sect, name) + let l:paths = s:get_paths(l:sect, l:name) + let l:structured = [] - return map(candidates, { - \ _, path -> { - \ 'name': s:extract_sect_and_name_path(path)[1], - \ 'filename': 'man://' . path, + for l:path in l:paths + let l:n = s:extract_sect_and_name_path(l:path)[1] + let l:structured += [{ 'name': l:n, 'path': l:path }] + endfor + + " sort by relevance - exact matches first, then the previous order + call sort(l:structured, { a, b -> a.name ==? l:name ? -1 : b.name ==? l:name ? 1 : 0 }) + + return map(l:structured, { + \ _, entry -> { + \ 'name': entry.name, + \ 'filename': 'man://' . entry.path, \ 'cmd': '1' \ } \ }) -- cgit