Keymap options

August 3, 2026 · View on GitHub

⚠️ Keymap action names and default bindings may have breaking changes between releases.

Concord reads key settings from the [keymap] section in keymap.toml.

Example keymap.toml:

[keymap]
StartComposer = { keys = ["c"] }
ClosePopup = "q"
OpenDebugLog = "`"
ReplyMessage = "<leader>mr"
VoiceDeafen = "<leader>vd"
VoiceMute = "<leader>vm"
ToggleStream = "<leader>vs"
VoiceLeave = "<leader>vl"

[keymap.groups]
"<leader>v" = "Voice"

[keymap.guild_actions]
LeaveServer = { keys = ["l"], description = "leave server" }

[keymap.channel_actions]
ToggleMute = { keys = ["x"], description = "mute channel" }
ToggleStream = { keys = ["s"], description = "toggle screen share" }
WatchStream = { keys = ["w"], description = "watch stream" }
VoiceParticipantAudio = { keys = ["v"], description = "participant audio" }

[keymap.message_actions]
OpenThread = { keys = ["t"], description = "open thread" }
GoToReferencedMessage = "g"

[keymap.notification_inbox_actions]
MarkRead = "r"
MarkAllRead = "a"

[keymap.composer]
OpenEditor = "<C-o>"
DeletePreviousWord = "<A-backspace>"

There are several kinds of keymap settings:

Config pathWhat it controls
[keymap] leaderThe key that opens the leader key hint. Defaults to Space.
[keymap] <ActionName>Directly assignable UI actions such as StartComposer, ClosePopup, ReplyMessage, and OpenThread.
[keymap.groups]Optional titles for key sequence hints, such as naming <leader>v as Voice.
[keymap.guild_actions], [keymap.channel_actions], [keymap.message_actions], [keymap.member_actions], [keymap.thread_actions], [keymap.notification_inbox_actions]Shortcuts used inside focused-pane action menus and the notification inbox.
[keymap.composer]Shortcuts used while the message composer is open, such as editor and cursor commands.

[keymap] action values can be either a string or an object with keys and an optional description:

[keymap]
StartComposer = "<leader>e"
ChannelSwitcher = { keys = ["<C-w>f", "<leader><C-w>"], description = "find channel" }

keys accepts one sequence or a list of sequences. Modifier chords use Vim-style angle syntax, such as <C-f>, <S-tab>, and <A-backspace>. Leader sequences like <leader><C-w>, compact plain sequences like fd, and general multi-key prefixes like <C-w>f are supported. Prefix sequences show a which-key.nvim style hint. For example, fd opens an f hint after f, then runs the action after d.

Set an action to false or an empty string to disable that shortcut and remove its default binding:

[keymap]
CopyMessage = false # or ""

[keymap.message_actions]
CopyMessage = ""

Scoped action tables use the same string or object shape, but each keys entry must be a single key chord. Multi-key sequences such as gt are only supported by direct [keymap] actions, not by [keymap.guild_actions], [keymap.channel_actions], [keymap.message_actions], [keymap.member_actions], [keymap.thread_actions], or [keymap.notification_inbox_actions].

[keymap.channel_actions]
ToggleMute = { keys = ["u", "<C-u>"], description = "mute channel" }

[keymap.message_actions]
GoToReferencedMessage = { keys = ["g"], description = "go to referenced message" }

Composer action values under [keymap.composer] use the same string or object shape, but each keys entry must be one key chord because composer commands run immediately while text is being typed:

[keymap.composer]
OpenEditor = { keys = ["<C-o>"], description = "open editor" }
DeletePreviousWord = "<A-backspace>"

Direct [keymap] actions and leader cannot use reserved keys: Enter, Esc, Backspace, Delete, Ctrl+c, Ctrl+n, or Ctrl+p. Invalid, reserved, or conflicting bindings are ignored for that action. [keymap.composer] is separate and can remap those editing keys. With a key sequence hint open, the first bare Esc cancels the sequence and keeps the underlying popup open. Otherwise, Esc closes or cancels the active popup. Ctrl+n and Ctrl+p always move row selection down and up.

Directly assignable actions

These action names can be assigned directly under [keymap]. Defaults that start with <leader> are shown without the leading Space in the leader hint. OpenDisplayOptions, OpenComposerOptions, OpenNotificationOptions, and OpenVoiceOptions have contextual defaults inside the Options popup, so assign your own full sequence if you want direct keys for them.

Navigation and app actions:

Action nameDefault configAction
StartComposer"i"Start the message composer, or open the forum/media post composer overlay.
OpenPaneFilter"/"Open the focused pane filter or search.
ClosePopup"q"Close the active popup.
OpenDebugLog"`"Open the Debug Log popup from the dashboard.
FocusGuildPane"1"Show and focus the Servers pane.
FocusChannelPane"2"Show and focus the Channels pane.
FocusMessagePane"3"Focus the Messages pane.
FocusMemberPane"4"Show and focus the Members pane.
SelectNext"j"Move selection down in navigation lists.
SelectPrevious"k"Move selection up in navigation lists.
CycleFocusNext["tab", "l", "right"]Cycle focus forward.
CycleFocusPrevious["<S-tab>", "h", "left"]Cycle focus backward.
HalfPageDown"<C-d>"Half-page down.
HalfPageUp"<C-u>"Half-page up.
ScrollViewportDown"J"Scroll the focused pane viewport down.
ScrollViewportUp"K"Scroll the focused pane viewport up.
JumpTop"gg"Jump to the top.
JumpBottom"G"Jump to the bottom.
ScrollHorizontalLeft"H"Scroll left.
ScrollHorizontalRight"L"Scroll right.
ResizePaneLeft["<A-h>", "<A-left>"]Shrink the focused pane width.
ResizePaneRight["<A-l>", "<A-right>"]Grow the focused pane width.
Quit"q"Quit Concord.

These configured navigation actions also work while a modal popup owns input:

ActionsValid popup contexts
SelectNext, SelectPreviousLists, scrollable documents, and confirmations
HalfPageDown, HalfPageUpLists and scrollable documents
JumpTop, JumpBottomSelectable lists

Popup-local fixed shortcuts run first. ClosePopup is then matched directly as a single key instead of being treated as a popup navigation sequence. For example, ClosePopup = "g" closes a popup immediately while dashboard g g continues to mean JumpTop. Unmodified printable keys remain text while a search, filter, or editor owns input. Use Esc or a modified/non-character ClosePopup binding to close those input modes.

Once a navigation sequence hint is open, its next key wins so the displayed continuation is always truthful. Physical PageUp and PageDown, plus configured modified or non-character half-page keys, remain available where a text popup supports paging. OpenDebugLog is a dashboard action and is not part of popup navigation.

Message actions:

Action nameDefault configAction
CopyMessage"y"Copy selected message content.
ReactMessage"r"Add or remove a reaction.
ReplyMessage"R"Start a reply.
DeleteMessage"d"Open delete confirmation.
EditMessage"e"Start editing the selected message.
OpenMessageUrl"o"Open the selected message URL.
RemoveMessageEmbedsnoneRemove embeds from the selected message.
PlayMedia"x"Play selected video media in an external player.
ViewMessageAttachment"v"Open the selected message attachment viewer.
GoToReferencedMessagenoneGo to the replied or forwarded message.
ShowMessageProfilenoneOpen the selected message author's profile.
PinMessagenoneOpen pin or unpin confirmation.
OpenThreadnoneOpen the selected message's thread.
ShowReactionUsersnoneShow users who reacted to the selected message.
OpenPollVotePickernoneChoose poll votes for the selected message.

Pane, options, and voice actions:

Action nameDefault configAction
ToggleGuildPane"<leader>1"Toggle the Servers pane.
ToggleChannelPane"<leader>2"Toggle the Channels pane.
ToggleMemberPane"<leader>4"Toggle the Members pane.
OpenFocusedPaneAction"<leader>a"Open actions for the currently focused pane.
OpenCurrentUserProfile"<leader>p"Open your profile settings popup.
OpenOptions"<leader>o"Open the options category picker.
ChannelSwitcher"<leader><leader>"Open channel switcher.
OpenNotificationInbox"<leader>n"Open the notification inbox.
OpenDisplayOptionsContextual d after OpenOptionsOpen Display options.
OpenComposerOptionsContextual c after OpenOptionsOpen Composer options.
OpenNotificationOptionsContextual n after OpenOptionsOpen Notification options.
OpenVoiceOptionsContextual v after OpenOptionsOpen Voice options.
VoiceDeafen"<leader>vd"Toggle voice deafen.
VoiceMute"<leader>vm"Toggle voice mute.
ToggleStream"<leader>vs"Start or stop screen sharing.
VoiceLeave"<leader>vl"Leave the current Concord voice channel.

Profile popup shortcuts are fixed once OpenCurrentUserProfile opens your profile settings popup:

ShortcutAction
osign out, delete saved credentials.

Notification inbox actions

The notification inbox uses the single-key bindings from CycleFocusPrevious and CycleFocusNext to switch between Unreads and Mentions.

[keymap.notification_inbox_actions]
MarkRead = "r"
MarkAllRead = "a"
Scoped actionDefaultAction
MarkReadrMark the selected inbox item as read.
MarkAllReadaMark all items in the Unreads tab as read.

Composer actions

These action names can be assigned under [keymap.composer]. Configured keys replace that action's defaults. Any printable single character can be configured, but that key will run the composer action instead of inserting text.

These shortcuts also apply inside the forum/media post composer overlay for shared actions such as paste, submit, close, clear, attachment removal, and cursor movement while editing a field. In the overlay, Tab and Shift+Tab move between title, body, attachments, and tags. Enter starts or finishes editing title/body, removes the selected attachment while choosing attachments, or toggles the selected tag. Paste files or images while editing the body to add attachments. Press s outside edit mode to create the post.

Composer actionDefault configAction
OpenEditor"<C-e>"Open the current draft in $EDITOR.
PasteClipboard"<C-v>"Request clipboard paste.
InsertNewline["<C-j>", "<S-enter>", "<C-enter>", "<A-enter>"]Insert a newline.
Submit"enter"Submit the composer.
Close"esc"Close the composer.
ClearInput"<C-c>"Clear the composer input.
RemoveLastAttachment"delete"Remove the last pending attachment.
DeletePreviousChar"backspace"Delete the previous character.
DeletePreviousWord["<A-backspace>", "<C-backspace>", "<C-w>"]Delete the word before the cursor.
DeleteToLineStart"<C-u>"Delete to the start of the current line.
DeleteToLineEnd"<C-k>"Delete to the end of the current line.
MoveCursorUp"up"Move the cursor up.
MoveCursorDown"down"Move the cursor down.
MoveCursorWordLeft"<C-left>"Move the cursor one word left.
MoveCursorLeft"left"Move the cursor left.
MoveCursorWordRight"<C-right>"Move the cursor one word right.
MoveCursorRight"right"Move the cursor right.
MoveCursorHome"home"Move the cursor to the start.
MoveCursorEnd"end"Move the cursor to the end.
ToggleReplyPing"<A-p>"Toggle whether replies ping the author.

Focused pane actions

OpenFocusedPaneAction opens the action menu for the pane that currently has focus. Server, channel, message, and member pane actions can be configured in scoped tables. Focused-pane action menus keep their actions visible, and actions that do not apply to the current selection are shown dimmed and disabled.

Server pane actions:

[keymap.guild_actions]
MarkAsRead = { keys = ["m"], description = "mark server as read" }
ToggleMute = { keys = ["u"], description = "mute server" }
LeaveServer = { keys = ["l"], description = "leave server" }
FolderSettings = { keys = ["r"], description = "folder settings" }
Scoped actionDefaultAction
MarkAsReadmMark all unread viewable channels in the selected server read.
ToggleMuteuMute or unmute the selected server.
LeaveServerlOpen confirmation to leave the selected server.
FolderSettingsrEdit the selected server folder name and color.

Channel pane actions:

[keymap.channel_actions]
JoinVoice = { keys = ["e"], description = "join voice" }
LeaveVoice = { keys = ["l"], description = "leave voice" }
ToggleStream = { keys = ["s"], description = "toggle screen share" }
WatchStream = { keys = ["w"], description = "watch stream" }
VoiceParticipantAudio = { keys = ["a"], description = "participant audio" }
ShowPinnedMessages = { keys = ["p"], description = "show pinned messages" }
ShowThreads = { keys = ["t"], description = "show threads" }
MarkAsRead = { keys = ["m"], description = "mark as read" }
ToggleMute = { keys = ["u"], description = "mute channel" }
Scoped actionDefaultAction
JoinVoiceeJoin the selected voice channel.
LeaveVoicelLeave the current Concord voice channel.
ToggleStreamsChoose a source to start sharing, or stop the current broadcast.
WatchStreamwWatch the selected participant's Go Live stream in mpv.
VoiceParticipantAudioaOpen local volume and mute controls for the selected voice participant.
ShowPinnedMessagespOpen the selected channel's pinned messages.
ShowThreadstList threads for the selected channel.
MarkAsReadmMark the selected channel read.
ToggleMuteuMute or unmute the selected channel or category.

Member pane actions:

[keymap.member_actions]
ShowProfile = { keys = ["p"], description = "show profile" }
Scoped actionDefaultAction
ShowProfilepOpen the selected member's profile.

Message pane actions:

[keymap.message_actions]
CopyMessage = "y"
ReactMessage = "r"
ReplyMessage = "R"
DeleteMessage = "d"
EditMessage = "e"
OpenMessageUrl = "o"
RemoveMessageEmbeds = "D"
PlayMedia = "x"
ViewMessageAttachment = "v"
GoToReferencedMessage = "g"
ShowMessageProfile = "p"
PinMessage = "P"
OpenThread = "t"
ShowReactionUsers = "u"
OpenPollVotePicker = "c"
Scoped actionDefaultAction
CopyMessageyCopy selected message content.
ReactMessagerAdd or remove a reaction.
ReplyMessageRStart a reply.
DeleteMessagedOpen delete confirmation.
EditMessageeStart editing the selected message.
OpenMessageUrloOpen the selected message URL.
RemoveMessageEmbedsDRemove embeds from the selected message.
PlayMediaxPlay selected video media in an external player.
ViewMessageAttachmentvOpen the selected message attachment viewer.
GoToReferencedMessagegGo to the replied or forwarded message.
ShowMessageProfilepOpen the selected message author's profile.
PinMessagePOpen pin or unpin confirmation.
OpenThreadtOpen the selected message's thread.
ShowReactionUsersuShow users who reacted to the selected message.
OpenPollVotePickercChoose poll votes for the selected message.

Direct [keymap] message action bindings are separate. For example, GoToReferencedMessage = "gd" under [keymap] makes gd work directly from the Messages pane, while [keymap.message_actions] GoToReferencedMessage = "g" controls the action menu shortcut.

Thread and post actions:

The thread action menu opens for a focused thread in the Channels pane or a forum post selected in the thread/post list. Pin only appears for forum posts.

[keymap.thread_actions]
MarkAsRead = "m"
ToggleFollow = "f"
Close = "c"
Lock = "l"
Edit = "e"
CopyLink = "y"
ToggleMute = "u"
NotificationSettings = "n"
Pin = "P"
Delete = "d"
CopyId = "i"
Scoped actionDefaultAction
MarkAsReadmMark the thread or post read.
ToggleFollowfFollow or unfollow the thread or post.
ClosecClose or reopen the thread or post. Needs author or moderator.
LocklLock or unlock the thread or post. Moderator only.
EditeEdit title, tags, slow mode, and auto-archive.
CopyLinkyCopy a link to the thread or post.
ToggleMuteuMute or unmute the thread or post. Needs following first.
NotificationSettingsnChoose the notification level for the thread or post.
PinPPin or unpin the post. Forum posts only, moderator only.
DeletedDelete the whole thread or post. Moderator only.
CopyIdiCopy the thread or post ID.

Scoped action description changes the label shown in server, channel, message, member, and thread action menus. Multiple configured keys work as aliases when they are unique in the current action menu, and the popup shows them together, such as [x/u]. If two actions in the same menu use the same configured key, that key is ignored for both actions. If an action has no unique configured key, it falls back to 1 through 9, then 0.