# Buggy code
def update_keyhint(self, modename, prefix):
    """Show hints for the given prefix (or hide if prefix is empty).

    Args:
        prefix: The current partial keystring.
    """
    countstr, prefix = re.fullmatch(r"(\d*)(.*)", prefix).groups()
    if not prefix:
        self._show_timer.stop()
        self.hide()
        return

    def blacklisted(keychain):
        return any(
            fnmatch.fnmatchcase(keychain, glob) for glob in config.val.keyhint.blacklist
        )

    def takes_count(cmdstr):
        """Return true iff this command can take a count argument."""
        cmdname = cmdstr.split(" ")[0]
        cmd = cmdutils.cmd_dict.get(cmdname)
        return cmd and cmd.takes_count()

    bindings_dict = config.key_instance.get_bindings_for(modename)
    bindings = [
        (k, v)
        for (k, v) in sorted(bindings_dict.items())
        if keyutils.KeySequence.parse(prefix).matches(k)
        and not blacklisted(str(k))
        and (takes_count(v) or not countstr)
    ]

    if not bindings:
        self._show_timer.stop()
        return

    # delay so a quickly typed keychain doesn't display hints
    self._show_timer.setInterval(config.val.keyhint.delay)
    self._show_timer.start()
    suffix_color = html.escape(config.val.colors.keyhint.suffix.fg)

    text = ""
    for seq, cmd in bindings:
        text += (
            "<tr>"
            "<td>{}</td>"
            "<td style='color: {}'>{}</td>"
            "<td style='padding-left: 2ex'>{}</td>"
            "</tr>"
        ).format(
            html.escape(prefix),
            suffix_color,
            html.escape(str(seq[len(prefix) :])),
            html.escape(cmd),
        )
    text = "<table>{}</table>".format(text)

    self.setText(text)
    self.adjustSize()
    self.update_geometry.emit()


# Traceback (ValueError)
16:39:44 DEBUG    init       app:_init_modules:468 Initializing websettings...
16:39:45 ERROR    misc       crashsignal:exception_hook:216 Uncaught exception
Traceback (most recent call last):
File "/bin/qutebrowser", line 11, in <module>
load_entry_point('qutebrowser==1.1.1', 'gui_scripts', 'qutebrowser')()
File "/usr/lib/python3.6/site-packages/qutebrowser/qutebrowser.py", line 188, in main
return app.run(args)
File "/usr/lib/python3.6/site-packages/qutebrowser/app.py", line 137, in run
init(args, crash_handler)
File "/usr/lib/python3.6/site-packages/qutebrowser/app.py", line 163, in init
_init_modules(args, crash_handler)
File "/usr/lib/python3.6/site-packages/qutebrowser/app.py", line 469, in _init_modules
websettings.init(args)
File "/usr/lib/python3.6/site-packages/qutebrowser/config/websettings.py", line 215, in init
webenginesettings.init(args)
File "/usr/lib/python3.6/site-packages/qutebrowser/browser/webengine/webenginesettings.py", line 297, in init
websettings.init_mappings(MAPPINGS)
File "/usr/lib/python3.6/site-packages/qutebrowser/config/websettings.py", line 198, in init_mappings
mapping.set(value)
File "/usr/lib/python3.6/site-packages/qutebrowser/config/websettings.py", line 72, in set
self._set(value, settings=settings)
File "/usr/lib/python3.6/site-packages/qutebrowser/browser/webengine/webenginesettings.py", line 154, in _set
filenames = [self._find_installed(code) for code in value]
File "/usr/lib/python3.6/site-packages/qutebrowser/browser/webengine/webenginesettings.py", line 154, in <listcomp>
filenames = [self._find_installed(code) for code in value]
File "/usr/lib/python3.6/site-packages/qutebrowser/browser/webengine/webenginesettings.py", line 143, in _find_installed
local_filename = spell.local_filename(code)
File "/usr/lib/python3.6/site-packages/qutebrowser/browser/webengine/spell.py", line 64, in local_filename
all_installed = local_files(code)
File "/usr/lib/python3.6/site-packages/qutebrowser/browser/webengine/spell.py", line 51, in local_files
for matching_dict in sorted(matching_dicts, key=version, reverse=True):
File "/usr/lib/python3.6/site-packages/qutebrowser/browser/webengine/spell.py", line 36, in version
.format(filename))
ValueError: the given dictionary file name is malformed: /usr/share/qt/qtwebengine_dictionaries/en-US.bdic

# Fixed code
def update_keyhint(self, modename, prefix):
    """Show hints for the given prefix (or hide if prefix is empty).

    Args:
        prefix: The current partial keystring.
    """
    countstr, prefix = re.fullmatch(r"(\d*)(.*)", prefix).groups()
    if not prefix:
        self._show_timer.stop()
        self.hide()
        return

    def blacklisted(keychain):
        return any(
            fnmatch.fnmatchcase(keychain, glob) for glob in config.val.keyhint.blacklist
        )

    def takes_count(cmdstr):
        """Return true iff this command can take a count argument."""
        cmdname = cmdstr.split(" ")[0]
        cmd = cmdutils.cmd_dict.get(cmdname)
        return cmd and cmd.takes_count()

    bindings_dict = config.key_instance.get_bindings_for(modename)
    bindings = [
        (k, v)
        for (k, v) in sorted(bindings_dict.items())
        if keyutils.KeySequence.parse(prefix).matches(k)
        and not blacklisted(str(k))
        and (takes_count(v) or not countstr)
    ]

    if not bindings:
        self._show_timer.stop()
        return

    # delay so a quickly typed keychain doesn't display hints
    self._show_timer.setInterval(config.val.keyhint.delay)
    self._show_timer.start()
    suffix_color = html.escape(config.val.colors.keyhint.suffix.fg)

    text = ""
    for seq, cmd in bindings:
        text += (
            "<tr>"
            "<td>{}</td>"
            "<td style='color: {}'>{}</td>"
            "<td style='padding-left: 2ex'>{}</td>"
            "</tr>"
        ).format(
            html.escape(prefix),
            suffix_color,
            html.escape(str(seq)[len(prefix) :]),
            html.escape(cmd),
        )
    text = "<table>{}</table>".format(text)

    self.setText(text)
    self.adjustSize()
    self.update_geometry.emit()