A note on bracketed paste mode in terminal and Neovim.

Annoying character inserted when pasting text

I use ZOC terminal to connect to my remote server. Today, I noticed a strange issue when I copied text from elsewhere to the terminal shell command line. When I copied some text and pasted it in the terminal, I found that 0~ was added in the beginning of text, and 1~ was added in the end of text.

I found a similar issue on stackexchange. It turns out that this has something to do with bracketed paste mode in terminal emulators.

What is bracketed paste mode

Typically, when we paste code snippet into a terminal application, it can not tell whether we are typing the text or we are pasting it. This may have unintended side affects for some application. For example, Vim will auto-indent the code pasted into it when it sees a newline, breaking the code structure.

Here comes the bracketed paste mode. When this feature is enabled, if we paste text into terminal, the terminal will add some special sequence in the beginning and end of the text (\e[200~ in the beginning and \e[201~ in the end).

How enable and disale it in terminal

To check if bracketed paste mode is on and supported, first use printf "\e[?2004h" to turn on it. Then copy some text, run xxd, and paste some text into terminal. If you terminal supports bracketed paste mode, then you will see output like the following:

^[[200~some test^[[201~

To disable this mode, use printf '\e[?2004l'.

Why is it important?

But how is this even important? If a terminal program also supports bracketed paste mode, it can interpret the special terminal sequence and know that the user is pasting text instead of typing it.

A noticeable example is when we paste multi-line code into Vim. Since the code have already been properly indented, we do not want Vim to alter it. Without this terminal ability, Vim does not know whether you are typing the text or paste it from the terminal. So when it meets a newline character, it will try to re-indent the following line, causing a complete mess. If Vim supports bracketed paste mode, when it see the special terminal sequence, it knows that the user is trying to paste text into it. It will not auto-indent your pasted text any more, thus you do not need to use set paste in order to paste something.

Enable bracketed paste mode in Vim/Neovim

For plain Vim, see this post on how to enable bracketed paste mode. If you are using Neovim, bracketed paste mode in built-in, if your terminal supports it, you do not need to do any setup. Neovim will just work, see also :h bracketed-paste-mode inside Neovim.