Merge af4439de88 into b4d216fa43
This commit is contained in:
commit
a3d8c91405
|
|
@ -208,6 +208,18 @@ _arguments "${_arguments_options[@]}" : \
|
||||||
'--version[Print version]' \
|
'--version[Print version]' \
|
||||||
'*::paths:_files -/' \
|
'*::paths:_files -/' \
|
||||||
&& ret=0
|
&& ret=0
|
||||||
|
;;
|
||||||
|
(rename)
|
||||||
|
_arguments "${_arguments_options[@]}" : \
|
||||||
|
'--old-name=[]:old_name:_files -/' \
|
||||||
|
'--new-name=[]:new_name:_files -/' \
|
||||||
|
'-f[skip y/n]' \
|
||||||
|
'--force[skip y/n]' \
|
||||||
|
'-h[Print help]' \
|
||||||
|
'--help[Print help]' \
|
||||||
|
'-V[Print version]' \
|
||||||
|
'--version[Print version]' \
|
||||||
|
&& ret=0
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
|
|
@ -223,6 +235,7 @@ _zoxide_commands() {
|
||||||
'init:Generate shell configuration' \
|
'init:Generate shell configuration' \
|
||||||
'query:Search for a directory in the database' \
|
'query:Search for a directory in the database' \
|
||||||
'remove:Remove a directory from the database' \
|
'remove:Remove a directory from the database' \
|
||||||
|
'rename:Batch rename paths by replacing <old-name> with <new-name>' \
|
||||||
)
|
)
|
||||||
_describe -t commands 'zoxide commands' commands "$@"
|
_describe -t commands 'zoxide commands' commands "$@"
|
||||||
}
|
}
|
||||||
|
|
@ -318,6 +331,11 @@ _zoxide__subcmd__remove_commands() {
|
||||||
local commands; commands=()
|
local commands; commands=()
|
||||||
_describe -t commands 'zoxide remove commands' commands "$@"
|
_describe -t commands 'zoxide remove commands' commands "$@"
|
||||||
}
|
}
|
||||||
|
(( $+functions[_zoxide__subcmd__rename_commands] )) ||
|
||||||
|
_zoxide__subcmd__rename_commands() {
|
||||||
|
local commands; commands=()
|
||||||
|
_describe -t commands 'zoxide rename commands' commands "$@"
|
||||||
|
}
|
||||||
|
|
||||||
if [ "$funcstack[1]" = "_zoxide" ]; then
|
if [ "$funcstack[1]" = "_zoxide" ]; then
|
||||||
_zoxide "$@"
|
_zoxide "$@"
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ Register-ArgumentCompleter -Native -CommandName 'zoxide' -ScriptBlock {
|
||||||
[CompletionResult]::new('init', 'init', [CompletionResultType]::ParameterValue, 'Generate shell configuration')
|
[CompletionResult]::new('init', 'init', [CompletionResultType]::ParameterValue, 'Generate shell configuration')
|
||||||
[CompletionResult]::new('query', 'query', [CompletionResultType]::ParameterValue, 'Search for a directory in the database')
|
[CompletionResult]::new('query', 'query', [CompletionResultType]::ParameterValue, 'Search for a directory in the database')
|
||||||
[CompletionResult]::new('remove', 'remove', [CompletionResultType]::ParameterValue, 'Remove a directory from the database')
|
[CompletionResult]::new('remove', 'remove', [CompletionResultType]::ParameterValue, 'Remove a directory from the database')
|
||||||
|
[CompletionResult]::new('rename', 'rename', [CompletionResultType]::ParameterValue, 'Batch rename paths by replacing <old-name> with <new-name>')
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
'zoxide;add' {
|
'zoxide;add' {
|
||||||
|
|
@ -177,6 +178,17 @@ Register-ArgumentCompleter -Native -CommandName 'zoxide' -ScriptBlock {
|
||||||
[CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')
|
[CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
'zoxide;rename' {
|
||||||
|
[CompletionResult]::new('--old-name', '--old-name', [CompletionResultType]::ParameterName, 'old-name')
|
||||||
|
[CompletionResult]::new('--new-name', '--new-name', [CompletionResultType]::ParameterName, 'new-name')
|
||||||
|
[CompletionResult]::new('-f', '-f', [CompletionResultType]::ParameterName, 'skip y/n')
|
||||||
|
[CompletionResult]::new('--force', '--force', [CompletionResultType]::ParameterName, 'skip y/n')
|
||||||
|
[CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')
|
||||||
|
[CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')
|
||||||
|
[CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')
|
||||||
|
[CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')
|
||||||
|
break
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
$completions.Where{ $_.CompletionText -like "$wordToComplete*" } |
|
$completions.Where{ $_.CompletionText -like "$wordToComplete*" } |
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,9 @@ _zoxide() {
|
||||||
zoxide,remove)
|
zoxide,remove)
|
||||||
cmd="zoxide__subcmd__remove"
|
cmd="zoxide__subcmd__remove"
|
||||||
;;
|
;;
|
||||||
|
zoxide,rename)
|
||||||
|
cmd="zoxide__subcmd__rename"
|
||||||
|
;;
|
||||||
zoxide__subcmd__edit,decrement)
|
zoxide__subcmd__edit,decrement)
|
||||||
cmd="zoxide__subcmd__edit__subcmd__decrement"
|
cmd="zoxide__subcmd__edit__subcmd__decrement"
|
||||||
;;
|
;;
|
||||||
|
|
@ -71,7 +74,7 @@ _zoxide() {
|
||||||
|
|
||||||
case "${cmd}" in
|
case "${cmd}" in
|
||||||
zoxide)
|
zoxide)
|
||||||
opts="-h -V --help --version add edit import init query remove"
|
opts="-h -V --help --version add edit import init query remove rename"
|
||||||
if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
|
if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
|
||||||
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
|
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
|
||||||
return 0
|
return 0
|
||||||
|
|
@ -338,6 +341,34 @@ _zoxide() {
|
||||||
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
|
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
zoxide__subcmd__rename)
|
||||||
|
opts="-f -h -V --old-name --new-name --force --help --version"
|
||||||
|
if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
|
||||||
|
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
case "${prev}" in
|
||||||
|
--old-name)
|
||||||
|
COMPREPLY=()
|
||||||
|
if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
|
||||||
|
compopt -o plusdirs
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
--new-name)
|
||||||
|
COMPREPLY=()
|
||||||
|
if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
|
||||||
|
compopt -o plusdirs
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
COMPREPLY=()
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ set edit:completion:arg-completer[zoxide] = {|@words|
|
||||||
cand init 'Generate shell configuration'
|
cand init 'Generate shell configuration'
|
||||||
cand query 'Search for a directory in the database'
|
cand query 'Search for a directory in the database'
|
||||||
cand remove 'Remove a directory from the database'
|
cand remove 'Remove a directory from the database'
|
||||||
|
cand rename 'Batch rename paths by replacing <old-name> with <new-name>'
|
||||||
}
|
}
|
||||||
&'zoxide;add'= {
|
&'zoxide;add'= {
|
||||||
cand -s 'The rank to increment the entry if it exists or initialize it with if it doesn''t'
|
cand -s 'The rank to increment the entry if it exists or initialize it with if it doesn''t'
|
||||||
|
|
@ -157,6 +158,16 @@ set edit:completion:arg-completer[zoxide] = {|@words|
|
||||||
cand -V 'Print version'
|
cand -V 'Print version'
|
||||||
cand --version 'Print version'
|
cand --version 'Print version'
|
||||||
}
|
}
|
||||||
|
&'zoxide;rename'= {
|
||||||
|
cand --old-name 'old-name'
|
||||||
|
cand --new-name 'new-name'
|
||||||
|
cand -f 'skip y/n'
|
||||||
|
cand --force 'skip y/n'
|
||||||
|
cand -h 'Print help'
|
||||||
|
cand --help 'Print help'
|
||||||
|
cand -V 'Print version'
|
||||||
|
cand --version 'Print version'
|
||||||
|
}
|
||||||
]
|
]
|
||||||
$completions[$command]
|
$completions[$command]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ complete -c zoxide -n "__fish_zoxide_needs_command" -f -a "import" -d 'Import en
|
||||||
complete -c zoxide -n "__fish_zoxide_needs_command" -f -a "init" -d 'Generate shell configuration'
|
complete -c zoxide -n "__fish_zoxide_needs_command" -f -a "init" -d 'Generate shell configuration'
|
||||||
complete -c zoxide -n "__fish_zoxide_needs_command" -f -a "query" -d 'Search for a directory in the database'
|
complete -c zoxide -n "__fish_zoxide_needs_command" -f -a "query" -d 'Search for a directory in the database'
|
||||||
complete -c zoxide -n "__fish_zoxide_needs_command" -f -a "remove" -d 'Remove a directory from the database'
|
complete -c zoxide -n "__fish_zoxide_needs_command" -f -a "remove" -d 'Remove a directory from the database'
|
||||||
|
complete -c zoxide -n "__fish_zoxide_needs_command" -f -a "rename" -d 'Batch rename paths by replacing <old-name> with <new-name>'
|
||||||
complete -c zoxide -n "__fish_zoxide_using_subcommand add" -s s -l score -d 'The rank to increment the entry if it exists or initialize it with if it doesn\'t' -r
|
complete -c zoxide -n "__fish_zoxide_using_subcommand add" -s s -l score -d 'The rank to increment the entry if it exists or initialize it with if it doesn\'t' -r
|
||||||
complete -c zoxide -n "__fish_zoxide_using_subcommand add" -s h -l help -d 'Print help'
|
complete -c zoxide -n "__fish_zoxide_using_subcommand add" -s h -l help -d 'Print help'
|
||||||
complete -c zoxide -n "__fish_zoxide_using_subcommand add" -s V -l version -d 'Print version'
|
complete -c zoxide -n "__fish_zoxide_using_subcommand add" -s V -l version -d 'Print version'
|
||||||
|
|
@ -93,3 +94,8 @@ complete -c zoxide -n "__fish_zoxide_using_subcommand query" -s h -l help -d 'Pr
|
||||||
complete -c zoxide -n "__fish_zoxide_using_subcommand query" -s V -l version -d 'Print version'
|
complete -c zoxide -n "__fish_zoxide_using_subcommand query" -s V -l version -d 'Print version'
|
||||||
complete -c zoxide -n "__fish_zoxide_using_subcommand remove" -s h -l help -d 'Print help'
|
complete -c zoxide -n "__fish_zoxide_using_subcommand remove" -s h -l help -d 'Print help'
|
||||||
complete -c zoxide -n "__fish_zoxide_using_subcommand remove" -s V -l version -d 'Print version'
|
complete -c zoxide -n "__fish_zoxide_using_subcommand remove" -s V -l version -d 'Print version'
|
||||||
|
complete -c zoxide -n "__fish_zoxide_using_subcommand rename" -l old-name -r -f -a "(__fish_complete_directories)"
|
||||||
|
complete -c zoxide -n "__fish_zoxide_using_subcommand rename" -l new-name -r -f -a "(__fish_complete_directories)"
|
||||||
|
complete -c zoxide -n "__fish_zoxide_using_subcommand rename" -s f -l force -d 'skip y/n'
|
||||||
|
complete -c zoxide -n "__fish_zoxide_using_subcommand rename" -s h -l help -d 'Print help'
|
||||||
|
complete -c zoxide -n "__fish_zoxide_using_subcommand rename" -s V -l version -d 'Print version'
|
||||||
|
|
|
||||||
|
|
@ -130,6 +130,15 @@ module completions {
|
||||||
...paths: path
|
...paths: path
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Batch rename paths by replacing <old-name> with <new-name>
|
||||||
|
export extern "zoxide rename" [
|
||||||
|
--old-name: path
|
||||||
|
--new-name: path
|
||||||
|
--force(-f) # skip y/n
|
||||||
|
--help(-h) # Print help
|
||||||
|
--version(-V) # Print version
|
||||||
|
]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export use completions *
|
export use completions *
|
||||||
|
|
|
||||||
|
|
@ -377,6 +377,40 @@ const completion: Fig.Spec = {
|
||||||
template: "folders",
|
template: "folders",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "rename",
|
||||||
|
description: "Batch rename paths by replacing <old-name> with <new-name>",
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: "--old-name",
|
||||||
|
isRepeatable: true,
|
||||||
|
args: {
|
||||||
|
name: "old_name",
|
||||||
|
template: "folders",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "--new-name",
|
||||||
|
isRepeatable: true,
|
||||||
|
args: {
|
||||||
|
name: "new_name",
|
||||||
|
template: "folders",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: ["-f", "--force"],
|
||||||
|
description: "skip y/n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: ["-h", "--help"],
|
||||||
|
description: "Print help",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: ["-V", "--version"],
|
||||||
|
description: "Print version",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
options: [
|
options: [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,7 @@ pub enum Cmd {
|
||||||
Init(Init),
|
Init(Init),
|
||||||
Query(Query),
|
Query(Query),
|
||||||
Remove(Remove),
|
Remove(Remove),
|
||||||
|
Rename(Rename),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add a new directory or increment its rank
|
/// Add a new directory or increment its rank
|
||||||
|
|
@ -209,3 +210,23 @@ pub struct Remove {
|
||||||
#[clap(value_hint = ValueHint::DirPath)]
|
#[clap(value_hint = ValueHint::DirPath)]
|
||||||
pub paths: Vec<String>,
|
pub paths: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Batch rename paths by replacing <old-name> with <new-name>
|
||||||
|
#[derive(Debug, Parser)]
|
||||||
|
#[clap(
|
||||||
|
author,
|
||||||
|
help_template = HelpTemplate,
|
||||||
|
)]
|
||||||
|
pub struct Rename {
|
||||||
|
// old name
|
||||||
|
#[clap(long, value_hint = ValueHint::DirPath, value_name = "old_name")]
|
||||||
|
pub old_name: String,
|
||||||
|
|
||||||
|
// new name
|
||||||
|
#[clap(long, value_hint = ValueHint::DirPath, value_name = "new_name")]
|
||||||
|
pub new_name: String,
|
||||||
|
|
||||||
|
/// skip y/n
|
||||||
|
#[clap(long, short)]
|
||||||
|
pub force: bool,
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ mod import;
|
||||||
mod init;
|
mod init;
|
||||||
mod query;
|
mod query;
|
||||||
mod remove;
|
mod remove;
|
||||||
|
mod rename;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
|
||||||
|
|
@ -23,6 +24,7 @@ impl Run for Cmd {
|
||||||
Cmd::Init(cmd) => cmd.run(),
|
Cmd::Init(cmd) => cmd.run(),
|
||||||
Cmd::Query(cmd) => cmd.run(),
|
Cmd::Query(cmd) => cmd.run(),
|
||||||
Cmd::Remove(cmd) => cmd.run(),
|
Cmd::Remove(cmd) => cmd.run(),
|
||||||
|
Cmd::Rename(cmd) => cmd.run(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
use std::io::{self, Read, Write};
|
||||||
|
|
||||||
|
use anyhow::{Result, bail};
|
||||||
|
|
||||||
|
use crate::cmd::{Rename, Run};
|
||||||
|
use crate::db::{Database, Epoch, Rank};
|
||||||
|
use crate::error::BrokenPipeHandler;
|
||||||
|
|
||||||
|
struct Data {
|
||||||
|
pub old_path: String,
|
||||||
|
pub new_path: String,
|
||||||
|
pub rank: Rank,
|
||||||
|
pub last_accessed: Epoch,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Run for Rename {
|
||||||
|
fn run(&self) -> Result<()> {
|
||||||
|
let mut db = Database::open()?;
|
||||||
|
|
||||||
|
let mut to_edit = Vec::<Data>::new();
|
||||||
|
|
||||||
|
for path in db.dirs() {
|
||||||
|
let old = path.display().to_string();
|
||||||
|
let new = path.display().to_string().replace(&self.old_name, &self.new_name);
|
||||||
|
|
||||||
|
if new != old {
|
||||||
|
writeln!(io::stdout(), "{old} -> {new}")
|
||||||
|
.pipe_exit("stdout")
|
||||||
|
.expect("cannot write to stdout.");
|
||||||
|
|
||||||
|
to_edit.push(Data {
|
||||||
|
old_path: old,
|
||||||
|
new_path: new,
|
||||||
|
rank: path.rank,
|
||||||
|
last_accessed: path.last_accessed,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for item in to_edit.iter() {
|
||||||
|
db.remove(&item.old_path);
|
||||||
|
db.add(&item.new_path, item.rank, item.last_accessed);
|
||||||
|
}
|
||||||
|
|
||||||
|
if to_edit.is_empty() {
|
||||||
|
bail!("No entries to rename.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.force {
|
||||||
|
return db.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
writeln!(io::stdout(), "Rename {} entries? (y/n)", to_edit.len())
|
||||||
|
.pipe_exit("stdout")
|
||||||
|
.expect("cannot write to stdout.");
|
||||||
|
|
||||||
|
let mut buf = [0];
|
||||||
|
std::io::stdin().read_exact(&mut buf).expect("input expected");
|
||||||
|
match buf[0] as char {
|
||||||
|
'y' | 'Y' => db.save(),
|
||||||
|
_ => bail!("Rename aborted."),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue