115

I can't figure out how to go back to Normal mode after entering Terminal in Insert mode...

Escape just doesn't seem to work.

Any idea?

3
  • 1
    Why does this feel like How do I exit Vim? all over again? :)
    – icc97
    May 16, 2021 at 10:46
  • @icc97 It doesn't really feel like it for me. really. I ask: hey Escape does not work as I think it should do in terminal mode. My question contains the words "Normal mode" "Teminal" "Insert mode" and the "Escape" key. The Vim meme related to exiting vim, is more targeted at pure beginners on one part. And total experts that challenges the most funny ways to do it on the other part. May 16, 2021 at 13:49
  • Well it had me spamming various keys trying to guess :) Plus the only way I solved it was googling again to find this answer.
    – icc97
    May 16, 2021 at 15:28

13 Answers 13

123

You are supposed to press CTRL+\CTRL+n.

See :help terminal-emulator for a mapping suggestion.

6
  • 2
    In Vim 8.2 it's :h Terminal-mode.
    – MikaelF
    Feb 20, 2020 at 3:32
  • I guess it's not exactly NeoVim, but this also works for the Terminal mode added to vanilla VIM May 18, 2020 at 20:26
  • or use <c-w><N> (uppercase "N" !!!) as mentioned below vi.stackexchange.com/a/27089/2239 by @Xuan. for me this is more vim-natural then <c-\>
    – MacMartin
    Sep 7, 2020 at 12:27
  • What kind of "shortcut" is this? It's not natural at all! To remap to Esc use :tnoremap <Esc> <C-\><C-n> Apr 27, 2021 at 17:25
  • 1
    @adelriosantiago Vim comes with very few "shortcuts". This is not one of them and no one is pretending it to be one but you.
    – romainl
    Apr 27, 2021 at 17:34
72

The answer by @romainl is correct but I wanted to add a bit more info for anyone that may have stumbled on this from google like I did.

Directly from the docs we get this note:

Terminal mode has its own namespace for mappings, which is accessed with the "t" prefix. It's possible to use terminal mappings to customize interaction with the terminal. For example, here's how to map to exit terminal mode:

:tnoremap <Esc> <C-\><C-n>

With that knowledge you will most likely need to create some terminal mappings to stay inline with your current workflow (tab/window movement, etc.)

4
  • Hi, I set up that exact mapping, but I'm pressing <Esc> and nothing happens. Any idea why? Jun 2, 2016 at 1:16
  • if you add it from Ex mode are the results the same? might be updating the wrong config file.. Jun 2, 2016 at 1:29
  • 2
    Thanks. This helped me add my preferred mapping of tnoremap kj <C-\><C-n> Oct 30, 2016 at 17:57
  • 3
    I made a slight adjustment to include the leader: tnoremap <leader><Esc> <C-\><C-n>. <Esc> is a very common key to use in the terminal, and by remapping just this you can't use <Esc> in the terminal any more. One bizarre scenario is if you end up in the inception world of starting up vim inside the vim terminal (it happens :)), but there's other examples such as running FZF on the terminal and you want to escape out of the search.
    – icc97
    May 16, 2021 at 10:31
8

According to vim documentation, there are two ways:

  1. CTRL-W N (note it's uppercase N)
  2. CTRL-\ CTRL-n

Use CTRL-W N (or 'termwinkey' N) to switch to Terminal-Normal mode. Now the contents of the terminal window is under control of Vim, the job output is suspended. CTRL-\ CTRL-N does the same.

1
7

Exit & close

tnoremap <Esc> <C-\><C-n>:q!<CR>

In Vim 8, this also works:

tnoremap <ESC> <C-w>:q!<CR>
2
  • 1
    You don't need the N in <c-w>N, you can simply press : after <c-w>. And if you really want to close Vim with all its open buffers and windows, than :qa! might be the better choice. But one would loose all changes in that case. Sep 26, 2018 at 14:33
  • 2
    Much better is tnoremap <Esc> <C-\><C-n>:bd!<CR>, which force closes the terminal buffer but not the entire Vim session. Jul 27, 2020 at 17:48
3

If you are using Tmux, you may have installed some "vim-like" bindings to move around in the window panes which among other things grab the "C-\" before Vim has a chance to use it. If so, remove these from your .tmux.conf and restart tmux:

bind-key -n C-\ if-shell "$is_vim" "send-keys C-\\" "select-pane -l"
bind-key -T copy-mode-vi C-\ select-pane -l

2

You can just press Ctrl + D in terminal to close it. But if you don't want to close it, just want to switch windows you can do Ctrl-W w (if you have multiple panes you can specify to which you switch with the seccond letter (h,j,k,l), W just switches vim windows.

1
  • Ctrl + D is not an option as it exits the terminal. I just wanted to go back to Normal mode. On the contrary, your suggesting "changing window" is a nice option, since it is often the case I have another window pane. +1. Feb 6, 2021 at 23:10
1

Well, I am surprised that no other commment mention it so maybe it's bad practice but I personnaly just typed exit and it worked.

2
  • 5
    Not bad practice, but you’ve misunderstood the Q i think. The idea is usually to keep the terminal running, but navigate it in normal mode for a brief moment. Your solution ends the process (and doesnt work for non-shell-like things), while the ctrl-\ ctrl-n allows me to navigate, yank, etc., and then press i and keep working in that terminal
    – D. Ben Knoble
    Jun 25, 2020 at 12:29
  • 1
    Just to append to the answer, <Ctrl-D> feeds an end-of-file keycode, closing most shells, and by extension the terminal. Pressing two keys (with one hand) is quicker than 5 keys (with two hands). :)
    – mazunki
    Nov 6, 2020 at 9:24
1

In my case (I use <leader>x, to close any buffer), as I have init.lua instead of init.vim my configs are:

-- map helper
local function map(mode, lhs, rhs, opts)
    local options = {noremap = true}
    if opts then options = vim.tbl_extend('force', options, opts) end
    vim.api.nvim_set_keymap(mode, lhs, rhs, options)
end

 
local autocmds = {
    packer = {
        { "BufWritePost", "plugins.lua", "PackerCompile" };
    };
    terminal_job = {
        { "TermOpen", "*", [[tnoremap <buffer> <Esc> <c-\><c-n>]] };
        { "TermOpen", "*", [[tnoremap <buffer> <leader>x <c-\><c-n>:bd!<cr>]] };
        { "TermOpen", "*", [[tnoremap <expr> <A-r> '<c-\><c-n>"'.nr2char(getchar()).'pi' ]]};
        { "TermOpen", "*", "startinsert" };
        { "TermOpen", "*", "setlocal listchars= nonumber norelativenumber" };
    };
    restore_cursor = {
        { 'BufRead', '*', [[call setpos(".", getpos("'\""))]] };
    };
    save_shada = {
        {"VimLeave", "*", "wshada!"};
    };
    resize_windows_proportionally = {
        { "VimResized", "*", ":wincmd =" };
    };
    toggle_search_highlighting = {
        { "InsertEnter", "*", "setlocal nohlsearch" };
    };
    lua_highlight = {
        { "TextYankPost", "*", [[silent! lua vim.highlight.on_yank() {higroup="IncSearch", timeout=400}]] };
    };
    ansi_esc_log = {
        { "BufEnter", "*.log", ":AnsiEsc" };
    };
}

nvim_create_augroups(autocmds)
0

Another simple solution that works for neovim:

If you have the mouse support, simply using the mouse wheel will switch to normal mode.

3
  • 2
    Welcome to Vi and Vim! This actually doesn't work for me, which is surprising, since I do that all the time for tmux. (vim 8.2.4050 + alacritty)
    – D. Ben Knoble
    Jan 27 at 13:45
  • 1
    Hi! And thanks for feedback. I have tested it with neovim 0.6.0 on Windows and neovim 0.4.4 on Linux and seems to work fine. I tried on Vim 8.2.1522 on Windows and it does not work. Seems like to work only for neovim. If you agree I can edit the answer to address only neovim...
    – piertoni
    Jan 27 at 14:29
  • 2
    Yes that sounds fine
    – D. Ben Knoble
    Jan 27 at 14:42
0

How about, simply using the below to delete the terminal session? (Note that ! is important)

:bd!
0

For me what works is ctr+\+n that combination of keys is what takes me off the insert mode in the terminal mode.

1
  • Welcome to Vi and Vim! It looks like this was already covered in a few answers.
    – D. Ben Knoble
    May 11 at 17:15
0

I just press i to go into insert mode.

1
  • Welcome to Vi and Vim! I think you've missed the thrust of the question, which is to go to (Terminal) Normal mode, not Insert mode
    – D. Ben Knoble
    Jun 2 at 18:04
0

Type exit into the terminal to kill it and it should close.

1
  • Hey thanks for your first contribution on this site! If you look at cassepipe's answer and its comments you'll notice that you don't really answer OP's question. If you want to participate more on this site, my friendly advice would be to try to answer more recent questions with less existing answers: There's more chances your answer gets noticed and help other people :)
    – statox
    May 10 at 8:30

Not the answer you're looking for? Browse other questions tagged or ask your own question.