summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2024-07-01 21:31:17 +1000
committerMaxime Coste <mawww@kakoune.org>2024-07-01 21:31:17 +1000
commite0bbd1e7ca7b96531671682bc63c5ee94d1fbc85 (patch)
treeb7e8663772465742df982ad4338d043ff3ffc158
parent8ca7b5815ae165105aef102427fa33dee6b540f6 (diff)
parent0a1061278616bf5f8282af6366228ebf74cb5346 (diff)
Merge remote-tracking branch 'PJungkamp/directory-changed'
-rw-r--r--doc/pages/hooks.asciidoc5
-rw-r--r--src/commands.cc6
-rw-r--r--src/hook_manager.hh2
-rw-r--r--src/main.cc1
4 files changed, 12 insertions, 2 deletions
diff --git a/doc/pages/hooks.asciidoc b/doc/pages/hooks.asciidoc
index 8d339d9d..67311868 100644
--- a/doc/pages/hooks.asciidoc
+++ b/doc/pages/hooks.asciidoc
@@ -147,6 +147,11 @@ name. Hooks with no description will always use an empty string.
*SessionRenamed* `<old name>:<new name>`::
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`::
an error was encountered while executing a user command
diff --git a/src/commands.cc b/src/commands.cc
index 0febf160..ef51555e 100644
--- a/src/commands.cc
+++ b/src/commands.cc
@@ -2600,13 +2600,15 @@ const CommandDesc change_directory_cmd = {
cursor_pos, FilenameFlags::OnlyDirectories),
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]} : "~";
- 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));
for (auto& buffer : BufferManager::instance())
buffer->update_display_name();
+ ctx.hooks().run_hook(Hook::EnterDirectory, path, ctx);
}
};
diff --git a/src/hook_manager.hh b/src/hook_manager.hh
index 228a4f23..bee06064 100644
--- a/src/hook_manager.hh
+++ b/src/hook_manager.hh
@@ -50,6 +50,7 @@ enum class Hook
NextKeyIdle,
NormalKey,
ModeChange,
+ EnterDirectory,
RawKey,
RegisterModified,
WinClose,
@@ -97,6 +98,7 @@ constexpr auto enum_desc(Meta::Type<Hook>)
{Hook::NextKeyIdle, "NextKeyIdle"},
{Hook::NormalKey, "NormalKey"},
{Hook::ModeChange, "ModeChange"},
+ {Hook::EnterDirectory, "EnterDirectory"},
{Hook::RawKey, "RawKey"},
{Hook::RegisterModified, "RegisterModified"},
{Hook::WinClose, "WinClose"},
diff --git a/src/main.cc b/src/main.cc
index 0c63403b..f2e31cab 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -842,6 +842,7 @@ int run_server(StringView session, StringView server_init,
{
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);
}