LINUX.ORG.RU

Работа с выводом в терминале как с текстом для последующей обработки

 


0

1

Какие вообще есть решения для этого? Чтобы безмышевозанья.

Иными словами, как программно получить данные из экранного буфера?

emacs это умеет из коробки. Запускай eshell, перенаправляй вывод терминальной команды или команд в буфер emacs и обрабатывая как хочешь.

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

Кажется, я не понимаю, чего ты хочешь.

Шо-то типа такого:

wezterm cli get-text --start-line -10000 | fzf

Только не хочу на wezterm переползать. Нужно будет запатчить lilyterm для аналогичной команды.

Не могу найти, в tmux подобное есть или нет. Вообще должно быть, потому что в tmux есть всё, tmux он почти как emacs.

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

Тот же пайп получается, только в виде «снимков» текста того что на экране в данный момент, а всё иное обрезается? А нафик оно надо? Не ну…зачем, это какой то огрызок от пайпа получается.

Если там хочется знать где курсор и всё такое то может и нужно…

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от targitaj

Ты не видишь разницу между дампом байт, отосланных в stdout/stderr и дампом содержимого текстового экрана? А она есть, и очень большая. Чтобы из первого сделать второе - надо делать почти полную реализацию эмулятора терминала (она есть как в xterm-подобных прогах так и в screen/tmux), но автор не хочет делать уже сделанное и хочет забрать этот буфер оттуда где он уже нарисован.

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

Чего ты не понял? =)

Вот тебе кейс:

$ make -j
<многабуков>
src/bla-bla/some-file.c:1360:40: warning: cast between incompatible function types
<многабуков>
src/bla-bla/some-file-2.c:256:10: warning: cast between incompatible function types
<многабуков>
$

Задача – открыть файлы с варнингами в редакторе. Не трогая мышку.

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

Прикольная штука. Я думал о таком, не смог оформить в цельную идею. Тут нужна со стороны shell скриптовая обвязка, чтобы различать вывод от разных команд. Надо попробовать реализовать.

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

В чём конкретно? Принципиально именно чтоб вывод предыдущей команды, если забыл перенаправить?

Это, думаю, от конкретного терминала зависит, есть реализация подобного, или нет.

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

Он хочет просто чтобы то что отображалось в терминале попадало к нему в буфер дабы он сам всё там парсил, вот ровно то что на экране есть то и в буфере ни больше ни меньше.

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

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от dmitry237

У wezterm и st есть готовые средства, чтобы получить содержимое буфера.

У urxvt можно переопределить команду «печати», и она будет «печатать» буфер куда надо. (Например, в файл сохранять.)

Это из того, что я пока нашел.

wandrien ★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Он хочет просто чтобы то что отображалось в терминале попадало к нему в буфер дабы он сам всё там парсил

Выделить весь буфер Ctrl-Shift-a и скопировать Ctrl-C. Например буфер окнa mc:

  Left     File     Command     Options     Right
╔══ /usr ═════════════════════════════════════[▾]═╗╔══ / ═════════════════════════════════════════[▾]═╗
║↓ n               Name                   │ Size  ║║↓ n                Name                   │ Size  ║
║..                                       │UP--DIR║║bin                                       │      7║
║bin                                      │ 106496║║boot                                      │   4096║
║include                                  │  36864║║data                                      │   4096║
║lib                                      │ 151552║║dev                                       │   4440║
║lib32                                    │   4096║║etc                                       │  12288║
║lib64                                    │      3║║home                                      │   4096║
║libexec                                  │   4096║║lib                                       │      7║
║local                                    │   4096║║lib64                                     │      7║
║sbin                                     │      3║║lost+found                                │  16384║
║share                                    │  12288║║mnt                                       │   4096║
║src                                      │   4096║║opt                                       │   4096║
║                                         │       ║║proc                                      │      0║
║                                         │       ║║root                                      │   4096║
║                                         │       ║║run                                       │    740║
║                                         │       ║║sbin                                      │      7║
║                                         │       ║║srv                                       │   4096║
║                                         │       ║║sys                                       │      0║
╟─────────────────────────────────────────────────╢╟──────────────────────────────────────────────────╢
║UP--DIR                                          ║║-> usr/bin                                        ║
╚═════════════════════════════ 224g / 251g (89%) ═╝╚══════════════════════════════ 224g / 251g (89%) ═╝
 usr $                                                                                              [^]
 1Help     2Menu     3View     4Edit     5Copy      6RenMov   7Mkdir    8Delete   9PullDn   10Quit

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

У lilyterm написано что оно на libvte-dev работает, я себе никогда терминал никуда не встраивал в смысле libvte, но мне кажется если и впиховать Lua то в в сам libvte дабы иметь возможность динамически дёргать из него и в него. Хотя может и туда и туда надо, смотря что надо дёргать.

Ща гляну чётам внтури

LINUX-ORG-RU ★★★★★
()

Использовать tmux.

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

Есть готовые плагины вроде tmux-open, но что-то свое наскриптовать достаточно просто.

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

Отлично, я повторил фишку этого чувака.)

Пойду спать с чувством выполненного долга xD

$ cat .bin/terminal-read-buffer 
#!/bin/sh
xdotool key ctrl+shift+a
xsel -o -p
$ cat .bin/terminal-copyout 
#!/bin/sh
BUFFER="`terminal-read-buffer`"

BUFFER="`echo "$BUFFER" | awk '
BEGIN {
  n = 1
  command=""
  output=""
}
function emit_command() {
  if (output != "" && command != "") {
    print ">> COMMAND << :$ [" n "] " command
    print output
    n++
  }
  command=""
  output=""
}
END {
  emit_command()
}
match($0, "^([[:alnum:]]+@[[:alnum:]]+:.+[$] )(.*)", m) {
  emit_command()
  command = m[2]
  next
}
{
  if (output != "")
    output = output "\n" $0
  else
    output = $0
}
'`"

selected="`echo "$BUFFER" | grep -P -o '(?<=^>> COMMAND << :[$] )\[.*' | fzf`"

if test -n "$selected" ; then
  echo "$BUFFER" | awk -v selected="$selected" '
    BEGIN {
      output=""
      inside_match=0
    }
    ($0 == ">> COMMAND << :$ " selected) {
      inside_match = 1
      next
    }
    (inside_match == 1) {
      if (match($0, "^>> COMMAND << :[$] ")) {
        print output
        nextfile
      }
      if (output != "")
        output = output "\n" $0
      else
        output = $0
    }
  ' | xsel -i -b
fi
wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от ptah_alexs

Я выше нашел более интересное решение. Послать в терминал сочетание клавиш для выделение буфера и затем забрать его через xsel.

Такой способ хорош тем, что одинаково работает как «изнутри» терминала, так и внешним скриптом.

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

Вот такой вариант с превьюшкой. В планах еще кучу фич запилить.

#!/bin/sh
my_name="$0"

get_output() {
  cat "$TERM_BUFFER_FILE_2" | awk -v selected="$1" '
    BEGIN {
      output=""
      inside_match=0
    }
    END {
      if (inside_match == 1) {
        print output
      }
    }
    ($0 == ">> COMMAND << :$ " selected) {
      inside_match = 1
      next
    }
    (inside_match == 1) {
      if (match($0, "^>> COMMAND << :[$] ")) {
        inside_match = 0
        print output
        nextfile
      }
      if (output != "")
        output = output "\n" $0
      else
        output = $0
    }
  '
}

if test "$1" = "--preview-cb" ; then
  get_output "$2"
  exit 0
fi

TMP_DIR="${XDG_RUNTIME_DIR:-/tmp}"
TERM_BUFFER_FILE_1="$TMP_DIR/terminal-buffer-1.$USER.$$"
TERM_BUFFER_FILE_2="$TMP_DIR/terminal-buffer-2.$USER.$$"

terminal-read-buffer > "$TERM_BUFFER_FILE_1"
trap 'rm "$TERM_BUFFER_FILE_1"' 0 1 15

cat "$TERM_BUFFER_FILE_1" | awk '
BEGIN {
  n = 1
  command=""
  output=""
}
function emit_command() {
  if (output != "" && command != "") {
    print ">> COMMAND << :$ [" n "] " command
    print output
    n++
  }
  command=""
  output=""
}
END {
  emit_command()
}
match($0, "^([[:alnum:]]+@[[:alnum:]]+:.+[$] )(.*)", m) {
  emit_command()
  command = m[0]
  next
}
{
  if (output != "")
    output = output "\n" $0
  else
    output = $0
}
' > "$TERM_BUFFER_FILE_2"
trap 'rm "$TERM_BUFFER_FILE_1" "$TERM_BUFFER_FILE_2"' 0 1 15

fzf_1() {
  (
    export TERM_BUFFER_FILE_2
    fzf \
      --scheme=history \
      --tac \
      --preview="$my_name --preview-cb {}"
  )
}

selected="`cat "$TERM_BUFFER_FILE_2" | grep -P -o '(?<=^>> COMMAND << :[$] )\[.*' | fzf_1`"

if test -n "$selected" ; then
  get_output "$selected" | xsel -i -b
fi
# -%- indent-width: 2; use-tabs: no; -%-
wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

Только вот тупак тут о тебя происходит. Ты настолько туп, что не можешь внятно сформулировать свои хотелки и только мычишь бессвязно. Мычи дальше, животное.

anonymous
()