I had the idea of creating a command that would "link" two windows together so 
that whatever buffer is loaded in window 1 would be in the window 5 on tab 2.  
The problem with this idea is that there is not a unique ID for each window,  
So I came up with the proof of concept unique number patch below.  

But first a few question:
Is this something that is implemented and I just missed the code?  
Is this the correct way to implement a unique window ID?
Would the VIM community be open to accepting a patch if I brought this code up 
to standards?


Brandon


diff -r 61a7c3f01088 -r b0c51aaf018c src/eval.c
--- a/src/eval.c        Wed Oct 03 21:48:44 2012 +0200
+++ b/src/eval.c        Thu Oct 04 14:30:52 2012 -0500
@@ -409,6 +409,9 @@
 static void item_lock __ARGS((typval_T *tv, int deep, int lock));
 static int tv_islocked __ARGS((typval_T *tv));

+static void f_setwinbufnr __ARGS((typval_T *argvars, typval_T *rettv));
+static void setwinbufnr __ARGS((int uwinnr, int bufnr));
+
 static int eval0 __ARGS((char_u *arg,  typval_T *rettv, char_u **nextcmd, int 
e                                                                               
                                                valuate));
 static int eval1 __ARGS((char_u **arg, typval_T *rettv, int evaluate));
 static int eval2 __ARGS((char_u **arg, typval_T *rettv, int evaluate));
@@ -484,6 +487,7 @@
 static void f_bufname __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_bufnr __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_bufwinnr __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_bufuwinnr __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_byte2line __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_byteidx __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_call __ARGS((typval_T *argvars, typval_T *rettv));
@@ -725,6 +729,7 @@
 static void f_tabpagebuflist __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_tabpagenr __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_tabpagewinnr __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_utabpagewinnr __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_taglist __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_tagfiles __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_tempname __ARGS((typval_T *argvars, typval_T *rettv));
@@ -750,6 +755,7 @@
 static void f_winheight __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_winline __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_winnr __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_uwinnr __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_winrestcmd __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_winrestview __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_winsaveview __ARGS((typval_T *argvars, typval_T *rettv));
@@ -825,7 +831,9 @@
 static int can_free_funccal __ARGS((funccall_T *fc, int copyID)) ;
 static void free_funccal __ARGS((funccall_T *fc, int free_val));
 static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, 
varnumber                                                                       
                                                        _T nr));
-static win_T *find_win_by_nr __ARGS((typval_T *vp, tabpage_T *tp));
+static win_T *find_win_by_vp __ARGS((typval_T *vp, tabpage_T *tp));
+static win_T *find_win_by_winnr __ARGS((int winnr, tabpage_T *tp));
+static win_T *find_win_by_uwinnr __ARGS((int winnr, tabpage_T *tp));
 static void getwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off));
 static int searchpair_cmn __ARGS((typval_T *argvars, pos_T *match_pos));
 static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos, int 
*flagsp)                                                                        
                                                       );
@@ -7843,6 +7851,7 @@
     {"bufloaded",      1, 1, f_bufloaded},
     {"bufname",                1, 1, f_bufname},
     {"bufnr",          1, 2, f_bufnr},
+    {"bufuwinnr",      1, 1, f_bufuwinnr},
     {"bufwinnr",       1, 1, f_bufwinnr},
     {"byte2line",      1, 1, f_byte2line},
     {"byteidx",                2, 2, f_byteidx},
@@ -8049,6 +8058,7 @@
     {"setreg",         2, 3, f_setreg},
     {"settabvar",      3, 3, f_settabvar},
     {"settabwinvar",   4, 4, f_settabwinvar},
+    {"setwinbufnr",     2, 2, f_setwinbufnr},
     {"setwinvar",      3, 3, f_setwinvar},
     {"shellescape",    1, 2, f_shellescape},
     {"simplify",       1, 1, f_simplify},
@@ -8104,8 +8114,11 @@
     {"trunc",          1, 1, f_trunc},
 #endif
     {"type",           1, 1, f_type},
+    {"ubufnr",         1, 2, f_bufnr},
     {"undofile",       1, 1, f_undofile},
     {"undotree",       0, 0, f_undotree},
+    {"utabpagewinnr",  1, 2, f_utabpagewinnr},
+    {"uwinnr",         0, 1, f_uwinnr},
     {"values",         1, 1, f_values},
     {"virtcol",                1, 1, f_virtcol},
     {"visualmode",     0, 1, f_visualmode},
@@ -9123,6 +9136,46 @@
 }

 /*
+ * "bufwinnr(nr)" function
+ */
+    static void
+f_bufuwinnr(argvars, rettv)
+    typval_T   *argvars;
+    typval_T   *rettv;
+{
+#ifdef FEAT_WINDOWS
+    win_T      *wp;
+    int                winnr = 0;
+#endif
+    buf_T      *buf;
+
+    (void)get_tv_number(&argvars[0]);      /* issue errmsg if type error */
+    ++emsg_off;
+    buf = get_buf_tv(&argvars[0]);
+#ifdef FEAT_WINDOWS
+    for (wp = firstwin; wp; wp = wp->w_next)
+    {
+       if (wp->w_buffer == buf)
+            winnr = wp->w_num;
+           break;
+    }
+    rettv->vval.v_number = (wp != NULL ? winnr : -1);
+#else
+    rettv->vval.v_number = (curwin->w_buffer == buf ? 1 : -1);
+#endif
+    --emsg_off;
+}
+
+
+
+
+
+
+
+
+
+
+/*
  * "byte2line(byte)" function
  */
     static void
@@ -11649,7 +11702,7 @@
        wp = NULL;
        if (argvars[0].v_type != VAR_UNKNOWN)   /* getloclist() */
        {
-           wp = find_win_by_nr(&argvars[0], NULL);
+           wp = find_win_by_vp(&argvars[0], NULL);
            if (wp == NULL)
                return;
        }
@@ -11819,18 +11872,29 @@
  * Find window specified by "vp" in tabpage "tp".
  */
     static win_T *
-find_win_by_nr(vp, tp)
+find_win_by_vp(vp, tp)
     typval_T   *vp;
     tabpage_T  *tp;        /* NULL for current tab page */
 {
+    int                nr;
+
+    nr = get_tv_number_chk(vp, NULL);
+
+    return find_win_by_winnr(nr,tp);
+}
+
+
+/*
+ * Find window specified by "winr" in tabpage "tp".
+ */
+    static win_T *
+find_win_by_winnr(nr, tp)
+    int                nr;
+    tabpage_T  *tp;        /* NULL for current tab page */
+{
 #ifdef FEAT_WINDOWS
     win_T      *wp;
-#endif
-    int                nr;
-
-    nr = get_tv_number_chk(vp, NULL);
-
-#ifdef FEAT_WINDOWS
+
     if (nr < 0)
        return NULL;
     if (nr == 0)
@@ -11848,6 +11912,39 @@
 #endif
 }

+
+/*
+ * Find window specified by "uwinnr" in tabpage "tp".
+ */
+    static win_T *
+find_win_by_uwinnr(nr, tp)
+    int                nr;
+    tabpage_T  *tp;        /* NULL for current tab page */
+{
+#ifdef FEAT_WINDOWS
+    win_T      *wp;
+
+    if (nr < 0)
+       return NULL;
+    if (nr == 0)
+       return curwin;
+
+    for (wp = (tp == NULL || tp == curtab) ? firstwin : tp->tp_firstwin;
+                                                 wp != NULL; wp = wp->w_next)
+       if (wp->w_num == nr)
+           break;
+    return wp;
+#else
+    if (nr == 0 || nr == 1)
+       return curwin;
+    return NULL;
+#endif
+}
+
+
+
+
+
 /*
  * "getwinvar()" function
  */
@@ -11879,7 +11976,7 @@
     else
        tp = curtab;
 #endif
-    win = find_win_by_nr(&argvars[off], tp);
+    win = find_win_by_vp(&argvars[off], tp);
     varname = get_tv_string_chk(&argvars[off + 1]);
     ++emsg_off;

@@ -16302,7 +16399,7 @@

     rettv->vval.v_number = -1;

-    win = find_win_by_nr(&argvars[0], NULL);
+    win = find_win_by_vp(&argvars[0], NULL);
     if (win != NULL)
        set_qf_ll_list(win, &argvars[1], &argvars[2], rettv);
 }
@@ -16583,7 +16680,7 @@
     else
        tp = curtab;
 #endif
-    win = find_win_by_nr(&argvars[off], tp);
+    win = find_win_by_vp(&argvars[off], tp);
     varname = get_tv_string_chk(&argvars[off + 1]);
     varp = &argvars[off + 2];

@@ -17906,8 +18003,71 @@


 #ifdef FEAT_WINDOWS
+static int get_uwinnr __ARGS((tabpage_T *tp, typval_T *argvar));
+
+/*
+ * Common code for utabpagewinnr() and uwinnr().
+ */
+    static int
+get_uwinnr(tp, argvar)
+    tabpage_T  *tp;
+    typval_T   *argvar;
+{
+    win_T      *twin;
+    int                nr = 1;
+    char_u     *arg;
+
+    twin = (tp == curtab) ? curwin : tp->tp_curwin;
+    if (argvar->v_type != VAR_UNKNOWN)
+    {
+       arg = get_tv_string_chk(argvar);
+       if (arg == NULL)
+           nr = 0;             /* type error; errmsg already given */
+       else if (STRCMP(arg, "$") == 0)
+           twin = (tp == curtab) ? lastwin : tp->tp_lastwin;
+       else if (STRCMP(arg, "#") == 0)
+       {
+           twin = (tp == curtab) ? prevwin : tp->tp_prevwin;
+           if (twin == NULL)
+               return 0;
+       }
+       else
+       {
+           EMSG2(_(e_invexpr2), arg);
+           nr = 0;
+       }
+    }
+    return twin->w_num;
+}
+#endif
+
+/*
+ * "utabpagewinnr()" function
+ */
+    static void
+f_utabpagewinnr(argvars, rettv)
+    typval_T   *argvars UNUSED;
+    typval_T   *rettv;
+{
+    int                nr = 1;
+#ifdef FEAT_WINDOWS
+    tabpage_T  *tp;
+
+    tp = find_tabpage((int)get_tv_number(&argvars[0]));
+    if (tp == NULL)
+       nr = 0;
+    else
+       nr = get_uwinnr(tp, &argvars[1]);
+#endif
+    rettv->vval.v_number = nr;
+}
+
+
+
+
 static int get_winnr __ARGS((tabpage_T *tp, typval_T *argvar));

+#ifdef FEAT_WINDOWS
 /*
  * Common code for tabpagewinnr() and winnr().
  */
@@ -18479,7 +18639,7 @@
 {
     win_T      *wp;

-    wp = find_win_by_nr(&argvars[0], NULL);
+    wp = find_win_by_vp(&argvars[0], NULL);
     if (wp == NULL)
        rettv->vval.v_number = -1;
     else
@@ -18508,7 +18668,7 @@
 {
     win_T      *wp;

-    wp = find_win_by_nr(&argvars[0], NULL);
+    wp = find_win_by_vp(&argvars[0], NULL);
     if (wp == NULL)
        rettv->vval.v_number = -1;
     else
@@ -18544,6 +18704,70 @@
 }

 /*
+ * "uwinnr()" function
+ */
+    static void
+f_uwinnr(argvars, rettv)
+    typval_T   *argvars UNUSED;
+    typval_T   *rettv;
+{
+    int                nr = 1;
+
+#ifdef FEAT_WINDOWS
+    nr = get_uwinnr(curtab, &argvars[0]);
+#endif
+    rettv->vval.v_number = nr;
+}
+
+/*
+ * "setwinbufnr()" function
+ */
+    static void
+f_setwinbufnr(argvars, rettv)
+    typval_T   *argvars UNUSED;
+    typval_T   *rettv;
+{
+    int                uwinnr;
+    int                ubufnr;
+    int                nr = 1;
+
+    uwinnr = (int)get_tv_number(&argvars[0]);
+    ubufnr = (int)get_tv_number(&argvars[1]);
+
+#ifdef FEAT_WINDOWS
+    setwinbufnr(uwinnr, ubufnr);
+#endif
+    rettv->vval.v_number = nr;
+}
+
+#ifdef FEAT_WINDOWS
+static void
+setwinbufnr(uwinnr,bufnr)
+    int                uwinnr;
+    int        bufnr;
+{
+    win_T      *window;
+    buf_T      *buffer;
+
+    window = NULL;
+    buffer = NULL;
+
+    buffer = buflist_findnr(bufnr);
+    window = find_win_by_uwinnr(uwinnr,NULL);
+
+    window->w_buffer = buffer;
+    redraw_win_later(window,must_redraw);
+    /* updateWindow(window); */
+    /* update_screen(must_redraw); */
+
+}
+#endif
+
+
+
+
+
+/*
  * "winrestcmd()" function
  */
     static void
@@ -18664,7 +18888,7 @@
 {
     win_T      *wp;

-    wp = find_win_by_nr(&argvars[0], NULL);
+    wp = find_win_by_vp(&argvars[0], NULL);
     if (wp == NULL)
        rettv->vval.v_number = -1;
     else
diff -r 61a7c3f01088 -r b0c51aaf018c src/structs.h
--- a/src/structs.h     Wed Oct 03 21:48:44 2012 +0200
+++ b/src/structs.h     Thu Oct 04 14:30:52 2012 -0500
@@ -1854,6 +1854,7 @@
  *
  * All row numbers are relative to the start of the window, except w_winrow.
  */
+static int top_window_num = 1;     /* Highest window number */
 struct window_S
 {
     buf_T      *w_buffer;          /* buffer we are a window into (used
@@ -1864,6 +1865,7 @@
 #endif

 #ifdef FEAT_WINDOWS
+    int         w_num;              /* unique window number. */
     win_T      *w_prev;            /* link to previous window */
     win_T      *w_next;            /* link to next window */
 #endif
diff -r 61a7c3f01088 -r b0c51aaf018c src/window.c
--- a/src/window.c      Wed Oct 03 21:48:44 2012 +0200
+++ b/src/window.c      Thu Oct 04 14:30:52 2012 -0500
@@ -8,6 +8,16 @@
  */

 #include "vim.h"
+void test_winnr(int i, int j);
+void test_winnr(int i,int j)
+{
+FILE *file;
+file = fopen("winnr.txt","a+");
+fprintf(file,"winnnumber is, %i called in position %i \n",i,j); /*writes*/
+fclose(file); /*done!*/
+}
+
+

 static int path_is_url __ARGS((char_u *p));
 #if defined(FEAT_WINDOWS) || defined(PROTO)
@@ -1249,6 +1259,9 @@
     ++newp->w_alist->al_refcount;
     newp->w_arg_idx = oldp->w_arg_idx;

+/*    newp->w_num = oldp->w_num;   /* top_window_num++; */
+test_winnr(newp->w_num,1);
+
     /* copy options from existing window */
     win_copy_options(oldp, newp);
 }
@@ -3298,6 +3311,9 @@
 #ifdef FEAT_VIRTUALEDIT
     wp->w_cursor.coladd = 0;
 #endif
+ /* test_winnr(wp->w_num,2);
+    wp->w_num=top_window_num++;
+ test_winnr(wp->w_num,2); */
     wp->w_pcmark.lnum = 1;     /* pcmark not cleared but set to line 1 */
     wp->w_pcmark.col = 0;
     wp->w_prev_pcmark.lnum = 0;
@@ -4010,6 +4026,27 @@
     return curwin;
 # endif
 }
+
+/*
+ * Find unique window number "uwinnr"
+ */
+    win_T *
+win_find_unr(uwinnr)
+    int                uwinnr;
+{
+    win_T      *wp;
+
+# ifdef FEAT_WINDOWS
+    for (wp = firstwin; wp != NULL; wp = wp->w_next)
+       if (wp->w_num == uwinnr)
+           break;
+    return wp;
+# else
+    return curwin;
+# endif
+}
+
+
 #endif

 #ifdef FEAT_VERTSPLIT
@@ -4382,6 +4419,10 @@
        new_wp->w_width = Columns;
 #endif

+test_winnr(new_wp->w_num,3);
+        new_wp->w_num = top_window_num++;
+test_winnr(new_wp->w_num,3);
+
        /* position the display and the cursor at the top of the file. */
        new_wp->w_topline = 1;
 #ifdef FEAT_DIFF
@@ -6680,3 +6721,7 @@
     return cur;
 }
 #endif
+
+
+
+

-- 
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

Raspunde prin e-mail lui