Вставка из буфера обмена и автоматическое переключение: установка пасты
Когда я вставляю вещи из буфера обмена, они обычно (всегда) многострочные, и в тех случаях (и только в этих случаях) я хотел бы, чтобы :set paste
запускался, поскольку в противном случае табуляция будет увеличиваться с каждым line (вы все это видели!).
Хотя проблема с :set paste
заключается в том, что она не ведет себя хорошо с set smartindent
, заставляя курсор перейти к началу новой строки, а не к правильному отступу. Поэтому я хотел бы включить его только для этого экземпляра.
Я использую Mac, sshing на машине Debian с vim и, таким образом, вставляя в режиме Insert с помощью cmd-v.
Приветствия.
Ответы
Ответ 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
Есть слабые стороны этого, но он будет работать в большинстве случаев.