diff --git a/book/src/registers.md b/book/src/registers.md index 2edf7e27a..d8e40ff22 100644 --- a/book/src/registers.md +++ b/book/src/registers.md @@ -44,6 +44,7 @@ ### Special registers | `#` | Selection indices (first selection is `1`, second is `2`, etc.) | This register is not writable | | `.` | Contents of the current selections | This register is not writable | | `%` | Name of the current file | This register is not writable | +| `/` | Folder which contains the current file | This register is not writable | | `+` | Reads from the system clipboard | Joins and yanks to the system clipboard | | `*` | Reads from the primary clipboard | Joins and yanks to the primary clipboard | diff --git a/helix-view/src/register.rs b/helix-view/src/register.rs index 3a2e1b7cc..cdb7a6057 100644 --- a/helix-view/src/register.rs +++ b/helix-view/src/register.rs @@ -63,6 +63,18 @@ pub fn read<'a>(&'a self, name: char, editor: &'a Editor) -> Option { + let relative_path = match doc!(editor).path() { + Some(path) => path, + None => return Some(RegisterValues::new(iter::empty())), + }; + let parent = match relative_path.parent() { + Some(path) => path, + None => return Some(RegisterValues::new(iter::empty())), + }; + let parent = parent.display().to_string(); + Some(RegisterValues::new(iter::once(parent.into()))) + } '*' | '+' => Some(read_from_clipboard( self.clipboard_provider.as_ref(), self.inner.get(&name), @@ -82,7 +94,9 @@ pub fn read<'a>(&'a self, name: char, editor: &'a Editor) -> Option) -> Result<()> { match name { '_' => Ok(()), - '#' | '.' | '%' => Err(anyhow::anyhow!("Register {name} does not support writing")), + '#' | '.' | '%' | '/' => { + Err(anyhow::anyhow!("Register {name} does not support writing")) + } '*' | '+' => { self.clipboard_provider.set_contents( values.join(NATIVE_LINE_ENDING.as_str()), @@ -107,7 +121,9 @@ pub fn write(&mut self, name: char, mut values: Vec) -> Result<()> { pub fn push(&mut self, name: char, mut value: String) -> Result<()> { match name { '_' => Ok(()), - '#' | '.' | '%' => Err(anyhow::anyhow!("Register {name} does not support pushing")), + '#' | '.' | '%' | '/' => { + Err(anyhow::anyhow!("Register {name} does not support pushing")) + } '*' | '+' => { let clipboard_type = match name { '+' => ClipboardType::Clipboard, @@ -164,6 +180,7 @@ pub fn iter_preview(&self) -> impl Iterator { ('#', ""), ('.', ""), ('%', ""), + ('/', ""), ('+', ""), ('*', ""), ]