summaryrefslogtreecommitdiffstats
path: root/smenu.1
diff options
context:
space:
mode:
Diffstat (limited to 'smenu.1')
-rw-r--r--smenu.1255
1 files changed, 255 insertions, 0 deletions
diff --git a/smenu.1 b/smenu.1
new file mode 100644
index 0000000..3f66617
--- /dev/null
+++ b/smenu.1
@@ -0,0 +1,255 @@
+.TH smenu 1 "May 2015" "Version 0.9"
+.SH NAME
+smenu - filter that allows to interactively select a word from stdin
+and outputs the selection to stdout.
+.SH SYNOPSIS
+smenu [\fB-h\fP] [\fB-n\fP \fIlines\fP] [\fB-t\fP [\fIcols\fP]]
+[\fB-s\fP \fIpattern\fP] [\fB-m\fP \fImessage\fP] [\fB-w\fP] [\fB-d\fP]
+[\fB-c\fP] [\fB-e\fP] [\fB-b\fP] [\fB-g\fP] [\fB-q\fP]
+.SH DESCRIPTION
+This small utility acts as a filter (read from stdin and write to
+stdout). All the words taken from stdin are presented in a scrolling
+window on the terminal with a selection cursor initially positioned on
+the first word by default.
+.P
+If the \fBIFS\fP variable is set, each of its character (or multibyte
+sequence) will be used to delimit the words when reading them. Default
+delimiters are: \fISPACE\fP, \fI\\t\fP and \fI\\n\fP.
+.P
+Non printable characters in words that are not a delimiter are
+converted to their traditional form (\fI\\n\fP for end-of-line,
+\fI\\t\fP for tabulation...) by default. A single dot (\fI.\fP) is also
+used as a placeholder otherwise.
+.P
+\fBWarning\fP, \fBUTF-8\fP encoded codepoints are quietly converted
+into a dot (\fI.\fP) when the user locale is not \fBUTF-8\fP aware like
+\fBPOSIX\fP or \fBC\fP by example.
+.P
+If a word is only containing spaces, then all of them are
+converted into underscores (\fI_\fP) so that we can see them.
+.P
+.SS "Moving among words"
+The cursor can then be moved in every directions by using the
+traditional arrow keys or the \fIvi\fP direction keys (\fBh\fP,
+\fBj\fP, \fBk\fP and \fBl\fP). \fBHOME\fP, \fBEND\fP, \fBPgDn\fP and
+\fBPGUp\fP can also be used if available and have their traditional
+meanings.
+.SS "Searching for a word"
+The \fB/\fP or \fB^F\fP (\fBCtrl-f\fP) can be used to initiate a
+research by prefix among the words after the cursor.
+.P
+After that the cursor attribute is modified and all the characters
+entered 7s after this change goes in a search buffer with the cursor
+moving immediately to the next word matching this prefix. Any character
+entered within 5s after that completes that buffer and resets the 5s
+timer and possibly moves the cursor again.
+.P
+As soon as the timer expiates, the search mode is ended and the
+cursor regains its initial appearance.
+.P
+The search buffer if persistent as long as the cursor is on a matching
+word when a new research is initialized.
+.br
+If the beginning of the word under the cursor does not match the
+previous search buffer, then the search buffer if erased.
+.P
+At any time in this mode you can move the cursor with the keys
+described above. \fBESC\fP ends this mode immediately.
+.P
+The \fBSPACE\fP or \fBn\fP keys repeats the last research if the search
+buffer is not empty. As in search mode, nothing happens if there is no
+matching word after the cursor.
+.P
+Note that only the \fBSPACE\fP key can be used when the search mode is
+active because the \fBn\fP character must be available if you want to
+search a word containing this character.
+.SS "Selection and Exit"
+Hitting \fBq\fP exits without outputting anything, nothing is selected.
+.P
+By default, hitting \fBENTER\fP writes the selected word to stdout when
+not in search mode. In search mode \fBENTER\fP ends this mode and do
+nothing more. If you want to be able to select a word \fIeven\fP in
+search mode, use the \fB-e\fP option to change this behavior.
+.SS Help
+A small help message can be displayed when hitting \fB?\fP. This display
+will last for 10s or until a valid key or \fBESC\fP is pressed.
+.SS Scrollbar
+A scroll bar is displayed at the left of the scrolling window. Its
+appearance is meant to be classical but it has some particularities:
+.IP * 2
+The scroll bar is displayed only if all the words could not be
+displayed on the terminal .
+.IP * 2
+When the scrolling window has only one line, the scroll bar has only 3
+states:
+.RS 2
+.IP - 2
+"\fBv\fP" when on all but the last line, indicating that you can go down
+to see more.
+.IP - 2
+"\fB^\fP" when on the last line.
+.IP - 2
+"\fB|\fP" otherwise.
+.RE
+.IP * 2
+When there is more than 1 line to display, "\fB/\fP" means that the window
+displays the first line, "\fB\\\fP" the last line. "\fB|\fP" is used to fill
+the gap, see below the different possibles configurations.
+.TS
+l l l l l
+l l l l l
+l l l l.
+\\ \\ ^ ^ \\
+| | | | /
+/ v / v
+.TE
+.P
+A "\fB+\fP" can also appear in the scroll bar in lieu of a "\fB|\fP",
+giving the relative position of the cursor line in the bunch of input
+words.
+.SS "Terminal resizing"
+The windows is redrawn is the terminal is resized. The redrawing is
+actually done only 1s after the end of the resizing to avoid artefacts
+on screen. The cursor will remain on the current selected word but may
+be displayed on another place in the window.
+.SS Unicode support
+This utility is Unicode aware and should be able to display correctly
+any Unicode character (even double-width ones) as long as the current
+encoding is \fBUTF-8\fP (\fBUTF-8\fP in the output of the \fIlocale\fP
+command).
+.SH OPTIONS
+.IP \fB-h\fP
+Display a shot help message and exists.
+.IP "\fB-n\fP \fIlines\fB"
+Gives the maximum number of lines in the scrolling selection window. By
+default five lines at most are displayed and the other ones, if
+any, need you to scroll the window.
+.IP "\fB-t\fP [\fIcolumns\fP]"
+This option sets the tabulation mode and, if a number is specified,
+limits the number of displayed columns to that number.
+.IP "\fB-s\fP \fIpattern\fP"
+Pre-Position the cursor to the specified pattern. \fIpattern\fP" can be:
+.RS
+.IP * 2
+A \fBnumber\fP giving the initial position of the cursor (counting from
+0). If this number if greater than the number of words, the cursor will
+be set on la last position.
+.IP * 2
+The string \fBlast\fP meaning that we want the initial position to be
+on the last word.
+.IP * 2
+A string starting with a "\fB/\fP" indicating that we want the cursor
+to be set on the first word matching the \fBprefix\fP string following
+the "\fB/\fP" (\fB/Ca\fP will match \fBCancel\fP by example).
+.PP
+Every failure will no nothing resulting with the cursor set on the
+first word.
+.RE
+.IP "\fB-m\fP \fImessage\fP"
+Permits to display a message above the window. Beware, it will be
+truncated to only being displayed on \fIone\fP line.
+.IP "\fB-w\fP"
+When \fB-t\fP is used, the default is to compact the columns so that
+they use the less terminal width as possible. This option enlarges the
+columns in order to cover the whole terminal width when a number of
+columns is specified.
+.P
+Notice that the column's size is only calculated once when the
+words are displayed for the first time. A terminal resize will not
+alter this value. This choice permits a faster display.
+.P
+.RS
+Note that if this mode each column has the same width.
+.RE
+.IP \fB-d\fP
+Tells the program to clean up the display before quitting by removing
+the selection window after use as if it were never displayed. The
+terminal may have been scrolled up anyway if the previous window
+display needed it.
+.IP \fB-c\fP
+Sets the column mode. In this mode the lines of words do not wrap when
+the right border of the terminal is reached but only when a special
+character is read. Some words will not be displayed without an
+horizontal scrolling.
+.RS
+.P
+If such a scrolling is needed, an horizontal scroll bar will be
+displayed at the top of the window.
+.P
+In this mode, the width of each column is minimal to keep the maximum
+information visible on the terminal.
+.P
+The line terminator is "\fI\\n\fR" by default is the shell variable
+\fBIRS\fP is undefined. Otherwise its characters (or multibyte sequence)
+will be used as a line terminator. Characters (or multibyte sequences)
+in \fBIRS\fP are automatically added to the list of word delimiters.
+.RE
+.IP \fB-e\fP
+Enables \fBENTER\fP to validate the selection even in search mode.
+.IP \fB-b\fP
+Replace all non-printable characters by a blank.
+.IP \fB-g\fP
+Replaces the blank after each words in normal tabular mode by a vertical
+bar "\fB|\fP". Some users may find the output more readable like that.
+.IP \fB-q\fP
+Prevents the scrollbar display. Useful when all the input words can be
+displayed without the need of scrolling. by default the scrollbar is
+always displayed when there is more than one line. An absence of cursor
+in it gives a visual indication that all the input words are there.
+.SH NOTES
+If tabulations (\fI\\t\fP) are embedded in the input, there is no way
+to replace them with the original number of spaces. In this case use
+an other filter (like \fIexpand\fR) to pre-process the data.
+.SH EXAMPLES
+.SS 1
+Simple Yes/No/Cancel request with "No" as default choice:
+.P
+.nf
+In \fBbash\fP: \fBread R <<< $(echo "Yes No Cancel" \\
+ | smenu -d -m "Please choose:" -s /N)\fP
+
+ or \fBR=$(echo "Yes No Cancel" \\
+ | smenu -d -m "Please choose:" -s /N)\fP
+
+In \fBksh\fP: \fBprint "Yes No Cancel" \\
+ | smenu -d -m "Please choose:" -s /N \\
+ | read R\fP
+.fi
+.SS 2
+Get a 3 columns report about VM statistics for the current process in
+\fBbash\fP/\fBksh\fP on Linux:
+.P
+.nf
+\fBR=$(grep Vm /proc/$$/status | expand | IFS=$'\\n' smenu -b -t3 -g -d)\fB
+.P
+.fi
+.SS 3
+Create a one column selection window containing the list of the first
+20 LVM physical volumes. At end, the selection window will be erased.
+This example is written in \fBksh\fP).
+.P
+.nf
+\fBpvs -a -o pv_name --noheadings \\
+| smenu -m "PV list" -n20 -t1 -d -s //dev/root \\
+| read R\fP
+.fi
+.P
+The display will have a look similar to the following with the cursor
+set on the word \fI/dev/root\fP:
+.P
+.nf
+PV list
+/ /dev/md126
+| /dev/md127
+| /dev/root <- cursor here
+| /dev/sda2
+| /dev/sdb2
+| /dev/sdc1
+| /dev/sdc2
+\\ /dev/system/homevol
+.fi
+.SH BUGS
+None that I am aware of. If you found one, please tell me.
+.SH AUTHOR
+\(co 2015 Pierre Gentile (p.gen.progs@gmail.com)
+.SH SEE ALSO