From 3996e437b6944b478f1b0644b8e5519829ee2890 Mon Sep 17 00:00:00 2001 From: Mahmoud Al-Qudsi Date: Wed, 14 Mar 2018 18:22:10 -0500 Subject: [PATCH] Autoload `:` function on startup. The newly added `:` command is implemented as a function (to avoid increasing complexity by making it a builtin), but it is saved to a path that does not match its filename (since its name is somewhat of a special character that might cause problems during installation). Directly probing the `colon` function for autoload causes `:` to be correctly loaded, so doing just that after function paths are loaded upon startup. This is a hack since the CPP code shouldn't really be aware of individual functions, perhaps there is a better way of doing this. --- src/env.cpp | 8 +++++++- src/env.h | 2 ++ src/fish.cpp | 3 +++ src/function.cpp | 6 ++++-- src/function.h | 2 +- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/env.cpp b/src/env.cpp index 6ff150668..c4209ceac 100644 --- a/src/env.cpp +++ b/src/env.cpp @@ -746,6 +746,12 @@ static void setup_user(bool force) { } } +void misc_init_with_paths() { + // Since ':' can cause problems in filenames, the : function is saved to colon.fish + // But that means it isn't autoloaded since the name doesn't match the function. + bool loaded = function_load(L"colon"); +} + /// Various things we need to initialize at run-time that don't really fit any of the other init /// routines. void misc_init() { @@ -763,7 +769,7 @@ void misc_init() { // MS Windows tty devices do not currently have either a read or write timestamp. Those // respective fields of `struct stat` are always the current time. Which means we can't // use them. So we assume no external program has written to the terminal behind our - // back. This makes multiline promptusable. See issue #2859 and + // back. This makes multiline prompt usable. See issue #2859 and // https://github.com/Microsoft/BashOnWindows/issues/545 has_working_tty_timestamps = false; #else diff --git a/src/env.h b/src/env.h index 543b4dd11..7f6050e5e 100644 --- a/src/env.h +++ b/src/env.h @@ -67,6 +67,8 @@ void env_init(const struct config_paths_t *paths = NULL); /// Various things we need to initialize at run-time that don't really fit any of the other init /// routines. void misc_init(); +/// Same as misc_init() but after configuration paths have been loaded +void misc_init_with_paths(); class env_var_t { private: diff --git a/src/fish.cpp b/src/fish.cpp index 5568086b7..2568a4558 100644 --- a/src/fish.cpp +++ b/src/fish.cpp @@ -384,6 +384,9 @@ int main(int argc, char **argv) { const io_chain_t empty_ios; if (read_init(paths)) { + // Additional initialization that must occur after paths are loaded + misc_init_with_paths(); + // Stomp the exit status of any initialization commands (issue #635). proc_set_last_status(STATUS_CMD_OK); diff --git a/src/function.cpp b/src/function.cpp index f15b06739..8d0ab1d12 100644 --- a/src/function.cpp +++ b/src/function.cpp @@ -194,11 +194,13 @@ int function_exists(const wcstring &cmd) { return loaded_functions.find(cmd) != loaded_functions.end(); } -void function_load(const wcstring &cmd) { +bool function_load(const wcstring &cmd) { if (!parser_keywords_is_reserved(cmd)) { scoped_rlock locker(functions_lock); - load(cmd); + return load(cmd) == 0; } + + return false; //not loaded } int function_exists_no_autoload(const wcstring &cmd, const env_vars_snapshot_t &vars) { diff --git a/src/function.h b/src/function.h index 5adfabb18..d72d9453f 100644 --- a/src/function.h +++ b/src/function.h @@ -74,7 +74,7 @@ void function_set_desc(const wcstring &name, const wcstring &desc); int function_exists(const wcstring &name); /// Attempts to load a function if not yet loaded. This is used by the completion machinery. -void function_load(const wcstring &name); +bool function_load(const wcstring &name); /// Returns true if the function with the name name exists, without triggering autoload. int function_exists_no_autoload(const wcstring &name, const env_vars_snapshot_t &vars);