summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJimmy <jimmy@spalge.com>2022-02-20 10:20:15 +1300
committerJimmy <jimmy@spalge.com>2022-02-20 10:20:15 +1300
commit133856e5ca7189b4c5112e2d75b5fab59b8f7f6f (patch)
tree64fcd4f2fbe48bf9362d591bde4d664a0801af9e
parenta22f60e38573156877b718fb89c0b8b53e1bb3a6 (diff)
parentcaaa6b6fdad45704f73598ef51e3b4b84d6844e6 (diff)
downloadqutebrowser-133856e5ca7189b4c5112e2d75b5fab59b8f7f6f.tar.gz
qutebrowser-133856e5ca7189b4c5112e2d75b5fab59b8f7f6f.zip
Merge pull request #7000 from AckslD/mode-autocmd
-rw-r--r--qutebrowser/config/configdata.yml12
-rw-r--r--qutebrowser/mainwindow/tabbedbrowser.py21
-rw-r--r--tests/end2end/features/tabs.feature19
3 files changed, 52 insertions, 0 deletions
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 <esc>
+ 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