Fix #2495 - Add hyperlink support to :man

1. Add commands to navigate between man page links.
2. Add command to jump to a man page by following a man page link.
3. Add key map for <ret> to jump command.
4. Add key maps for a suggested user mode.
This commit is contained in:
Steven Chan 2019-04-24 12:39:26 -07:00
parent 64fd0c72ce
commit b1602d4490

View File

@ -14,7 +14,12 @@ hook -group man-highlight global WinSetOption filetype=man %{
# References to other manpages # References to other manpages
add-highlighter window/man-highlight/ regex [-a-zA-Z0-9_.]+\([a-z0-9]+\) 0:header add-highlighter window/man-highlight/ regex [-a-zA-Z0-9_.]+\([a-z0-9]+\) 0:header
hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/man-highlight } map window normal <ret> ': man-jump<ret>'
hook -once -always window WinSetOption filetype=.* %{
remove-highlighter window/man-highlight
unmap window normal <ret>
}
} }
hook global WinSetOption filetype=man %{ hook global WinSetOption filetype=man %{
@ -74,3 +79,62 @@ The page can be a word, or a word directly followed by a section number between
printf %s\\n "evaluate-commands -try-client %opt{docsclient} man-impl man $pagenum $subject" printf %s\\n "evaluate-commands -try-client %opt{docsclient} man-impl man $pagenum $subject"
} } } }
# The following section of code enables a user
# to go to next or previous man page links and to follow man page links,
# for example, apropos(1), that would normally appear in SEE ALSO sections.
# The user would position the cursor on any character of the link
# and then press <ret> to change to a buffer showing the man page.
# Regex pattern defining a man page link.
# Used for determining if a selection, which may just be a link, is a link.
declare-option -hidden regex man_link1 \
[\w_.:-]+\(\d[a-z]*\)
# Same as above but with lookbehind and lookahead patterns.
# Used for searching for a man page link.
declare-option -hidden regex man_link2 \
"(?:^|(?<=\W))%opt{man_link1}(?=\W)"
# Define a useful command sequence for searching a given regex
# and a given sequence of search keys.
define-command man-search -params 2 %{
set-register / %arg[1]
execute-keys %arg[2]
}
define-command -docstring 'Go to next man page link' \
man-link-next %{ man-search %opt[man_link2] n }
define-command -docstring 'Go to previous man page link' \
man-link-prev %{ man-search %opt[man_link2] <a-n> }
# Expand backward and forward, and then try to search for a man page link
define-command man-link-here %{ evaluate-commands -save-regs / %{
man-search %opt[man_link2] '<a-?>\b\w<ret><a-;>?\)<ret>'
}} -hidden
# Search current selection for a man page link
define-command man-link %{ evaluate-commands -save-regs / %{
man-search %opt[man_link1] s<ret>
}} -hidden
define-command -docstring 'Try to jump to a man page' \
man-jump %{
try %{ man-link } catch %{ man-link-here } catch %{ fail 'Not a valid man page link' }
try %{ man } catch %{ fail 'No man page link to follow' }
}
# Suggested keymaps for a user mode
declare-user-mode man-mode
define-command man-mode-map -params 3 %{
map global man-mode %arg[1] %arg[2] -docstring %arg[3]
} -hidden
man-mode-map 'g' ': man-jump<ret>' 'Jump to a man page using selected man page link'
man-mode-map 'j' ': try %{ man-link-next }<ret>' 'Go to next man page link'
man-mode-map 'k' ': try %{ man-link-prev }<ret>' 'Go to previous man page link'
man-mode-map 'm' ': man<space>' 'Look up a man page'