diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index a0edf609d..13ff65695 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -185,16 +185,19 @@ Load a bookmark. [[buffer]] === buffer -Syntax: +:buffer 'index'+ +Syntax: +:buffer ['index']+ Select tab by index or url/title best match. -Focuses window if necessary. +Focuses window if necessary when index is given. If both index and count are given, use count. ==== positional arguments * +'index'+: The [win_id/]index of the tab to focus. Or a substring in which case the closest match will be focused. +==== count +The tab index to focus, starting with 1. + [[close]] === close Close the current window. diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 11efccc11..24e7935fb 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1011,29 +1011,38 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('index', completion=miscmodels.buffer) - def buffer(self, index): + @cmdutils.argument('count', count=True) + def buffer(self, index=None, count=None): """Select tab by index or url/title best match. - Focuses window if necessary. + Focuses window if necessary when index is given. If both index and + count are given, use count. Args: index: The [win_id/]index of the tab to focus. Or a substring in which case the closest match will be focused. + count: The tab index to focus, starting with 1. """ - index_parts = index.split('/', 1) + if count is not None: + index_parts = [count] + elif index is None: + raise cmdexc.CommandError("buffer: Either a count or the argument " + "index must be specified.") + else: + index_parts = index.split('/', 1) - try: - for part in index_parts: - int(part) - except ValueError: - model = miscmodels.buffer() - model.set_pattern(index) - if model.count() > 0: - index = model.data(model.first_item()) - index_parts = index.split('/', 1) - else: - raise cmdexc.CommandError( - "No matching tab for: {}".format(index)) + try: + for part in index_parts: + int(part) + except ValueError: + model = miscmodels.buffer() + model.set_pattern(index) + if model.count() > 0: + index = model.data(model.first_item()) + index_parts = index.split('/', 1) + else: + raise cmdexc.CommandError( + "No matching tab for: {}".format(index)) if len(index_parts) == 2: win_id = int(index_parts[0]) diff --git a/tests/end2end/features/tabs.feature b/tests/end2end/features/tabs.feature index bcf7f15f0..02954dbcf 100644 --- a/tests/end2end/features/tabs.feature +++ b/tests/end2end/features/tabs.feature @@ -897,9 +897,9 @@ Feature: Tab management # :buffer - Scenario: :buffer without args + Scenario: :buffer without args or count When I run :buffer - Then the error "buffer: The following arguments are required: index" should be shown + Then the error "buffer: Either a count or the argument index must be specified." should be shown Scenario: :buffer with a matching title When I open data/title.html