Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion contrib/completions/_zoxide

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion contrib/completions/zoxide.bash

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion contrib/completions/zoxide.nu

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions contrib/completions/zoxide.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions shell.nix
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ in pkgs.mkShell {
pkgs.ksh
pkgs.nushell
pkgs.powershell
pkgs.murex
pkgs.tcsh
pkgs.xonsh
pkgs.zsh
Expand Down
1 change: 1 addition & 0 deletions src/cmd/cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ pub enum InitShell {
Bash,
Elvish,
Fish,
Murex,
Nushell,
#[clap(alias = "ksh")]
Posix,
Expand Down
3 changes: 2 additions & 1 deletion src/cmd/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use askama::Template;
use crate::cmd::{Init, InitShell, Run};
use crate::config;
use crate::error::BrokenPipeHandler;
use crate::shell::{Bash, Elvish, Fish, Nushell, Opts, Posix, Powershell, Tcsh, Xonsh, Zsh};
use crate::shell::{Bash, Elvish, Fish, Murex, Nushell, Opts, Posix, Powershell, Tcsh, Xonsh, Zsh};

impl Run for Init {
fn run(&self) -> Result<()> {
Expand All @@ -19,6 +19,7 @@ impl Run for Init {
InitShell::Bash => Bash(opts).render(),
InitShell::Elvish => Elvish(opts).render(),
InitShell::Fish => Fish(opts).render(),
InitShell::Murex => Murex(opts).render(),
InitShell::Nushell => Nushell(opts).render(),
InitShell::Posix => Posix(opts).render(),
InitShell::Powershell => Powershell(opts).render(),
Expand Down
39 changes: 39 additions & 0 deletions src/shell.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ macro_rules! make_template {
make_template!(Bash, "bash.txt");
make_template!(Elvish, "elvish.txt");
make_template!(Fish, "fish.txt");
make_template!(Murex, "murex.txt");
make_template!(Nushell, "nushell.txt");
make_template!(Posix, "posix.txt");
make_template!(Powershell, "powershell.txt");
Expand Down Expand Up @@ -249,6 +250,44 @@ mod tests {
.stderr("");
}

#[apply(opts)]
fn murex_murex(cmd: Option<&str>, hook: InitHook, echo: bool, resolve_symlinks: bool) {
let opts = Opts { cmd, hook, echo, resolve_symlinks };
let source = Murex(&opts).render().unwrap();

let assert = Command::new("murex")
.args(["-c", &source, "--quiet"])
.assert()
.success()
.stderr("");

if opts.hook != InitHook::Pwd {
assert.stdout("");
}
}

#[test]
fn murex_template_has_direct_path_handling() {
let opts = Opts { cmd: Some("z"), hook: InitHook::None, echo: false, resolve_symlinks: false };
let source = Murex(&opts).render().unwrap();

// Ensure murex z handles: "-- path" and tries direct cd on single-arg
assert!(
source.contains("if { $__zoxide_argc == 2 && $PARAMS[0] == \"--\" }"),
"murex template should handle literal path with --"
);
assert!(
source.contains("fexec function __zoxide_cd $PARAMS[0]"),
"murex template should attempt cd directly on single-arg"
);

// Ensure __zoxide_zi exists (interactive-only)
assert!(
source.contains("fexec builtin function __zoxide_zi"),
"murex template should define __zoxide_zi"
);
}

#[apply(opts)]
fn tcsh_tcsh(cmd: Option<&str>, hook: InitHook, echo: bool, resolve_symlinks: bool) {
let opts = Opts { cmd, hook, echo, resolve_symlinks };
Expand Down
114 changes: 114 additions & 0 deletions templates/murex.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
{%- let section = "# =============================================================================\n#" -%}
{%- let not_configured = "# -- not configured --" -%}

{{ section }}
# Utility functions for zoxide.
#

# cd + custom logic based on the value of _ZO_ECHO.
fexec builtin function __zoxide_cd {
fexec builtin cd $PARAMS[0]
{%- if echo %}
fexec builtin out $PWD
{%- endif %}
}

{{ section }}
# Hook configuration for zoxide.
#

{% match hook %}
{%- when InitHook::None -%}
{{ not_configured }}

{%- when InitHook::Prompt -%}
# Initialize hook to add new entries to the database.
fexec builtin event onPrompt __zoxide_hook=command-completion {
exec zoxide add -- $PWD
}

{%- when InitHook::Pwd -%}
# Emulate a PWD hook by tracking the last directory and updating on prompt.
fexec builtin out $PWD -> global: str __zoxide_oldpwd
fexec builtin event onPrompt __zoxide_hook=command-completion {
# Initialize global if missing (eg new session or cleared state)
if { !$__zoxide_oldpwd } then { fexec builtin out $PWD -> global: str __zoxide_oldpwd }
if { $__zoxide_oldpwd != $PWD } then {
fexec builtin out $PWD -> global: str __zoxide_oldpwd
exec zoxide add -- $PWD
}
}

{%- endmatch %}

{{ section }}
# When using zoxide with --no-cmd, alias these internal functions as desired.
#

# Jump to a directory using only keywords.
fexec builtin function __zoxide_z {
__zoxide_argc = 0
trypipe <!null> { @PARAMS -> count -> set int __zoxide_argc }
if { $__zoxide_argc == 0 } then { fexec function __zoxide_cd $HOME; fexec builtin return }
if { $PARAMS[0] == "-" } then {
fexec function __zoxide_cd -
fexec builtin return
}
# If a literal path is provided with "--", cd to it directly.
if { $__zoxide_argc == 2 && $PARAMS[0] == "--" } then {
fexec function __zoxide_cd $PARAMS[1]
fexec builtin return
}
# If a single argument is provided, try cd directly; if it fails, fall back to query.
if { $__zoxide_argc == 1 } then {
trypipe <!null> {
fexec function __zoxide_cd $PARAMS[0]
fexec builtin return
}
}
# Quiet query: capture result; suppress noise; return 1 on no match
fexec builtin out '' -> set: str __zoxide_result
trypipe <!null> {
exec zoxide query --exclude $PWD -- @PARAMS -> set: str __zoxide_result
}
if { $__zoxide_result } then {
fexec function __zoxide_cd $__zoxide_result
} else {
fexec builtin return 1
}
}

# Jump to a directory using interactive search.
fexec builtin function __zoxide_zi {
# Interactive query; return 1 when no selection
fexec builtin out '' -> set: str __zoxide_result
trypipe <!null> {
exec zoxide query --interactive -- @PARAMS -> set: str __zoxide_result
}
if { $__zoxide_result } then {
fexec function __zoxide_cd $__zoxide_result
} else {
fexec builtin return 1
}
}

{{ section }}
# Commands for zoxide. Disable these using --no-cmd.
#

{%- match cmd %}
{%- when Some with (cmd) %}

function {{cmd}} { __zoxide_z @PARAMS }
function {{cmd}}i { __zoxide_zi @PARAMS }

{%- when None %}

{{ not_configured }}

{%- endmatch %}

{{ section }}
# To initialize zoxide, add this to your shell configuration file (usually ~/.murex_profile):
#
# zoxide init murex -> source
Loading