658c3385a9
When using either of set-option g completers option=my_option prompt -shell-script-candidates ... While the search text is empty, the completions will be sorted alphabetically. This is bad because it means the most important entries are not listed first, making them harder to select or even spot. Let's apply input order before resorting to sorting alphabetically. In theory there is a more elegant solution: sort candidates (except if they're user input) before passing them to RankedMatch, and then always use stable sort. However that doesn't work because we use a heap which doesn't support stable sort. Closes #1709, #4813
196 lines
6.5 KiB
Plaintext
196 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 doc -params 0..2 -menu -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" 2>/dev/null |
|
|
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
|
|
}
|
|
}
|
|
|
|
complete-command doc shell-script-candidates %{
|
|
case "$kak_token_to_complete" in
|
|
0)
|
|
find -L \
|
|
"${kak_config}/autoload/" \
|
|
"${kak_runtime}/doc/" \
|
|
"${kak_runtime}/rc/" \
|
|
-type f -name "*.asciidoc" 2>/dev/null |
|
|
sed 's,.*/,,; s/\.[^.]*$//';;
|
|
1)
|
|
page=$(
|
|
find -L \
|
|
"${kak_config}/autoload/" \
|
|
"${kak_runtime}/doc/" \
|
|
"${kak_runtime}/rc/" \
|
|
-type f -name "$1.asciidoc" 2>/dev/null |
|
|
head -1
|
|
)
|
|
if [ -f "${page}" ]; then
|
|
awk '
|
|
/^==+ +/ { sub(/^==+ +/, ""); print }
|
|
/^\[\[[^\]]+\]\]/ { sub(/^\[\[/, ""); sub(/\]\].*/, ""); print }
|
|
' < $page | tr '[A-Z ]' '[a-z-]'
|
|
fi;;
|
|
esac | sort
|
|
}
|
|
|
|
alias global help doc
|