LINUX.ORG.RU

Проблема с CRLF при пасте через XRDP в VIM.

 , ,


0

1

Коллеги, здравствуйте. =D

Очень надеюсь на помощь сообщества, сам уже потратил неприлично много времени на данную проблему.

Излагаю. Кратко: Есть конструкция: Arch + i3wm + rxvt-unicode + Xorg + Xrdp + win10. На ней есть Vim. И я его очень люблю. Когда я копирую в буфер с виндовой стороны несколько строк, мне прилетаюь CR и LF контрольные последовательности и я никак не могу от них избавиться.

И не кратко И когда я вставляю из буфера нажатием комбинации клавиш, то, вероятно, CR превращается в еще один LF и у меня выходят двойные переносы везде.Это происходит при копировании в терминал ( пробовал несколько разных эмуляторов) и в вим. В графический gedit пастит нормально.

Когда делаю xclip -o| или xsel -o -b| и например перенаправляю в xxd или hexdump, то вижу - вот они 0a 0d везде. И могу их убить пайпнув в dos2unix или отредактировав хекс.

Но, как я не пытался настроить комбинацию клавиш, чтобы dos2unix тоже пайпом выполнялся, никак не выходит. Причём другие команды отрабатывают, т.е. могу в хексдамп пайпнуть, и выдает вывод.

Но именно с ними ничего не выходит сделать, все равно ctrl+alt+v(это дефолт rxvt) и двойные переносы везде. Комбинацию переназначал, и шифт инсерт делал, пайпал - нет, не желает работать.

Все режимы в виме тоже перепробовал.

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

Все конфиги покажу, какие скажете. Вот stty -a, для самых сильных колдунов.

stty -a
speed 38400 baud; rows 46; columns 68; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D;
eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl
ixon -ixoff -iuclc -ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0
bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop
-echoprt echoctl echoke -flusho -extproc



Такая вот картина, если сравнить вим и gedit

Я картинко



Последнее исправление: Cobbrat (всего исправлений: 4)

Попробуй делать вставку средствами vim, вдруг поможет. Помнится в vim есть отдельный регистр в котором доступен буфер обмена X. Естественно, если vim был собран с флагом --enable-xterm_clipboard и/или --with-x.

iron ★★★★★
()
Ответ на: комментарий от iron

Тут, боюсь дело не самом виме а в чём-то пониже, в теримнале или оболочке. В вим нормально прилетает и улетает из него, т.е. работает буфер X с ним. А вот проблема с доп переносами наблюдается и в терме и в виме.

В целом есть обходные пути например копировать в notepad++ сначала, там выставлять режим unix и копировать оттуда уже в линукс. Или в линуксе сначала в gedit и потом в вим.

Так работает.

Но мне категорически не нравятся эти решения.

Вот конфига для терминала, с приятной, кстати гаммой =D

Там в части где копи-паст конструкция Urxvt.pasteCommand: xsel -o -b | dos2unix. Такая же в терминале отрабатывает, а тут -нет.

Может быть там какие-то особенности этого perl’а. Сам не знаю зачем я использую терминал с настройками на perl.

! special
URxvt.background: #24273A
URxvt.foreground: #CAD3F5
URxvt.cursorColor: #F4DBD6
! black
URxvt.color0: #292b38
URxvt.color8: #17191f
! red
URxvt.color1: #F38BA8
URxvt.color9: #F38BA8
! green
URxvt.color2: #A6DA95
URxvt.color10: #A6DA95
! yellow
URxvt.color3: #EED49F
URxvt.color11: #EED49F
! blue
URxvt.color4: #8AADF4
URxvt.color12: #8AADF4
! magenta
URxvt.color5: magenta3
URxvt.color13: magenta3
! cyan
URxvt.color6: #8BD5CA
URxvt.color14: #8BD5CA
! white
URxvt.color7: #B8C0E0
URxvt.color15: white


!! Common Keybinds for Navigations
URxvt.keysym.Shift-Up: command:\033]720;1\007
URxvt.keysym.Shift-Down: command:\033]721;1\007
URxvt.keysym.Control-Up: \033[1;5A
URxvt.keysym.Control-Down: \033[1;5B
URxvt.keysym.Control-Right: \033[1;5C
URxvt.keysym.Control-Left: \033[1;5D


!! Copy Paste & Other Extensions

URxvt.perl-ext-common: default,clipboard,selection-to-clipboard,keyboard-select
URxvt.copyCommand: xsel -i -b
Urxvt.pasteCommand: xsel -o -b | dos2unix
URxvt.keysym.M-c: perl:clipboard:copy
URxvt.keysym.M-v: perl:clipboard:paste
URxvt.keysym.M-C-v: perl:clipboard:paste_escaped
URxvt.keysym.M-Escape: perl:keyboard-select:activate
URxvt.underlineURLs: true
URxvt.clipboard.autocopy: true




!! URxvt Appearance
URxvt*transparent: true
URxvt*shading: 30
URxvt.font: xft:Iosevka:style=Regular:size=13
URxvt.boldFont: xft:Iosevka:style=Bold:size=13
URxvt.italicFont: xft:Iosevka:style=Italic:size=13
URxvt.boldItalicFont: xft:Iosevka:style=Bold Italic:size=13
URxvt.letterSpace: 0
URxvt.lineSpace: 0
URxvt.geometry: 400x400
URxvt.internalBorder: 10
URxvt.cursorBlink: true
URxvt.cursorUnderline: false
URxvt.saveLines: 5048
URxvt.scrollBar: false
URxvt.scrollBar_right: false
URxvt.urgentOnBell: true


Cobbrat
() автор топика
Ответ на: комментарий от iron

Неа. Попробовал. Но я в целом уже перерыл все эти режимы - неа.

Похоже на какую-то багу в xrdp или вроде того. Как бы её костылём подцепить и доволен был бы)).

Но вот не дается.

Cobbrat
() автор топика
Ответ на: комментарий от ox55ff

Да много больно конфигов нонче. Ну и плюс, я ленивый. Мне правда лень от hjkl руку донести до мыша. Порой. =D Ну и то, на чём стоит это всё не потянет vscode. Нанонекромантия.

Cobbrat
() автор топика
Ответ на: комментарий от iron

Да, тоже думал в эту сторону. Пока не пробовал.

Но, похоже, я локализовал проблему. И она в конфиге терминала, скорее всего.

Т.е. все же не отрабатывает перенаправление xsel в pipe.

Всё же дело в perl этом, похоже.

Cobbrat
() автор топика
Ответ на: комментарий от Cobbrat

Но, похоже, я локализовал проблему. И она в конфиге терминала, скорее всего. Всё же дело в perl этом, похоже.

У тебе конфиг терминала не перле написан, или ты в показаниях путаешься?

debugger ★★★★★
()

Я пробовал пастить текст с CR+LF разделителями в терминал и vim, в gnome-terminal и в tilix всё работает нормально, а rxvt мозги парит, задаёт вопросы, а потом пастит одну строку вместо трёх; xterm пастит строки «через одну» как у тебя; при этом настройки stty везде совершенно одинаковые.

Мораль: stty тут не при чём. Разбирайся со своим rxvt или используй один из нормальных терминалов, в которых паста работает «из коробки».

UPD: В Tilix, если поставить галочку «Strip trailing whitespaces and linebreak characters on paste», то начинается такая же порнография, как у тебя. Кури настройки rxvt.

debugger ★★★★★
()
Последнее исправление: debugger (всего исправлений: 1)
Ответ на: комментарий от Cobbrat

Ты копаешь в правильном направлении, но у тебя каша в голове, поэтому ты копаешь медленно.

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

Это раз. Два: Ты после редактирования этого файла xrdb запускал как в мане написано? Терминал перезапускал после этого?

Три:

URxvt.copyCommand: xsel -i -b
Urxvt.pasteCommand: xsel -o -b | dos2unix

Почему у тебя в первом случае URxvt, а во-втором — Urxvt? В юниксах/линуксах любят регистрозависимость, URxvtUrxvt.

Четыре: С чего ты взял что в ресурсе URxvt.pasteCommand допустим шелльный синтаксис, в частности, каналы? Я бы для эксперимента запихнул туда имя скрипта (с полным путём!) и экспериментировал с ним: а вызывается ли он вообще, с какими параметрами, куда идёт вывод скрипта и т. д.

Пять: С чего ты вообще взял, что терминал читает URxvt.pasteCommand? Я вот гляжу на вывод urxvt --help, так там ресурс pasteCommand вообще не упоминается.

debugger ★★★★★
()
Последнее исправление: debugger (всего исправлений: 1)
Ответ на: комментарий от debugger

Да я всё это понимаю, пробовал ему просто просунуть команду вчера вечером, ну cat там например, и понял, что и правда эта строчка в кофиге не отрабатывает.

Т.е. URxvt.keysym.M-V: perl:clipboard:paste_escaped Работает, меняю keysym и оно меняется, пастит с экранированием символов- всё супер.

Но вот поменять именно эту часть где perl - и он просто по кейстроку мне вставляет в терминал строчку из конфига дословно, а не выполняет скрипт. Т.е. таки и пастит «xsel -o -b| xxd» например.

Я был уверен, что оно отрабатывало, видимо что-то напутал. Когда тестил, т.к. замучался уже к тому времени.

Это 10000онная итерация конфига, опечатку вижу, она не причина, т.к. её там не было 9999 итераций до этого.

Перл я не винил, а в том смысле, что я просто не понимаю, как ему просунуть этот перл и мб есть особенности синтаксиса вызовов системных. Там двоеточия эти - явно не стандартный формат конфига.

В питоне надо через os вызывать или еще как, вот и тут я думал, что мб перлом надо описать это.

Дело явно в конфиге ну или терминале, в том как пасту обрабатывает. Думаю сменить терм. Попробую тиликс этот, вроде неплохой софт, я даже не знаю почему я на rxvt этом сижу, так исторически сложилось, до этого что угодно настраивалось нормально и вот первый раз так встрял за долгое время. Терм-то нормальный.

Cobbrat
() автор топика
Ответ на: комментарий от Cobbrat

Upd. Попробовал ему perl:system(«sh», «ls»); просунуть. И да, не работает.

Tilix глянул, и правда туда пастит нормально. Но мне показался он тяжеловатым, еще депенденси на 170мб натянул. И он ну прям гуёвый такой, мышевозный.

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

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

Cobbrat
() автор топика
Ответ на: комментарий от Cobbrat

Но мне показался он тяжеловатым, еще депенденси на 170мб натянул.

И что? У тебя коленки подогнулись от такой тяжести?

И он ну прям гуёвый такой, мышевозный.

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

Я глянул: Иксовый ресурс URxvt.pasteCommand (равно как и URxvt.copyCommand), видимо, читается каким-то urxvt-шным расширением, которое у тебя не установлено, и которое не входит в штатную поставку urxvt. Поэтому или гугли что это за расширение и где его взять, либо переходи на другой терминал.

Кстати, urxvt — нормальный терминал с расширениями на перле, но время его прошло. Не из-за перла, а из-за иксов. Переезд на вайланд надвигается медленно, но неизбежно.

debugger ★★★★★
()
Ответ на: комментарий от andreyu

Видимо речь про расширения для urxvt, которые написаны на пайтоне.

Что за публика тут собралась? Один путает иксовые ресурсы с перлом, второй — перл с питоном… Куда катится мир?

debugger ★★★★★
()
Ответ на: комментарий от debugger

Да слушай, ну чё нудеть. Не видел я перла, подумал что там знаки восклицательные тоже, я их особенно не встречал в конфигах, мб не обращал внимания. С иксами пару лет вожусь, не бей.

Вот теперь увидел перла. Написал патч на этот confirm-paste.

Достаточно бородат теперь?) Невозможно всё знать, зато можно быстро адаптироваться.

Вот патчик для /usr/lib/urxvt/perl/confirm-paste

Патчится функция key_press. Во второй if докинул немного -

Так вот было:

} elsif ($keysym == 112) { # p
      $self->tt_paste ($$paste);
      $self->leave;

А так стало:

my $paste = $$paste;
      $paste =~ s/[\x0d]/ /g;
      $self->tt_paste ($paste);

Вот функция целиком

sub key_press {
   my ($self, $event, $keysym, $string) =  @_;

   my $paste = delete $self->{paste};

   if ($keysym == 121) { # y
      my $paste = $$paste;
      $paste =~ s/[\x00-\x1f]+/ /g;
      $self->tt_paste ($paste);
      $self->leave;
   } elsif ($keysym == 112) { # p
      my $paste = $$paste;
      $paste =~ s/[\x0d]/ /g;
      $self->tt_paste ($paste);
      $self->leave;
   } elsif ($keysym == 110) { # n
      $self->leave;
   }

   $self->{paste} = $paste;

   1
}

Закоммитить чтоль пуллреквеста? Как думаешь?

Cobbrat
() автор топика
Ответ на: комментарий от Cobbrat

Закоммитить чтоль пуллреквеста?

Если подобного «фикса» до сих пор нет в исходниках - вероятнее всего подобная проблема только у тебя. Правильнее было бы найти откуда эти переносы строки берутся и там пофиксить, а не делать подмену уже постфактум в urxvt.

iron ★★★★★
()
Ответ на: комментарий от Cobbrat

Да слушай, ну чё нудеть.

Занудство — характерная черта профессионального программиста. Когда от тебя требуется написание текста (программ) по очень строгим для обычного человека правилам, поневоле становишься занудой.

Закоммитить чтоль пуллреквеста? Как думаешь?

Для домашнего применения пойдёт, а в апстрим я бы такой патч не принял:

  1. $paste =~ s/[\x0d]/ /g; — это, мягко говоря, странное решение. (Квадратные скобки там не в темую.) Почему ты заменяешь CR на пробел? Не лучше ли заменять CRLF на LF?

  2. Плагин называется «confirm-paste» — его задача получать от пользователя подтверждение, а не фиксить содержимое буфера.

Но я отношения к urxvt не имею, поэтому делать PR или не делать — решай сам.

debugger ★★★★★
()