LINUX.ORG.RU

Посоветуйте терминал/фичу

 , , ,


0

1

Всем привет,

Как обычно захотелось странного. Имеется: терминал, в нем запускается некий скрипт который пишет в stdout, то есть в само же окно терминала. Необходимо скопировать одну или несколько строк из этого вывода не используя мышь желательно с помощью кнопок vi-style.

Как мне видится эта реализация: 1. После того как скрипт вывел на экран инфу я нажимаю некое сочетание клавиш и вхожу в определенный режим.

Дальше на выбор:

2.1. Все видимые строки на терминале маркируются числами я ввожу число (например 2) и нажимаю что то типа y и строка отправляет в буфер обмена. Либо я ввожу интервал: 2-10, соот-но строки со второй по десятую копируются.

2.2. Вариант менее идеальный: с помощью hjkl я выбираю строку, нажимаю yy — строка копируется.

Если еще будет вариант применить некоторую команду на выбранную строку, типа запустить такой то скрипт передав строку в качестве аргумента — будет вообще круть.

На данный момент я использую xterm + tmux + bash. Но, разумеется открыт к любым предложениям, однако не совсем готов отказаться от bash.


я использую xterm + tmux + bash

https://duckduckgo.com/?q=tmux copy paste

Вот вроде пишут, как вимоподобное настроить:

Tmux Vim-bindings for copying into tmux buffer



Adding configuration described in this section will give you easier shortcuts for copy-pasting in Tmux. Moreover, these shortcuts work very similar to Vim’s copy-pasting shortcuts!

Add these lines in a file by name ~/.tmux.conf.

bind P paste-buffer
bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection
bind-key -t vi-copy 'r' rectangle-toggle

Note that for a newer tmux version (2.4 and above I think, not sure), the last three lines should be replaced with:

bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection
bind-key -T copy-mode-vi r send-keys -X rectangle-toggle

Now you can enter copy mode by pressing CTRL+b,[, and then go to start point, press ‘v’ and start copying. After you have selected text you want to copy, you can just press ‘y’ (or the default ‘enter’ key) to copy the text into Tmux’s buffer. This is exactly the commands you would use in Vim to copy text.

To paste, press CTRL+b,P. Note that it’s capital ‘p’ (i.e. SHIFT+p). This again is similar to Vim’s shortcut ‘p’ for paste, though not exactly similar. You’ll realize in your Tmux journey why didn’t we use a small ‘p’ instead of a capital ‘P’ ;)

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

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

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

У меня так:
1. Входишь в режим - у меня двойной Alt+;
2. С помощью hjkl я выбираю строку, как ты и хочешь в п 2. Но работает и что-то типа 5k - на пять строчек вверх - похоже на то, что ты хочешь в п 1.
3. vim'овская комбинация Shift+V y (выделить строку, скопировать)
Интервалы как и в vim: Shift+V 3j y (выделить строку, 3три сторик вниз, скопировать)

yy — строка копируется.

В vim скопировать строку - Shift+Y. В tmux такое в конфиге можно прописать (хм, нужно будет себе сделать)

Оно?

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

Ну почти, просто вот эти вот все относительные интервалы (три строки вниз, три строки вверх)... Это ж надо считать. Куда как проще было бы просто вбить номер или интервал.

То есть хочется вместо того что вы предлагаете, вот такое:

1. Входишь в режим - у меня двойной Alt+; (при этом рядом со строками появляются числа). 2. Набиваешь число (интервал). 3. Строка в буфере.

alex07 ()

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

alex07 ()
Ответ на: комментарий от Zubok

Согласен со всем предыдущим комментарием.

А в чем необходимость такого поведения? Что за задача такая?

Вот типичный кейс:

root@xatitude:~# /convert.py test.pdf
Work path: /root/ocr_work
Jpg path: /root/ocr_work/jpgs
Traceback (most recent call last):
  File "/convert.py", line 45, in <module>
    jpg_files = pdf2jpg(pdf_file, jpg_path)
  File "/convert.py", line 9, in pdf2jpg
    with Img(filename=pdf_file, resolution=300) as img:
  File "/usr/local/lib/python3.4/dist-packages/wand/image.py", line 2744, in __init__
    self.read(filename=filename, resolution=resolution)
  File "/usr/local/lib/python3.4/dist-packages/wand/image.py", line 2822, in read
    self.raise_exception()
  File "/usr/local/lib/python3.4/dist-packages/wand/resource.py", line 222, in raise_exception
    raise e
wand.exceptions.PolicyError: not authorized `test.pdf' @ error/constitute.c/ReadImage/454
Exception ignored in: <bound method Image.__del__ of <wand.image.Image: (empty)>>
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/wand/resource.py", line 232, in __del__
  File "/usr/local/lib/python3.4/dist-packages/wand/image.py", line 2767, in destroy
TypeError: object of type 'NoneType' has no len()
root@xatitude:~# exit
[xand@xatitude ocr_pdf2txt]$

Вот эту строку я хочу поместить в буфер обмена максимально быстро:

wand.exceptions.PolicyError: not authorized `test.pdf' @ error/constitute.c/ReadImage/454

Я кстати не могу поверить что я единственный кто с этим сталкивается.

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

Ну и то есть ладно что там надо несколько комбинаций нажать, но даже в vi-mode как быстро понять сколько строк мне надо отмотать чтобы курсор на нужной оказался.

Короче не... баловство это все.

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

Вот эту строку я хочу поместить в буфер обмена максимально быстро:

Ну, в screen тоже можно копировать, но это тоже не удовлетворяет твоим требованиям. Я так понимаю, что такая же функциональность и в tmux (я им не пользовался никогда). Но это и так ты можешь.

       Repeat count:
           Any of these commands can be prefixed with a repeat count number by
           pressing digits
         0..9 which is taken as a repeat count.
           Example:  "C-a  C-[  H  10 j 5 Y" will copy lines 11 to 15 into the
           paste buffer.
Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Example: «C-a C-[ H 10 j 5 Y» will copy lines 11 to 15

Ну вот как эту издевку понимать? То есть я сначала должен посчитать строки а затем отдать команду?

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

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

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

В порядке пятницы в субботу и вообще веществ: возможно, даже ловчее было бы вовсе не целиться в строки по номерам или тем более считать их, а в bash-completion иметь автодополнение из предыдущего вывода. Ну то есть в твоём примере «wan» → Tab → вставилась строка.

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

Я кстати не могу поверить что я единственный кто с этим сталкивается.

А ты и не верь. На ЛОРе всегда так. Все делают вид что им «это не надо» и «зачем?». Типа ты дурачёк и тд и тп.

Deleted ()
Ответ на: комментарий от alex07

Ну вот как эту издевку понимать? То есть я сначала должен посчитать строки а затем отдать команду?

Ну разумеется! :)

В качестве идеи в воздух: Если в screen разбить область вертикально (C-a+|), потом задать левому буферу ширину 3 (С-a : resize 3, все это можно статически в конфиге потом задать), а потом закинуть туда вертикальные номера (с запасом на случай fullscreen) в виде текстового файла, который там статически будет показываться, то получится как бы нумерация. :)

UPD . С переносами будет жопа только.

Я не видел никогда штатной нумерации в screen и думаю, что ее нет.

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

Вот эту строку я хочу поместить в буфер обмена максимально быстро:
wand.exceptions.PolicyError: not authorized `test.pdf' @ error/constitute.c/ReadImage/454

Для таких ситуаций есть ? - поиск вверх. И в vim и в tmux.
Переходишь в режим, ?, «exceptions» и далее копируешь.

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

В качестве идеи в воздух: Если в screen разбить область вертикально (C-a+|), потом задать левому буферу ширину 3 (С-a : resize 3, все это можно статически в конфиге потом задать), а потом закинуть туда вертикальные номера

Сейчас сделал (да пока для начала просто тупо less туда нумерацию вывел) и вроде ок. Сразу видно номер строки, которую копировать. В tmux, полагаю, такое тоже можно сделать.

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

А ты и не верь. На ЛОРе всегда так. Все делают вид что им «это не надо» и «зачем?». Типа ты дурачёк и тд и тп.

А ведь и не поспоришь.

Переходишь в режим, ?, «exceptions» и далее копируешь.

Похоже мы с вами друг друга не понимаем. Я не хочу ни считать, ни что то набирать. Я хочу чтобы ЭВМ вывел мне последовательность клавиш на которые надо нажать чтобы скопировалась видимая часть терминала в буфер обмена.

Неужели я настолько плохо объясняю?

В tmux, полагаю, такое тоже можно сделать.

Нельзя, я уже прочитал мануал и пишу свою утилиту.

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

Разве там нельзя вертикально разбить область? Мне всегда казалось, что там то же, что и в GNU screen можно сделать.

UPD: Не то?

Ctrl+b % — split pane vertically.

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

Ctrl+b % — split pane vertically.

Ну да, это разбивает текущее окно на два других. Я имел в виду что нельзя сделать нумерацию строк.

Сорри, туплю. Да, можно разбить окно на два и во втором окне отобразить нумерацию. Только вот не факт что оно совпадет, но задумка как бы интересная, да.

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

Ну это костыльное решение, конечно, но не сильно. Я у себя сделал, но начал нумерацию с 0, так как номер в командах там на 1 меньше реальной строки. И вроде как работает. Можно вместо текстового файла однострочником генерировать столбец цифр и закидывать в буфер и загнать это все в конфигурацию tmux.

Проблема только если есть перенос строки. Нумерация не может отследить это место, поэтому одна строка займет несколько смежных номеров. Если не использовать перенос, то вроде все должно быть ок. Кривотень, да. Ну раз нет нумерации, то что делать?

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

Ну я вот прямо сейчас пишу на пайтон скрипт который вызывается по шорткату.

Делает следующее: 1. Из tmux получает всю видимую в данный момент часть. 2. Парсит по строчкам и хэширует их. 3. Открывает в том же tmux рядом еще одно окно и показывает то что напарсил. В этот момент строки показываются уже пронумероваными. 4. Ждет инпута от юзера с номером строки которую надо скопировать.

Я тут еще подумал, что раз уж я так делаю, к черту номера. Пусть все будет на удобных клавишах вроде h/j/k/l/a/s/d/f, по принципу vimium, чтобы далеко тянуться не надо было.

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

Ну ок. Чтобы хоть какое-то решение осталось, то вот что у меня получилось в GNU screen. Сделал колоночку с номерами, подал последовательность комбинаций на копирование строчки №6 и вставил ее из буфера после приглашения.

https://imgur.com/a/qv6FIJj

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

Ну в общем то готово:

https://gitlab.com/xand/tmux-helpers

Оно конечно все через жопу местами, но все функции на данном этапе выполняет. Надо немного доработать чтобы удобные комбинации присваивались не сверху вниз, а снизу вверх. Ну и параметризировать там все нормально.

Получается через C-b y открывается вот такая вот штука в соседнем окне tmux: https://imgur.com/a/GSLL0wU

Дальше ждем ввода от юзера с этикеткой и кнопкой 'y' подтверждаем ввод. Читаем tty в реальном времени чтобы без всяких энтеров в конце и проч.

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

Оно конечно все через жопу местами, но все функции на данном этапе выполняет.

Ну, в принципе, даже не ясно, что ты получил и что в начале вообще хотел. Вот, например, тот вариант 2), который ты назвал «менее идеальным», но он был, я так понимаю, приемлемым - это по сути то, что делает GNU screen в режиме копирования из коробки:

1. C-a ESC или C-a [ - переход в режим копирования.

2. hjkl перемещение по тексту + есть листание страниц.

3. <Y> - копирование строчки (ты хотел yy).

4. Вставка C-a ].

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

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

Надо бы еще доработать чтобы можно было интервал строк брать.

Если говорить грубо то вместо:

1. C-a ESC или C-a [ - переход в режим копирования.

2. hjkl перемещение по тексту + есть листание страниц.

3. <Y> - копирование строчки (ты хотел yy).

4. Вставка C-a ].

у меня получается

1. C-b y -- вывод нумерованых строк в отдельное окно.

2. xx y -- где хх это индекс строки, загрузка строки в буфер.

Выкинуть эти дурацкие перемещения — основной бонус.

alex07 ()