Add support for ksh

This commit is contained in:
Ajeet D'Souza 2024-09-13 02:40:08 +05:30
parent a1be4012e0
commit 208588a1d6
11 changed files with 175 additions and 7 deletions

View File

@ -112,7 +112,7 @@ _arguments "${_arguments_options[@]}" \
'--help[Print help]' \
'-V[Print version]' \
'--version[Print version]' \
':shell:(bash elvish fish nushell posix powershell xonsh zsh)' \
':shell:(bash elvish fish ksh nushell posix powershell xonsh zsh)' \
&& ret=0
;;
(query)

View File

@ -165,7 +165,7 @@ _zoxide() {
return 0
;;
zoxide__init)
opts="-h -V --no-cmd --cmd --hook --help --version bash elvish fish nushell posix powershell xonsh zsh"
opts="-h -V --no-cmd --cmd --hook --help --version bash elvish fish ksh nushell posix powershell xonsh zsh"
if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
return 0

View File

@ -182,6 +182,7 @@ const completion: Fig.Spec = {
"bash",
"elvish",
"fish",
"ksh",
"nushell",
"posix",
"powershell",

View File

@ -24,6 +24,7 @@ in pkgs.mkShell {
pkgs.dash
pkgs.elvish
pkgs.fish
pkgs.ksh
pkgs.nushell
pkgs.powershell
pkgs.xonsh

View File

@ -137,6 +137,7 @@ pub enum InitShell {
Bash,
Elvish,
Fish,
Ksh,
Nushell,
Posix,
Powershell,

View File

@ -6,7 +6,7 @@ use rinja::Template;
use crate::cmd::{Init, InitShell, Run};
use crate::config;
use crate::error::BrokenPipeHandler;
use crate::shell::{Bash, Elvish, Fish, Nushell, Opts, Posix, Powershell, Xonsh, Zsh};
use crate::shell::{Bash, Elvish, Fish, Ksh, Nushell, Opts, Posix, Powershell, Xonsh, Zsh};
impl Run for Init {
fn run(&self) -> Result<()> {
@ -19,6 +19,7 @@ impl Run for Init {
InitShell::Bash => Bash(opts).render(),
InitShell::Elvish => Elvish(opts).render(),
InitShell::Fish => Fish(opts).render(),
InitShell::Ksh => Ksh(opts).render(),
InitShell::Nushell => Nushell(opts).render(),
InitShell::Posix => Posix(opts).render(),
InitShell::Powershell => Powershell(opts).render(),

View File

@ -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!(Ksh, "ksh.txt");
make_template!(Nushell, "nushell.txt");
make_template!(Posix, "posix.txt");
make_template!(Powershell, "powershell.txt");
@ -70,7 +71,7 @@ mod tests {
let source = Bash(&opts).render().unwrap();
Command::new("shellcheck")
.args(["--enable", "all", "--shell", "bash", "-"])
.args(["--enable=all", "-"])
.write_stdin(source)
.assert()
.success()
@ -148,6 +149,47 @@ mod tests {
.stderr("");
}
#[apply(opts)]
fn ksh_ksh(cmd: Option<&str>, hook: InitHook, echo: bool, resolve_symlinks: bool) {
let opts = Opts { cmd, hook, echo, resolve_symlinks };
let source = Bash(&opts).render().unwrap();
Command::new("bash")
.args(["--noprofile", "--norc", "-e", "-u", "-o", "pipefail", "-c", &source])
.assert()
.success()
.stdout("")
.stderr("");
}
#[apply(opts)]
fn ksh_shellcheck(cmd: Option<&str>, hook: InitHook, echo: bool, resolve_symlinks: bool) {
let opts = Opts { cmd, hook, echo, resolve_symlinks };
let source = Bash(&opts).render().unwrap();
Command::new("shellcheck")
.args(["--enable=all", "-"])
.write_stdin(source)
.assert()
.success()
.stdout("")
.stderr("");
}
#[apply(opts)]
fn ksh_shfmt(cmd: Option<&str>, hook: InitHook, echo: bool, resolve_symlinks: bool) {
let opts = Opts { cmd, hook, echo, resolve_symlinks };
let mut source = Bash(&opts).render().unwrap();
source.push('\n');
Command::new("shfmt")
.args(["--diff", "--indent=4", "--language-dialect=posix", "--simplify", "-"])
.write_stdin(source)
.assert()
.success()
.stdout("")
.stderr("");
}
#[apply(opts)]
fn nushell_nushell(cmd: Option<&str>, hook: InitHook, echo: bool, resolve_symlinks: bool) {
let opts = Opts { cmd, hook, echo, resolve_symlinks };
@ -196,12 +238,12 @@ mod tests {
}
#[apply(opts)]
fn posix_shellcheck_(cmd: Option<&str>, hook: InitHook, echo: bool, resolve_symlinks: bool) {
fn posix_shellcheck(cmd: Option<&str>, hook: InitHook, echo: bool, resolve_symlinks: bool) {
let opts = Opts { cmd, hook, echo, resolve_symlinks };
let source = Posix(&opts).render().unwrap();
Command::new("shellcheck")
.args(["--enable", "all", "--shell", "sh", "-"])
.args(["--enable=all", "-"])
.write_stdin(source)
.assert()
.success()
@ -298,7 +340,7 @@ mod tests {
// ShellCheck doesn't support zsh yet: https://github.com/koalaman/shellcheck/issues/809
Command::new("shellcheck")
.args(["--enable", "all", "--shell", "bash", "-"])
.args(["--enable=all", "-"])
.write_stdin(source)
.assert()
.success()

View File

@ -1,6 +1,8 @@
{%- let section = "# =============================================================================\n#" -%}
{%- let not_configured = "# -- not configured --" -%}
# shellcheck shell=bash
{{ section }}
# Utility functions for zoxide.
#

116
templates/ksh.txt Normal file
View File

@ -0,0 +1,116 @@
{%- let section = "# =============================================================================\n#" -%}
{%- let not_configured = "# -- not configured --" -%}
# shellcheck shell=ksh
{{ section }}
# Utility functions for zoxide.
#
# pwd based on the value of _ZO_RESOLVE_SYMLINKS.
__zoxide_pwd() {
{%- if cfg!(windows) %}
\command cygpath -w "$(\builtin pwd -P)"
{%- else if resolve_symlinks %}
\command pwd -P
{%- else %}
\command pwd -L
{%- endif %}
}
# cd + custom logic based on the value of _ZO_ECHO.
__zoxide_cd() {
# shellcheck disable=SC2164
\command cd "$@" {%- if echo %} && __zoxide_pwd {%- endif %}
}
{{ section }}
# Hook configuration for zoxide.
#
{% match hook %}
{%- when InitHook::None -%}
{{ not_configured }}
{%- when InitHook::Prompt -%}
# Hook to add new entries to the database.
__zoxide_hook() {
\command zoxide add -- "$(__zoxide_pwd || \builtin true)"
}
# Initialize hook.
if [ "${PS1:=}" = "${PS1#*\$(__zoxide_hook)}" ]; then
PS1="${PS1}\$(__zoxide_hook)"
fi
{%- when InitHook::Pwd -%}
# Hook to add new entries to the database.
__zoxide_hook() {
__zoxide_newpwd="$(__zoxide_pwd)"
if [[ "${__zoxide_oldpwd:-__zoxide_newpwd}" != "${__zoxide_newpwd}" ]]; then
\command zoxide add -- "${__zoxide_newpwd}"
__zoxide_oldpwd="${__zoxide_newpwd}"
fi
}
# Initialize hook.
__zoxide_trap="$(\command trap -p DEBUG)"
if [[ ${__zoxide_trap} != *'__zoxide_hook'* ]]; then
\command trap "__zoxide_hook;${__zoxide_trap#;}" DEBUG
fi
{%- endmatch %}
{{ section }}
# When using zoxide with --no-cmd, alias these internal functions as desired.
#
# Jump to a directory using only keywords.
__zoxide_z() {
# shellcheck disable=SC2199
if [[ $# -eq 0 ]]; then
__zoxide_cd ~
elif [[ $# -eq 1 && $1 == '-' ]]; then
__zoxide_cd "${OLDPWD}"
elif [[ $# -eq 1 && -d $1 ]]; then
__zoxide_cd "$1"
elif [[ $# -eq 2 && $1 == '--' ]]; then
__zoxide_cd "$2"
else
# shellcheck disable=SC2312
__zoxide_result="$(\command zoxide query --exclude "$(__zoxide_pwd)" -- "$@")" &&
__zoxide_cd "${__zoxide_result}"
fi
}
# Jump to a directory using interactive search.
__zoxide_zi() {
__zoxide_result="$(\command zoxide query --interactive -- "$@")" && __zoxide_cd "${__zoxide_result}"
}
{{ section }}
# Commands for zoxide. Disable these using --no-cmd.
#
{%- match cmd %}
{%- when Some with (cmd) %}
\command unalias {{cmd}} >/dev/null 2>&1 || \true
{{cmd}}() {
__zoxide_z "$@"
}
\command unalias {{cmd}}i >/dev/null 2>&1 || \true
{{cmd}}i() {
__zoxide_zi "$@"
}
{%- when None %}
{{ not_configured }}
{%- endmatch %}
{{ section }}
# To initialize zoxide, add this to your configuration:
#
# eval "$(zoxide init ksh)"

View File

@ -1,6 +1,8 @@
{%- let section = "# =============================================================================\n#" -%}
{%- let not_configured = "# -- not configured --" -%}
# shellcheck shell=sh
{{ section }}
# Utility functions for zoxide.
#

View File

@ -1,6 +1,8 @@
{%- let section = "# =============================================================================\n#" -%}
{%- let not_configured = "# -- not configured --" -%}
# shellcheck shell=bash
{{ section }}
# Utility functions for zoxide.
#