summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2019-04-15 17:42:58 +0200
committerMaxime Coste <mawww@kakoune.org>2019-04-17 08:38:52 +0200
commit9118a18d5d72ac1814faf9dcba0635560800eb5f (patch)
tree8311fdc5543da08f4d321f7f20025e3b95ddee54
parent02fc42a12a4025352b2da0f99728d5902a9c8448 (diff)
Change completions option docstring element to be an arbitrary command
We can have the previous behaviour by just passing the docstring to `info -placement menu`.
-rw-r--r--doc/interfacing.asciidoc8
-rw-r--r--doc/pages/options.asciidoc14
-rw-r--r--rc/tools/clang.kak3
-rw-r--r--rc/tools/python/jedi.kak2
-rw-r--r--rc/tools/rust/racer.kak3
-rw-r--r--src/insert_completer.cc14
-rw-r--r--src/insert_completer.hh2
7 files changed, 28 insertions, 18 deletions
diff --git a/doc/interfacing.asciidoc b/doc/interfacing.asciidoc
index 5ab5f878..38fbe696 100644
--- a/doc/interfacing.asciidoc
+++ b/doc/interfacing.asciidoc
@@ -85,11 +85,15 @@ External completions are provided using an option to store completion, which
have the following format.
----
-line.column[+len]@timestamp candidate1|desc1|menu1 candidate2|desc2|menu2 ...
+line.column[+len]@timestamp candidate1|select1|menu1 candidate2|select2|menu2 ...
----
the first element of this string list specify where and when this completion
-applies, the others are a triplet `<completion text>|<docstring>|<menu text>`
+applies, the others are a triplet `<completion text>|<select cmd>|<menu text>`
+
+The select command is executed whenever this menu item gets selected, and
+is usually used to display an item specific documentation with
+`info -placement menu '<menu item description>'`
The menu text is a markup string (see <<faces#markup-strings,`:doc faces
markup-strings`>>), so it can contain `{face}` directives.
diff --git a/doc/pages/options.asciidoc b/doc/pages/options.asciidoc
index 6709bf22..008c7606 100644
--- a/doc/pages/options.asciidoc
+++ b/doc/pages/options.asciidoc
@@ -111,12 +111,18 @@ are exclusively available to built-in options.
`set -add` appends the new spec to the list
*completions*::
- a list of `<text>|<docstring>|<menu text>` candidates,
+ a list of `<text>|<select cmd>|<menu text>` candidates,
except for the first element which follows the
`<line>.<column>[+<length>]@<timestamp>` format to define where the
- completion apply in the buffer. Markup (see
- <<faces#markup-strings,`:doc faces markup-strings`>>) can be used in the
- menu text.
+ completion apply in the buffer.
+
+ Select commands are arbitrary kakoune commands that will be executed
+ each time the element is selected in the menu. The common use case is
+ to display element specific documentation.
+
+ Markup can be used in the menu text.
+ (see <<faces#markup-strings,`:doc faces markup-strings`>>)
+
`set -add` adds a new completion to the list
*enum(value1|value2|...)*::
diff --git a/rc/tools/clang.kak b/rc/tools/clang.kak
index 310cca06..f513c626 100644
--- a/rc/tools/clang.kak
+++ b/rc/tools/clang.kak
@@ -57,6 +57,7 @@ The syntaxic errors detected during parsing are shown when auto-diagnostics are
desc=$4 ? $3 "\n" $4 : $3
gsub(/~/, "~~", desc)
+ gsub(/!/, "!!", desc)
gsub(/\|/, "\\|", desc)
if (id in docstrings)
docstrings[id]=docstrings[id] "\n" desc
@@ -69,7 +70,7 @@ The syntaxic errors detected during parsing are shown when auto-diagnostics are
gsub(/(^|[^[:alnum:]_])(operator|new|delete)($|[^{}_[:alnum:]]+)/, "{keyword}&{}", menu)
gsub(/(^|[[:space:]])(int|size_t|bool|char|unsigned|signed|long)($|[[:space:]])/, "{type}&{}", menu)
gsub(/[^{}_[:alnum:]]+/, "{operator}&{}", menu)
- printf "%%~%s|%s|%s~ ", id, docstrings[id], menu
+ printf "%%~%s|info -style menu %!%s!|%s~ ", id, docstrings[id], menu
}
}')
printf %s\\n "evaluate-commands -client ${kak_client} echo 'clang completion done'
diff --git a/rc/tools/python/jedi.kak b/rc/tools/python/jedi.kak
index a0fe9449..f86a20f2 100644
--- a/rc/tools/python/jedi.kak
+++ b/rc/tools/python/jedi.kak
@@ -21,7 +21,7 @@ define-command jedi-complete -docstring "Complete the current selection" %{
compl=$(python 2> "${dir}/fifo" <<-END
import jedi
script=jedi.Script(open('$dir/buf', 'r').read(), $kak_cursor_line, $kak_cursor_column - 1, '$kak_buffile')
- print(' '.join(["'" + (str(c.name).replace("|", "\\|") + "|" + str(c.docstring()).replace("|", "\\|") + "|" + str(c.name).replace("|", "\\|")).replace("~", "~~").replace("'", "''") + "'" for c in script.completions()]))
+ print(' '.join(["'" + (str(c.name).replace("|", "\\|") + "|info -style menu %!" + str(c.docstring()).replace("|", "\\|").replace("!", "!!") + "!|" + str(c.name).replace("|", "\\|")).replace("~", "~~").replace("'", "''") + "'" for c in script.completions()]))
END
)
printf %s\\n "evaluate-commands -client ${kak_client} %~echo completed; set-option %{buffer=${kak_buffile}} jedi_completions ${header} ${compl}~" | kak -p ${kak_session}
diff --git a/rc/tools/rust/racer.kak b/rc/tools/rust/racer.kak
index 2371c597..28890431 100644
--- a/rc/tools/rust/racer.kak
+++ b/rc/tools/rust/racer.kak
@@ -24,6 +24,7 @@ define-command racer-complete -docstring "Complete the current selection with ra
desc = substr($9, 2, length($9) - 2)
gsub(/\|/, "\\|", desc)
gsub(/\\n/, "\n", desc)
+ gsub(/!/, "!!", desc)
menu = $8
sub(/^pub /, "", menu)
gsub(/\|/, "\\|", menu)
@@ -66,7 +67,7 @@ define-command racer-complete -docstring "Complete the current selection with ra
} else {
menu = "{default+F}" word "{default+d} " menu
}
- candidate = word "|" desc "|" menu
+ candidate = word "|info -style menu %!" desc "!|" menu
gsub(/:/, "\\:", candidate)
print candidate
}'
diff --git a/src/insert_completer.cc b/src/insert_completer.cc
index 2c8479a6..3e44d325 100644
--- a/src/insert_completer.cc
+++ b/src/insert_completer.cc
@@ -3,6 +3,7 @@
#include "buffer_manager.hh"
#include "buffer_utils.hh"
#include "client.hh"
+#include "command_manager.hh"
#include "changes.hh"
#include "context.hh"
#include "display_buffer.hh"
@@ -287,7 +288,7 @@ InsertCompletion complete_option(const SelectionList& sels,
using RankedMatch::operator==;
using RankedMatch::operator<;
- StringView docstring;
+ StringView on_select;
DisplayLine menu_entry;
};
@@ -297,7 +298,7 @@ InsertCompletion complete_option(const SelectionList& sels,
{
if (RankedMatchAndInfo match{std::get<0>(candidate), query})
{
- match.docstring = std::get<1>(candidate);
+ match.on_select = std::get<1>(candidate);
auto& menu = std::get<2>(candidate);
match.menu_entry = not menu.empty() ?
parse_display_line(expand_tabs(menu, tabstop, column), faces)
@@ -318,7 +319,7 @@ InsertCompletion complete_option(const SelectionList& sels,
while (candidates.size() < max_count and first != last)
{
if (candidates.empty() or candidates.back().completion != first->candidate())
- candidates.push_back({ first->candidate().str(), first->docstring.str(),
+ candidates.push_back({ first->candidate().str(), first->on_select.str(),
std::move(first->menu_entry) });
std::pop_heap(first, last--, greater);
}
@@ -437,11 +438,6 @@ void InsertCompleter::select(int index, bool relative, Vector<Key>& keystrokes)
if (m_context.has_client())
{
m_context.client().menu_select(m_current_candidate);
- if (not candidate.docstring.empty())
- m_context.client().info_show(candidate.completion, candidate.docstring,
- {}, InfoStyle::MenuDoc);
- else
- m_context.client().info_hide();
}
for (auto i = 0_byte; i < prefix_len; ++i)
@@ -457,6 +453,8 @@ void InsertCompleter::select(int index, bool relative, Vector<Key>& keystrokes)
StringView{} : candidate.completion;
m_context.hooks().run_hook(Hook::InsertCompletionSelect, param, m_context);
}
+ if (not candidate.on_select.empty())
+ CommandManager::instance().execute(candidate.on_select, m_context);
}
void InsertCompleter::update(bool allow_implicit)
diff --git a/src/insert_completer.hh b/src/insert_completer.hh
index 305435a9..1270d732 100644
--- a/src/insert_completer.hh
+++ b/src/insert_completer.hh
@@ -58,7 +58,7 @@ struct InsertCompletion
struct Candidate
{
String completion;
- String docstring;
+ String on_select;
DisplayLine menu_entry;
bool operator==(const Candidate& other) const { return completion == other.completion; }