Reputation: 110163
When I'm in insert mode in vim and I use the arrow keys, it sends what seems like a letter and a carriage return. For example, pressing ↑ it sends:
A
It looks like A\n
but I'm not sure exactly what characters/codes it's sending. Why does this occur, and is there a way to disable this?
Upvotes: 2
Views: 3128
Reputation: 8898
The usual sequence sent by a terminal for the Up arrow is <Esc>OA
or ^[OA
(the ^[
sequence represents the <Esc>
key, also equivalent to Ctrl+[
.)
If your Vim fails to recognize this sequence as the Up arrow, it will end up executing this sequence: <Esc>
which will leave Insert mode and go to Normal mode, then O
to insert a new line above the current one and go to Insert mode, then insert a literal A
since you'd be in Insert mode again.
You can confirm that this is indeed the sequence your terminal is sending Vim by typing Ctrl+V
followed by the Up arrow in Insert mode. (Ctrl+V
in Insert mode inserts the next character literally.) I'd expect you'd see the ^[OA
sequence inserted.
Then you can check what your Vim thinks the sequence for the Up arrow is with the :set <Up>
command. I'd expect you'd see something like:
t_ku <Up> ^[OA
(t_ku
is the internal name for the setting corresponding to this Up arrow key. You can also use :set termcap
to see all Vim settings related to the terminal, including the special key codes.)
If either of these don't match the expectations, that would explain why your Vim is not recognizing the Up arrow key. (One alternative explanation is that 'ttimeoutlen'
is set too short, but I'd say that's highly unlikely.)
These settings are usually managed by the 'term'
setting. By default, it's set based on whatever you have for $TERM
on your shell outside of Vim.
You can start by looking at what Vim thinks 'term'
is, and where it's set from:
:verbose set term?
term=screen-256color
Last set from ~/.vimrc line 100
The :verbose
part asks Vim to tell you where it's set from, so you'll see if your vimrc or one of your plug-ins is overwriting it. If Vim shows none of that, it means it's coming from the $TERM
variable in your shell.
So look at what $TERM
is set to outside of Vim and see if that seems to be correct or not. Are you setting that explicitly somewhere? Be it one of the shell's initialization files or perhaps from your terminal emulator itself?
Also possibly relevant whether you're using tmux or screen, in which case you should double check that $TERM
is also set correctly both inside tmux or screen, but also outside it.
Hopefully all these hints should lead you in the right direction fixing this. If you can't figure out, post your findings as comments on this answer and I'll update it with more specific fixes you can try.
Upvotes: 3
Reputation: 4370
You're probably in vi compatibility mode. try :set nocompatible
If that makes it function as you would like, put set nocompatible
at the top of your vimrc file to get it to default to this behavior.
Upvotes: 1