             "`#{compactSelector(selector)}` <kbd>#{compactKeystrokes(keystrokes)}</kbd>"
           .join("<br/>")
 
-        # keystrokes<kbd>#{keystrokes}</kbd>"
-
         {name, commandName, kind, description, keymap}
     )
     commands


  generateCommandSummaryTable: ->
    header = """
    # Description

    - `!i`: :not(.insert-mode)
    - `i`: insert-mode
    - `o`: operator-pending-mode
    - `n`: normal-mode
    - `v`: visual-mode
    - `vB`: visual-mode.blockwise
    - `vL`: visual-mode.linewise
    - `vC`: visual-mode.characterwise
    - `iR`: insert-mode.replace

    """
    @generateSummaryTableForCommandSpecs(@getCommandSpecs(), {header})

    settings.set('debug', not settings.get('debug'))
    console.log "#{settings.scope} debug:", settings.get('debug')

  # Borrowed from underscore-plus
  modifierKeyMap =
    cmd: '\u2318'
    "ctrl-": '\u2303'
    alt: '\u2325'
    option: '\u2325'
    enter: '\u23ce'
    left: '\u2190'
    right: '\u2192'
    up: '\u2191'
    down: '\u2193'
    backspace: 'BS'
    space: 'SPC'

  # [NOTE] Order is important. I depend on chrome's "keep object order".
  selectorMap =
    "atom-text-editor.vim-mode-plus": ''
    ".operator-pending-mode": 'o'
    ".visual-mode.characterwise": 'vC'
    ".visual-mode.blockwise": 'vB'
    ".visual-mode.linewise": 'vL'
    ".visual-mode": 'v'
    ".insert-mode.replace": 'iR'
    ".insert-mode": 'i'
    ".normal-mode": 'n'
    ".with-count": '#'

  getCommandSpecs: ->
    compactSelector = (selector) ->
      pattern = ///(#{_.keys(selectorMap).map(_.escapeRegExp).join('|')})///g
      selector.split(/,\s*/g).map (scope) ->
        scope
          .replace(/:not\((.*)\)/, '!$1')
          .replace(pattern, (s) -> selectorMap[s])
      .join(",")

    compactKeystrokes = (keystrokes) ->
      pattern = ///(#{_.keys(modifierKeyMap).map(_.escapeRegExp).join('|')})///
      keystrokes
        .replace(/(`|_)/g, '\\$1')
        .replace(pattern, (s) -> modifierKeyMap[s])
        .replace(/\s+/, '')

    commands = (
