Detect if a key is bound to something in vim
Asked Answered
C

7

116

I'd like to know if there is a way to figure out if a key does something in vim. I know that I can use :map to see user-defined mappings, but is there something for the built-in stuff?

For example, I always had CTRL-W bound to close tab, because I thought that it was unused. After half a year, I found out that there are some sequences that use it, like CTRL-W CTRL-S to split the window, and it was a nightmare to retrain myself.

Conto answered 20/3, 2010 at 16:44 Comment(1)
Speaking of accidental collisions of user-defined mappings, it's really a good practice to use mapleaderUnworthy
D
98

If you check out the suggested answer by Randy Morris you will find that

:help index 

will give you the list you want.

Disjunctive answered 20/3, 2010 at 18:6 Comment(1)
very useful! good to know there's a place you can go look if you just want to poke around to learn something newHickok
T
56

To check the default mapping:

:help index

For other mapping that is done by either users or plugin:

:map
:map!

From http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-Tutorial(Part_1):

The first command displays the maps that work in normal, visual and select and operator pending mode. The second command displays the maps that work in insert and command-line mode.

Typically the output of the above commands will span several pages. You can use the following set of commands to redirect the output to the vim_maps.txt file:

:redir! > vim_maps.txt
:map
:map!
:redir END
Trunks answered 20/4, 2013 at 5:58 Comment(1)
Unless newer versions of Vim suddenly offers a better alternative, this seems to be the only way to search both included and custom keymaps. mapcheck (as mentioned in another answer) also only covers custom keybinds. The main difference between outputting to a text file and mapcheck is that outputting to a text file and/or using :help index lets you /C-w in Vim to find anything using C-wAirworthy
N
39

Not a complete answer, but you may want to check out :help map-which-keys for a list of keys that vim recommends you to use in your custom maps.

That help section has a recommendation of how to tell if a specific key is mapped to an action.

Netti answered 20/3, 2010 at 17:3 Comment(0)
C
23

I skimmed through :help index and made a list of some of the unused nmap keys:

  • Q (switch to "Ex" mode)
  • Z except ZZ, ZQ
  • \
  • <Space> (same as l in the normal mode; the largest and the most underutilized key in the normal mode)
  • gb, gc, gl, gx, gy, gz
  • gs (sleep)
  • zp, zq, zu, zy
  • cd, cm, co, cp, cq, cr, cs, cu, cx, cy
  • dc, dm, do, dp, dq, dr, ds, du, dx, dy
  • gA, gB, gC, gG, gK, gL, gM, gO, gS, gX, gY, gZ
  • zB, zI, zJ, zK, zP, zQ, zP, zS, zT, zU, zV, zY, zZ
  • ]a, ]b, ]e, ]g, ]h, ]j, ]k, ]l, ]n, ]o, ]q, ]r, ]t, ]u, ]v, ]w, ]x, ]y
  • [a, [b, [e, [g, [h, [j, [k, [l, [n, [o, [q, [r, [t, [u, [v, [w, [x, [y
  • CTRL-G, CTRL-K
  • CTRL-\ a - z (reserved for extensions)
  • CTRL-\ A - Z (not used)

Please update/comment.

Copious answered 6/2, 2016 at 17:44 Comment(1)
Ctrl-w is used by default for window operationsEpigram
R
19

Use :map! and :map for manually set keys and :help 'char(-combination)' to find out which keys are already mapped in vim out-of-the-box(/out of your specific compiling options). (Slightly off-topic but still regardable (I think): Use :scriptnames to see which files have been sourced in which order.)

Ronnaronnholm answered 18/1, 2011 at 10:23 Comment(1)
If you want to search for what keys trigger a certain command, you can do this: :redir keys.txt :map :redir end Then open keys.txt and search for what commands are bound.Mayo
A
15

You can use mapcheck.:-

For example, I wanted to map <CR> ,i to gg=G to indented a file. To check if there is a mapping already for <CR> , i

if mapcheck("\<CR>", "I") == "" |echo "no mapping"

...but this won't detect if the mapping is part of a sequence.

Antiquary answered 1/11, 2013 at 12:34 Comment(2)
I tried to check if "o" is bound to something in normal mode, with the following: if mapcheck("o", "N") == "" | echo "no mapping" but it reports "no mapping", when o is definitely bound to "open new line". Am I using it wrong?Conto
@K.Norbert: I believe this for user defined mappingsAntiquary
N
3

Only to complete this very old post, the following will print if and by what source a specific keybinding was set. In the event the mappings collided/overlapped, the verbose keyword will provide you the list of which sources set the binding. e.g., for <C-n>... in normal mode:

:verbose nmap <C-n>
Nonprofessional answered 5/7, 2023 at 14:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.