feat(gpui): remember terminal startup directories
This commit is contained in:
1 parent
3050374343
commit
1338cce766
2 files changed
+45
-4
No files matched your search
@@ -1,7 +1,7 @@
|
|||||||
//! Shared directory intelligence derived from successful cwd transitions.
|
//! Shared directory intelligence derived from successful local terminal locations.
|
||||||
//!
|
//!
|
||||||
//! Unlike command-text heuristics, this service records only directories the
|
//! Unlike command-text heuristics, this service records only directories a local
|
||||||
//! shell actually entered (reported through OSC cwd/title integration). The
|
//! terminal successfully starts in or later reports through cwd integration. The
|
||||||
//! resulting frecency score is reused by ghost text, path completion and UI
|
//! resulting frecency score is reused by ghost text, path completion and UI
|
||||||
//! directory pickers; no shell-specific command or alias is introduced.
|
//! directory pickers; no shell-specific command or alias is introduced.
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,16 @@
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
fn startup_history_directory(
|
||||||
|
options: &nebula_terminal::tty::Options,
|
||||||
|
env: &crate::display::SuggestEnv,
|
||||||
|
) -> Option<std::path::PathBuf> {
|
||||||
|
env.is_this_machine()
|
||||||
|
.then(|| options.working_directory.clone().or_else(|| std::env::current_dir().ok()))
|
||||||
|
.flatten()
|
||||||
|
.and_then(|path| std::path::absolute(path).ok())
|
||||||
|
}
|
||||||
|
|
||||||
impl TerminalView {
|
impl TerminalView {
|
||||||
/// `spawn_grid`:PTY 出生网格(宿主已把窗口定形到该几何)。首帧布局
|
/// `spawn_grid`:PTY 出生网格(宿主已把窗口定形到该几何)。首帧布局
|
||||||
/// 与之相同则零下发;见 `set_layout` 的启动稳定闸。
|
/// 与之相同则零下发;见 `set_layout` 的启动稳定闸。
|
||||||
@@ -116,7 +126,14 @@ impl TerminalView {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
let options = session::local_options(effective, pane_id, cwd);
|
let options = session::local_options(effective, pane_id, cwd);
|
||||||
|
let history_cwd = startup_history_directory(&options, &suggest_env);
|
||||||
let exec_context = crate::runtime_exec::PaneExecContext::from_pty_options(&options);
|
let exec_context = crate::runtime_exec::PaneExecContext::from_pty_options(&options);
|
||||||
|
let spawned = session::spawn(initial, term_config, options);
|
||||||
|
if spawned.is_ok()
|
||||||
|
&& let Some(cwd) = history_cwd.as_deref().and_then(|path| path.to_str())
|
||||||
|
{
|
||||||
|
crate::directory_history::global().record(cwd);
|
||||||
|
}
|
||||||
(
|
(
|
||||||
None,
|
None,
|
||||||
String::from("shell"),
|
String::from("shell"),
|
||||||
@@ -124,7 +141,7 @@ impl TerminalView {
|
|||||||
suggest_env,
|
suggest_env,
|
||||||
Some(exec_context),
|
Some(exec_context),
|
||||||
session_launch,
|
session_launch,
|
||||||
session::spawn(initial, term_config, options),
|
spawned,
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
TerminalLaunch::Ssh { destination, cwd } => (
|
TerminalLaunch::Ssh { destination, cwd } => (
|
||||||
@@ -332,3 +349,27 @@ impl TerminalView {
|
|||||||
view
|
view
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn startup_history_uses_only_local_initial_directories() {
|
||||||
|
let directory = tempfile::tempdir().unwrap();
|
||||||
|
let mut options = nebula_terminal::tty::Options::default();
|
||||||
|
options.working_directory = Some(directory.path().to_path_buf());
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
startup_history_directory(&options, &crate::display::SuggestEnv::Local).as_deref(),
|
||||||
|
Some(directory.path())
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
startup_history_directory(
|
||||||
|
&options,
|
||||||
|
&crate::display::SuggestEnv::Wsl { distro: "Debian".into() }
|
||||||
|
),
|
||||||
|
None
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user