home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / v / vim_src.zip / MAIN.C < prev    next >
C/C++ Source or Header  |  1993-01-12  |  8KB  |  357 lines

  1. /* vi:ts=4:sw=4
  2.  *
  3.  * VIM - Vi IMitation
  4.  *
  5.  * Code Contributions By:    Bram Moolenaar            mool@oce.nl
  6.  *                            Tim Thompson            twitch!tjt
  7.  *                            Tony Andrews            onecom!wldrdg!tony 
  8.  *                            G. R. (Fred) Walter        watmath!watcgl!grwalter 
  9.  */
  10.  
  11. #define EXTERN
  12. #include "vim.h"
  13. #include "globals.h"
  14. #include "proto.h"
  15. #include "param.h"
  16.  
  17. static void usage __PARMS((int));
  18.  
  19.     static void
  20. usage(n)
  21.     int n;
  22. {
  23.     register int i;
  24.     static char *(use[]) = {"[file ..]\n",
  25.                             "-t tag\n",
  26.                             "+[command] file ..\n",
  27.                             "-c {command} file ..\n",
  28.                             "-e\n"};
  29.     static char *(errors[]) =  {"Unknown option\n",            /* 0 */
  30.                                 "Too many arguments\n",        /* 1 */
  31.                                 "Argument missing\n",        /* 2 */
  32.                                 };
  33.  
  34.     fprintf(stderr, errors[n]);
  35.     fprintf(stderr, "usage:");
  36.     for (i = 0; ; ++i)
  37.     {
  38.         fprintf(stderr, " vim [options] ");
  39.         fprintf(stderr, use[i]);
  40.         if (i == (sizeof(use) / sizeof(char *)) - 1)
  41.             break;
  42.         fprintf(stderr, "   or:");
  43.     }
  44. #ifdef AMIGA
  45.     fprintf(stderr, "\noptions: -v -n -r -d device -s scriptin -w scriptout -T terminal\n");
  46. #else
  47.     fprintf(stderr, "\noptions: -v -n -r -s scriptin -w scriptout -T terminal\n");
  48. #endif
  49.     mch_windexit(1);
  50. }
  51.  
  52.     void
  53. main(argc, argv)
  54.     int                argc;
  55.     char          **argv;
  56. {
  57.     char           *initstr;        /* init string from the environment */
  58.     char           *term = NULL;    /* specified terminal name */
  59.     char           *fname = NULL;    /* file name from command line */
  60.     char           *command = NULL;    /* command from + option */
  61.     int             c;
  62.     int                doqf = 0;
  63.  
  64. #ifdef DEBUG
  65. # ifdef MSDOS
  66.     OPENDEBUG("#debug#");
  67. # else
  68.     OPENDEBUG("/tmp/debug/vim");
  69. # endif
  70. #endif
  71.  
  72. /*
  73.  * Check if we have an interactive window.
  74.  * If not, open one with a newcli command (needed for :! to work).
  75.  * check_win will also handle the -d argument (for the Amiga).
  76.  */
  77.     check_win(argc, argv);
  78.  
  79.     ++argv;
  80.     /*
  81.      * Process the command line arguments
  82.      *         '-s scriptin'
  83.      *        '-w scriptout'
  84.      *        '-v'
  85.      *        '-n'
  86.      *        '-r'
  87.      *        '-T terminal'
  88.      */
  89.     while (argc > 1 && argv[0][0] == '-' &&
  90.             strchr("swvnrTd", c = argv[0][1]) != NULL && c)
  91.     {
  92.         --argc;
  93.         switch (c)
  94.         {
  95.         case 'v':
  96.             readonlymode = TRUE;
  97.             p_ro = TRUE;
  98.             /*FALLTHROUGH*/
  99.  
  100.         case 'n':
  101.             p_uc = 0;
  102.             break;
  103.  
  104.         case 'r':
  105.             recoverymode = 1;
  106.             break;
  107.         
  108.         default:    /* options with argument */
  109.             ++argv;
  110.             --argc;
  111.             if (argc < 1)
  112.                 usage(2);
  113.  
  114.             switch (c)
  115.             {
  116.             case 's':
  117.                 if ((scriptin[0] = fopen(argv[0],
  118. #ifdef MSDOS
  119.                                                     "rb"
  120. #else
  121.                                                     "r"
  122. #endif
  123.                                                         )) == NULL)
  124.                 {
  125.                         fprintf(stderr, "cannot open %s for reading\n", argv[0]);
  126.                         mch_windexit(2);
  127.                 }
  128.                 break;
  129.             
  130.             case 'w':
  131.                 if ((scriptout = fopen(argv[0],
  132. #ifdef MSDOS
  133.                                                     "ab"
  134. #else
  135.                                                     "a"
  136. #endif
  137.                                                         )) == NULL)
  138.                 {
  139.                         fprintf(stderr, "cannot open %s for output\n", argv[0]);
  140.                         mch_windexit(2);
  141.                 }
  142.                 break;
  143.  
  144. /*
  145.  * The -T term option is always available and when TERMCAP is supported it
  146.  * overrides the environment variable TERM.
  147.  */
  148.             case 'T':
  149.                 term = *argv;
  150.                 break;
  151.             
  152.         /*    case 'd':        This is ignored as it is handled in check_win() */
  153.             }
  154.         }
  155.         ++argv;
  156.     }
  157.  
  158.     /*
  159.      * Allocate space for the generic buffer
  160.      */
  161.     if ((IObuff = alloc(IOSIZE)) == NULL)
  162.         mch_windexit(0);
  163.  
  164.     /* note that we may use mch_windexit() before mch_windinit()! */
  165.     mch_windinit();
  166.     set_init();            /* after mch_windinit because Rows is used */
  167.  
  168.     /*
  169.      * Process the other command line arguments.
  170.      */
  171.     if (argc > 1)
  172.     {
  173.         c = argv[0][1];
  174.         switch (argv[0][0])
  175.         {
  176.           case '-':
  177.             switch (c)
  178.             {
  179.               case 'e':            /* -e QuickFix mode */
  180.                 if (argc != 2)
  181.                     usage(1);
  182.                 doqf = 1;
  183.                 break;
  184.  
  185.             case 'c':            /* -c {command} file .. */
  186.                 if (argc <= 3)
  187.                     usage(2);
  188.                 ++argv;
  189.                 --argc;
  190.                 command = &(argv[0][0]);
  191.                 goto getfiles;
  192.  
  193.             case 't':            /* -t tag */
  194.                 if (argc < 3)
  195.                     usage(2);
  196.                 if (argc > 3)
  197.                     usage(1);
  198.                 ++argv;
  199.                 stuffReadbuff(":ta ");
  200.                 stuffReadbuff(argv[0]);
  201.                 stuffReadbuff("\n");
  202.                 break;
  203.  
  204.             default:
  205.                 usage(0);
  206.             }
  207.             break;
  208.  
  209.           case '+':             /* + or +{number} or +/{pat} or +{command} */
  210.             if (argc < 3)        /* no filename */
  211.                     usage(2);
  212.             if (c == NUL)
  213.                 command = "$";
  214.             else
  215.                 command = &(argv[0][1]);
  216.  
  217. getfiles:
  218.             ++argv;
  219.             --argc;
  220.             /*FALLTHROUGH*/
  221.  
  222.           default:                /* must be a file name */
  223. #if defined(WILD_CARDS) && !defined(UNIX)
  224.             ExpandWildCards(argc - 1, argv, &numfiles, &files, TRUE, TRUE);
  225.             if (numfiles != 0)
  226.                 fname = files[0];
  227.  
  228. #else
  229.             files = argv;
  230.             numfiles = argc - 1;
  231.             fname = argv[0];
  232. #endif
  233.             if (numfiles > 1)
  234.                 printf("%d files to edit\n", numfiles);
  235.             break;
  236.         }
  237.     }
  238.  
  239.     if (numfiles == 0)
  240.         numfiles = 1;
  241.  
  242.     RedrawingDisabled = TRUE;
  243.     filealloc();                /* Initialize storage structure */
  244.     init_yank();                /* init yank buffers */
  245.     termcapinit(term);            /* get terminal capabilities */
  246.  
  247. #ifdef MSDOS /* default mapping for some often used keys */
  248.     domap(0, "#1 :help\r", 0);                /* F1 is help key */
  249.     domap(0, "\236R i", 0);                    /* INSERT is 'i' */
  250.     domap(0, "\236S x", 0);                    /* DELETE is 'x' */
  251.     domap(0, "\236G 0", 0);                    /* HOME is '0' */
  252.     domap(0, "\236w H", 0);                    /* CTRL-HOME is 'H' */
  253.     domap(0, "\236O $", 0);                    /* END is '$' */
  254.     domap(0, "\236u L", 0);                    /* CTRL-END is 'L' */
  255.     domap(0, "\236I \002", 0);                /* PageUp is '^B' */
  256.     domap(0, "\236\204 1G", 0);                /* CTRL-PageUp is '1G' */
  257.     domap(0, "\236Q \006", 0);                /* PageDown is '^F' */
  258.     domap(0, "\236v G", 0);                    /* CTRL-PageDown is 'G' */
  259.             /* insert mode */
  260.     domap(0, "\236S \177", INSERT);            /* DELETE is <DEL> */
  261.     domap(0, "\236G \017H", INSERT);        /* HOME is '^OH' */
  262.     domap(0, "\236w \017H", INSERT);        /* CTRL-HOME is '^OH' */
  263.     domap(0, "\236O \017L", INSERT);        /* END is '^OL' */
  264.     domap(0, "\236u \017L", INSERT);        /* CTRL-END is '^OL' */
  265.     domap(0, "\236I \017\002", INSERT);        /* PageUp is '^O^B' */
  266.     domap(0, "\236\204 \017\061G", INSERT);    /* CTRL-PageUp is '^O1G' */
  267.     domap(0, "\236Q \017\006", INSERT);        /* PageDown is '^O^F' */
  268.     domap(0, "\236v \017G", INSERT);        /* CTRL-PageDown is '^OG' */
  269. #endif
  270.  
  271. /*
  272.  * Read the VIMINIT or EXINIT environment variable
  273.  *        (commands are to be separated with '|').
  274.  * If there is none, read initialization commands from "s:.vimrc" or "s:.exrc".
  275.  */
  276.     if ((initstr = getenv("VIMINIT")) != NULL || (initstr = getenv("EXINIT")) != NULL)
  277.         docmdline((u_char *)initstr);
  278.     else if (dosource(SYSVIMRC_FILE))
  279.         dosource(SYSEXRC_FILE);
  280.  
  281. /*
  282.  * read initialization commands from ".vimrc" or ".exrc" in current directory
  283.  */
  284.     if (dosource(VIMRC_FILE))
  285.         dosource(EXRC_FILE);
  286.  
  287. /*
  288.  * Call settmode here, so the T_KS may be defined by termcapinit and
  289.  * redifined in .exrc.
  290.  */
  291.     settmode(1);
  292.  
  293. #ifdef AMIGA
  294.     fname_case(fname);        /* set correct case for file name */
  295. #endif
  296.     setfname(fname);
  297.     maketitle();
  298.     if (Filename != NULL)
  299.         readfile(Filename, (linenr_t)0, TRUE);
  300.     else
  301.         msg("Empty Buffer");
  302.  
  303.     setpcmark();
  304.     startscript();                /* start writing to auto script file */
  305.  
  306.     if (recoverymode && !scriptin[curscript])    /* first do script file, then recover */
  307.         openrecover();
  308.  
  309.     /* position the display and the cursor at the top of the file. */
  310.     Topline = 1;
  311.     Curpos.lnum = 1;
  312.     Curpos.col = 0;
  313.     Cursrow = Curscol = 0;
  314.  
  315.     if (doqf)
  316.     {
  317.         if (qf_init(p_ef))
  318.             mch_windexit(3);
  319.         qf_jump(0);
  320.     }
  321.  
  322.     if (command)
  323.         docmdline((u_char *)command);
  324.  
  325.     RedrawingDisabled = FALSE;
  326.     updateScreen(NOT_VALID);
  327.  
  328.         /* start in insert mode (already taken care of for :ta command) */
  329.     if (p_im && stuff_empty())
  330.         stuffReadbuff("i");
  331. /*
  332.  * main command loop
  333.  */
  334.     for (;;)
  335.     {
  336.         adjustCurpos();
  337.         cursupdate();    /* Figure out where the cursor is based on Curpos. */
  338.  
  339.         if (Quote.lnum)
  340.             updateScreen(INVERTED);        /* update inverted part */
  341.         setcursor();
  342.  
  343.         normal();                        /* get and execute a command */
  344.     }
  345.     /*NOTREACHED*/
  346. }
  347.  
  348.     void
  349. getout(r)
  350.     int             r;
  351. {
  352.     windgoto((int)Rows - 1, 0);
  353.     outchar('\r');
  354.     outchar('\n');
  355.     mch_windexit(r);
  356. }
  357.