Як я можу зберегти код сформованим як оригінальний джерело, коли я вставляю їх у 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.