Coverage for qutebrowser/commands/runners.py : 64%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:
# Copyright 2014-2018 Florian Bruhin (The Compiler) <mail@qutebrowser.org> # # This file is part of qutebrowser. # # qutebrowser is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # qutebrowser is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
class ParseResult:
"""The result of parsing a commandline."""
"""Convenience method to get the current url.""" try: return tabbed_browser.current_url() except qtutils.QtValueError as e: msg = "Current URL is invalid" if e.reason: msg += " ({})".format(e.reason) msg += "!" raise cmdexc.CommandError(msg)
"""Utility function to replace variables like {url} in a list of args.""" variables = { 'url': lambda: _current_url(tabbed_browser).toString( QUrl.FullyEncoded | QUrl.RemovePassword), 'url:pretty': lambda: _current_url(tabbed_browser).toString( QUrl.DecodeReserved | QUrl.RemovePassword), 'clipboard': utils.get_clipboard, 'primary': lambda: utils.get_clipboard(selection=True), } for key in list(variables): modified_key = '{' + key + '}' variables[modified_key] = lambda x=modified_key: x values = {} args = [] tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id)
def repl_cb(matchobj): """Return replacement for given match.""" var = matchobj.group("var") if var not in values: values[var] = variables[var]() return values[var] repl_pattern = re.compile("{(?P<var>" + "|".join(variables.keys()) + ")}")
try: for arg in arglist: # using re.sub with callback function replaces all variables in a # single pass and avoids expansion of nested variables (e.g. # "{url}" from clipboard is not expanded) args.append(repl_pattern.sub(repl_cb, arg)) except utils.ClipboardError as e: raise cmdexc.CommandError(e) return args
"""Parse qutebrowser commandline commands.
Attributes: _partial_match: Whether to allow partial command matches. """
"""Get an alias from the config.
Args: text: The text to parse. default : Default value to return when alias was not found.
Return: The new command string if an alias was found. Default value otherwise. """ except KeyError: return default
new_cmd += ' '
"""Split a command on ;; and parse all parts.
If the first command in the commandline is a non-split one, it only returns that.
Args: text: Text to parse. aliases: Whether to handle aliases. *args/**kwargs: Passed to parse().
Yields: ParseResult tuples. """
# Get the first command and check if it doesn't want to have ;; # split. else: else:
"""Wrapper over _parse_all_gen."""
"""Split the commandline text into command and arguments.
Args: text: Text to parse. fallback: Whether to do a fallback splitting when the command was unknown. keep: Whether to keep special chars and whitespace
Return: A ParseResult tuple. """
'{}: no such command'.format(cmdstr))
else:
"""Replace cmdstr with a matching completion if there's only one match.
Args: cmdstr: The string representing the entered command so far
Return: cmdstr modified to the matching completion or unmodified """ if cmdstr in cmd]
"""Split the arguments from an arg string.
Args: cmd: The command we're currently handling. argstr: An argument string. keep: Whether to keep special chars and whitespace
Return: A list containing the split strings. """ else: # If split=False, we still want to split the flags, but not # everything after that. # We first split the arg string and check the index of the first # non-flag args, then we re-split again properly. # example: # # input: "--foo -v bar baz" # first split: ['--foo', '-v', 'bar', 'baz'] # 0 1 2 3 # second split: ['--foo', '-v', 'bar baz'] # (maxsplit=2) else: maxsplit=maxsplit)
# If there are only flags, we got it right on the first try # already.
"""Parse and run qutebrowser commandline commands.
Attributes: _win_id: The window this CommandRunner is associated with. """
"""Parse a command from a line of text and run it.
Args: text: The text to parse. count: The count to pass to the command. """ record_last_command = True record_macro = True
mode_manager = objreg.get('mode-manager', scope='window', window=self._win_id) cur_mode = mode_manager.mode
for result in self._parser.parse_all(text): if result.cmd.no_replace_variables: args = result.args else: args = replace_variables(self._win_id, result.args) result.cmd.run(self._win_id, args, count=count)
if result.cmdline[0] == 'repeat-command': record_last_command = False
if result.cmdline[0] in ['record-macro', 'run-macro', 'set-cmd-text']: record_macro = False
if record_last_command: last_command[cur_mode] = (text, count)
if record_macro and cur_mode == usertypes.KeyMode.normal: macro_recorder = objreg.get('macro-recorder') macro_recorder.record_command(text, count)
"""Run a command and display exceptions in the statusbar.""" try: self.run(text, count) except cmdexc.Error as e: message.error(str(e), stack=traceback.format_exc()) |