@@ -356,6 +356,57 @@ delegate_to_kitten_if_possible(int argc, char *argv[], char* exe_dir) {
356356 if (argc > 3 && strcmp (argv [1 ], "+" ) == 0 && strcmp (argv [2 ], "kitten" ) == 0 && is_wrapped_kitten (argv [3 ])) exec_kitten (argc - 2 , argv + 2 , exe_dir );
357357}
358358
359+ static bool
360+ is_boolean_flag (const char * x ) {
361+ static const char * all_boolean_options = KITTY_CLI_BOOL_OPTIONS ;
362+ char buf [128 ];
363+ snprintf (buf , sizeof (buf ), " %s " , x );
364+ return strstr (all_boolean_options , buf ) != NULL ;
365+ }
366+
367+ static void
368+ handle_fast_commandline (int argc , char * argv []) {
369+ char current_option_expecting_argument [128 ] = {0 };
370+ bool version_requested = false;
371+ for (int i = 1 ; i < argc ; i ++ ) {
372+ const char * arg = argv [i ];
373+ if (current_option_expecting_argument [0 ]) {
374+ current_option_expecting_argument [0 ] = 0 ;
375+ } else {
376+ if (!arg || !arg [0 ] || !arg [1 ] || arg [0 ] != '-' || strcmp (arg , "--" ) == 0 ) break ;
377+ if (arg [1 ] == '-' ) { // long opt
378+ const char * equal = strchr (arg , '=' );
379+ if (equal == NULL ) {
380+ if (strcmp (arg + 2 , "version" ) == 0 ) {
381+ version_requested = true;
382+ } else if (!is_boolean_flag (arg + 2 )) {
383+ strncpy (current_option_expecting_argument , arg + 2 , sizeof (current_option_expecting_argument )- 1 );
384+ }
385+ }
386+ } else {
387+ char buf [2 ] = {0 };
388+ for (int i = 1 ; arg [i ] != 0 ; i ++ ) {
389+ switch (arg [i ]) {
390+ case 'v' : version_requested = true; break ;
391+ default :
392+ buf [0 ] = arg [i ]; buf [1 ] = 0 ;
393+ if (!is_boolean_flag (buf )) { current_option_expecting_argument [0 ] = arg [i ]; current_option_expecting_argument [1 ] = 0 ; }
394+ }
395+ }
396+ }
397+ }
398+ }
399+
400+ if (version_requested ) {
401+ if (isatty (STDOUT_FILENO )) {
402+ printf ("\x1b[3mkitty\x1b[23m \x1b[32m%s\x1b[39m created by \x1b[1;34mKovid Goyal\x1b[22;39m\n" , KITTY_VERSION );
403+ } else {
404+ printf ("kitty %s created by Kovid Goyal\n" , KITTY_VERSION );
405+ }
406+ exit (0 );
407+ }
408+ }
409+
359410int main (int argc , char * argv [], char * envp []) {
360411 if (argc < 1 || !argv ) { fprintf (stderr , "Invalid argc/argv\n" ); return 1 ; }
361412 if (!ensure_working_stdio ()) return 1 ;
@@ -370,6 +421,7 @@ int main(int argc, char *argv[], char* envp[]) {
370421 strncpy (exe_dir_buf , exe , sizeof (exe_dir_buf ));
371422 char * exe_dir = dirname (exe_dir_buf );
372423 delegate_to_kitten_if_possible (argc , argv , exe_dir );
424+ handle_fast_commandline (argc , argv );
373425 int num , ret = 0 ;
374426 char lib [PATH_MAX + 1 ] = {0 };
375427 if (KITTY_LIB_PATH [0 ] == '/' ) {
0 commit comments