mirror of
				https://github.com/nvbn/thefuck.git
				synced 2025-10-31 07:04:12 +00:00 
			
		
		
		
	#682: Implement instant mode aliases for bash and zsh
This commit is contained in:
		| @@ -25,6 +25,10 @@ class Parser(object): | ||||
|             nargs='?', | ||||
|             const=get_alias(), | ||||
|             help='[custom-alias-name] prints alias for current shell') | ||||
|         self._parser.add_argument( | ||||
|             '--enable-experimental-instant-mode', | ||||
|             action='store_true', | ||||
|             help='enable experimental instant mode, use on your own risk') | ||||
|         self._parser.add_argument( | ||||
|             '-h', '--help', | ||||
|             action='store_true', | ||||
|   | ||||
| @@ -50,6 +50,11 @@ def main(): | ||||
|     elif known_args.command: | ||||
|         fix_command(known_args) | ||||
|     elif known_args.alias: | ||||
|         print(shell.app_alias(known_args.alias)) | ||||
|         if known_args.enable_experimental_instant_mode: | ||||
|             alias = shell.instant_mode_alias(known_args.alias) | ||||
|         else: | ||||
|             alias = shell.app_alias(known_args.alias) | ||||
|  | ||||
|         print(alias) | ||||
|     else: | ||||
|         parser.print_usage() | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| import os | ||||
| from uuid import uuid4 | ||||
| from ..conf import settings | ||||
| from ..const import ARGUMENT_PLACEHOLDER | ||||
| from ..const import ARGUMENT_PLACEHOLDER, USER_COMMAND_MARK | ||||
| from ..utils import memoize | ||||
| from .generic import Generic | ||||
|  | ||||
| @@ -27,6 +28,21 @@ class Bash(Generic): | ||||
|             alter_history=('history -s $TF_CMD;' | ||||
|                            if settings.alter_history else '')) | ||||
|  | ||||
|     def instant_mode_alias(self, alias_name): | ||||
|         if os.environ.get('THEFUCK_INSTANT_MODE'): | ||||
|             return ''' | ||||
|                 export PS1="{user_command_mark}$PS1"; | ||||
|                 {app_alias} | ||||
|             '''.format(user_command_mark=USER_COMMAND_MARK, | ||||
|                        app_alias=self.app_alias(alias_name)) | ||||
|         else: | ||||
|             return ''' | ||||
|                 export THEFUCK_INSTANT_MODE=True; | ||||
|                 export THEFUCK_OUTPUT_LOG={log}; | ||||
|                 script -feq {log}; | ||||
|                 exit | ||||
|             '''.format(log='/tmp/thefuck-script-log-{}'.format(uuid4().hex)) | ||||
|  | ||||
|     def _parse_alias(self, alias): | ||||
|         name, value = alias.replace('alias ', '', 1).split('=', 1) | ||||
|         if value[0] == value[-1] == '"' or value[0] == value[-1] == "'": | ||||
|   | ||||
| @@ -18,7 +18,7 @@ class Fish(Generic): | ||||
|             default.add(alias.strip()) | ||||
|         return default | ||||
|  | ||||
|     def app_alias(self, fuck): | ||||
|     def app_alias(self, alias_name): | ||||
|         if settings.alter_history: | ||||
|             alter_history = ('    builtin history delete --exact' | ||||
|                              ' --case-sensitive -- $fucked_up_command\n' | ||||
| @@ -33,7 +33,7 @@ class Fish(Generic): | ||||
|                 '  if [ "$unfucked_command" != "" ]\n' | ||||
|                 '    eval $unfucked_command\n{1}' | ||||
|                 '  end\n' | ||||
|                 'end').format(fuck, alter_history) | ||||
|                 'end').format(alias_name, alter_history) | ||||
|  | ||||
|     @memoize | ||||
|     @cache('.config/fish/config.fish', '.config/fish/functions') | ||||
|   | ||||
| @@ -3,6 +3,7 @@ import os | ||||
| import shlex | ||||
| import six | ||||
| from collections import namedtuple | ||||
| from warnings import warn | ||||
| from ..utils import memoize | ||||
| from ..conf import settings | ||||
| from ..system import Path | ||||
| @@ -32,9 +33,13 @@ class Generic(object): | ||||
|         """Prepares command for running in shell.""" | ||||
|         return command_script | ||||
|  | ||||
|     def app_alias(self, fuck): | ||||
|     def app_alias(self, alias_name): | ||||
|         return "alias {0}='eval $(TF_ALIAS={0} PYTHONIOENCODING=utf-8 " \ | ||||
|                "thefuck $(fc -ln -1))'".format(fuck) | ||||
|                "thefuck $(fc -ln -1))'".format(alias_name) | ||||
|  | ||||
|     def instant_mode_alias(self, alias_name): | ||||
|         warn("Instant mode not supported by your shell") | ||||
|         return self.app_alias(alias_name) | ||||
|  | ||||
|     def _get_history_file_name(self): | ||||
|         return '' | ||||
|   | ||||
| @@ -2,8 +2,8 @@ from .generic import Generic, ShellConfiguration | ||||
|  | ||||
|  | ||||
| class Powershell(Generic): | ||||
|     def app_alias(self, fuck): | ||||
|         return 'function ' + fuck + ' {\n' \ | ||||
|     def app_alias(self, alias_name): | ||||
|         return 'function ' + alias_name + ' {\n' \ | ||||
|                '    $history = (Get-History -Count 1).CommandLine;\n' \ | ||||
|                '    if (-not [string]::IsNullOrWhiteSpace($history)) {\n' \ | ||||
|                '        $fuck = $(thefuck $history);\n' \ | ||||
|   | ||||
| @@ -6,10 +6,10 @@ from .generic import Generic | ||||
|  | ||||
|  | ||||
| class Tcsh(Generic): | ||||
|     def app_alias(self, fuck): | ||||
|     def app_alias(self, alias_name): | ||||
|         return ("alias {0} 'setenv TF_ALIAS {0} && " | ||||
|                 "set fucked_cmd=`history -h 2 | head -n 1` && " | ||||
|                 "eval `thefuck ${{fucked_cmd}}`'").format(fuck) | ||||
|                 "eval `thefuck ${{fucked_cmd}}`'").format(alias_name) | ||||
|  | ||||
|     def _parse_alias(self, alias): | ||||
|         name, value = alias.split("\t", 1) | ||||
|   | ||||
| @@ -1,7 +1,8 @@ | ||||
| from time import time | ||||
| import os | ||||
| from uuid import uuid4 | ||||
| from ..conf import settings | ||||
| from ..const import ARGUMENT_PLACEHOLDER | ||||
| from ..const import ARGUMENT_PLACEHOLDER, USER_COMMAND_MARK | ||||
| from ..utils import memoize | ||||
| from .generic import Generic | ||||
|  | ||||
| @@ -26,6 +27,21 @@ class Zsh(Generic): | ||||
|             alter_history=('test -n "$TF_CMD" && print -s $TF_CMD' | ||||
|                            if settings.alter_history else '')) | ||||
|  | ||||
|     def instant_mode_alias(self, alias_name): | ||||
|         if os.environ.get('THEFUCK_INSTANT_MODE'): | ||||
|             return ''' | ||||
|                 export PS1="{user_command_mark}$PS1"; | ||||
|                 {app_alias} | ||||
|             '''.format(user_command_mark=USER_COMMAND_MARK, | ||||
|                        app_alias=self.app_alias(alias_name)) | ||||
|         else: | ||||
|             return ''' | ||||
|                 export THEFUCK_INSTANT_MODE=True; | ||||
|                 export THEFUCK_OUTPUT_LOG={log}; | ||||
|                 script -feq {log}; | ||||
|                 exit | ||||
|             '''.format(log='/tmp/thefuck-script-log-{}'.format(uuid4().hex)) | ||||
|  | ||||
|     def _parse_alias(self, alias): | ||||
|         name, value = alias.split('=', 1) | ||||
|         if value[0] == value[-1] == '"' or value[0] == value[-1] == "'": | ||||
|   | ||||
		Reference in New Issue
	
	Block a user