import os import glob ## Load settings applied with :set config.load_autoconfig() ## General config c.content.default_encoding = 'utf-8' c.content.javascript.enabled = True c.content.local_storage = True c.content.plugins = True c.editor.encoding = 'utf-8' ## Security & privacy c.content.autoplay = False # don't autoplay videos ## Adblocking # Use (superior) Brave adblock if available, or fall back to host blocking c.content.blocking.method = "auto" c.content.blocking.hosts.lists = [ 'https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts', 'https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&mimetype=plaintext' # 'https://www.malwaredomainlist.com/hostslist/hosts.txt', # 'http://someonewhocares.org/hosts/hosts', # 'http://winhelp2002.mvps.org/hosts.zip', # 'http://malwaredomains.lehigh.edu/files/justdomains.zip', ] # c.content.blocking.whitelist = [] ## Options c.downloads.position = 'bottom' c.downloads.location.directory = os.path.expanduser("~/dl") c.downloads.location.prompt = False c.input.insert_mode.auto_leave = True c.input.insert_mode.auto_load = False c.input.links_included_in_focus_chain = False c.new_instance_open_target = 'tab-silent' c.prompt.filebrowser = False c.prompt.radius = 0 c.spellcheck.languages = ['en-US'] c.session.lazy_restore = True c.tabs.show = 'multiple' c.tabs.title.format = '{audio}{current_title} - {host}' c.tabs.title.format_pinned = '' c.window.title_format = '{current_title} - {host} - qutebrowser' # ## Keybindings # Universal Emacsien C-g alias for Escape config.bind('', 'clear-keychain ;; search ;; fullscreen --leave') for mode in ['caret', 'command', 'hint', 'insert', 'passthrough', 'prompt', 'register']: config.bind('', 'mode-leave', mode=mode) # ... config.bind('zz', 'close') config.bind('tm', 'tab-mute') config.bind('wi', 'devtools bottom') config.bind(';;', 'hint inputs --first') # easier to reach than ;t config.bind(';e', 'hint inputs --first ;; fake-key ;; :spawn nohup bspc rule -a "Emacs:*" -o state=floating sticky=on && emacsclient --eval "(emacs-everywhere)"') # ;v already bound to 'spawn mpv {url}' config.bind(';V', 'hint links spawn mpv {hint-url}') # Use external editor c.editor.command = ['emacsclient', '-c', '-F', '((name . "qutebrowser-editor"))', '+{line}:{column}', '{}'] # Though we set it, I use the more specialzied emacs-everywhere instead config.bind('', 'edit-text', mode='insert') config.bind('', 'hint inputs --first ;; edit-text', mode='normal') config.bind('', 'fake-key ', mode='insert') # Bitwarden integration config.bind(";pp", 'spawn -u qute-bwmenu') config.bind(";pu", 'spawn -u qute-bwmenu --field username') config.bind(";ps", 'spawn -u qute-bwmenu --field password') config.bind(";po", 'spawn -u qute-bwmenu --field otp') config.bind(";pl", 'spawn -u qute-bwmenu --last') ## Ex-commands ## Bindings for normal mode # config.bind("'", 'enter-mode jump_mark') # config.bind('+', 'zoom-in') # config.bind('-', 'zoom-out') # config.bind('.', 'repeat-command') # config.bind('/', 'set-cmd-text /') # config.bind(':', 'set-cmd-text :') # config.bind(';I', 'hint images tab') # config.bind(';O', 'hint links fill :open -t -r {hint-url}') # config.bind(';R', 'hint --rapid links window') # config.bind(';Y', 'hint links yank-primary') # config.bind(';b', 'hint all tab-bg') # config.bind(';d', 'hint links download') # config.bind(';f', 'hint all tab-fg') # config.bind(';h', 'hint all hover') # config.bind(';i', 'hint images') # config.bind(';o', 'hint links fill :open {hint-url}') # config.bind(';r', 'hint --rapid links tab-bg') # config.bind(';t', 'hint inputs') # config.bind(';y', 'hint links yank') # config.bind('', 'tab-focus 1') # config.bind('', 'tab-focus 2') # config.bind('', 'tab-focus 3') # config.bind('', 'tab-focus 4') # config.bind('', 'tab-focus 5') # config.bind('', 'tab-focus 6') # config.bind('', 'tab-focus 7') # config.bind('', 'tab-focus 8') # config.bind('', 'tab-focus -1') # config.bind('', 'navigate increment') # config.bind('', 'print') # config.bind('', 'scroll-page 0 -1') # config.bind('', 'scroll-page 0 0.5') # config.bind('', 'reload -f') # config.bind('', 'scroll-page 0 1') # config.bind('', 'open -w') # config.bind('', 'tab-next') # config.bind('', 'tab-prev') # config.bind('', 'quit') # config.bind('', 'follow-selected -t') # config.bind('', 'open -p') # config.bind('', 'undo') # config.bind('', 'close') # config.bind('', 'open -t') # config.bind('', 'tab-focus last') # config.bind('', 'scroll-page 0 -0.5') # config.bind('', 'enter-mode passthrough') # config.bind('', 'tab-close') # config.bind('', 'navigate decrement') # config.bind('', 'tab-focus last') # config.bind('', 'home') # config.bind('', 'tab-pin') # config.bind('', 'stop') # config.bind('', 'clear-keychain ;; search ;; fullscreen --leave') # config.bind('', 'fullscreen') # config.bind('', 'reload') # config.bind('', 'follow-selected') # config.bind('', 'back') # config.bind('', 'forward') # config.bind('=', 'zoom') # config.bind('?', 'set-cmd-text ?') # config.bind('@', 'run-macro') # config.bind('B', 'set-cmd-text -s :quickmark-load -t') # config.bind('D', 'tab-close -o') # config.bind('F', 'hint all tab') # config.bind('G', 'scroll-to-perc') # config.bind('H', 'back') # config.bind('J', 'tab-next') # config.bind('K', 'tab-prev') # config.bind('L', 'forward') # config.bind('M', 'bookmark-add') # config.bind('N', 'search-prev') # config.bind('O', 'set-cmd-text -s :open -t') # config.bind('PP', 'open -t -- {primary}') # config.bind('Pp', 'open -t -- {clipboard}') # config.bind('R', 'reload -f') # config.bind('Sb', 'open qute://bookmarks#bookmarks') # config.bind('Sh', 'open qute://history') # config.bind('Sq', 'open qute://bookmarks') # config.bind('Ss', 'open qute://settings') # config.bind('T', 'tab-focus') # config.bind('ZQ', 'quit') # config.bind('ZZ', 'quit --save') # config.bind('[[', 'navigate prev') # config.bind(']]', 'navigate next') # config.bind('`', 'enter-mode set_mark') # config.bind('ad', 'download-cancel') # config.bind('b', 'set-cmd-text -s :quickmark-load') # config.bind('cd', 'download-clear') # config.bind('co', 'tab-only') # config.bind('d', 'tab-close') # config.bind('f', 'hint') # config.bind('g$', 'tab-focus -1') # config.bind('g0', 'tab-focus 1') # config.bind('gB', 'set-cmd-text -s :bookmark-load -t') # config.bind('gC', 'tab-clone') # config.bind('gO', 'set-cmd-text :open -t -r {url:pretty}') # config.bind('gU', 'navigate up -t') # config.bind('g^', 'tab-focus 1') # config.bind('ga', 'open -t') # config.bind('gb', 'set-cmd-text -s :bookmark-load') # config.bind('gd', 'download') # config.bind('gf', 'view-source') # config.bind('gg', 'scroll-to-perc 0') # config.bind('gl', 'tab-move -') # config.bind('gm', 'tab-move') # config.bind('go', 'set-cmd-text :open {url:pretty}') # config.bind('gr', 'tab-move +') # config.bind('gt', 'set-cmd-text -s :buffer') # config.bind('gu', 'navigate up') # config.bind('h', 'scroll left') # config.bind('i', 'enter-mode insert') # config.bind('j', 'scroll down') # config.bind('k', 'scroll up') # config.bind('l', 'scroll right') # config.bind('m', 'quickmark-save') # config.bind('n', 'search-next') # config.bind('o', 'set-cmd-text -s :open') # config.bind('pP', 'open -- {primary}') # config.bind('pp', 'open -- {clipboard}') # config.bind('q', 'record-macro') # config.bind('r', 'reload') # config.bind('sf', 'save') # config.bind('sk', 'set-cmd-text -s :bind') # config.bind('sl', 'set-cmd-text -s :set -t') # config.bind('ss', 'set-cmd-text -s :set') # config.bind('th', 'back -t') # config.bind('tl', 'forward -t') # config.bind('u', 'undo') # config.bind('v', 'enter-mode caret') # config.bind('wB', 'set-cmd-text -s :bookmark-load -w') # config.bind('wO', 'set-cmd-text :open -w {url:pretty}') # config.bind('wP', 'open -w -- {primary}') # config.bind('wb', 'set-cmd-text -s :quickmark-load -w') # config.bind('wf', 'hint all window') # config.bind('wh', 'back -w') # config.bind('wi', 'inspector') # config.bind('wl', 'forward -w') # config.bind('wo', 'set-cmd-text -s :open -w') # config.bind('wp', 'open -w -- {clipboard}') # config.bind('xO', 'set-cmd-text :open -b -r {url:pretty}') # config.bind('xb', 'config-cycle statusbar.hide') # config.bind('xo', 'set-cmd-text -s :open -b') # config.bind('xt', 'config-cycle tabs.show always switching') # config.bind('xx', 'config-cycle statusbar.hide ;; config-cycle tabs.show always switching') # config.bind('yD', 'yank domain -s') # config.bind('yP', 'yank pretty-url -s') # config.bind('yT', 'yank title -s') # config.bind('yY', 'yank -s') # config.bind('yd', 'yank domain') # config.bind('yp', 'yank pretty-url') # config.bind('yt', 'yank title') # config.bind('yy', 'yank') # config.bind('{{', 'navigate prev -t') # config.bind('}}', 'navigate next -t') ## Bindings for caret mode # config.bind('$', 'move-to-end-of-line', mode='caret') # config.bind('0', 'move-to-start-of-line', mode='caret') # config.bind('', 'drop-selection', mode='caret') # config.bind('', 'leave-mode', mode='caret') # config.bind('', 'yank selection', mode='caret') # config.bind('', 'toggle-selection', mode='caret') # config.bind('G', 'move-to-end-of-document', mode='caret') # config.bind('H', 'scroll left', mode='caret') # config.bind('J', 'scroll down', mode='caret') # config.bind('K', 'scroll up', mode='caret') # config.bind('L', 'scroll right', mode='caret') # config.bind('Y', 'yank selection -s', mode='caret') # config.bind('[', 'move-to-start-of-prev-block', mode='caret') # config.bind(']', 'move-to-start-of-next-block', mode='caret') # config.bind('b', 'move-to-prev-word', mode='caret') # config.bind('c', 'enter-mode normal', mode='caret') # config.bind('e', 'move-to-end-of-word', mode='caret') # config.bind('gg', 'move-to-start-of-document', mode='caret') # config.bind('h', 'move-to-prev-char', mode='caret') # config.bind('j', 'move-to-next-line', mode='caret') # config.bind('k', 'move-to-prev-line', mode='caret') # config.bind('l', 'move-to-next-char', mode='caret') # config.bind('v', 'toggle-selection', mode='caret') # config.bind('w', 'move-to-next-word', mode='caret') # config.bind('y', 'yank selection', mode='caret') # config.bind('{', 'move-to-end-of-prev-block', mode='caret') # config.bind('}', 'move-to-end-of-next-block', mode='caret') ## Bindings for command mode # config.bind('', 'rl-backward-word', mode='command') # config.bind('', 'rl-backward-kill-word', mode='command') # config.bind('', 'rl-kill-word', mode='command') # config.bind('', 'rl-forward-word', mode='command') # config.bind('', 'rl-delete-char', mode='command') # config.bind('', 'rl-beginning-of-line', mode='command') # config.bind('', 'rl-backward-char', mode='command') # config.bind('', 'completion-item-del', mode='command') # config.bind('', 'rl-end-of-line', mode='command') # config.bind('', 'rl-forward-char', mode='command') config.bind('', 'rl-backward-word', mode='command') config.bind('', 'rl-forward-word', mode='command') # config.bind('', 'rl-backward-delete-char', mode='command') # config.bind('', 'rl-kill-line', mode='command') # config.bind('', 'command-history-next', mode='command') # config.bind('', 'command-history-prev', mode='command') # config.bind('', 'completion-item-focus prev-category', mode='command') # config.bind('', 'completion-item-focus next-category', mode='command') # config.bind('', 'rl-unix-line-discard', mode='command') # config.bind('', 'rl-unix-word-rubout', mode='command') # config.bind('', 'rl-yank', mode='command') # config.bind('', 'command-history-next', mode='command') # config.bind('', 'leave-mode', mode='command') # config.bind('', 'command-accept', mode='command') # config.bind('', 'completion-item-del', mode='command') # config.bind('', 'completion-item-focus prev', mode='command') # config.bind('', 'completion-item-focus next', mode='command') # config.bind('', 'command-history-prev', mode='command') ## Bindings for hint mode # config.bind('', 'hint all tab-bg', mode='hint') # config.bind('', 'hint links', mode='hint') # config.bind('', 'hint --rapid links tab-bg', mode='hint') # config.bind('', 'mode-leave', mode='hint') # config.bind('', 'follow-hint', mode='hint') ## Bindings for insert mode # config.bind('', 'open-editor', mode='insert') # config.bind('', 'leave-mode', mode='insert') # config.bind('', 'insert-text {primary}', mode='insert') ## Bindings for passthrough mode # config.bind('', 'leave-mode', mode='passthrough') ## Bindings for prompt mode # config.bind('', 'rl-backward-word', mode='prompt') # config.bind('', 'rl-backward-kill-word', mode='prompt') # config.bind('', 'rl-kill-word', mode='prompt') # config.bind('', 'rl-forward-word', mode='prompt') # config.bind('', 'rl-delete-char', mode='prompt') # config.bind('', 'rl-beginning-of-line', mode='prompt') # config.bind('', 'rl-backward-char', mode='prompt') # config.bind('', 'rl-end-of-line', mode='prompt') # config.bind('', 'rl-forward-char', mode='prompt') config.bind('', 'rl-backward-word', mode='prompt') config.bind('', 'rl-forward-word', mode='prompt') # config.bind('', 'rl-backward-delete-char', mode='prompt') # config.bind('', 'rl-kill-line', mode='prompt') # config.bind('', 'rl-unix-line-discard', mode='prompt') # config.bind('', 'rl-unix-word-rubout', mode='prompt') # config.bind('', 'prompt-open-download', mode='prompt') # config.bind('', 'rl-yank', mode='prompt') # config.bind('', 'prompt-item-focus next', mode='prompt') # config.bind('', 'leave-mode', mode='prompt') # config.bind('', 'prompt-accept', mode='prompt') # config.bind('', 'prompt-item-focus prev', mode='prompt') # config.bind('', 'prompt-item-focus next', mode='prompt') # config.bind('', 'prompt-item-focus prev', mode='prompt') # config.bind('n', 'prompt-accept no', mode='prompt') # config.bind('y', 'prompt-accept yes', mode='prompt') ## Bindings for register mode # config.bind('', 'leave-mode', mode='register') ## Per-domain settings c.content.user_stylesheets = glob.glob(os.path.expanduser('~/.local/share/qutebrowser/userstyles.css')) ## Load theme for path in glob.glob(os.path.expanduser('~/.config/qutebrowser/extra/*.py')): config.source(path)