Patch 7.4.2170
Problem:    Cannot get information about timers.
Solution:   Add timer_info().
Files:      src/evalfunc.c, src/ex_cmds2.c, src/proto/ex_cmds2.pro,
            runtime/doc/eval.txt


*** ../vim-7.4.2169/src/evalfunc.c      2016-08-06 14:12:44.950591485 +0200
--- src/evalfunc.c      2016-08-06 20:22:58.870328009 +0200
***************
*** 396,401 ****
--- 396,402 ----
  static void f_tanh(typval_T *argvars, typval_T *rettv);
  #endif
  #ifdef FEAT_TIMERS
+ static void f_timer_info(typval_T *argvars, typval_T *rettv);
  static void f_timer_start(typval_T *argvars, typval_T *rettv);
  static void f_timer_stop(typval_T *argvars, typval_T *rettv);
  #endif
***************
*** 815,820 ****
--- 816,822 ----
      {"test_null_string", 0, 0, f_test_null_string},
      {"test_settime",  1, 1, f_test_settime},
  #ifdef FEAT_TIMERS
+     {"timer_info",    0, 1, f_timer_info},
      {"timer_start",   2, 3, f_timer_start},
      {"timer_stop",    1, 1, f_timer_stop},
  #endif
***************
*** 11961,11966 ****
--- 11963,11993 ----
  
  #ifdef FEAT_TIMERS
  /*
+  * "timer_info([timer])" function
+  */
+     static void
+ f_timer_info(typval_T *argvars, typval_T *rettv)
+ {
+     timer_T *timer = NULL;
+ 
+     if (rettv_list_alloc(rettv) != OK)
+       return;
+     if (argvars[0].v_type != VAR_UNKNOWN)
+     {
+       if (argvars[0].v_type != VAR_NUMBER)
+           EMSG(_(e_number_exp));
+       else
+       {
+           timer = find_timer((int)get_tv_number(&argvars[0]));
+           if (timer != NULL)
+               add_timer_info(rettv, timer);
+       }
+     }
+     else
+       add_timer_info_all(rettv);
+ }
+ 
+ /*
   * "timer_start(time, callback [, options])" function
   */
      static void
*** ../vim-7.4.2169/src/ex_cmds2.c      2016-08-06 19:01:33.980856744 +0200
--- src/ex_cmds2.c      2016-08-06 20:30:41.622673967 +0200
***************
*** 1139,1148 ****
      timer->tr_id = ++last_timer_id;
      insert_timer(timer);
      if (repeat != 0)
-     {
        timer->tr_repeat = repeat - 1;
!       timer->tr_interval = msec;
!     }
  
      profile_setlimit(msec, &timer->tr_due);
      return timer;
--- 1139,1146 ----
      timer->tr_id = ++last_timer_id;
      insert_timer(timer);
      if (repeat != 0)
        timer->tr_repeat = repeat - 1;
!     timer->tr_interval = msec;
  
      profile_setlimit(msec, &timer->tr_due);
      return timer;
***************
*** 1253,1258 ****
--- 1251,1314 ----
      free_timer(timer);
  }
  
+     void
+ add_timer_info(typval_T *rettv, timer_T *timer)
+ {
+     list_T    *list = rettv->vval.v_list;
+     dict_T    *dict = dict_alloc();
+     dictitem_T        *di;
+     long      remaining;
+     proftime_T        now;
+ 
+     if (dict == NULL)
+       return;
+     list_append_dict(list, dict);
+ 
+     dict_add_nr_str(dict, "id", (long)timer->tr_id, NULL);
+     dict_add_nr_str(dict, "time", (long)timer->tr_interval, NULL);
+ 
+     profile_start(&now);
+ # ifdef WIN3264
+     remaining = (long)(((double)(timer->tr_due.QuadPart - now.QuadPart)
+                                              / (double)fr.QuadPart) * 1000);
+ # else
+     remaining = (timer->tr_due.tv_sec - now.tv_sec) * 1000
+                              + (timer->tr_due.tv_usec - now.tv_usec) / 1000;
+ # endif
+     dict_add_nr_str(dict, "remaining", (long)remaining, NULL);
+ 
+     dict_add_nr_str(dict, "repeat",
+              (long)(timer->tr_repeat < 0 ? -1 : timer->tr_repeat + 1), NULL);
+ 
+     di = dictitem_alloc((char_u *)"callback");
+     if (di != NULL)
+     {
+       if (dict_add(dict, di) == FAIL)
+           vim_free(di);
+       else if (timer->tr_partial != NULL)
+       {
+           di->di_tv.v_type = VAR_PARTIAL;
+           di->di_tv.vval.v_partial = timer->tr_partial;
+           ++timer->tr_partial->pt_refcount;
+       }
+       else
+       {
+           di->di_tv.v_type = VAR_FUNC;
+           di->di_tv.vval.v_string = vim_strsave(timer->tr_callback);
+       }
+       di->di_tv.v_lock = 0;
+     }
+ }
+ 
+     void
+ add_timer_info_all(typval_T *rettv)
+ {
+     timer_T *timer;
+ 
+     for (timer = first_timer; timer != NULL; timer = timer->tr_next)
+       add_timer_info(rettv, timer);
+ }
+ 
  /*
   * Mark references in partials of timers.
   */
*** ../vim-7.4.2169/src/proto/ex_cmds2.pro      2016-07-30 22:47:44.322520729 
+0200
--- src/proto/ex_cmds2.pro      2016-08-06 20:23:17.770178815 +0200
***************
*** 22,27 ****
--- 22,29 ----
  long check_due_timer(void);
  timer_T *find_timer(int id);
  void stop_timer(timer_T *timer);
+ void add_timer_info(typval_T *rettv, timer_T *timer);
+ void add_timer_info_all(typval_T *rettv);
  int set_ref_in_timer(int copyID);
  void timer_free_all(void);
  void profile_divide(proftime_T *tm, int count, proftime_T *tm2);
*** ../vim-7.4.2169/runtime/doc/eval.txt        2016-08-01 15:40:24.187878367 
+0200
--- runtime/doc/eval.txt        2016-08-06 21:53:45.167505296 +0200
***************
*** 2317,2322 ****
--- 2339,2345 ----
  test_null_partial()           Funcref null value for testing
  test_null_string()            String  null value for testing
  test_settime({expr})          none    set current time for testing
+ timer_info([{id}])            List    information about timers
  timer_start({time}, {callback} [, {options}])
                                Number  create a timer
  timer_stop({timer})           none    stop a timer
***************
*** 7430,7439 ****
  
  test_settime({expr})                                  *test_settime()*
                Set the time Vim uses internally.  Currently only used for
!               timestamps in the history, as they are used in viminfo.
                {expr} must evaluate to a number.  When the value is zero the
                normal behavior is restored.
  
                                                        *timer_start()*
  timer_start({time}, {callback} [, {options}])
                Create a timer and return the timer ID.
--- 7536,7563 ----
  
  test_settime({expr})                                  *test_settime()*
                Set the time Vim uses internally.  Currently only used for
!               timestamps in the history, as they are used in viminfo, and
!               for undo.
                {expr} must evaluate to a number.  When the value is zero the
                normal behavior is restored.
  
+                                                       *timer_info()*
+ timer_info([{id}])
+               Return a list with information about timers.
+               When {id} is given only information about this timer is
+               returned.  When timer {id} does not exist an empty list is
+               returned.
+               When {id} is omitted information about all timers is returned.
+ 
+               For each timer the information is stored in a Dictionary with
+               these items:
+                   "id"            the timer ID
+                   "time"          time the timer was started with
+                   "remaining"     time until the timer fires
+                   "repeat"        number of times the timer will still fire;
+                                   -1 means forever
+                   "callback"      the callback
+ 
                                                        *timer_start()*
  timer_start({time}, {callback} [, {options}])
                Create a timer and return the timer ID.
***************
*** 7449,7455 ****
  
                {options} is a dictionary.  Supported entries:
                   "repeat"     Number of times to repeat calling the
!                               callback.  -1 means forever.
  
                Example: >
                        func MyHandler(timer)
--- 7573,7579 ----
  
                {options} is a dictionary.  Supported entries:
                   "repeat"     Number of times to repeat calling the
!                               callback.  -1 means forever.
  
                Example: >
                        func MyHandler(timer)
***************
*** 7461,7466 ****
--- 7585,7595 ----
                intervals.
                {only available when compiled with the |+timers| feature}
  
+ timer_stop({timer})                                   *timer_stop()*
+               Stop a timer.  The timer callback will no longer be invoked.
+               {timer} is an ID returned by timer_start(), thus it must be a
+               Number.  If {timer} does not exist there is no error.
+ 
  tolower({expr})                                               *tolower()*
                The result is a copy of the String given, with all uppercase
                characters turned into lowercase (just like applying |gu| to
*** ../vim-7.4.2169/src/version.c       2016-08-06 21:37:23.995218001 +0200
--- src/version.c       2016-08-06 22:02:04.355574399 +0200
***************
*** 765,766 ****
--- 765,768 ----
  {   /* Add new patch number below this line */
+ /**/
+     2170,
  /**/

-- 
This computer is so slow, it takes forever to execute and endless loop!

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui