аналог zenity/kdialog для консоли (есть ли такое?)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

аналог zenity/kdialog для консоли

Сообщение t.t »

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

Код: Выделить всё

apt-file -l search filename | select --list | xargs apt-cache show
и в промежутке выбрать вручную один или несколько файлов в каком-нибудь простеньком ncurses-интерфейсе; а не копировать-вставлять или перебивать руками пункты из списка, который и в экран может не влезть.

Сам искал неоднократно, но может я как-то не так ищу… А то уже даже возникают мысли самому начать что-то такое писать, но велосипедов изобретать не хочется.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: аналог zenity/kdialog для консоли

Сообщение /dev/random »

Shell

ls | sed 's/$/\n.\non/' | xargs dialog --stdout --separate-output --checklist title 0 0 0 > /tmp/list

Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: аналог zenity/kdialog для консоли

Сообщение t.t »

В dialog меня, помнится, многое не устраивало. Навскидку — хотелось бы обрабоки escape-последовательностей для цветов и пр. (как в выводе ls -1CF --color=always, например), а не собственного раскрашивания. Сейчас поздно уже, завтра постараюсь ещё вспомнить. Но в целом: как можно больше принимающей снаружи и как можно меньше подкручивающей внутри.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: аналог zenity/kdialog для консоли

Сообщение ZyX »

/dev/random писал(а):
17.12.2010 23:40

Shell

ls | sed 's/$/\n.\non/' | xargs dialog --stdout --separate-output --checklist title 0 0 0 > /tmp/list


Как всегда, не поддерживает пробелы в именах файлов (не говоря уж о новых строках, для которых пришлось бы удалять --separate-output). Решение на zsh, не имеющее таких проблем:

zyx@zyx-desktop

dialog --stdout --separate-output --checklist title 0 0 0 *(oNe:'reply=( $REPLY . on )':)


Делает то же самое, но не имеет проблем с пробелами, только с «\n» внутри имени выбранного файла (впрочем, в отличие от пробелов, это в живой природе не встречается).
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: аналог zenity/kdialog для консоли

Сообщение /dev/random »

ZyX писал(а):
18.12.2010 00:19
Как всегда, не поддерживает пробелы в именах файлов (не говоря уж о новых строках, для которых пришлось бы удалять --separate-output). Решение на zsh, не имеющее таких проблем:

zyx@zyx-desktop

dialog --stdout --separate-output --checklist title 0 0 0 *(oNe:'reply=( $REPLY . on )':)


Делает то же самое, но не имеет проблем с пробелами, только с «\n» внутри имени выбранного файла (впрочем, в отличие от пробелов, это в живой природе не встречается).


Проблемы с пробелами решаются так:

Shell

ls | sed 's/$/\n.\non/' | xargs -d$'\n' dialog --stdout --separate-output --checklist title 0 0 0 > /tmp/list



Но в любом случае, t.t уже сказал, что ему dialog не подходит.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: аналог zenity/kdialog для консоли

Сообщение t.t »

Перечитал сейчас свой первый пост; я, видимо, с устатку недостаточно чётко сформулировал. Хочется чего-то максимально прозрачного. Начиная от мелочей вроде молчаливого выхода при пустом stdin (не загораживая вывалившийся stderr), возможности при наличии единственного пункта на входе молчаливого же его выбора и передачи дальше (без промежуточного вывода чего бы то ни было); и заканчивая полным неискажением внешнего вида подаваемой информации (грубо говоря, как less, но интерактивное) и гибкой настройкой, что в ней считать разделителями при выборе. Раз тут упомянули zsh, то из того, что я видел, наиболее близко к желаемому курсорчик, выскакивающий там на достаточно длинном списке при автодополнении.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: аналог zenity/kdialog для консоли

Сообщение sash-kan »

t.t
я бы в такой ситуации (редактирование потока данных в промежутке между программами), воспользовался бы vipe-м из moreutils.
да, большинству озвученных требований не удовлетворяет. но, возможно, сгодится хотя бы в качестве варианта, с чего можно начинать делать что-то своё уникальное.
p.s. это коротенький perl-скрипт. ничего «военного».
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: аналог zenity/kdialog для консоли

Сообщение t.t »

sash-kan писал(а):
18.12.2010 15:23
t.t
я бы в такой ситуации (редактирование потока данных в промежутке между программами), воспользовался бы vipe-м из moreutils.
да, большинству озвученных требований не удовлетворяет. но, возможно, сгодится хотя бы в качестве варианта, с чего можно начинать делать что-то своё уникальное.
p.s. это коротенький perl-скрипт. ничего «военного».
Спасибо, посмотрю. Хотя на предмет «с чего начать» у меня уже кое-какие мысли появились.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: аналог zenity/kdialog для консоли

Сообщение t.t »

Посмотрел. Это совсем не то. То, что там, на shell в одну строчку пишется. Огрубляя, примерно вот так:

Код: Выделить всё

f=$(mktemp)
tee $f &>/dev/null && $EDITOR $f && cat $f
rm -f $f
Кроме этого там только несколько дополнительных проверок.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: аналог zenity/kdialog для консоли

Сообщение watashiwa_daredeska »

Не совсем select, но… vipe из пакета moreutils.
SYNOPSIS
command1 | vipe | command2

DESCRIPTION
vipe allows you to run your editor in the middle of a unix pipeline and edit the data that is being piped between
programs.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: аналог zenity/kdialog для консоли

Сообщение t.t »

watashiwa_daredeska, см. постом выше.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: аналог zenity/kdialog для консоли

Сообщение Portnov »

Я уже упоминал тут свой скрипт для похожих целей... достойный аналог Total commander
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: аналог zenity/kdialog для консоли

Сообщение t.t »

Portnov писал(а):
22.12.2010 12:16
Я уже упоминал тут свой скрипт для похожих целей... достойный аналог Total commander
Так ведь снова dialog… Уж очень у него интерфейс аляповатый и перегруженный. Зачем все эти рамочки, фончики-разноцветности? Куда интереснее возможность сделать разноцветным сам список (уж отфильтровать потом цветовые коды из вывода — дело техники). Впрочем, я уже смирился, что нет такого.

Хотя мне это и странно. Ведь отсутствие интерактивности в традиционных утилитах unix продиктовано техническими ограничениями тех времён — мне непонятно, почему интерактивность и юниксвейность до сих пор лежат в разных плоскостях. Сильнее всех продвинулись на пути их сближения авторы zsh, но и это чрезвычайно мало. Да и как-то в zsh всё слишком уж по-своему; я давно к bash привык, неохота уже сейчас переучиваться.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: аналог zenity/kdialog для консоли

Сообщение /dev/random »

t.t писал(а):
22.12.2010 12:57
мне непонятно, почему интерактивность и юниксвейность до сих пор лежат в разных плоскостях.

Потому что юниксвейность - это когда для выполнения большой и длительной задачи дал одну команду и ушёл пить чай. А гуёвость - это когда дал команду и сидишь целый час, отвечаешь да/нет.
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: аналог zenity/kdialog для консоли

Сообщение Portnov »

Ну, скажем, cp -i — это юниксвей? Вроде да. Но можно было бы какие-нибудь более удобные средства предусмотреть для указания ответов Ну, хотя бы добавить к Y/N варианты «Y для этого файла и всех последующих», а то и «Y для всех файлов того же типа» или что-нибудь такое. И возможность вернуться к предыдущим вопросам («ой, я там Y нажал, а хотел N»).
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: аналог zenity/kdialog для консоли

Сообщение t.t »

/dev/random писал(а):
23.12.2010 01:52
t.t писал(а):
22.12.2010 12:57
мне непонятно, почему интерактивность и юниксвейность до сих пор лежат в разных плоскостях.
Потому что юниксвейность - это когда для выполнения большой и длительной задачи дал одну команду и ушёл пить чай. А гуёвость - это когда дал команду и сидишь целый час, отвечаешь да/нет.
Вот, ты тоже интерактивность с назойливостью путаешь. Интерактивность — это когда система тебя спрашивает о чём-то когда ты её сам об это попросил, а не когда ей вздумается. Я говорю о несколько даже более частном случае: когда ты наперёд даже не догадываешься, какие будут промежуточные результаты. Причём чаще всего предшествующее действие при этом не особо долгое, а вот последующее может затянуться. Т.е. сформировал список автоматически, выбрал нужное вручную и тогда уже пошёл пить чай. Грубый пример: cat sitelist | wget -r -l1 -i- -O- | grep -o 'http://[^<]*\.tgz' | select | wget -i-
Страницы со списками скачаются за считанные минуты, а скачивание архивов займёт часы.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Heimdall
Сообщения: 25

Re: аналог zenity/kdialog для консоли

Сообщение Heimdall »

t.t писал(а):
17.12.2010 23:23
простеньком ncurses-интерфейсе
А то уже даже возникают мысли самому начать что-то такое писать, но велосипедов изобретать не хочется.

Вот и мне, кстати, dialog не нравится. Недавно решил освоить perl, поэтому велосипеды мне изобретать можно - полезно в учении. Вот - только что попробовал сделать:

Код:

#!/usr/bin/perl use Curses::UI; use Getopt::Long; #{{{опции GetOptions ( "c|checkall" => \$checkall, "s|separator=s" =>\$/, ); #}}} #{{{чтение и дескрипторы #читаем список my $counter = 0; while(<>) { push @vals, $_ unless (/\A\s\Z/); %labs = (%labs,$counter++,$_) unless (/\A\s\Z/) ; } #нет ничего вообще exit 0 unless @vals; if ($checkall){ #только одна отмеченная опция if(@vals == 1){ print $vals[0]; exit 0; } %sel_labs = %labs; } close STDIN; #теперь STDIN для curses open(STDIN,"</dev/tty") || die "$0: reopen stdin: $?\n"; #сюда пошлем результаты open(TEXTOUT,">&STDOUT"); close STDOUT; #вывод curses в терминал open(STDOUT,">/dev/tty") || die "$0: reopen stdin: $?\n"; #}}} #{{{curses my $cui = new Curses::UI( -clear_on_exit => 1, ); my $win = $cui->add('window','Window'); my $list = $win->add( 'list','Listbox', -values => \@vals, -labels => \%labs, -selected => \%sel_labs, -multi => 1, ); $list->focus(); #}}} #{{{привязки клавиш sub done() { $cui->leave_curses(); @results = $list->id(); close STDOUT; foreach $key (sort {$a <=> $b} @results) { print TEXTOUT $labs{$key}; } exit 0; } $cui->set_binding(sub {exit(130);},"\cC"); $cui->set_binding(\&done,Curses->KEY_ENTER()); #}}} $cui->mainloop(); # vim: foldmethod=marker

Проблема в цветах.

Код:

ls --color=always -1 | ./dia.pl

выдает в итоге синие имена отмеченных директорий, как и надо, а в listbox показывает escape последовательности

Код:

^[[01;34mDesktop^[[0m

Может кто-нибудь знает как с этим бороться с наименьшими трудозатратами (т.е. не переводя в ручную ^[[01;34 в синий, а дальше Curses::UI:Color)?
Спасибо сказали:
Heimdall
Сообщения: 25

Re: аналог zenity/kdialog для консоли

Сообщение Heimdall »

Heimdall писал(а):
23.12.2010 22:11
Может кто-нибудь знает как с этим бороться с наименьшими трудозатратами (т.е. не переводя в ручную ^[[01;34 в синий, а дальше Curses::UI:Color)?

Я поспешил. На Curses::UI:Listbox не получится избавиться от жирного шрифта выделенных элементов и раскрасить отдельно каждый элемент. Надо либо немного переделать Curses::UI:Listbox, либо переделать на модуле Curses без оберток к нему. Как, интересно, сделать лучше?
Действительно странно, что нет (по крайней мере известной) подобной программы сохраняющей цвет текста на всех этапах работы.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: аналог zenity/kdialog для консоли

Сообщение t.t »

У listbox-а из curses-ui-perl есть ещё один недостаток: если пункты списка не влезают в экран, то прокрутить вправо и посмотреть, что там, он не даёт. Кроме того, в идеале хотелось бы добавлять по мере сил и более продвинутые возможности. Например, по мере ввода букв перескок на начинающиеся с них строки, а при вводе начиная с заглавной буквы — выбора всего, что на вводимые буквы начинается. Или вывода в несколько колонок и выбора по ним. Причём хотелось бы ещё большей «невидимости», т.е. даже без чекбоксов. Чтобы можно было просто читать текст и при необходимости по ходу что-то выбрать. Как при этом реализовать множественный выбор я, правда, ещё не придумал (с единичным понятно).
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Heimdall
Сообщения: 25

Re: аналог zenity/kdialog для консоли

Сообщение Heimdall »

t.t писал(а):
24.12.2010 11:03
Например, по мере ввода букв перескок на начинающиеся с них строки, а при вводе начиная с заглавной буквы — выбора всего, что на вводимые буквы начинается.
Это в listbox реализуемо, вроде бы.
t.t писал(а):
24.12.2010 11:03
Причём хотелось бы ещё большей «невидимости», т.е. даже без чекбоксов. Чтобы можно было просто читать текст и при необходимости по ходу что-то выбрать.

А как понять в таком случае что выбрано и сохранить цвета и другие атрибуты. К примеру, директория - синий жирный цвет, а отмеченная директория, если, допустим, inverse это текущий элемент под курсором? Остается blink или underline. blink раздражает думаю не только меня. Разве что underline?
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: аналог zenity/kdialog для консоли

Сообщение t.t »

Ещё можно цветом фона выделять. Опять же, в идеале — настройку/опцию: либо фон, либо подчёркивание.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
liaonau
Сообщения: 390
ОС: gentoo

Re: аналог zenity/kdialog для консоли

Сообщение liaonau »

t.t писал(а):
17.12.2010 23:23
Не первый уже раз возникает нужда в такой программе. Чтобы можно было написать что-то вроде (простейший пример, только что пришедший в голову)

Код: Выделить всё

apt-file -l search filename | select --list | xargs apt-cache show
и в промежутке выбрать вручную один или несколько файлов в каком-нибудь простеньком ncurses-интерфейсе; а не копировать-вставлять или перебивать руками пункты из списка, который и в экран может не влезть.

Сам искал неоднократно, но может я как-то не так ищу… А то уже даже возникают мысли самому начать что-то такое писать, но велосипедов изобретать не хочется.

Я тоже хочу чего-то похожего. Это, например, позволит окончательно не пользоваться файловым менеджером — единственное зачем он нужен, это выбор подмножества никак не выделяемого автоматически.
Собственно вот, может быть кому-нибудь интересно: https://github.com/liaonau/diaperlog. Что умеет:
Выводит в несколько колонок или в одну.
Прокручивает строку, если она не вмещается в терминале.
Опционально (хоткеями) включает/выключает выделение выбранного цветом (цвет задается -f и -b), подчеркиванием и префиксом «[x]» («[o]» для радиобокса).
Опционально отображает номера строк.
Табуляцию показывает символом «·» (настраивается -t).
Разделитель записей задается -s, можно выводить результат \x{0} а не "\n" (-0).
По элементам перемещается в том числе в стиле vim.
Зачатки поиска, в том числе автоматическая отметка найденого.
Молча выходит если ничего не прочитал. Молча передает дальше элемент, если он один и задана опция -i (отметить все изначально).

Хм. Сумбурно получилось рассказать. Если кому-то интересно, то критикуйте. Еще, конечно, много можно сделать.

Чего нет. Нет unicode в поиске — в перловском Curses нет get_wch, а только getch. Может кто-нибудь знает, как это побороть?
Нет цветов (escape коды просто вырезаются. Кстати, не посоветует ли кто-нибудь regexp точно соответствующий им и ничему более?). Не знаю стоит ли реализовывать. Перевод эскейпов в COLOR_PAIR довольно нудная штука, а пользы, по моему, не так уж много.
Нет подсветки найденного.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: аналог zenity/kdialog для консоли

Сообщение t.t »

У меня при вызове в конвейере diaperlog "показывает" пустой чёрный экран и выходит по enter.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
liaonau
Сообщения: 390
ОС: gentoo

Re: аналог zenity/kdialog для консоли

Сообщение liaonau »

t.t писал(а):
08.09.2011 23:15
У меня при вызове в конвейере diaperlog "показывает" пустой чёрный экран и выходит по enter.

А без конвейера, если вызывать «diaperlog имя/файла», то все нормально? Все равно что за текст на входе конвейера? Просто я не могу воспроизвести у себя. Может это не пустой черный экран, а текст черного цвета на нем? Тогда что будет если нажать пробел, а потом ввод?
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: аналог zenity/kdialog для консоли

Сообщение t.t »

Вы правы, выделение пробелом и перемещение курсора (по крайней мере, стрелка вниз) работает. Вполне возможно, что действительно чёрный текст на чёрном фоне.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
liaonau
Сообщения: 390
ОС: gentoo

Re: аналог zenity/kdialog для консоли

Сообщение liaonau »

Это зависит от терминала? Например, в виртуальной консоли то же самое? Это такой standend() по идее. Значит такая нулевая пара цветов, наверное. Замените вот это, пожалуйста:

Код: Выделить всё

if (use_default_colors() == 0) {
  $dfg = -1; $dbg = -1;
}
else {
  pair_content(0,$dfg,$dbg);
}

просто на
pair_content(0,$dfg,$dbg);
Изменится ли что-нибудь?
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: аналог zenity/kdialog для консоли

Сообщение t.t »

liaonau писал(а):
10.09.2011 00:25
Это зависит от терминала? Например, в виртуальной консоли то же самое?
То же самое.

liaonau писал(а):
10.09.2011 00:25
Это такой standend() по идее. Значит такая нулевая пара цветов, наверное. Замените вот это, пожалуйста:

Код: Выделить всё

if (use_default_colors() == 0) {
  $dfg = -1; $dbg = -1;
}
else {
  pair_content(0,$dfg,$dbg);
}

просто на
pair_content(0,$dfg,$dbg);
Изменится ли что-нибудь?
Нет, ничего не изменилось.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: