kakoune/rc/tools/doc.kak
Markus F.X.J. Oberhumer c4c093d764 doc: small UX improvements.
Place the cursor at the beginning of the file (and not at
the end of the first line) and improve error message in
case of failure.
2021-05-02 11:27:48 +02:00

195 lines
6.5 KiB
Plaintext

declare-option -docstring "name of the client in which documentation is to be displayed" \
str docsclient
declare-option -hidden range-specs doc_render_ranges
declare-option -hidden range-specs doc_links
declare-option -hidden range-specs doc_anchors
define-command -hidden -params 4 doc-render-regex %{
evaluate-commands -draft %{ try %{
execute-keys <percent> s %arg{1} <ret>
execute-keys -draft s %arg{2} <ret> d
execute-keys "%arg{3}"
evaluate-commands %sh{
face="$4"
eval "set -- $kak_quoted_selections_desc"
ranges=""
for desc in "$@"; do ranges="$ranges '$desc|$face'"; done
echo "update-option buffer doc_render_ranges"
echo "set-option -add buffer doc_render_ranges $ranges"
}
} }
}
define-command -hidden doc-parse-links %{
evaluate-commands -draft %{ try %{
execute-keys <percent> s <lt><lt>(.*?),.*?<gt><gt> <ret>
execute-keys -draft s <lt><lt>.*,|<gt><gt> <ret> d
execute-keys H
set-option buffer doc_links %val{timestamp}
update-option buffer doc_render_ranges
evaluate-commands -itersel %{
set-option -add buffer doc_links "%val{selection_desc}|%reg{1}"
set-option -add buffer doc_render_ranges "%val{selection_desc}|default+u"
}
} }
}
define-command -hidden doc-parse-anchors %{
evaluate-commands -draft %{ try %{
set-option buffer doc_anchors %val{timestamp}
# Find sections as add them as imlicit anchors
execute-keys <percent> s ^={2,}\h+([^\n]+)$ <ret>
evaluate-commands -itersel %{
set-option -add buffer doc_anchors "%val{selection_desc}|%sh{printf '%s' ""$kak_main_reg_1"" | tr '[A-Z ]' '[a-z-]'}"
}
# Parse explicit anchors and remove their text
execute-keys <percent> s \[\[(.*?)\]\]\s* <ret>
evaluate-commands -itersel %{
set-option -add buffer doc_anchors "%val{selection_desc}|%reg{1}"
}
execute-keys d
update-option buffer doc_anchors
} }
}
define-command -hidden doc-jump-to-anchor -params 1 %{
update-option buffer doc_anchors
evaluate-commands %sh{
anchor="$1"
eval "set -- $kak_quoted_opt_doc_anchors"
shift
for range in "$@"; do
if [ "${range#*|}" = "$anchor" ]; then
printf '%s\n' "select '${range%|*}'; execute-keys vv"
exit
fi
done
printf "fail No such anchor '%s'\n" "${anchor}"
}
}
define-command -hidden doc-follow-link %{
update-option buffer doc_links
evaluate-commands %sh{
eval "set -- $kak_quoted_opt_doc_links"
for link in "$@"; do
printf '%s\n' "$link"
done | awk -v FS='[.,|#]' '
BEGIN {
l=ENVIRON["kak_cursor_line"];
c=ENVIRON["kak_cursor_column"];
}
l >= $1 && c >= $2 && l <= $3 && c <= $4 {
if (NF == 6) {
print "doc " $5
if ($6 != "") {
print "doc-jump-to-anchor %{" $6 "}"
}
} else {
print "doc-jump-to-anchor %{" $5 "}"
}
exit
}
'
}
}
define-command -params 1 -hidden doc-render %{
edit! -scratch "*doc-%sh{basename $1 .asciidoc}*"
execute-keys "!cat %arg{1}<ret>gg"
doc-parse-anchors
# Join paragraphs together
try %{
execute-keys -draft '%S\n{2,}|(?<lt>=\+)\n|^[^\n]+::\n|^\h*[*-]\h+<ret>' \
<a-K>^\h*-{2,}(\n|\z)<ret> S\n\z<ret> <a-k>\n<ret> <a-j>
}
# Remove some line end markers
try %{ execute-keys -draft <percent> s \h*(\+|:{2,})$ <ret> d }
# Setup the doc_render_ranges option
set-option buffer doc_render_ranges %val{timestamp}
doc-render-regex \B(?<!\\)\*(?=\S)[^\n]+?(?<=\S)(?<!\\)\*\B \A|.\z 'H' default+b
doc-render-regex \b(?<!\\)_(?=\S)[^\n]+?(?<=\S)(?<!\\)_\b \A|.\z 'H' default+i
doc-render-regex \B(?<!\\)`(?=\S)[^\n]+?(?<=\S)`\B \A|.\z 'H' mono
doc-render-regex ^=\h+[^\n]+ ^=\h+ '~' title
doc-render-regex ^={2,}\h+[^\n]+ ^={2,}\h+ '' header
doc-render-regex ^\h*-{2,}\n\h*.*?^\h*-{2,}\n ^\h*-{2,}\n '' block
doc-parse-links
# Remove escaping of * and `
try %{ execute-keys -draft <percent> s \\((?=\*)|(?=`)) <ret> d }
# Go to beginning of file
execute-keys 'gg'
set-option buffer readonly true
add-highlighter buffer/ ranges doc_render_ranges
add-highlighter buffer/ wrap -word -indent
map buffer normal <ret> ': doc-follow-link<ret>'
}
define-command -params 0..2 \
-shell-script-candidates %{
if [ "$kak_token_to_complete" -eq 0 ]; then
find -L \
"${kak_config}/autoload/" \
"${kak_runtime}/doc/" \
"${kak_runtime}/rc/" \
-type f -name "*.asciidoc" |
sed 's,.*/,,; s/\.[^.]*$//'
elif [ "$kak_token_to_complete" -eq 1 ]; then
page=$(
find -L \
"${kak_config}/autoload/" \
"${kak_runtime}/doc/" \
"${kak_runtime}/rc/" \
-type f -name "$1.asciidoc" |
head -1
)
if [ -f "${page}" ]; then
awk '
/^==+ +/ { sub(/^==+ +/, ""); print }
/^\[\[[^\]]+\]\]/ { sub(/^\[\[/, ""); sub(/\]\].*/, ""); print }
' < $page | tr '[A-Z ]' '[a-z-]'
fi
fi
} \
doc -docstring %{
doc <topic> [<keyword>]: open a buffer containing documentation about a given topic
An optional keyword argument can be passed to the function, which will be automatically selected in the documentation
See `:doc doc` for details.
} %{
evaluate-commands %sh{
topic="doc"
if [ $# -ge 1 ]; then
topic="$1"
fi
page=$(
find -L \
"${kak_config}/autoload/" \
"${kak_runtime}/doc/" \
"${kak_runtime}/rc/" \
-type f -name "$topic.asciidoc" |
head -1
)
if [ -f "${page}" ]; then
jump_cmd=""
if [ $# -eq 2 ]; then
jump_cmd="doc-jump-to-anchor '$2'"
fi
printf %s\\n "evaluate-commands -try-client %opt{docsclient} %{ doc-render ${page}; ${jump_cmd} }"
else
printf 'fail No such doc file: %s\n' "$topic.asciidoc"
fi
}
}
alias global help doc