LINUX.ORG.RU

Копировать в буфер иксов из редактора Midnight Commander

 , ,


0

3

Редактор запущен в консоли. Для определённости — Konqueror. Чтобы скопировать текст из консоли в другую программу через буфер, его надо выделить мышью.

Но текст в редакторе MC можно выделять и стрелками с шифтом или через F3 и Shift-F3. Есть даже команда для копирования этого выделения в буфер обмена, но это свой отдельный буфер ~/.cache/mc/mcedit/mcedit.clip. В баг-трекере есть 2 просьбы использовать общеиксовый буфер, одна помечена как выполненная, но требует громоздить пирамиду костылей, другая висит 11 лет без изменений:
https://midnight-commander.org/ticket/30
https://midnight-commander.org/ticket/3081

Как пользоваться иксовым буфером обмена? Существует ли способ проще, чем по ссылкам?

★★★★★

Конечно, назначить на f4 редактор vi и не парится. Так же можно заместо mc поставить far, который лучше всем. Там тоже нет проблем.

vtVitus ★★★★★
()

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

Идея из консольной проги лезть в искы - сама по себе костыль (нафиг такое делать вообще), что ты хотел то?

Отдельный буфер в файле очень даже удобен. И в отличие от иксов он привязан к системе а не в гуи, то есть будет вести себя очевидно и прозрачно в mc, запущеном через ssh.

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

Нормальный редактор (который как раз встроенный и есть) я ставлю каждый раз при запуске mc на новой системе/в новом юзере, т.к. по крайней мере дебиановский его пакет ставит дефолтом всякую чушь в виде запуска внешней проги, видимо твои идейные сообщники.

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

Идея из консольной проги лезть в искы

Иксы :)

сама по себе костыль

Авторы и пользователи ViM, Emacs и FAR считают иначе :) Иначе бы не было функции выделения текста в эмуляторах терминала, начиная с xterm.

(нафиг такое делать вообще),

Вместо долгого прицеливания мышью — один шорткат.

что ты хотел то?

Узнать, что изменилось за 11 лет.

Отдельный буфер в файле очень даже удобен. И в отличие от иксов он привязан к системе а не в гуи, то есть будет вести себя очевидно и прозрачно в mc, запущеном через ssh.

По ссылке описано автоматическое переключение, если MC видит, что запущен в иксах.

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

Это не оно?

Спасибо. Только как его автоматически отключать, когда нет иксов? И как разрешать конфликт, если эмулятор терминала тоже использует Ctrl-Ins и Shift-Ins?

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

Мой пока несуществующий патч. :)
Если делать, то нормально, как в Win-Far3:

  • поддержка системного буфера обмена не только в редакторе, но и для другого использования
  • это должна быть опция?
  • или отдельная команда?
  • если опция, то общая в mc или только в редакторе?
dataman ★★★★★
()
Ответ на: комментарий от question4

Спасибо. Только как его автоматически отключать, когда нет иксов?

А зачем отключать? Ну не получится у xclip скопировать/вставить, ну и ладно.

И как разрешать конфликт, если эмулятор терминала тоже использует Ctrl-Ins и Shift-Ins?

Вот тут точно не скажу. У меня, вроде, Shift-Ins как раз терминал обрабатывает (что правильно, если Ctrl+Ins копирует в системный буфер). А Ctrl+Ins, видимо, обрабатывает mc (раз выделенное по F3 копируется в системный буфер).

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

поддержка системного буфера обмена не только в редакторе, но и для другого использования

Разумеется.

это должна быть опция? или отдельная команда?

В смысле? Опция, чтобы переключать Ctrl/Shift-Ins на иксовый буфер, либо отдельные команды для иксового буфера? Тогда опция.

И надо решить, что делать, чтобы эта команда могла продолжать работать в bash-е при отключении панелей.

если опция, то общая в mc или только в редакторе?

Общая.

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

Какой консольный редактор так умеет?

https://craigbarnes.gitlab.io/dte/

Modern terminal support:

  • Dynamic feature queries (no terminfo database or curses library needed)
  • 24-bit RGB colors
  • OSC 52 clipboard copy (works over SSH)
  • Kitty keyboard protocol (more key combos available for binding)
  • xterm’s modifyOtherKeys keyboard protocol
  • «synchronized updates» (helps eliminate screen tearing)

Кусочек моего конфига ~/.dte/rc:

bind M-b   'match-bracket'
bind C-b   'select -k'
bind M-S-a 'show alias'
bind M-S-b 'show bind'
bind M-S-c 'show color'
bind M-S-e 'show errorfmt'
bind M-S-f 'show ft'
bind M-S-i 'show include'
bind M-S-o 'show option'
bind M-S-w 'show wsplit'
bind M-S-j join

bind tab   'shift 1'
bind S-tab 'shift -- -1'

bind C-down 'blkdown'
bind C-up   'blkup'
bind C-home bof
bind C-end  eof

bind M-down 'search -H -w'
bind M-up   'search -H -r -w'

bind M-left  'prev'
bind M-right 'next'

bind C-S-down 'blkdown -c'
bind C-S-up   'blkup -c'

bind M-S-i 'case'
bind M-S-l 'case -l'
bind M-S-u 'case -u'

bind C-S-1  'case -u'
bind C-S-F1 'case -u'
bind C-S-`  'case -u'

bind C-c 'copy -ibkp'

bind M-S-s 'filter sort -b -V'
bind M-S-r 'filter sort -r -b -V'
bind M-S-t 'filter sed "s/ *$//"'

bind M-C-b 'bookmark'
bind M-C-up 'bookmark -r'
bind M-C-down 'bookmark -r'

bind M-C-? 'erase-word -s'
bind M-? 'delete-word -s'

hi linenumber blue 232
set select-cursor-char false
set statusline-right " %y (%Y),%X %u %o %E%s%b%s%n %t %p "
set show-line-numbers true

cursor insert bar #00ff00
cursor overwrite block #ff0000
cursor cmdline bar

set case-sensitive-search false
dataman ★★★★★
()
Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от question4

Иначе бы не было функции выделения текста в эмуляторах терминала, начиная с xterm

Эмулятор терминала это гуи-прога как раз и понятное дело она должна взаимодействовать с иксами.

По ссылке описано автоматическое переключение, если MC видит, что запущен в иксах.

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

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

поддержка системного буфера обмена не только в редакторе, но и для другого использования

Разумеется.

Проблема в том, что MC – кроссплатформенный. Но для Windows я делать не собираюсь. :)
Не думаю, что такой PR примут.


Хотя нужно посмотреть, поддерживает ли Виндовый терминал OSC 52.

dataman ★★★★★
()
Последнее исправление: dataman (всего исправлений: 1)

Говорят, что если в mc.keymap написать

[editor]
EditXStore = ctrl-c
EditXPaste = ctrl-v
EditXCut = ctrl-x

[input]
InputKillRegion = ctrl-x
InputXStore = alt-c
InputXPaste = ctrl-v
InputKillLine = ctrl-y

то будет копирование/вставка по crtl-c/v/x и клипборд, общий для всех запущенных копий mc.

P.S.: мопед не мой… ©

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

поддерживает ли Виндовый терминал OSC 52

Если этот символ получается при нажатии Ctrl-Ins, то нет, вроде. Хотя в последних обновлениях Windows 11 появился новый эмулятор терминала похожий на линуксовые — там, возможно, можно это настроить.

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

Если этот символ получается при нажатии Ctrl-Ins, то нет, вроде.

Нет, когда ЭТ получает OSC 52, то копирует текст в буфер обмена: https://github.com/microsoft/terminal/blob/main/src/cascadia/TerminalControl/ControlCore.cpp#L1297

    // Called when the Terminal wants to set something to the clipboard, i.e.
    // when an OSC 52 is emitted.
    void ControlCore::_terminalCopyToClipboard(wil::zwstring_view wstr)
    {
        copyToClipboard(wstr, {}, {});
    }

Короче, поддерживает с какой-то версии. :)

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

Сейчас специально изменил в настройках xclip на xclip1, чтобы сымитировать то, что команда xclip не сработала. При этом по Ctrl-+Ins фрагмент был помещён «в файл буфера обмена». А вот нажатие Shift+Ins у меня перехватывает xterm, поэтому для вставки из файла буфера обмена пришлось задействовать меню mcedit. Из меню всё сработало. Так что, думаю, эти два способа дополняют друг друга.

Beewek ★★
()

Ёпрст, реально интересная тема! Я тупой: за почти 30 лет использования mc мне ни разу не доводилось юзать mcedit для серьёзных целей. Включая копипасту в буфер. А vim и даже nano с этим легко справляются, вопросов не возникало. Но, спасибо, буду знать.

Old-Cat
()
Ответ на: комментарий от dataman

https://github.com/microsoft/terminal/blob/main/src/cascadia/TerminalControl/ControlCore.cpp#L1297

Как я понял, это и есть новый терминал, который автоматически ставится при обновлении Windows 11. На 10 и 2022 старый.

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

При желании, в режиме правки можно вставить selection средней кнопкой, а clipboard через Shift-Ins

Если selection, это выделения консоли (а не редактора), то и в mcedit можно сделать тоже самое.

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

Только с шифтом

Выделение мышью с шифтом. А вставка просто средней кнопкой или Shift-Insert. Но, выделеятся все что попадает под курсор мыши, элементы интерфейса - рамки, нумерация строк, А мышь+шифт+альт для выделения блока у меня в mcedit не работает (перетаскивается окно)

Упд, блок мышь-шифт-контрол

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

При желании, в режиме правки можно вставить selection средней кнопкой, а clipboard через Shift-Ins

Само собой. Это эквивалентно набору того же текста с клавиатуры.

Главный вопрос — про простой и удобный способ вставки в буфер. Желательно, Ctrl-Ins для единообразия с другими редакторами :)

question4 ★★★★★
() автор топика

https://midnight-commander.org

Оказалось, что я там зарегистрирован. Напишу туда. :-D

Итак, FarGroup/FarManager/far/FarRus.hlf.m4 пишет (кроме редактора):

 #Ctrl+Ins#
 Поместить помеченные имена в Буфер Обмена (при пустой командной строке).

 #Ctrl+Shift+Ins#
 Поместить помеченные имена в Буфер Обмена.

 #Alt+Shift+Ins#
 Поместить помеченные полные имена в Буфер Обмена.

 #Ctrl+Alt+Ins#
 Поместить реальные имена помеченных файлов в Буфер Обмена.

 #Ctrl+Shift+C#
 Поместить помеченные файлы в Буфер Обмена.

 #Ctrl+Shift+X#
 Вырезать помеченные файлы в Буфер Обмена.

 При копировании имён файлов с панели в буфер обмена скопированные файлы могут быть вставлены в других приложениях (Проводник и т.п.).
...
 Вставка содержимого буфера обмена (клавишами #Ctrl+V# или #Shift+Ins#) в
окно быстрого поиска производится до тех пор, пока есть совпадение.
...
$ #Командная строка#
 #Общие команды#
...
#Ctrl+Del#
 Копировать в Буфер Обмена                                #Ctrl+Ins#
 Вставить из Буфера Обмена                                #Shift+Ins#
...
 Примечания:

 1. Если командная строка пуста, #Ctrl+Ins# будет копировать имена
выбранных в панели файлов в Буфер Обмена так же, как и #Ctrl+Shift+Ins#
...
@Grabber
$ #Копирование текста с экрана#
 Копирование текста с экрана                                #Alt+Ins#

 Эта команда позволяет выбрать и поместить в Буфер Обмена любую область экрана.

 Для переключения между потоковым и блочным режимом выделения используйте #Space#.
 Для перемещения курсора используйте #клавиши управления курсором# или
нажмите #левую кнопку мыши#.
 Для выбора текста используйте #клавиши управления курсором# при нажатой #Shift#
или нажатую #левую кнопку мыши#.
 #Alt+Shift+клавиши управления курсором# уменьшают/увеличивают выделеннyю область.
 #Alt+клавиши управления курсором# перемещают выделеннyю область.
 #Enter#, #Ctrl+Ins#, #правая кнопка мыши# или двойное нажатие #левой кнопки мыши#
копируют выбранный текст в Буфер Обмена, #Ctrl+<Gray +># добавляет его к текущему содержанию Буфера Обмена.
 #Esc# отменяет пометку и завершает операцию.
 Комбинация #Ctrl+A# выделяет всю экранную область.
 Комбинация #Ctrl+U# снимает выделение.
 #Ctrl+Shift+Left# и #Ctrl+Shift+Right# - перемещение с выделением на 10 позиций по горизонтали,
 #Ctrl+Shift+Up# и #Ctrl+Shift+Down# - перемещение с выделением на 5 позиций по вертикали.
...
 Копировать содержимое текущей позиции истории                #Ctrl+C#
 в Буфер Обмена, не закрывая списка                     или #Ctrl+Ins#
dataman ★★★★★
()
Ответ на: комментарий от dataman

Тогда нужно запускать MC с параметром -d, –nomouse Disable mouse support in text version.

Я просто запускаю mc без параметров. Возможно разное поведение зависит от эмулятора терминала, у меня Tilix, а других нет. Про TTY я не говорю, это редкий для меня сценарий, там хватает mcedit.clip.

dmitry237 ★★★★
()