feat(ui): add chdir UI event (#27093)

When an embedded Nvim instance changes its current directory a "chdir"
UI event is emitted. Attached UIs can use this information however they
wish. In the TUI it is used to synchronize the cwd of the TUI process
with the cwd of the embedded Nvim process.
This commit is contained in:
Gregory Anders
2024-01-19 14:51:10 -06:00
committed by GitHub
parent 5a8fe0769c
commit d3a8e9217f
7 changed files with 82 additions and 2 deletions

View File

@@ -39,6 +39,8 @@ void screenshot(String path)
FUNC_API_SINCE(7);
void option_set(String name, Object value)
FUNC_API_SINCE(4);
void chdir(String path)
FUNC_API_SINCE(12);
// Stop event is not exported as such, represented by EOF in the msgpack stream.
void stop(void)
FUNC_API_NOEXPORT;

View File

@@ -33,6 +33,7 @@
# include <sys/xattr.h>
#endif
#include "nvim/api/private/helpers.h"
#include "nvim/ascii_defs.h"
#include "nvim/gettext_defs.h"
#include "nvim/globals.h"
@@ -44,6 +45,7 @@
#include "nvim/os/os.h"
#include "nvim/path.h"
#include "nvim/types_defs.h"
#include "nvim/ui.h"
#include "nvim/vim_defs.h"
#ifdef HAVE_SYS_UIO_H
@@ -90,7 +92,11 @@ int os_chdir(const char *path)
smsg(0, "chdir(%s)", path);
verbose_leave();
}
return uv_chdir(path);
int err = uv_chdir(path);
if (err == 0) {
ui_call_chdir(cstr_as_string((char *)path));
}
return err;
}
/// Get the name of current directory.

View File

@@ -1500,6 +1500,14 @@ void tui_option_set(TUIData *tui, String name, Object value)
}
}
void tui_chdir(TUIData *tui, String path)
{
int err = uv_chdir(path.data);
if (err != 0) {
ELOG("Failed to chdir to %s: %s", path.data, strerror(err));
}
}
void tui_raw_line(TUIData *tui, Integer g, Integer linerow, Integer startcol, Integer endcol,
Integer clearcol, Integer clearattr, LineFlags flags, const schar_T *chunk,
const sattr_T *attrs)

View File

@@ -384,6 +384,12 @@ void ui_attach_impl(UI *ui, uint64_t chanid)
ui_refresh_options();
resettitle();
char cwd[MAXPATHL];
size_t cwdlen = sizeof(cwd);
if (uv_cwd(cwd, &cwdlen) == 0) {
ui_call_chdir((String){ .data = cwd, .size = cwdlen });
}
for (UIExtension i = kUIGlobalCount; (int)i < kUIExtCount; i++) {
ui_set_ext_option(ui, i, ui->ui_ext[i]);
}