Skip to main content

A highly-compatible translator from zsh -> xonsh

Project description

zsh2xonsh pypy powered-by-xonsh

Have you heard of xonsh? It's a Python-powered shell.

You can do amazing things like this:

# Interpolate python -> shell
echo @(i for i in range(42))

# Interpolate shell -> python
for filename in `.*`:
    print(filename)
    du -sh @(filename)

# Execute regular shell commands too
cat /etc/passwd | grep root

As you can immagine, this awesomeness is not POSIX-compliant :(

This makes it difficult to setup your $PATH and do things like eval $(brew shellenv)

This package exists to translate traditional zsh scripts into xonsh code.

Compatibility (and how it works)

The goal is 100% compatibility for a subset of shell.

Compatibility is achived by delegating most of the work to zsh.

That is, export FOO="$(echo bar)" in a shell script becomes (essentially) $FOO=$(zsh -c 'echo bar') in xonsh.

We have zsh handle all the globbing/quoting/bizzare POSIX quirks.

In the face of ambiguity, or if we encounter an unsupported feature (like a for loop), then we fail-fast.

This is the most important feature. If something can't be supported 100%, then it will throw a descriptive error. Anything else is a bug :)

Features

The included shell features include:

  1. Quoted expressions "$VAR glob/*" (zsh does expansion here)
  2. Unquoted literals 12, foo ~/foo (mostly translated directly)
  3. Command substitutions "$(cat file.txt | grep bar)"
    • zsh does all the work here
    • Supports both quoted and unquoted forms
  4. If/then statements
    • Conditionals are executed by zsh (so [[ -d "foo" ]] works perfectly)
    • Translated into python if (so body will not run unless conditional passes)
  5. Exporting variables export FOO=$BAR
    • Translates $PATH correctly (xonsh thinks it's a list, zsh thinks it's a string)
    • This is where the subprocess approach doesn't work blindly....
      • We support it cleanly by doing the left-hand assignment xonsh, and the right-hand expression in zsh :)
    • Local variables (local var=x) are supported too :)

All of these behaviors are 100% compatible with their zsh equivalents. If you try anything else (or encounter an unsupported corner case), then you will get a descripitive error :)

Installation & Usage

This is a pypi package, install it with pip install zsh2xonsh.

The API is simple, run translate_to_xonsh(str) -> str to translate from zsh -> xonsh code. This does not require xonsh at runtime, and can be done ahead of time.

If you want to evaluate the code immediately after translating it (for example in a .xonshrc), you can use . This requires xonsh at runtime (obviously) and uses the evalx builtin.

Additionally you can use the CLI (python -m zsh2xonsh), which accepts an import.

If you want to provide extra utility functions to your code, you can define extra_builtins.

Example

In my .xonshrc, I dynamically translate and evaluate the output of brew shellenv:

zsh2xonsh.translate_to_xonsh_and_eval($(/opt/homebrew/bin/brew shellenv))

Motiviation

First of all, I need support for eval $(brew shellenv) .

Second of all, I still use zsh as my backup shell.

This means I need to setup $PATH and other enviornment variables for both of these shells.

The natural way to set these up is by using shell scripts. I have a seperate one for each of my different machines (server, macbook, old lapotop, etc)

For each of these (tiny) shell scripts, zsh2xonsh works very well :)

So in addition to properly translating $(brew shellenv), it also needs to translate basic shell "environement files".

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

zsh2xonsh-0.1.0b1-py2.py3-none-any.whl (13.0 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file zsh2xonsh-0.1.0b1-py2.py3-none-any.whl.

File metadata

  • Download URL: zsh2xonsh-0.1.0b1-py2.py3-none-any.whl
  • Upload date:
  • Size: 13.0 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for zsh2xonsh-0.1.0b1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 4deffb2002f347870e0ca25691127ee389a6bdc55eb425ac0932e5611614c657
MD5 1b0cb840d58b6ea635f7bd59407124ab
BLAKE2b-256 dcaa19c4baede79c48d8f6aa101ef6f6b1bce9bd21524da453e536fdafad4e17

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page