Mercurial > vim
comparison src/eval.c @ 709:ecee28dd16d2 v7.0213
updated for version 7.0213
author | vimboss |
---|---|
date | Fri, 03 Mar 2006 23:00:03 +0000 |
parents | 69e8006af734 |
children | 0c381fb7846c |
comparison
equal
deleted
inserted
replaced
708:7cf327ccb632 | 709:ecee28dd16d2 |
---|---|
598 static void f_serverlist __ARGS((typval_T *argvars, typval_T *rettv)); | 598 static void f_serverlist __ARGS((typval_T *argvars, typval_T *rettv)); |
599 static void f_setbufvar __ARGS((typval_T *argvars, typval_T *rettv)); | 599 static void f_setbufvar __ARGS((typval_T *argvars, typval_T *rettv)); |
600 static void f_setcmdpos __ARGS((typval_T *argvars, typval_T *rettv)); | 600 static void f_setcmdpos __ARGS((typval_T *argvars, typval_T *rettv)); |
601 static void f_setline __ARGS((typval_T *argvars, typval_T *rettv)); | 601 static void f_setline __ARGS((typval_T *argvars, typval_T *rettv)); |
602 static void f_setloclist __ARGS((typval_T *argvars, typval_T *rettv)); | 602 static void f_setloclist __ARGS((typval_T *argvars, typval_T *rettv)); |
603 static void f_setpos __ARGS((typval_T *argvars, typval_T *rettv)); | |
603 static void f_setqflist __ARGS((typval_T *argvars, typval_T *rettv)); | 604 static void f_setqflist __ARGS((typval_T *argvars, typval_T *rettv)); |
604 static void f_setreg __ARGS((typval_T *argvars, typval_T *rettv)); | 605 static void f_setreg __ARGS((typval_T *argvars, typval_T *rettv)); |
605 static void f_setwinvar __ARGS((typval_T *argvars, typval_T *rettv)); | 606 static void f_setwinvar __ARGS((typval_T *argvars, typval_T *rettv)); |
606 static void f_simplify __ARGS((typval_T *argvars, typval_T *rettv)); | 607 static void f_simplify __ARGS((typval_T *argvars, typval_T *rettv)); |
607 static void f_sort __ARGS((typval_T *argvars, typval_T *rettv)); | 608 static void f_sort __ARGS((typval_T *argvars, typval_T *rettv)); |
645 static void f_winnr __ARGS((typval_T *argvars, typval_T *rettv)); | 646 static void f_winnr __ARGS((typval_T *argvars, typval_T *rettv)); |
646 static void f_winrestcmd __ARGS((typval_T *argvars, typval_T *rettv)); | 647 static void f_winrestcmd __ARGS((typval_T *argvars, typval_T *rettv)); |
647 static void f_winwidth __ARGS((typval_T *argvars, typval_T *rettv)); | 648 static void f_winwidth __ARGS((typval_T *argvars, typval_T *rettv)); |
648 static void f_writefile __ARGS((typval_T *argvars, typval_T *rettv)); | 649 static void f_writefile __ARGS((typval_T *argvars, typval_T *rettv)); |
649 | 650 |
650 static pos_T *var2fpos __ARGS((typval_T *varp, int lnum)); | 651 static int list2fpos __ARGS((typval_T *arg, pos_T *posp, int *fnump)); |
652 static pos_T *var2fpos __ARGS((typval_T *varp, int lnum, int *fnum)); | |
651 static int get_env_len __ARGS((char_u **arg)); | 653 static int get_env_len __ARGS((char_u **arg)); |
652 static int get_id_len __ARGS((char_u **arg)); | 654 static int get_id_len __ARGS((char_u **arg)); |
653 static int get_name_len __ARGS((char_u **arg, char_u **alias, int evaluate, int verbose)); | 655 static int get_name_len __ARGS((char_u **arg, char_u **alias, int evaluate, int verbose)); |
654 static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end, int flags)); | 656 static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end, int flags)); |
655 #define FNE_INCL_BR 1 /* find_name_end(): include [] in name */ | 657 #define FNE_INCL_BR 1 /* find_name_end(): include [] in name */ |
6859 {"buffer_name", 1, 1, f_bufname}, /* obsolete */ | 6861 {"buffer_name", 1, 1, f_bufname}, /* obsolete */ |
6860 {"buffer_number", 1, 1, f_bufnr}, /* obsolete */ | 6862 {"buffer_number", 1, 1, f_bufnr}, /* obsolete */ |
6861 {"buflisted", 1, 1, f_buflisted}, | 6863 {"buflisted", 1, 1, f_buflisted}, |
6862 {"bufloaded", 1, 1, f_bufloaded}, | 6864 {"bufloaded", 1, 1, f_bufloaded}, |
6863 {"bufname", 1, 1, f_bufname}, | 6865 {"bufname", 1, 1, f_bufname}, |
6864 {"bufnr", 1, 1, f_bufnr}, | 6866 {"bufnr", 1, 2, f_bufnr}, |
6865 {"bufwinnr", 1, 1, f_bufwinnr}, | 6867 {"bufwinnr", 1, 1, f_bufwinnr}, |
6866 {"byte2line", 1, 1, f_byte2line}, | 6868 {"byte2line", 1, 1, f_byte2line}, |
6867 {"byteidx", 2, 2, f_byteidx}, | 6869 {"byteidx", 2, 2, f_byteidx}, |
6868 {"call", 2, 3, f_call}, | 6870 {"call", 2, 3, f_call}, |
6869 {"char2nr", 1, 1, f_char2nr}, | 6871 {"char2nr", 1, 1, f_char2nr}, |
7005 {"serverlist", 0, 0, f_serverlist}, | 7007 {"serverlist", 0, 0, f_serverlist}, |
7006 {"setbufvar", 3, 3, f_setbufvar}, | 7008 {"setbufvar", 3, 3, f_setbufvar}, |
7007 {"setcmdpos", 1, 1, f_setcmdpos}, | 7009 {"setcmdpos", 1, 1, f_setcmdpos}, |
7008 {"setline", 2, 2, f_setline}, | 7010 {"setline", 2, 2, f_setline}, |
7009 {"setloclist", 2, 3, f_setloclist}, | 7011 {"setloclist", 2, 3, f_setloclist}, |
7012 {"setpos", 2, 2, f_setpos}, | |
7010 {"setqflist", 1, 2, f_setqflist}, | 7013 {"setqflist", 1, 2, f_setqflist}, |
7011 {"setreg", 2, 3, f_setreg}, | 7014 {"setreg", 2, 3, f_setreg}, |
7012 {"setwinvar", 3, 3, f_setwinvar}, | 7015 {"setwinvar", 3, 3, f_setwinvar}, |
7013 {"simplify", 1, 1, f_simplify}, | 7016 {"simplify", 1, 1, f_simplify}, |
7014 {"sort", 1, 2, f_sort}, | 7017 {"sort", 1, 2, f_sort}, |
7808 f_bufnr(argvars, rettv) | 7811 f_bufnr(argvars, rettv) |
7809 typval_T *argvars; | 7812 typval_T *argvars; |
7810 typval_T *rettv; | 7813 typval_T *rettv; |
7811 { | 7814 { |
7812 buf_T *buf; | 7815 buf_T *buf; |
7816 int error = FALSE; | |
7817 char_u *name; | |
7813 | 7818 |
7814 (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ | 7819 (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ |
7815 ++emsg_off; | 7820 ++emsg_off; |
7816 buf = get_buf_tv(&argvars[0]); | 7821 buf = get_buf_tv(&argvars[0]); |
7822 --emsg_off; | |
7823 | |
7824 /* If the buffer isn't found and the second argument is not zero create a | |
7825 * new buffer. */ | |
7826 if (buf == NULL | |
7827 && argvars[1].v_type != VAR_UNKNOWN | |
7828 && get_tv_number_chk(&argvars[1], &error) != 0 | |
7829 && !error | |
7830 && (name = get_tv_string_chk(&argvars[0])) != NULL | |
7831 && !error) | |
7832 buf = buflist_new(name, NULL, (linenr_T)1, 0); | |
7833 | |
7817 if (buf != NULL) | 7834 if (buf != NULL) |
7818 rettv->vval.v_number = buf->b_fnum; | 7835 rettv->vval.v_number = buf->b_fnum; |
7819 else | 7836 else |
7820 rettv->vval.v_number = -1; | 7837 rettv->vval.v_number = -1; |
7821 --emsg_off; | |
7822 } | 7838 } |
7823 | 7839 |
7824 /* | 7840 /* |
7825 * "bufwinnr(nr)" function | 7841 * "bufwinnr(nr)" function |
7826 */ | 7842 */ |
8025 typval_T *argvars; | 8041 typval_T *argvars; |
8026 typval_T *rettv; | 8042 typval_T *rettv; |
8027 { | 8043 { |
8028 colnr_T col = 0; | 8044 colnr_T col = 0; |
8029 pos_T *fp; | 8045 pos_T *fp; |
8030 | 8046 int fnum = curbuf->b_fnum; |
8031 fp = var2fpos(&argvars[0], FALSE); | 8047 |
8032 if (fp != NULL) | 8048 fp = var2fpos(&argvars[0], FALSE, &fnum); |
8049 if (fp != NULL && fnum == curbuf->b_fnum) | |
8033 { | 8050 { |
8034 if (fp->col == MAXCOL) | 8051 if (fp->col == MAXCOL) |
8035 { | 8052 { |
8036 /* '> can be MAXCOL, get the length of the line then */ | 8053 /* '> can be MAXCOL, get the length of the line then */ |
8037 if (fp->lnum <= curbuf->b_ml.ml_line_count) | 8054 if (fp->lnum <= curbuf->b_ml.ml_line_count) |
8316 long coladd = 0; | 8333 long coladd = 0; |
8317 #endif | 8334 #endif |
8318 | 8335 |
8319 if (argvars[1].v_type == VAR_UNKNOWN) | 8336 if (argvars[1].v_type == VAR_UNKNOWN) |
8320 { | 8337 { |
8321 list_T *l = argvars->vval.v_list; | 8338 pos_T pos; |
8322 | 8339 |
8323 /* Argument can be [lnum, col, coladd]. */ | 8340 if (list2fpos(argvars, &pos, NULL) == FAIL) |
8324 if (argvars->v_type != VAR_LIST || l == NULL) | |
8325 return; | 8341 return; |
8326 line = list_find_nr(l, 0L, NULL); | 8342 line = pos.lnum; |
8327 col = list_find_nr(l, 1L, NULL); | 8343 col = pos.col; |
8328 #ifdef FEAT_VIRTUALEDIT | 8344 #ifdef FEAT_VIRTUALEDIT |
8329 coladd = list_find_nr(l, 2L, NULL); | 8345 coladd = pos.coladd; |
8330 if (coladd < 0) | |
8331 coladd = 0; | |
8332 #endif | 8346 #endif |
8333 } | 8347 } |
8334 else | 8348 else |
8335 { | 8349 { |
8336 line = get_tv_lnum(argvars); | 8350 line = get_tv_lnum(argvars); |
9911 typval_T *argvars; | 9925 typval_T *argvars; |
9912 typval_T *rettv; | 9926 typval_T *rettv; |
9913 { | 9927 { |
9914 pos_T *fp; | 9928 pos_T *fp; |
9915 list_T *l; | 9929 list_T *l; |
9930 int fnum = -1; | |
9916 | 9931 |
9917 if (rettv_list_alloc(rettv) == OK) | 9932 if (rettv_list_alloc(rettv) == OK) |
9918 { | 9933 { |
9919 l = rettv->vval.v_list; | 9934 l = rettv->vval.v_list; |
9920 fp = var2fpos(&argvars[0], TRUE); | 9935 fp = var2fpos(&argvars[0], TRUE, &fnum); |
9936 if (fnum != -1) | |
9937 list_append_number(l, (varnumber_T)fnum); | |
9938 else | |
9939 list_append_number(l, (varnumber_T)0); | |
9921 list_append_number(l, (fp != NULL) ? (varnumber_T)fp->lnum | 9940 list_append_number(l, (fp != NULL) ? (varnumber_T)fp->lnum |
9922 : (varnumber_T)0); | 9941 : (varnumber_T)0); |
9923 list_append_number(l, (fp != NULL) ? (varnumber_T)fp->col + 1 | 9942 list_append_number(l, (fp != NULL) ? (varnumber_T)fp->col + 1 |
9924 : (varnumber_T)0); | 9943 : (varnumber_T)0); |
9925 list_append_number(l, | 9944 list_append_number(l, |
11643 typval_T *argvars; | 11662 typval_T *argvars; |
11644 typval_T *rettv; | 11663 typval_T *rettv; |
11645 { | 11664 { |
11646 linenr_T lnum = 0; | 11665 linenr_T lnum = 0; |
11647 pos_T *fp; | 11666 pos_T *fp; |
11648 | 11667 int fnum; |
11649 fp = var2fpos(&argvars[0], TRUE); | 11668 |
11669 fp = var2fpos(&argvars[0], TRUE, &fnum); | |
11650 if (fp != NULL) | 11670 if (fp != NULL) |
11651 lnum = fp->lnum; | 11671 lnum = fp->lnum; |
11652 rettv->vval.v_number = lnum; | 11672 rettv->vval.v_number = lnum; |
11653 } | 11673 } |
11654 | 11674 |
11868 { | 11888 { |
11869 if (start < 0) | 11889 if (start < 0) |
11870 start = 0; | 11890 start = 0; |
11871 if (start > (long)STRLEN(str)) | 11891 if (start > (long)STRLEN(str)) |
11872 goto theend; | 11892 goto theend; |
11873 str += start; | 11893 /* When "count" argument is there ignore matches before "start", |
11894 * otherwise skip part of the string. Differs when pattern is "^" | |
11895 * or "\<". */ | |
11896 if (argvars[3].v_type != VAR_UNKNOWN) | |
11897 startcol = start; | |
11898 else | |
11899 str += start; | |
11874 } | 11900 } |
11875 | 11901 |
11876 if (argvars[3].v_type != VAR_UNKNOWN) | 11902 if (argvars[3].v_type != VAR_UNKNOWN) |
11877 nth = get_tv_number_chk(&argvars[3], &error); | 11903 nth = get_tv_number_chk(&argvars[3], &error); |
11878 if (error) | 11904 if (error) |
13176 | 13202 |
13177 #define SP_NOMOVE 1 /* don't move cursor */ | 13203 #define SP_NOMOVE 1 /* don't move cursor */ |
13178 #define SP_REPEAT 2 /* repeat to find outer pair */ | 13204 #define SP_REPEAT 2 /* repeat to find outer pair */ |
13179 #define SP_RETCOUNT 4 /* return matchcount */ | 13205 #define SP_RETCOUNT 4 /* return matchcount */ |
13180 #define SP_SETPCMARK 8 /* set previous context mark */ | 13206 #define SP_SETPCMARK 8 /* set previous context mark */ |
13207 #define SP_START 16 /* accept match at start position */ | |
13181 | 13208 |
13182 static int get_search_arg __ARGS((typval_T *varp, int *flagsp)); | 13209 static int get_search_arg __ARGS((typval_T *varp, int *flagsp)); |
13183 | 13210 |
13184 /* | 13211 /* |
13185 * Get flags for a search function. | 13212 * Get flags for a search function. |
13214 { | 13241 { |
13215 case 'n': mask = SP_NOMOVE; break; | 13242 case 'n': mask = SP_NOMOVE; break; |
13216 case 'r': mask = SP_REPEAT; break; | 13243 case 'r': mask = SP_REPEAT; break; |
13217 case 'm': mask = SP_RETCOUNT; break; | 13244 case 'm': mask = SP_RETCOUNT; break; |
13218 case 's': mask = SP_SETPCMARK; break; | 13245 case 's': mask = SP_SETPCMARK; break; |
13246 case 'c': mask = SP_START; break; | |
13219 } | 13247 } |
13220 if (mask == 0) | 13248 if (mask == 0) |
13221 { | 13249 { |
13222 EMSG2(_(e_invarg2), flags); | 13250 EMSG2(_(e_invarg2), flags); |
13223 dir = 0; | 13251 dir = 0; |
13247 int save_p_ws = p_ws; | 13275 int save_p_ws = p_ws; |
13248 int dir; | 13276 int dir; |
13249 int flags = 0; | 13277 int flags = 0; |
13250 int retval = 0; /* default: FAIL */ | 13278 int retval = 0; /* default: FAIL */ |
13251 long lnum_stop = 0; | 13279 long lnum_stop = 0; |
13280 int options = SEARCH_KEEP; | |
13252 | 13281 |
13253 pat = get_tv_string(&argvars[0]); | 13282 pat = get_tv_string(&argvars[0]); |
13254 dir = get_search_arg(&argvars[1], &flags); /* may set p_ws */ | 13283 dir = get_search_arg(&argvars[1], &flags); /* may set p_ws */ |
13255 if (dir == 0) | 13284 if (dir == 0) |
13256 goto theend; | 13285 goto theend; |
13286 if (flags & SP_START) | |
13287 options |= SEARCH_START; | |
13257 | 13288 |
13258 /* Optional extra argument: line number to stop searching. */ | 13289 /* Optional extra argument: line number to stop searching. */ |
13259 if (argvars[1].v_type != VAR_UNKNOWN | 13290 if (argvars[1].v_type != VAR_UNKNOWN |
13260 && argvars[2].v_type != VAR_UNKNOWN) | 13291 && argvars[2].v_type != VAR_UNKNOWN) |
13261 { | 13292 { |
13263 if (lnum_stop < 0) | 13294 if (lnum_stop < 0) |
13264 goto theend; | 13295 goto theend; |
13265 } | 13296 } |
13266 | 13297 |
13267 /* | 13298 /* |
13268 * This function accepts only SP_NOMOVE and SP_SETPCMARK flags. | 13299 * This function accepts only SP_NOMOVE, SP_START and SP_SETPCMARK flags. |
13269 * Check to make sure only those flags are set. | 13300 * Check to make sure only those flags are set. |
13270 * Also, Only the SP_NOMOVE or the SP_SETPCMARK flag can be set. Both | 13301 * Also, Only the SP_NOMOVE or the SP_SETPCMARK flag can be set. Both |
13271 * flags cannot be set. Check for that condition also. | 13302 * flags cannot be set. Check for that condition also. |
13272 */ | 13303 */ |
13273 if (((flags & ~(SP_NOMOVE | SP_SETPCMARK)) != 0) || | 13304 if (((flags & ~(SP_NOMOVE | SP_SETPCMARK | SP_START)) != 0) |
13274 ((flags & SP_NOMOVE) && (flags & SP_SETPCMARK))) | 13305 || ((flags & SP_NOMOVE) && (flags & SP_SETPCMARK))) |
13275 { | 13306 { |
13276 EMSG2(_(e_invarg2), get_tv_string(&argvars[1])); | 13307 EMSG2(_(e_invarg2), get_tv_string(&argvars[1])); |
13277 goto theend; | 13308 goto theend; |
13278 } | 13309 } |
13279 | 13310 |
13280 pos = save_cursor = curwin->w_cursor; | 13311 pos = save_cursor = curwin->w_cursor; |
13281 if (searchit(curwin, curbuf, &pos, dir, pat, 1L, | 13312 if (searchit(curwin, curbuf, &pos, dir, pat, 1L, |
13282 SEARCH_KEEP, RE_SEARCH, (linenr_T)lnum_stop) != FAIL) | 13313 options, RE_SEARCH, (linenr_T)lnum_stop) != FAIL) |
13283 { | 13314 { |
13284 retval = pos.lnum; | 13315 retval = pos.lnum; |
13285 if (flags & SP_SETPCMARK) | 13316 if (flags & SP_SETPCMARK) |
13286 setpcmark(); | 13317 setpcmark(); |
13287 curwin->w_cursor = pos; | 13318 curwin->w_cursor = pos; |
13456 char_u *spat; /* start pattern */ | 13487 char_u *spat; /* start pattern */ |
13457 char_u *mpat; /* middle pattern */ | 13488 char_u *mpat; /* middle pattern */ |
13458 char_u *epat; /* end pattern */ | 13489 char_u *epat; /* end pattern */ |
13459 int dir; /* BACKWARD or FORWARD */ | 13490 int dir; /* BACKWARD or FORWARD */ |
13460 char_u *skip; /* skip expression */ | 13491 char_u *skip; /* skip expression */ |
13461 int flags; /* SP_RETCOUNT, SP_REPEAT, SP_NOMOVE */ | 13492 int flags; /* SP_RETCOUNT, SP_REPEAT, SP_NOMOVE, SP_START */ |
13462 pos_T *match_pos; | 13493 pos_T *match_pos; |
13463 linenr_T lnum_stop; /* stop at this line if not zero */ | 13494 linenr_T lnum_stop; /* stop at this line if not zero */ |
13464 { | 13495 { |
13465 char_u *save_cpo; | 13496 char_u *save_cpo; |
13466 char_u *pat, *pat2 = NULL, *pat3 = NULL; | 13497 char_u *pat, *pat2 = NULL, *pat3 = NULL; |
13472 pos_T save_pos; | 13503 pos_T save_pos; |
13473 int n; | 13504 int n; |
13474 int r; | 13505 int r; |
13475 int nest = 1; | 13506 int nest = 1; |
13476 int err; | 13507 int err; |
13508 int options = SEARCH_KEEP; | |
13477 | 13509 |
13478 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */ | 13510 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */ |
13479 save_cpo = p_cpo; | 13511 save_cpo = p_cpo; |
13480 p_cpo = (char_u *)""; | 13512 p_cpo = (char_u *)""; |
13481 | 13513 |
13489 if (*mpat == NUL) | 13521 if (*mpat == NUL) |
13490 STRCPY(pat3, pat2); | 13522 STRCPY(pat3, pat2); |
13491 else | 13523 else |
13492 sprintf((char *)pat3, "\\(%s\\m\\)\\|\\(%s\\m\\)\\|\\(%s\\m\\)", | 13524 sprintf((char *)pat3, "\\(%s\\m\\)\\|\\(%s\\m\\)\\|\\(%s\\m\\)", |
13493 spat, epat, mpat); | 13525 spat, epat, mpat); |
13526 if (flags & SP_START) | |
13527 options |= SEARCH_START; | |
13494 | 13528 |
13495 save_cursor = curwin->w_cursor; | 13529 save_cursor = curwin->w_cursor; |
13496 pos = curwin->w_cursor; | 13530 pos = curwin->w_cursor; |
13497 clearpos(&firstpos); | 13531 clearpos(&firstpos); |
13498 clearpos(&foundpos); | 13532 clearpos(&foundpos); |
13499 pat = pat3; | 13533 pat = pat3; |
13500 for (;;) | 13534 for (;;) |
13501 { | 13535 { |
13502 n = searchit(curwin, curbuf, &pos, dir, pat, 1L, | 13536 n = searchit(curwin, curbuf, &pos, dir, pat, 1L, |
13503 SEARCH_KEEP, RE_SEARCH, lnum_stop); | 13537 options, RE_SEARCH, lnum_stop); |
13504 if (n == FAIL || (firstpos.lnum != 0 && equalpos(pos, firstpos))) | 13538 if (n == FAIL || (firstpos.lnum != 0 && equalpos(pos, firstpos))) |
13505 /* didn't find it or found the first match again: FAIL */ | 13539 /* didn't find it or found the first match again: FAIL */ |
13506 break; | 13540 break; |
13507 | 13541 |
13508 if (firstpos.lnum == 0) | 13542 if (firstpos.lnum == 0) |
13874 rettv->vval.v_number = -1; | 13908 rettv->vval.v_number = -1; |
13875 | 13909 |
13876 win = find_win_by_nr(&argvars[0]); | 13910 win = find_win_by_nr(&argvars[0]); |
13877 if (win != NULL) | 13911 if (win != NULL) |
13878 set_qf_ll_list(win, &argvars[1], &argvars[2], rettv); | 13912 set_qf_ll_list(win, &argvars[1], &argvars[2], rettv); |
13913 } | |
13914 | |
13915 /* | |
13916 * "setpos()" function | |
13917 */ | |
13918 /*ARGSUSED*/ | |
13919 static void | |
13920 f_setpos(argvars, rettv) | |
13921 typval_T *argvars; | |
13922 typval_T *rettv; | |
13923 { | |
13924 pos_T pos; | |
13925 int fnum; | |
13926 char_u *name; | |
13927 | |
13928 name = get_tv_string_chk(argvars); | |
13929 if (name != NULL) | |
13930 { | |
13931 if (list2fpos(&argvars[1], &pos, &fnum) == OK) | |
13932 { | |
13933 --pos.col; | |
13934 if (name[0] == '.') /* cursor */ | |
13935 { | |
13936 if (fnum == curbuf->b_fnum) | |
13937 { | |
13938 curwin->w_cursor = pos; | |
13939 check_cursor(); | |
13940 } | |
13941 else | |
13942 EMSG(_(e_invarg)); | |
13943 } | |
13944 else if (name[0] == '\'') /* mark */ | |
13945 (void)setmark_pos(name[1], &pos, fnum); | |
13946 else | |
13947 EMSG(_(e_invarg)); | |
13948 } | |
13949 } | |
13879 } | 13950 } |
13880 | 13951 |
13881 /* | 13952 /* |
13882 * "setqflist()" function | 13953 * "setqflist()" function |
13883 */ | 13954 */ |
15410 typval_T *argvars; | 15481 typval_T *argvars; |
15411 typval_T *rettv; | 15482 typval_T *rettv; |
15412 { | 15483 { |
15413 colnr_T vcol = 0; | 15484 colnr_T vcol = 0; |
15414 pos_T *fp; | 15485 pos_T *fp; |
15415 | 15486 int fnum = curbuf->b_fnum; |
15416 fp = var2fpos(&argvars[0], FALSE); | 15487 |
15417 if (fp != NULL && fp->lnum <= curbuf->b_ml.ml_line_count) | 15488 fp = var2fpos(&argvars[0], FALSE, &fnum); |
15489 if (fp != NULL && fp->lnum <= curbuf->b_ml.ml_line_count | |
15490 && fnum == curbuf->b_fnum) | |
15418 { | 15491 { |
15419 getvvcol(curwin, fp, NULL, NULL, &vcol); | 15492 getvvcol(curwin, fp, NULL, NULL, &vcol); |
15420 ++vcol; | 15493 ++vcol; |
15421 } | 15494 } |
15422 | 15495 |
15658 /* | 15731 /* |
15659 * Translate a String variable into a position. | 15732 * Translate a String variable into a position. |
15660 * Returns NULL when there is an error. | 15733 * Returns NULL when there is an error. |
15661 */ | 15734 */ |
15662 static pos_T * | 15735 static pos_T * |
15663 var2fpos(varp, lnum) | 15736 var2fpos(varp, lnum, fnum) |
15664 typval_T *varp; | 15737 typval_T *varp; |
15665 int lnum; /* TRUE when $ is last line */ | 15738 int lnum; /* TRUE when $ is last line */ |
15739 int *fnum; /* set to fnum for '0, 'A, etc. */ | |
15666 { | 15740 { |
15667 char_u *name; | 15741 char_u *name; |
15668 static pos_T pos; | 15742 static pos_T pos; |
15669 pos_T *pp; | 15743 pos_T *pp; |
15670 | 15744 |
15709 return NULL; | 15783 return NULL; |
15710 if (name[0] == '.') /* cursor */ | 15784 if (name[0] == '.') /* cursor */ |
15711 return &curwin->w_cursor; | 15785 return &curwin->w_cursor; |
15712 if (name[0] == '\'') /* mark */ | 15786 if (name[0] == '\'') /* mark */ |
15713 { | 15787 { |
15714 pp = getmark(name[1], FALSE); | 15788 pp = getmark_fnum(name[1], FALSE, fnum); |
15715 if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0) | 15789 if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0) |
15716 return NULL; | 15790 return NULL; |
15717 return pp; | 15791 return pp; |
15718 } | 15792 } |
15719 | 15793 |
15750 pos.col = (colnr_T)STRLEN(ml_get_curline()); | 15824 pos.col = (colnr_T)STRLEN(ml_get_curline()); |
15751 } | 15825 } |
15752 return &pos; | 15826 return &pos; |
15753 } | 15827 } |
15754 return NULL; | 15828 return NULL; |
15829 } | |
15830 | |
15831 /* | |
15832 * Convert list in "arg" into a position and optional file number. | |
15833 * When "fnump" is NULL there is no file number, only 3 items. | |
15834 * Note that the column is passed on as-is, the caller may want to decrement | |
15835 * it to use 1 for the first column. | |
15836 * Return FAIL when conversion is not possible, doesn't check the position for | |
15837 * validity. | |
15838 */ | |
15839 static int | |
15840 list2fpos(arg, posp, fnump) | |
15841 typval_T *arg; | |
15842 pos_T *posp; | |
15843 int *fnump; | |
15844 { | |
15845 list_T *l = arg->vval.v_list; | |
15846 long i = 0; | |
15847 long n; | |
15848 | |
15849 /* List must be: [fnum, lnum, col, coladd] */ | |
15850 if (arg->v_type != VAR_LIST || l == NULL | |
15851 || l->lv_len != (fnump == NULL ? 3 : 4)) | |
15852 return FAIL; | |
15853 | |
15854 if (fnump != NULL) | |
15855 { | |
15856 n = list_find_nr(l, i++, NULL); /* fnum */ | |
15857 if (n < 0) | |
15858 return FAIL; | |
15859 if (n == 0) | |
15860 n = curbuf->b_fnum; /* current buffer */ | |
15861 *fnump = n; | |
15862 } | |
15863 | |
15864 n = list_find_nr(l, i++, NULL); /* lnum */ | |
15865 if (n < 0) | |
15866 return FAIL; | |
15867 posp->lnum = n; | |
15868 | |
15869 n = list_find_nr(l, i++, NULL); /* col */ | |
15870 if (n < 0) | |
15871 return FAIL; | |
15872 posp->col = n; | |
15873 | |
15874 #ifdef FEAT_VIRTUALEDIT | |
15875 n = list_find_nr(l, i, NULL); | |
15876 if (n < 0) | |
15877 return FAIL; | |
15878 posp->coladd = n; | |
15879 #endif | |
15880 | |
15881 return OK; | |
15755 } | 15882 } |
15756 | 15883 |
15757 /* | 15884 /* |
15758 * Get the length of an environment variable name. | 15885 * Get the length of an environment variable name. |
15759 * Advance "arg" to the first character after the name. | 15886 * Advance "arg" to the first character after the name. |