diff --git a/share/functions/colon.fish b/share/functions/colon.fish new file mode 100644 index 000000000..b41ad1e4e --- /dev/null +++ b/share/functions/colon.fish @@ -0,0 +1,5 @@ +function : + # no-op function for compatibility with sh, bash, and others. + # Often used to insert a comment into a chain of commands without having + # it eat up the remainder of the line, handy in Makefiles. +end 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);