Есть ли способ применить преобразование sed к буферу vim перед копированием в буфер обмена? - PullRequest
4 голосов
/ 13 сентября 2011

Я использую следующую команду для копирования всех строк текста в документе в системный буфер обмена:

%y+

Обычно, особенно для того, чтобы скопировать код в StackOverflow;), я применяю преобразование sed к своему буферу, чтобы упростить вставку с помощью MarkDown:

%s:^:\t:g

Есть ли способ связать команды, фактически не применяя их к моему буферу, только к скопированному тексту?

Ответы [ 3 ]

6 голосов
/ 13 сентября 2011

Я предлагаю использовать утилиту CLI, чтобы поместить ее в буфер обмена: есть несколько, которые я нашел ранее, но вот один:

Таким образом, вы бы сделали

:%!sed 's:^:\t:g`|xclip

или

:%!sed 's:^:\t:g`|xclip -selection c

последний использует буфер обмена X вместо основного буфера обмена (при условии UNIX).

В Windows, вероятно, есть похожие утилиты

Редактировать

Чистое решение для vim будет:

:let @+=substitute(join(getbufline("%", 1, "$"), "\r\n"), "^\\|\n", "\&\t", "g")

Примечания:

  • он не очень эффективен (но вы используете его ТАК сообщения ... так что это не Одиссея Гомера)
  • Я предполагаю, что вы хотите, чтобы конец строки Windows (которыйэто то, что я получаю при копировании из ТАК)
3 голосов
/ 13 сентября 2011

Если вы не возражаете добавить запись в список отмены (что означает фактическое редактирование содержимого буфера), вы можете выполнить подстановку, восстановить текст и отменить эту подстановку в одной команде.

:%s/^/\t/|%y+|u

Другим решением было бы сделать подстановку прямо в содержимом регистра + сразу после копирования.

:%y+|let@+=substitute(@+,'^\|\n\zs','\t','g')
2 голосов
/ 13 сентября 2011

Если shiftwidth равно 4 и expandtab установлено, я бы сделал:

:set guioptions+=a
ggVG>gv

7 нажатий клавиш не так уж и плохо. Конечно, нет команды ex. Если вам нужны бывшие команды, вы можете сделать:

function! ToSo()
    %y +
    let @+ = "    " . substitute(@+, '\n', "\n    ", 'g')
endfunction
command! -nargs=0 ToSo :call ToSo()<Enter>

А потом:

:ToSo

поместит все, что вы хотите в буфер обмена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...