mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-22 14:43:55 +08:00
Rely on $PWD instead of getcwd() more often
Fixes https://github.com/fish-shell/fish-shell/issues/696
This commit is contained in:
parent
807c5f2ef2
commit
fe6699f0bf
14
env.cpp
14
env.cpp
|
@ -507,6 +507,20 @@ int env_set_pwd()
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wcstring env_get_pwd_slash(void)
|
||||||
|
{
|
||||||
|
env_var_t pwd = env_get_string(L"PWD");
|
||||||
|
if (pwd.missing_or_empty())
|
||||||
|
{
|
||||||
|
return L"";
|
||||||
|
}
|
||||||
|
if (! string_suffixes_string(L"/", pwd))
|
||||||
|
{
|
||||||
|
pwd.push_back(L'/');
|
||||||
|
}
|
||||||
|
return pwd;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Set up default values for various variables if not defined.
|
Set up default values for various variables if not defined.
|
||||||
*/
|
*/
|
||||||
|
|
10
env.h
10
env.h
|
@ -213,14 +213,12 @@ const char * const * env_export_arr(bool recalc);
|
||||||
*/
|
*/
|
||||||
wcstring_list_t env_get_names(int flags);
|
wcstring_list_t env_get_names(int flags);
|
||||||
|
|
||||||
|
/** Update the PWD variable directory */
|
||||||
|
|
||||||
/**
|
|
||||||
Update the PWD variable
|
|
||||||
directory
|
|
||||||
*/
|
|
||||||
int env_set_pwd();
|
int env_set_pwd();
|
||||||
|
|
||||||
|
/* Returns the PWD with a terminating slash */
|
||||||
|
wcstring env_get_pwd_slash();
|
||||||
|
|
||||||
class env_vars_snapshot_t
|
class env_vars_snapshot_t
|
||||||
{
|
{
|
||||||
std::map<wcstring, wcstring> vars;
|
std::map<wcstring, wcstring> vars;
|
||||||
|
|
|
@ -1320,14 +1320,12 @@ void highlight_shell(const wcstring &buff, std::vector<int> &color, size_t pos,
|
||||||
std::fill(color.begin(), color.end(), -1);
|
std::fill(color.begin(), color.end(), -1);
|
||||||
|
|
||||||
/* Do something sucky and get the current working directory on this background thread. This should really be passed in. Note that we also need this as a vector (of one directory). */
|
/* Do something sucky and get the current working directory on this background thread. This should really be passed in. Note that we also need this as a vector (of one directory). */
|
||||||
const wcstring working_directory = get_working_directory();
|
const wcstring working_directory = env_get_pwd_slash();
|
||||||
|
|
||||||
/* Tokenize the string */
|
/* Tokenize the string */
|
||||||
tokenize(buff.c_str(), color, pos, error, working_directory, vars);
|
tokenize(buff.c_str(), color, pos, error, working_directory, vars);
|
||||||
|
|
||||||
/*
|
/* Locate and syntax highlight cmdsubsts recursively */
|
||||||
Locate and syntax highlight cmdsubsts recursively
|
|
||||||
*/
|
|
||||||
|
|
||||||
wchar_t * const subbuff = wcsdup(buff.c_str());
|
wchar_t * const subbuff = wcsdup(buff.c_str());
|
||||||
wchar_t * subpos = subbuff;
|
wchar_t * subpos = subbuff;
|
||||||
|
|
|
@ -1639,7 +1639,7 @@ file_detection_context_t::file_detection_context_t(history_t *hist, const wcstri
|
||||||
history(hist),
|
history(hist),
|
||||||
command(cmd),
|
command(cmd),
|
||||||
when(time(NULL)),
|
when(time(NULL)),
|
||||||
working_directory(get_working_directory())
|
working_directory(env_get_pwd_slash())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
15
path.cpp
15
path.cpp
|
@ -446,18 +446,3 @@ bool paths_are_same_file(const wcstring &path1, const wcstring &path2)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wcstring get_working_directory(void)
|
|
||||||
{
|
|
||||||
wcstring wd = L"./";
|
|
||||||
wchar_t dir_path[4096];
|
|
||||||
const wchar_t *cwd = wgetcwd(dir_path, 4096);
|
|
||||||
if (cwd)
|
|
||||||
{
|
|
||||||
wd = cwd;
|
|
||||||
/* Make sure the working directory ends with a slash */
|
|
||||||
if (! wd.empty() && wd.at(wd.size() - 1) != L'/')
|
|
||||||
wd.push_back(L'/');
|
|
||||||
}
|
|
||||||
return wd;
|
|
||||||
}
|
|
||||||
|
|
3
path.h
3
path.h
|
@ -78,7 +78,4 @@ bool path_is_valid(const wcstring &path, const wcstring &working_directory);
|
||||||
/** Returns whether the two paths refer to the same file */
|
/** Returns whether the two paths refer to the same file */
|
||||||
bool paths_are_same_file(const wcstring &path1, const wcstring &path2);
|
bool paths_are_same_file(const wcstring &path1, const wcstring &path2);
|
||||||
|
|
||||||
/* Returns the current working directory as returned by wgetcwd */
|
|
||||||
wcstring get_working_directory(void);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1275,7 +1275,7 @@ struct autosuggestion_context_t
|
||||||
cursor_pos(pos),
|
cursor_pos(pos),
|
||||||
searcher(*history, term, HISTORY_SEARCH_TYPE_PREFIX),
|
searcher(*history, term, HISTORY_SEARCH_TYPE_PREFIX),
|
||||||
detector(history, term),
|
detector(history, term),
|
||||||
working_directory(get_working_directory()),
|
working_directory(env_get_pwd_slash()),
|
||||||
vars(env_vars_snapshot_t::highlighting_keys),
|
vars(env_vars_snapshot_t::highlighting_keys),
|
||||||
generation_count(s_generation_count),
|
generation_count(s_generation_count),
|
||||||
has_tried_reloading(false)
|
has_tried_reloading(false)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user