diff options
| author | Maxime Coste <mawww@kakoune.org> | 2024-07-01 21:31:17 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2024-07-01 21:31:17 +1000 |
| commit | e0bbd1e7ca7b96531671682bc63c5ee94d1fbc85 (patch) | |
| tree | b7e8663772465742df982ad4338d043ff3ffc158 | |
| parent | 8ca7b5815ae165105aef102427fa33dee6b540f6 (diff) | |
| parent | 0a1061278616bf5f8282af6366228ebf74cb5346 (diff) | |
Merge remote-tracking branch 'PJungkamp/directory-changed'
| -rw-r--r-- | doc/pages/hooks.asciidoc | 5 | ||||
| -rw-r--r-- | src/commands.cc | 6 | ||||
| -rw-r--r-- | src/hook_manager.hh | 2 | ||||
| -rw-r--r-- | src/main.cc | 1 |
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); } |
