Як я можу зберегти код сформованим як оригінальний джерело, коли я вставляю їх у vim?


37

Коли я копіюю якийсь код із веб-сторінок і вставляю його у VIM, я вважаю, що він стає стилем безладу, схожим на сходи, як слід

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

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

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

Зазвичай я пишу python у VIM.І допомогу буде оцінено.


1
Спасибі. Це мене дратувало роками, і мені ніколи не доводилося питати когось про це. +1.
DevSolar

Відповіді:


50

Зробіть це раніше:

:set paste

Потім після:

:set nopaste

Не потрібно для gvim; він вмикається та вимикається автоматично під час вставки.
Бенджамін Баньє

будь-яка ідея, чому це?
Натан Фелман,

1
Просто здогадуйтесь: Звичайний vim - це лише командний рядок і не "знає" про буфер обміну. Він приймає "вставити" як послідовність введення символів і застосовує автоматичне відступ. Gvim-відомий gvim може «знати», що вхідні дані надходять із буфера обміну, і, таким чином, відключати автоматичну індексацію для цієї мети.
DevSolar

Це правильно. Термінал розглядає операцію "вставлення" як вихідний символ.
Ігнасіо Васкес-Абрамс

Це не є справді проблемою vim - ви можете отримати аналогічне вставлення афектів у старий редактор DOS у командному рядку. Ця програма, здається, відсутня в 64-розрядному Windows 7 - мабуть тому, що це дійсно старий 16-розрядний додаток DOS, і не варто було клопотатись з його оновленням. Однак це в Windows XP, і вставлення в це (1) працює дуже повільно, виконуючи введення символів за символом, і (2) створює справжній безлад.
Steve314

16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

Увімкніть автоматичне відступ для вставки коду

Фон

Якщо ви використовуєте команди Vim для вставки тексту, нічого несподіваного не відбувається. Проблема виникає лише при вставці з іншого додатка і лише тоді, коли ви не використовуєте GUI-версію Vim. У консольній або термінальній версії Vim не існує стандартної процедури вставки тексту з іншої програми. Натомість термінал може імітувати вставку, вставляючи текст у буфер клавіатури, тому Вім вважає, що текст був набраний користувачем. Після закінчення кожного рядка Vim може перемістити курсор, тому наступний рядок починається з того ж відступу, що і останній. Однак це змінить відступ вже в вставленому тексті.

Вставити тумблер

Помістіть наступне у своєму vimrc (змініть клавішу, яку ви хочете):

set pastetoggle=<F2>

Щоб вставити з іншої програми:

  • Почніть режим вставки.
  • Натисніть F2 (вмикає опцію "вставити").
  • Використовуйте свій термінал, щоб вставити текст із буфера обміну.
  • Натисніть F2 (вимикає опцію "вставити").

Тоді наявний відступ вставленого тексту буде збережено.

Спочатку не потрібно запускати режим вставки, але якщо ви перебуваєте у звичайному режимі та маєте відображення для F2, це відображення буде застосовано, і функція 'pastetoggle' не буде працювати.

Деяким людям візуальний відгук, який відображається в рядку статусу, є такою альтернативою для вашого vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

Перший рядок встановлює відображення так, що натискання клавіші F2 у звичайному режимі переверне параметр 'вставити', а потім покаже значення цього параметра. Другий рядок дозволяє натиснути клавішу F2 у режимі вставки, щоб увімкнути та вимкнути "вставити". Третій рядок дозволяє відображати, чи увімкнено 'вставити' у режимі вставки.


1
+1 для гарячої клавіші. Для не надто твердої фірми VIM (як я), яка вже відобразила F-клавіші на щось інше (як я), <C-F2> буде Ctrl-F2 ...
DevSolar

відмінно - я зараз користуюсь цим
hoju

чому б просто не зіставити клавіші вставки, щоб це зробити автоматично, як-от <S-Insert> або <Ctrl + V>, разом із їх оригінальними функціями? Або напишіть функцію, яка відключає вставку, коли в буфер за секунду записується більше декількох вхідних символів, це просто ідея, звичайно, для мене я майже ВСІ мої клавіші відображені на інші речі, тому це біль , У мене навіть є клавіатура з 12 клавішами F і + ще 15 клавішами F (клавішами G), і з цим, трьома рівнями, що ще недостатньо :), але це тільки я. Єдина проблема - це меню правою кнопкою миші, яке не надсилається жодними програмами esc, щоб сигналізувати про початок вставки оп ...
osirisgothra

2

Саме автоінтендент возиться з вами.

set autoindent
set smartindent

Спробуйте вимкнути їх під час вирізання та вставлення коду, а потім увімкніть їх знову, коли закінчите.


-2

Найменший обсяг зусиль для досягнення цього (можна вкласти .vimrc):

:set paste

Потім вставте свій код.


3
Цей 'paste'варіант ніколи не мав бути постійно встановлений. Це відключає багато речей, включаючи відображення та скорочення. Крім того, попередня відповідь вже охоплює 'paste'варіант.
Гептит

2
Ласкаво просимо до Супер Користувача! Це дублює існуючу відповідь і не додає нового вмісту. Будь ласка, не публікуйте відповіді, якщо у вас насправді є щось нове.
Toby Speight
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.