diff options
author | nfnty <git@nfnty.se> | 2017-02-03 00:05:49 +0100 |
---|---|---|
committer | nfnty <git@nfnty.se> | 2017-02-03 00:09:55 +0100 |
commit | bf080d7a110eb9741a143bc8529a55d91862ec0d (patch) | |
tree | c6e0e6a7c17f411b8b88ed7705ca88ad42005cc3 | |
parent | 043b7635ed9ef60e6e08453d692685e943fb2a78 (diff) | |
download | ranger-bf080d7a110eb9741a143bc8529a55d91862ec0d.tar.gz |
api.commands: Refactor aliasing
Fixes #537
-rw-r--r-- | ranger/api/commands.py | 65 |
1 files changed, 23 insertions, 42 deletions
diff --git a/ranger/api/commands.py b/ranger/api/commands.py index d6c02aaa..b7497b61 100644 --- a/ranger/api/commands.py +++ b/ranger/api/commands.py @@ -7,7 +7,6 @@ from __future__ import (absolute_import, division, print_function) import os import re -import inspect # COMPAT pylint: disable=unused-import from collections import deque # NOQA from ranger.api import LinemodeBase, hook_init, hook_ready, register_linemode # NOQA @@ -20,7 +19,11 @@ from ranger.ext.lazy_property import lazy_property _SETTINGS_RE = re.compile(r'^\s*([^\s]+?)=(.*)$') -class CommandContainer(object): +def _alias_line(full_command, line): + return full_command + ''.join(re.split(r'(\s+)', line)[1:]) + + +class CommandContainer(FileManagerAware): def __init__(self): self.commands = {} @@ -29,12 +32,24 @@ class CommandContainer(object): return self.commands[key] def alias(self, name, full_command): - cmd = type(name, (AliasCommand, ), dict()) - cmd.based_function = name - cmd.function_name = name - cmd.object_name = name - cmd.full_command = full_command - self.commands[name] = cmd + cmd_name = full_command.split()[0] + try: + cmd = self.get_command(cmd_name) + except KeyError: + self.fm.notify('alias failed: No such command: {0}'.format(cmd_name), bad=True) + return None + + class CommandAlias(cmd): # pylint: disable=too-few-public-methods + def __init__(self, line, *args, **kwargs): + super(CommandAlias, self).__init__( + _alias_line(self.full_command, line), *args, **kwargs) + + cmd_alias = type(name, (CommandAlias, ), dict(full_command=full_command)) + if issubclass(cmd_alias, FunctionCommand): + cmd_alias.based_function = name + cmd_alias.object_name = name + cmd_alias.function_name = name + self.commands[name] = cmd_alias def load_commands_from_module(self, module): for var in vars(module).values(): @@ -420,40 +435,6 @@ class FunctionCommand(Command): ) -class AliasCommand(Command): - based_function = None - object_name = "" - function_name = "unknown" - full_command = "" - - def execute(self): - return self._make_cmd().execute() - - def quick(self): - return self._make_cmd().quick() - - def tab(self, tabnum): - cmd = self._make_cmd() - if self.fm.py3: - args = inspect.signature(cmd.tab).parameters # pylint: disable=no-member - else: - args = inspect.getargspec(cmd.tab).args # pylint: disable=deprecated-method - return cmd.tab(tabnum) if 'tabnum' in args else cmd.tab() - - def cancel(self): - return self._make_cmd().cancel() - - def _make_cmd(self): - cmd_class = self.fm.commands.get_command(self.full_command.split()[0]) - cmd = cmd_class(self.full_command + ' ' + self.rest(1)) - cmd.quickly_executed = self.quickly_executed - cmd.quantifier = self.quantifier - cmd.escape_macros_for_shell = self.escape_macros_for_shell - cmd.resolve_macros = self.resolve_macros - cmd.allow_abbrev = self.allow_abbrev - return cmd - - if __name__ == '__main__': import doctest doctest.testmod() |