2017-11-03 10:34:41 +03:00
|
|
|
|
declare-option -docstring "name of the client in which documentation is to be displayed" \
|
2017-05-16 14:35:43 +03:00
|
|
|
|
str docsclient
|
2013-04-18 21:07:31 +04:00
|
|
|
|
|
2019-04-20 22:39:40 +03:00
|
|
|
|
declare-option -hidden str-list manpage
|
2016-05-14 19:09:26 +03:00
|
|
|
|
|
2016-09-25 16:15:07 +03:00
|
|
|
|
hook -group man-highlight global WinSetOption filetype=man %{
|
2018-07-05 11:00:37 +03:00
|
|
|
|
add-highlighter window/man-highlight group
|
2016-02-02 09:16:23 +03:00
|
|
|
|
# Sections
|
2018-08-09 12:27:40 +03:00
|
|
|
|
add-highlighter window/man-highlight/ regex ^\S.*?$ 0:title
|
2016-02-02 09:16:23 +03:00
|
|
|
|
# Subsections
|
2018-07-05 11:00:37 +03:00
|
|
|
|
add-highlighter window/man-highlight/ regex '^ {3}\S.*?$' 0:default+b
|
2016-02-02 09:16:23 +03:00
|
|
|
|
# Command line options
|
2018-08-09 12:27:40 +03:00
|
|
|
|
add-highlighter window/man-highlight/ regex '^ {7}-[^\s,]+(,\s+-[^\s,]+)*' 0:list
|
2016-02-02 09:16:23 +03:00
|
|
|
|
# References to other manpages
|
2018-08-09 12:27:40 +03:00
|
|
|
|
add-highlighter window/man-highlight/ regex [-a-zA-Z0-9_.]+\([a-z0-9]+\) 0:header
|
2016-05-14 19:09:26 +03:00
|
|
|
|
|
2019-04-24 22:39:26 +03:00
|
|
|
|
map window normal <ret> ': man-jump<ret>'
|
|
|
|
|
|
|
|
|
|
hook -once -always window WinSetOption filetype=.* %{
|
|
|
|
|
remove-highlighter window/man-highlight
|
|
|
|
|
unmap window normal <ret>
|
|
|
|
|
}
|
2013-04-18 21:07:31 +04:00
|
|
|
|
}
|
|
|
|
|
|
2018-11-28 12:39:07 +03:00
|
|
|
|
hook global WinSetOption filetype=man %{
|
2019-04-20 22:39:40 +03:00
|
|
|
|
hook -group man-hooks window WinResize .* %{ man-impl %opt{manpage} }
|
2018-12-11 02:11:35 +03:00
|
|
|
|
hook -once -always window WinSetOption filetype=.* %{ remove-hooks window man-hooks }
|
2013-04-18 21:07:31 +04:00
|
|
|
|
}
|
|
|
|
|
|
2020-06-03 15:47:46 +03:00
|
|
|
|
define-command -hidden -params ..3 man-impl %{ evaluate-commands %sh{
|
2017-12-06 09:49:38 +03:00
|
|
|
|
buffer_name="$1"
|
2020-06-03 15:47:46 +03:00
|
|
|
|
if [ -z "${buffer_name}" ]; then
|
|
|
|
|
exit
|
|
|
|
|
fi
|
2017-12-06 09:49:38 +03:00
|
|
|
|
shift
|
2020-11-30 14:24:06 +03:00
|
|
|
|
manout=$(mktemp "${TMPDIR:-/tmp}"/kak-man.XXXXXX)
|
|
|
|
|
manerr=$(mktemp "${TMPDIR:-/tmp}"/kak-man.XXXXXX)
|
|
|
|
|
colout=$(mktemp "${TMPDIR:-/tmp}"/kak-man.XXXXXX)
|
2019-10-20 22:38:58 +03:00
|
|
|
|
env MANWIDTH=${kak_window_range##* } man "$@" > "$manout" 2> "$manerr"
|
2014-03-07 01:33:01 +04:00
|
|
|
|
retval=$?
|
2021-01-25 09:09:59 +03:00
|
|
|
|
if command -v col >/dev/null; then
|
|
|
|
|
col -b -x > ${colout} < ${manout}
|
|
|
|
|
else
|
|
|
|
|
sed 's/.//g' > ${colout} < ${manout}
|
|
|
|
|
fi
|
2014-03-07 01:33:01 +04:00
|
|
|
|
rm ${manout}
|
2021-01-25 09:09:59 +03:00
|
|
|
|
|
2014-03-07 01:33:01 +04:00
|
|
|
|
if [ "${retval}" -eq 0 ]; then
|
2016-05-14 19:09:26 +03:00
|
|
|
|
printf %s\\n "
|
2019-04-20 22:39:40 +03:00
|
|
|
|
edit -scratch %{*$buffer_name ${*}*}
|
2017-11-03 11:09:45 +03:00
|
|
|
|
execute-keys '%|cat<space>${colout}<ret>gk'
|
2019-04-17 00:22:42 +03:00
|
|
|
|
nop %sh{ rm ${colout}; rm ${manerr} }
|
2017-11-03 10:34:41 +03:00
|
|
|
|
set-option buffer filetype man
|
2019-04-20 22:39:40 +03:00
|
|
|
|
set-option window manpage $buffer_name $*
|
2016-05-14 19:09:26 +03:00
|
|
|
|
"
|
2013-04-18 21:07:31 +04:00
|
|
|
|
else
|
2019-11-14 10:32:55 +03:00
|
|
|
|
printf '
|
|
|
|
|
fail %%{%s}
|
|
|
|
|
nop %%sh{ rm "%s"; rm "%s" }
|
|
|
|
|
' "$(cat "$manerr")" "${colout}" "${manerr}"
|
2013-04-18 21:07:31 +04:00
|
|
|
|
fi
|
2013-12-07 17:56:56 +04:00
|
|
|
|
} }
|
|
|
|
|
|
2017-11-03 10:34:41 +03:00
|
|
|
|
define-command -params ..1 \
|
2020-02-03 22:53:28 +03:00
|
|
|
|
-shell-script-candidates %{
|
2020-04-27 10:19:30 +03:00
|
|
|
|
find /usr/share/man/ $(printf %s "${MANPATH}" | sed 's/:/ /') -name '*.[1-8]*' | sed 's,^.*/\(.*\)\.\([1-8][a-zA-Z]*\).*$,\1(\2),'
|
2020-02-03 22:53:28 +03:00
|
|
|
|
} \
|
|
|
|
|
-docstring %{
|
|
|
|
|
man [<page>]: manpage viewer wrapper
|
|
|
|
|
If no argument is passed to the command, the selection will be used as page
|
|
|
|
|
The page can be a word, or a word directly followed by a section number between parenthesis, e.g. kak(1)
|
|
|
|
|
} man %{ evaluate-commands %sh{
|
2017-12-06 08:23:39 +03:00
|
|
|
|
subject=${1-$kak_selection}
|
2015-12-01 12:09:26 +03:00
|
|
|
|
|
|
|
|
|
## The completion suggestions display the page number, strip them if present
|
2017-07-17 08:16:34 +03:00
|
|
|
|
case "${subject}" in
|
|
|
|
|
*\([1-8]*\))
|
2019-06-07 22:34:21 +03:00
|
|
|
|
pagenum="${subject##*\(}"
|
|
|
|
|
pagenum="${pagenum%\)}"
|
|
|
|
|
subject="${subject%%\(*}"
|
2017-07-17 08:16:34 +03:00
|
|
|
|
;;
|
2020-08-23 19:55:50 +03:00
|
|
|
|
*)
|
|
|
|
|
pagenum=""
|
|
|
|
|
;;
|
2017-07-17 08:16:34 +03:00
|
|
|
|
esac
|
2015-12-01 12:09:26 +03:00
|
|
|
|
|
2019-04-20 22:39:40 +03:00
|
|
|
|
printf %s\\n "evaluate-commands -try-client %opt{docsclient} man-impl man $pagenum $subject"
|
2013-12-07 17:56:56 +04:00
|
|
|
|
} }
|
2019-04-24 22:39:26 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 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
|
2021-11-04 07:15:43 +03:00
|
|
|
|
declare-user-mode man
|
2019-04-24 22:39:26 +03:00
|
|
|
|
|
2021-11-04 07:17:54 +03:00
|
|
|
|
map global man 'g' -docstring 'Jump to a man page using selected man page link' ': man-jump<ret>'
|
2021-11-04 07:20:10 +03:00
|
|
|
|
map global man 'j' -docstring 'Go to next man page link' ': man-link-next<ret>'
|
|
|
|
|
map global man 'k' -docstring 'Go to previous man page link' ': man-link-prev<ret>'
|
2021-11-04 07:28:06 +03:00
|
|
|
|
map global man 'm' -docstring 'Look up a man page' ':man<space>'
|