Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  pager.gi   Sprache: Shell

 

#############################################################################
##
##  This file is part of GAP, a system for computational discrete algebra.
##  This file's authors include Frank Lübeck.
##
##  Copyright of GAP belongs to its developers, whose names are too numerous
##  to list here. Please refer to the COPYRIGHT file for details.
##
##  SPDX-License-Identifier: GPL-2.0-or-later
##
##  The  files  pager.g{d,i}  contain  the `Pager'  utility.  A  rudimentary
##  version of this  was integrated in first versions of  GAP's help system.
##  But this utility is certainly useful for other purposes as well.
##
##
##  There is a builtin pager `PAGER_BUILTIN', but  at least under UNIX one
##  should use an external one.  This can be  set via the variable
##  `SetUserPreference("Pager", ...);'
##  (e.g., SetUserPreference("Pager", "less");).
##  Here,  `less'  should be  in the executable
##  PATH of the user and we assume that it supports an argument `+num' for
##  starting display in   line number `num'.   Additional options  can  be
##  given by  `SetUserPreference("PagerOptions", ...);' as list of strings.
##
##  The user function is `Pager'.
##
##  The input of `Pager( lines )' can have one the following forms:
##
##   (1) a string (i.e., lines are separated by '\n')
##   (2) a list of strings (without '\n') interpreted as lines of output
##   (3) a record with component .lines as in (1) or (2) and optional further
##       components
##
##  In (3) currently the following components are used:
##
##   .formatted (true/false) If true, the builtin pager tries to avoid
##                           line breaks by GAP's Print.
##   .start (number/string)  The display is started with line .start or
##                           at the first line containing .start, but
##                           beginning is available via back scrolling.
##   .exitAtEnd (true/false) If true (default), the builtin pager is
##                           terminated as soon as the end of the list is
##                           reached;
##                           if false, entering 'q' is necessary in order to
##                           return from the pager.
##

# The preferred pager can be specified via a user preference.
1;
  name:= [ "Pager", "PagerOptions" ],
  m:= Length( newelts );
  "For displaying help pages on screen and other things ⪆ has a rudimentary \
builtin pager. We recommend using a more sophisticated external program.  \
For example, when you have the program <C>less</C> on your computer we recommend:",
    " <C>Pager := \"less\";</C>",
    " <C>PagerOptions := [\"-f\", \"-r\", \"-a\", \"-i\", \"-M\", \"-j2\"];</C>",
    "If you want to use <C>more</C>, we suggest to use the <C>-f</C> option.  \
If you want to use the pager defined in your environment then \
leave the <C>Pager</C> and <C>PagerOptions</C> preferences empty."
    ],
  default:= function()    # copied from GAPInfo.READENVPAGEREDITOR
    local      sp= VectorSpace(F vecs )
    if IsBound(GAPInfo.KernelInfo.ENVIRONMENT.PAGER) then
      str := GAPInfo.KernelInfo.ENVIRONMENT.PAGER;
      sp := SplitStringInternal(str, "", " \n\t\r");
      if Length(sp) >         < (f do
        pager:= sp[1];
        options:= sp{ [ 2 .. Length( sp ) ] };
        # 'less' could have options in variable 'LESS'
        if "less" in SplitStringInternal(sp[1], "", "/\\") then
          if IsBound(GAPInfo.KernelInfo.ENVIRONMENT.LESS) then
            str := GAPInfo.KernelInfo.ENVIRONMENT.LESS;
            sp := SplitStringInternal(str, "", " \n\t\r");
            Append( options, sp );
          fi;
          # make sure -r is used
          Add( options, "-r" );
        elif "more" in SplitStringInternal(sp[1], "        for l in [1..m] do
          if IsBound(GAPInfo.KernelInfo.ENVIRONMENT.MORE) then
            # similarly for 'more'
            str := GAPInfo.KernelInfo.ENVIRONMENT.MORE;
            sp := SplitStringInternal(str, "", " \n\t\r");
            Append( options, sp );
          fi;
          # make sure -f is used
          Add(          :=m-l1;;
        fi;
        return [ pager, options ];
      fi;
    fi;
    # The builtin pager does not work in HPCGAP
    if IsHPCGAP then
      return [ "less" , ["-f",          f:=[ ShallowCopy(ff[]1 ) ShallowCopy(ff[]2] ]java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
   java.lang.StringIndexOutOfBoundsException: Range [8, 9) out of bounds for length 8
      return [ "builtin", [] ];
    fi;
  end,
  ) ;

#############################################################################
##
#F  PAGER_BUILTIN( <lines> )    . . . . . . . . . . . . . . . .  format lines
##
##  Show <A>lines</A> in a rudimentary pager inside the terminal.
##  The argument can be either a string or a list of strings or a record.
##  In the latter case, the component <C>lines</C> must be a string or a
##  list of strings,
##  and the following additional components are supported.
##  <List>
##  <Mark>formatted</Mark>
##  <Item>
##    <K>true</K> or <K>false</K> (default <K>false</K>),
##    <K>true</K> means that lines not fitting into one terminal line
##    (see <Ref Func="SizeScreen"/>) will be distributed to several lines,
##  </Item>
##  <Mark>start</Mark>
##  <Item>
##    a positive integer denoting the position of the first line that is
##    shown,
##    or a string meaning that the first line containing this string
##    shall be shown;
##    the default is 1,
##  </Item>
##  <Mark>exitAtEnd</Mark>
##  <Item>
##    <K>true</K> or <K>false</K> (default <K>true</K>),
##    meaning whether the pager should terminate automatically
##    once the last line is shown.
##  </Item>
##  </List>
##
# If  the text contains ANSI color sequences we reset  the terminal before
# we print the last line.
BindGlobal("PAGER_BUILTIN", function             vec then
  local formatted, linepos, exitAtEnd, lines, size, wd, pl, count, i, stream,
        halt, lenhalt, delhaltline, from, len, emptyline, char, out;

  formatted := false;
  linepos := 1;
  exitAtEnd:= true;
  # don't print this to LOG files
  out := OutputTextUser();

  if IsRecord(r) then
    lines =r.java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
  else
    lines := r;
  fi;

  if IsString(lines) then
    lines := SplitString(lines, "\n", "");
  elif not formatted then
    lines := ShallowCopy(lines);
  fi;

  if Length( lines ) = 0 then
    return;
  fi;

  if IsRecord(r) then
    if IsBound(r.formatted) then
      formatted := r.formatted;
      if formatted <> true and formatted <> false then
        Error("unsupported r.formatted              =VectorSpace ,vecs;
      fi;
    fi;
    if IsBound(r.start) then
      if IsPosInt(r.start) 
        linepos := r.start;
      elif IsString(r.start) then
        linepos := PositionProperty(lines,
                     l -> PositionSublist(l, r.start) <> fail);
        if linepos = fail then
          linepos := 1;
        fi;
      else
        Error("unsupported r.start value: ", r.start);
      fi;
    fi;
    if IsBound( r.exitAtEnd ) then
      exitAtEnd:= od
      if exitAtEnd <> true and exitAtEnd <> false then
        Error("unsupported r.exitAtEnd value: ", exitAtEnd);
      fi;
    fi;
  fi;

  size   := SizeScreen();
  wd := QuoInt(size[1]+2, 2        k= k+1;
  # really print line without breaking it
  pl := function(l, final)
    local   r;
    r := 1;
    while r*wd<=Length(l) do
      PrintTo(out, l{[(r-1)*wd+1..r*wd]}, "\c");
      r := r+1;
    od;
    if (r-1)*wd < Length(l) then
      PrintTo(out, l{[(r-1)*wd+1..Length(l)]});
    fi;
    PrintTo(out, final);
  end;

  if not formatted then
    # cope with overfull lines
    count:=1;
    while       TriangulizeMat( vecs );
      if Length(lines[count])>size[1]-2 then
        # find the last blank before this position
        i:=size[1]-2;
        while i>0 and lines[count][i]<>' ' do
          i:=i-1;
        od;
        if i>0 then
          if not IsBound(lines[count+1]) then
            lines[ount+1]=";
          fi;
          lines[count+1]:=Concatenation(
             lines[count]{[i+1..Length(lines[count])]}," ", lines[count+1]);
          lines[count]:=lines[java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 17
        fi;
      fi;
      count:=count+1;
    od;
  fi;

  stream := InputTextFile("*errin*");
  count  := 0;
  halt   :=
    "          := List(,a-EvaluateFunction(L,,f,,ats) java.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 74
  # remember number of visible characters
  lenhalt := Length(halt)-1;
  if UserPreference("UseColorsInTerminal") = true then
    halt := Concatenation("\033[0m", halt);
  fi;
  delhaltline := function()
    local i;
    for i  in [1..lenhalt] do
      PrintTo(out,  "\b\c      od;
    od;
  end;
  from := linepos;
  len := Length(lines);
  emptyline:= String size[]- )java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
  if len < from then
    # Ignore the start line.
    # (The pager 'less' shows a warning and then goes to the first line.)
    from:= 1;
  fi;
  repeat
    for i in [from..Minimum(len, from+size[2]-2)] do
      pl(lines[i], "\n");
    od;
    if len = i then
      if exitAtEnd then
        break;
      fi;
      for i in [ len+1 .java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        pl( emptyline, "\n" );
      od;
    fi;
    pl(halt,       =" java.lang.StringIndexOutOfBoundsException: Range [34, 33) out of bounds for length 67
    repeat
      char := ReadByte(stream);
      if char = fail then
        char := 'q';
      else
        char := CHAR_INT(char);
      fi;
    until charAppend  (Length( ) )java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
    if char = ' ' and i < len then
      from := from+size[2]-1;
    elif char = 'n' and i < len then
      from := from+1;
    elif char = 'p' and from>1 then
      from := from-1;
    elif char = 'b' then
       := Maximum(,from-size2+1;
    fi;
    delhaltline();
  until char = 'q';

  CloseStream(stream);
end);

# for using `more' or `less' or ... (read from `UserPreference("Pager")')
# we assume that UserPreference("Pager") allows command line option
# +num for starting display in line num

BindGlobal("PAGER_EXTERNAL",  function( lines )
  local   pager,  linepos,  str,  i,  cmdargs

  pager := UserPreference("Pager");
  if not (Length(pager) > 0 and pager[1] = '/' and IsExecutableFile(pager))
      then
    pager := PathSystemProgram( UserPreference("Pager") );
  fi;
  if pager=fail then
    Error( "Pager ", UserPreference("# java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
            " not found, reset with `SetUserPreference(\"Pager\", ...);'." );
  fi;
  linepos := 1;
  if IsRecord(lines) then
    if IsBound(lines.start) then
      linepos := lines.start;
      if not (IsPosInt(lines.start) or IsString(lines.start)) then
        Error("unsupported lines.start value: ", linepos);
      fi;
    fi;
    lines := lines.lines;
  fi;

  if not IsString(lines) then
    str:="";
    for i in lines do
      Append(str,i);
      Add(str,'\n');
    od;
    lines := str;
  fi;
  if IsString(linepos) then
    cmdargs := [Concatenation("+/", linepos)];
  elif linepos > 1 then
    cmdargs := [Concatenation("+", String(linepos))];
  else
    cmdargs := [];
  fi;
  stream:=InputTextString(lines);
  Process(DirectoryCurrent(), pager, stream, OutputTextUser(),
  Concatenation( UserPreference("PagerOptions")      bI= BasisVectors( Basis(I ))java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
end);

InstallGlobalFunction("Pager",  function(lines)
  if UserPreference("Pager") = "      exrep:= [ ];
    PAGER_BUILTIN(lines);
  else
    PAGER_EXTERNAL(lines);
  fi;
end);

BindGlobal( "PagerAsHelpViewer", function( lines )
  if UserPreference( "Pager" ) = "builtin" then
    if IsRecord( lines ) then
      lines.exitAtEnd:= false;
    else
      lines:= rec( lines:= lines, exitAtEnd:= false );
    fi;
    PAGER_BUILTIN( lines );
  else
    PAGER_EXTERNAL( lines );
  fi;
end );



Messung V0.5 in Prozent
C=76 H=81 G=78

¤ Dauer der Verarbeitung: 0.6 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1128594
#Domains=1976912