20071120

Vim в терминале: сохранение отступов вставленного текста

Как известно, vim можно запускать как в графическом режиме, так и в текстовом, в любом терминале. Так сложилось, что я привык запускать его именно в терминале. Однако при этом есть одно неудобство: если в режиме вставки попытаться вставить текст из «иксового» буфера обмена нажатием средней кнопки мыши, то отступы (отбивка) вставленного текста ломаются.

Например, если я, редактируя файл с текстом программы на Си, попытаюсь выделить мышью в соседнем окне и вставлять в vim такой текст:
int main(int argc, char *argv[]) {
printf("Hello World!\n");
printf("Vim 6 and later breaks indentation\n");
printf("when text is pasted with a mouse into terminal...\n");
}

получится скорее всего вот так:
int main(int argc, char *argv[]) {
printf("Hello World!\n");
printf("Vim 6 and later breaks indentation\n");
printf("when text is pasted with a mouse into terminal...\n");
}


И это очень раздражает! Происходит это только в терминале. Vim, запущенный в графическом режиме обрабатывает вставку из «иксового» буфера правильно. Самое интересное, что отключение автоматической отбивки (:set noautoindent, :set nosmartindent, :set nocindent...) проблему решает не всегда.

К счастью, решение (костыль?) есть. Если перед вставкой мышью использовать команду :set paste, то текст вставляется с сохранением отступа. После этого можно включить обратно используемый режим отступа командой :set nopaste.

(По мотивам Tip #330: how to stop auto indenting, :help paste и :help pt)