From caaa6b6fdad45704f73598ef51e3b4b84d6844e6 Mon Sep 17 00:00:00 2001 From: Axel Dahlberg Date: Fri, 4 Feb 2022 17:38:26 +0100 Subject: feat(tabbedbrowser) add option to select mode based on url pattern --- qutebrowser/config/configdata.yml | 12 ++++++++++++ qutebrowser/mainwindow/tabbedbrowser.py | 21 +++++++++++++++++++++ tests/end2end/features/tabs.feature | 19 +++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index cf5e4665a..59f16511f 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -1811,6 +1811,18 @@ input.match_counts: Disabling it allows for emacs-like bindings where number keys are passed through (according to `input.forward_unbound_keys`) instead. +input.mode_override: + default: null + type: + name: String + none_ok: true + valid_values: + - normal + - insert + - passthrough + supports_pattern: true + desc: Mode to change to when focusing on a tab/URL changes. + ## keyhint keyhint.blacklist: diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index c3f06e185..da688367e 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -223,6 +223,10 @@ class TabbedBrowser(QWidget): # https://bugreports.qt.io/browse/QTBUG-65223 self.cur_load_finished.connect(self._leave_modes_on_load) + # handle mode_override + self.current_tab_changed.connect(lambda tab: self._mode_override(tab.url())) + self.cur_url_changed.connect(self._mode_override) + # This init is never used, it is immediately thrown away in the next # line. self.undo_stack: UndoStackType = collections.deque() @@ -777,6 +781,23 @@ class TabbedBrowser(QWidget): if not self.widget.page_title(idx): self.widget.set_page_title(idx, url.toDisplayString()) + def _mode_override(self, url: QUrl) -> None: + """Override mode if url matches pattern. + + Args: + url: The QUrl to match for + """ + if not url.isValid(): + return + mode = config.instance.get('input.mode_override', url=url) + if mode: + log.modes.debug(f"Mode change to {mode} triggered for url {url}") + modeman.enter( + self._win_id, + usertypes.KeyMode[mode], + reason='mode_override', + ) + @pyqtSlot(browsertab.AbstractTab) def _on_icon_changed(self, tab): """Set the icon of a tab. diff --git a/tests/end2end/features/tabs.feature b/tests/end2end/features/tabs.feature index 3715d5765..54e84a10e 100644 --- a/tests/end2end/features/tabs.feature +++ b/tests/end2end/features/tabs.feature @@ -1741,3 +1741,22 @@ Feature: Tab management And I run :undo And I run :message-info "Still alive!" Then the message "Still alive!" should be shown + + Scenario: Passthrough mode override + When I run :set -u localhost:*/data/numbers/1.txt input.mode_override 'passthrough' + And I open data/numbers/1.txt + Then "Entering mode KeyMode.passthrough (reason: mode_override)" should be logged + + Scenario: Insert mode override + When I run :set -u localhost:*/data/numbers/1.txt input.mode_override 'insert' + And I open data/numbers/1.txt + Then "Entering mode KeyMode.insert (reason: mode_override)" should be logged + + Scenario: Mode override on tab switch + When I run :set -u localhost:*/data/numbers/1.txt input.mode_override 'insert' + And I open data/numbers/1.txt + And I wait for "Entering mode KeyMode.insert (reason: mode_override)" in the log + And I run :fake-key -g + And I open data/numbers/2.txt in a new tab + And I run :tab-prev + Then "Entering mode KeyMode.insert (reason: mode_override)" should be logged -- cgit v1.2.3-54-g00ecf