Вставка из буфера обмена и автоматическое переключение ": установить пасту" - PullRequest
16 голосов
/ 31 марта 2010

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

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

Я использую Mac, подключаюсь к машине Debian с Vim и, таким образом, вставляю в режиме вставки, используя cmd + v .

Ответы [ 4 ]

7 голосов
/ 31 марта 2010

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

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

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

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

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

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

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

3 голосов
/ 01 апреля 2010

В моем .vimrc есть следующее:

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

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

Обновление:

Джефроми опубликовал лучшее решение. Я немного повозился

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

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

1 голос
/ 31 марта 2010

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

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

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

0 голосов
/ 27 декабря 2016

Это должно быть решено с помощью скрипта Vim. (Я ненавижу сценарии 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

В этом есть слабые стороны, но в большинстве случаев это сработает.

...