I tried to remap my split navigation like explained here. Moving to the top or right split works but ther other two just do nothing. I tried the same without a .vimrc which led to the same result. Later i tried the same in GVim where all of them worked so i guessed it has something to do with vim running in the terminal. Then i figured out that pressing in my terminal doesn't act like backspace as it should.
What can i do to fix this?
1 Answer
Your comment indicates that this problem exists only with certain terminal emulators like gnome-terminal
No I'm on Linux Mint. Just installed terminator and there it works. Seems to be some issue with Gnome Terminal
Gnome-terminal is known to have trouble with mapping modifier keys in vim
Example: The problem is that in a terminal, a Tab character is ^I (Control-I). This means that pressing control while pressing tab is not something the terminal even bothers to pass through to Vim. It just sends a regular tab character.
GVim can support this because it doesn't have to rely on the terminal to tell it what keys are being pressed in what combination--it has more direct access to keyboard events, so it has no trouble seeing modified special keys.
While it's possible for X to recognize such combinations, applications that run in a terminal (or, these days, a terminal emulator) cannot. This is because, historically, terminals could only send and receive seven- or eight-bit sequences of ASCII data across a serial connection (though this could include "escape sequences" that position the cursor, scroll or delete lines, change color and other helpful effects).
There are some workarounds for it:
First, we need to know what command your terminal sends when a certain key combination is pressed:
To do so press Control + Shift + v
Now press the key combination Ctrl-j
and Ctrl-h
Ex: I am running headless server and for me Shift+Enter
or Control+Enter
or Enter
shows the same output ^M
but Alt+Enter
shows ^[
This means that shift+enter and control+enter and enter are taken similarly by the terminal.
So mapping shift+enter
combination would also affect enter
combinations.
- Record your output
enter gives me ^M
and \r
- man ascii
Look in the manpages of ascii and you will see that \r
is for CR
so now mapping <CR>
will map enter keys
Following these methods you might be able to find the specific char
Even though it should solve the problem, YMMV
Some people (foremost Paul LeoNerd Evans) want to fix that (even for console Vim in terminals that support this), and have floated various proposals..
Vim's keyboard input system revolves centrally around a queue of bytes. This worked well when all the world was serial terminals. In this new world of GUIs this model doesn't work so well. I advocate changing it to a queue of keypress events.
-
Thank you for all that information. I did what you suggested and noticed that there is no output for
Ctrl - g
Ctrl - h
andCtrl - j
whileCtrl - f
opened a search window. So i looked at Gnome Terminals Shortcuts and found that these four combinations were mapped to find actions. Unmapping them solved my problem! Jan 2, 2017 at 13:19 -
Ah ! Glad your problem is solved. I had a doubt that those keys were already mapped. Happy to help ! Jan 2, 2017 at 13:44
<C-h>
, however this still shouldn't mess up your mapping so I'm not sure what's going on there. To fix the backspace issue you can doinoremap <C-h> <BS>
, but I can't say that I know why<C-j>
and<C-h>
aren't working.