.TH smenu 1 "2015" "beta" .SH NAME smenu - filter that allows to interactively select a word from stdin and outputs the selection to stdout. .SH SYNOPSIS .nf \f(CRsmenu [\fB-h\fP|\fB-?\fP] [\fB-f\fP \fIconfiguration_file\fP] \\ [\fB-n\fP \fIlines\fP] [\fB-t\fP [\fIcols\fP]] [\fB-k\fP] \\ [\fB-s\fP \fIpattern\fP] [\fB-m\fP \fImessage\fP] [\fB-w\fP] \\ [\fB-d\fP] [\fB-M\fP] [\fB-c\fP] [\fB-l\fP] [\fB-r\fP] [\fB-b\fP] \\ [\fB-a\fP] (i:|e:|c:)\fIATTR\fP [(i:|e:|c:)\fIATTR\fP]... \\ [\fB-i\fP \fIregex\fP] [\fB-e\fP \fIregex\fP] [\fB-C\fP \ [\fIa\fP|\fIs\fP|\fIi\fP|\fIr\fP|\fId\fP|\fIe\fP]] \\ [\fB-R\fP \ [\fIa\fP|\fIs\fP|\fIi\fP|\fIr\fP|\fId\fP|\fIe\fP]] \\ [\fB-S\fP \fI/regex/string/\fP[\fIg\fP][\fIv\fP][\fIs\fP][\fIi\fP]] \\ [\fB-I\fP \fI/regex/string/\fP[\fIg\fP][\fIv\fP][\fIs\fP][\fIi\fP]] \\ [\fB-E\fP \fI/regex/string/\fP[\fIg\fP][\fIv\fP][\fIs\fP][\fIi\fP]] \\ [\fB-A\fP \fIregex\fP] [\fB-Z\fP \fIregex\fP] \\ [\fB-1\fP \fIregex\fP [\fIATTR\fP]] \ [\fB-2\fP \fIregex\fP [\fIATTR\fP]] ... \ [\fB-5\fP \fIregex\fP [\fIATTR\fP]] \\ [\fB-g\fP] [\fB-q\fP] [\fB-W\fP \fIbytes\fP] [\fB-L\fP \fIbytes\fP] \\ [\fB-T\fP [\fIseperator\fP]] [\fB-V\fP] \\ [\fB-x\fP|\fB-X\fP \fItype\fP [\fIword\fP] \fIdelay\fP] [input_file] ::= \fIcol1\fP[-\fIcol2\fP],...|\fI\fP,... ::= \fIcol1\fP[-\fIcol2\fP],...|\fI\fP,... ::= [fg][/bg][,style] ::= \fB\fIregex\fB\fP and can be freely mixed. .fi .SH DESCRIPTION This small utility acts as a filter when no input file is given (reads from stdin and writes to stdout) or takes its inputs from that file. All read words are presented in a scrolling window on the terminal \fBat\fP the current cursor position without clearing the screen before. .PP The selection cursor is initially positioned on the first selectable word by default. .PP Options exists to explicitly or implicitly include or exclude some words by using extended regular expressions. Notice that when some words are explicitly excluded they can no more be re-included after. .PP Excluded words are skipped when the selection cursor is moved and cannot be searched for. .PP The \fB-W\fP option can be used to set the characters (or multibyte sequences) which will be used to delimit the input words. The default delimiters are: \fISPACE\fP, \fI\\t\fP and \fI\\n\fP. .PP The \fB-L\fP has a similar meaning for lines. Special character sequences formed by a \fI\\\fP followed by one of the characters \fIa\fP \fIb\fP \fIt\fP \fIn\fP \fIv\fP \fIf\fP \fIr\fP and \fI\\\fP are understood and have their traditional meanings. UTF-8 sequences introduced by \fI\\u\fP are alse understood. \fI\\u\fP can be followed by 2,4,6 or 8 hexadecimal hexadecimal characters. An invalid UTF-8 sequence will be replaced by a dot (\fI.\fP), see also below. Example: \fI\\uc3a9\fP means latin small letter e with acute. .PP Note that with most shells, the \fI\\\fP before the \fIu\fP need to be protected or escaped. .PP Quotations (single and double) in the input stream can be used to ignore the word separators so that a group of words are taken as a single entity. .PP Non printable characters in words that are not delimiters 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. .PP Words containing only spaces, entered directly or resulting from a substitution, are also rejected unless they are not selectable. This allows special effects like creating blank lines for example. These words are also kept in column mode, selectable or not. .PP \fBWarning\fP, \fBUTF-8\fP encoded codepoints are quietly converted into dots (\fI.\fP) when the user locale is not \fBUTF-8\fP aware like \fBPOSIX\fP or \fBC\fP by example. .PP .SS "Moving among words" The cursor can be moved in every direction by using the keyboard arrow keys (\fB\(<-\fP,\fB\(da\fP,\fB\(ua\fP,\fB\(->\fP) 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 key \fB/\fP or the key combination \fB^F\fP (\fBCTRL+f\fP) can be used to initiate a search by prefix among the words (possibly altered by \fB-S\fP/\fB-I\fP/\fB-E\fP) located after the cursor. .PP After that, the cursor attributes are modified and all the characters entered up to 7s after this change are put in a search buffer and the cursor moves immediately to the next word matching this prefix. .PP Any character entered before a 5s timeout after this action completes this buffer and resets the 5s timer and advances the cursor again if another word matches the new buffer. .PP As soon as the timer ends, the search mode is ended and the cursor regains its initial appearance. .PP The search buffer is persistent as long as the cursor is on a matching word when a new search is initialized. .PP If the cursor is moved in this mode, the timer will expire immediately As if \fBENTER\fP or \fBESC\fP was pressed. .PP Pressing \fBENTER\fP or \fBESC\fP immediately exits this mode. .PP Pressing \fBSPACE\fP or \fBn\fP repeats the last search if the search buffer is not empty. Nothing will happen if there is no matching word after the cursor. .PP Note that the \fBSPACE\fP and \fBn\fP keys cannot be used when the search mode is active because they must be available if you want to search a word containing these characters. .SS "Selection and Exit" Pressing \fBq\fP gives the possibility to exit without selecting anything. .PP By default, \fBENTER\fP writes the selected word to stdout when not in search mode otherwise it exits from this mode and does nothing more. If you want to be able to select a word \fIeven\fP when in search mode, use the \fB-r\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 Scroll bar A scroll bar is displayed at the right of the scrolling window. Its appearance is meant to be classical but it has some particularities: .IP * 2 The scroll bar is not displayed if all the input words fit on only one line. .IP * 2 Otherwise, the scroll bar is always displayed except when the \fB-q\fP option is set. This option completely disables the scroll bar display. .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 one 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 possible configurations. .TS tab(@); l l l l l l l l l l l l l l . \\@\\@^@^@\\ @Do not remove this trailing space! |@|@|@|@/ /@v@/@v .TE .PP A \fB+\fP can also appear in the scroll bar in lieu of the vertical bar, giving the relative position of the cursor line in the bunch of input words. .SS "Terminal resizing (also see BUGS/LIMITATIONS)" The windows is redrawn if 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 at 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). .SS Configuration If a file with adequate permissions and the same name as the executable but prefixed with a dot is present in the current directory or in the user's home directory, then it will be parsed as a \fIini\fP file. The values read from the file in the home directory will be overridden by the ones read from the local directory (if it is present). Missing and bad keywords are silently skipped. The values read, if valid, override the default hard-coded ones. If a value is invalid an error message is shown and the program terminates. Here is an example giving the syntax and the names of the keywords allowed: .PP .nf \f(CR--8<------------------------------------------------------------------ [colors] ; The terminal must have at least 8 colors and/or have attributes like bold ; and reverse for this to be useful ; if not the following settings will be ignored. method=ansi ; classic | ansi (default) cursor=0/2 ; cursor attributes cursor_on_tag=0/2,u ; cursor on tag attributes shift=6,b ; shift symbol attributes bar = 7/4,b ; scroll bar attributes search_field = 0/6 ; search field attributes search_text = 7,bu ; search text attributes ; include = b ; selectable color attributes exclude = 4/0,u ; non-selectable color attributes tag = 0/5 ; tagged (selected) attributes special1 = 7/4,b ; attributes for the special level 1 special2 = bu ; attributes for the special level 2 special3 = /3,b ; attributes for the special level 3 special4 = 7/4 ; attributes for the special level 4 special5 = 7/2,b ; attributes for the special level 5 [window] lines = 7 ; default number of lines of the window [limits] word_length = 1024 ; arbitrary max length of input words (int) words = 32767 ; arbitrary max number of allowed input ; words (int) columns = 128 ; arbitrary max number of columns (int) --8<------------------------------------------------------------------ \fP .fi .IP * 2 The \fBmethod\fP keyword can take the two possible values displayed above and determines if you want to use the native method (limited to 8 colors) of the \fBansi\fP method (ISO 8613-6) if your terminal supports more than 8 colors. The default value corresponds to \fBansi\fP. The attributes syntax is [fg][/bg][,toggles] where \fBfg\fP and \fBbg\fP are numbers representing the foreground and background color and \fBtoggles\fP is a strings which can contain the characters \fIb\fP, \fId\fP, \fIr\fP, \fIs\fP, \fIu\fP and \fIi\fP standing for \fIb\fPold, \fId\fPim, \fIr\fPeverse, \fIs\fPtandout, \fIu\fPnderline and \fIi\fPtalic. .IP * 2 Spaces are allowed anywhere in the lines and between them, even around the \fB=\fP. .IP * 2 Everything following a \fB;\fP is ignored. .IP * 2 When undefined, the default limits are: .TS tab(@); l l . words@32767 word_length@256 columns@256 .TE .SH OPTIONS .IP "\fB-h\fP or \fB-?\fP" Displays a long (\fB-h\fP) or short (\fB-?\fP) help message and exits. .IP "\fB-f\fP \fIconfiguration_file\fB" This option gives the possibility to select an alternative configuration file. If the given file doesn't exist or is not readable then the default values will be used. The \fB.smenu\fP files in the user's home directory and in the current directory, if present, will be ignored when this option is used. .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, attents to set the number of displayed columns to that number. In this mode, embedded line separators are ignored. The options \fB-A\fP and \fB-Z\fP can nevertheless be used to force words to appear in the first (respectively last) position of the displayed line. .PP .RS Note that the number of requested columns will be automatically reduced if a word does not fit in the calculated column size. .PP In this mode each column has the same width. .RE .IP \fB-k\fP By default, the spaces surrounding the output string will be deleted. This option forces them to be retained. Note that these spaces must have been protected to be selected. .IP "\fB-s\fP \fIpattern\fP" Pre-Position the cursor to the first word matching the specified pattern. \fIpattern\fP can be: .RS .IP * 2 A \fB#\fP immediately followed by a \fBnumber\fP giving the initial position of the cursor (counting from 0). If the word at this position is excluded, then the first previous non excluded word is selected if it exists, otherwise the first non excluded word is selected. If this number if greater than the number of words, the cursor will be set on the latest selectable position. .IP * 2 A single \fB#\fP or the string \fB#last\fP to set the initial cursor position to the latest selectable word position. .IP * 2 A string starting with a \fB/\fP indicating that we want the cursor to be set to the first word matching the given regular expression. .IP * 2 A \fBprefix\fP string indicating that we want the cursor to be set on the first word matching the string given (\fBa\fP will match \fBCancel\fP by example). .PP Warning, when searching for a prefix or a regular expression, smenu only looks for them after an eventual modification, so for example, the command: \f(CBsmenu -I/c/x/ -s/c <<< "a b c d"\fP won't find c and put the cursor on \fBa\fP but \f(CBsmenu -I/c/x/v -s/c <<< "a b c d"\fP will find it and put the cursor on the \fBx\fP substituting the \fBc\fP on screen only \fI\\u\fP sequences can be used in the pattern. .RE .IP "\fB-m\fP \fImessage\fP" Displays a message above the window. If the current locale is not \fIUTF-8\fP, then all \fIUTF-8\fP characters in it will be converted into a dot. \fI\\u\fP sequences can be used in the message. Note that the message will be truncated if it does not fit on a terminal line. .IP "\fB-w\fP" When \fB-t\fP is followed by a number of columns, 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 use the whole terminal width. When in column mode, \fB-w\fP can be used to force all the columns to have the same size (the largest one). See option \fB-c\fP below. .PP .RS Note that the column's size is only calculated once when the words are displayed for the first time. A terminal resize will not update this value. This choice enables a faster display. .RE .PP .IP \fB-d\fP Tells the program to clean up the display before quitting by removing the selection window after use as if it was never displayed. .IP \fB-M\fP Centers the display if possible. .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. If such a scrolling is needed, some indications may appear on the left and right edge of the window to help the user to reach the unseen words. In this mode, the width of each column is minimal to keep the maximum information visible on the terminal. .IP \fB-l\fP Sets the line mode. This mode is the same as column mode but without any column alignment. .IP \fB-r\fP Enables \fBENTER\fP to validate the selection even in search mode. .IP \fB-b\fP Replaces all non-printable characters by a blank. .IP "\fB-a \fIPREFIX:ATTR\fP [\fIPREFIX:ATTR\fP...]" Sets the display attributes of the elements displayed and the cursor. At least one attribute prefixed attribute must be given. \fIPREFIX\fP can take the following values: .RS .IP \fIe\fP excluded words. .IP \fIi\fP included words. .IP \fIc\fP cursor. .IP \fIb\fP scroll bar. .IP \fIs\fP shift indicator. .IP \fIt\fP tagged words. .IP \fIsf\fP search field. .IP \fIst\fP search buffered text. .RE If more than one attribute is given, then they must be separated by spaces. See the \fB-1\fP option for the \fIATTR\fP syntax. .IP "\fB-i\fP \fIregex\fP" Sets the \fBi\fPnclude filter to match the selectable words. All the other words will become implicitly non-selectable (excluded) \fB-i\fP can be used more than once with cumulative effect. \fI\\u\fP sequences can also be used in the regexp. .IP "\fB-e\fP \fIregex\fP" Sets the \fBe\fPxclude filter to match the non-selectable words. All the other selectable words will become implicitly selectable (included) \fB-e\fP can be used more than once with cumulative effect. This filter has a higher priority than the include filter. The \fIregex\fP selections made using \fB-i\fP and/or \fB-e\fP are done before the possible words alterations made by \fB-I\fP or \fB-E\fP (see below). \fI\\u\fP sequences can also be used in the regexp. .IP "\fB-C\fP [\fIa\fP|\fIs\fP|\fIi\fP|\fIr\fP|\fId\fP|\fIe\fP] \ <\fIcol selectors\fP>" \fBImportant notice\fP: the letters \fIa\fP,\fIs\fP,\fIr\fP and \fId\fP after \fB-C\fP are deprecated and will be removed in a future release. Please only use \fIi\fP and \fIe\fP. These letters are case independent so \fII\fP can be used in place of \fIi\fP per example. In column mode, This option allows to restrict the previous selections or de-selections to some columns. If no selection is given via \fB-i\fP and \fB-e\fP this option gives the possibility to select entire columns by giving their numbers (1 based) of extended regular expressions. \fIa\fP, \fIs\fP and \fIi\fP or nothing select the specified ranges of columns. \fIr\fP, \fId\fP and \fIe\fP select all but the specified ranges of columns. The words in the selected columns will be considered as \fBi\fPncluded And the others \fBe\fPxcluded. A selection by regular expressions means that a column containing a word matching one of these expression will be included or excluded according to the letter given after the option. Regular expressions and column numbers can be freely mixed. Regular expression in \fB-C\fP and \fB-R\fP can contain \fIUTF-8\fP characters either directly or by using the \fI\\u\fP notation. Example of columns selection: \f(CB-Ci2,3,/X./,5-7\fP forces the cursor to only navigate in columns \fB2\fP,\fB3\fP,\fB5\fP,\fB6\fP and \fB7\fP and those containing a two characters word starting with '\fBX\fP'. If \fIe\fP was used in place of \fIi\fP, all the columns would have been selected \fBexcept\fP the columns \fB2\fP,\fB3\fP,\fB5\fP,\fB6\fP,\fB7\fP and those matching the extended regular expression '\f(CBX.\fP'. Spaces are allowed in the selection string if they are protected. The column mode is forced when this option is selected. .IP "\fB-R\fP [\fIa\fP|\fIs\fP|\fIi\fP|\fIr\fP|\fId\fP|\fIe\fP] \ <\fIrow selectors\fP>" Similar to \fB-C\fP but for the rows. One difference though: this is the line mode which is forced by this option NOT the column mode. \fBImportant notice\fP: As with \fB-C\fP, the letters \fIa\fP,\fIs\fP,\fIr\fP and \fId\fP after are deprecated and will be removed in a future release. Please only use \fIi\fP and \fIe\fP. \fB-C\fP and \fB-R\fP can be used more than once in a cumulative manner: The selection mode (selection or de-selection) is given by the first occurrence of the options, the other occurrences will only update the selected or de-selected ranges. .IP "\fB-S\fP /\fIregex\fP/replacement string/[\fIg\fP][\fIv\fP][\fIs\fP]" Post-processes the words by applying a regular expression based substitution. The argument must be formatted as in the \fBsed\fP editor. This option can be used more than once. Each substitution will be applied in sequence on each word. This sequence can be stopped if a \fBstop\fP flag is encountered. .RS \fBflags:\fP .IP * 2 The optional trailing \fBg\fP (for \fIg\fPlobal) means that all matched occurrences shall be replaced and not only the first one. .IP * 2 The optional trailing \fBv\fP (for \fIv\fPisual) means that the altered words will only be used for display and search. The modifications will \fInot\fP be reflected in the returned word. .IP * 2 The optional trailing \fBs\fP (for \fIs\fPtop) means that no more substitution will be allowed on this word even if another \fB-S\fP is used. .IP * 2 The optional trailing \fBi\fP (for \fIi\fPgnore case) means that the string search operation should ignore the case for this pattern. Small example: \f(CBR=$(echo a b c | smenu -S /b/B/)\fP will display \f(CR"a B c"\fP and \f(CBR\fP will contain \fIB\fP if \fI B\fP is selected meanwhile \f(CBR=$(echo a b c | smenu -S /b/B/\fBv\fP)\fR will display the same as above but \f(CBR\fP will contain the original word \fIb\fP if \fIB\fP is selected. In both cases, only the word \fIB\fP will be searchable and not \fIb\fP. .RE .IP "\fB-I\fP /\fIregex\fP/replacement string/[\fIg\fP][\fIv\fP][\fIs\fP]" Post-processes the \fBselectable\fP words by applying a regular expression based substitution (see \fB-S\fP for details). .IP "\fB-E\fP /\fIregex\fP/replacement string/[\fIg\fP][\fIv\fP][\fIs\fP]" Post-processes the \fBexcluded\fP (or \fBnon-selectable\fP) words by applying a regular expression based substitution (see \fB-S\fP for details). .PP .RS The \fB/\fP separator that \fB-I\fP and \fB-E\fP are using above can be substituted by any other character except \fISPACE\fP, \fI\\t\fP, \fI\\f\fP, \fI\\n\fP, \fI\\r\fP and \fI\\v\fP. .PP In the three previous options, \fIregex\fP is a \fBPOSIX\fP \fBE\fPxtended \fBR\fPegular \fBE\fPxpression. For details, please refer to the \fBregex\fP manual page. .PP Additionally \fI\\u\fP sequences can also be used in the regexp. .PP .RE If a post-processing action (\fB-S\fP/\fB-I\fP/\fB-E\fP) results in an empty (length 0) word, then we have two cases: .RS .IP "in column mode:" Substitutions involving empty words can lead to misalignments, so it is necessary to prohibit them and terminate the program. These substitutions have to be made with other tools before using this utility. .IP "otherwise:" The word is simply removed. .RE .IP "\fB-A\fP \fIregex\fP" In column mode, forces all words matching the given regular expression to be the first one in the displayed line. If you want to only rely on this method to build the lines, just specify an empty \fBregex\fP to set the end-of-line separator with \fI-L ''\fP) .PP .RS \fI\\u\fP sequences can also be used in the regexp after \fB-A\fP. .RE .IP "\fB-Z\fP \fIregex\fP" Similar to \fB-A\fP but forces the word to be the latest of its line. The same trick with \fB-L\fP can also be used. .PP .RS \fI\\u\fP sequences can also be used in the regexp after \fB-Z\fP. .RE .IP "\fB-1\fP ... \fB-5\fP \fIregex\fP [\fIATTR\fP]" Allows to give up to 5 classes of words specified by regular expressions a special display color. They are called \fBspecial levels\fP. Only selectable words will be considered. By default, the 5 special levels have their foreground color set to red, green, brown/yellow, purple and cyan. All these colors also can be set or modified permanently in the configuration files. See the example file above for an example. The optional second argument (\fIATTR\fP) can be used to override the default or configured attributes of each class. Its syntax is the same as the one used in the configuration file: .nf [\fIfg\fP][/\fIbg\fP][,{\fIb\fP|\fId\fP|\fIr\fP|\fIs\fP|\fIu\fP|\fIi\fP}] \ | [{\fIb\fP|\fId\fP|\fIr\fP|\fIs\fP|\fIu\fP|\fIi\fP}] .fi Examples of possible attributes are: .nf \f(CB2/0,bu \fPgreen on black bold underline \f(CB/2 \fPgreen background \f(CB5 \fPtext in purple \f(CBrb \fPreverse bold .fi \fI\\u\fP sequences can be used in the pattern. .IP \fB-g\fP Replaces the blank after each words in column or tabular mode by a vertical bar \fB|\fP. Some users may find the output more readable with it. .IP \fB-q\fP Prevents the scroll bar display. Useful when all the input words can be displayed without the need of scrolling. By default the scroll bar 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. .IP "\fB-W\fP \fIbytes\fP" This option can be used to specify the characters (or multibyte sequences) which will be used to delimit the input words. Multibyte sequences (UTF-8) can be natives of using the same ascii representation used in words (a leading \fI\\u\fP following by up to 8 hexadecimal characters). The default delimiters are: \fISPACE\fP, \fI\\t\fP and \fI\\n\fP. .IP "\fB-L\fP \fIbytes\fP" This option can be used to specify the characters (or multibyte sequences) which will be used to delimit the lines in the input stream. The default delimiter is: \fI\\n\fP. This option is only useful when the \fB-c\fP or \fB-l\fP option is also set. The characters (or multibyte sequences) passed to \fB-L\fP are automatically added to the list of word delimiters as if \fB-W\fP was also used. \fI\\u\fP sequences can also be used here. .IP "\fB-T\fP [\fIseparator\fP]" Enables the multi-selections or tagged mode. In this mode, each selectable word can be selected without ending the program. The last selection is then done as usual by hitting the \fBENTER\fP key which also ends the program. All the tagged words (and the world under the cursor) are then sent to stdout separated by the optional argument given to the \fB-T\fP option. Note than this \fIseparator\fP can have more than one character and can even contain control character as in \f(CB$'\\n'\fP. A space is used as the default separator if none is given. .IP \fB-V\fP Displays the current version and quits. .TP \fB-x \fItype\fP [\fIword\fP] \fIdelay\fP .TQ \fB-X \fItype\fP [\fIword\fP] \fIdelay\fP Sets a timeout. Three types of timeout are possible: .RS .TP 10 current: On timeout, the current cursor position determines the selection as if the \fBENTER\fP has been pressed .TP 10 quit: On timeout, nothing is selected as if the \fBq\fP key has been pressed .TP 10 word: On timeout, the word given after the type is selected. Note that this word doesn't need to be part of the words coming from the standard input. .PP Each type can be be shortened as a prefix of the full name ("cur" for "current" of "q" for "quit" per example). The delay must be set in seconds and cannot be above 99999 seconds. The remaining time (in seconds) is added at the end of the message displayed above the selection window and is updated in real time each second. Each key press except \fBENTER\fP, \fBq\fP, \fBQ\fP and \fB^C\fP resets the timer to its initial value. The \fB-X\fP version works like \fB-x\fP but no periodic remaining messages is displayed above the selection window. .RE .SH NOTES If tabulators (\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: .PP .nf \f(CRIn \fBbash\fP: \f(CBread R <<< $(echo "Yes No Cancel" \\ | smenu -d -m "Please choose:" -s /N)\fP or \f(CBR=$(echo "Yes No Cancel" \\ | smenu -d -m "Please choose:" -s /N)\fP In \fBksh\fP: \f(CBprint "Yes No Cancel" \\ | smenu -d -m "Please choose:" -s /N \\ | read R\fP \fP .fi .SS 2 Get a 3 columns report about VM statistics for the current process in \fBbash\fP/\fBksh\fP on Linux: .PP .nf \f(CBR=$(grep Vm /proc/$$/status | expand | smenu -b -W$'\\n' -t3 -g -d)\fB .PP \fP .fi .SS 3 Create a one column selection window containing the list of the first 20 LVM physical volumes. At the end, the selection window will be erased. This example is written in \fBksh\fP). .PP .nf \f(CB pvs -a -o pv_name --noheadings \\ | smenu -m "PV list" -n20 -t1 -d -s //dev/root \\ | read R \fP .fi The display will have a look similar to the following with the cursor set on the word \fI/dev/root\fP: .nf \f(CRPV list /dev/md126 \\ /dev/md127 | /dev/root | <- cursor here. /dev/sda2 | /dev/sdb2 | /dev/sdc1 | /dev/sdc2 | /dev/system/homevol / \fP .fi .SS "4 (advanced)" Imagine a file named \fBsample.mnu\fP with the following content: .nf \f(CR--8<--------------------------------- [1] "First Entry" [3] "Third entry" [2] "Second entry" [4] "Fourth entry" @@@ @@@ [5] "Fifth entry" @@@ [Quit] "Exit menu" --8<--------------------------------- \fP .fi Then this quite esoteric command will render it (centered on the screen) as: .nf \f(CR+--------------------------------+ |Test menu | |1 First Entry 3 Third entry | |2 Second entry 4 Fourth entry| | 5 Fifth entry | | | |Quit Exit menu | +--------------------------------+ \fP .fi with the cursor on \fIQuit\fP and only the numbers and "Quit" selectable. \f(CBR=$(smenu -q -d -s/Q -M -n 30 -c \\ -e "@+" -E '/@+//' \\ -i '\\[ *[^ ]+ *\\]' -I '/[][ ]//g' \\ -m "Test menu" < sample.mnu)\fP The selected number or string will be available in \f(CBR\fP Try to understand it as an exercise. .SH BUGS/LIMITATIONS Some terminal emulators, those notably based on VTE version later than 0.35 (see https://github.com/GNOME/vte/commit/01380d), have a new feature that gives them the possibility to wrap/unwrap already displayed lines when resizing the window. As far as I known, there is no terminfo entry to disable that. On these types of terminals, the automatic re-display of the output of smenu will be disturbed and some artifacts may appear on the screen if the terminal window is resized. .SH AUTHORS \(co 2015 Pierre Gentile (p.gen.progs@gmail.com)