Custom Key Mappings Vim
Simple Example
I am picking a simple example from the vim help documentation itself so you can quickly understand what is going on. Suppose you want a quick way of inserting today’s date below your current cursor position. EG:
cursor was here| "Now hitting leader followed by 2 d keys will print the line below
Date: Tue Mar 17 16:11:47 IST 2015Here is the mapping you can define in your ~/.vimrc
map dd oDate: :read !datekJI will try to break down what the above key mapping does does in the steps below. Note Leader is mapped to ** by default. You can optionally change it to any other key. Spacebar** is a good option which can be achieved with the following mapping in my ~/.vimrc file
let mapleader = " "You can define custom mappings in ~/.vimrc so that they are permanent across your vim sessions. To define mappings for your current session you can type
:map dd oDate: :read !datekJwhich will save your mapping for the current session. If you define new mapping in your ~/.vimrc, you may need to run
source ~/.vimrcin your current shell for your new mappings to reflect.
Triggering our custom key mapping
In the above example we trigger our key mapping by typing dd in normal mode. Key mappings can be defined for different modes as listed below
:map Normal, Visual and Operator-pending
:vmap Visual
:nmap Normal
:omap Operator-pending (Eg: dw where d is operator character and w is motion character)
:map! Insert and Command-line
:imap Insert
:cmap Command-lineProviding commands
Once we trigger our custom key binding we ask it to perform some commands. In this case
oDate: :read !datekJThe break down
o -> Insert a line below current cursor position and switch to insert mode
Date -> Type the text "Date"
-> Bring us out of insert mode and into normal mode
: -> This character takes vim to the command line where you can execute commands
read -> Vim command to Insert output below the cursor(typically from a file) (:help :read)
!date -> ! is a way to execute a shell command in vim. eg: try !ls
-> This is like hitting enter. (:help key-notation)What the above commands does is print the following output below the current cursor position
cursor was here
2 Date:
Tue Mar 17 16:11:47 IST 2015Now the kJ do the following
k -> Move the cursor up by one line
J -> Join the lines togetherFinal output:
cursor was here
2 Date: Tue Mar 17 16:11:47 IST 2015Similar mapping in insert mode
You can get a similar shortcut in insert mode with the following mappings.
imap dd Date: :read !datekJASlight difference here
Date: -> Since already in insert mode type enter to go to next line and then type Date.
-> Bring us out of insert mode and read the date as beforeTo bring us back to insert mode we finish with A in the end. Note Based on feedback, I learnt that mapping in insert mode has a drawback. For example if you type
This is today's date dd
Date: Wed Mar 18 11:23:09 IST 2015This prints the date below. But if you hit undo u it deletes the entire text inxluding This is today’s date unless you switched to normal mode first. So good to remember that.
:map vs noremap
Based on some feedback, I learnt that there is a key difference between map and noremap noremap is an option that prevents mapping recursively. Consider these mappings
map a $
map T a
noremap M aHere typing a will take you to the end of the line. T will do the same. However M will behave as a and let you append from current cursor position. So it is always recommended to use non recursive versions of mappings to not get caught in unexpected recursive maps. So generally user
nnoremap, xnoremap, cnoremap, inoremap, etc.unless know you know what you are doing.
One more example
I often need to insert logging statements in my code for debugging purposes. The following mapping will help me easily do that, then get my cursor ready to start typing my debug statements.
noremap db ologging.debug("")hi
inoremap db logging.debug("")hiSo hitting
dbwill print
logging.debug("|")with my cursor ready to type between the debug quotes.
What keys can I map
Sometimes you have some plugins with your vim setup that already define a ton of mappings. You can use
:map
:noremapand
:imap
:inoremapto list all your command and insert mode mappings. Similarly you can list your other mode mappings with corresponding commands.
Caveats
Ensure you are not overlapping with existing mappings or existing vim commands so that your current functionality does not break. Example mapping my command to dd instead of dd would mess up my delete line functionality. Also ensure you have your key mappings in the mode that you want them in.
Further Reading
You can find more details about key mapping in vim documentation itself.
:help key-mappings
:help 40.1
:help map-overviewLet me know if you have any comments or suggestions in the comments below and of any cool ways you use custom key mappings. Hope you learnt something new today.
Simple Example
I am picking a simple example from the vim help documentation itself so you can quickly understand what is going on. Suppose you want a quick way of inserting today’s date below your current cursor position. EG:
cursor was here| "Now hitting leader followed by 2 d keys will print the line below
Date: Tue Mar 17 16:11:47 IST 2015Here is the mapping you can define in your ~/.vimrc
map dd oDate: :read !datekJI will try to break down what the above key mapping does does in the steps below. Note Leader is mapped to ** by default. You can optionally change it to any other key. Spacebar** is a good option which can be achieved with the following mapping in my ~/.vimrc file
let mapleader = " "You can define custom mappings in ~/.vimrc so that they are permanent across your vim sessions. To define mappings for your current session you can type
:map dd oDate: :read !datekJwhich will save your mapping for the current session. If you define new mapping in your ~/.vimrc, you may need to run
source ~/.vimrcin your current shell for your new mappings to reflect.
Triggering our custom key mapping
In the above example we trigger our key mapping by typing dd in normal mode. Key mappings can be defined for different modes as listed below
:map Normal, Visual and Operator-pending
:vmap Visual
:nmap Normal
:omap Operator-pending (Eg: dw where d is operator character and w is motion character)
:map! Insert and Command-line
:imap Insert
:cmap Command-lineProviding commands
Once we trigger our custom key binding we ask it to perform some commands. In this case
oDate: :read !datekJThe break down
o -> Insert a line below current cursor position and switch to insert mode
Date -> Type the text "Date"
-> Bring us out of insert mode and into normal mode
: -> This character takes vim to the command line where you can execute commands
read -> Vim command to Insert output below the cursor(typically from a file) (:help :read)
!date -> ! is a way to execute a shell command in vim. eg: try !ls
-> This is like hitting enter. (:help key-notation)What the above commands does is print the following output below the current cursor position
cursor was here
2 Date:
Tue Mar 17 16:11:47 IST 2015Now the kJ do the following
k -> Move the cursor up by one line
J -> Join the lines togetherFinal output:
cursor was here
2 Date: Tue Mar 17 16:11:47 IST 2015Similar mapping in insert mode
You can get a similar shortcut in insert mode with the following mappings.
imap dd Date: :read !datekJASlight difference here
Date: -> Since already in insert mode type enter to go to next line and then type Date.
-> Bring us out of insert mode and read the date as beforeTo bring us back to insert mode we finish with A in the end. Note Based on feedback, I learnt that mapping in insert mode has a drawback. For example if you type
This is today's date dd
Date: Wed Mar 18 11:23:09 IST 2015This prints the date below. But if you hit undo u it deletes the entire text inxluding This is today’s date unless you switched to normal mode first. So good to remember that.
:map vs noremap
Based on some feedback, I learnt that there is a key difference between map and noremap noremap is an option that prevents mapping recursively. Consider these mappings
map a $
map T a
noremap M aHere typing a will take you to the end of the line. T will do the same. However M will behave as a and let you append from current cursor position. So it is always recommended to use non recursive versions of mappings to not get caught in unexpected recursive maps. So generally user
nnoremap, xnoremap, cnoremap, inoremap, etc.unless know you know what you are doing.
One more example
I often need to insert logging statements in my code for debugging purposes. The following mapping will help me easily do that, then get my cursor ready to start typing my debug statements.
noremap db ologging.debug("")hi
inoremap db logging.debug("")hiSo hitting
dbwill print
logging.debug("|")with my cursor ready to type between the debug quotes.
What keys can I map
Sometimes you have some plugins with your vim setup that already define a ton of mappings. You can use
:map
:noremapand
:imap
:inoremapto list all your command and insert mode mappings. Similarly you can list your other mode mappings with corresponding commands.
Caveats
Ensure you are not overlapping with existing mappings or existing vim commands so that your current functionality does not break. Example mapping my command to dd instead of dd would mess up my delete line functionality. Also ensure you have your key mappings in the mode that you want them in.
Further Reading
You can find more details about key mapping in vim documentation itself.
:help key-mappings
:help 40.1
:help map-overviewLet me know if you have any comments or suggestions in the comments below and of any cool ways you use custom key mappings. Hope you learnt something new today.
Simple Example
I am picking a simple example from the vim help documentation itself so you can quickly understand what is going on. Suppose you want a quick way of inserting today’s date below your current cursor position. EG:
cursor was here| "Now hitting leader followed by 2 d keys will print the line below
Date: Tue Mar 17 16:11:47 IST 2015Here is the mapping you can define in your ~/.vimrc
map dd oDate: :read !datekJI will try to break down what the above key mapping does does in the steps below. Note Leader is mapped to ** by default. You can optionally change it to any other key. Spacebar** is a good option which can be achieved with the following mapping in my ~/.vimrc file
let mapleader = " "You can define custom mappings in ~/.vimrc so that they are permanent across your vim sessions. To define mappings for your current session you can type
:map dd oDate: :read !datekJwhich will save your mapping for the current session. If you define new mapping in your ~/.vimrc, you may need to run
source ~/.vimrcin your current shell for your new mappings to reflect.
Triggering our custom key mapping
In the above example we trigger our key mapping by typing dd in normal mode. Key mappings can be defined for different modes as listed below
:map Normal, Visual and Operator-pending
:vmap Visual
:nmap Normal
:omap Operator-pending (Eg: dw where d is operator character and w is motion character)
:map! Insert and Command-line
:imap Insert
:cmap Command-lineProviding commands
Once we trigger our custom key binding we ask it to perform some commands. In this case
oDate: :read !datekJThe break down
o -> Insert a line below current cursor position and switch to insert mode
Date -> Type the text "Date"
-> Bring us out of insert mode and into normal mode
: -> This character takes vim to the command line where you can execute commands
read -> Vim command to Insert output below the cursor(typically from a file) (:help :read)
!date -> ! is a way to execute a shell command in vim. eg: try !ls
-> This is like hitting enter. (:help key-notation)What the above commands does is print the following output below the current cursor position
cursor was here
2 Date:
Tue Mar 17 16:11:47 IST 2015Now the kJ do the following
k -> Move the cursor up by one line
J -> Join the lines togetherFinal output:
cursor was here
2 Date: Tue Mar 17 16:11:47 IST 2015Similar mapping in insert mode
You can get a similar shortcut in insert mode with the following mappings.
imap dd Date: :read !datekJASlight difference here
Date: -> Since already in insert mode type enter to go to next line and then type Date.
-> Bring us out of insert mode and read the date as beforeTo bring us back to insert mode we finish with A in the end. Note Based on feedback, I learnt that mapping in insert mode has a drawback. For example if you type
This is today's date dd
Date: Wed Mar 18 11:23:09 IST 2015This prints the date below. But if you hit undo u it deletes the entire text inxluding This is today’s date unless you switched to normal mode first. So good to remember that.
:map vs noremap
Based on some feedback, I learnt that there is a key difference between map and noremap noremap is an option that prevents mapping recursively. Consider these mappings
map a $
map T a
noremap M aHere typing a will take you to the end of the line. T will do the same. However M will behave as a and let you append from current cursor position. So it is always recommended to use non recursive versions of mappings to not get caught in unexpected recursive maps. So generally user
nnoremap, xnoremap, cnoremap, inoremap, etc.unless know you know what you are doing.
One more example
I often need to insert logging statements in my code for debugging purposes. The following mapping will help me easily do that, then get my cursor ready to start typing my debug statements.
noremap db ologging.debug("")hi
inoremap db logging.debug("")hiSo hitting
dbwill print
logging.debug("|")with my cursor ready to type between the debug quotes.
What keys can I map
Sometimes you have some plugins with your vim setup that already define a ton of mappings. You can use
:map
:noremapand
:imap
:inoremapto list all your command and insert mode mappings. Similarly you can list your other mode mappings with corresponding commands.
Caveats
Ensure you are not overlapping with existing mappings or existing vim commands so that your current functionality does not break. Example mapping my command to dd instead of dd would mess up my delete line functionality. Also ensure you have your key mappings in the mode that you want them in.
Further Reading
You can find more details about key mapping in vim documentation itself.
:help key-mappings
:help 40.1
:help map-overviewLet me know if you have any comments or suggestions in the comments below and of any cool ways you use custom key mappings. Hope you learnt something new today.
Simple Example
I am picking a simple example from the vim help documentation itself so you can quickly understand what is going on. Suppose you want a quick way of inserting today’s date below your current cursor position. EG:
cursor was here| "Now hitting leader followed by 2 d keys will print the line below
Date: Tue Mar 17 16:11:47 IST 2015Here is the mapping you can define in your ~/.vimrc
map dd oDate: :read !datekJI will try to break down what the above key mapping does does in the steps below. Note Leader is mapped to ** by default. You can optionally change it to any other key. Spacebar** is a good option which can be achieved with the following mapping in my ~/.vimrc file
let mapleader = " "You can define custom mappings in ~/.vimrc so that they are permanent across your vim sessions. To define mappings for your current session you can type
:map dd oDate: :read !datekJwhich will save your mapping for the current session. If you define new mapping in your ~/.vimrc, you may need to run
source ~/.vimrcin your current shell for your new mappings to reflect.
Triggering our custom key mapping
In the above example we trigger our key mapping by typing dd in normal mode. Key mappings can be defined for different modes as listed below
:map Normal, Visual and Operator-pending
:vmap Visual
:nmap Normal
:omap Operator-pending (Eg: dw where d is operator character and w is motion character)
:map! Insert and Command-line
:imap Insert
:cmap Command-lineProviding commands
Once we trigger our custom key binding we ask it to perform some commands. In this case
oDate: :read !datekJThe break down
o -> Insert a line below current cursor position and switch to insert mode
Date -> Type the text "Date"
-> Bring us out of insert mode and into normal mode
: -> This character takes vim to the command line where you can execute commands
read -> Vim command to Insert output below the cursor(typically from a file) (:help :read)
!date -> ! is a way to execute a shell command in vim. eg: try !ls
-> This is like hitting enter. (:help key-notation)What the above commands does is print the following output below the current cursor position
cursor was here
2 Date:
Tue Mar 17 16:11:47 IST 2015Now the kJ do the following
k -> Move the cursor up by one line
J -> Join the lines togetherFinal output:
cursor was here
2 Date: Tue Mar 17 16:11:47 IST 2015Similar mapping in insert mode
You can get a similar shortcut in insert mode with the following mappings.
imap dd Date: :read !datekJASlight difference here
Date: -> Since already in insert mode type enter to go to next line and then type Date.
-> Bring us out of insert mode and read the date as beforeTo bring us back to insert mode we finish with A in the end. Note Based on feedback, I learnt that mapping in insert mode has a drawback. For example if you type
This is today's date dd
Date: Wed Mar 18 11:23:09 IST 2015This prints the date below. But if you hit undo u it deletes the entire text inxluding This is today’s date unless you switched to normal mode first. So good to remember that.
:map vs noremap
Based on some feedback, I learnt that there is a key difference between map and noremap noremap is an option that prevents mapping recursively. Consider these mappings
map a $
map T a
noremap M aHere typing a will take you to the end of the line. T will do the same. However M will behave as a and let you append from current cursor position. So it is always recommended to use non recursive versions of mappings to not get caught in unexpected recursive maps. So generally user
nnoremap, xnoremap, cnoremap, inoremap, etc.unless know you know what you are doing.
One more example
I often need to insert logging statements in my code for debugging purposes. The following mapping will help me easily do that, then get my cursor ready to start typing my debug statements.
noremap db ologging.debug("")hi
inoremap db logging.debug("")hiSo hitting
dbwill print
logging.debug("|")with my cursor ready to type between the debug quotes.
What keys can I map
Sometimes you have some plugins with your vim setup that already define a ton of mappings. You can use
:map
:noremapand
:imap
:inoremapto list all your command and insert mode mappings. Similarly you can list your other mode mappings with corresponding commands.
Caveats
Ensure you are not overlapping with existing mappings or existing vim commands so that your current functionality does not break. Example mapping my command to dd instead of dd would mess up my delete line functionality. Also ensure you have your key mappings in the mode that you want them in.
Further Reading
You can find more details about key mapping in vim documentation itself.
:help key-mappings
:help 40.1
:help map-overviewLet me know if you have any comments or suggestions in the comments below and of any cool ways you use custom key mappings. Hope you learnt something new today.
Simple Example
I am picking a simple example from the vim help documentation itself so you can quickly understand what is going on. Suppose you want a quick way of inserting today’s date below your current cursor position. EG:
cursor was here| "Now hitting leader followed by 2 d keys will print the line below
Date: Tue Mar 17 16:11:47 IST 2015Here is the mapping you can define in your ~/.vimrc
map dd oDate: :read !datekJI will try to break down what the above key mapping does does in the steps below. Note Leader is mapped to ** by default. You can optionally change it to any other key. Spacebar** is a good option which can be achieved with the following mapping in my ~/.vimrc file
let mapleader = " "You can define custom mappings in ~/.vimrc so that they are permanent across your vim sessions. To define mappings for your current session you can type
:map dd oDate: :read !datekJwhich will save your mapping for the current session. If you define new mapping in your ~/.vimrc, you may need to run
source ~/.vimrcin your current shell for your new mappings to reflect.
Simple Example
I am picking a simple example from the vim help documentation itself so you can quickly understand what is going on. Suppose you want a quick way of inserting today’s date below your current cursor position. EG:
cursor was here| "Now hitting leader followed by 2 d keys will print the line below
Date: Tue Mar 17 16:11:47 IST 2015Here is the mapping you can define in your ~/.vimrc
map dd oDate: :read !datekJI will try to break down what the above key mapping does does in the steps below. Note Leader is mapped to ** by default. You can optionally change it to any other key. Spacebar** is a good option which can be achieved with the following mapping in my ~/.vimrc file
let mapleader = " "You can define custom mappings in ~/.vimrc so that they are permanent across your vim sessions. To define mappings for your current session you can type
:map dd oDate: :read !datekJwhich will save your mapping for the current session. If you define new mapping in your ~/.vimrc, you may need to run
source ~/.vimrcin your current shell for your new mappings to reflect.
Simple Example
Triggering our custom key mapping
In the above example we trigger our key mapping by typing dd in normal mode. Key mappings can be defined for different modes as listed below
:map Normal, Visual and Operator-pending
:vmap Visual
:nmap Normal
:omap Operator-pending (Eg: dw where d is operator character and w is motion character)
:map! Insert and Command-line
:imap Insert
:cmap Command-lineTriggering our custom key mapping
In the above example we trigger our key mapping by typing dd in normal mode. Key mappings can be defined for different modes as listed below
:map Normal, Visual and Operator-pending
:vmap Visual
:nmap Normal
:omap Operator-pending (Eg: dw where d is operator character and w is motion character)
:map! Insert and Command-line
:imap Insert
:cmap Command-lineTriggering our custom key mapping
Providing commands
Once we trigger our custom key binding we ask it to perform some commands. In this case
oDate: :read !datekJThe break down
o -> Insert a line below current cursor position and switch to insert mode
Date -> Type the text "Date"
-> Bring us out of insert mode and into normal mode
: -> This character takes vim to the command line where you can execute commands
read -> Vim command to Insert output below the cursor(typically from a file) (:help :read)
!date -> ! is a way to execute a shell command in vim. eg: try !ls
-> This is like hitting enter. (:help key-notation)What the above commands does is print the following output below the current cursor position
cursor was here
2 Date:
Tue Mar 17 16:11:47 IST 2015Now the kJ do the following
k -> Move the cursor up by one line
J -> Join the lines togetherFinal output:
cursor was here
2 Date: Tue Mar 17 16:11:47 IST 2015Providing commands
Once we trigger our custom key binding we ask it to perform some commands. In this case
oDate: :read !datekJThe break down
o -> Insert a line below current cursor position and switch to insert mode
Date -> Type the text "Date"
-> Bring us out of insert mode and into normal mode
: -> This character takes vim to the command line where you can execute commands
read -> Vim command to Insert output below the cursor(typically from a file) (:help :read)
!date -> ! is a way to execute a shell command in vim. eg: try !ls
-> This is like hitting enter. (:help key-notation)What the above commands does is print the following output below the current cursor position
cursor was here
2 Date:
Tue Mar 17 16:11:47 IST 2015Now the kJ do the following
k -> Move the cursor up by one line
J -> Join the lines togetherFinal output:
cursor was here
2 Date: Tue Mar 17 16:11:47 IST 2015Providing commands
Similar mapping in insert mode
You can get a similar shortcut in insert mode with the following mappings.
imap dd Date: :read !datekJASlight difference here
Date: -> Since already in insert mode type enter to go to next line and then type Date.
-> Bring us out of insert mode and read the date as beforeTo bring us back to insert mode we finish with A in the end. Note Based on feedback, I learnt that mapping in insert mode has a drawback. For example if you type
This is today's date dd
Date: Wed Mar 18 11:23:09 IST 2015This prints the date below. But if you hit undo u it deletes the entire text inxluding This is today’s date unless you switched to normal mode first. So good to remember that.
Similar mapping in insert mode
You can get a similar shortcut in insert mode with the following mappings.
imap dd Date: :read !datekJASlight difference here
Date: -> Since already in insert mode type enter to go to next line and then type Date.
-> Bring us out of insert mode and read the date as beforeTo bring us back to insert mode we finish with A in the end. Note Based on feedback, I learnt that mapping in insert mode has a drawback. For example if you type
This is today's date dd
Date: Wed Mar 18 11:23:09 IST 2015This prints the date below. But if you hit undo u it deletes the entire text inxluding This is today’s date unless you switched to normal mode first. So good to remember that.
Similar mapping in insert mode
:map vs noremap
Based on some feedback, I learnt that there is a key difference between map and noremap noremap is an option that prevents mapping recursively. Consider these mappings
map a $
map T a
noremap M aHere typing a will take you to the end of the line. T will do the same. However M will behave as a and let you append from current cursor position. So it is always recommended to use non recursive versions of mappings to not get caught in unexpected recursive maps. So generally user
nnoremap, xnoremap, cnoremap, inoremap, etc.unless know you know what you are doing.
:map vs noremap
Based on some feedback, I learnt that there is a key difference between map and noremap noremap is an option that prevents mapping recursively. Consider these mappings
map a $
map T a
noremap M aHere typing a will take you to the end of the line. T will do the same. However M will behave as a and let you append from current cursor position. So it is always recommended to use non recursive versions of mappings to not get caught in unexpected recursive maps. So generally user
nnoremap, xnoremap, cnoremap, inoremap, etc.unless know you know what you are doing.
:map vs noremap
One more example
I often need to insert logging statements in my code for debugging purposes. The following mapping will help me easily do that, then get my cursor ready to start typing my debug statements.
noremap db ologging.debug("")hi
inoremap db logging.debug("")hiSo hitting
dbwill print
logging.debug("|")with my cursor ready to type between the debug quotes.
One more example
I often need to insert logging statements in my code for debugging purposes. The following mapping will help me easily do that, then get my cursor ready to start typing my debug statements.
noremap db ologging.debug("")hi
inoremap db logging.debug("")hiSo hitting
dbwill print
logging.debug("|")with my cursor ready to type between the debug quotes.
One more example
What keys can I map
Sometimes you have some plugins with your vim setup that already define a ton of mappings. You can use
:map
:noremapand
:imap
:inoremapto list all your command and insert mode mappings. Similarly you can list your other mode mappings with corresponding commands.
What keys can I map
Sometimes you have some plugins with your vim setup that already define a ton of mappings. You can use
:map
:noremapand
:imap
:inoremapto list all your command and insert mode mappings. Similarly you can list your other mode mappings with corresponding commands.
What keys can I map
Caveats
Ensure you are not overlapping with existing mappings or existing vim commands so that your current functionality does not break. Example mapping my command to dd instead of dd would mess up my delete line functionality. Also ensure you have your key mappings in the mode that you want them in.
Caveats
Ensure you are not overlapping with existing mappings or existing vim commands so that your current functionality does not break. Example mapping my command to dd instead of dd would mess up my delete line functionality. Also ensure you have your key mappings in the mode that you want them in.
Caveats
Further Reading
You can find more details about key mapping in vim documentation itself.
:help key-mappings
:help 40.1
:help map-overviewLet me know if you have any comments or suggestions in the comments below and of any cool ways you use custom key mappings. Hope you learnt something new today.
Further Reading
You can find more details about key mapping in vim documentation itself.
:help key-mappings
:help 40.1
:help map-overviewLet me know if you have any comments or suggestions in the comments below and of any cool ways you use custom key mappings. Hope you learnt something new today.