On Saturday, August 6, 2016 at 1:02:18 PM UTC-4, Bram Moolenaar wrote: > > The problem with this solution is that the names are translated. > A more direct solution would be better. > > The 'buftype' option is "quickfix" for both quickfix and location list. > We can't change that without causing problems. > > Perhaps we should add a buftype({expr}) function, that can get the > buffer type of any buffer, and make a difference between "quickfix" and > "loclist".
I see. Even though it's quite awkward to add a new function just to accommodate this particular case, i'm attaching my attempt to implement it. Regards, Kent. -- -- 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 vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
diff --git a/src/evalfunc.c b/src/evalfunc.c index 8b5ad22..035a68c 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -65,6 +65,7 @@ static void f_buflisted(typval_T *argvars, typval_T *rettv); static void f_bufloaded(typval_T *argvars, typval_T *rettv); static void f_bufname(typval_T *argvars, typval_T *rettv); static void f_bufnr(typval_T *argvars, typval_T *rettv); +static void f_buftype(typval_T *argvars, typval_T *rettv); static void f_bufwinid(typval_T *argvars, typval_T *rettv); static void f_bufwinnr(typval_T *argvars, typval_T *rettv); static void f_byte2line(typval_T *argvars, typval_T *rettv); @@ -484,6 +485,7 @@ static struct fst {"bufloaded", 1, 1, f_bufloaded}, {"bufname", 1, 1, f_bufname}, {"bufnr", 1, 2, f_bufnr}, + {"buftype", 1, 1, f_buftype}, {"bufwinid", 1, 1, f_bufwinid}, {"bufwinnr", 1, 1, f_bufwinnr}, {"byte2line", 1, 1, f_byte2line}, @@ -1592,6 +1594,41 @@ f_bufnr(typval_T *argvars, typval_T *rettv) rettv->vval.v_number = -1; } +/* + * "buftype(expr)" function + */ + static void +f_buftype(typval_T *argvars, typval_T *rettv) +{ + buf_T *buf; + win_T *win; + char_u *val; + tabpage_T *tp; + + (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ + ++emsg_off; + buf = get_buf_tv(&argvars[0], FALSE); + rettv->v_type = VAR_STRING; + if (buf != NULL && buf->b_p_bt != NULL) + { + val = buf->b_p_bt; +#if defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS) + /* + * For location list window, w_llist_ref points to the location list. + * For quickfix window, w_llist_ref is NULL. + */ + if (bt_quickfix(buf) + && find_win_for_buf(buf, &win, &tp) == OK + && win->w_llist_ref != NULL) + val = (char_u *)"loclist"; +#endif + rettv->vval.v_string = vim_strsave(val); + } + else + rettv->vval.v_string = NULL; + --emsg_off; +} + static void buf_win_common(typval_T *argvars, typval_T *rettv, int get_nr) {