aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/api/vim.c20
-rw-r--r--src/api/vim.h3
2 files changed, 20 insertions, 3 deletions
diff --git a/src/api/vim.c b/src/api/vim.c
index 361a57218c..bc17772bc9 100644
--- a/src/api/vim.c
+++ b/src/api/vim.c
@@ -125,9 +125,25 @@ StringArray vim_list_runtime_paths(void)
return rv;
}
-void vim_change_directory(String dir)
+void vim_change_directory(String dir, Error *err)
{
- abort();
+ char string[dir.size + 1];
+ memcpy(string, dir.data, dir.size);
+ string[dir.size] = NUL;
+
+ try_start();
+
+ if (vim_chdir((char_u *)string)) {
+ if (!try_end(err)) {
+ char msg[] = "failed to change directory";
+ strncpy(err->msg, msg, sizeof(err->msg));
+ err->set = true;
+ }
+ return;
+ }
+
+ post_chdir(FALSE);
+ try_end(err);
}
String vim_get_current_line(void)
diff --git a/src/api/vim.h b/src/api/vim.h
index cc373e1cc2..8cc7650410 100644
--- a/src/api/vim.h
+++ b/src/api/vim.h
@@ -44,7 +44,8 @@ StringArray vim_list_runtime_paths(void);
/// Changes vim working directory
///
/// @param dir The new working directory
-void vim_change_directory(String dir);
+/// @param[out] err Details of an error that may have occurred
+void vim_change_directory(String dir, Error *err);
/// Return the current line
///