00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include "compat.h"
00047
00048
00049
00050
00051 #include "sys.h"
00052 #include <stdlib.h>
00053 #include "el.h"
00054
00055 #define N_KEYS 256
00056
00057 el_private void map_print_key(EditLine_t*, ElAction_t*, char*);
00058 el_private void map_print_some_keys(EditLine_t*, ElAction_t*, int, int);
00059 el_private void map_print_all_keys(EditLine_t*);
00060 el_private void map_init_nls(EditLine_t*);
00061 el_private void map_init_meta(EditLine_t*);
00062
00063
00064
00065
00066 el_private const ElAction_t el_map_emacs[] = {
00067 EM_SET_MARK,
00068 ED_MOVE_TO_BEG,
00069 ED_PREV_CHAR,
00070 ED_TTY_SIGINT,
00071 EM_DELETE_OR_LIST,
00072 ED_MOVE_TO_END,
00073 ED_NEXT_CHAR,
00074 ED_UNASSIGNED,
00075 ED_DELETE_PREV_CHAR,
00076 ED_UNASSIGNED,
00077 ED_NEWLINE,
00078 ED_KILL_LINE,
00079 ED_CLEAR_SCREEN,
00080 ED_NEWLINE,
00081 ED_NEXT_HISTORY,
00082
00083 ED_REPLAY_HIST,
00084 ED_PREV_HISTORY,
00085 ED_TTY_START_OUTPUT,
00086 ED_REDISPLAY,
00087 ED_TTY_STOP_OUTPUT,
00088 ED_TRANSPOSE_CHARS,
00089 EM_KILL_LINE,
00090 ED_QUOTED_INSERT,
00091 EM_KILL_REGION,
00092 ED_SEQUENCE_LEAD_IN,
00093 EM_YANK,
00094 ED_TTY_SIGTSTP,
00095 EM_META_NEXT,
00096 ED_TTY_SIGQUIT,
00097 ED_TTY_DSUSP,
00098 ED_UNASSIGNED,
00099 EM_UNDO,
00100 ED_INSERT,
00101 ED_INSERT,
00102 ED_INSERT,
00103 ED_INSERT,
00104 ED_INSERT,
00105 ED_INSERT,
00106 ED_INSERT,
00107 ED_INSERT,
00108 ED_INSERT,
00109 ED_INSERT,
00110 ED_INSERT,
00111 ED_INSERT,
00112 ED_INSERT,
00113 ED_INSERT,
00114 ED_INSERT,
00115 ED_INSERT,
00116 ED_DIGIT,
00117 ED_DIGIT,
00118 ED_DIGIT,
00119 ED_DIGIT,
00120 ED_DIGIT,
00121 ED_DIGIT,
00122 ED_DIGIT,
00123 ED_DIGIT,
00124 ED_DIGIT,
00125 ED_DIGIT,
00126 ED_INSERT,
00127 ED_INSERT,
00128 ED_INSERT,
00129 ED_INSERT,
00130 ED_INSERT,
00131 ED_INSERT,
00132 ED_INSERT,
00133 ED_INSERT,
00134 ED_INSERT,
00135 ED_INSERT,
00136 ED_INSERT,
00137 ED_INSERT,
00138 ED_INSERT,
00139 ED_INSERT,
00140 ED_INSERT,
00141 ED_INSERT,
00142 ED_INSERT,
00143 ED_INSERT,
00144 ED_INSERT,
00145 ED_INSERT,
00146 ED_INSERT,
00147 ED_INSERT,
00148 ED_INSERT,
00149 ED_INSERT,
00150 ED_INSERT,
00151 ED_INSERT,
00152 ED_INSERT,
00153 ED_INSERT,
00154 ED_INSERT,
00155 ED_INSERT,
00156 ED_INSERT,
00157 ED_INSERT,
00158 ED_INSERT,
00159 ED_INSERT,
00160 ED_INSERT,
00161 ED_INSERT,
00162 ED_INSERT,
00163 ED_INSERT,
00164 ED_INSERT,
00165 ED_INSERT,
00166 ED_INSERT,
00167 ED_INSERT,
00168 ED_INSERT,
00169 ED_INSERT,
00170 ED_INSERT,
00171 ED_INSERT,
00172 ED_INSERT,
00173 ED_INSERT,
00174 ED_INSERT,
00175 ED_INSERT,
00176 ED_INSERT,
00177 ED_INSERT,
00178 ED_INSERT,
00179 ED_INSERT,
00180 ED_INSERT,
00181 ED_INSERT,
00182 ED_INSERT,
00183 ED_INSERT,
00184 ED_INSERT,
00185 ED_INSERT,
00186 ED_INSERT,
00187 ED_INSERT,
00188 ED_INSERT,
00189 ED_INSERT,
00190 ED_INSERT,
00191 ED_INSERT,
00192 ED_INSERT,
00193 ED_INSERT,
00194 ED_INSERT,
00195 ED_DELETE_PREV_CHAR,
00196 ED_UNASSIGNED,
00197 ED_UNASSIGNED,
00198 ED_UNASSIGNED,
00199 ED_UNASSIGNED,
00200 ED_UNASSIGNED,
00201 ED_UNASSIGNED,
00202 ED_UNASSIGNED,
00203 ED_UNASSIGNED,
00204 ED_DELETE_PREV_WORD,
00205 ED_UNASSIGNED,
00206 ED_UNASSIGNED,
00207 ED_UNASSIGNED,
00208 ED_CLEAR_SCREEN,
00209 ED_UNASSIGNED,
00210 ED_UNASSIGNED,
00211 ED_UNASSIGNED,
00212 ED_UNASSIGNED,
00213 ED_UNASSIGNED,
00214 ED_UNASSIGNED,
00215 ED_UNASSIGNED,
00216 ED_UNASSIGNED,
00217 ED_UNASSIGNED,
00218 ED_UNASSIGNED,
00219 ED_UNASSIGNED,
00220 ED_UNASSIGNED,
00221 ED_UNASSIGNED,
00222 ED_UNASSIGNED,
00223 ED_UNASSIGNED,
00224 ED_UNASSIGNED,
00225 ED_UNASSIGNED,
00226 ED_UNASSIGNED,
00227 EM_COPY_PREV_WORD,
00228 ED_UNASSIGNED,
00229 ED_UNASSIGNED,
00230 ED_UNASSIGNED,
00231 ED_UNASSIGNED,
00232 ED_UNASSIGNED,
00233 ED_UNASSIGNED,
00234 ED_UNASSIGNED,
00235 ED_UNASSIGNED,
00236 ED_UNASSIGNED,
00237 ED_UNASSIGNED,
00238 ED_UNASSIGNED,
00239 ED_UNASSIGNED,
00240 ED_UNASSIGNED,
00241 ED_UNASSIGNED,
00242 ED_UNASSIGNED,
00243 ED_UNASSIGNED,
00244 ED_ARGUMENT_DIGIT,
00245 ED_ARGUMENT_DIGIT,
00246 ED_ARGUMENT_DIGIT,
00247 ED_ARGUMENT_DIGIT,
00248 ED_ARGUMENT_DIGIT,
00249 ED_ARGUMENT_DIGIT,
00250 ED_ARGUMENT_DIGIT,
00251 ED_ARGUMENT_DIGIT,
00252 ED_ARGUMENT_DIGIT,
00253 ED_ARGUMENT_DIGIT,
00254 ED_UNASSIGNED,
00255 ED_UNASSIGNED,
00256 ED_UNASSIGNED,
00257 ED_UNASSIGNED,
00258 ED_UNASSIGNED,
00259 ED_UNASSIGNED,
00260 ED_UNASSIGNED,
00261 ED_UNASSIGNED,
00262 ED_PREV_WORD,
00263 EM_CAPITOL_CASE,
00264 EM_DELETE_NEXT_WORD,
00265 ED_UNASSIGNED,
00266 EM_NEXT_WORD,
00267 ED_UNASSIGNED,
00268 ED_UNASSIGNED,
00269 ED_UNASSIGNED,
00270 ED_UNASSIGNED,
00271 ED_UNASSIGNED,
00272 EM_LOWER_CASE,
00273 ED_UNASSIGNED,
00274 ED_SEARCH_NEXT_HISTORY,
00275 ED_SEQUENCE_LEAD_IN,
00276 ED_SEARCH_PREV_HISTORY,
00277 ED_UNASSIGNED,
00278 ED_UNASSIGNED,
00279 ED_UNASSIGNED,
00280 ED_UNASSIGNED,
00281 EM_UPPER_CASE,
00282 ED_UNASSIGNED,
00283 EM_COPY_REGION,
00284 ED_COMMAND,
00285 ED_UNASSIGNED,
00286 ED_UNASSIGNED,
00287 ED_SEQUENCE_LEAD_IN,
00288 ED_UNASSIGNED,
00289 ED_UNASSIGNED,
00290 ED_UNASSIGNED,
00291 ED_UNASSIGNED,
00292 ED_UNASSIGNED,
00293 ED_UNASSIGNED,
00294 ED_PREV_WORD,
00295 EM_CAPITOL_CASE,
00296 EM_DELETE_NEXT_WORD,
00297 ED_UNASSIGNED,
00298 EM_NEXT_WORD,
00299 ED_UNASSIGNED,
00300 ED_UNASSIGNED,
00301 ED_UNASSIGNED,
00302 ED_UNASSIGNED,
00303 ED_UNASSIGNED,
00304 EM_LOWER_CASE,
00305 ED_UNASSIGNED,
00306 ED_SEARCH_NEXT_HISTORY,
00307 ED_UNASSIGNED,
00308 ED_SEARCH_PREV_HISTORY,
00309 ED_UNASSIGNED,
00310 ED_UNASSIGNED,
00311 ED_UNASSIGNED,
00312 ED_UNASSIGNED,
00313 EM_UPPER_CASE,
00314 ED_UNASSIGNED,
00315 EM_COPY_REGION,
00316 ED_COMMAND,
00317 ED_UNASSIGNED,
00318 ED_UNASSIGNED,
00319 ED_UNASSIGNED,
00320 ED_UNASSIGNED,
00321 ED_UNASSIGNED,
00322 ED_UNASSIGNED,
00323 ED_DELETE_PREV_WORD
00324
00325 };
00326
00327
00328
00329
00330
00331
00332
00333
00334 el_private const ElAction_t el_map_vi_insert[] = {
00335 #ifdef KSHVI
00336 ED_UNASSIGNED,
00337 ED_INSERT,
00338 ED_INSERT,
00339 ED_INSERT,
00340 VI_LIST_OR_EOF,
00341 ED_INSERT,
00342 ED_INSERT,
00343 ED_INSERT,
00344 VI_DELETE_PREV_CHAR,
00345 ED_INSERT,
00346 ED_NEWLINE,
00347 ED_INSERT,
00348 ED_INSERT,
00349 ED_NEWLINE,
00350 ED_INSERT,
00351 ED_INSERT,
00352 ED_INSERT,
00353 ED_TTY_START_OUTPUT,
00354 ED_INSERT,
00355 ED_TTY_STOP_OUTPUT,
00356 ED_INSERT,
00357 VI_KILL_LINE_PREV,
00358 ED_QUOTED_INSERT,
00359 ED_DELETE_PREV_WORD,
00360
00361 ED_INSERT,
00362 ED_INSERT,
00363 ED_INSERT,
00364 VI_COMMAND_MODE,
00365 ED_TTY_SIGQUIT,
00366 ED_INSERT,
00367 ED_INSERT,
00368 ED_INSERT,
00369 #else
00370
00371
00372
00373
00374
00375
00376
00377 ED_UNASSIGNED,
00378 ED_MOVE_TO_BEG,
00379 ED_PREV_CHAR,
00380 ED_TTY_SIGINT,
00381 VI_LIST_OR_EOF,
00382 ED_MOVE_TO_END,
00383 ED_NEXT_CHAR,
00384 ED_UNASSIGNED,
00385 ED_DELETE_PREV_CHAR,
00386 ED_UNASSIGNED,
00387 ED_NEWLINE,
00388 ED_KILL_LINE,
00389 ED_CLEAR_SCREEN,
00390 ED_NEWLINE,
00391 ED_NEXT_HISTORY,
00392 ED_TTY_FLUSH_OUTPUT,
00393 ED_PREV_HISTORY,
00394 ED_TTY_START_OUTPUT,
00395 ED_REDISPLAY,
00396 ED_TTY_STOP_OUTPUT,
00397 ED_TRANSPOSE_CHARS,
00398 VI_KILL_LINE_PREV,
00399 ED_QUOTED_INSERT,
00400 ED_DELETE_PREV_WORD,
00401 ED_UNASSIGNED,
00402 ED_TTY_DSUSP,
00403 ED_TTY_SIGTSTP,
00404 VI_COMMAND_MODE,
00405 ED_TTY_SIGQUIT,
00406 ED_UNASSIGNED,
00407 ED_UNASSIGNED,
00408 ED_UNASSIGNED,
00409 #endif
00410 ED_INSERT,
00411 ED_INSERT,
00412 ED_INSERT,
00413 ED_INSERT,
00414 ED_INSERT,
00415 ED_INSERT,
00416 ED_INSERT,
00417 ED_INSERT,
00418 ED_INSERT,
00419 ED_INSERT,
00420 ED_INSERT,
00421 ED_INSERT,
00422 ED_INSERT,
00423 ED_INSERT,
00424 ED_INSERT,
00425 ED_INSERT,
00426 ED_INSERT,
00427 ED_INSERT,
00428 ED_INSERT,
00429 ED_INSERT,
00430 ED_INSERT,
00431 ED_INSERT,
00432 ED_INSERT,
00433 ED_INSERT,
00434 ED_INSERT,
00435 ED_INSERT,
00436 ED_INSERT,
00437 ED_INSERT,
00438 ED_INSERT,
00439 ED_INSERT,
00440 ED_INSERT,
00441 ED_INSERT,
00442 ED_INSERT,
00443 ED_INSERT,
00444 ED_INSERT,
00445 ED_INSERT,
00446 ED_INSERT,
00447 ED_INSERT,
00448 ED_INSERT,
00449 ED_INSERT,
00450 ED_INSERT,
00451 ED_INSERT,
00452 ED_INSERT,
00453 ED_INSERT,
00454 ED_INSERT,
00455 ED_INSERT,
00456 ED_INSERT,
00457 ED_INSERT,
00458 ED_INSERT,
00459 ED_INSERT,
00460 ED_INSERT,
00461 ED_INSERT,
00462 ED_INSERT,
00463 ED_INSERT,
00464 ED_INSERT,
00465 ED_INSERT,
00466 ED_INSERT,
00467 ED_INSERT,
00468 ED_INSERT,
00469 ED_INSERT,
00470 ED_INSERT,
00471 ED_INSERT,
00472 ED_INSERT,
00473 ED_INSERT,
00474 ED_INSERT,
00475 ED_INSERT,
00476 ED_INSERT,
00477 ED_INSERT,
00478 ED_INSERT,
00479 ED_INSERT,
00480 ED_INSERT,
00481 ED_INSERT,
00482 ED_INSERT,
00483 ED_INSERT,
00484 ED_INSERT,
00485 ED_INSERT,
00486 ED_INSERT,
00487 ED_INSERT,
00488 ED_INSERT,
00489 ED_INSERT,
00490 ED_INSERT,
00491 ED_INSERT,
00492 ED_INSERT,
00493 ED_INSERT,
00494 ED_INSERT,
00495 ED_INSERT,
00496 ED_INSERT,
00497 ED_INSERT,
00498 ED_INSERT,
00499 ED_INSERT,
00500 ED_INSERT,
00501 ED_INSERT,
00502 ED_INSERT,
00503 ED_INSERT,
00504 ED_INSERT,
00505 ED_DELETE_PREV_CHAR,
00506 ED_UNASSIGNED,
00507 ED_UNASSIGNED,
00508 ED_UNASSIGNED,
00509 ED_UNASSIGNED,
00510 ED_UNASSIGNED,
00511 ED_UNASSIGNED,
00512 ED_UNASSIGNED,
00513 ED_UNASSIGNED,
00514 ED_UNASSIGNED,
00515 ED_UNASSIGNED,
00516 ED_UNASSIGNED,
00517 ED_UNASSIGNED,
00518 ED_UNASSIGNED,
00519 ED_UNASSIGNED,
00520 ED_UNASSIGNED,
00521 ED_UNASSIGNED,
00522 ED_UNASSIGNED,
00523 ED_UNASSIGNED,
00524 ED_UNASSIGNED,
00525 ED_UNASSIGNED,
00526 ED_UNASSIGNED,
00527 ED_UNASSIGNED,
00528 ED_UNASSIGNED,
00529 ED_UNASSIGNED,
00530 ED_UNASSIGNED,
00531 ED_UNASSIGNED,
00532 ED_UNASSIGNED,
00533 ED_UNASSIGNED,
00534 ED_UNASSIGNED,
00535 ED_UNASSIGNED,
00536 ED_UNASSIGNED,
00537 ED_UNASSIGNED,
00538 ED_UNASSIGNED,
00539 ED_UNASSIGNED,
00540 ED_UNASSIGNED,
00541 ED_UNASSIGNED,
00542 ED_UNASSIGNED,
00543 ED_UNASSIGNED,
00544 ED_UNASSIGNED,
00545 ED_UNASSIGNED,
00546 ED_UNASSIGNED,
00547 ED_UNASSIGNED,
00548 ED_UNASSIGNED,
00549 ED_UNASSIGNED,
00550 ED_UNASSIGNED,
00551 ED_UNASSIGNED,
00552 ED_UNASSIGNED,
00553 ED_UNASSIGNED,
00554 ED_UNASSIGNED,
00555 ED_UNASSIGNED,
00556 ED_UNASSIGNED,
00557 ED_UNASSIGNED,
00558 ED_UNASSIGNED,
00559 ED_UNASSIGNED,
00560 ED_UNASSIGNED,
00561 ED_UNASSIGNED,
00562 ED_UNASSIGNED,
00563 ED_UNASSIGNED,
00564 ED_UNASSIGNED,
00565 ED_UNASSIGNED,
00566 ED_UNASSIGNED,
00567 ED_UNASSIGNED,
00568 ED_UNASSIGNED,
00569 ED_UNASSIGNED,
00570 ED_UNASSIGNED,
00571 ED_UNASSIGNED,
00572 ED_UNASSIGNED,
00573 ED_UNASSIGNED,
00574 ED_UNASSIGNED,
00575 ED_UNASSIGNED,
00576 ED_UNASSIGNED,
00577 ED_UNASSIGNED,
00578 ED_UNASSIGNED,
00579 ED_UNASSIGNED,
00580 ED_UNASSIGNED,
00581 ED_UNASSIGNED,
00582 ED_UNASSIGNED,
00583 ED_UNASSIGNED,
00584 ED_UNASSIGNED,
00585 ED_UNASSIGNED,
00586 ED_UNASSIGNED,
00587 ED_UNASSIGNED,
00588 ED_UNASSIGNED,
00589 ED_UNASSIGNED,
00590 ED_UNASSIGNED,
00591 ED_UNASSIGNED,
00592 ED_UNASSIGNED,
00593 ED_UNASSIGNED,
00594 ED_UNASSIGNED,
00595 ED_UNASSIGNED,
00596 ED_UNASSIGNED,
00597 ED_UNASSIGNED,
00598 ED_UNASSIGNED,
00599 ED_UNASSIGNED,
00600 ED_UNASSIGNED,
00601 ED_UNASSIGNED,
00602 ED_UNASSIGNED,
00603 ED_UNASSIGNED,
00604 ED_UNASSIGNED,
00605 ED_UNASSIGNED,
00606 ED_UNASSIGNED,
00607 ED_UNASSIGNED,
00608 ED_UNASSIGNED,
00609 ED_UNASSIGNED,
00610 ED_UNASSIGNED,
00611 ED_UNASSIGNED,
00612 ED_UNASSIGNED,
00613 ED_UNASSIGNED,
00614 ED_UNASSIGNED,
00615 ED_UNASSIGNED,
00616 ED_UNASSIGNED,
00617 ED_UNASSIGNED,
00618 ED_UNASSIGNED,
00619 ED_UNASSIGNED,
00620 ED_UNASSIGNED,
00621 ED_UNASSIGNED,
00622 ED_UNASSIGNED,
00623 ED_UNASSIGNED,
00624 ED_UNASSIGNED,
00625 ED_UNASSIGNED,
00626 ED_UNASSIGNED,
00627 ED_UNASSIGNED,
00628 ED_UNASSIGNED,
00629 ED_UNASSIGNED,
00630 ED_UNASSIGNED,
00631 ED_UNASSIGNED,
00632 ED_UNASSIGNED,
00633 ED_UNASSIGNED
00634 };
00635
00636 el_private const ElAction_t el_map_vi_command[] = {
00637 ED_UNASSIGNED,
00638 ED_MOVE_TO_BEG,
00639 ED_UNASSIGNED,
00640 ED_TTY_SIGINT,
00641 ED_UNASSIGNED,
00642 ED_MOVE_TO_END,
00643 ED_UNASSIGNED,
00644 ED_UNASSIGNED,
00645 ED_PREV_CHAR,
00646 ED_UNASSIGNED,
00647 ED_NEWLINE,
00648 ED_KILL_LINE,
00649 ED_CLEAR_SCREEN,
00650 ED_NEWLINE,
00651 ED_NEXT_HISTORY,
00652 ED_TTY_FLUSH_OUTPUT,
00653 ED_PREV_HISTORY,
00654 ED_TTY_START_OUTPUT,
00655 ED_REDISPLAY,
00656 ED_TTY_STOP_OUTPUT,
00657 ED_UNASSIGNED,
00658 VI_KILL_LINE_PREV,
00659 ED_UNASSIGNED,
00660 ED_DELETE_PREV_WORD,
00661 ED_UNASSIGNED,
00662 ED_UNASSIGNED,
00663 ED_UNASSIGNED,
00664 EM_META_NEXT,
00665 ED_TTY_SIGQUIT,
00666 ED_UNASSIGNED,
00667 ED_UNASSIGNED,
00668 ED_UNASSIGNED,
00669 ED_NEXT_CHAR,
00670 ED_UNASSIGNED,
00671 ED_UNASSIGNED,
00672 ED_UNASSIGNED,
00673 ED_MOVE_TO_END,
00674 ED_UNASSIGNED,
00675 ED_UNASSIGNED,
00676 ED_UNASSIGNED,
00677 ED_UNASSIGNED,
00678 ED_UNASSIGNED,
00679 ED_UNASSIGNED,
00680 ED_NEXT_HISTORY,
00681 VI_REPEAT_PREV_CHAR,
00682 ED_PREV_HISTORY,
00683 ED_UNASSIGNED,
00684 VI_SEARCH_PREV,
00685 VI_ZERO,
00686 ED_ARGUMENT_DIGIT,
00687 ED_ARGUMENT_DIGIT,
00688 ED_ARGUMENT_DIGIT,
00689 ED_ARGUMENT_DIGIT,
00690 ED_ARGUMENT_DIGIT,
00691 ED_ARGUMENT_DIGIT,
00692 ED_ARGUMENT_DIGIT,
00693 ED_ARGUMENT_DIGIT,
00694 ED_ARGUMENT_DIGIT,
00695 ED_COMMAND,
00696 VI_REPEAT_NEXT_CHAR,
00697 ED_UNASSIGNED,
00698 ED_UNASSIGNED,
00699 ED_UNASSIGNED,
00700 VI_SEARCH_NEXT,
00701 ED_UNASSIGNED,
00702 VI_ADD_AT_EOL,
00703 VI_PREV_SPACE_WORD,
00704 VI_CHANGE_TO_EOL,
00705 ED_KILL_LINE,
00706 VI_TO_END_WORD,
00707 VI_PREV_CHAR,
00708 ED_UNASSIGNED,
00709 ED_UNASSIGNED,
00710 VI_INSERT_AT_BOL,
00711 ED_SEARCH_NEXT_HISTORY,
00712 ED_SEARCH_PREV_HISTORY,
00713 ED_UNASSIGNED,
00714 ED_UNASSIGNED,
00715 VI_REPEAT_SEARCH_PREV,
00716 ED_SEQUENCE_LEAD_IN,
00717 VI_PASTE_PREV,
00718 ED_UNASSIGNED,
00719 VI_REPLACE_MODE,
00720 VI_SUBSTITUTE_LINE,
00721 VI_TO_PREV_CHAR,
00722 ED_UNASSIGNED,
00723 ED_UNASSIGNED,
00724 VI_NEXT_SPACE_WORD,
00725 ED_DELETE_PREV_CHAR,
00726 ED_UNASSIGNED,
00727 ED_UNASSIGNED,
00728 ED_SEQUENCE_LEAD_IN,
00729 ED_UNASSIGNED,
00730 ED_UNASSIGNED,
00731 ED_MOVE_TO_BEG,
00732 ED_UNASSIGNED,
00733 ED_UNASSIGNED,
00734 VI_ADD,
00735 VI_PREV_WORD,
00736 VI_CHANGE_META,
00737 VI_DELETE_META,
00738 VI_END_WORD,
00739 VI_NEXT_CHAR,
00740 ED_UNASSIGNED,
00741 ED_PREV_CHAR,
00742 VI_INSERT,
00743 ED_NEXT_HISTORY,
00744 ED_PREV_HISTORY,
00745 ED_NEXT_CHAR,
00746 ED_UNASSIGNED,
00747 VI_REPEAT_SEARCH_NEXT,
00748 ED_UNASSIGNED,
00749 VI_PASTE_NEXT,
00750 ED_UNASSIGNED,
00751 VI_REPLACE_CHAR,
00752 VI_SUBSTITUTE_CHAR,
00753 VI_TO_NEXT_CHAR,
00754 VI_UNDO,
00755 ED_UNASSIGNED,
00756 VI_NEXT_WORD,
00757 ED_DELETE_NEXT_CHAR,
00758 ED_UNASSIGNED,
00759 ED_UNASSIGNED,
00760 ED_UNASSIGNED,
00761 ED_UNASSIGNED,
00762 ED_UNASSIGNED,
00763 VI_CHANGE_CASE,
00764 ED_DELETE_PREV_CHAR,
00765 ED_UNASSIGNED,
00766 ED_UNASSIGNED,
00767 ED_UNASSIGNED,
00768 ED_UNASSIGNED,
00769 ED_UNASSIGNED,
00770 ED_UNASSIGNED,
00771 ED_UNASSIGNED,
00772 ED_UNASSIGNED,
00773 ED_UNASSIGNED,
00774 ED_UNASSIGNED,
00775 ED_UNASSIGNED,
00776 ED_UNASSIGNED,
00777 ED_UNASSIGNED,
00778 ED_UNASSIGNED,
00779 ED_UNASSIGNED,
00780 ED_UNASSIGNED,
00781 ED_UNASSIGNED,
00782 ED_UNASSIGNED,
00783 ED_UNASSIGNED,
00784 ED_UNASSIGNED,
00785 ED_UNASSIGNED,
00786 ED_UNASSIGNED,
00787 ED_UNASSIGNED,
00788 ED_UNASSIGNED,
00789 ED_UNASSIGNED,
00790 ED_UNASSIGNED,
00791 ED_UNASSIGNED,
00792 ED_UNASSIGNED,
00793 ED_UNASSIGNED,
00794 ED_UNASSIGNED,
00795 ED_UNASSIGNED,
00796 ED_UNASSIGNED,
00797 ED_UNASSIGNED,
00798 ED_UNASSIGNED,
00799 ED_UNASSIGNED,
00800 ED_UNASSIGNED,
00801 ED_UNASSIGNED,
00802 ED_UNASSIGNED,
00803 ED_UNASSIGNED,
00804 ED_UNASSIGNED,
00805 ED_UNASSIGNED,
00806 ED_UNASSIGNED,
00807 ED_UNASSIGNED,
00808 ED_UNASSIGNED,
00809 ED_UNASSIGNED,
00810 ED_UNASSIGNED,
00811 ED_UNASSIGNED,
00812 ED_UNASSIGNED,
00813 ED_UNASSIGNED,
00814 ED_UNASSIGNED,
00815 ED_UNASSIGNED,
00816 ED_UNASSIGNED,
00817 ED_UNASSIGNED,
00818 ED_UNASSIGNED,
00819 ED_UNASSIGNED,
00820 ED_UNASSIGNED,
00821 ED_UNASSIGNED,
00822 ED_UNASSIGNED,
00823 ED_UNASSIGNED,
00824 ED_UNASSIGNED,
00825 ED_UNASSIGNED,
00826 ED_UNASSIGNED,
00827 ED_UNASSIGNED,
00828 ED_UNASSIGNED,
00829 ED_UNASSIGNED,
00830 ED_UNASSIGNED,
00831 ED_UNASSIGNED,
00832 ED_UNASSIGNED,
00833 ED_UNASSIGNED,
00834 ED_UNASSIGNED,
00835 ED_UNASSIGNED,
00836 ED_UNASSIGNED,
00837 ED_UNASSIGNED,
00838 ED_UNASSIGNED,
00839 ED_UNASSIGNED,
00840 ED_UNASSIGNED,
00841 ED_UNASSIGNED,
00842 ED_UNASSIGNED,
00843 ED_UNASSIGNED,
00844 ED_SEQUENCE_LEAD_IN,
00845 ED_UNASSIGNED,
00846 ED_UNASSIGNED,
00847 ED_UNASSIGNED,
00848 ED_UNASSIGNED,
00849 ED_UNASSIGNED,
00850 ED_UNASSIGNED,
00851 ED_UNASSIGNED,
00852 ED_UNASSIGNED,
00853 ED_UNASSIGNED,
00854 ED_UNASSIGNED,
00855 ED_UNASSIGNED,
00856 ED_SEQUENCE_LEAD_IN,
00857 ED_UNASSIGNED,
00858 ED_UNASSIGNED,
00859 ED_UNASSIGNED,
00860 ED_UNASSIGNED,
00861 ED_UNASSIGNED,
00862 ED_UNASSIGNED,
00863 ED_UNASSIGNED,
00864 ED_UNASSIGNED,
00865 ED_UNASSIGNED,
00866 ED_UNASSIGNED,
00867 ED_UNASSIGNED,
00868 ED_UNASSIGNED,
00869 ED_UNASSIGNED,
00870 ED_UNASSIGNED,
00871 ED_UNASSIGNED,
00872 ED_UNASSIGNED,
00873 ED_UNASSIGNED,
00874 ED_UNASSIGNED,
00875 ED_UNASSIGNED,
00876 ED_UNASSIGNED,
00877 ED_UNASSIGNED,
00878 ED_UNASSIGNED,
00879 ED_UNASSIGNED,
00880 ED_UNASSIGNED,
00881 ED_UNASSIGNED,
00882 ED_UNASSIGNED,
00883 ED_UNASSIGNED,
00884 ED_UNASSIGNED,
00885 ED_UNASSIGNED,
00886 ED_UNASSIGNED,
00887 ED_UNASSIGNED,
00888 ED_UNASSIGNED,
00889 ED_UNASSIGNED,
00890 ED_UNASSIGNED,
00891 ED_UNASSIGNED,
00892 ED_UNASSIGNED
00893 };
00894
00895
00896
00897
00898 el_protected int
00899 map_init(EditLine_t* el) {
00900
00901
00902
00903 #ifdef MAP_DEBUG
00904
00905 if (sizeof(el_map_emacs) != N_KEYS * sizeof(ElAction_t)) {
00906 EL_ABORT((el->errfile, "Emacs map incorrect\n"));
00907 }
00908
00909 if (sizeof(el_map_vi_command) != N_KEYS * sizeof(ElAction_t)) {
00910 EL_ABORT((el->errfile, "Vi command map incorrect\n"));
00911 }
00912
00913 if (sizeof(el_map_vi_insert) != N_KEYS * sizeof(ElAction_t)) {
00914 EL_ABORT((el->errfile, "Vi insert map incorrect\n"));
00915 }
00916 #endif
00917
00918 el->fMap.fAlt = (ElAction_t*) el_malloc(sizeof(ElAction_t) * N_KEYS);
00919
00920 if (el->fMap.fAlt == NULL) {
00921 return -1;
00922 }
00923 el->fMap.fKey = (ElAction_t*) el_malloc(sizeof(ElAction_t) * N_KEYS);
00924
00925 if (el->fMap.fKey == NULL) {
00926 return -1;
00927 }
00928 el->fMap.fEmacs = el_map_emacs;
00929 el->fMap.fVic = el_map_vi_command;
00930 el->fMap.fVii = el_map_vi_insert;
00931 el->fMap.fHelp = (ElBindings_t*) el_malloc(sizeof(ElBindings_t) *
00932 EL_NUM_FCNS);
00933
00934 if (el->fMap.fHelp == NULL) {
00935 return -1;
00936 }
00937 (void) memcpy(el->fMap.fHelp, help__get(),
00938 sizeof(ElBindings_t) * EL_NUM_FCNS);
00939 el->fMap.fFunc = (ElFunc_t*) el_malloc(sizeof(ElFunc_t) *
00940 EL_NUM_FCNS);
00941
00942 if (el->fMap.fFunc == NULL) {
00943 return -1;
00944 }
00945 memcpy(el->fMap.fFunc, func__get(), sizeof(ElFunc_t) * EL_NUM_FCNS);
00946 el->fMap.fNFunc = EL_NUM_FCNS;
00947
00948 #ifdef VIDEFAULT
00949 map_init_vi(el);
00950 #else
00951 map_init_emacs(el);
00952 #endif
00953 return 0;
00954 }
00955
00956
00957
00958
00959
00960 el_protected void
00961 map_end(EditLine_t* el) {
00962 el_free((ptr_t) el->fMap.fAlt);
00963 el->fMap.fAlt = NULL;
00964 el_free((ptr_t) el->fMap.fKey);
00965 el->fMap.fKey = NULL;
00966 el->fMap.fEmacs = NULL;
00967 el->fMap.fVic = NULL;
00968 el->fMap.fVii = NULL;
00969 el_free((ptr_t) el->fMap.fHelp);
00970 el->fMap.fHelp = NULL;
00971 el_free((ptr_t) el->fMap.fFunc);
00972 el->fMap.fFunc = NULL;
00973 }
00974
00975
00976
00977
00978
00979 el_private void
00980 map_init_nls(EditLine_t* el) {
00981 int i;
00982
00983 ElAction_t* map = el->fMap.fKey;
00984
00985 for (i = 0200; i <= 0377; i++) {
00986 if (isprint(i)) {
00987 map[i] = ED_INSERT;
00988 }
00989 }
00990 }
00991
00992
00993
00994
00995
00996 el_private void
00997 map_init_meta(EditLine_t* el) {
00998 char buf[3];
00999 int i;
01000 ElAction_t* map = el->fMap.fKey;
01001 ElAction_t* alt = el->fMap.fAlt;
01002
01003 for (i = 0; i <= 0377 && map[i] != EM_META_NEXT; i++) {
01004 continue;
01005 }
01006
01007 if (i > 0377) {
01008 for (i = 0; i <= 0377 && alt[i] != EM_META_NEXT; i++) {
01009 continue;
01010 }
01011
01012 if (i > 0377) {
01013 i = 033;
01014
01015 if (el->fMap.fType == MAP_VI) {
01016 map = alt;
01017 }
01018 } else {
01019 map = alt;
01020 }
01021 }
01022 buf[0] = (char) i;
01023 buf[2] = 0;
01024
01025 for (i = 0200; i <= 0377; i++) {
01026 switch (map[i]) {
01027 case ED_INSERT:
01028 case ED_UNASSIGNED:
01029 case ED_SEQUENCE_LEAD_IN:
01030 break;
01031 default:
01032 buf[1] = i & 0177;
01033 key_add(el, buf, key_map_cmd(el, (int) map[i]), XK_CMD);
01034 break;
01035 }
01036 }
01037 map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN;
01038 }
01039
01040
01041
01042
01043
01044 el_protected void
01045 map_init_vi(EditLine_t* el) {
01046 int i;
01047 ElAction_t* key = el->fMap.fKey;
01048 ElAction_t* alt = el->fMap.fAlt;
01049 const ElAction_t* vii = el->fMap.fVii;
01050 const ElAction_t* vic = el->fMap.fVic;
01051
01052 el->fMap.fType = MAP_VI;
01053 el->fMap.fCurrent = el->fMap.fKey;
01054
01055 key_reset(el);
01056
01057 for (i = 0; i < N_KEYS; i++) {
01058 key[i] = vii[i];
01059 alt[i] = vic[i];
01060 }
01061
01062 map_init_meta(el);
01063 map_init_nls(el);
01064
01065 tty_bind_char(el, 1);
01066 term_bind_arrow(el);
01067 }
01068
01069
01070
01071
01072
01073 el_protected void
01074 map_init_emacs(EditLine_t* el) {
01075 int i;
01076 char buf[3];
01077 ElAction_t* key = el->fMap.fKey;
01078 ElAction_t* alt = el->fMap.fAlt;
01079 const ElAction_t* emacs = el->fMap.fEmacs;
01080
01081 el->fMap.fType = MAP_EMACS;
01082 el->fMap.fCurrent = el->fMap.fKey;
01083 key_reset(el);
01084
01085 for (i = 0; i < N_KEYS; i++) {
01086 key[i] = emacs[i];
01087 alt[i] = ED_UNASSIGNED;
01088 }
01089
01090 map_init_meta(el);
01091 map_init_nls(el);
01092
01093 buf[0] = CONTROL('X');
01094 buf[1] = CONTROL('X');
01095 buf[2] = 0;
01096 key_add(el, buf, key_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);
01097
01098 tty_bind_char(el, 1);
01099 term_bind_arrow(el);
01100 }
01101
01102
01103
01104
01105
01106 el_protected int
01107 map_set_editor(EditLine_t* el, char* editor) {
01108 if (strcmp(editor, "emacs") == 0) {
01109 map_init_emacs(el);
01110 return 0;
01111 }
01112
01113 if (strcmp(editor, "vi") == 0) {
01114 map_init_vi(el);
01115 return 0;
01116 }
01117 return -1;
01118 }
01119
01120
01121
01122
01123
01124 el_protected int
01125 map_get_editor(EditLine_t* el, const char** editor) {
01126 if (editor == NULL) {
01127 return -1;
01128 }
01129
01130 switch (el->fMap.fType) {
01131 case MAP_EMACS:
01132 *editor = "emacs";
01133 return 0;
01134 case MAP_VI:
01135 *editor = "vi";
01136 return 0;
01137 }
01138 return -1;
01139 }
01140
01141
01142
01143
01144
01145 el_private void
01146 map_print_key(EditLine_t* el, ElAction_t* map, char* in) {
01147 char outbuf[EL_BUFSIZ];
01148 ElBindings_t* bp;
01149
01150 if (in[0] == '\0' || in[1] == '\0') {
01151 (void) key__decode_str(in, outbuf, "");
01152
01153 for (bp = el->fMap.fHelp; bp->fName != NULL; bp++) {
01154 if (bp->fFunc == map[(unsigned char) *in]) {
01155 (void) fprintf(el->fOutFile,
01156 "%s\t->\t%s\n", outbuf, bp->fName);
01157 return;
01158 }
01159 }
01160 } else {
01161 key_print(el, in);
01162 }
01163 }
01164
01165
01166
01167
01168
01169 el_private void
01170 map_print_some_keys(EditLine_t* el, ElAction_t* map, int first, int last) {
01171 ElBindings_t* bp;
01172 char firstbuf[2], lastbuf[2];
01173 char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ];
01174
01175 firstbuf[0] = first;
01176 firstbuf[1] = 0;
01177 lastbuf[0] = last;
01178 lastbuf[1] = 0;
01179
01180 if (map[first] == ED_UNASSIGNED) {
01181 if (first == last) {
01182 (void) fprintf(el->fOutFile,
01183 "%-15s-> is undefined\n",
01184 key__decode_str(firstbuf, unparsbuf, STRQQ));
01185 }
01186 return;
01187 }
01188
01189 for (bp = el->fMap.fHelp; bp->fName != NULL; bp++) {
01190 if (bp->fFunc == map[first]) {
01191 if (first == last) {
01192 (void) fprintf(el->fOutFile, "%-15s-> %s\n",
01193 key__decode_str(firstbuf, unparsbuf, STRQQ),
01194 bp->fName);
01195 } else {
01196 (void) fprintf(el->fOutFile,
01197 "%-4s to %-7s-> %s\n",
01198 key__decode_str(firstbuf, unparsbuf, STRQQ),
01199 key__decode_str(lastbuf, extrabuf, STRQQ),
01200 bp->fName);
01201 }
01202 return;
01203 }
01204 }
01205 #ifdef MAP_DEBUG
01206
01207 if (map == el->fMap.fKey) {
01208 (void) fprintf(el->fOutFile,
01209 "BUG!!! %s isn't bound to anything.\n",
01210 key__decode_str(firstbuf, unparsbuf, STRQQ));
01211 (void) fprintf(el->fOutFile, "el->fMap.fKey[%d] == %d\n",
01212 first, el->fMap.fKey[first]);
01213 } else {
01214 (void) fprintf(el->fOutFile,
01215 "BUG!!! %s isn't bound to anything.\n",
01216 key__decode_str(firstbuf, unparsbuf, STRQQ));
01217 (void) fprintf(el->fOutFile, "el->fMap.fAlt[%d] == %d\n",
01218 first, el->fMap.fAlt[first]);
01219 }
01220 #endif
01221 EL_ABORT((el->fErrFile, "Error printing keys\n"));
01222 }
01223
01224
01225
01226
01227
01228 el_private void
01229 map_print_all_keys(EditLine_t* el) {
01230 int prev, i;
01231
01232 (void) fprintf(el->fOutFile, "Standard key bindings\n");
01233 prev = 0;
01234
01235 for (i = 0; i < N_KEYS; i++) {
01236 if (el->fMap.fKey[prev] == el->fMap.fKey[i]) {
01237 continue;
01238 }
01239 map_print_some_keys(el, el->fMap.fKey, prev, i - 1);
01240 prev = i;
01241 }
01242 map_print_some_keys(el, el->fMap.fKey, prev, i - 1);
01243
01244 (void) fprintf(el->fOutFile, "Alternative key bindings\n");
01245 prev = 0;
01246
01247 for (i = 0; i < N_KEYS; i++) {
01248 if (el->fMap.fAlt[prev] == el->fMap.fAlt[i]) {
01249 continue;
01250 }
01251 map_print_some_keys(el, el->fMap.fAlt, prev, i - 1);
01252 prev = i;
01253 }
01254 map_print_some_keys(el, el->fMap.fAlt, prev, i - 1);
01255
01256 (void) fprintf(el->fOutFile, "Multi-character bindings\n");
01257 key_print(el, "");
01258 (void) fprintf(el->fOutFile, "Arrow key bindings\n");
01259 term_print_arrow(el, "");
01260 }
01261
01262
01263
01264
01265
01266 el_protected int
01267 map_bind(EditLine_t* el, int argc, const char** argv) {
01268 ElAction_t* map;
01269 int ntype, rem;
01270 const char* p;
01271 char inbuf[EL_BUFSIZ];
01272 char outbuf[EL_BUFSIZ];
01273 char* in = NULL;
01274 char* out = NULL;
01275 ElBindings_t* bp;
01276 int cmd;
01277 int key;
01278
01279 if (argv == NULL) {
01280 return -1;
01281 }
01282
01283 map = el->fMap.fKey;
01284 ntype = XK_CMD;
01285 key = rem = 0;
01286
01287 for (argc = 1; (p = argv[argc]) != NULL; argc++) {
01288 if (p[0] == '-') {
01289 switch (p[1]) {
01290 case 'a':
01291 map = el->fMap.fAlt;
01292 break;
01293
01294 case 's':
01295 ntype = XK_STR;
01296 break;
01297 #ifdef notyet
01298 case 'c':
01299 ntype = XK_EXE;
01300 break;
01301 #endif
01302 case 'k':
01303 key = 1;
01304 break;
01305
01306 case 'r':
01307 rem = 1;
01308 break;
01309
01310 case 'v':
01311 map_init_vi(el);
01312 return 0;
01313
01314 case 'e':
01315 map_init_emacs(el);
01316 return 0;
01317
01318 case 'l':
01319
01320 for (bp = el->fMap.fHelp; bp->fName != NULL;
01321 bp++) {
01322 (void) fprintf(el->fOutFile,
01323 "%s\n\t%s\n",
01324 bp->fName, bp->fDescription);
01325 }
01326 return 0;
01327 default:
01328 (void) fprintf(el->fErrFile,
01329 "%s: Invalid switch `%c'.\n",
01330 argv[0], p[1]);
01331 }
01332 } else {
01333 break;
01334 }
01335 }
01336
01337 if (argv[argc] == NULL) {
01338 map_print_all_keys(el);
01339 fprintf(el->fOutFile,
01340 "\nThe complete docs for bind are explained in man (5) editrc, which comes with libeditline.\n"
01341 );
01342 fprintf(el->fOutFile,
01343 "An overview of the options:\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n\n",
01344 "-e\tBind standard emacs keys.",
01345 "-v\tBind standard vi keys.",
01346 "-a\tShow or change key bindings in the vi command-mode keymap.",
01347 "-k\t'key' is interpretted as a symbolic arrow key name.",
01348 "-l\tList all editor commands and short descriptions.",
01349 "-r\tRemove a binding.",
01350 "-s\t'command' is taken as a literal string or another command's name (which is then recursively processed)."
01351 );
01352 return 0;
01353 }
01354
01355 if (key) {
01356
01357
01358
01359
01360 in = (char*) argv[argc++];
01361 } else if ((in = parse__string(inbuf, argv[argc++])) == NULL) {
01362 (void) fprintf(el->fErrFile,
01363 "%s: Invalid \\ or ^ in instring.\n",
01364 argv[0]);
01365 return -1;
01366 }
01367
01368 if (rem) {
01369 if (key) {
01370 (void) term_clear_arrow(el, in);
01371 return -1;
01372 }
01373
01374 if (in[1]) {
01375 (void) key_delete(el, in);
01376 } else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN) {
01377 (void) key_delete(el, in);
01378 } else {
01379 map[(unsigned char) *in] = ED_UNASSIGNED;
01380 }
01381 return 0;
01382 }
01383
01384 if (argv[argc] == NULL) {
01385 if (key) {
01386 term_print_arrow(el, in);
01387 } else {
01388 map_print_key(el, map, in);
01389 }
01390 return 0;
01391 }
01392 #ifdef notyet
01393
01394 if (argv[argc + 1] != NULL) {
01395 bindkey_usage();
01396 return -1;
01397 }
01398 #endif
01399
01400 switch (ntype) {
01401 case XK_STR:
01402 case XK_EXE:
01403
01404 if ((out = parse__string(outbuf, argv[argc])) == NULL) {
01405 (void) fprintf(el->fErrFile,
01406 "%s: Invalid \\ or ^ in outstring.\n", argv[0]);
01407 return -1;
01408 }
01409
01410 if (key) {
01411 term_set_arrow(el, in, key_map_str(el, out), ntype);
01412 } else {
01413 key_add(el, in, key_map_str(el, out), ntype);
01414 }
01415 map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
01416 break;
01417
01418 case XK_CMD:
01419
01420 if ((cmd = parse_cmd(el, argv[argc])) == -1) {
01421 (void) fprintf(el->fErrFile,
01422 "%s: Invalid command `%s'.\n", argv[0], argv[argc]);
01423 return -1;
01424 }
01425
01426 if (key) {
01427 term_set_arrow(el, in, key_map_str(el, out), ntype);
01428 } else {
01429 if (in[1]) {
01430 key_add(el, in, key_map_cmd(el, cmd), ntype);
01431 map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
01432 } else {
01433 key_clear(el, map, in);
01434 map[(unsigned char) *in] = cmd;
01435 }
01436 }
01437 break;
01438
01439
01440 default:
01441 EL_ABORT((el->fErrFile, "Bad XK_ type\n", ntype));
01442 break;
01443 }
01444 return 0;
01445 }
01446
01447
01448
01449
01450
01451 el_protected int
01452 map_addfunc(EditLine_t* el, const char* name, const char* help, ElFunc_t func) {
01453 void* p;
01454 int nf = el->fMap.fNFunc + 2;
01455
01456 if (name == NULL || help == NULL || func == NULL) {
01457 return -1;
01458 }
01459
01460 if ((p = el_realloc(el->fMap.fFunc, nf * sizeof(ElFunc_t))) == NULL) {
01461 return -1;
01462 }
01463 el->fMap.fFunc = (ElFunc_t*) p;
01464
01465 if ((p = el_realloc(el->fMap.fHelp, nf * sizeof(ElBindings_t)))
01466 == NULL) {
01467 return -1;
01468 }
01469 el->fMap.fHelp = (ElBindings_t*) p;
01470
01471 nf = el->fMap.fNFunc;
01472 el->fMap.fFunc[nf] = func;
01473
01474 el->fMap.fHelp[nf].fName = name;
01475 el->fMap.fHelp[nf].fFunc = nf;
01476 el->fMap.fHelp[nf].fDescription = help;
01477 el->fMap.fHelp[++nf].fName = NULL;
01478 el->fMap.fNFunc++;
01479
01480 return 0;
01481 }