#lang racket/base ;; Copyright (c) Neil Van Dyke. See file "info.rkt". (require (for-syntax racket/base racket/syntax) racket/system (planet neil/mcfly)) (doc (section "Introduction") (para "The " "CharTerm" " package provides a Racket interface for character-cell video display terminals on Unix-like systems -- such as for " (as-index "GNU Screen") " and " (as-index (code "tmux")) " sessions on " (index '("cloud server" "server") "cloud servers") ", " (as-index "XTerm") " windows on a workstation desktop, and some older hardware terminals (even the venerable " (as-index "DEC VT100") "). Currently, it implements a subset of features available on most terminals.") (para "This package could be used to implement a status/management console for a Racket-based server process (perhaps run in GNU Screen or " (code "tmux") " on a server machine, to be detached and reattached from SSH sessions), a lightweight user interface for a systems tool, a command-line REPL, a text editor, creative retro uses of old equipment, and, perhaps most importantly, a " ;; (hyperlink "http://en.wikipedia.org/wiki/Rogue_%28computer_game%29" "Rogue-like" ;;) " application.") (para "The " "CharTerm" " package does not include any native code (such as from " (as-index (code "terminfo")) ", " (as-index (code "termcap")) ", " (as-index (code "curses")) ", or " (as-index (code "ncurses")) ") in the Racket process, such as through the Racket FFI or C extensions, so there is less potential for a problem involving native code to threaten the reliability or security of a program. " "CharTerm" " is implemented in pure Racket code except for executing " (code "/bin/stty") " for some purposes. Specifically, " (code "/bin/stty") " at startup time and shutdown time, to set modes, and (for terminal types that don't seem to support a screen size report control sequence) when getting screen size. Besides security and stability, lower dependence on native code might also simplify porting to host platforms that don't have those native code facilities.")) (doc (subsection "Demo") (para "For a demonstration, the following command, run from a terminal, should install the " "CharTerm" " package (if not already installed), and run the demo:") (commandline "racket -pm neil/charterm/demo") (para "This demo reports what keys you pressed, while letting you edit a text field, and while displaying a clock. The clock is updated roughly once per second, and is not updated during heavy keyboard input, such as when typing fast. The demo responds to changing terminal sizes, such as when an XTerm is window is resized. It also displays the determined terminal size, and some small tests of the " (racket #:width) " argument to " (racket charterm-display) ". Exit the demo by pressing the " (bold "Esc") " key.") (para "Note: Although this demo includes an editable text field, as proof of concept, the current version of " "CharTerm" " does not provide editable text fields as reusable functionality.")) (doc (subsection "Simple Example") (para "Here's your first " "CharTerm" " program:") (RACKETBLOCK (UNSYNTAX (code "#lang racket/base")) (require (planet neil/charterm)) (with-charterm (charterm-clear-screen) (charterm-cursor 10 5) (charterm-display "Hello, ") (charterm-bold) (charterm-display "you") (charterm-normal) (charterm-display ".") (charterm-cursor 1 1) (charterm-display "Press a key...") (let ((key (charterm-read-key))) (charterm-cursor 1 1) (charterm-clear-line) (printf "You pressed: ~S\r\n" key)))) (para "Now you're living the dream of the '70s.")) (doc (section "Terminal Diversity") (para "Like people, few terminals are exactly the same.") (para "Some key (ha) terms (ha) used by " "CharTerm" " are:") (itemlist (item (tech "termvar") " --- a string value like from the Unix-like " (code "TERM") " environment variable, used to determine a default " (tech "protocol") " and " (tech "keydec") ".") (item (tech "protocol") " --- how to control the display, query for information, etc.") (item (tech "keydec") " --- how to decode key encodings of a particular terminal. A keydec is constructed from one or more keysets, can produce " (tech "keycode") "s or " (tech "keyinfo") "s.") (item (tech "keyset") " --- a specification of encoding some of the keys in a particular terminal, including " (tech "keylabel") "s and " (tech "keycode") "s.") (item (tech "keylabel") " --- a string for how a key is likely labeled on a keyboard, such as the DEC VT100 " (bold "PF1") " key would have a keylabel " (racket "PF1") " for a " (tech "keycode") " " (racket 'f1) ".") (item (tech "keycode") " --- a value produced by a decoded key, such as a character for normal printable keys, like " (racket #\a) " and " (racket #\space) ", a symbol for some recognized unprintable keys, like " (racket 'escape) " and " (racket 'f1) ", or possibly a number for unrecognized keys.") (item (tech "keyinfo") " --- an object that is used like a " (tech "keycode") ", except bundles together a keycode and a " (tech "keylabel") ", as well as alternatate keycodes and information about how the key was decoded (e.g., from which " (tech "keyset") ").")) (para "These terms are discussed in the following subsections.") (para "CharTerm" " is developed with help of original documentation such as that curated by Paul Williams at " (hyperlink "http://vt100.net/" "vt100.net") ", various commentary found on the Web, observed behavior with modern software terminals like XTerm, various emulators for hardware terminals, and sometimes original hardware terminals. Thanks to Mark Pearrow for contributing a TeleVideo 950, and Paul McCabe for a Wyse S50 WinTerm.") (para "At time of this writing, the author is looking to acquire a DEC VT525, circa 1994, for ongoing testing.") (para "The author welcomes feedback on useful improvements to " "CharTerm" "'s support for terminal diversity (no pun). If you have a terminal that is sending an escape sequence not recognized by the demo, you can run the demo with the " (Flag "n") " (aka " (DFlag "no-escape") ") argument to see the exact byte sequence:") (commandline "racket -pm- neil/charterm/demo -n") (para "When " (Flag "n") " is used, this will be indi
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: module ranger.container.history</title>
</head><body bgcolor="#f0f0f8">
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="ranger.html"><font color="#ffffff">ranger</font></a>.<a href="ranger.container.html"><font color="#ffffff">container</font></a>.history</strong></big></big></font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/hut/ranger/ranger/container/history.py">/home/hut/ranger/ranger/container/history.py</a></font></td></tr></table>
<p><tt># Copyright (C) 2009, 2010 Roman Zimbelmann <romanz@lavabit.com><br>
#<br>
# This program is free software: you can redistribute it and/or modify<br>
# it under the terms of the GNU General Public License as published by<br>
# the Free Software Foundation, either version 3 of the License, or<br>
# (at your option) any later version.<br>
#<br>
# This program is distributed in the hope that it will be useful,<br>
# but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br>
# GNU General Public License for more details.<br>
#<br>
# You should have received a copy of the GNU General Public License<br>
# along with this program. If not, see <<a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>>.</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ee77aa">
<td colspan=3 valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td>
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="__builtin__.html#object">__builtin__.object</a>
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="ranger.container.history.html#History">History</a>
</font></dt></dl>
</dd>
<dt><font face="helvetica, arial"><a href="exceptions.html#Exception">exceptions.Exception</a>(<a href="exceptions.html#BaseException">exceptions.BaseException</a>)
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="ranger.container.history.html#HistoryEmptyException">HistoryEmptyException</a>
</font></dt></dl>
</dd>
</dl>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom> <br>
<font color="#000000" face="helvetica, arial"><a name="History">class <strong>History</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
<tr><td bgcolor="#ffc8d8"><tt> </tt></td><td> </td>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="History-__init__"><strong>__init__</strong></a>(self, maxlen<font color="#909090">=None</font>)</dt></dl>
<dl><dt><a name="History-__iter__"><strong>__iter__</strong></a>(self)</dt></dl>
<dl><dt><a name="History-__len__"><strong>__len__</strong></a>(self)</dt></dl>
<dl><dt><a name="History-add"><strong>add</strong></a>(self, item)</dt></dl>
<dl><dt><a name="History-back"><strong>back</strong></a>(self)</dt></dl>
<dl><dt><a name="History-bottom"><strong>bottom</strong></a>(self)</dt></dl>
<dl><dt><a name="History-current"><strong>current</strong></a>(self)</dt></dl>
<dl><dt><a name="History-fast_forward"><strong>fast_forward</strong></a>(self)</dt></dl>
<dl><dt><a name="History-forward"><strong>forward</strong></a>(self)</dt></dl>
<dl><dt><a name="History-modify"><strong>modify</strong></a>(self, item)</dt></dl>
<dl><dt><a name="History-move"><strong>move</strong></a>(self, n)</dt></dl>
<dl><dt><a name="History-next"><strong>next</strong></a>(self)</dt></dl>
<dl><dt><a name="History-top"><strong>top</strong></a>(self)</dt></dl>
<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary for instance variables (if defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list of weak references to the object (if defined)</tt></dd>
</dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom> <br>
<font color="#000000" face="helvetica, arial"><a name="HistoryEmptyException">class <strong>HistoryEmptyException</strong></a>(<a href="exceptions.html#Exception">exceptions.Exception</a>)</font></td></tr>
<tr><td bgcolor="#ffc8d8"><tt> </tt></td><td> </td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd><a href="ranger.container.history.html#HistoryEmptyException">HistoryEmptyException</a></dd>
<dd><a href="exceptions.html#Exception">exceptions.Exception</a></dd>
<dd><a href="exceptions.html#BaseException">exceptions.BaseException</a></dd>
<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
</dl>
<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list of weak references to the object (if defined)</tt></dd>
</dl>
<hr>
Methods inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
<dl><dt><a name="HistoryEmptyException-__init__"><strong>__init__</strong></a>(...)</dt><dd><tt>x.<a href="#HistoryEmptyException-__init__">__init__</a>(...) initializes x; see x.__class__.__doc__ for signature</tt></dd></dl>
<hr>
Data and other attributes inherited from <a href="exceptions.html#Exception">exceptions.Exception</a>:<br>
<dl><dt><strong>__new__</strong> = <built-in method __new__ of type object><dd><tt>T.<a href="#HistoryEmptyException-__new__">__new__</a>(S, ...) -> a new <a href="__builtin__.html#object">object</a> with type S, a subtype of T</tt></dl>
<hr>
Methods inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
<dl><dt><a name="HistoryEmptyException-__delattr__"><strong>__delattr__</strong></a>(...)</dt><dd><tt>x.<a href="#HistoryEmptyException-__delattr__">__delattr__</a>('name') <==> del x.name</tt></dd></dl>
<dl><dt><a name="HistoryEmptyException-__getattribute__"><strong>__getattribute__</strong></a>(...)</dt><dd><tt>x.<a href="#HistoryEmptyException-__getattribute__">__getattribute__</a>('name') <==> x.name</tt></dd></dl>
<dl><dt><a name="HistoryEmptyException-__getitem__"><strong>__getitem__</strong></a>(...)</dt><dd><tt>x.<a href="#HistoryEmptyException-__getitem__">__getitem__</a>(y) <==> x[y]</tt></dd></dl>
<dl><dt><a name="HistoryEmptyException-__getslice__"><strong>__getslice__</strong></a>(...)</dt><dd><tt>x.<a href="#HistoryEmptyException-__getslice__">__getslice__</a>(i, j) <==> x[i:j]<br>
<br>
Use of negative indices is not supported.</tt></dd></dl>
<dl><dt><a name="HistoryEmptyException-__reduce__"><strong>__reduce__</strong></a>(...)</dt></dl>
<dl><dt><a name="HistoryEmptyException-__repr__"><strong>__repr__</strong></a>(...)</dt><dd><tt>x.<a href="#HistoryEmptyException-__repr__">__repr__</a>() <==> repr(x)</tt></dd></dl>
<dl><dt><a name="HistoryEmptyException-__setattr__"><strong>__setattr__</strong></a>(...)</dt><dd><tt>x.<a href="#HistoryEmptyException-__setattr__">__setattr__</a>('name', value) <==> x.name = value</tt></dd></dl>
<dl><dt><a name="HistoryEmptyException-__setstate__"><strong>__setstate__</strong></a>(...)</dt></dl>
<dl><dt><a name="HistoryEmptyException-__str__"><strong>__str__</strong></a>(...)</dt><dd><tt>x.<a href="#HistoryEmptyException-__str__">__str__</a>() <==> str(x)</tt></dd></dl>
<dl><dt><a name="HistoryEmptyException-__unicode__"><strong>__unicode__</strong></a>(...)</dt></dl>
<hr>
Data descriptors inherited from <a href="exceptions.html#BaseException">exceptions.BaseException</a>:<br>
<dl><dt><strong>__dict__</strong></dt>
</dl>
<dl><dt><strong>args</strong></dt>
</dl>
<dl><dt><strong>message</strong></dt>
</dl>
</td></tr></table></td></tr></table>
</body></html>