diff --git a/tests/shells/test_powershell.py b/tests/shells/test_powershell.py new file mode 100644 index 00000000..d1e7a874 --- /dev/null +++ b/tests/shells/test_powershell.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +import pytest +from thefuck.shells import Powershell + + +@pytest.mark.usefixtures('isfile', 'no_memoize', 'no_cache') +class TestPowershell(object): + @pytest.fixture + def shell(self): + return Powershell() + + def test_and_(self, shell): + assert shell.and_('ls', 'cd') == '(ls) -and (cd)' + + def test_app_alias(self, shell): + assert 'function fuck' in shell.app_alias('fuck') + assert 'function FUCK' in shell.app_alias('FUCK') + assert 'thefuck' in shell.app_alias('fuck') diff --git a/thefuck/shells/__init__.py b/thefuck/shells/__init__.py index 414b8ee7..79fb66c8 100644 --- a/thefuck/shells/__init__.py +++ b/thefuck/shells/__init__.py @@ -9,20 +9,37 @@ from .fish import Fish from .generic import Generic from .tcsh import Tcsh from .zsh import Zsh +from .powershell import Powershell shells = {'bash': Bash, 'fish': Fish, 'zsh': Zsh, 'csh': Tcsh, - 'tcsh': Tcsh} + 'tcsh': Tcsh, + 'powershell': Powershell} def _get_shell(): - try: - shell_name = Process(os.getpid()).parent().name() - except TypeError: - shell_name = Process(os.getpid()).parent.name - return shells.get(shell_name, Generic)() + proc = Process(os.getpid()) + + while (proc is not None): + name = None + try: + name = proc.name() + except TypeError: + name = proc.name + + name = os.path.splitext(name)[0] + + if name in shells: + return shells[name]() + + try: + proc = proc.parent() + except TypeError: + proc = proc.parent + + return Generic() shell = _get_shell() diff --git a/thefuck/shells/powershell.py b/thefuck/shells/powershell.py new file mode 100644 index 00000000..fd0095ff --- /dev/null +++ b/thefuck/shells/powershell.py @@ -0,0 +1,18 @@ +from .generic import Generic + + +class Powershell(Generic): + def app_alias(self, fuck): + return 'function ' + fuck + ' { \n' \ + ' $fuck = $(thefuck (Get-History -Count 1).CommandLine)\n' \ + ' if (-not [string]::IsNullOrWhiteSpace($fuck)) {\n' \ + ' if ($fuck.StartsWith("echo")) { $fuck = $fuck.Substring(5) }\n' \ + ' else { iex "$fuck" }\n' \ + ' }\n' \ + '}\n' + + def and_(self, *commands): + return u' -and '.join('({0})'.format(c) for c in commands) + + def how_to_configure(self): + return 'iex "thefuck --alias"', '$profile' diff --git a/thefuck/system/win32.py b/thefuck/system/win32.py index 5cfd438e..b09778e1 100644 --- a/thefuck/system/win32.py +++ b/thefuck/system/win32.py @@ -16,7 +16,7 @@ def get_key(): ch = msvcrt.getch() # second call returns the actual key code if ch == b'\x03': - raise const.KEY_CTRL_C + return const.KEY_CTRL_C if ch == b'H': return const.KEY_UP if ch == b'P':