Невозможно получить vim скопировать выделенный текст в системный буфер обмена, а не в буфер обмена vim - PullRequest
0 голосов
/ 17 января 2019

Я использую ZOC, также использовал Windows CMD, то же самое, когда я выделяю текст с помощью VIM и запускаю команду, например "+y или "*y, а затем пытаюсь вставить в мой локальный редактор Windows вывод пуст, что заставляет меня думать, что выделенный текст не был скопирован / доставлен в системный буфер обмена через соединение SSH ...

Аналогично, "+p не вставляет содержимое буфера обмена из системного буфера обмена.

Информация о системе:

pi@readonly:~/new$ vi --version | grep IMproved
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Sep 30 2017 18:21:38)
pi@readonly:~/new$ vim --version | grep clipboard
+clipboard       +job             +path_extra      +user_commands
+eval            +mouse_dec       +statusline      +xterm_clipboard
pi@readonly:~/new$    

Когда я открываю любой файл в VIM и пытаюсь проверить регистр +, я получаю следующее:

:reg +
--- Registers ---
Press ENTER or type command to continue   

Кроме того, когда я запускаю :echo has('clipboard'), я получаю 1

@ PatrickBacon, я дернул выделенный текст, нажав v, прокручивая текст и используя "+y. Вот регистры, показывающие:

:reg
--- Registers ---
""       int c;^J    for (i = 0; i < sizeof(s) - 1 && (c = getchar()) != EOF;) {^J       s[i++] = c;^J       if (c == '\n
"0       int c;^J    for (i = 0; i < sizeof(s) - 1 && (c = getchar()) != EOF;) {^J       s[i++] = c;^J       if (c == '\n
"1   ^J
"2   ^J
"3   p^J
"4   ^J
"5   ^J
"6   p^J
"7   p^J
"8       char s[64];^J    size_t i;^J
"9   int atoi(const char *s) {^J    int n = 0;^J    size_t i = 0;^J^J    while (s[i] == '0')^J        i++;^J    if (s[i]
"r         while (s[i] >= '0' && s[i] <= '9')^J            n = 10 * n + (s[i++] - '0');^J
"u       size_t i = 0;^J^J    while (s[i] == '0')^J        i++;^J    if (s[i] >= '1' && s[i] <= '9') {^J        n = s[i++
"z   t main() {^J    char s[64];^J    size_t i;^J    int c;^J
"-   i
"%   t.c
Press ENTER or type command to continue 

Следовательно, похоже, что янки работают в vim ..

Вопросы:

1) Что еще я должен проверить, чтобы убедиться, что все требования для «Копирование выделенного текста VIM в буфер обмена удаленной системы» были выполнены?

2) Сохраняются ли буферизованные регистры, существующие в VIM, в некоторых каталогах в моем Linux?

3) Как выглядит буфер обмена удаленной системы с системой Linux, к которой я подключаюсь через SSH? Другими словами, является ли буфер обмена удаленной системы просто файлом STDOUT или его частью в Linux?

1 Ответ

0 голосов
/ 20 января 2019

Как правило, вы не можете копировать текст из удаленной системной программы в текущую систему через SSH. Исключение составляют случаи, когда вы запускаете сервер X11 на локальном компьютере, а в удаленной системе запускается клиент, совместимый с X11, и у вас включена переадресация X для соединения SSH. Поскольку вы используете Windows, я сомневаюсь, что вы используете сервер X11 в вашей локальной системе.

Буфер обмена - это функция любой используемой вами оконной системы, а Windows и X11 (типичная оконная система Linux) не имеют совместимого интерфейса. Буфер обмена X11 (их несколько) сохраняются в памяти в программе до тех пор, пока X-сервер не говорит с программой данными буфера обмена и не запрашивает данные в определенном буфере обмена. Эти данные не просто стандартный вывод; это выделенный блок памяти и определенный протокол.

Если вы хотите иметь возможность копировать блоки текста с удаленного терминала, самый простой способ - использовать что-то вроде tmux в вашей локальной системе, а затем подключиться к удаленной системе через tmux. Вы можете настроить tmux для копирования и вставки данных из терминала в буфер обмена с помощью сочетаний клавиш. Это приведет к конфигурации, которая работает для всех терминальных программ и соединений, запускаемых в tmux, а не только для Vim.

Например, вы можете использовать привязку клавиш, как показано ниже (привязано к y), для автоматического копирования и вставки в буфер обмена Windows:

bind-key -T copy-mode-vi y send -X copy-pipe 'clip'
...