Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add nushell support #1442

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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
4 changes: 3 additions & 1 deletion thefuck/shells/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,16 @@
from .tcsh import Tcsh
from .zsh import Zsh
from .powershell import Powershell
from .nushell import Nushell

shells = {'bash': Bash,
'fish': Fish,
'zsh': Zsh,
'csh': Tcsh,
'tcsh': Tcsh,
'powershell': Powershell,
'pwsh': Powershell}
'pwsh': Powershell,
'nu': Nushell}


def _get_shell_from_env():
Expand Down
72 changes: 72 additions & 0 deletions thefuck/shells/nushell.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
from subprocess import Popen, PIPE
import os
import six
import sys
from .. import logs
from ..utils import DEVNULL
from .generic import Generic


class Nushell(Generic):
friendly_name = 'Nushell Shell'

def get_aliases(self):
aliases = {}
command = 'help aliases | select name expansion | each { |row| $row.name + " ; " + $row.expansion } | str join (char nl)'
proc = Popen(['nu', '-l', '-c', command], stdout=PIPE, stderr=DEVNULL)
if proc.stdout is None:
return aliases
alias_out = proc.stdout.read().decode('utf-8').strip()
for alias in alias_out.split('\n'):
split_alias = alias.split(" ; ")
if len(split_alias) == 2:
name, value = split_alias
aliases[name] = value
return aliases
Comment on lines +13 to +25
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to get all the commands in nushell aswell using help commands in here?
help aliases only gets the actual aliases, i.e, stuff like alias vim = nvim.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch, I'll change that

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sweet, this will be awesome when its working merged!


def app_alias(self, alias_name):
return 'alias {0} = thefuck $"(history | last 1 | get command | get 0)"'.format(alias_name)

def _get_history_file_name(self):
return os.path.expanduser('~/.config/nushell/history.txt')

def _get_history_line(self, command_script):
return command_script

def and_(self, *commands):
return u' and '.join(commands)

def or_(self, *commands):
return u' or '.join(commands)

def how_to_configure(self):
return self._create_shell_configuration(
content='alias fuck = thefuck $"(history | last 1 | get command | get 0)"',
path="$nu.config-path",
reload="source $nu.config-path"
)

def _script_from_history(self, line):
return line

def put_to_history(self, command):
"""Adds fixed command to shell history."""
try:
history_file_name = self._get_history_file_name()
if os.path.isfile(history_file_name):
with open(history_file_name, 'a') as history:
entry = self._get_history_line(command)
if six.PY2:
history.write(entry.encode('utf-8'))
else:
history.write(entry)
except IOError:
logs.exception("Can't update history", sys.exc_info())

def _get_version(self):
"""Returns the version of the current shell"""
proc = Popen(['nu', '--version'], stdout=PIPE, stderr=DEVNULL)
if proc.stdout:
return proc.stdout.read().decode('utf-8')
else:
raise Exception("Could not get the version of the current shell")
11 changes: 9 additions & 2 deletions thefuck/types.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import os
import subprocess
import sys
from .shells import Nushell
from . import logs
from .shells import shell
from .conf import settings, load_source
Expand Down Expand Up @@ -257,5 +259,10 @@ def run(self, old_cmd):
# This depends on correct setting of PYTHONIOENCODING by the alias:
logs.debug(u'PYTHONIOENCODING: {}'.format(
os.environ.get('PYTHONIOENCODING', '!!not-set!!')))

sys.stdout.write(self._get_script())
script = self._get_script()
if isinstance(shell, Nushell):
# TODO: fix for better option, the lack of '-l' flag
# means we lose any ENV that could be needed
subprocess.run(["nu", "-c", script])
else:
sys.stdout.write(script)