Curses - terminal screen handling and optimization
| Use Case | Command | Description |
|---|---|---|
| Initialize curses | initscr() | Initialize terminal screen |
| End curses | endwin() | End curses mode, restore terminal |
| Add string at cursor | addstr(y, x, string) | Add string at position (y,x) |
| Get character input | getch() | Get a single character |
| Refresh window | refresh() | Refresh stdscr to screen |
| Unified function call | function(win, y, x, args) | Call any unified function with optional window and coordinates |
| Wide character input | getchar() | Get a wide character, returns string or function key |
| Add wide string | addstring(string) | Add a Perl string using wide-character-aware function |
use Curses;
initscr;
...
endwin;
Curses is the interface between Perl and your system's curses(3) library. For descriptions on the usage of a given function, variable, or constant, consult your system's documentation, as such information invariably varies (:-) between different curses(3) libraries and operating systems. This document describes the interface itself, and assumes that you already know how your system's curses(3) library works.
Many curses(3) functions have variants starting with the prefixes w-, mv-, and/or wmv-. These variants differ only in the explicit addition of a window, or by the addition of two coordinates that are used to move the cursor first. For example, addch() has three other variants: waddch(), mvaddch(), and mvwaddch(). The variants aren't very interesting; in fact, we could roll all of the variants into original function by allowing a variable number of arguments and analyzing the argument list for which variant the user wanted to call.
Unfortunately, curses(3) predates varargs(3), so in C we were stuck with all the variants. However, Curses is a Perl interface, so we are free to "unify" these variants into one function. The section "Available Functions" below lists all curses(3) functions Curses makes available as Perl equivalents, along with a column listing if it is unified. If so, it takes a varying number of arguments as follows:
function( [win], [y, x], args );
win is an optional window argument, defaulting to stdscr if not specified.
y, x is an optional coordinate pair used to move the cursor, defaulting to no move if not specified.
args are the required arguments of the function. These are the arguments you would specify if you were just calling the base function and not any of the variants.
This makes the variants obsolete, since their functionality has been merged into a single function, so Curses does not define them by default. You can still get them if you want, by setting the variable $Curses::OldCurses to a non-zero value before using the Curses package. See "Perl 4.X "cursperl" Compatibility" for an example of this.
The following are the preferred functions for working with strings, though they don't follow the normal unified function naming convention (based on the names in the Curses library) described above. Despite the naming, each corresponds to a Curses library function. For example, a getchar call performs a Curses library function in the getch family.
In addition to these functions, The Curses module contains corresponding functions with the conventional naming (e.g. getch); the duplication is for historical reasons. The preferred functions were new in Curses 1.29 (April 2014). They use the wide character functions in the Curses library if available (falling back to using the traditional non-wide-character versions). They also have a more Perl-like interface, taking care of some gory details under the hood about which a Perl programmer shouldn't have to worry.
The reason for two sets of string-handling functions is historical. The original Curses Perl module predates Curses libraries that understand multiple byte character encodings. Moreover, the module was designed to have a Perl interface that closely resembles the C interface syntactically and directly passes the internal byte representation of Perl strings to C code. This was probably fine before Perl got Unicode function, but today, Perl stores strings internally in either Latin-1 or Unicode UTF-8 and the original module was not sensitive to which encoding was used.
While most of the problems could be worked around in Perl code using the traditional interface, it's hard to get right and you need a wide-character-aware curses library (e.g. ncursesw) anyway to make it work properly. Because existing consumers of the Curses module may be relying on the traditional behavior, Curses module designers couldn't simply modify the existing functions to understand wide characters and convert from and to Perl strings.
None of these functions exist if Perl is older than 5.6.
getchar
This calls wget_wch(). It returns a character โ more precisely, a one-character (not necessarily one-byte!) string holding the character โ for a normal key and a two-element list (undef, key-number) for a function key. It returns undef on error.
If you don't expect function keys (i.e. with keypad(0)), you can simply do
my $ch = getchar;
die "getchar failed" unless defined $ch;
If you do expect function keys (i.e. with keypad(1)), you can still assign the result to a scalar variable as above. Because of of the way the comma operator works, that variable will receive either undef or the string or the number, and you can decode it yourself.
my $ch = getchar;
die "getchar failed" unless defined $ch;
if ($ch looks like a number >= 0x100) {
# handle function key
} else {
# handle normal key
}
or do
my ($ch, $key) = getchar;
if (defined $key) {
# handle function key $key
} elsif (defined $ch) {
# handle normal key $ch
} else {
die "getchar failed";
}
If wget_wch() is not available (i.e. The Curses library does not understand wide characters), this calls wgetch(), but returns the values described above nonetheless. This can be a problem because with a multibyte character encoding like UTF-8, you will receive two one-character strings for a two-byte-character (e.g. "o" and "a1/2" for "a1/2"). If you append these characters to a Perl string, that string may internally contain a valid UTF-8 encoding of a character, but Perl will not interpret it that way. Perl may even try to convert what it believes to be two characters to UTF-8, giving you four bytes.
getstring
This calls wgetn_wstr and returns a string or undef. It cannot return a function key value; the Curses library will itself interpret KEY_LEFT and KEY_BACKSPACE.
If wgett_wstr() is unavailable, this calls wgetstr().
In both cases, the function allocates a buffer of fixed size to hold the result of the Curses library call.
my $s = getstring();
die "getstring failed" unless defined $s;
addstring/insstring
This adds/inserts the Perl string passed as an argument to the Curses window using waddnwstr()/wins_nwstr() or, if unavailable, waddnstr()/winsnstr(). It returns a true value on success, false on failure.
addstring("Hรคlla!, Wรคrld") || die "addstring failed";
instring
This returns a Perl string (or undef on failure) holding the characters from the current cursor position up to the end of the line. It uses winnwstr() if available, and otherwise innstr().
my $s = instring();
die "instring failed" unless defined $s;
ungetchar
This pushes one character (passed as a one-character Perl string) back to the input queue. It uses unget_wch() or ungetch(). It returns a true value on success, false on failure. It cannot push back a function key; the Curses library provides no way to push back function keys, only characters.
ungetchar("X") || die "ungetchar failed";
The Curses module provides no interface to the complex-character routines (wadd_wch(), wadd_wchnstr(), wecho_wchar(), win_wch(), win_wchnstr(), wins_wch()) because there is no sensible way of converting from Perl to a C cchar_t or back.
Objects work. Example:
$win = new Curses;
$win->addstr(10, 10, 'foo');
$win->refresh;
...
Any function that has been marked as unified (see "Available Functions" below and "Unified Functions" above) can be called as a method for a Curses object.
Do not use initscr() if using objects, as the first call to get a new Curses will do it for you.
It has always been the case with the curses functions, but please note that the following functions:
getstr() (and optional wgetstr(), mvgetstr(), and mvwgetstr())inchstr() (and optional winchstr(), mvinchstr(), and mvwinchstr())instr() (and optional winstr(), mvinstr(), and mvwinstr())are subject to buffer overflow attack. This is because you pass in the buffer to be filled in, which has to be of finite length, but there is no way to stop a bad guy from typing.
In order to avoid this problem, use the alternate functions:
getnstr()inchnstr()innstr()which take an extra "size of buffer" argument or the wide-character-aware getstring() and instring() versions.
Curses was written to take advantage of features of Perl 5 and later. The author thought it was better to provide an improved curses programming environment than to be 100% compatible. However, many old "curseperl" applications will probably still work by starting the script with:
BEGIN { $Curses::OldCurses = 1; }
use Curses;
Any old application that still does not work should print an understandable error message explaining the problem.
Some functions and variables are not available through Curses, even with the BEGIN line. They are listed under "Curses items not available through Perl Curses".
The variables $stdscr and $curscr are also available as functions stdscr and curscr. This is because of a Perl bug. See the LIMITATIONS section for details.
CursesIn previous versions of this software, some Perl functions took a different set of parameters than their C counterparts. This is not true in the current version. You should now use getstr($str) and getyx($y, $x) instead of $str = getstr() and ($y, $x) = getyx().
Curses function '%s' called with too %s arguments at ... โ You have called a Curses function with a wrong number of arguments.argument %d to Curses function '%s' is not a Curses %s at ... โ The argument you gave to the function wasn't of a valid type for the place you used it. This probably means that you didn't give the right arguments to a unified function. See the DESCRIPTION section on "Unified Functions" for more information.argument is not a Curses %s at ... โ Same as above.Curses function '%s' is not defined in your Curses library at ... โ Your code has a call to a Perl Curses function that your system's Curses library doesn't provide.Curses variable '%s' is not defined in your Curses library at ... โ Your code has a Perl Curses variable that your system's Curses library doesn't provide.Curses constant '%s' is not defined in your Curses library at ... โ Your code references the specified Curses constant, and your system's Curses library doesn't provide it.Curses::Vars::FETCH called with bad index at ... โ You've been playing with the tie interface to the Curses variables. Don't do that. :-)If you use the variables $stdscr and $curscr instead of their functional counterparts (stdscr and curscr), you might run into a bug in Perl where the "magic" isn't called early enough. This is manifested by the Curses package telling you $stdscr isn't a window. One workaround is to put a line like $stdscr = $stdscr near the front of your program.
William Setzer <William_Setzer AT ncsu.edu>
| Available Function | Unified? | Available via $OldCurses[*] |
|---|---|---|
| addch | Yes | waddch mvaddch mvwaddch |
| echochar | Yes | wechochar |
| addchstr | Yes | waddchstr mvaddchstr mvwaddchstr |
| addchnstr | Yes | waddchnstr mvaddchnstr mvwaddchnstr |
| addstr | Yes | waddstr mvaddstr mvwaddstr |
| addnstr | Yes | waddnstr mvaddnstr mvwaddnstr |
| attroff | Yes | wattroff |
| attron | Yes | wattron |
| attrset | Yes | wattrset |
| standend | Yes | wstandend |
| standout | Yes | wstandout |
| attr_get | Yes | wattr_get |
| attr_off | Yes | wattr_off |
| attr_on | Yes | wattr_on |
| attr_set | Yes | wattr_set |
| chgat | Yes | wchgat mvchgat mvwchgat |
| COLOR_PAIR | No | |
| PAIR_NUMBER | No | |
| beep | No | |
| flash | No | |
| bkgd | Yes | wbkgd |
| bkgdset | Yes | wbkgdset |
| getbkgd | Yes | |
| border | Yes | wborder |
| box | Yes | |
| hline | Yes | whline mvhline mvwhline |
| vline | Yes | wvline mvvline mvwvline |
| erase | Yes | werase |
| clear | Yes | wclear |
| clrtobot | Yes | wclrtobot |
| clrtoeol | Yes | wclrtoeol |
| start_color | No | |
| init_pair | No | |
| init_color | No | |
| has_colors | No | |
| can_change_color | No | |
| color_content | No | |
| pair_content | No | |
| delch | Yes | wdelch mvdelch mvwdelch |
| deleteln | Yes | wdeleteln |
| insdelln | Yes | winsdelln |
| insertln | Yes | winsertln |
| getch | Yes | wgetch mvgetch mvwgetch |
| ungetch | No | |
| has_key | No | |
| KEY_F | No | |
| getstr | Yes | wgetstr mvgetstr mvwgetstr |
| getnstr | Yes | wgetnstr mvgetnstr mvwgetnstr |
| getyx | Yes | |
| getparyx | Yes | |
| getbegyx | Yes | |
| getmaxyx | Yes | |
| inch | Yes | winch mvinch mvwinch |
| inchstr | Yes | winchstr mvinchstr mvwinchstr |
| inchnstr | Yes | winchnstr mvinchnstr mvwinchnstr |
| initscr | No | |
| endwin | No | |
| isendwin | No | |
| newterm | No | |
| set_term | No | |
| delscreen | No | |
| cbreak | No | |
| nocbreak | No | |
| echo | No | |
| noecho | No | |
| halfdelay | No | |
| intrflush | Yes | |
| keypad | Yes | |
| meta | Yes | |
| nodelay | Yes | |
| notimeout | Yes | |
| raw | No | |
| noraw | No | |
| qiflush | No | |
| noqiflush | No | |
| timeout | Yes | wtimeout |
| typeahead | No | |
| insch | Yes | winsch mvinsch mvwinsch |
| insstr | Yes | winsstr mvinsstr mvwinsstr |
| insnstr | Yes | winsnstr mvinsnstr mvwinsnstr |
| instr | Yes | winstr mvinstr mvwinstr |
| innstr | Yes | winnstr mvinnstr mvwinnstr |
| def_prog_mode | No | |
| def_shell_mode | No | |
| reset_prog_mode | No | |
| reset_shell_mode | No | |
| resetty | No | |
| savetty | No | |
| getsyx | No | |
| setsyx | No | |
| curs_set | No | |
| napms | No | |
| move | Yes | wmove |
| clearok | Yes | |
| idlok | Yes | |
| idcok | Yes | |
| immedok | Yes | |
| leaveok | Yes | |
| setscrreg | Yes | wsetscrreg |
| scrollok | Yes | |
| nl | No | |
| nonl | No | |
| overlay | No | |
| overwrite | No | |
| copywin | No | |
| newpad | No | |
| subpad | No | |
| prefresh | No | |
| pnoutrefresh | No | |
| pechochar | No | |
| refresh | Yes | wrefresh |
| noutrefresh | Yes | wnoutrefresh |
| doupdate | No | |
| redrawwin | Yes | |
| redrawln | Yes | wredrawln |
| scr_dump | No | |
| scr_restore | No | |
| scr_init | No | |
| scr_set | No | |
| scroll | Yes | |
| scrl | Yes | wscrl |
| slk_init | No | |
| slk_set | No | |
| slk_refresh | No | |
| slk_noutrefresh | No | |
| slk_label | No | |
| slk_clear | No | |
| slk_restore | No | |
| slk_touch | No | |
| slk_attron | No | |
| slk_attrset | No | |
| slk_attr | No | |
| slk_attroff | No | |
| slk_color | No | |
| baudrate | No | |
| erasechar | No | |
| has_ic | No | |
| has_il | No | |
| killchar | No | |
| longname | No | |
| termattrs | No | |
| termname | No | |
| touchwin | Yes | |
| touchline | Yes | |
| untouchwin | Yes | |
| touchln | Yes | wtouchln |
| is_linetouched | Yes | |
| is_wintouched | Yes | |
| unctrl | No | |
| keyname | No | |
| filter | No | |
| use_env | No | |
| putwin | No | |
| getwin | No | |
| delay_output | No | |
| flushinp | No | |
| newwin | No | |
| delwin | Yes | |
| mvwin | Yes | |
| subwin | Yes | |
| derwin | Yes | |
| mvderwin | Yes | |
| dupwin | Yes | |
| syncup | Yes | wsyncup |
| syncok | Yes | |
| cursyncup | Yes | wcursyncup |
| syncdown | Yes | wsyncdown |
| getmouse | No | |
| ungetmouse | No | |
| mousemask | No | |
| enclose | Yes | wenclose |
| mouse_trafo | Yes | wmouse_trafo |
| mouseinterval | No | |
| BUTTON_RELEASE | No | |
| BUTTON_PRESS | No | |
| BUTTON_CLICK | No | |
| BUTTON_DOUBLE_CLICK | No | |
| BUTTON_TRIPLE_CLICK | No | |
| BUTTON_RESERVED_EVENT | No | |
| use_default_colors | No | |
| assume_default_colors | No | |
| define_key | No | |
| keybound | No | |
| keyok | No | |
| resizeterm | No | |
| resize | Yes | wresize |
| getmaxy | Yes | |
| getmaxx | Yes | |
| flusok | Yes | |
| getcap | No | |
| touchoverlap | No | |
| new_panel | No | |
| bottom_panel | No | |
| top_panel | No | |
| show_panel | No | |
| update_panels | No | |
| hide_panel | No | |
| panel_window | No | |
| replace_panel | No | |
| move_panel | No | |
| panel_hidden | No | |
| panel_above | No | |
| panel_below | No | |
| set_panel_userptr | No | |
| panel_userptr | No | |
| del_panel | No | |
| set_menu_fore | No | |
| menu_fore | No | |
| set_menu_back | No | |
| menu_back | No | |
| set_menu_grey | No | |
| menu_grey | No | |
| set_menu_pad | No | |
| menu_pad | No | |
| pos_menu_cursor | No | |
| menu_driver | No | |
| set_menu_format | No | |
| menu_format | No | |
| set_menu_items | No | |
| menu_items | No | |
| item_count | No | |
| set_menu_mark | No | |
| menu_mark | No | |
| new_menu | No | |
| free_menu | No | |
| menu_opts | No | |
| set_menu_opts | No | |
| menu_opts_on | No | |
| menu_opts_off | No | |
| set_menu_pattern | No | |
| menu_pattern | No | |
| post_menu | No | |
| unpost_menu | No | |
| set_menu_userptr | No | |
| menu_userptr | No | |
| set_menu_win | No | |
| menu_win | No | |
| set_menu_sub | No | |
| menu_sub | No | |
| scale_menu | No | |
| set_current_item | No | |
| current_item | No | |
| set_top_row | No | |
| top_row | No | |
| item_index | No | |
| item_name | No | |
| item_description | No | |
| new_item | No | |
| free_item | No | |
| set_item_opts | No | |
| item_opts_on | No | |
| item_opts_off | No | |
| item_opts | No | |
| item_userptr | No | |
| set_item_userptr | No | |
| set_item_value | No | |
| item_value | No | |
| item_visible | No | |
| menu_request_name | No | |
| menu_request_by_name | No | |
| set_menu_spacing | No | |
| menu_spacing | No | |
| pos_form_cursor | No | |
| data_ahead | No | |
| data_behind | No | |
| form_driver | No | |
| set_form_fields | No | |
| form_fields | No | |
| field_count | No | |
| move_field | No | |
| new_form | No | |
| free_form | No | |
| set_new_page | No | |
| new_page | No | |
| set_form_opts | No | |
| form_opts_on | No | |
| form_opts_off | No | |
| form_opts | No | |
| set_current_field | No | |
| current_field | No | |
| set_form_page | No | |
| form_page | No | |
| field_index | No | |
| post_form | No | |
| unpost_form | No | |
| set_form_userptr | No | |
| form_userptr | No | |
| set_form_win | No | |
| form_win | No | |
| set_form_sub | No | |
| form_sub | No | |
| scale_form | No | |
| set_field_fore | No | |
| field_fore | No | |
| set_field_back | No | |
| field_back | No | |
| set_field_pad | No | |
| field_pad | No | |
| set_field_buffer | No | |
| field_buffer | No | |
| set_field_status | No | |
| field_status | No | |
| set_max_field | No | |
| field_info | No | |
| dynamic_field_info | No | |
| set_field_just | No | |
| field_just | No | |
| new_field | No | |
| dup_field | No | |
| link_field | No | |
| free_field | No | |
| set_field_opts | No | |
| field_opts_on | No | |
| field_opts_off | No | |
| field_opts | No | |
| set_field_userptr | No | |
| field_userptr | No | |
| field_arg | No | |
| form_request_name | No | |
| form_request_by_name | No |
[*] To use any functions in this column, the program must set the variable $Curses::OldCurses variable to a non-zero value before using the Curses package. See "Perl 4.X cursperl Compatibility" for an example of this.
| Function | Uses wide-character call | Reverts to legacy call |
|---|---|---|
| getchar | wget_wch | wgetch |
| getstring | wgetn_wstr | wgetnstr |
| ungetchar | unget_wch | ungetch |
| instring | winnwtr | winnstr |
| addstring | waddnwstr | waddnstr |
| insstring | wins_nwstr | winsnstr |
LINESCOLSstdscrcurscrCOLORSCOLOR_PAIRSERROKACS_BLOCKACS_BOARDACS_BTEEACS_BULLETACS_CKBOARDACS_DARROWACS_DEGREEACS_DIAMONDACS_HLINEACS_LANTERNACS_LARROWACS_LLCORNERACS_LRCORNERACS_LTEEACS_PLMINUSACS_PLUSACS_RARROWACS_RTEEACS_S1ACS_S9ACS_TTEEACS_UARROWACS_ULCORNERACS_URCORNERACS_VLINEA_ALTCHARSETA_ATTRIBUTESA_BLINKA_BOLDA_CHARTEXTA_COLORA_DIMA_INVISA_NORMALA_PROTECTA_REVERSEA_STANDOUTA_UNDERLINECOLOR_BLACKCOLOR_BLUECOLOR_CYANCOLOR_GREENCOLOR_MAGENTACOLOR_REDCOLOR_WHITECOLOR_YELLOWKEY_A1KEY_A3KEY_B2KEY_BACKSPACEKEY_BEGKEY_BREAKKEY_BTABKEY_C1KEY_C3KEY_CANCELKEY_CATABKEY_CLEARKEY_CLOSEKEY_COMMANDKEY_COPYKEY_CREATEKEY_CTABKEY_DCKEY_DLKEY_DOWNKEY_EICKEY_ENDKEY_ENTERKEY_EOLKEY_EOSKEY_EVENTKEY_EXITKEY_F0KEY_FINDKEY_HELPKEY_HOMEKEY_ICKEY_ILKEY_LEFTKEY_LLKEY_MARKKEY_MAXKEY_MESSAGEKEY_MINKEY_MOVEKEY_NEXTKEY_NPAGEKEY_OPENKEY_OPTIONSKEY_PPAGEKEY_PREVIOUSKEY_PRINTKEY_REDOKEY_REFERENCEKEY_REFRESHKEY_REPLACEKEY_RESETKEY_RESIZEKEY_RESTARTKEY_RESUMEKEY_RIGHTKEY_SAVEKEY_SBEGKEY_SCANCELKEY_SCOMMANDKEY_SCOPYKEY_SCREATEKEY_SDCKEY_SDLKEY_SELECTKEY_SENDKEY_SEOLKEY_SEXITKEY_SFKEY_SFINDKEY_SHELPKEY_SHOMEKEY_SICKEY_SLEFTKEY_SMESSAGEKEY_SMOVEKEY_SNEXTKEY_SOPTIONSKEY_SPREVIOUSKEY_SPRINTKEY_SRKEY_SREDOKEY_SREPLACEKEY_SRESETKEY_SRIGHTKEY_SRSUMEKEY_SSAVEKEY_SSUSPENDKEY_STABKEY_SUNDOKEY_SUSPENDKEY_UNDOKEY_UPKEY_MOUSEBUTTON1_RELEASEDBUTTON1_PRESSEDBUTTON1_CLICKEDBUTTON1_DOUBLE_CLICKEDBUTTON1_TRIPLE_CLICKEDBUTTON1_RESERVED_EVENTBUTTON2_RELEASEDBUTTON2_PRESSEDBUTTON2_CLICKEDBUTTON2_DOUBLE_CLICKEDBUTTON2_TRIPLE_CLICKEDBUTTON2_RESERVED_EVENTBUTTON3_RELEASEDBUTTON3_PRESSEDBUTTON3_CLICKEDBUTTON3_DOUBLE_CLICKEDBUTTON3_TRIPLE_CLICKEDBUTTON3_RESERVED_EVENTBUTTON4_RELEASEDBUTTON4_PRESSEDBUTTON4_CLICKEDBUTTON4_DOUBLE_CLICKEDBUTTON4_TRIPLE_CLICKEDBUTTON4_RESERVED_EVENTALL_MOUSE_EVENTSREPORT_MOUSE_POSITIONNCURSES_MOUSE_VERSIONE_OKE_SYSTEM_ERRORE_BAD_ARGUMENTE_POSTEDE_CONNECTEDE_BAD_STATEE_NO_ROOME_NOT_POSTEDE_UNKNOWN_COMMANDE_NO_MATCHE_NOT_SELECTABLEE_NOT_CONNECTEDE_REQUEST_DENIEDE_INVALID_FIELDE_CURRENTREQ_LEFT_ITEMREQ_RIGHT_ITEMREQ_UP_ITEMREQ_DOWN_ITEMREQ_SCR_ULINEREQ_SCR_DLINEREQ_SCR_DPAGEREQ_SCR_UPAGEREQ_FIRST_ITEMREQ_LAST_ITEMREQ_NEXT_ITEMREQ_PREV_ITEMREQ_TOGGLE_ITEMREQ_CLEAR_PATTERNREQ_BACK_PATTERNREQ_NEXT_MATCHREQ_PREV_MATCHMIN_MENU_COMMANDMAX_MENU_COMMANDO_ONEVALUEO_SHOWDESCO_ROWMAJORO_IGNORECASEO_SHOWMATCHO_NONCYCLICO_SELECTABLEREQ_NEXT_PAGEREQ_PREV_PAGEREQ_FIRST_PAGEREQ_LAST_PAGEREQ_NEXT_FIELDREQ_PREV_FIELDREQ_FIRST_FIELDREQ_LAST_FIELDREQ_SNEXT_FIELDREQ_SPREV_FIELDREQ_SFIRST_FIELDREQ_SLAST_FIELDREQ_LEFT_FIELDREQ_RIGHT_FIELDREQ_UP_FIELDREQ_DOWN_FIELDREQ_NEXT_CHARREQ_PREV_CHARREQ_NEXT_LINEREQ_PREV_LINEREQ_NEXT_WORDREQ_PREV_WORDREQ_BEG_FIELDREQ_END_FIELDREQ_BEG_LINEREQ_END_LINEREQ_LEFT_CHARREQ_RIGHT_CHARREQ_UP_CHARREQ_DOWN_CHARREQ_NEW_LINEREQ_INS_CHARREQ_INS_LINEREQ_DEL_CHARREQ_DEL_PREVREQ_DEL_LINEREQ_DEL_WORDREQ_CLR_EOLREQ_CLR_EOFREQ_CLR_FIELDREQ_OVL_MODEREQ_INS_MODEREQ_SCR_FLINEREQ_SCR_BLINEREQ_SCR_FPAGEREQ_SCR_BPAGEREQ_SCR_FHPAGEREQ_SCR_BHPAGEREQ_SCR_FCHARREQ_SCR_BCHARREQ_SCR_HFLINEREQ_SCR_HBLINEREQ_SCR_HFHALFREQ_SCR_HBHALFREQ_VALIDATIONREQ_NEXT_CHOICEREQ_PREV_CHOICEMIN_FORM_COMMANDMAX_FORM_COMMANDNO_JUSTIFICATIONJUSTIFY_LEFTJUSTIFY_CENTERJUSTIFY_RIGHTO_VISIBLEO_ACTIVEO_PUBLICO_EDITO_WRAPO_BLANKO_AUTOSKIPO_NULLOKO_PASSOKO_STATICO_NL_OVERLOADO_BS_OVERLOADCurseststp_putcharfullnamescanwwscanwmvscanwmvwscanwripofflinesetuptermsettermset_curtermdel_curtermrestarttermtparmtputsputpvidputsvidattrmvcurtigetflagtigetnumtigetstrtgetenttgetflagtgetnumtgetstrtgototputsCurses menu functions not available through Perl Curses:
set_item_inititem_initset_item_termitem_termset_menu_initmenu_initset_menu_termmenu_termCurses form functions not available through Perl Curses:
new_fieldtypefree_fieldtypeset_fieldtype_argset_fieldtype_choicelink_fieldtypeset_form_initform_initset_form_termform_termset_field_initfield_initset_field_termfield_termset_field_typefield_typeperl v5.34.0 2022-02-06 Curses(3pm)
Generated by phpman v4.9.26-1-g511901d Author: Che Dong Under GNU General Public License
2026-08-08 12:36 @216.73.216.150
CrawledBy Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
Enhanced by LLM: deepseek-v4-flash / taotoken.net / www.chedong.com - original format