diff --git a/twander.1 b/twander.1 index 0bf1440..54cbeae 100644 --- a/twander.1 +++ b/twander.1 @@ -12,39 +12,42 @@ .SH OVERVIEW Wander around a filesystem executing commands of your choice on selected files and directories. The general idea here is -that \*(TW provides GUI facilities for navigating around your +that \'twander\' provides GUI facilities for navigating around your filesystem, but .B you define the commands you want available via "Command Definitions" in the \*(CF. -If you're new to \*(TW and want +If you're new to \'twander\' and want to know why this program is better and different than whatever you're using at the moment, take a moment to read the section called .B DESIGN PHILOSOPHY toward the end of this document first. -Similarly, if this is the first time you've worked with \*(TW, +Similarly, if this is the first time you've worked with \'twander\', there is a section near the end of this document entitled -.B INSTALLING \*(TW +.B INSTALLING \'twander\' which describes how the program should be installed. You can get the latest version of the program and documentation -from the \*(TW homepage: +from the \'twander\' homepage: +.ft C \" courier .nf - http://www.tundraware.com/Software/twander/ + http://www.tundraware.com/Software/twander/ .fi +.ft \" revert + You should check this site periodically for program updates, bug fixes, and enhacements. -Also, you are strongly encouraged to join the \*(TW mailing +Also, you are strongly encouraged to join the \'twander\' mailing list where you'll find help and answers to questions you have about this program. Details of how to do this can be found toward the end of this document in the section entitled, -.B GETTING HELP: THE \*(TW MAILING LIST. +.B GETTING HELP: THE \'twander\' MAILING LIST. .SH SYNOPSIS @@ -57,7 +60,7 @@ Directory in which to begin. (default: directory in which program was started) -If this directory does not exist or cannot be opened, \*(TW +If this directory does not exist or cannot be opened, \'twander\' will display an error message and abort. .TP @@ -65,9 +68,9 @@ Specify the location and name of the configuration file. (default is ~/.twander) -If this file does not exist or cannot be opened, \*(TW will +If this file does not exist or cannot be opened, \'twander\' will display a warning to that effect but continue to run. This is -reasonable behavior because \*(TW provides a command to reload +reasonable behavior because \'twander\' provides a command to reload the \*(CF without exiting the program (which you would presumably do after fixing the \*(CF problem). @@ -76,30 +79,32 @@ Start in debug mode dumping the items specified in the debuglevel. (default: debuglevel=0/debug off) -\*(TW is able to selectively dump debugging information to +\'twander\' is able to selectively dump debugging information to stdout. \'debuglevel\' is understood to be a bitfield in which each bit specifies some kind of debugging information or behavior. \'debuglevel\' can be specified in either decimal or hex (using the form 0x#) formats. The bits in the bitfield are defined as follows: +.ft C \" courier .nf -Bit Hex Value Meaning ---- --------- ------- - -0 0x001 Dump Internal Options & User-Settable Options -1 0x002 Dump User-Defined Variables -2 0x004 Dump Command Definitions -3 0x008 Dump Key Bindings -4 0x010 Display, Do Not Execute, Commands When Invoked -5 0x020 Dump Directory Stack As It Changes -6 0x040 Dump Command History Stack After Command Executes -7 0x080 Dump Contents Of Program Memories As They Change -8 0x100 Dump Contents Of Wildcard Stack As It Changes -9 0x200 Reserved/Unused -10 0x400 Reserved/Unused -11 0x800 Dump Requested Debug Information And Exit Immediately + Bit Hex Value Meaning + --- --------- ------- + + 0 0x001 Dump Internal Options & User-Settable Options + 1 0x002 Dump User-Defined Variables + 2 0x004 Dump Command Definitions + 3 0x008 Dump Key Bindings + 4 0x010 Display, Do Not Execute, Commands When Invoked + 5 0x020 Dump Directory Stack As It Changes + 6 0x040 Dump Command History Stack After Command Executes + 7 0x080 Dump Contents Of Program Memories As They Change + 8 0x100 Dump Contents Of Wildcard Stack As It Changes + 9 0x200 Reserved/Unused + 10 0x400 Reserved/Unused + 11 0x800 Dump Requested Debug Information And Exit Immediately .fi +.ft \" revert These bits can be combined to provided very specific debugging information. For example, \'-d 0x80f\' will dump (to stdout) all the @@ -119,11 +124,11 @@ Turn off automatic refreshing of directory display. (default: refresh on) -Normally \*(TW re-reads and displays the current directory +Normally \'twander\' re-reads and displays the current directory every few seconds to reflect any changes that might have occurred to that directory's contents. This option is useful on slow machines (or slow X connections) and/or when working with very large directories. -In this situation, the frequent updating of the \*(TW display +In this situation, the frequent updating of the \'twander\' display can make the program unacceptably slow and unresponsive. In this case you can still force an update manually with the REFRESH function (default assignment is to the Control-l key). @@ -132,7 +137,7 @@ .B -t Turn off quoting when substituting built-in variables. (default: quoting on) -Anytime \*(TW encounters a reference to one of the built-in +Anytime \'twander\' encounters a reference to one of the built-in variables which do string replacement (DIR, DSELECTION, DSELECTIONS, MEM1-12, PROMPT:, SELECTION, SELECTIONS) in a command, it will replace them with @@ -147,18 +152,20 @@ Print detailed version information. -.SH OTHER WAYS TO SET \*(TW OPTIONS +.SH OTHER WAYS TO SET \'twander\' OPTIONS In addition to these command line options, there are two other ways -you can set \*(TW program features. If you prefer, you +you can set \'twander\' program features. If you prefer, you can set the command line options via the environment variable, TWANDER. That way you don't have to type them in each time you start the program. Say you set the environment variable this way on Unix: +.ft C \" courier .nf -export TWANDER=-qt + export TWANDER=-qt .fi +.ft \" revert From then on, every time you run the program, the -q and -t options would be invoked (No Quoting, No Warnings) just as if you had typed @@ -168,7 +175,7 @@ by setting the appropriate entries in the \*(CF. This is covered later in this document. -\*(TW evaluates options in the following order (from first +\'twander\' evaluates options in the following order (from first to last: .IP \(bu 4 @@ -203,14 +210,14 @@ If the \*(CF is reloaded while the program is running (see the READCONF key below), any options set in the file will have the last word. This allows you to edit the \*(CF and -have your changes reflected in a running instance of \*(TW, but +have your changes reflected in a running instance of \'twander\', but it also means that the environment variable/command line arguments are ignored after initial program startup. .SH THE TITLE BAR -\*(TW displays a lot of information about the state of the running +\'twander\' displays a lot of information about the state of the running program in the main window title bar. From left to right you will see: .IP \(bu 4 @@ -221,7 +228,7 @@ .IP \(bu 4 The path of the directory you are currently viewing. If -this path length is greater than 60 characters, \*(TW will +this path length is greater than 60 characters, \'twander\' will show the last 60 characters of the path length, prepended with "..." to show that it is truncated. @@ -256,8 +263,8 @@ .SH KEYBOARD USE -By design, \*(TW allows you to do almost everything of interest -using only the keyboard. Various \*(TW features are thus +By design, \'twander\' allows you to do almost everything of interest +using only the keyboard. Various \'twander\' features are thus associated with particular keystrokes which are described below. It is also very simple to change the default key assignments with entries in the \*(CF, also described below. @@ -271,13 +278,13 @@ X-Windows is somewhat more problematic in this area. Just what an arrow key is "supposed" to do depends on how it's been mapped in your X -server software. Testing \*(TW on various X servers showed +server software. Testing \'twander\' on various X servers showed quite a bit of variability in how they handled the arrows and keypad. So ... if you're running in an X Windows universe and arrows or keypad do nothing, or do strange things, look into your key maps, don't blame -\*(TW. +\'twander\'. -There are several features of \*(TW that will present the user a +There are several features of \'twander\' that will present the user a text entry dialog. These include the CHANGEDIR and RUNCMD features as well as the [PROMPT:...] Built-In Variable (all described below). @@ -292,7 +299,7 @@ .SH DEFAULT KEYBOARD AND MOUSE BINDINGS Here, ordered by category, are the default keyboard and mouse -bindings for \*(TW. The general format is: +bindings for \'twander\'. The general format is: .TP .B Description (Program Function Name) @@ -303,27 +310,27 @@ .PD .P -The "Program Function Name" is the internal variable \*(TW +The "Program Function Name" is the internal variable \'twander\' uses to associate a particular feature with a particular keystroke or mouse action. You can ignore it unless you intend to override the default key assignments. This use is described below in the section entitled, .B Key Binding Statements. -It is important to realize that \*(TW key-bindings are +It is important to realize that \'twander\' key-bindings are .B case-sensitive. This means that \'Control-b\' and \'Control-B\' are different. This was a conscious design decision because it effectively doubles the number of Control/Alt key combinations available for the addition of future features. -The default bindings chosen for \*(TW features are all currently +The default bindings chosen for \'twander\' features are all currently .B lower-case. If your program suddenly stops responding to keyboard commands, check to make sure you don't have CapsLock turned on. .B NOTE: -Some \*(TW features are doubled on the mouse. These mouse +Some \'twander\' features are doubled on the mouse. These mouse button assignments are documented below for the sake of completeness. However, .B mouse button assignments cannot be changed by the user, @@ -331,7 +338,7 @@ .SS General Program Commands -This family of commands controls the operation of \*(TW itself. +This family of commands controls the operation of \'twander\' itself. .TP .B Clear History (CLRHIST) @@ -356,15 +363,15 @@ Increase font size. These two features allow you to change the display font sizes while -\*(TW is running. But, you may not immediately get the results -you expect. \*(TW internally keeps track of separate font +\'twander\' is running. But, you may not immediately get the results +you expect. \'twander\' internally keeps track of separate font sizes for the main display, the main menu text, and the help menu -text. When you use the two font sizing commands above, \*(TW +text. When you use the two font sizing commands above, \'twander\' subtracts or adds 1 to each of these three values respectively. On systems like Win32 using TrueType fonts, this works as you would expect, because every font is effectively available in every size. However, in systems like X-Windows or Win32 using fixed-size fonts, -you may have to press these keys repeatedly until \*(TW finds +you may have to press these keys repeatedly until \'twander\' finds a font matching the requested size. This can also cause some parts of the display to change but not @@ -374,7 +381,7 @@ available larger than 12 point is 16 point. If you press FONTINCR twice, both the menu text and help text will jump to 12 point, but the main display text will remain unchanged. Why? Because pressing -FONTINCR twice tells \*(TW to set the main display to 14 point +FONTINCR twice tells \'twander\' to set the main display to 14 point (12+1+1) which does not exist, and the menu and help text to 12 point (10+1+1) which does exist, so that change is visible. @@ -405,7 +412,7 @@ Command Menu at the top of the GUI, or via selection from the Command Menu. -Win32 users should note that, unlike Windows Explorer, the \*(TW +Win32 users should note that, unlike Windows Explorer, the \'twander\' Command Menu does not change the set of currently selected items. It merely provides a list of available commands. This allows the command chosen via the Command Menu to operate on a previously @@ -444,7 +451,7 @@ Control-r Re-read the \*(CF. This allows you to edit the -\*(CF while \*(TW is running and then read your +\*(CF while \'twander\' is running and then read your changes in without having to exit the program. This is handy when editing or changing Command Definitions. @@ -472,7 +479,7 @@ Toggle Autorefreshing on- and off. This is handy if you are about to enter a very large directory and/or a very slow disk (like a CDROM). -With very large or slow directory reads, \*(TW can end up spending all +With very large or slow directory reads, \'twander\' can end up spending all its time doing re-reads of the directory and never give you time to do anything there. If you find this is consistently the case, then you need to increase REFRESHINT. But for the occasional adventure into @@ -492,7 +499,7 @@ .B Toggle \*(W3 Features (TOGWIN32ALL) Control-w -As described later in this document, \*(TW provides enhanced +As described later in this document, \'twander\' provides enhanced features for Win32 users who also install Mark Hammond's \*(W3 extensions for Python on Win32. This key binding will toggle those advanced features on- and off. This is useful if you happen to @@ -506,11 +513,11 @@ This family of commands controls movement between directories. If you attempt to navigate into a directory that does not exist or which does -not have appropriate permissions, \*(TW will display a warning +not have appropriate permissions, \'twander\' will display a warning message and remain in the current directory. This is .B unlike the case of a non-existent or unreadable directory specified when the program -is first started. In that case, \*(TW reports the error and aborts. +is first started. In that case, \'twander\' reports the error and aborts. .TP .B Change Directory (CHANGEDIR) @@ -543,7 +550,7 @@ Control-DoubleClick-Left-Mouse-Button .PD -\*(TW keeps track of every directory visited and the order in +\'twander\' keeps track of every directory visited and the order in which they are visited. This command allows you to move back successively until you get to the directory in which you started. This feature is implemented as a stack - each "backing up" removes @@ -562,7 +569,7 @@ .B Go To Starting Directory (DIRSTART) Control-s -Go back to the original directory in which \*(TW was started. +Go back to the original directory in which \'twander\' was started. .TP .B Go Up To Parent Directory (DIRUP and MOUSEUP) @@ -651,22 +658,24 @@ .B Select Using Regular-Expression \'Wildcards\' (SELWILD) Control-\\ -Although \*(TW provides a very rich set of keyboard and mouse +Although \'twander\' provides a very rich set of keyboard and mouse selection commands, selecting a group of files out of list of hundreds or thousands in a large directory can be tedious. If the files/directories you want to select have some lexical commonality .B in their names OR details -you can have \*(TW select them for you using so-called "Regular +you can have \'twander\' select them for you using so-called "Regular Expressions". The idea here is that you press SELWILD -and enter a "matching" string or regular expression, and \*(TW will +and enter a "matching" string or regular expression, and \'twander\' will select all entries which match this criteria for you. For example, if you just enter the text, +.ft C \" courier .nf -tar + tar .fi +.ft \" revert -\*(TW would select every file or directory in the current display +\'twander\' would select every file or directory in the current display where the string "tar" .B appeared anywhere on the line for that file/directory. This is very important: Wildcard matching takes place anywhere on the @@ -679,11 +688,13 @@ make selections on more than just the name. Say you enter the following in the SELWILD dialog: +.ft C \" courier .nf -drwx------ + drwx------ .fi +.ft \" revert -\*(TW will select all directories with no permissions enabled for +\'twander\' will select all directories with no permissions enabled for group or world users. @@ -701,9 +712,11 @@ followed by any other character, a single space, and ending in "0": +.ft C \" courier .nf -Ju. 0 + Ju. 0 .fi +.ft \" revert So, for instance, this would select files with date details (or names, or anything else on the line...) like "Jun 01", "Jul 03", and "Jul @@ -718,15 +731,17 @@ the same thing as the filename "globbing" wildcards commonly used with Unix and Win32 shells. If you enter constructs like "*.txt" or "*.tar.gz", you will not get the results you expect. -In fact, these specific examples will cause \*(TW to grumble +In fact, these specific examples will cause \'twander\' to grumble and present a warning message. For an excellent tutorial on Python-compliant regular expressions, see: +.ft C \" courier .nf http://www.amk.ca/python/howto/regex/ .fi +.ft \" revert By default, SELWILD will select an entry when your regular expression matches anything on the displayed line. This allows you to make @@ -744,11 +759,13 @@ Suppose we changed our example above slightly and used this regular expression: +.ft C \" courier .nf -"^drwx------ + "^drwx------ .fi +.ft \" revert -Now \*(TW would select +Now \'twander\' would select .B only the directories without any group and world access because: @@ -759,7 +776,7 @@ The carat (^) at the beginning of the actual regular expression "anchors" the match to the start of the line. For a match -to be declared (and for \*(TW to select an item) the regular +to be declared (and for \'twander\' to select an item) the regular expression must be satisfied at the beginning-of-line. .P @@ -790,7 +807,7 @@ .SS Scrolling Commands If a given directory's contents cannot be displayed on a single -screen, \*(TW supports both vertical and horizontal scrolling +screen, \'twander\' supports both vertical and horizontal scrolling via scrollbars. This capability is doubled on the keyboard with: .TP @@ -819,7 +836,7 @@ .SS Command Execution Options -This family of commands causes \*(TW to actually +This family of commands causes \'twander\' to actually attempt to execute some command you've chosen: .TP @@ -833,54 +850,60 @@ You may enter a number of different things in the RUNCMD dialog. You may type literal text or refer to any of the variable types -(User-Defined, Environment, or Built-In) supported by \*(TW just +(User-Defined, Environment, or Built-In) supported by \'twander\' just as you do in writing Command Definitions (see below). This makes it easy to enter complex commands without having to type everything literally. For example, if you would like to copy all the currently selected files to a new directory, press RUNCMD and enter (on Unix): +.ft C \" courier .nf -cp [SELECTIONS] newdir + cp [SELECTIONS] newdir .fi +.ft \" revert -\*(TW understands the variable reference syntax here just as it +\'twander\' understands the variable reference syntax here just as it does in a Command Definition. This also gives you a single way of referring to environment variables, regardless of OS platform. Recall that in Unix-like shells, an environment variable is in the form "$NAME", but on Win32 it is in the form "%NAME%". Instead if having -to keep track of this difference, you can just use a \*(TW +to keep track of this difference, you can just use a \'twander\' Environment Variable reference. For instance, assuming the EDITOR environment variable is set, this command works the same on both systems: +.ft C \" courier .nf -[$EDITOR] [SELECTIONS] + [$EDITOR] [SELECTIONS] .fi +.ft \" revert Built-in variables are most often used when manually entering commands So, RUNCMD also understands some "shortcut" references to many of the built-ins. You may use: +.ft C \" courier .nf - [D] for [DIR] - [DN] for [DSELECTION] - [DS] for [DSELECTIONS] - [SN] for [SELECTION] - [SS] for [SELECTIONS] - [1] for [MEM1] - [2] for [MEM2] - [3] for [MEM3] - [4] for [MEM4] - [5] for [MEM5] - [6] for [MEM6] - [7] for [MEM7] - [8] for [MEM8] - [9] for [MEM9] - [10] for [MEM10] - [11] for [MEM11] - [12] for [MEM12] + [D] for [DIR] + [DN] for [DSELECTION] + [DS] for [DSELECTIONS] + [SN] for [SELECTION] + [SS] for [SELECTIONS] + [1] for [MEM1] + [2] for [MEM2] + [3] for [MEM3] + [4] for [MEM4] + [5] for [MEM5] + [6] for [MEM6] + [7] for [MEM7] + [8] for [MEM8] + [9] for [MEM9] + [10] for [MEM10] + [11] for [MEM11] + [12] for [MEM12] .fi +.ft \" revert Of course, the full form is also fine as well. @@ -907,15 +930,17 @@ handy on Unix. As with command definitions in a configuration file, you can -tell \*(TW to force a display refresh after the command has been +tell \'twander\' to force a display refresh after the command has been initiated. You do this by beginning the command with the \'+\' symbol. So, for example, if you enter, +.ft C \" courier .nf -+mycommand + +mycommand .fi +.ft \" revert -\*(TW will initiate the command, wait AFTERWAIT seconds (default: 1), +\'twander\' will initiate the command, wait AFTERWAIT seconds (default: 1), and then update the display. See the discussion below entitled, .B Forcing Display Updates In Command Definitions for a more complete explanation. @@ -935,14 +960,14 @@ DoubleClick-Left-Mouse-Button .PD -If the selected item is a Directory, \*(TW will move into +If the selected item is a Directory, \'twander\' will move into that directory when this command is issued. If the selected item -is a file, \*(TW will attempt to execute it. Whether or not +is a file, \'twander\' will attempt to execute it. Whether or not the file is actually executed depends on how the underlying operating system views that file. In the case of Unix-like operating systems, the execute permission -must be set for the user running \*(TW (or their group) for the +must be set for the user running \'twander\' (or their group) for the file to be executed. On Win32, the file will be executed if the user has permission to do @@ -954,7 +979,7 @@ the \'notepad\' program (unless the association for ".txt" has been changed). -If \*(TW determines that it is running on neither a Unix-like +If \'twander\' determines that it is running on neither a Unix-like or Win32 system, double-clicking on a file does nothing. .TP @@ -968,7 +993,7 @@ .SS Directory Shortcuts -\*(TW provides a way to directly navigate into a frequently-used +\'twander\' provides a way to directly navigate into a frequently-used directory using a single keystroke. You can define up to 12 such "Directory Shortcuts" in the \*(CF. Each of the definitions is associated with one of the following 12 keys: @@ -1001,10 +1026,10 @@ It would be nice if we could not only keep adding things to the Clipboard, but be able to do so as we navigate around the filesystem. -\*(TW addresses these concerns by means of 12 separate "Program -Memories". As you use \*(TW, you can add (append) the names of +\'twander\' addresses these concerns by means of 12 separate "Program +Memories". As you use \'twander\', you can add (append) the names of any directories or files in the currently viewed directory by -selecting them and then using the appropriate \*(TW MEMSETx key +selecting them and then using the appropriate \'twander\' MEMSETx key (see below). To take advantage of this feature, you write Command Definitions (or manually issue a command via the RUNCMD key) which reference the contents of a Program Memory using one of the [MEMx] @@ -1012,7 +1037,7 @@ .B Program Memory Built-Ins for more details in how to apply Program Memories). -\*(TW provides key combinations for selectively setting and +\'twander\' provides key combinations for selectively setting and clearing particular Program Memories as well as a key combination for clearing all Program Memories in a single keystroke: @@ -1039,7 +1064,7 @@ .SS Sorting Options -\*(TW provides a variety of ways to sort the display. These can be +\'twander\' provides a variety of ways to sort the display. These can be selected with either a keystroke or from the Sorting Menu (see below). The meaning of the sort depends on whether or not you are in Drive List View (see @@ -1047,23 +1072,25 @@ below). The table below summarizes the keys associated with sorting and their meaning in the two possible views: +.ft C \" courier .nf - Program - Function Sort Order In Sort Order In -Key Name Normal View Drive List View ---- -------- ------------ --------------- - -Shift-F10 SORTBYNONE No Sort No Sort -Shift-F1 SORTBYPERMS Permissions Label/Share String -Shift-F2 SORTBYLINKS Links Drive Type -Shift-F3 SORTBYOWNER Owner Free Space -Shift-F4 SORTBYGROUP Group Total Space -Shift-F5 SORTBYLENGTH Length Drive Letter -Shift-F6 SORTBYTIME Time Ignored -Shift-F7 SORTBYNAME Name Ignored -Shift-F11 SORTREV Reverse Order Reverse Order -Shift-F12 SORTSEP Separate Dirs Ignored + Program + Function Sort Order In Sort Order In + Key Name Normal View Drive List View + --- -------- ------------ --------------- + + Shift-F10 SORTBYNONE No Sort No Sort + Shift-F1 SORTBYPERMS Permissions Label/Share String + Shift-F2 SORTBYLINKS Links Drive Type + Shift-F3 SORTBYOWNER Owner Free Space + Shift-F4 SORTBYGROUP Group Total Space + Shift-F5 SORTBYLENGTH Length Drive Letter + Shift-F6 SORTBYTIME Time Ignored + Shift-F7 SORTBYNAME Name Ignored + Shift-F11 SORTREV Reverse Order Reverse Order + Shift-F12 SORTSEP Separate Dirs Ignored .fi +.ft \" revert An easy way to remember these is that the function key number for the primary sort keys corresponds to the column position @@ -1092,9 +1119,9 @@ .SH MENU OPTIONS -Although \*(TW is primarily keyboard-oriented, several +Although \'twander\' is primarily keyboard-oriented, several menu-based features are also implemented to make the program more -convenient to use. These menus appear at the top of the \*(TW +convenient to use. These menus appear at the top of the \'twander\' display window, above the directory listing. .SS Invoking A Menu @@ -1111,9 +1138,9 @@ The first item in each menu is a dashed line ("----") which indicates that it is a "tearoff" menu. Clicking on the dashed line will detach -the menu from \*(TW allowing it to be placed anywhere on screen. +the menu from \'twander\' allowing it to be placed anywhere on screen. Even when detatched, these menus remain current and in-sync with -\*(TW as it continues to run. You can also tear off multiple +\'twander\' as it continues to run. You can also tear off multiple instances of these menus if you'd like copies of them at several locations on the screen simultaneously. @@ -1136,7 +1163,7 @@ which explains how such options are actually set. The MAXMENU option specifies the maximum number entries .B that will be displayed -in any dynamic menu. (\*(TW internally tracks MAXMENUBUF number of +in any dynamic menu. (\'twander\' internally tracks MAXMENUBUF number of items for each dynamic menu.) This defaults to 32 as is intended to keep the menu size reasonable. @@ -1144,7 +1171,7 @@ .B disabling all dynamic menus. It also means that no interactive dialog will "remember" your last manual entry. For example, with MAXMENU set to -0, \*(TW will not keep track of your last manual entries for the +0, \'twander\' will not keep track of your last manual entries for the CHANGEDIR, SELWILD, and RUNCMD dialogs. MAXMENUBUF specifies the size of the internal storage buffer for each @@ -1175,7 +1202,7 @@ .SS Directories Menu (Alt-d) [Shift-Right-Mouse-Button] -\*(TW keeps track of every directory visited. The previously +\'twander\' keeps track of every directory visited. The previously described command to move "Back" one directory allows directory navigation in reverse traversal order - you can back up to where you started. However, this feature "throws away" directories as it backs up, sort @@ -1200,7 +1227,7 @@ .SS History Menu (Alt-h) [Shift-Control-Right-Mouse-Button] -\*(TW keeps track of every command you attempt to execute, +\'twander\' keeps track of every command you attempt to execute, whether it is an invocation of a Command Definition found in the \*(CF or a manually entered command via the RUNCMD key. (default: Control-z) This is done whether or not the command is @@ -1278,7 +1305,7 @@ .SS Help Menu (Alt-l) [No Mouse Shortcut] This menu provides information about various internal settings of -\*(TW including User-Defined Variables, Command Definitions, +\'twander\' including User-Defined Variables, Command Definitions, Internal Program Variables, User-Settable Options, Keyboard Assignments, and Directory Shortcuts. It also has an About feature which provides version and copyright information about the program. @@ -1286,15 +1313,15 @@ For the most part, this help information should fit on screen easily. However, very long Command Definitions will probably not fit on-screen once User-Defined and Environment Variables have been substituted. In -this case, if you are curious about just how \*(TW is +this case, if you are curious about just how \'twander\' is interpreting your Command Definitions, invoke the program with the relevant debug bit turned on and watch the output on stdout as -\*(TW runs. +\'twander\' runs. -.SH THE \*(TW CONFIGURATION FILE +.SH THE \'twander\' CONFIGURATION FILE -Much of \*(TWs flexibility comes from the fact that it is +Much of \'twander\'s flexibility comes from the fact that it is a .B macro-programmable user interface. The program itself does little more than provide a way to navigate @@ -1313,10 +1340,10 @@ but you can override this with the -c command line option. (Recommended for Win32 systems - see the section below entitled, -.B INSTALLING \*(TW +.B INSTALLING \'twander\' ) -Actually, \*(TW can look in a number +Actually, \'twander\' can look in a number of places to find its \*(CF. It does this using the following scheme (in priority order): @@ -1333,43 +1360,45 @@ .B and a -c command line argument was not provided, look for a file called ".twander" in the directory from which -\*(TW was invoked. +\'twander\' was invoked. .SH CONFIGURATION FILE FORMAT -\*(TW \*(CFs consist of freeform lines of text. +\'twander\' \*(CFs consist of freeform lines of text. Each line is considered independently - no configuration line may cross into the next line. Whitespace is ignored within a line as are blank lines. -There are several possible legal lines in a \*(TW Configuration +There are several possible legal lines in a \'twander\' Configuration File: +.ft C \" courier .nf -Comments -Program Option Statements -Key Binding Statements -Directory Shortcut Statements -Wildcard Statements -Variables And Command Definitions -Conditional Processing Statements -The Include Directive + Comments + Program Option Statements + Key Binding Statements + Directory Shortcut Statements + Wildcard Statements + Variables And Command Definitions + Conditional Processing Statements + The Include Directive .fi +.ft \" revert (See the ".twander" file provided with the program distribution for examples of valid configuration statements.) -Everything else is considered invalid. \*(TW will respond with +Everything else is considered invalid. \'twander\' will respond with errors or warnings as is appropriate anytime it encounters a problem in a \*(CF. An error will cause the program to terminate, but the program continues to run after a warning. For the -most part, \*(TW tries to be forgiving and merely ignores +most part, \'twander\' tries to be forgiving and merely ignores invalid configuration statements (after an appropriate warning). It only declares an error when it cannot continue. This is true both when the program initially loads as well as during any subsequent \*(CF reloads initiated from the keyboard while running -\*(TW. +\'twander\'. The following sections describe each of the valid Configuration File entires in more detail. @@ -1378,7 +1407,7 @@ A comment is begun with the "#" character which may be placed anywhere on a line. Comments may appear freely within a \*(CF. -\*(TW strictly ignores everything from the "#" to the end of the +\'twander\' strictly ignores everything from the "#" to the end of the line on which it appears without exception. This means that "#" cannot occur anywhere within a User-Defined Variable Definition, Key Binding Statement, or Command Definition (these are described below). @@ -1387,7 +1416,7 @@ be placed on the same line to the right of such statements. It is conceivable that the "#" character might be needed in the -Command String portion of a Command Definition. \*(TW +Command String portion of a Command Definition. \'twander\' provides a Built-In Variable, [HASH], for exactly this purpose. See the section below entitled, .B Variables And Command Definitions, @@ -1395,19 +1424,21 @@ .SS Program Option Statements -Many of \*(TWs internal program defaults can be overriden in the +Many of \'twander\'s internal program defaults can be overriden in the \*(CF using Program Option statements. These statements look just like the User-Defined variables described later in this -document except \*(TW recognizes the variable name as a Program +document except \'twander\' recognizes the variable name as a Program Option rather than an arbitrary variable. Program Option Statements thus take the form: +.ft C \" courier .nf -Option Name = Option Value + Option Name = Option Value .fi +.ft \" revert The Option Name is case-sensitive and must be entered exactly as -described below. For instance, \*(TW understands +described below. For instance, \'twander\' understands "AUTOREFRESH" as a Program Option, but will treat "AutoRefresh" as a User-Defined Variable. @@ -1431,7 +1462,7 @@ the case). Furthermore, as described above, you cannot use the \'#\' symbol -as part of the string assignment because \*(TW always +as part of the string assignment because \'twander\' always treats this character as the beginning of a comment no matter where it appears. @@ -1443,38 +1474,44 @@ on what precedes the statement, you'll get different settings for the option in question. For example: +.ft C \" courier .nf -# This effectively sets BCOLOR to its default value when -# the \*(CF is reloaded -BCOLOR = - -# But this means the value of BCOLOR is set to red - -BCOLOR = red -BCOLOR = -.nf + # This effectively sets BCOLOR to its default value when + # the \*(CF is reloaded + BCOLOR = + + # But this means the value of BCOLOR is set to red + + BCOLOR = red + BCOLOR = +.fi +.ft \" revert In other words, you should think of Program Option Statements with a blank Right Hand Side as comments - present but ignored. -Other than this basic type-checking, \*(TW does no further +Other than this basic type-checking, \'twander\' does no further validation of the Right Hand Side of a Program Option Statement. -It is perfectly possible to provide a RHS which passes \*(TWs +It is perfectly possible to provide a RHS which passes \'twander\'s type validation but which makes no sense whatsoever to the program. -Entries like this cause everything from a mild \*(TW warning +Entries like this cause everything from a mild \'twander\' warning to a spectacular program failure and Python traceback on stdout: +.ft C \" courier .nf -# A Nice Way To Clobber \*(TW -BCOLOR = goo + # A Nice Way To Clobber \'twander\' + BCOLOR = goo .fi +.ft \" revert The following sections document each available Program Option using this general format: +.ft C \" courier .nf -Option-Name [Type] (Default Value) + Option-Name [Type] (Default Value) .fi +.ft \" revert .TP .B AFTERWAIT [Numeric] (1) @@ -1482,7 +1519,7 @@ It is possible to define commands so that a display refresh is forced after a command is invoked (see the section below entitled, .B Forcing Display Updates In Command Definitions -). The AFTERWAIT option tells \*(TW how long to wait after the +). The AFTERWAIT option tells \'twander\' how long to wait after the command has been initiated before actually doing the refresh. The idea here is to give the command some time to complete before updating the display. @@ -1491,7 +1528,7 @@ .TP .B AUTOREFRESH [Boolean] (True) -By default, \*(TW regularly re-reads the current directory to +By default, \'twander\' regularly re-reads the current directory to refresh the display with any changes. If you are running on a very slow machine or slow connection between the X-Windows server and client, set this option to False. You can manually force an update at @@ -1506,7 +1543,7 @@ .TP .B CMDSHELL [String] () -This option is primarily intended for people running \*(TW on +This option is primarily intended for people running \'twander\' on Unix-like operating systems like FreeBSD and Linux. As described in the .B GOTCHAS @@ -1516,26 +1553,32 @@ context so that the results will be visible, possibly using a shell as well. So, it's common to see Command Definitions like: +.ft C \" courier .nf -x MyCommand xterm -l -e bash -c 'stuff-for-my-command' + x MyCommand xterm -l -e bash -c 'stuff-for-my-command' .fi +.ft \" revert In fact, on Unix, the need for this idiom is so common, it's best to define some variables for this. If you look in the example \'.twander\' \*(CF provided in the program distribution, you'll see something like (comments removed): +.ft C \" courier .nf -SHELL = bash -c -VSHELL = [XTERM] [SHELL] -XTERM = xterm -fn 9x15 -l -e + SHELL = bash -c + VSHELL = [XTERM] [SHELL] + XTERM = xterm -fn 9x15 -l -e .fi +.ft \" revert Now the Command Definition above becomes: +.ft C \" courier .nf -x MyCommand [VSHELL] 'stuff-for-my-command' + x MyCommand [VSHELL] 'stuff-for-my-command' .fi +.ft \" revert That's all well and good for Command Definitions, but what happens when you want to @@ -1550,13 +1593,15 @@ In this case you could do either of the following in the \*(CF: +.ft C \" courier .nf -CMDSHELL = xterm -l -e bash -c + CMDSHELL = xterm -l -e bash -c - - or - + - or - -CMDSHELL = [VSHELL] # Assuming VSHELL is defined previously + CMDSHELL = [VSHELL] # Assuming VSHELL is defined previously .fi +.ft \" revert Now every time you enter a command, this will be placed in front of your text before command execution commences. @@ -1567,15 +1612,17 @@ want to leave it in as a placeholder, but deactivate CMDSHELL, use the following statement: +.ft C \" courier .nf -CMDSHELL = + CMDSHELL = .fi +.ft \" revert You also may want to occasionally use RUNCMD to do something without CMDSHELL processing, even though that feature has been defined in the \*(CF. You can disable CMDSHELL operation on a per-RUNCMD basis. Just begin your entering your command with the -double-quote (") character. \*(TW understands this to "escape" +double-quote (") character. \'twander\' understands this to "escape" CMDSHELL processing. As a general matter, CMDSHELL allows you to prepend @@ -1597,9 +1644,11 @@ starts - perhaps you want to redirect this output to a file or printer. Just add this line to your \*(CF: +.ft C \" courier .nf -DEBUGLEVEL = 0x004 + DEBUGLEVEL = 0x004 .fi +.ft \" revert .TP .B FCOLOR [String] (green) @@ -1632,8 +1681,8 @@ these strings contain the path separator character appropriate for the underlying operating system ("/" for Unix and "\\\\" for Windows). -If you set FORCEUNIXPATH to True, \*(TW will -.b always +If you set FORCEUNIXPATH to True, \'twander\' will +.B always use the Unix path separator character("/") in these substitutions, regardless of the OS in in use. @@ -1650,7 +1699,7 @@ .TP .B HEIGHT [Numeric] (600) -Initial vertical size of the \*(TW window in pixels. +Initial vertical size of the \'twander\' window in pixels. .TP .B HFCOLOR [String] (black) @@ -1678,16 +1727,16 @@ Maximum number of entries to .B display in any dynamic menu. This keeps the menu size reasonable. -Internally, \*(TW keeps track of way more than this +Internally, \'twander\' keeps track of way more than this number of dynamic entiries (see the MAXMENUBUF option below). .TP .B MAXMENUBUF [Numeric] (250) -Maximum number of items \*(TW +Maximum number of items \'twander\' .B tracks internally for each dynamic menu. This value need normally not be changed. It is present only -to bound how much memory \*(TW consumes for this task. +to bound how much memory \'twander\' consumes for this task. .TP .B MAXNESTING [Numeric] (32) @@ -1695,36 +1744,42 @@ Number of times a Command Definition is processed to dereference all variables. For example, suppose you have this: +.ft C \" courier .nf -FOO = bax -BAM = x[FOO] - -x mycmd [BAM] [SELECTION] + FOO = bax + BAM = x[FOO] + + x mycmd [BAM] [SELECTION] .fi +.ft \" revert -When you press the x key, the \*(TW command interpreter has to +When you press the x key, the \'twander\' command interpreter has to process the line repeatedly until all variables are resolved: +.ft C \" courier .nf -[BAM] [SELECTION] -> x[FOO] [SELECTION] -x[FOO] [SELECTION] -> xbax [SELECTION] -xbax [SELECTION] -> xbax selected-item + [BAM] [SELECTION] -> x[FOO] [SELECTION] + x[FOO] [SELECTION] -> xbax [SELECTION] + xbax [SELECTION] -> xbax selected-item .fi +.ft \" revert So, in this case, it took 3 iterations to do this. MAXNESTING merely sets the maximum number of times this is permitted. We have to do this to stop runaway definitions like this: +.ft C \" courier .nf -FOO = x[FOO] + FOO = x[FOO] .fi +.ft \" revert -This kind of construct will cause \*(TW to iterate +This kind of construct will cause \'twander\' to iterate MAXNESTING number of times and then give up with a warning about exeeding the nesting (dereferencing) limit. A 32 iteration limit should be plenty for any reasonable -Command Definitions. If you set MAXNESTING to 0, \*(TW +Command Definitions. If you set MAXNESTING to 0, \'twander\' will not allow .B any variable dereferencing, @@ -1772,7 +1827,7 @@ Prevents the user from navigating out of the starting directory. Command Definitions and commands initiated manually via RUNCMD (default: Control-z) can still "see" other directories, the user -just cannot move elsewhere with any of the \*(TW navigation +just cannot move elsewhere with any of the \'twander\' navigation commands. The NODETAILS and NONAVIGATE commands are @@ -1784,7 +1839,7 @@ Say you want to define a few simple commands for your boss to use which won't challenge his or her feeble managerial mind ;) By defining these commands and setting both NODETAILS and NONAVIGATE -to TRUE, you really limit what can be done with \*(TW. +to TRUE, you really limit what can be done with \'twander\'. They can't wander off into other directories and get lost, or worse yet, clobber files they don't understand. There are no details to confuse them. Your instructions for using the program @@ -1800,7 +1855,7 @@ .TP .B QUOTECHAR [String] (") -As described below, \*(TW ordinarily quotes most Built-In +As described below, \'twander\' ordinarily quotes most Built-In Variables as it replaces them during command processing. This is useful because modern operating systems allow file and directory names to have spaces in them. Such names must be @@ -1832,14 +1887,14 @@ than the default of 5 seconds), but it can be off this nominal value by quite a bit. -If you run \*(TW on a slow system (or have a slow link between +If you run \'twander\' on a slow system (or have a slow link between X-Client and X-Server) you might want to increase this value substantially. You can get into the situtation where just as one -refresh completes, its time to do the next one, and the \*(TW +refresh completes, its time to do the next one, and the \'twander\' will seem really sluggish and unresponsive. By lengthening the time between automatic updates, the amount of unresponsive behavior is reduced. Of course, this also means that any changes in the currently -viewed directory will also take longer to appear in the \*(TW +viewed directory will also take longer to appear in the \'twander\' display. .TP @@ -1856,19 +1911,21 @@ start the program in Drive List View and want to sort by Drive Type, use: SORTBYFIELD=Links. +.ft C \" courier .nf - Equivalent - Sort Key Drive List View Field - -------- --------------------- - No Sort No Sort - Permissions Label/Share String - Links Drive Type - Owner Free Space - Group Total Space - Length Drive Letter - Time Drive Letter - Name Drive Letter + Equivalent + Sort Key Drive List View Field + -------- --------------------- + No Sort No Sort + Permissions Label/Share String + Links Drive Type + Owner Free Space + Group Total Space + Length Drive Letter + Time Drive Letter + Name Drive Letter .fi +.ft \" revert .TP .B SORTREVERSE [Boolean] (False) @@ -1901,20 +1958,20 @@ .TP .B STARTX [Numeric] (0) -Initial horizontal offset of the \*(TW window in pixels. +Initial horizontal offset of the \'twander\' window in pixels. .TP .B STARTY [Numeric] (0) -Initial vertical offset of the \*(TW window in pixels. +Initial vertical offset of the \'twander\' window in pixels. .TP .B USETHREADS [Boolean] (False) -\*(TW defaults to using normal "heavy weight" processes +\'twander\' defaults to using normal "heavy weight" processes for running commands on Unix. Many Unix implementations also support a "threaded" process model. Setting USETHREADS -to True on such systems will cause \*(TW to use threads, rather than +to True on such systems will cause \'twander\' to use threads, rather than processes to launch user-defined commands. There are some known issues with thread-based operations (hence the reason this option defaults to False). These are discussed in the @@ -1937,7 +1994,7 @@ Normally, this option should be left alone. However, if you have \*(W3 installed on your system for some other reason, but don't -want it used by \*(TW, set this option to False. +want it used by \'twander\', set this option to False. The main reason to do this would be on a slow machine with very large directories. The advanced features of \*(W3 come at a @@ -1953,7 +2010,7 @@ .B WARN [Boolean] (True) Determines whether interactive warnings should be displayed -as \*(TW encounters them (while parsing a Configuration +as \'twander\' encounters them (while parsing a Configuration File or just in normal execution). Setting this option to False is the same thing as using the @@ -1966,7 +2023,7 @@ top of your \*(CF will suppress this. It is not recommended that you operate normally with the --q flag or with WARN=False. \*(TW is pretty +-q flag or with WARN=False. \'twander\' is pretty forgiving in most cases and when it does warn you about something, there is a good reason for it - you probably want to know what the problem is. @@ -1974,14 +2031,14 @@ .TP .B WIDTH [Numeric] (800) -Initial horizontal size of the \*(TW window in pixels. +Initial horizontal size of the \'twander\' window in pixels. .P A few general notes about Program Options are worth mentioning here: .IP \(bu 4 You can set the same option multiple times in a single -\*(CF - \*(TW pays no attention. +\*(CF - \'twander\' pays no attention. However, only the .B last (the one nearest the end of the file) instance of that Program Option @@ -2008,14 +2065,14 @@ actually exist on your system. If your setting in the \*(CF seems not to work, take a -look at the command window in which you started \*(TW (or start +look at the command window in which you started \'twander\' (or start it from one manually, if you're using a GUI shortcut to start it). Attempts to use unavailable colors and weights will cause Python/Tkinter to dump traceback information on stdout. .IP \(bu 4 -Although you can use proportionally spaced fonts with \*(TW, -the result is pretty ugly. \*(TW assumes a fixed width +Although you can use proportionally spaced fonts with \'twander\', +the result is pretty ugly. \'twander\' assumes a fixed width font when it calculates display formatting. Variable-width fonts will cause your display to be ragged and hard to read. @@ -2031,7 +2088,7 @@ Changing MAXMENU and then reloading the Configuration File only changes .B the number of items visible on the various dynamic menus. -\*(TW actually keeps track of more than this internally +\'twander\' actually keeps track of more than this internally (governed by the MAXMENUBUF option). Say MAXMENU is set to 4, but you've actually visited 20 different @@ -2043,20 +2100,22 @@ .IP \(bu 4 At first glance, the ability to set QUOTECHAR to any arbitary string may seem silly, but it actually has a purpose. As good as the -\*(TW macro capability is, it is still a fairly simple language. +\'twander\' macro capability is, it is still a fairly simple language. Really complex tasks will need to be handed off to some other scripting language (like Python!). It may be useful to delimit -Built-In Variables (which indicate your selections via the \*(TW +Built-In Variables (which indicate your selections via the \'twander\' interface) in such a way that your script knows where they came from. So, say you set QUOTECHAR=+++ and you have a Command Definition like this: +.ft C \" courier .nf -x mycmd MyPythonScript [DSELECTIONS] other stuff + x mycmd MyPythonScript [DSELECTIONS] other stuff .fi +.ft \" revert When MyPythonScript runs, it can immediately tell which arguments -came from \*(TW (the ones that are in the form +++dir+++ +came from \'twander\' (the ones that are in the form +++dir+++ or +++file+++) and which arguments are just other stuff. You probably won't need this often, but its nice to have. @@ -2075,14 +2134,14 @@ everyone's (anyone's!) idea of what the "correct" key bindings should be. An emacs user, vi user, BSD user, and Windows user are going to differ considerably on what keys should be bound to what -feature. \*(TW ships from the factory with a set of default key +feature. \'twander\' ships from the factory with a set of default key bindings, but it also provides a mechanism for changing these bindings via entries in the \*(CF. This feature is available only for .B Keyboard Assignments. Mouse Button Assignments may not be changed by the user. An attempt -to do so in the \*(CF will cause \*(TW to display a +to do so in the \*(CF will cause \'twander\' to display a warning and ignore the offending line. It is not difficult to override the default keyboard bindings by @@ -2090,11 +2149,13 @@ familiarity with how Tkinter names keystrokes. Good resources for learning this exist abundantly on the Internet, among them: +.ft C \" courier .nf -http://www.pythonware.com/library/tkinter/introduction/index.htm -http://www.nmt.edu/tcc/help/pubs/lang.html -http://www.cs.mcgill.ca/~hv/classes/MS/TkinterPres/ + http://www.pythonware.com/library/tkinter/introduction/index.htm + http://www.nmt.edu/tcc/help/pubs/lang.html + http://www.cs.mcgill.ca/~hv/classes/MS/TkinterPres/ .fi +.ft \" revert (As an aside - Tkinter is nothing more than a Python interface to the Tcl/Tk windowing system. The "real" naming conventions for @@ -2102,15 +2163,17 @@ both in print and on the Internet.) Keyboard binding assignments look just like variable definitions -in the \*(CF. (The \*(TW \*(CF parser +in the \*(CF. (The \'twander\' \*(CF parser automatically distinguishes between Key Binding Statements and Variable Definitions or other legitimate statements. This means you can never use one of the program function names as one of your own variable names.) Key Binding Statements thus take the form: +.ft C \" courier .nf -Program Function Name = Tkinter Keystroke Name + Program Function Name = Tkinter Keystroke Name .fi +.ft \" revert Changing the default bindings is therefore nothing more than a matter of assigning the appropriate Program Function Name (found in @@ -2136,30 +2199,34 @@ The Tkinter keynames should placed on the right side of the "=" symbol .B without any quotation marks. +.ft C \" courier .nf -# Incorrect -QUITPROG = '' + # Incorrect + QUITPROG = '' -# Correct -QUITPROG = + # Correct + QUITPROG = .fi +.ft \" revert .IP \(bu 4 The Program Function Name variables (the left side of the assignment) may not be used as names for your own user-defined variables elsewhere -in the \*(CF. In fact, \*(TW will never even +in the \*(CF. In fact, \'twander\' will never even recognize such an attempt. For example, suppose you try to do this: +.ft C \" courier .nf -QUITPROG = something-or-other + QUITPROG = something-or-other .fi +.ft \" revert Because you want to be able to reference [QUITPROG] in a subsequent -Command Definition. \*(TW will actually interpret this as just +Command Definition. \'twander\' will actually interpret this as just another key binding command, in this case binding the program function QUITPROG to "something-or-other" - probably not what you intended. Moreover, if you have a Command String somewhere with [QUITPROG] in it, -\*(TW will declare and error and abort because it has no +\'twander\' will declare and error and abort because it has no User-Defined variable of that name in its symbol table. .IP \(bu 4 @@ -2168,40 +2235,44 @@ the new bindings. .IP \(bu 4 -Be aware that \*(TW does no sanity testing on the assignments -you change. If you assign a particular \*(TW function to +Be aware that \'twander\' does no sanity testing on the assignments +you change. If you assign a particular \'twander\' function to an illegal or silly key string, the program will probably blow-up spectacularly. At the very least, that program feature will probably -be unusable, even if \*(TW manages to run. +be unusable, even if \'twander\' manages to run. .SS Directory Shortcut Statements -\*(TW provides a mechanism for directly navigating into one +\'twander\' provides a mechanism for directly navigating into one of 12 frequently used directories. 12 keys, KDIRSC1 ... KDIRSC12 (default: F1 ... F12) have been set aside for this purpose. Directory Shortcut Statements are entries in the \*(CF which associate one of these keys with a particular directory path. These statements are in the form: +.ft C \" courier .nf -DIRSCxx = path + DIRSCxx = path - where, xx is a number from 1-12 + where, xx is a number from 1-12 .fi +.ft \" revert So, for example, if you want to enter "C:\\Documents And Settings" when you press the F5 key, you would add this to your Configuration File: +.ft C \" courier .nf -DIRSC5 = c:\\Documents And Settings + DIRSC5 = c:\\Documents And Settings .fi +.ft \" revert There are several subtleties to Directory Shortcuts you should understand: .IP \(bu 4 -You can end the path with slash or not - \*(TW +You can end the path with slash or not - \'twander\' will understand the entry either way. .IP \(bu 4 @@ -2209,10 +2280,12 @@ Shortcut Statement, this is the same as having no definition at all for that key: +.ft C \" courier .nf -# This "undefines" shortcut #5 -DIRSC5 = + # This "undefines" shortcut #5 + DIRSC5 = .fi +.ft \" revert .IP \(bu 4 All defined Directory Shortcut paths are also automatically @@ -2220,12 +2293,12 @@ \*(CF reload) whether or not you've actually visited those directories. The assumption is that you will be visiting these directories a lot (which is why -you've defined shortcuts to them), so \*(TW also +you've defined shortcuts to them), so \'twander\' also makes them available in the directory "history" for easy access. .IP \(bu 4 -\*(TW does absolutely no checking of what you enter +\'twander\' does absolutely no checking of what you enter to the right of the equals sign. If you enter something silly for the shortcut path, you will probably get a warning that the directory cannot be opened when you try to run that @@ -2242,12 +2315,12 @@ .IP \(bu 4 If you enter a Directory Shortcut Name that is invalid or out of range - examples include, DIRSC01 and DIRSC13 - -\*(TW treats them like a User-Defined Variable as +\'twander\' treats them like a User-Defined Variable as described below. .SS Wildcard Statements -As discussed above, \*(TW provides powerful regular +As discussed above, \'twander\' provides powerful regular expression-based "wildcard" selection capabilities via the SELWILD command. (default: Control-\\) These regular expressions can be complex and tedious to enter @@ -2255,12 +2328,14 @@ frequently needed wildcard strings in your Configuration File using the following statement: +.ft C \" courier .nf -WILDCARD = regular-expression-string + WILDCARD = regular-expression-string .fi +.ft \" revert This regular expression will then be pre-loaded into the Wildcard Menu -(making it easy to invoke by just clicking on it) when \*(TW starts. +(making it easy to invoke by just clicking on it) when \'twander\' starts. You may place as many of these as you like in your \*(CF. (Though the menu will be limited to displaying MAXMENU number of items - see the section above on Program Option Statements.) @@ -2269,23 +2344,23 @@ .SS Variables And Command Definitions Most programs "ship from the factory" with a pre-defined -set of features or commands. \*(TW comes with +set of features or commands. \'twander\' comes with .B no built-in commands! Instead, it comes with a mechanism which allows you to specify your own .B Command Definitions. By means of a simple and very powerful macro lanuage, you "program" -\*(TW and equip it with commands of your own choosing. For +\'twander\' and equip it with commands of your own choosing. For example, you might define commands to copy, delete, edit, and move the files or directories you choose. Perhaps you have a specialized shell -script for doing backups. It's a simple matter to write a \*(TW +script for doing backups. It's a simple matter to write a \'twander\' Command Definition that will pass the names of the files and directories you've selected to that backup script. You might combine -this with \*(TWs Program Memory feature to keep a running list +this with \'twander\'s Program Memory feature to keep a running list of the files and directories you want to backup and then finally issue the backup command when you're ready. Best of all, commands you define this way are always a single keystroke. This means that -once you've programmed \*(TW to suit your needs, actually using +once you've programmed \'twander\' to suit your needs, actually using it is very fast and convenient. Command Definitions are built out of literal text and may also have @@ -2296,21 +2371,27 @@ User-Defined Variables are defined using the syntax: +.ft C \" courier .nf -Variable Name = Replacement String + Variable Name = Replacement String .fi +.ft \" revert Environment Variables are referenced using the syntax: +.ft C \" courier .nf -[$VARIABLE] + [$VARIABLE] .fi +.ft \" revert Say we have a configuration line like this, +.ft C \" courier .nf -EDITOR = emacs blah blah blah blah + EDITOR = emacs blah blah blah blah .fi +.ft \" revert Later on, when defining a command, instead of typing in "emacs blah blah blah blah", you can just refer to the variable [EDITOR] - the @@ -2322,9 +2403,11 @@ which indicates your preferred editing program. Our definition could thus become: +.ft C \" courier .nf -EDITOR = [$EDITOR] blah blah blah blah + EDITOR = [$EDITOR] blah blah blah blah .fi +.ft \" revert Why bother with this? Because it makes maintaining complex \*(CFs easier. If you look in the example ".twander" @@ -2335,13 +2418,15 @@ Here are several other subtleties regarding User-Defined Variables: .IP \(bu 4 -\*(TW variable definitions are nothing more than a +\'twander\' variable definitions are nothing more than a string substitution mechanism. Suppose you have a variable definition that refers to another variable: +.ft C \" courier .nf -NewVar = somestring [OldVar] + NewVar = somestring [OldVar] .fi +.ft \" revert It is important to realize that this only means: "If you encounter the string \'[NewVar]\' @@ -2366,23 +2451,27 @@ up to 32 levels deep (this default can be changed via the MAXNESTING Program Option). You can have constructs like: +.ft C \" courier .nf -Var1 = Foo -Var2 = Bar -FB = [Var1][Var2] + Var1 = Foo + Var2 = Bar + FB = [Var1][Var2] .fi +.ft \" revert -Later on (when defining some command) when \*(TW runs into the +Later on (when defining some command) when \'twander\' runs into the variable reference [FB], it will keep substituting variables until all [...] references have been resolved or it hits the nesting limit (The default is 32, but you can change it with the MAXNESTING option). This limit has to be imposed to catch silly things like this: +.ft C \" courier .nf -Var = a[Var] + Var = a[Var] .fi +.ft \" revert -This recursive definition is a no-no and will be cause \*(TW +This recursive definition is a no-no and will be cause \'twander\' to generate an error while parsing the \*(CF and then terminate. @@ -2390,11 +2479,13 @@ (Environment and Built-Ins). So, constructs like this are perfectly OK: +.ft C \" courier .nf -Var1 = [$PAGER] -Var2 = command-arguments -V = [Var1] [Var2] [DSELECTION] + Var1 = [$PAGER] + Var2 = command-arguments + V = [Var1] [Var2] [DSELECTION] .fi +.ft \" revert .IP \(bu 4 In the example above, notice that since the right-hand side of @@ -2412,18 +2503,20 @@ following is OK because all variables are defined by the time they are actually needed: +.ft C \" courier .nf -Var1 = foo -Var2 = [Var3] # This is just a string substitution, not a reference -Var3 = bar -MyVar = [Var1][Var2] + Var1 = foo + Var2 = [Var3] # This is just a string substitution, not a reference + Var3 = bar + MyVar = [Var1][Var2] -# Now comes the Command Definition -# If we put this before the Variable Definitions above, -# it would be an error. + # Now comes the Command Definition + # If we put this before the Variable Definitions above, + # it would be an error. -x mycommand [MyVar] + x mycommand [MyVar] .fi +.ft \" revert .IP \(bu 4 Variable Names are case-sensitive - [EDITOR], [Editor], @@ -2446,23 +2539,25 @@ .IP \(bu 4 A Variable Name must never begin with "$". This is because a Command Definition containing a string in the form [$something] is understood -by \*(TW to be a reference to an +by \'twander\' to be a reference to an .B Environment Variable, named "something". If you do this: +.ft C \" courier .nf -$MYVAR = some-string + $MYVAR = some-string .fi +.ft \" revert You will never be able to subsequently reference it because, -[$MYVAR] tells \*(TW to look in the current environment, +[$MYVAR] tells \'twander\' to look in the current environment, not its own symbol table to resolve the reference. However, note that "$" symbol may appear anywhere else but the first character of a variable name. So, for example, MY$VAR is fine. .IP \(bu 4 -Unlike previous versions of \*(TW, Variable Names may be redefined. -This makes it more convenient to exploit the ability for \*(TW +Unlike previous versions of \'twander\', Variable Names may be redefined. +This makes it more convenient to exploit the ability for \'twander\' to process the contents of a \*(CF conditionally (see the .B Conditional Processing Statements section below). @@ -2470,29 +2565,33 @@ For example, you can set a variable to some default value, and then override it if a condition is satisfied: +.ft C \" courier .nf -# Assume we're running on a Unix-like system + # Assume we're running on a Unix-like system -MyEditor = [$EDITOR] + MyEditor = [$EDITOR] -# Override this if we're on Win32 + # Override this if we're on Win32 -\&.if [.OS] == nt - MyEditor = write -\&.endif + \&.if [.OS] == nt + MyEditor = write + \&.endif +.fi +.ft \" revert .SS Command Definitions - -The heart of the \*(TW configuration process is creating +The heart of the \'twander\' configuration process is creating of one or more .B Command Definitions. These definitions are the way user-defined commands are added to a -given instance of \*(TW. A Command Definition consists of three +given instance of \'twander\'. A Command Definition consists of three fields separated by whitespace: +.ft C \" courier .nf -Command-Key Command-Name Command-String + Command-Key Command-Name Command-String .fi +.ft \" revert The .B Command Key @@ -2500,7 +2599,7 @@ the key that will be used to invoke the command from the keyboard. Command Keys are case-sensitive. If "m" is used as a Command Key, "M" will not invoke that command. Command Keys must be unique within a -given \*(CF. If \*(TW finds multiple Command +given \*(CF. If \'twander\' finds multiple Command Definitions assigned to the same Command Key, it will associate the .B last definition it finds with that Command Key. A Command Key can @@ -2519,22 +2618,24 @@ The .B Command String -is any arbitrary string which is what \*(TW actually tries to +is any arbitrary string which is what \'twander\' actually tries to execute when the command is invoked. .SS A Simple Command Definition In its simplest form, a Command Definition looks like this: +.ft C \" courier .nf -# A simple Command Definition -m MyMore more somefile + # A simple Command Definition + m MyMore more somefile .fi +.ft \" revert This command can be invoked pressing the "m" key on the keyboard or selecting the "MyMore" entry from the Command Menu - either directly from the menu or from the Command Menu Pop-Up. No matter how it is -invoked, \*(TW will then execute the command, "more somefile". +invoked, \'twander\' will then execute the command, "more somefile". The problem is that this command as written actually will not give you the result you'd like (...well, on X-Windows - is does work on Win32 @@ -2545,10 +2646,12 @@ is run \'more\' inside a copy of \'xterm\'. Now our command looks like this: +.ft C \" courier .nf -# Our command setup to run as a GUI window -m MyMore xterm -l -e more somefile + # Our command setup to run as a GUI window + m MyMore xterm -l -e more somefile .fi +.ft \" revert .SS Forcing Display Updates In Command Definitions @@ -2556,22 +2659,24 @@ You are likely to define commands that change the contents of the currently-viewed directory somehow. For instance, commands that rename, create, or delete files in the current directory all have this -effect. When such a command is run, it means that the \*(TW display is +effect. When such a command is run, it means that the \'twander\' display is "out of sync" with the actual disk contents until the next refresh cycle - automatic if AUTORFRESH is enabled, manual otherwise. Placing \'+\' symbol to the beginning of the Command String tells -\*(TW that, when the command is run, a display refresh should be +\'twander\' that, when the command is run, a display refresh should be forced afterwards. Not immediately afterwards, but AFTERWAIT seconds (default: 1) later. Why? To give the command in question a chance to complete before updating the display. For instance, +.ft C \" courier .nf -r removelogs +rm -f *log + r removelogs +rm -f *log .fi +.ft \" revert This means that when the \'r\' key is pressed, the command, -"rm -f *.log" is run, and then, AFTERWAIT seconds later, \*(TW +"rm -f *.log" is run, and then, AFTERWAIT seconds later, \'twander\' will force a display update. This happens regardless of the current AUTOREFRESH settings. @@ -2592,14 +2697,16 @@ throughout the whole \*(CF? Now, our command looks like this: +.ft C \" courier .nf -# Our command enhanced with a User-Defined Variable. -# Remember that the variable has to be defined *before* -# it is referenced. + # Our command enhanced with a User-Defined Variable. + # Remember that the variable has to be defined *before* + # it is referenced. -XTERM = xterm -l -e # This defines the variable -m MyMore [XTERM] more somefile # And the command then uses it + XTERM = xterm -l -e # This defines the variable + m MyMore [XTERM] more somefile # And the command then uses it .fi +.ft \" revert .SS Environment Variables In A Command String @@ -2611,21 +2718,23 @@ like any other variable as explained previously. Now our command looks like this: +.ft C \" courier .nf -# Our command using both a User-Defined Variable and -# an Environment Variable to make it more general + # Our command using both a User-Defined Variable and + # an Environment Variable to make it more general -XTERM = xterm -l -e -m MyMore [XTERM] [$PAGER] somefile + XTERM = xterm -l -e + m MyMore [XTERM] [$PAGER] somefile .fi +.ft \" revert .SS Built-In Variables In A Command String It would also be really nice if the command applied to more than just -a single file called "somefile". The whole point of \*(TW +a single file called "somefile". The whole point of \'twander\' is to allow you to use the GUI to select one or more directories and/or files and have your Command Definitions make use of those -selections. \*(TW uses a set of +selections. \'twander\' uses a set of .B Built-In Variables to communicate the current directory and user selections to the any commands you've defined. Built-In Variables are referenced @@ -2636,13 +2745,15 @@ with our paging program. Now our command becomes: +.ft C \" courier .nf -# Our command in its most generic form using -# User-Defined, Environment, and Built-In Variables + # Our command in its most generic form using + # User-Defined, Environment, and Built-In Variables -XTERM = xterm -l -e -m MyMore [XTERM] [$PAGER] [DSELECTION] + XTERM = xterm -l -e + m MyMore [XTERM] [$PAGER] [DSELECTION] .fi +.ft \" revert The "DSELECTION" built-in is what communicates the currently selected item from the GUI to your command when the command @@ -2650,7 +2761,7 @@ .SS Selection-Related Built-Ins -\*(TW has a rich set of Built-In Variables for use in your +\'twander\' has a rich set of Built-In Variables for use in your Command Definitions. The first group of these is used to convey your current directory and items which you've selected to a Command Definition: @@ -2659,7 +2770,7 @@ .IP \(bu 4 .B [DIR] -[DIR] is replaced with the current directory \*(TW +[DIR] is replaced with the current directory \'twander\' is viewing. .IP \(bu 4 @@ -2703,7 +2814,7 @@ .IP \(bu 4 .B [HASH] -Because \*(TW always recognizes the "#" as the beginning of a +Because \'twander\' always recognizes the "#" as the beginning of a comment, there is no direct way to include this character in a Command String. It is conceivable that some commands (such as \'sed\') need to make use of this character. The [HASH] built-in is provided for @@ -2724,18 +2835,20 @@ extremely powerful. For instance, say you want to create a group copy command: +.ft C \" courier .nf -# Copy a group of items to a location set by -# the user at runtime -UnixCopy = cp -R -Win32Copy = copy + # Copy a group of items to a location set by + # the user at runtime + UnixCopy = cp -R + Win32Copy = copy -# Unix Version -c UnixCP [UnixCopy] [DSELECTIONS] [PROMPT:Enter Destination] + # Unix Version + c UnixCP [UnixCopy] [DSELECTIONS] [PROMPT:Enter Destination] -# Win32 Version -C Win32CP [Win32Copy] [DSELECTIONS] [PROMPT:Enter Destination] + # Win32 Version + C Win32CP [Win32Copy] [DSELECTIONS] [PROMPT:Enter Destination] .fi +.ft \" revert .IP \(bu 4 .B [YESNO:Question-String] @@ -2749,13 +2862,15 @@ command. Before running it, it's good to prompt the user to confirm their intentions: +.ft C \" courier .nf -D BigDelete [YESNO:Are You Absolutely Sure About This?] rm -rf [SELECTIONS] + D BigDelete [YESNO:Are You Absolutely Sure About This?] rm -rf [SELECTIONS] .fi +.ft \" revert .SS Program Memory Built-Ins -As described previously, \*(TW implements an advanced notion of +As described previously, \'twander\' implements an advanced notion of a Clipboard called "Program Memories". There is a corresponding group of Built-In Variables which allows the contents of these memories to be used in a Command Definition: @@ -2768,9 +2883,11 @@ the first Program Memory to the current directory we could define a move command like this: +.ft C \" courier .nf -m move mv [MEM1] ./ + m move mv [MEM1] ./ .fi +.ft \" revert .SS Notes On Built-In Variable Use @@ -2781,7 +2898,7 @@ even though it is visible in the GUI. This provides maximum flexibility when defining commands. It is up to the command author to insert the appropriate path separator character where needed. (NOTE: -Earlier releases of \*(TW +Earlier releases of \'twander\' .B did include the trailing path separator and you may have to edit older \*(CFs accordingly. This change was necessary @@ -2791,30 +2908,34 @@ For example, another way to express the full path of the currently selected item is: +.ft C \" courier .nf -# Unix Path Separator -UPSEP = / + # Unix Path Separator + UPSEP = / -#Win32 Path Separator -WPSEP = \\ + #Win32 Path Separator + WPSEP = \\ -[DIR][UPSEP][SELECTION] + [DIR][UPSEP][SELECTION] - - or - + - or - -[DIR][WPSEP][SELECTION] + [DIR][WPSEP][SELECTION] .fi +.ft \" revert -Be aware that, because of \*(TW quoting rules, such constructs +Be aware that, because of \'twander\' quoting rules, such constructs will result in strings like: +.ft C \" courier .nf -"/mydir"/"myfile" + "/mydir"/"myfile" - - or - + - or - -.B "C:\\mydir"\\"myfile" + "C:\\mydir"\\"myfile" .fi +.ft \" revert This should not generally be a problem with the various Unix shells, and may work for some Win32 commands. However, some @@ -2827,7 +2948,7 @@ .IP \(bu 4 User-Defined and Environment Variables are processed -at the time the \*(CF is read by \*(TW. That +at the time the \*(CF is read by \'twander\'. That is, they are handled .B once at load time. @@ -2843,16 +2964,18 @@ default is recommended so that any built-in substitutions of, say, file names with spaces in them, will be properly recognized by your commands. You can suppress the addition of double-quotes by using the --t command line option when starting \*(TW. +-t command line option when starting \'twander\'. .IP \(bu 4 Any of the variable types may appear multiple times in the same Command String. For example, suppose you want to define a generic Unix copy command: +.ft C \" courier .nf -g gencopy cp -R [PROMPT:Enter Source] [PROMPT:Enter Destination] + g gencopy cp -R [PROMPT:Enter Source] [PROMPT:Enter Destination] .fi +.ft \" revert When the user presses "g" (or clicks on "gencopy" on the Command Menu), they will be presented with two prompts, one after the other, @@ -2861,12 +2984,12 @@ .SS Conditional Processing Statements -Most of \*(TWs power lies in its ability to be customized to each +Most of \'twander\'s power lies in its ability to be customized to each different user and operating system via its \*(CF. To make this a bit -easier to manage, the \*(TW configuration language recognizes +easier to manage, the \'twander\' configuration language recognizes so-called "Conditional Processing Statements". These statements give you the ability to write a single \*(CF which automatically tailors -itself to run \*(TW properly wherever you are running. +itself to run \'twander\' properly wherever you are running. The general idea is to define a "Condition Block" which begins by doing a logical test. If that test evaluates to True, all statements @@ -2876,65 +2999,67 @@ A Conditional Block always begins with a "Condition Test Statement" and ends with the ".endif" statement. Conditional Processing -Statements may be nested without limit. \*(TW keeps track of which +Statements may be nested without limit. \'twander\' keeps track of which \&'.endif' matches which Condition Test Statement. Like all \*(CF entries, whitespace is ignored when processing Conditional Statements and you are free to indent (or not) as you see fit. Condition Test Statements are one of three types: +.ft C \" courier .nf -##### -# Existential: True if FOO or $FOO are defined -##### + ##### + # Existential: True if FOO or $FOO are defined + ##### - \&.if [FOO] - ... -\&.endif + \&.if [FOO] + ... + \&.endif - .if [$FOO] - ... -\&.endif + .if [$FOO] + ... + \&.endif -##### -# Equality: True if FOO or $FOO are literally -# the same as the test-string -##### + ##### + # Equality: True if FOO or $FOO are literally + # the same as the test-string + ##### -\&.if [FOO] == test-string - ... -\&.endif + \&.if [FOO] == test-string + ... + \&.endif -\&.if [$FOO] == test-string - ... -\&.endif + \&.if [$FOO] == test-string + ... + \&.endif -##### -# Inequality: True if FOO or $FOO are literally -# not the same as the test-string -##### + ##### + # Inequality: True if FOO or $FOO are literally + # not the same as the test-string + ##### -\&.if [FOO] != test-string - ... -\&.endif + \&.if [FOO] != test-string + ... + \&.endif -\&.if [$FOO] != test-string - ... -\&.endif + \&.if [$FOO] != test-string + ... + \&.endif .fi +.ft \" revert To make it easy to create conditional blocks based on the type of -system you're running, \*(TW automatically pre-defines two variables +system you're running, \'twander\' automatically pre-defines two variables which provide information about your system: .B \&.OS (typically: nt, posix) and .B \&.PLATFORM -(typically: freebsd4, linux-i386, win32). You should run \*(TW and +(typically: freebsd4, linux-i386, win32). You should run \'twander\' and examine the "User-Defined Variables" section of the Help Menu to see how these variables are set on your system. These predefined variables show up as "User Defined Variables" in the -various \*(TW Help and Debug outputs, but they begin with a period to +various \'twander\' Help and Debug outputs, but they begin with a period to remind you of their intended role. They will thus also sort first in the User-Defined Variables section of the Help Menu. @@ -2961,9 +3086,11 @@ The Right Hand Side of an (in)equality test is just a string comparsion - no variable expansion is done: +.ft C \" courier .nf -\&.if [FOO] == string[BAR] + \&.if [FOO] == string[BAR] .fi +.ft \" revert This will not work as you might expect because the contents of variable FOO are literally compared to the string, "string[BAR]". @@ -2986,13 +3113,15 @@ You may include other files in your \*(CF with the following directive: +.ft C \" courier .nf -\&.include path-to-file + \&.include path-to-file .fi +.ft \" revert You may place as many of these statements in your \*(CF as you wish. The only syntactic requirement is that there must be whitespace -between the directive and the file path. \*(TW makes no attempt +between the directive and the file path. \'twander\' makes no attempt to validate that path, and you will see an warning message if the file you specify cannot be opened. @@ -3007,36 +3136,40 @@ you have the following "standard" configuration file available on your system: +.ft C \" courier .nf -# Contents of /usr/local/etc/.twander.global + # Contents of /usr/local/etc/.twander.global -SHELL = bash -c -XTERM = xterm -fn 9x15 -l -VSHELL = [XTERM] -e [SHELL] + SHELL = bash -c + XTERM = xterm -fn 9x15 -l + VSHELL = [XTERM] -e [SHELL] -DIRSC1 = /usr/local -DIRSC2 = /usr/sbin + DIRSC1 = /usr/local + DIRSC2 = /usr/sbin -t terminal [XTERM] + t terminal [XTERM] .fi +.ft \" revert Now, you can create your own personal \*(CF which takes advantage of this standard file, but augments it with additional configuration information of your choosing: +.ft C \" courier .nf -# Contents of $HOME/.twander + # Contents of $HOME/.twander -\&.include /usr/local/etc/.twander.global + \&.include /usr/local/etc/.twander.global -DIRSC2 = /etc + DIRSC2 = /etc -l ls [VSHELL] 'ls -al | [$PAGER]' + l ls [VSHELL] 'ls -al | [$PAGER]' .fi +.ft \" revert -Keep in mind that \*(TW reads the contents of its \*(CF +Keep in mind that \'twander\' reads the contents of its \*(CF .B in order. In this case, it means that all of "/usr/local/etc/.twander.global" is read and @@ -3052,17 +3185,17 @@ .SH ADVANCED WIN32 FEATURES -As shipped from the factory, \*(TW runs pretty much identically on -various Unix variants (FreeBSD, Linux) and Win32. However, \*(TW is +As shipped from the factory, \'twander\' runs pretty much identically on +various Unix variants (FreeBSD, Linux) and Win32. However, \'twander\' is written to take advantage of Mark Hammond's \*(W3 Python extensions if they are present on the system. These extensions add many -Windows-specific features to Python and allow \*(TW to provide quite a +Windows-specific features to Python and allow \'twander\' to provide quite a bit more Windows-centric information about files, directories, and drives. You do .B not -have to install \*(W3 for \*(TW to operate properly +have to install \*(W3 for \'twander\' to operate properly on your Win32 system. Installing this package just means you'll -get even more \*(TW features on Win32 than you would otherwise. +get even more \'twander\' features on Win32 than you would otherwise. If you've installed \*(W3, you can toggle these features on- and off with the TOGWIN32ALL key described above. @@ -3086,12 +3219,12 @@ emulate portions of the Win32 API and do not implement the advanced security features found in the NTFS file system. Therefore, as noted below, some of these features will not work on any of the older 16-bit -Windows operating systems. \*(TW handles this gracefully +Windows operating systems. \'twander\' handles this gracefully without blowing-up so you can safely have \*(W3 installed on one of these older systems to take advantage of the features that do work. -Once you have these extensions installed, \*(TW will +Once you have these extensions installed, \'twander\' will automatically enable three new features otherwise unavailable. .IP \(bu 4 @@ -3108,15 +3241,17 @@ detailed entry in the display will have one or more of the following attributes displayed in what is normally the Unix permissions field: +.ft C \" courier .nf -d - Directory -A - Archive -C - Compressed -H - Hidden -N - Normal -R - Read-Only -S - System + d - Directory + A - Archive + C - Compressed + H - Hidden + N - Normal + R - Read-Only + S - System .fi +.ft \" revert .IP \(bu 4 A top-level "Drive List View" is enabled if \*(W3 is installed. This @@ -3125,19 +3260,21 @@ drives, the drive label is shown. For network-attached drives, the share string is shown. The drive type (CD/DVD, Fixed, Ramdisk, Remote, Removable) is shown as are the free, and total space -statistics. As is the case with other \*(TW displays, these details +statistics. As is the case with other \'twander\' displays, these details can be toggled on- and off via the TOGDETAIL key. You can enter the Drive List View in a number of ways: +.ft C \" courier .nf -1) Select the ".." from the root directory of any drive. -2) Enter the string "\\\\" from the CHANGDIR dialog. -3) Press the DRIVELIST key. (default: Control-k) -4) Start \*(TW using "\\\\" as the starting directory - argument, either on the command line or using the - \*(CF STARTDIR option. + 1) Select the ".." from the root directory of any drive. + 2) Enter the string "\\\\" from the CHANGDIR dialog. + 3) Press the DRIVELIST key. (default: Control-k) + 4) Start \'twander\' using "\\\\" as the starting directory + argument, either on the command line or using the + \*(CF STARTDIR option. .fi +.ft \" revert The "Drive List View" is available on all Win32 variants, however the free/total space values will be incorrect on older systems like Win98. @@ -3158,22 +3295,22 @@ The [DIR] Built-In returns an empty string in this view. .IP \(bu 4 -Normally, as you navigate around a file system, \*(TW sets its +Normally, as you navigate around a file system, \'twander\' sets its own program context to the current directory. This is why you can write Command Definitions using only the file/directory name currently -selected - \*(TW knows the current directory. When you are in +selected - \'twander\' knows the current directory. When you are in Drive List View, the notion of "current directory" has no real -meaning. So, \*(TW treats the directory from which you entered +meaning. So, \'twander\' treats the directory from which you entered Drive List View as the "current directory" while in that view. .IP \(bu 4 -By default, \*(TW automatically rereads the current view +By default, \'twander\' automatically rereads the current view about every 3 seconds. This is fine for a file/directory view but would be annoyingly slow in the Drive List View since it takes a moment or two to get the status of any floppy disk drives attached to the system. Instead of forcing the user to listen to (and wait for) the floppy drive status to be determined -every 3 seconds, \*(TW +every 3 seconds, \'twander\' .B only reads the drive information once when it enters Drive List View. This means if a drive is connected or a floppy is inserted into the system while in Drive List View, this fact will not be automatically @@ -3204,31 +3341,33 @@ setting the USEWIN32ALL option to False in the \*(CF. This allows you to leave \*(W3 installed on your system if you need it for other reasons but don't want these features -enabled in \*(TW +enabled in \'twander\' .SH GOTCHAS -There are several tricky corners of \*(TW which need +There are several tricky corners of \'twander\' which need further explanation: .SS Program Starts Very Slowly -\*(TW attempts to determine the name of the host on which it is +\'twander\' attempts to determine the name of the host on which it is running at program startup. This is used in the titlebar display. It first looks to see if the environment variable HOSTNAME is set, and -uses that value if it is. If this variable is not set, \*(TW +uses that value if it is. If this variable is not set, \'twander\' does a socket call to see if it can determine the hostname that way. Either of these methods works fine, but the socket call can be very slow if the network is misconfigured or malfunctioning. If -\*(TW is starting very slowly, try setting HOSTNAME explicitly +\'twander\' is starting very slowly, try setting HOSTNAME explicitly in your environment - this will prevent the socket call from ever taking place. A simple way to do this with \'ksh\' or \'bash\' is: +.ft C \" courier .nf -export HOSTNAME=`hostname` + export HOSTNAME=`hostname` .fi +.ft \" revert (Note the backticks used to execute the \'hostname\' program and assign its results to HOSTNAME.) @@ -3241,28 +3380,30 @@ On Win32, environment variables are set via the System Properties menu. -.SS \*(TW Loads Slowly +.SS \'twander\' Loads Slowly -\*(TW is a fairly large Python program and can take a few seconds to +\'twander\' is a fairly large Python program and can take a few seconds to load and initialize, especially on older, slower systems. You can speed this up a bit by creating an optimized byte-code version of the program as follows (make sure you have appropriate administrative permission to do this): +.ft C \" courier .nf -1) Go to the directory where the twander.py file is located. -2) Type the following command: python -O -3) Once Python is loaded type: import twander -4) Exit \*(TW. -5) Exit Python by pressing Control-d on Unix or - Control-z on Win32. -6) You will now see a new file in this directory: twander.pyo - This file should be significantly smaller than twander.py. -7) Now you can run the program by entering: python twander.pyo - on Unix/Win32 or pythonw twander.pyo on Win32. -8) You have to repeat this procedure each time you install - a new version of twander.py + 1) Go to the directory where the twander.py file is located. + 2) Type the following command: python -O + 3) Once Python is loaded type: import twander + 4) Exit \'twander\'. + 5) Exit Python by pressing Control-d on Unix or + Control-z on Win32. + 6) You will now see a new file in this directory: twander.pyo + This file should be significantly smaller than twander.py. + 7) Now you can run the program by entering: python twander.pyo + on Unix/Win32 or pythonw twander.pyo on Win32. + 8) You have to repeat this procedure each time you install + a new version of twander.py .fi +.ft \" revert .SS Cannot Enter Certain Directories On Win32 @@ -3275,22 +3416,26 @@ This is done by editing a file called "site.py". This file is normally found in: +.ft C \" courier .nf -C:\\Program Files\\PythonXX\\Lib + C:\\Program Files\\PythonXX\\Lib .fi +.ft \" revert Where "XX" is the actual version of Python you're running. Open this file with an editor and look for the following text: +.ft C \" courier .nf -encoding = "ascii" # Default value set by _PyUnicode_Init() + encoding = "ascii" # Default value set by _PyUnicode_Init() -if 0: - # Enable to support locale aware default string encodings. - import locale + if 0: + # Enable to support locale aware default string encodings. + import locale .fi +.ft \" revert Change the .B if 0: @@ -3301,64 +3446,74 @@ .SS Getting Command Results Displayed In A New Window -When you invoke a command via \*(TW (whether via a command +When you invoke a command via \'twander\' (whether via a command definition in the \*(CF or the keyboard shortcut), you generally want it to run in a new window. This turns out to be tricky on Unix-like systems. If the program you are running is GUI-aware, -this should not be a problem. However, if you are using \*(TW +this should not be a problem. However, if you are using \'twander\' to run a command line program or script, you have to take extra care in the formulation of the Command String. In the case of Unix-like systems you have to invoke the command so that it runs in some GUI context. Say you want to use a pager like \'less\' to view files. You would expect that this entry might do it: +.ft C \" courier .nf -V view less [DSELECTIONS] + V view less [DSELECTIONS] .fi +.ft \" revert Sadly, this will not work, at least not the way you expect. -If you started \*(TW from a terminal session and use +If you started \'twander\' from a terminal session and use the command above, it will work, but the results will appear in the invoking terminal window, .B not -in a new window as you might expect. If you started \*(TW +in a new window as you might expect. If you started \'twander\' from a GUI or disconnected it from the initiating terminal with a \'nohup\' ... & invocation, you will get .B no -output. This is not a \*(TW problem, it is innate to how +output. This is not a \'twander\' problem, it is innate to how command line programs run under Unix shell control. To achieve the desired results, you have to create a new GUI window in which your command can run and display results. The easiest way to do this is to run your command in a new \'xterm\' window like this: +.ft C \" courier .nf -V view xterm -l -e less [DSELECTIONS] + V view xterm -l -e less [DSELECTIONS] .fi +.ft \" revert Some program further require you to provide a shell so they can execute correctly. For instance, running \'ls\' in a command definition requires something like this: +.ft C \" courier .nf -L lshome xterm -l -e bash -c 'ls / | [$PAGER]' + L lshome xterm -l -e bash -c 'ls / | [$PAGER]' .fi +.ft \" revert In fact, this idiom is so common, you will see variables defined in the example ".twander" file to simplify such definitions (comments removed): +.ft C \" courier .nf -SHELL = bash -c -VSHELL = [XTERM] [SHELL] -XTERM = xterm -fn 9x15 -l -e + SHELL = bash -c + VSHELL = [XTERM] [SHELL] + XTERM = xterm -fn 9x15 -l -e .fi +.ft \" revert Now you can write the command above like this: +.ft C \" courier .nf -L lshome [VSHELL] 'ls / | [$PAGER]' + L lshome [VSHELL] 'ls / | [$PAGER]' .fi +.ft \" revert This causes your command line program to execute in an \'xterm\' @@ -3374,10 +3529,10 @@ However, .B which terminal window is used for output can be confusing. If you -start \*(TW from a terminal session, +start \'twander\' from a terminal session, all terminal output will be sent to .B the terminal session you used to invoke the program. -The way to work around this is to start \*(TW from a Win32 +The way to work around this is to start \'twander\' from a Win32 shortcut, using \'pythonw.exe\' rather than \'python.exe\'. Now each time you run a command that needs a terminal session for output, Win32 will automatically create that session for you. @@ -3390,9 +3545,11 @@ interact with the user. For example, you might want to define a directory listing command for Win32 like this: +.ft C \" courier .nf -L DirList dir [PROMPT:Directory Of What?] | more + L DirList dir [PROMPT:Directory Of What?] | more .fi +.ft \" revert When the user presses the "L", they are presented with a dialog box into which they enter their directory name @@ -3402,25 +3559,31 @@ On Unix-like systems, however, this does not work as expected. Suppose we define the command for these systems to be: +.ft C \" courier .nf -L DirList [VSHELL] 'ls -l [PROMPT:Directory Of What?] | [$PAGER]' + L DirList [VSHELL] 'ls -l [PROMPT:Directory Of What?] | [$PAGER]' .fi +.ft \" revert This works fine .B so long as the user does not enter a wildcard pattern -in response to the prompt. Why? Recall that \*(TW +in response to the prompt. Why? Recall that \'twander\' quotes all Built-In Variable substitutions by default. If the user enters this at the prompt: +.ft C \" courier .nf -/kern* + /kern* .fi +.ft \" revert -The command \*(TW tries to execute is: +The command \'twander\' tries to execute is: +.ft C \" courier .nf -VSHELL Stuff ... 'ls -l "/kern*" | ... pager stuff + VSHELL Stuff ... 'ls -l "/kern*" | ... pager stuff .fi +.ft \" revert The argument to \'ls\' is double-quoted. The Unix shells understands this kind of quoting to mean @@ -3444,9 +3607,11 @@ shell's ability to handle multiple commands on one line separated by semi-colons: +.ft C \" courier .nf -L DirList [VSHELL] 'UsrResp=[PROMPT:Directory Of What?] ; ls -l $UsrResp | [$PAGER]' + L DirList [VSHELL] 'UsrResp=[PROMPT:Directory Of What?] ; ls -l $UsrResp | [$PAGER]' .fi +.ft \" revert Why does this work? Because the shell interprets (and drops) the double-quotes, when the results of the [PROMPT:...] are @@ -3467,12 +3632,12 @@ Notice our example commands above do not end with "&". These should not be needed on either Unix-like or Win32 operating systems. When a -command is executed, \*(TW starts a process which runs concurrently -with \*(TW itself. This means you should be able to continue using -\*(TW while the new command executes. +command is executed, \'twander\' starts a process which runs concurrently +with \'twander\' itself. This means you should be able to continue using +\'twander\' while the new command executes. If you enable the use of threads by setting USETHREADS to True, you -may see \*(TW locked out while the new command runs - so-called +may see \'twander\' locked out while the new command runs - so-called "modal" operation. If this happens, it means your system does not completely or correctly implement threading and you must use conventional "heavy weight" processes (the default) rather than @@ -3482,7 +3647,7 @@ It appears that some X Windows implementations (noted on XFree86 / FreeBSD) do not correctly destroy an \'xterm\' window after a command -initiated with -e terminates. This is not a \*(TW problem - it is +initiated with -e terminates. This is not a \'twander\' problem - it is an artifact of thread behavior on such systems and only happens if you set USETHREADS=True. The workaround is to use the default USETHREADS=False setting. @@ -3502,9 +3667,9 @@ .B really slow response times when you change to a new directory. This occurs when you enter a huge directory with thousands of file or subdirectory -entries. \*(TW has to to compute the detail information for +entries. \'twander\' has to to compute the detail information for each of these entries and this can take a lot of time. On a fast -machine with modern hard drives and controllers, \*(TW is able +machine with modern hard drives and controllers, \'twander\' is able to process several thousand entries in just a second or two. However, a number of factors can significantly slow down this process: @@ -3514,11 +3679,11 @@ right away. The program will appear to hang. There are two possibilities here. Either disable autorefreshing (via the -r command line option or the AUTOREFRESH \*(CF option), or set the -REFRESHINT value to some high number so that \*(TW has plenty +REFRESHINT value to some high number so that \'twander\' has plenty of time to process a directory before the next refresh occurs. .IP \(bu 4 -Slow disk drives. You can really watch \*(TW grind if you +Slow disk drives. You can really watch \'twander\' grind if you change to a large directory on a CDROM, for instance. There is no good solution here. These drives are inherently slower than hard drives, and you just have to wait. Make sure you lengthen your @@ -3541,7 +3706,7 @@ .SS Your \*(CF Does Not Produce The Desired Results -It's easy to fall into the trap of treating the \*(TW +It's easy to fall into the trap of treating the \'twander\' configuration capabilities as a real "programming language". It is not, it is a fairly simple macro language that does very little more than string substitutions. @@ -3571,19 +3736,21 @@ .IP \(bu 4 When testing for the existence of a User-Defined or Environment -Variable, \*(TW does not care what +Variable, \'twander\' does not care what .B value the variable contains. It is perfectly permissible to have either type of variable set to an empty string. The fact that the variable exists at all is what makes the following construct true: +.ft C \" courier .nf -CondVar = -\&.if [CondVar] - .... -\&.endif + CondVar = + \&.if [CondVar] + .... + \&.endif .fi +.ft \" revert .IP \(bu 4 You have to be careful when overriding variable or command @@ -3594,15 +3761,17 @@ it has already been used in a Command Definition, only future references to that variable will reflect the change: +.ft C \" courier .nf -FOO = bar + FOO = bar -x cmd1 command [FOO] + x cmd1 command [FOO] -FOO = baz + FOO = baz -y cmd2 command [FOO] + y cmd2 command [FOO] .fi +.ft \" revert In this example, the first command will be defined as "command bar", but the second will be defined as "command baz". @@ -3613,63 +3782,65 @@ .P Common mistakes include: +.ft C \" courier .nf -##### -# Trying to embed a variable where it will never be resolved -##### + ##### + # Trying to embed a variable where it will never be resolved + ##### -DIRSC03 = [$SystemDrive]\\Program Files -MYCOLOR = blue -FCOLOR = [MYCOLOR] + DIRSC03 = [$SystemDrive]\\Program Files + MYCOLOR = blue + FCOLOR = [MYCOLOR] -##### -# Expecting a conditional variable to be resolved before the test -# Suppose $EDITOR is set to "/usr/local/bin/emacs" ... -# -# The following will be False because [EDT] equals -# the string "[$EDITOR]". It is not replaced -# with "/usr/local/bin/emacs" until [EDT] appears -# in a Command Definition -##### + ##### + # Expecting a conditional variable to be resolved before the test + # Suppose $EDITOR is set to "/usr/local/bin/emacs" ... + # + # The following will be False because [EDT] equals + # the string "[$EDITOR]". It is not replaced + # with "/usr/local/bin/emacs" until [EDT] appears + # in a Command Definition + ##### -EDT = [$EDITOR] + EDT = [$EDITOR] -\&.if [EDT] == /usr/local/bin/emacs - ... -\&.endif - - -# Note, however, that *this* would work because -# Environment Variables are permitted in conditionals ... - -\&.if [$EDITOR] == /usr/local/bin/emacs - ... -\&.endif - -##### -# A badly formed condition is ignored (after a warning) -# which means *all the lines following will be processed* -# (until a valid condition statement which is False is -# encountered). -##### - -PROCESS = no -SUBPART = no - -# We meant not to process the following but all the -# lines up to the next .if statement *are* processed -# because the bad syntax on the next line means it's ignored - -\&.if PROCESS != no - ... # Processed! - - \&.if [SUBPART] == yes # *Now* we'll stop - ... + \&.if [EDT] == /usr/local/bin/emacs + ... \&.endif -\&.endif + + # Note, however, that *this* would work because + # Environment Variables are permitted in conditionals ... + + \&.if [$EDITOR] == /usr/local/bin/emacs + ... + \&.endif + + ##### + # A badly formed condition is ignored (after a warning) + # which means *all the lines following will be processed* + # (until a valid condition statement which is False is + # encountered). + ##### + + PROCESS = no + SUBPART = no + + # We meant not to process the following but all the + # lines up to the next .if statement *are* processed + # because the bad syntax on the next line means it's ignored + + \&.if PROCESS != no + ... # Processed! + + \&.if [SUBPART] == yes # *Now* we'll stop + ... + \&.endif + + \&.endif .fi +.ft \" revert .SH OTHER @@ -3693,11 +3864,13 @@ the advanced Win32 features. You'll find the latest version, and occasionally, Release Candidates -of the next version of \*(TW at: +of the next version of \'twander\' at: +.ft C \" courier .nf -http://www.tundraware.com/Software/twander + http://www.tundraware.com/Software/twander .fi +.ft \" revert You should check this site regularly for updates and bug-fixes. The \'WHATSNEW.txt\' file describes changes since the last public release @@ -3705,7 +3878,7 @@ .SH BUGS AND MISFEATURES -As of this release, a number of problems relating to \*(TW +As of this release, a number of problems relating to \'twander\' use have been noted: .IP \(bu 4 @@ -3713,7 +3886,7 @@ of its various entries for Program Options, Key Bindings, Directory Shortcuts, Variable Definitions, and Command Definitions. It is entirely possible to edit something into this file that makes no sense -at all and causes \*(TW to misbehave. +at all and causes \'twander\' to misbehave. .IP \(bu 4 There appears to be a Tkinter/Tk bug on Unix which sometimes inhibits @@ -3726,7 +3899,7 @@ older Windows OSs. For example, the free/total space available in the Drive List View has been noted to display incorrect values on Win98. Similarly, the owner and group names are displayed as "Unavailable" on -pre-NTFS file systems. These are OS limitations which \*(TW +pre-NTFS file systems. These are OS limitations which \'twander\' handles gracefully. .IP \(bu 4 @@ -3743,14 +3916,14 @@ .IP \(bu 4 This program has not been tested on MacOS. It has been reported that -Python on MacOS X returns \'posix\' as its OS name. If true, \*(TW +Python on MacOS X returns \'posix\' as its OS name. If true, \'twander\' should work as written, though we've not verified this. Please let us know how/if it works there and any issues you discover. -.SH INSTALLING \*(TW +.SH INSTALLING \'twander\' -Installation of \*(TW is fairly simple and takes only a few +Installation of \'twander\' is fairly simple and takes only a few moments. The most important thing before installing the program is to make sure you have Python 2.2 (or later) with Tkinter support installed on your system. @@ -3763,10 +3936,10 @@ .SS Installing Using The FreeBSD Port -If you've installed \*(TW using the FreeBSD port, all you have +If you've installed \'twander\' using the FreeBSD port, all you have to do is copy the example \*(CF, ".twander" found in /usr/local/share/doc/twander to your home directory and edit it to -taste. (You'll also find documentation for \*(TW in various formats in +taste. (You'll also find documentation for \'twander\' in various formats in this directory as well.) Make sure that /usr/local/bin is in your path. To start the program, @@ -3785,8 +3958,8 @@ .B Red Hat Linux Users Please Note: RH Linux (and possibly other Linux systems) installs two versions of Python. Version 1.52 is called \'python\', and Version 2.2 is called -\'python2\'. \*(TW requires the latter and will not run on the -former. As shipped, \*(TW invokes Python with the Unix shell +\'python2\'. \'twander\' requires the latter and will not run on the +former. As shipped, \'twander\' invokes Python with the Unix shell "#!" mechanism using the name \'python\' - which in this case is the wrong version. You can work around this problem one of several ways: @@ -3796,22 +3969,24 @@ .IP \(bu 4 Write an alias or shell script which explicity starts -\*(TW with the correct version of Python: +\'twander\' with the correct version of Python: +.ft C \" courier .nf -#!/bin/sh -python2 twander.py $* + #!/bin/sh + python2 twander.py $* .fi +.ft \" revert .IP \(bu 4 -Change the first line of the \*(TW code to refer +Change the first line of the \'twander\' code to refer to \'python2\' instead of \'python\'. .P Red Hat users who have upgraded from earlier Linux versions should also note that you may have files in your home directories owned by owners and groups which are no longer defined in the system! -\*(TW shows the owner and group fields for such files as numbers +\'twander\' shows the owner and group fields for such files as numbers rather than names. As best as we can determine, this is caused when an RH installation is updated from an older version. @@ -3830,7 +4005,7 @@ is especially the case for older Win32 operating systems like Win98. For this reason, it is recommended that you rename the ".twander" default \*(CF provided in the program distribution to -something else like "twander.conf" and use the \*(TW -c command +something else like "twander.conf" and use the \'twander\' -c command line option to point to this \*(CF. @@ -3840,7 +4015,7 @@ directory - Well, they do, but it is called "USERPROFILE" not "HOME". So, you can either create a new user-specific environment variable called HOME yourself (which points to your desired home directory) or -you can invoke \*(TW with the -c argument to explictly declare +you can invoke \'twander\' with the -c argument to explictly declare where it can find its \*(CF. You can run the program several ways on Win32 systems: @@ -3854,9 +4029,11 @@ example, you might have something like this in the "Target:" field of your shortcut: +.ft C \" courier .nf -"C:\\Program Files\\Python22\\pythonw.exe" C:\\twander.py \\ + "C:\\Program Files\\Python22\\pythonw.exe" C:\\twander.py \\ .fi +.ft \" revert This runs the program starting at the root directory of the current drive (assuming "twander.py" is located in C:\\. @@ -3867,29 +4044,33 @@ .IP \(bu 4 Use Windows Explorer (or better still, an already running instance -of \*(TW!) to navigate to the directory where "twander.py" +of \'twander\'!) to navigate to the directory where "twander.py" is located. Double-click on the file. If Python is properly installed, there should be an association for ".py" file types -and \*(TW should start automatically. +and \'twander\' should start automatically. -.SH GETTING HELP: THE \*(TW MAILING LIST +.SH GETTING HELP: THE \'twander\' MAILING LIST -TundraWare Inc. maintains an email list for \*(TW +TundraWare Inc. maintains an email list for \'twander\' users to get help and exchange ideas. To subscribe, send mail to: +.ft C \" courier .nf -majordomo@tundraware.com + majordomo@tundraware.com .fi +.ft \" revert In the body (not the subject line) of the email, enter the following text, substituting your own email address as indicated: +.ft C \" courier .nf -subscribe twander-users your-email-address + subscribe twander-users your-email-address .fi +.ft \" revert .SH DESIGN PHILOSOPHY @@ -3916,7 +4097,7 @@ You Get" - Each program has a predefined set of commands and the user cannot easily extend these with their own, new commands. -\*(TW is another approach to the filesystem navigation problem +\'twander\' is another approach to the filesystem navigation problem which embraces the best of both the GUI-based approach and the text-based approach. It also provides a rich mechanism whereby each user can easily define their own command set and thereby customize the @@ -3934,7 +4115,7 @@ .TP 2) -\*(TW also supports a number of +\'twander\' also supports a number of .B navigation shortcuts. It provides single control-key access to changing directories, moving to the previous directory, moving up one directory level, moving to @@ -3952,7 +4133,7 @@ This Command Definition is done in an external \*(CF using a simple but powerful command macro language. This means that that the command set of the program can easily be changed or expanded -without having to release a new version of \*(TW every time. +without having to release a new version of \'twander\' every time. Better still, every different user can have their own command set defined in a way that suits their style of working. Best of all, commands can be invoked either graphically (with a mouse click) or via @@ -3960,7 +4141,7 @@ .TP 4) -Because \*(TW is written in Python using Tkinter, the same +Because \'twander\' is written in Python using Tkinter, the same program runs essentially identically on many Unix-like and Win32 systems. The only thing that may need to be changed across these various platforms are the Command Definitions in the configuration @@ -3968,7 +4149,7 @@ defined) across all the different systems you use. .P -The consequence of all this is that \*(TW is an extremely +The consequence of all this is that \'twander\' is an extremely powerful and highly customizable filesystem navigator. Once learned, both navigation and command execution are lightning-fast (or at least, as fast as your machine can go ;) while minimizing @@ -3976,15 +4157,17 @@ .SH COPYRIGHT AND LICENSING -\*(TW is Copyright(c) \*(CP TundraWare Inc. For terms of +\'twander\' is Copyright(c) \*(CP TundraWare Inc. For terms of use, see the twander-license.txt file in the program distribution. If -you install \*(TW on a FreeBSD system using the 'ports' +you install \'twander\' on a FreeBSD system using the 'ports' mechanism, you will also find this file in /usr/local/share/doc/twander. .SH AUTHOR +.ft C \" courier .nf -Tim Daneliuk -twander@tundraware.com + Tim Daneliuk + twander@tundraware.com .fi +.ft \" revert