diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index 829d5f5fe..9f301c42f 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -110,6 +110,7 @@ Bind a key to a command. ==== note * This command does not split arguments after the last argument and handles quotes literally. * With this command, +;;+ is interpreted literally instead of splitting off a second command. +* This command does not replace variables like +\{url\}+. [[bookmark-add]] === bookmark-add @@ -424,6 +425,7 @@ Execute a command after some time. ==== note * This command does not split arguments after the last argument and handles quotes literally. * With this command, +;;+ is interpreted literally instead of splitting off a second command. +* This command does not replace variables like +\{url\}+. [[messages]] === messages @@ -591,6 +593,7 @@ Repeat a given command. ==== note * This command does not split arguments after the last argument and handles quotes literally. * With this command, +;;+ is interpreted literally instead of splitting off a second command. +* This command does not replace variables like +\{url\}+. [[report]] === report diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index a6d78f7ee..16afed74e 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -980,7 +980,7 @@ class CommandDispatcher: self._tabbed_browser.setUpdatesEnabled(True) @cmdutils.register(instance='command-dispatcher', scope='window', - maxsplit=0) + maxsplit=0, no_replace_variables=True) def spawn(self, cmdline, userscript=False, verbose=False, detach=False): """Spawn a command in a shell. diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 2858a9f02..59b690cbd 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -81,6 +81,7 @@ class Command: no_cmd_split: If true, ';;' to split sub-commands is ignored. backend: Which backend the command works with (or None if it works with both) + no_replace_variables: Don't replace variables like {url} _qute_args: The saved data from @cmdutils.argument _needs_js: Whether the command needs javascript enabled _modes: The modes the command can be executed in. @@ -94,7 +95,7 @@ class Command: hide=False, modes=None, not_modes=None, needs_js=False, debug=False, ignore_args=False, deprecated=False, no_cmd_split=False, star_args_optional=False, scope='global', - backend=None): + backend=None, no_replace_variables=False): # I really don't know how to solve this in a better way, I tried. # pylint: disable=too-many-locals if modes is not None and not_modes is not None: @@ -126,6 +127,7 @@ class Command: self.handler = handler self.no_cmd_split = no_cmd_split self.backend = backend + self.no_replace_variables = no_replace_variables self.docparser = docutils.DocstringParser(handler) self.parser = argparser.ArgumentParser( diff --git a/qutebrowser/commands/runners.py b/qutebrowser/commands/runners.py index f020b9199..323513604 100644 --- a/qutebrowser/commands/runners.py +++ b/qutebrowser/commands/runners.py @@ -52,16 +52,16 @@ def replace_variables(win_id, arglist): args = [] tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id) - if '{url}' in arglist: + if any('{url}' in arg for arg in arglist): url = _current_url(tabbed_browser).toString(QUrl.FullyEncoded | QUrl.RemovePassword) - if '{url:pretty}' in arglist: + if any('{url:pretty}' in arg for arg in arglist): pretty_url = _current_url(tabbed_browser).toString(QUrl.RemovePassword) for arg in arglist: - if arg == '{url}': - args.append(url) - elif arg == '{url:pretty}': - args.append(pretty_url) + if '{url}' in arg: + args.append(arg.replace('{url}', url)) + elif '{url:pretty}' in arg: + args.append(arg.replace('{url:pretty}', pretty_url)) else: args.append(arg) return args @@ -279,7 +279,10 @@ class CommandRunner(QObject): window=self._win_id) cur_mode = mode_manager.mode - args = replace_variables(self._win_id, result.args) + if result.cmd.no_replace_variables: + args = result.args + else: + args = replace_variables(self._win_id, result.args) if count is not None: if result.count is not None: raise cmdexc.CommandMetaError("Got count via command and " diff --git a/qutebrowser/config/parsers/keyconf.py b/qutebrowser/config/parsers/keyconf.py index 364133da9..7c7eb5554 100644 --- a/qutebrowser/config/parsers/keyconf.py +++ b/qutebrowser/config/parsers/keyconf.py @@ -150,7 +150,8 @@ class KeyConfigParser(QObject): data = str(self) f.write(data) - @cmdutils.register(instance='key-config', maxsplit=1, no_cmd_split=True) + @cmdutils.register(instance='key-config', maxsplit=1, no_cmd_split=True, + no_replace_variables=True) @cmdutils.argument('win_id', win_id=True) @cmdutils.argument('command', completion=usertypes.Completion.command) def bind(self, key, win_id, command=None, *, mode='normal', force=False): diff --git a/qutebrowser/mainwindow/statusbar/command.py b/qutebrowser/mainwindow/statusbar/command.py index 68eb615df..df419c0dd 100644 --- a/qutebrowser/mainwindow/statusbar/command.py +++ b/qutebrowser/mainwindow/statusbar/command.py @@ -23,8 +23,8 @@ from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QSize from PyQt5.QtWidgets import QSizePolicy from qutebrowser.keyinput import modeman, modeparsers -from qutebrowser.commands import cmdexc, cmdutils, runners -from qutebrowser.misc import cmdhistory, split +from qutebrowser.commands import cmdexc, cmdutils +from qutebrowser.misc import cmdhistory from qutebrowser.misc import miscwidgets as misc from qutebrowser.utils import usertypes, log, objreg @@ -108,10 +108,6 @@ class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit): space: If given, a space is added to the end. append: If given, the text is appended to the current text. """ - args = split.simple_split(text) - args = runners.replace_variables(self._win_id, args) - text = ' '.join(args) - if space: text += ' ' if append: diff --git a/qutebrowser/misc/utilcmds.py b/qutebrowser/misc/utilcmds.py index fe9f580b7..9622db367 100644 --- a/qutebrowser/misc/utilcmds.py +++ b/qutebrowser/misc/utilcmds.py @@ -39,7 +39,7 @@ from PyQt5.QtCore import QUrl from PyQt5.QtWidgets import QApplication # pylint: disable=unused-import -@cmdutils.register(maxsplit=1, no_cmd_split=True) +@cmdutils.register(maxsplit=1, no_cmd_split=True, no_replace_variables=True) @cmdutils.argument('win_id', win_id=True) def later(ms: int, command, win_id): """Execute a command after some time. @@ -69,7 +69,7 @@ def later(ms: int, command, win_id): raise -@cmdutils.register(maxsplit=1, no_cmd_split=True) +@cmdutils.register(maxsplit=1, no_cmd_split=True, no_replace_variables=True) @cmdutils.argument('win_id', win_id=True) def repeat(times: int, command, win_id): """Repeat a given command. diff --git a/scripts/dev/src2asciidoc.py b/scripts/dev/src2asciidoc.py index af1ba0936..84b774a03 100755 --- a/scripts/dev/src2asciidoc.py +++ b/scripts/dev/src2asciidoc.py @@ -239,7 +239,8 @@ def _get_command_doc_notes(cmd): Yield: Strings which should be added to the docs. """ - if cmd.maxsplit is not None or cmd.no_cmd_split: + if (cmd.maxsplit is not None or cmd.no_cmd_split or + cmd.no_replace_variables and cmd.name != "spawn"): yield "" yield "==== note" if cmd.maxsplit is not None: @@ -248,6 +249,8 @@ def _get_command_doc_notes(cmd): if cmd.no_cmd_split: yield ("* With this command, +;;+ is interpreted literally " "instead of splitting off a second command.") + if cmd.no_replace_variables and cmd.name != "spawn": + yield r"* This command does not replace variables like +\{url\}+." def _get_action_metavar(action, nargs=1):