/* * Set named mark "c" to position "pos". * When "c" is upper case use file "fnum". * Returns OK on success, FAIL if bad name given. */ int setmark_pos(int c, pos_T *pos, int fnum) { int i; /* Check for a special key (may cause islower() to crash). */ if (c < 0) return FAIL; if (c == '\'' || c == '`') { if (pos == &curwin->w_cursor) { setpcmark(); /* keep it even when the cursor doesn't move */ curwin->w_prev_pcmark = curwin->w_pcmark; } else curwin->w_pcmark = *pos; return OK; } if (c == '"') { RESET_FMARK(&curbuf->b_last_cursor, *pos, curbuf->b_fnum); return OK; } /* Allow setting '[ and '] for an autocommand that simulates reading a * file. */ if (c == '[') { curbuf->b_op_start = *pos; return OK; } if (c == ']') { curbuf->b_op_end = *pos; return OK; } if (c == '<' || c == '>') { if (c == '<') curbuf->b_visual.vi_start = *pos; else curbuf->b_visual.vi_end = *pos; if (curbuf->b_visual.vi_mode == NUL) /* Visual_mode has not yet been set, use a sane default. */ curbuf->b_visual.vi_mode = 'v'; return OK; } if (c > 'z') /* some islower() and isupper() cannot handle characters above 127 */ return FAIL; if (islower(c)) { i = c - 'a'; RESET_FMARK(curbuf->b_namedm + i, *pos, curbuf->b_fnum); return OK; } if (isupper(c)) { assert(c >= 'A' && c <= 'Z'); i = c - 'A'; RESET_XFMARK(namedfm + i, *pos, fnum, NULL); return OK; } return FAIL; }
/* * Set named mark "c" to position "pos". * When "c" is upper case use file "fnum". * Returns OK on success, FAIL if bad name given. */ int setmark_pos(int c, pos_T *pos, int fnum) { int i; /* Check for a special key (may cause islower() to crash). */ if (c < 0) return FAIL; if (c == '\'' || c == '`') { if (pos == &curwin->w_cursor) { setpcmark(); /* keep it even when the cursor doesn't move */ curwin->w_prev_pcmark = curwin->w_pcmark; } else curwin->w_pcmark = *pos; return OK; } if (c == '"') { RESET_FMARK(&curbuf->b_last_cursor, *pos, curbuf->b_fnum); return OK; } /* Allow setting '[ and '] for an autocommand that simulates reading a * file. */ if (c == '[') { curbuf->b_op_start = *pos; return OK; } if (c == ']') { curbuf->b_op_end = *pos; return OK; } if (c == '<' || c == '>') { if (c == '<') curbuf->b_visual.vi_start = *pos; else curbuf->b_visual.vi_end = *pos; if (curbuf->b_visual.vi_mode == NUL) /* Visual_mode has not yet been set, use a sane default. */ curbuf->b_visual.vi_mode = 'v'; return OK; } buf_T *buf = buflist_findnr(fnum); // Can't set a mark in a non-existant buffer. if (buf == NULL) { return FAIL; } if (ASCII_ISLOWER(c)) { i = c - 'a'; RESET_FMARK(buf->b_namedm + i, *pos, fnum); return OK; } if (ASCII_ISUPPER(c) || ascii_isdigit(c)) { if (ascii_isdigit(c)) { i = c - '0' + NMARKS; } else { i = c - 'A'; } RESET_XFMARK(namedfm + i, *pos, fnum, NULL); return OK; } return FAIL; }