2013-03-16 1 views
3

Иногда мы запускаем команду в терминале, а вывод слишком велик, и мы забыли положить «| меньше» в конце. Так что мне интересно, возможно ли вывести страницу, когда она слишком велика в zsh?Можно ли автоматически вывести на экран вывод в zsh?

Я пытался реализовать эту функцию с помощью питона и меньше:

#!/usr/bin/env python3 
termHeight = 25 
import sys 
from subprocess import Popen, PIPE 
p = Popen(['unbuffer'] + sys.argv[1:], stdin=PIPE, stdout=PIPE) 
lines = [] 
for count in range(termHeight): 
    line = p.stdout.readline() 
    if not line: 
     break 
    print(line.decode('utf8'), end='') 
    lines += [line] 
if line: 
    q = Popen(['less', '-Mr'], stdin=PIPE) 
    q.stdin.writelines(lines) 
    while True: 
     line = p.stdout.readline() 
     if not line: 
      break 
     q.stdin.write(line) 
    q.communicate() 

давайте сохранить этот питон скрипт для p.py. Поэтому, когда мы запускаем «python p.py некоторые команды», например «python p.py ls --help», если на выходе больше 25 строк, этот скрипт будет использовать меньше, чтобы отображать вывод.

Проблема в том, что я не могу получить вход от пользователя. Это означает, что это решение не работает с интерактивной программой вообще.

ответ

0

Возможно, другой вариант - использовать что-то вроде screen или tmux, а не пытаться заставить zsh на страницу для вас. Это решение обеспечивает поддержку редакторов, таких как vim, ssh соединений, пейджеров less, more и т. Д., А также дает возможности многократной прокрутки, которые каждая команда через пейджер не разрешает.

Такой подход даст вам:

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

Этот подход стоит вам:

  • Вы должны сделать сессию придаю перед запуском команды. Это не так много работы, но, по моему опыту, времена, когда я забыл использовать screen, я действительно очень хотел.
4

Я не уверен, что это возможно. Это потребует zsh сделать две вещи:

  1. Определить, если команда записи на стандартный вывод
  2. Intercept, что выход и дисплей на пейджер, если это необходимо.

Второй вариант довольно прост. То, что мы действительно сделаем, это передать команду каждой команде на less и использовать пару опций, чтобы автоматически завершить работу less, если требуется только один экран.

preexec() { 
    eval "$3" | less -XF 
} 

Однако первый критериум сложнее: мы не хотели бы таких команд, как

  • vi foo.txt
  • less bar.rtf
  • ssh remote.host.com

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

+0

цвет подсветки будет терять –

5

Попробуйте добавить это к вашему .zshrc

export LESS="-FX" 
  • -F = «Вызывает меньше автоматически отключается, если весь файл может быть отображен на первом экране.»
  • -X = «Отключение отправки инициализация termcap и строки деинициализации к терминалу. "(останавливает меньше очистки экрана)

Для меня это означает, что less используется в качестве пейджера, когда есть больше экрана с текстом, а встроенный пейджер zsh (zsh -c '< /dev/fd/0', например cat) используется, когда нет.

НТНА

+0

Yessssss! Старался выяснить, как это сделать навсегда. – mehulkar

+3

Исправьте меня, если я ошибаюсь, но это на самом деле не вызывает zsh для _use_ меньше, чем для пейджера. – Bladt

0

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

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

function ls { 
    command ls [email protected] | less -RFX 
} 

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

Это было бы моим обходным путем.

+0

цвет подсветки будет потерян –