summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2019-09-15 09:05:12 +1000
committerMaxime Coste <mawww@kakoune.org>2019-09-15 09:05:12 +1000
commit7aec8b22319ff4e3fdc6160e8b4dbd2a4e3567f2 (patch)
treeee8a8b6aeb3ac83e2bba4074074d17710d2a6622
parent54ba6a44c84419b0ac86f1e67142b68bb3af5445 (diff)
parentb1602d44904fb62b61e87be91c9fc6dc0076da52 (diff)
Merge remote-tracking branch 'stevenyvr987/add-hyperlink-support-to-man-plugin'
-rw-r--r--rc/tools/man.kak92
1 files changed, 82 insertions, 10 deletions
diff --git a/rc/tools/man.kak b/rc/tools/man.kak
index d75a8188..b167343e 100644
--- a/rc/tools/man.kak
+++ b/rc/tools/man.kak
@@ -1,7 +1,7 @@
declare-option -docstring "name of the client in which documentation is to be displayed" \
str docsclient
-declare-option -hidden str manpage
+declare-option -hidden str-list manpage
hook -group man-highlight global WinSetOption filetype=man %{
add-highlighter window/man-highlight group
@@ -14,11 +14,16 @@ hook -group man-highlight global WinSetOption filetype=man %{
# References to other manpages
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 -group man-hooks window WinResize .* %{ man-impl %val{bufname} %opt{manpage} }
+ hook -group man-hooks window WinResize .* %{ man-impl %opt{manpage} }
hook -once -always window WinSetOption filetype=.* %{ remove-hooks window man-hooks }
}
@@ -26,22 +31,30 @@ define-command -hidden -params 2..3 man-impl %{ evaluate-commands %sh{
buffer_name="$1"
shift
manout=$(mktemp "${TMPDIR:-/tmp}"/kak-man-XXXXXX)
+ manerr=$(mktemp "${TMPDIR:-/tmp}"/kak-man-XXXXXX)
colout=$(mktemp "${TMPDIR:-/tmp}"/kak-man-XXXXXX)
- MANWIDTH=${kak_window_width} man "$@" > $manout 2>/dev/null
+ MANWIDTH=${kak_window_width} man "$@" > "$manout" 2> "$manerr"
retval=$?
col -b -x > ${colout} < ${manout}
rm ${manout}
if [ "${retval}" -eq 0 ]; then
printf %s\\n "
- edit -scratch '$buffer_name'
+ edit -scratch %{*$buffer_name ${*}*}
execute-keys '%|cat<space>${colout}<ret>gk'
- nop %sh{rm ${colout}}
+ nop %sh{ rm ${colout}; rm ${manerr} }
set-option buffer filetype man
- set-option window manpage '$@'
+ set-option window manpage $buffer_name $*
+ "
+ elif [ "${retval}" -eq 16 ]; then
+ printf %s\\n "
+ echo -markup %{{Error}$(cat $manerr)}
+ nop %sh{ rm ${colout}; rm ${manerr} }
"
else
- printf %s\\n "echo -markup %{{Error}man '$@' failed: see *debug* buffer for details}"
- rm ${colout}
+ printf %s\\n "
+ fail $(cat $manerr)
+ nop %sh{ rm ${colout}; rm ${manerr} }
+ "
fi
} }
@@ -64,5 +77,64 @@ The page can be a word, or a word directly followed by a section number between
;;
esac
- 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'