From 41b07486ad935ad820dd4ba210457a03c95e1145 Mon Sep 17 00:00:00 2001 From: Wojciech Kępka Date: Fri, 18 Jun 2021 08:19:34 +0200 Subject: Fix expansion of `~` (#284) * Fix expansion of `~`, dont use directory relative to cwd. * Add `expand_tilde` * Bring back `canonicalize_path`, use `expand_tilde` to `normalize` * Make `:open ~` completion work * Fix clippy * Fold home dir into tilde in Document `realitve_path`--- helix-term/src/commands.rs | 6 +++--- helix-term/src/ui/mod.rs | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) (limited to 'helix-term') diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index dc4805a5..b2dd0d11 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -1188,8 +1188,8 @@ mod cmd { .filter(|doc| doc.is_modified()) .map(|doc| { doc.relative_path() - .and_then(|path| path.to_str()) - .unwrap_or("[scratch]") + .map(|path| path.to_string_lossy().to_string()) + .unwrap_or_else(|| "[scratch]".into()) }) .collect(); if !modified.is_empty() { @@ -1487,7 +1487,7 @@ fn buffer_picker(cx: &mut Context) { cx.editor .documents .iter() - .map(|(id, doc)| (id, doc.relative_path().map(Path::to_path_buf))) + .map(|(id, doc)| (id, doc.relative_path())) .collect(), move |(id, path): &(DocumentId, Option)| { // format_fn diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs index b2274d06..39e11cd6 100644 --- a/helix-term/src/ui/mod.rs +++ b/helix-term/src/ui/mod.rs @@ -126,10 +126,11 @@ pub mod completers { use ignore::WalkBuilder; use std::path::{Path, PathBuf}; - let path = Path::new(input); + let is_tilde = input.starts_with('~') && input.len() == 1; + let path = helix_view::document::expand_tilde(Path::new(input)); let (dir, file_name) = if input.ends_with('/') { - (path.into(), None) + (path, None) } else { let file_name = path .file_name() @@ -154,7 +155,16 @@ pub mod completers { let is_dir = entry.file_type().map_or(false, |entry| entry.is_dir()); let path = entry.path(); - let mut path = path.strip_prefix(&dir).unwrap_or(path).to_path_buf(); + let mut path = if is_tilde { + // if it's a single tilde an absolute path is displayed so that when `TAB` is pressed on + // one of the directories the tilde will be replaced with a valid path not with a relative + // home directory name. + // ~ -> -> /home/user + // ~/ -> -> ~/first_entry + path.to_path_buf() + } else { + path.strip_prefix(&dir).unwrap_or(path).to_path_buf() + }; if is_dir { path.push(""); @@ -184,7 +194,7 @@ pub mod completers { }) .collect(); - let range = ((input.len() - file_name.len())..); + let range = ((input.len().saturating_sub(file_name.len()))..); matches.sort_unstable_by_key(|(_file, score)| Reverse(*score)); files = matches -- cgit v1.2.3-70-g09d2