diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 5ff06602c..0a725709b 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -22,6 +22,7 @@ Added - New `:edit-url` command to edit the URL in an external editor. - New `network -> custom-headers` setting to send custom headers with every request. +- New `{url:pretty}` commandline replacement which gets replaced by the decoded URL. Changed ~~~~~~~ diff --git a/README.asciidoc b/README.asciidoc index 8531a92f5..aca9172d3 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -173,10 +173,10 @@ Contributors, sorted by the number of commits in descending order: * John ShaggyTwoDope Jenkins * Jimmy * Peter Vilim +* Panagiotis Ktistakis * Clayton Craft * Oliver Caldwell * Jonas Schürmann -* Panagiotis Ktistakis * Jakub Klinkovský * skinnay * error800 diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index 5d4786bbe..bf0891904 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -655,7 +655,7 @@ Syntax: +:spawn [*--userscript*] [*--verbose*] [*--detach*] 'cmdline'+ Spawn a command in a shell. -Note the {url} variable which gets replaced by the current URL might be useful here. +Note the `{url}` and `{url:pretty}` variables might be useful here. `{url}` gets replaced by the URL in fully encoded format and `{url:pretty}` uses a "pretty form" with most percent-encoded characters decoded. ==== positional arguments * +'cmdline'+: The commandline to execute. diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 278380578..e30d9884e 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -974,8 +974,10 @@ class CommandDispatcher: def spawn(self, cmdline, userscript=False, verbose=False, detach=False): """Spawn a command in a shell. - Note the {url} variable which gets replaced by the current URL might be - useful here. + Note the `{url}` and `{url:pretty}` variables might be useful here. + `{url}` gets replaced by the URL in fully encoded format and + `{url:pretty}` uses a "pretty form" with most percent-encoded + characters decoded. Args: userscript: Run the command as a userscript. You can use an diff --git a/qutebrowser/commands/runners.py b/qutebrowser/commands/runners.py index fbd7b1b22..bca05d80f 100644 --- a/qutebrowser/commands/runners.py +++ b/qutebrowser/commands/runners.py @@ -33,24 +33,33 @@ ParseResult = collections.namedtuple('ParseResult', ['cmd', 'args', 'cmdline', 'count']) +def _current_url(tabbed_browser): + """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) + + def replace_variables(win_id, arglist): """Utility function to replace variables like {url} in a list of args.""" args = [] tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id) if '{url}' in arglist: - try: - url = tabbed_browser.current_url().toString(QUrl.FullyEncoded | - QUrl.RemovePassword) - except qtutils.QtValueError as e: - msg = "Current URL is invalid" - if e.reason: - msg += " ({})".format(e.reason) - msg += "!" - raise cmdexc.CommandError(msg) + url = _current_url(tabbed_browser).toString(QUrl.FullyEncoded | + QUrl.RemovePassword) + if '{url:pretty}' 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) else: args.append(arg) return args diff --git a/tests/integration/data/title with spaces.html b/tests/integration/data/title with spaces.html new file mode 100644 index 000000000..d5e2ab9da --- /dev/null +++ b/tests/integration/data/title with spaces.html @@ -0,0 +1,10 @@ + + +
+ +