1
1
mirror of https://github.com/mawww/kakoune.git synced 2024-08-16 16:20:38 +03:00

Add EnterDirectory hook

This hook runs on `change-directory` and is also emitted just before
KakBegin after kakrc has been sourced.
This commit is contained in:
Philipp Jungkamp 2024-06-06 17:24:31 +02:00
parent 07000adb9b
commit 0a10612786
4 changed files with 12 additions and 2 deletions

View File

@ -147,6 +147,11 @@ name. Hooks with no description will always use an empty string.
*SessionRenamed* `<old name>:<new name>`:: *SessionRenamed* `<old name>:<new name>`::
executed when a session is renamed using the `rename-session` command executed when a session is renamed using the `rename-session` command
*EnterDirectory* `path`::
executed on startup and when the current working directory is changed
using the `change-directory` command. The hook param is an absolute path
to the new working directory.
*RuntimeError* `error message`:: *RuntimeError* `error message`::
an error was encountered while executing a user command an error was encountered while executing a user command

View File

@ -2600,13 +2600,15 @@ const CommandDesc change_directory_cmd = {
cursor_pos, FilenameFlags::OnlyDirectories), cursor_pos, FilenameFlags::OnlyDirectories),
Completions::Flags::Menu }; Completions::Flags::Menu };
}), }),
[](const ParametersParser& parser, Context&, const ShellContext&) [](const ParametersParser& parser, Context& ctx, const ShellContext&)
{ {
StringView target = parser.positional_count() == 1 ? StringView{parser[0]} : "~"; StringView target = parser.positional_count() == 1 ? StringView{parser[0]} : "~";
if (chdir(parse_filename(target).c_str()) != 0) auto path = real_path(parse_filename(target));
if (chdir(path.c_str()) != 0)
throw runtime_error(format("unable to change to directory: '{}'", target)); throw runtime_error(format("unable to change to directory: '{}'", target));
for (auto& buffer : BufferManager::instance()) for (auto& buffer : BufferManager::instance())
buffer->update_display_name(); buffer->update_display_name();
ctx.hooks().run_hook(Hook::EnterDirectory, path, ctx);
} }
}; };

View File

@ -50,6 +50,7 @@ enum class Hook
NextKeyIdle, NextKeyIdle,
NormalKey, NormalKey,
ModeChange, ModeChange,
EnterDirectory,
RawKey, RawKey,
RegisterModified, RegisterModified,
WinClose, WinClose,
@ -97,6 +98,7 @@ constexpr auto enum_desc(Meta::Type<Hook>)
{Hook::NextKeyIdle, "NextKeyIdle"}, {Hook::NextKeyIdle, "NextKeyIdle"},
{Hook::NormalKey, "NormalKey"}, {Hook::NormalKey, "NormalKey"},
{Hook::ModeChange, "ModeChange"}, {Hook::ModeChange, "ModeChange"},
{Hook::EnterDirectory, "EnterDirectory"},
{Hook::RawKey, "RawKey"}, {Hook::RawKey, "RawKey"},
{Hook::RegisterModified, "RegisterModified"}, {Hook::RegisterModified, "RegisterModified"},
{Hook::WinClose, "WinClose"}, {Hook::WinClose, "WinClose"},

View File

@ -842,6 +842,7 @@ int run_server(StringView session, StringView server_init,
{ {
Context empty_context{Context::EmptyContextFlag{}}; Context empty_context{Context::EmptyContextFlag{}};
global_scope.hooks().run_hook(Hook::EnterDirectory, real_path("."), empty_context);
global_scope.hooks().run_hook(Hook::KakBegin, session, empty_context); global_scope.hooks().run_hook(Hook::KakBegin, session, empty_context);
} }