Чому відступ Vim вставлено неправильно?


100

Якщо я вставляю цей сценарій у Vim:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

Я отримую ці дивні результати:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

З'явилися хеш-знаки (#) та вкладки. Чому?


31
Це може бути кращим питанням для vi.stackexchange.com
Ерік Ренуф

@EricRenouf чому? (чесне запитання)
Qix

3
@qix моя думка: це питання про те, як працює vim, який є звичайним інструментом для використання на * nix, але * nix не є вимогою для використання vim
Ерік Реноф

1
@JaredBurrows Я впевнено сподіваюся, що це вдасться
Ерік Реноф

1
Як ви запускаєте пасту? З мишкою?
Бен Войгт

Відповіді:


122

Є дві причини:

Для вставки під vimчас ввімкнення автоматичного відступу потрібно змінити режим вставки , ввівши:

:set paste

Потім ви можете змінити режим вставки та вставити код. Після завершення вставки введіть:

:set nopaste

щоб вимкнути режим вставки. Оскільки це звичайні та часті дії, vimпропонується переключити режим вставки:

set pastetoggle=<F2>

Ви можете перейти F2на будь-яку клавішу, яку хочете, і тепер ви можете легко вмикати та вимикати.


Щоб вимкнути автоматичне вставлення коментарів, ви можете додати ці рядки до свого vimrc :

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimтакож забезпечує реєстрацію вставки для вставки тексту із буфера обміну системи. Ви можете використовувати "*pабо "+pзалежно від вашої системи. У системі без X11, таких як OSX або Windows, ви повинні використовувати *реєстр. У системі X11, як-от Linux, ви можете використовувати обидва.

Подальше читання


2
Я використовую Vim назавжди і ніколи про це не знав. Дуже дякую.
Caja

Більшість сучасних графічних емуляторів терміналів підтримують функцію під назвою "режим із вставкою в рамки". Vim може попросити термінал включити цей режим, який, в свою чергу, буде оточувати вклеєний текст певними послідовностями. Vim може розпізнати це та вимкнути обгортку / відступ на час дії пасти. Довга історія: обклеювання буде працювати так, як очікувалося. Я не користувач vim, але швидкий веб-пошук обов'язково підкаже, як налаштувати цей режим.
Егмонт

2
@MichaelDurrant set pasteніколи не повинен бути у вашому vimrc. Він вимикає або скидає багато речей, включаючи відображення режимів вставлення, відображення командного рядка, скорочення, текстову ширину, wrapmargin, autoindent, smartindent, softtabstop, форматi, indentexpr та декілька інших. :h pasteмає весь список. Більшість людей користується деякими чи всіма цими речами і цікавиться, чому там налаштування ігноруються.
FDinoff

4
Я зазвичай використовую, :r!catщоб вставити дослівно.
Саймон Ріхтер

1
Можливо, варто обговорити взаємодію з set mouse, яка може автоматично входити та залишати режим вставки, коли вставляти клацання миші.
Бен Войгт

36

Використовуйте пасту vim. Що ви хочете - це вставити те, що є в буфер буфера обміну "+p

Це вибирає +та вставляє його на місце.

Якщо ви використовуєте Linux, *це буфер X / середнього клацання (останній обраний текст).

Тоді vim знає, що це паста.

Інакше vim вважає, що ви набрали ключі, які вставляєте, і робить власне автовідступ (поверх скопійованого відступу) аж до кінця вставки.

Як примітка для роботи над SSH вам потрібно встановити опцію для спільного використання буфера обміну -Y

Докладніше man sshдив.


4
Це насправді правильна відповідь imho
Kristoffer Sall-Storgaard

Схоже, це працює лише для графічного vim ( gvim); vim, що працює в емуляторі терміналу, вставляє останній видалений текст "* p, а не поточний вибір.
wurtel

Я не використовую gvim, тільки термінальний vim. які налаштування вашої миші? моя настройка миші - c. Не впевнений, як це працює, коли дозволено вибір миші. set mouse?
exussum

2
також перевірте vim --version, чи вона складена з підтримкою буфера обміну, +xterm_clipboardповинна бути у виході
exussum

@wurtel: Можливо, ви встановили буфер обміну за допомогою unnamedрядка.
cuonglm

8

Вкладки були вставлені тому, що у вас увімкнено autoindent, і ви можете відключити цю поведінку, вимкнувши autoindent ( :set noai) перед вставкою в термінал.

Коментовані рядки створюються за допомогою автоматичного коментування та їх можна відключити, вимкнувши це.

Альтернативно тим, кому ви повинні отримати бажану поведінку, використовуючи перемикачі :set paste, вставляючи відформатований код і :set nopasteвідновити нормальну поведінку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.