Подтвердить что ты не робот

Вставка из буфера обмена и автоматическое переключение: установка пасты

Когда я вставляю вещи из буфера обмена, они обычно (всегда) многострочные, и в тех случаях (и только в этих случаях) я хотел бы, чтобы :set paste запускался, поскольку в противном случае табуляция будет увеличиваться с каждым line (вы все это видели!).

Хотя проблема с :set paste заключается в том, что она не ведет себя хорошо с set smartindent, заставляя курсор перейти к началу новой строки, а не к правильному отступу. Поэтому я хотел бы включить его только для этого экземпляра.

Я использую Mac, sshing на машине Debian с vim и, таким образом, вставляя в режиме Insert с помощью cmd-v.

Приветствия.

4b9b3361

Ответ 1

Я не использую mac, но я считаю, что у меня есть префикс прямо здесь: <D-v> должен означать cmd-v. Для режима вставки:

:imap <D-v> ^O:set paste<Enter>^R+^O:set nopaste<Enter>

или действительно, просто выполните это:

:imap <D-V> ^O"+p

The ^ O и ^ R - это буквальное управление-O и control-R, которое вы можете ввести с помощью ^ V ^ O (control-v control-o) и ^ V ^ R (control-v control-r). Control-O в режиме вставки позволяет выполнить одну команду, а затем вернуться в режим вставки; здесь вы можете использовать его для записи из регистра буфера обмена.

Это работало для меня, когда я тестировал их, сопоставляя их с другим ключом, поэтому вы должны быть настроены.

Нет необходимости отображать что-либо, если не в режиме вставки; вы можете просто использовать "+p.

Ответ 2

У меня есть следующее в моем .vimrc:

inoremap <S-Insert> <ESC>:setl paste<CR>gi<C-R>+<ESC>:setl nopaste<CR>gi

gi - запустить режим вставки в том же положении, что и в том случае, когда режим вставки был остановлен в последний раз в текущем буфере.

Upd:

Jefromi опубликовала лучшее решение. Я немного переделал его

inoremap <S-Insert> <ESC>"+p`]a

Вставляет текст clilpboard и помещает курсор сразу после него.

Ответ 3

Вы правы в том, что вам нужно включить только 'paste', когда вам это нужно. Это не просто влияет на отступы. Вы можете прочитать все, что он затрагивает в своей документации. Связанная с этим опция, которая очень полезна для облегчения использования 'paste', 'pastetoggle'.

Если вы использовали X-переадресацию и терминал, который может правильно обмениваться действиями мыши, вы также можете воспользоваться "mouse" вариант. С помощью :set mouse=a Vim получает информацию о том, что делает мышь, и поэтому не будет выполнять автоматический отступ при получении многострочной пасты с помощью щелчка мышью средней кнопки.

Даже без возможности мыши, X-forwarding может помочь, потому что Vim будет делать то же самое при ручном вставке из буфера обмена или регистров выбора ("+ и "* соответственно).

Ответ 4

Это должно быть разрешено с помощью vim script. (Я ненавижу скрипт vim, поэтому это должно быть гораздо более серьезное причинение, чтобы заставить меня самостоятельно его решить.) Даже с iTerm2 "вставить медленно" режим, по умолчанию необходимо разбить данные, которые будут вставлены в 16 байтовых блоков, и отправить их каждые 0,125 секунды. Поэтому вы должны иметь возможность программно обнаруживать 16-байтовый фрагмент "нажатия клавиш" и делать что-то с этим.

В псевдокоде, который будет выглядеть так:

if too_fast_too_be_human():
    set('pastemode', True)
else
    set('pastemode', False)

# where either
def too_fast_too_be_human
    char_threshold = 16
    return len(input_buffer) > char_threshold

# or
def too_fast_too_be_human
    static byte_times = []
    char_threshold = 16
    time_threshold = 0.125
    byte_times.append(now())
    while(len(byte_times) > char_threshold):
        byte_times.unshift()
    return (byte_times[-1] - byte_times[0]) < time_threshold

Есть слабые стороны этого, но он будет работать в большинстве случаев.