Introduce a debug flags option to control some tracing
Support shell|hooks and write traces in debug buffer
This commit is contained in:
parent
b67d593551
commit
c0f1b7b99f
|
@ -49,6 +49,8 @@ void HookManager::run_hook(StringView hook_name,
|
||||||
if (hook_list_it == m_hook.end())
|
if (hook_list_it == m_hook.end())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
const bool trace = context.options()["debug"].get<DebugFlags>() & DebugFlags::Hooks;
|
||||||
|
|
||||||
auto& disabled_hooks = context.options()["disabled_hooks"].get<Regex>();
|
auto& disabled_hooks = context.options()["disabled_hooks"].get<Regex>();
|
||||||
bool hook_error = false;
|
bool hook_error = false;
|
||||||
for (auto& hook : hook_list_it->value)
|
for (auto& hook : hook_list_it->value)
|
||||||
|
@ -59,6 +61,9 @@ void HookManager::run_hook(StringView hook_name,
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if (trace)
|
||||||
|
write_to_debug_buffer(format("hook {}/{}", hook_name, hook.key));
|
||||||
|
|
||||||
hook.value(param, context);
|
hook.value(param, context);
|
||||||
}
|
}
|
||||||
catch (runtime_error& err)
|
catch (runtime_error& err)
|
||||||
|
|
|
@ -240,6 +240,7 @@ void register_options()
|
||||||
UserInterface::Options{});
|
UserInterface::Options{});
|
||||||
reg.declare_option("modelinefmt", "format string used to generate the modeline",
|
reg.declare_option("modelinefmt", "format string used to generate the modeline",
|
||||||
"%val{bufname} %val{cursor_line}:%val{cursor_char_column} "_str);
|
"%val{bufname} %val{cursor_line}:%val{cursor_char_column} "_str);
|
||||||
|
reg.declare_option("debug", "various debug flags", DebugFlags::None);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct convert_to_client_mode
|
struct convert_to_client_mode
|
||||||
|
|
|
@ -223,24 +223,15 @@ inline void option_from_string(StringView str, YesNoAsk& opt)
|
||||||
throw runtime_error(format("invalid value '{}', expected yes, no or ask", str));
|
throw runtime_error(format("invalid value '{}', expected yes, no or ask", str));
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class AutoInfo
|
template<typename T> struct EnumInfo;
|
||||||
|
|
||||||
|
template<typename Flags,
|
||||||
|
typename = EnableIfWithBitOps<Flags>,
|
||||||
|
typename = decltype(EnumInfo<Flags>::values(), EnumInfo<Flags>::names())>
|
||||||
|
String option_to_string(Flags flags)
|
||||||
{
|
{
|
||||||
None = 0,
|
auto names = EnumInfo<Flags>::names();
|
||||||
Command = 1 << 0,
|
auto values = EnumInfo<Flags>::values();
|
||||||
OnKey = 1 << 1,
|
|
||||||
Normal = 1 << 2
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct WithBitOps<AutoInfo> : std::true_type {};
|
|
||||||
|
|
||||||
constexpr AutoInfo autoinfo_values[] = { AutoInfo::Command, AutoInfo::OnKey, AutoInfo::Normal };
|
|
||||||
constexpr StringView autoinfo_names[] = { "command", "onkey", "normal" };
|
|
||||||
|
|
||||||
template<typename Flags, typename = EnableIfWithBitOps<Flags>>
|
|
||||||
String to_string(Flags flags, ArrayView<const Flags> values, ArrayView<const StringView> names)
|
|
||||||
{
|
|
||||||
kak_assert(values.size() == names.size());
|
|
||||||
String res;
|
String res;
|
||||||
for (int i = 0; i < values.size(); ++i)
|
for (int i = 0; i < values.size(); ++i)
|
||||||
{
|
{
|
||||||
|
@ -253,11 +244,14 @@ String to_string(Flags flags, ArrayView<const Flags> values, ArrayView<const Str
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Flags, typename = EnableIfWithBitOps<Flags>>
|
template<typename Flags,
|
||||||
Flags string_to_flags(StringView str, ArrayView<const Flags> values, ArrayView<const StringView> names)
|
typename = EnableIfWithBitOps<Flags>,
|
||||||
|
typename = decltype(EnumInfo<Flags>::values(), EnumInfo<Flags>::names())>
|
||||||
|
void option_from_string(StringView str, Flags& flags)
|
||||||
{
|
{
|
||||||
kak_assert(values.size() == names.size());
|
auto names = EnumInfo<Flags>::names();
|
||||||
Flags flags{};
|
auto values = EnumInfo<Flags>::values();
|
||||||
|
flags = Flags{};
|
||||||
for (auto s : split(str, '|'))
|
for (auto s : split(str, '|'))
|
||||||
{
|
{
|
||||||
auto it = std::find(names.begin(), names.end(), s);
|
auto it = std::find(names.begin(), names.end(), s);
|
||||||
|
@ -265,18 +259,58 @@ Flags string_to_flags(StringView str, ArrayView<const Flags> values, ArrayView<c
|
||||||
throw runtime_error(format("invalid flag value '{}'", s));
|
throw runtime_error(format("invalid flag value '{}'", s));
|
||||||
flags |= values[it - names.begin()];
|
flags |= values[it - names.begin()];
|
||||||
}
|
}
|
||||||
return flags;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline String option_to_string(AutoInfo opt)
|
enum class AutoInfo
|
||||||
{
|
{
|
||||||
return to_string<AutoInfo>(opt, autoinfo_values, autoinfo_names);
|
None = 0,
|
||||||
}
|
Command = 1 << 0,
|
||||||
|
OnKey = 1 << 1,
|
||||||
|
Normal = 1 << 2
|
||||||
|
};
|
||||||
|
|
||||||
inline void option_from_string(StringView str, AutoInfo& opt)
|
template<>
|
||||||
|
struct WithBitOps<AutoInfo> : std::true_type {};
|
||||||
|
|
||||||
|
template<> struct EnumInfo<AutoInfo>
|
||||||
{
|
{
|
||||||
opt = string_to_flags<AutoInfo>(str, autoinfo_values, autoinfo_names);
|
static ArrayView<const AutoInfo> values()
|
||||||
}
|
{
|
||||||
|
static constexpr AutoInfo values[] = { AutoInfo::Command, AutoInfo::OnKey, AutoInfo::Normal };
|
||||||
|
return { values };
|
||||||
|
}
|
||||||
|
|
||||||
|
static ArrayView<const StringView> names()
|
||||||
|
{
|
||||||
|
static constexpr StringView names[] = { "command", "onkey", "normal" };
|
||||||
|
return { names };
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class DebugFlags
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Hooks = 1 << 0,
|
||||||
|
Shell = 1 << 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct WithBitOps<DebugFlags> : std::true_type {};
|
||||||
|
|
||||||
|
template<> struct EnumInfo<DebugFlags>
|
||||||
|
{
|
||||||
|
static ArrayView<const DebugFlags> values()
|
||||||
|
{
|
||||||
|
static constexpr DebugFlags values[] = { DebugFlags::Hooks, DebugFlags::Shell };
|
||||||
|
return { values };
|
||||||
|
}
|
||||||
|
|
||||||
|
static ArrayView<const StringView> names()
|
||||||
|
{
|
||||||
|
static constexpr StringView names[] = { "hooks", "shell" };
|
||||||
|
return { names };
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,9 @@ std::pair<String, int> ShellManager::eval(
|
||||||
{
|
{
|
||||||
static const Regex re(R"(\bkak_(\w+)\b)");
|
static const Regex re(R"(\bkak_(\w+)\b)");
|
||||||
|
|
||||||
|
if (context.options()["debug"].get<DebugFlags>() & DebugFlags::Shell)
|
||||||
|
write_to_debug_buffer(format("shell:\n{}\n----\n", cmdline));
|
||||||
|
|
||||||
Vector<String> kak_env;
|
Vector<String> kak_env;
|
||||||
for (RegexIterator<const char*> it{cmdline.begin(), cmdline.end(), re}, end;
|
for (RegexIterator<const char*> it{cmdline.begin(), cmdline.end(), re}, end;
|
||||||
it != end; ++it)
|
it != end; ++it)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user