1
0
mirror of https://github.com/nvbn/thefuck.git synced 2025-02-07 13:41:21 +00:00

add nushell support

This commit is contained in:
afresquet 2024-04-28 18:32:45 +02:00
parent c7e7e1d884
commit ed084cf0ac
No known key found for this signature in database
3 changed files with 84 additions and 3 deletions

View File

@ -10,6 +10,7 @@ from .generic import Generic
from .tcsh import Tcsh from .tcsh import Tcsh
from .zsh import Zsh from .zsh import Zsh
from .powershell import Powershell from .powershell import Powershell
from .nushell import Nushell
shells = {'bash': Bash, shells = {'bash': Bash,
'fish': Fish, 'fish': Fish,
@ -17,7 +18,8 @@ shells = {'bash': Bash,
'csh': Tcsh, 'csh': Tcsh,
'tcsh': Tcsh, 'tcsh': Tcsh,
'powershell': Powershell, 'powershell': Powershell,
'pwsh': Powershell} 'pwsh': Powershell,
'nu': Nushell}
def _get_shell_from_env(): def _get_shell_from_env():

72
thefuck/shells/nushell.py Normal file
View File

@ -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
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")

View File

@ -1,5 +1,7 @@
import os import os
import subprocess
import sys import sys
from .shells import Nushell
from . import logs from . import logs
from .shells import shell from .shells import shell
from .conf import settings, load_source from .conf import settings, load_source
@ -257,5 +259,10 @@ class CorrectedCommand(object):
# This depends on correct setting of PYTHONIOENCODING by the alias: # This depends on correct setting of PYTHONIOENCODING by the alias:
logs.debug(u'PYTHONIOENCODING: {}'.format( logs.debug(u'PYTHONIOENCODING: {}'.format(
os.environ.get('PYTHONIOENCODING', '!!not-set!!'))) os.environ.get('PYTHONIOENCODING', '!!not-set!!')))
script = self._get_script()
sys.stdout.write(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)