1
0
mirror of https://github.com/nvbn/thefuck.git synced 2025-03-20 09:39:01 +00:00

Merge ed084cf0ac4c79d3e14ddb1a92546c2348953c10 into c7e7e1d884d3bb241ea6448f72a989434c2a35ec

This commit is contained in:
Alvaro Fresquet 2024-04-28 17:09:17 +00:00 committed by GitHub
commit 474b4a1436
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
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)