1 /* vi:set ts=8 sts=4 sw=4: 2 * 3 * VIM - Vi IMproved by Bram Moolenaar 4 * 5 * Do ":help uganda" in Vim to read copying and usage conditions. 6 * Do ":help credits" in Vim to see a list of people who contributed. 7 * See README.txt for an overview of the Vim source code. 8 */ 9 10 #include "vim.h" 11 12 #ifdef AMIGA 13 # include <time.h> /* for time() */ 14 #endif 15 16 /* 17 * Vim originated from Stevie version 3.6 (Fish disk 217) by GRWalter (Fred) 18 * It has been changed beyond recognition since then. 19 * 20 * Differences between version 6.x and 7.x can be found with ":help version7". 21 * Differences between version 5.x and 6.x can be found with ":help version6". 22 * Differences between version 4.x and 5.x can be found with ":help version5". 23 * Differences between version 3.0 and 4.x can be found with ":help version4". 24 * All the remarks about older versions have been removed, they are not very 25 * interesting. 26 */ 27 28 #include "version.h" 29 30 char *Version = VIM_VERSION_SHORT; 31 static char *mediumVersion = VIM_VERSION_MEDIUM; 32 33 #if defined(HAVE_DATE_TIME) || defined(PROTO) 34 # if (defined(VMS) && defined(VAXC)) || defined(PROTO) 35 char longVersion[sizeof(VIM_VERSION_LONG_DATE) + sizeof(__DATE__) 36 + sizeof(__TIME__) + 3]; 37 void 38 make_version() 39 { 40 /* 41 * Construct the long version string. Necessary because 42 * VAX C can't catenate strings in the preprocessor. 43 */ 44 strcpy(longVersion, VIM_VERSION_LONG_DATE); 45 strcat(longVersion, __DATE__); 46 strcat(longVersion, " "); 47 strcat(longVersion, __TIME__); 48 strcat(longVersion, ")"); 49 } 50 # else 51 char *longVersion = VIM_VERSION_LONG_DATE __DATE__ " " __TIME__ ")"; 52 # endif 53 #else 54 char *longVersion = VIM_VERSION_LONG; 55 #endif 56 57 static void version_msg __ARGS((char *s)); 58 59 static char *(features[]) = 60 { 61 #ifdef AMIGA /* only for Amiga systems */ 62 # ifdef FEAT_ARP 63 "+ARP", 64 # else 65 "-ARP", 66 # endif 67 #endif 68 #ifdef FEAT_ARABIC 69 "+arabic", 70 #else 71 "-arabic", 72 #endif 73 #ifdef FEAT_AUTOCMD 74 "+autocmd", 75 #else 76 "-autocmd", 77 #endif 78 #ifdef FEAT_BEVAL 79 "+balloon_eval", 80 #else 81 "-balloon_eval", 82 #endif 83 #ifdef FEAT_BROWSE 84 "+browse", 85 #else 86 "-browse", 87 #endif 88 #ifdef NO_BUILTIN_TCAPS 89 "-builtin_terms", 90 #endif 91 #ifdef SOME_BUILTIN_TCAPS 92 "+builtin_terms", 93 #endif 94 #ifdef ALL_BUILTIN_TCAPS 95 "++builtin_terms", 96 #endif 97 #ifdef FEAT_BYTEOFF 98 "+byte_offset", 99 #else 100 "-byte_offset", 101 #endif 102 #ifdef FEAT_CINDENT 103 "+cindent", 104 #else 105 "-cindent", 106 #endif 107 #ifdef FEAT_CLIENTSERVER 108 "+clientserver", 109 #else 110 "-clientserver", 111 #endif 112 #ifdef FEAT_CLIPBOARD 113 "+clipboard", 114 #else 115 "-clipboard", 116 #endif 117 #ifdef FEAT_CMDL_COMPL 118 "+cmdline_compl", 119 #else 120 "-cmdline_compl", 121 #endif 122 #ifdef FEAT_CMDHIST 123 "+cmdline_hist", 124 #else 125 "-cmdline_hist", 126 #endif 127 #ifdef FEAT_CMDL_INFO 128 "+cmdline_info", 129 #else 130 "-cmdline_info", 131 #endif 132 #ifdef FEAT_COMMENTS 133 "+comments", 134 #else 135 "-comments", 136 #endif 137 #ifdef FEAT_CRYPT 138 "+cryptv", 139 #else 140 "-cryptv", 141 #endif 142 #ifdef FEAT_CSCOPE 143 "+cscope", 144 #else 145 "-cscope", 146 #endif 147 #ifdef CURSOR_SHAPE 148 "+cursorshape", 149 #else 150 "-cursorshape", 151 #endif 152 #if defined(FEAT_CON_DIALOG) && defined(FEAT_GUI_DIALOG) 153 "+dialog_con_gui", 154 #else 155 # if defined(FEAT_CON_DIALOG) 156 "+dialog_con", 157 # else 158 # if defined(FEAT_GUI_DIALOG) 159 "+dialog_gui", 160 # else 161 "-dialog", 162 # endif 163 # endif 164 #endif 165 #ifdef FEAT_DIFF 166 "+diff", 167 #else 168 "-diff", 169 #endif 170 #ifdef FEAT_DIGRAPHS 171 "+digraphs", 172 #else 173 "-digraphs", 174 #endif 175 #ifdef FEAT_DND 176 "+dnd", 177 #else 178 "-dnd", 179 #endif 180 #ifdef EBCDIC 181 "+ebcdic", 182 #else 183 "-ebcdic", 184 #endif 185 #ifdef FEAT_EMACS_TAGS 186 "+emacs_tags", 187 #else 188 "-emacs_tags", 189 #endif 190 #ifdef FEAT_EVAL 191 "+eval", 192 #else 193 "-eval", 194 #endif 195 #ifdef FEAT_EX_EXTRA 196 "+ex_extra", 197 #else 198 "-ex_extra", 199 #endif 200 #ifdef FEAT_SEARCH_EXTRA 201 "+extra_search", 202 #else 203 "-extra_search", 204 #endif 205 #ifdef FEAT_FKMAP 206 "+farsi", 207 #else 208 "-farsi", 209 #endif 210 #ifdef FEAT_SEARCHPATH 211 "+file_in_path", 212 #else 213 "-file_in_path", 214 #endif 215 #ifdef FEAT_FIND_ID 216 "+find_in_path", 217 #else 218 "-find_in_path", 219 #endif 220 #ifdef FEAT_FOLDING 221 "+folding", 222 #else 223 "-folding", 224 #endif 225 #ifdef FEAT_FOOTER 226 "+footer", 227 #else 228 "-footer", 229 #endif 230 /* only interesting on Unix systems */ 231 #if !defined(USE_SYSTEM) && defined(UNIX) 232 "+fork()", 233 #endif 234 #ifdef FEAT_GETTEXT 235 # ifdef DYNAMIC_GETTEXT 236 "+gettext/dyn", 237 # else 238 "+gettext", 239 # endif 240 #else 241 "-gettext", 242 #endif 243 #ifdef FEAT_HANGULIN 244 "+hangul_input", 245 #else 246 "-hangul_input", 247 #endif 248 #if (defined(HAVE_ICONV_H) && defined(USE_ICONV)) || defined(DYNAMIC_ICONV) 249 # ifdef DYNAMIC_ICONV 250 "+iconv/dyn", 251 # else 252 "+iconv", 253 # endif 254 #else 255 "-iconv", 256 #endif 257 #ifdef FEAT_INS_EXPAND 258 "+insert_expand", 259 #else 260 "-insert_expand", 261 #endif 262 #ifdef FEAT_JUMPLIST 263 "+jumplist", 264 #else 265 "-jumplist", 266 #endif 267 #ifdef FEAT_KEYMAP 268 "+keymap", 269 #else 270 "-keymap", 271 #endif 272 #ifdef FEAT_LANGMAP 273 "+langmap", 274 #else 275 "-langmap", 276 #endif 277 #ifdef FEAT_LIBCALL 278 "+libcall", 279 #else 280 "-libcall", 281 #endif 282 #ifdef FEAT_LINEBREAK 283 "+linebreak", 284 #else 285 "-linebreak", 286 #endif 287 #ifdef FEAT_LISP 288 "+lispindent", 289 #else 290 "-lispindent", 291 #endif 292 #ifdef FEAT_LISTCMDS 293 "+listcmds", 294 #else 295 "-listcmds", 296 #endif 297 #ifdef FEAT_LOCALMAP 298 "+localmap", 299 #else 300 "-localmap", 301 #endif 302 #ifdef FEAT_MENU 303 "+menu", 304 #else 305 "-menu", 306 #endif 307 #ifdef FEAT_SESSION 308 "+mksession", 309 #else 310 "-mksession", 311 #endif 312 #ifdef FEAT_MODIFY_FNAME 313 "+modify_fname", 314 #else 315 "-modify_fname", 316 #endif 317 #ifdef FEAT_MOUSE 318 "+mouse", 319 # ifdef FEAT_MOUSESHAPE 320 "+mouseshape", 321 # else 322 "-mouseshape", 323 # endif 324 # else 325 "-mouse", 326 #endif 327 #if defined(UNIX) || defined(VMS) 328 # ifdef FEAT_MOUSE_DEC 329 "+mouse_dec", 330 # else 331 "-mouse_dec", 332 # endif 333 # ifdef FEAT_MOUSE_GPM 334 "+mouse_gpm", 335 # else 336 "-mouse_gpm", 337 # endif 338 # ifdef FEAT_MOUSE_JSB 339 "+mouse_jsbterm", 340 # else 341 "-mouse_jsbterm", 342 # endif 343 # ifdef FEAT_MOUSE_NET 344 "+mouse_netterm", 345 # else 346 "-mouse_netterm", 347 # endif 348 # ifdef FEAT_MOUSE_XTERM 349 "+mouse_xterm", 350 # else 351 "-mouse_xterm", 352 # endif 353 #endif 354 #ifdef __QNX__ 355 # ifdef FEAT_MOUSE_PTERM 356 "+mouse_pterm", 357 # else 358 "-mouse_pterm", 359 # endif 360 #endif 361 #ifdef FEAT_MBYTE_IME 362 # ifdef DYNAMIC_IME 363 "+multi_byte_ime/dyn", 364 # else 365 "+multi_byte_ime", 366 # endif 367 #else 368 # ifdef FEAT_MBYTE 369 "+multi_byte", 370 # else 371 "-multi_byte", 372 # endif 373 #endif 374 #ifdef FEAT_MULTI_LANG 375 "+multi_lang", 376 #else 377 "-multi_lang", 378 #endif 379 #ifdef FEAT_MZSCHEME 380 # ifdef DYNAMIC_MZSCHEME 381 "+mzscheme/dyn", 382 # else 383 "+mzscheme", 384 # endif 385 #else 386 "-mzscheme", 387 #endif 388 #ifdef FEAT_NETBEANS_INTG 389 "+netbeans_intg", 390 #else 391 "-netbeans_intg", 392 #endif 393 #ifdef FEAT_GUI_W32 394 # ifdef FEAT_OLE 395 "+ole", 396 # else 397 "-ole", 398 # endif 399 #endif 400 #ifdef FEAT_OSFILETYPE 401 "+osfiletype", 402 #else 403 "-osfiletype", 404 #endif 405 #ifdef FEAT_PATH_EXTRA 406 "+path_extra", 407 #else 408 "-path_extra", 409 #endif 410 #ifdef FEAT_PERL 411 # ifdef DYNAMIC_PERL 412 "+perl/dyn", 413 # else 414 "+perl", 415 # endif 416 #else 417 "-perl", 418 #endif 419 #ifdef FEAT_PRINTER 420 # ifdef FEAT_POSTSCRIPT 421 "+postscript", 422 # else 423 "-postscript", 424 # endif 425 "+printer", 426 #else 427 "-printer", 428 #endif 429 #ifdef FEAT_PROFILE 430 "+profile", 431 #else 432 "-profile", 433 #endif 434 #ifdef FEAT_PYTHON 435 # ifdef DYNAMIC_PYTHON 436 "+python/dyn", 437 # else 438 "+python", 439 # endif 440 #else 441 "-python", 442 #endif 443 #ifdef FEAT_QUICKFIX 444 "+quickfix", 445 #else 446 "-quickfix", 447 #endif 448 #ifdef FEAT_RIGHTLEFT 449 "+rightleft", 450 #else 451 "-rightleft", 452 #endif 453 #ifdef FEAT_RUBY 454 # ifdef DYNAMIC_RUBY 455 "+ruby/dyn", 456 # else 457 "+ruby", 458 # endif 459 #else 460 "-ruby", 461 #endif 462 #ifdef FEAT_SCROLLBIND 463 "+scrollbind", 464 #else 465 "-scrollbind", 466 #endif 467 #ifdef FEAT_SIGNS 468 "+signs", 469 #else 470 "-signs", 471 #endif 472 #ifdef FEAT_SMARTINDENT 473 "+smartindent", 474 #else 475 "-smartindent", 476 #endif 477 #ifdef FEAT_SNIFF 478 "+sniff", 479 #else 480 "-sniff", 481 #endif 482 #ifdef FEAT_STL_OPT 483 "+statusline", 484 #else 485 "-statusline", 486 #endif 487 #ifdef FEAT_SUN_WORKSHOP 488 "+sun_workshop", 489 #else 490 "-sun_workshop", 491 #endif 492 #ifdef FEAT_SYN_HL 493 "+syntax", 494 #else 495 "-syntax", 496 #endif 497 /* only interesting on Unix systems */ 498 #if defined(USE_SYSTEM) && (defined(UNIX) || defined(__EMX__)) 499 "+system()", 500 #endif 501 #ifdef FEAT_TAG_BINS 502 "+tag_binary", 503 #else 504 "-tag_binary", 505 #endif 506 #ifdef FEAT_TAG_OLDSTATIC 507 "+tag_old_static", 508 #else 509 "-tag_old_static", 510 #endif 511 #ifdef FEAT_TAG_ANYWHITE 512 "+tag_any_white", 513 #else 514 "-tag_any_white", 515 #endif 516 #ifdef FEAT_TCL 517 # ifdef DYNAMIC_TCL 518 "+tcl/dyn", 519 # else 520 "+tcl", 521 # endif 522 #else 523 "-tcl", 524 #endif 525 #if defined(UNIX) || defined(__EMX__) 526 /* only Unix (or OS/2 with EMX!) can have terminfo instead of termcap */ 527 # ifdef TERMINFO 528 "+terminfo", 529 # else 530 "-terminfo", 531 # endif 532 #else /* unix always includes termcap support */ 533 # ifdef HAVE_TGETENT 534 "+tgetent", 535 # else 536 "-tgetent", 537 # endif 538 #endif 539 #ifdef FEAT_TERMRESPONSE 540 "+termresponse", 541 #else 542 "-termresponse", 543 #endif 544 #ifdef FEAT_TEXTOBJ 545 "+textobjects", 546 #else 547 "-textobjects", 548 #endif 549 #ifdef FEAT_TITLE 550 "+title", 551 #else 552 "-title", 553 #endif 554 #ifdef FEAT_TOOLBAR 555 "+toolbar", 556 #else 557 "-toolbar", 558 #endif 559 #ifdef FEAT_USR_CMDS 560 "+user_commands", 561 #else 562 "-user_commands", 563 #endif 564 #ifdef FEAT_VERTSPLIT 565 "+vertsplit", 566 #else 567 "-vertsplit", 568 #endif 569 #ifdef FEAT_VIRTUALEDIT 570 "+virtualedit", 571 #else 572 "-virtualedit", 573 #endif 574 #ifdef FEAT_VISUAL 575 "+visual", 576 # ifdef FEAT_VISUALEXTRA 577 "+visualextra", 578 # else 579 "-visualextra", 580 # endif 581 #else 582 "-visual", 583 #endif 584 #ifdef FEAT_VIMINFO 585 "+viminfo", 586 #else 587 "-viminfo", 588 #endif 589 #ifdef FEAT_VREPLACE 590 "+vreplace", 591 #else 592 "-vreplace", 593 #endif 594 #ifdef FEAT_WILDIGN 595 "+wildignore", 596 #else 597 "-wildignore", 598 #endif 599 #ifdef FEAT_WILDMENU 600 "+wildmenu", 601 #else 602 "-wildmenu", 603 #endif 604 #ifdef FEAT_WINDOWS 605 "+windows", 606 #else 607 "-windows", 608 #endif 609 #ifdef FEAT_WRITEBACKUP 610 "+writebackup", 611 #else 612 "-writebackup", 613 #endif 614 #if defined(UNIX) || defined(VMS) 615 # ifdef FEAT_X11 616 "+X11", 617 # else 618 "-X11", 619 # endif 620 #endif 621 #ifdef FEAT_XFONTSET 622 "+xfontset", 623 #else 624 "-xfontset", 625 #endif 626 #ifdef FEAT_XIM 627 "+xim", 628 #else 629 "-xim", 630 #endif 631 #if defined(UNIX) || defined(VMS) 632 # ifdef USE_XSMP_INTERACT 633 "+xsmp_interact", 634 # else 635 # ifdef USE_XSMP 636 "+xsmp", 637 # else 638 "-xsmp", 639 # endif 640 # endif 641 # ifdef FEAT_XCLIPBOARD 642 "+xterm_clipboard", 643 # else 644 "-xterm_clipboard", 645 # endif 646 #endif 647 #ifdef FEAT_XTERM_SAVE 648 "+xterm_save", 649 #else 650 "-xterm_save", 651 #endif 652 #ifdef WIN3264 653 # ifdef FEAT_XPM_W32 654 "+xpm_w32", 655 # else 656 "-xpm_w32", 657 # endif 658 #endif 659 NULL 660 }; 661 662 static int included_patches[] = 663 { /* Add new patch number below this line */ 664 /**/ 665 0 666 }; 667 668 int 669 highest_patch() 670 { 671 int i; 672 int h = 0; 673 674 for (i = 0; included_patches[i] != 0; ++i) 675 if (included_patches[i] > h) 676 h = included_patches[i]; 677 return h; 678 } 679 680 #if defined(FEAT_EVAL) || defined(PROTO) 681 /* 682 * Return TRUE if patch "n" has been included. 683 */ 684 int 685 has_patch(n) 686 int n; 687 { 688 int i; 689 690 for (i = 0; included_patches[i] != 0; ++i) 691 if (included_patches[i] == n) 692 return TRUE; 693 return FALSE; 694 } 695 #endif 696 697 void 698 ex_version(eap) 699 exarg_T *eap; 700 { 701 /* 702 * Ignore a ":version 9.99" command. 703 */ 704 if (*eap->arg == NUL) 705 { 706 msg_putchar('\n'); 707 list_version(); 708 } 709 } 710 711 void 712 list_version() 713 { 714 int i; 715 int first; 716 char *s = ""; 717 718 /* 719 * When adding features here, don't forget to update the list of 720 * internal variables in eval.c! 721 */ 722 MSG(longVersion); 723 #ifdef WIN3264 724 # ifdef FEAT_GUI_W32 725 # if defined(_MSC_VER) && (_MSC_VER <= 1010) 726 /* Only MS VC 4.1 and earlier can do Win32s */ 727 MSG_PUTS(_("\nMS-Windows 16/32 bit GUI version")); 728 # else 729 MSG_PUTS(_("\nMS-Windows 32 bit GUI version")); 730 # endif 731 if (gui_is_win32s()) 732 MSG_PUTS(_(" in Win32s mode")); 733 # ifdef FEAT_OLE 734 MSG_PUTS(_(" with OLE support")); 735 # endif 736 # else 737 MSG_PUTS(_("\nMS-Windows 32 bit console version")); 738 # endif 739 #endif 740 #ifdef WIN16 741 MSG_PUTS(_("\nMS-Windows 16 bit version")); 742 #endif 743 #ifdef MSDOS 744 # ifdef DJGPP 745 MSG_PUTS(_("\n32 bit MS-DOS version")); 746 # else 747 MSG_PUTS(_("\n16 bit MS-DOS version")); 748 # endif 749 #endif 750 #ifdef MACOS 751 # ifdef MACOS_X 752 # ifdef MACOS_X_UNIX 753 MSG_PUTS(_("\nMacOS X (unix) version")); 754 # else 755 MSG_PUTS(_("\nMacOS X version")); 756 # endif 757 #else 758 MSG_PUTS(_("\nMacOS version")); 759 # endif 760 #endif 761 762 #ifdef RISCOS 763 MSG_PUTS(_("\nRISC OS version")); 764 #endif 765 #ifdef VMS 766 MSG_PUTS("\nOpenVMS version"); 767 #endif 768 769 /* Print the list of patch numbers if there is at least one. */ 770 /* Print a range when patches are consecutive: "1-10, 12, 15-40, 42-45" */ 771 if (included_patches[0] != 0) 772 { 773 MSG_PUTS(_("\nIncluded patches: ")); 774 first = -1; 775 /* find last one */ 776 for (i = 0; included_patches[i] != 0; ++i) 777 ; 778 while (--i >= 0) 779 { 780 if (first < 0) 781 first = included_patches[i]; 782 if (i == 0 || included_patches[i - 1] != included_patches[i] + 1) 783 { 784 MSG_PUTS(s); 785 s = ", "; 786 msg_outnum((long)first); 787 if (first != included_patches[i]) 788 { 789 MSG_PUTS("-"); 790 msg_outnum((long)included_patches[i]); 791 } 792 first = -1; 793 } 794 } 795 } 796 797 #ifdef MODIFIED_BY 798 MSG_PUTS("\n"); 799 MSG_PUTS(_("Modified by ")); 800 MSG_PUTS(MODIFIED_BY); 801 #endif 802 803 #ifdef HAVE_PATHDEF 804 if (*compiled_user != NUL || *compiled_sys != NUL) 805 { 806 MSG_PUTS(_("\nCompiled ")); 807 if (*compiled_user != NUL) 808 { 809 MSG_PUTS(_("by ")); 810 MSG_PUTS(compiled_user); 811 } 812 if (*compiled_sys != NUL) 813 { 814 MSG_PUTS("@"); 815 MSG_PUTS(compiled_sys); 816 } 817 } 818 #endif 819 820 #ifdef FEAT_HUGE 821 MSG_PUTS(_("\nHuge version ")); 822 #else 823 # ifdef FEAT_BIG 824 MSG_PUTS(_("\nBig version ")); 825 # else 826 # ifdef FEAT_NORMAL 827 MSG_PUTS(_("\nNormal version ")); 828 # else 829 # ifdef FEAT_SMALL 830 MSG_PUTS(_("\nSmall version ")); 831 # else 832 MSG_PUTS(_("\nTiny version ")); 833 # endif 834 # endif 835 # endif 836 #endif 837 #ifndef FEAT_GUI 838 MSG_PUTS(_("without GUI.")); 839 #else 840 # ifdef FEAT_GUI_GTK 841 # ifdef FEAT_GUI_GNOME 842 # ifdef HAVE_GTK2 843 MSG_PUTS(_("with GTK2-GNOME GUI.")); 844 # else 845 MSG_PUTS(_("with GTK-GNOME GUI.")); 846 # endif 847 # else 848 # ifdef HAVE_GTK2 849 MSG_PUTS(_("with GTK2 GUI.")); 850 # else 851 MSG_PUTS(_("with GTK GUI.")); 852 # endif 853 # endif 854 # else 855 # ifdef FEAT_GUI_MOTIF 856 MSG_PUTS(_("with X11-Motif GUI.")); 857 # else 858 # ifdef FEAT_GUI_ATHENA 859 # ifdef FEAT_GUI_NEXTAW 860 MSG_PUTS(_("with X11-neXtaw GUI.")); 861 # else 862 MSG_PUTS(_("with X11-Athena GUI.")); 863 # endif 864 # else 865 # ifdef FEAT_GUI_PHOTON 866 MSG_PUTS(_("with Photon GUI.")); 867 # else 868 # if defined(MSWIN) 869 MSG_PUTS(_("with GUI.")); 870 # else 871 # if defined (TARGET_API_MAC_CARBON) && TARGET_API_MAC_CARBON 872 MSG_PUTS(_("with Carbon GUI.")); 873 # else 874 # if defined (TARGET_API_MAC_OSX) && TARGET_API_MAC_OSX 875 MSG_PUTS(_("with Cocoa GUI.")); 876 # else 877 # if defined (MACOS) 878 MSG_PUTS(_("with (classic) GUI.")); 879 # endif 880 # endif 881 # endif 882 # endif 883 # endif 884 # endif 885 # endif 886 # endif 887 #endif 888 version_msg(_(" Features included (+) or not (-):\n")); 889 890 /* print all the features */ 891 for (i = 0; features[i] != NULL; ++i) 892 { 893 version_msg(features[i]); 894 if (msg_col > 0) 895 version_msg(" "); 896 } 897 898 version_msg("\n"); 899 #ifdef SYS_VIMRC_FILE 900 version_msg(_(" system vimrc file: \"")); 901 version_msg(SYS_VIMRC_FILE); 902 version_msg("\"\n"); 903 #endif 904 #ifdef USR_VIMRC_FILE 905 version_msg(_(" user vimrc file: \"")); 906 version_msg(USR_VIMRC_FILE); 907 version_msg("\"\n"); 908 #endif 909 #ifdef USR_VIMRC_FILE2 910 version_msg(_(" 2nd user vimrc file: \"")); 911 version_msg(USR_VIMRC_FILE2); 912 version_msg("\"\n"); 913 #endif 914 #ifdef USR_VIMRC_FILE3 915 version_msg(_(" 3rd user vimrc file: \"")); 916 version_msg(USR_VIMRC_FILE3); 917 version_msg("\"\n"); 918 #endif 919 #ifdef USR_EXRC_FILE 920 version_msg(_(" user exrc file: \"")); 921 version_msg(USR_EXRC_FILE); 922 version_msg("\"\n"); 923 #endif 924 #ifdef USR_EXRC_FILE2 925 version_msg(_(" 2nd user exrc file: \"")); 926 version_msg(USR_EXRC_FILE2); 927 version_msg("\"\n"); 928 #endif 929 #ifdef FEAT_GUI 930 # ifdef SYS_GVIMRC_FILE 931 version_msg(_(" system gvimrc file: \"")); 932 version_msg(SYS_GVIMRC_FILE); 933 version_msg("\"\n"); 934 # endif 935 version_msg(_(" user gvimrc file: \"")); 936 version_msg(USR_GVIMRC_FILE); 937 version_msg("\"\n"); 938 # ifdef USR_GVIMRC_FILE2 939 version_msg(_("2nd user gvimrc file: \"")); 940 version_msg(USR_GVIMRC_FILE2); 941 version_msg("\"\n"); 942 # endif 943 # ifdef USR_GVIMRC_FILE3 944 version_msg(_("3rd user gvimrc file: \"")); 945 version_msg(USR_GVIMRC_FILE3); 946 version_msg("\"\n"); 947 # endif 948 #endif 949 #ifdef FEAT_GUI 950 # ifdef SYS_MENU_FILE 951 version_msg(_(" system menu file: \"")); 952 version_msg(SYS_MENU_FILE); 953 version_msg("\"\n"); 954 # endif 955 #endif 956 #ifdef HAVE_PATHDEF 957 if (*default_vim_dir != NUL) 958 { 959 version_msg(_(" fall-back for $VIM: \"")); 960 version_msg((char *)default_vim_dir); 961 version_msg("\"\n"); 962 } 963 if (*default_vimruntime_dir != NUL) 964 { 965 version_msg(_(" f-b for $VIMRUNTIME: \"")); 966 version_msg((char *)default_vimruntime_dir); 967 version_msg("\"\n"); 968 } 969 version_msg(_("Compilation: ")); 970 version_msg((char *)all_cflags); 971 version_msg("\n"); 972 #ifdef VMS 973 if (*compiler_version != NUL) 974 { 975 version_msg(_("Compiler: ")); 976 version_msg((char *)compiler_version); 977 version_msg("\n"); 978 } 979 #endif 980 version_msg(_("Linking: ")); 981 version_msg((char *)all_lflags); 982 #endif 983 #ifdef DEBUG 984 version_msg("\n"); 985 version_msg(_(" DEBUG BUILD")); 986 #endif 987 } 988 989 /* 990 * Output a string for the version message. If it's going to wrap, output a 991 * newline, unless the message is too long to fit on the screen anyway. 992 */ 993 static void 994 version_msg(s) 995 char *s; 996 { 997 int len = (int)STRLEN(s); 998 999 if (!got_int && len < (int)Columns && msg_col + len >= (int)Columns 1000 && *s != '\n') 1001 msg_putchar('\n'); 1002 if (!got_int) 1003 MSG_PUTS(s); 1004 } 1005 1006 static void do_intro_line __ARGS((int row, char_u *mesg, int add_version, int attr)); 1007 1008 /* 1009 * Give an introductory message about Vim. 1010 * Only used when starting Vim on an empty file, without a file name. 1011 * Or with the ":intro" command (for Sven :-). 1012 */ 1013 void 1014 intro_message(colon) 1015 int colon; /* TRUE for ":intro" */ 1016 { 1017 int i; 1018 int row; 1019 int blanklines; 1020 int sponsor; 1021 char *p; 1022 static char *(lines[]) = 1023 { 1024 N_("VIM - Vi IMproved"), 1025 "", 1026 N_("version "), 1027 N_("by Bram Moolenaar et al."), 1028 #ifdef MODIFIED_BY 1029 " ", 1030 #endif 1031 N_("Vim is open source and freely distributable"), 1032 "", 1033 N_("Help poor children in Uganda!"), 1034 N_("type :help iccf<Enter> for information "), 1035 "", 1036 N_("type :q<Enter> to exit "), 1037 N_("type :help<Enter> or <F1> for on-line help"), 1038 N_("type :help version7<Enter> for version info"), 1039 NULL, 1040 "", 1041 N_("Running in Vi compatible mode"), 1042 N_("type :set nocp<Enter> for Vim defaults"), 1043 N_("type :help cp-default<Enter> for info on this"), 1044 }; 1045 #ifdef FEAT_GUI 1046 static char *(gui_lines[]) = 1047 { 1048 NULL, 1049 NULL, 1050 NULL, 1051 NULL, 1052 #ifdef MODIFIED_BY 1053 NULL, 1054 #endif 1055 NULL, 1056 NULL, 1057 NULL, 1058 N_("menu Help->Orphans for information "), 1059 NULL, 1060 N_("Running modeless, typed text is inserted"), 1061 N_("menu Edit->Global Settings->Toggle Insert Mode "), 1062 N_(" for two modes "), 1063 NULL, 1064 NULL, 1065 NULL, 1066 N_("menu Edit->Global Settings->Toggle Vi Compatible"), 1067 N_(" for Vim defaults "), 1068 }; 1069 #endif 1070 1071 /* blanklines = screen height - # message lines */ 1072 blanklines = (int)Rows - ((sizeof(lines) / sizeof(char *)) - 1); 1073 if (!p_cp) 1074 blanklines += 4; /* add 4 for not showing "Vi compatible" message */ 1075 #if defined(WIN3264) && !defined(FEAT_GUI_W32) 1076 if (mch_windows95()) 1077 blanklines -= 3; /* subtract 3 for showing "Windows 95" message */ 1078 #endif 1079 1080 #ifdef FEAT_WINDOWS 1081 /* Don't overwrite a statusline. Depends on 'cmdheight'. */ 1082 if (p_ls > 1) 1083 blanklines -= Rows - topframe->fr_height; 1084 #endif 1085 if (blanklines < 0) 1086 blanklines = 0; 1087 1088 /* Show the sponsor and register message one out of four times, the Uganda 1089 * message two out of four times. */ 1090 sponsor = (int)time(NULL); 1091 sponsor = ((sponsor & 2) == 0) - ((sponsor & 4) == 0); 1092 1093 /* start displaying the message lines after half of the blank lines */ 1094 row = blanklines / 2; 1095 if ((row >= 2 && Columns >= 50) || colon) 1096 { 1097 for (i = 0; i < (int)(sizeof(lines) / sizeof(char *)); ++i) 1098 { 1099 p = lines[i]; 1100 #ifdef FEAT_GUI 1101 if (p_im && gui.in_use && gui_lines[i] != NULL) 1102 p = gui_lines[i]; 1103 #endif 1104 if (p == NULL) 1105 { 1106 if (!p_cp) 1107 break; 1108 continue; 1109 } 1110 if (sponsor != 0) 1111 { 1112 if (strstr(p, "children") != NULL) 1113 p = sponsor < 0 1114 ? N_("Sponsor Vim development!") 1115 : N_("Become a registered Vim user!"); 1116 else if (strstr(p, "iccf") != NULL) 1117 p = sponsor < 0 1118 ? N_("type :help sponsor<Enter> for information ") 1119 : N_("type :help register<Enter> for information "); 1120 else if (strstr(p, "Orphans") != NULL) 1121 p = N_("menu Help->Sponsor/Register for information "); 1122 } 1123 if (*p != NUL) 1124 do_intro_line(row, (char_u *)_(p), i == 2, 0); 1125 ++row; 1126 } 1127 #if defined(WIN3264) && !defined(FEAT_GUI_W32) 1128 if (mch_windows95()) 1129 { 1130 do_intro_line(++row, 1131 (char_u *)_("WARNING: Windows 95/98/ME detected"), 1132 FALSE, hl_attr(HLF_E)); 1133 do_intro_line(++row, 1134 (char_u *)_("type :help windows95<Enter> for info on this"), 1135 FALSE, 0); 1136 } 1137 #endif 1138 } 1139 1140 /* Make the wait-return message appear just below the text. */ 1141 if (colon) 1142 msg_row = row; 1143 } 1144 1145 static void 1146 do_intro_line(row, mesg, add_version, attr) 1147 int row; 1148 char_u *mesg; 1149 int add_version; 1150 int attr; 1151 { 1152 char_u vers[20]; 1153 int col; 1154 char_u *p; 1155 int l; 1156 int clen; 1157 #ifdef MODIFIED_BY 1158 # define MODBY_LEN 150 1159 char_u modby[MODBY_LEN]; 1160 1161 if (*mesg == ' ') 1162 { 1163 vim_strncpy(modby, _("Modified by "), MODBY_LEN - 1); 1164 l = STRLEN(modby); 1165 vim_strncpy(modby + l, MODIFIED_BY, MODBY_LEN - l - 1); 1166 mesg = modby; 1167 } 1168 #endif 1169 1170 /* Center the message horizontally. */ 1171 col = vim_strsize(mesg); 1172 if (add_version) 1173 { 1174 STRCPY(vers, mediumVersion); 1175 if (highest_patch()) 1176 { 1177 /* Check for 9.9x or 9.9xx, alpha/beta version */ 1178 if (isalpha((int)mediumVersion[3])) 1179 { 1180 if (isalpha((int)mediumVersion[4])) 1181 sprintf((char *)vers + 5, ".%d%s", highest_patch(), 1182 mediumVersion + 5); 1183 else 1184 sprintf((char *)vers + 4, ".%d%s", highest_patch(), 1185 mediumVersion + 4); 1186 } 1187 else 1188 sprintf((char *)vers + 3, ".%d", highest_patch()); 1189 } 1190 col += (int)STRLEN(vers); 1191 } 1192 col = (Columns - col) / 2; 1193 if (col < 0) 1194 col = 0; 1195 1196 /* Split up in parts to highlight <> items differently. */ 1197 for (p = mesg; *p != NUL; p += l) 1198 { 1199 clen = 0; 1200 for (l = 0; p[l] != NUL 1201 && (l == 0 || (p[l] != '<' && p[l - 1] != '>')); ++l) 1202 { 1203 #ifdef FEAT_MBYTE 1204 if (has_mbyte) 1205 { 1206 clen += ptr2cells(p + l); 1207 l += (*mb_ptr2len)(p + l) - 1; 1208 } 1209 else 1210 #endif 1211 clen += byte2cells(p[l]); 1212 } 1213 screen_puts_len(p, l, row, col, *p == '<' ? hl_attr(HLF_8) : attr); 1214 col += clen; 1215 } 1216 1217 /* Add the version number to the version line. */ 1218 if (add_version) 1219 screen_puts(vers, row, col, 0); 1220 } 1221 1222 /* 1223 * ":intro": clear screen, display intro screen and wait for return. 1224 */ 1225 /*ARGSUSED*/ 1226 void 1227 ex_intro(eap) 1228 exarg_T *eap; 1229 { 1230 screenclear(); 1231 intro_message(TRUE); 1232 wait_return(TRUE); 1233 } 1234