/* * v_ncol -- [count]| * Move to column count or the first column on this line. If the * requested column is past EOL, move to EOL. The nasty part is * that we have to know character column widths to make this work. * * PUBLIC: int v_ncol __P((SCR *, VICMD *)); */ int v_ncol(SCR *sp, VICMD *vp) { if (F_ISSET(vp, VC_C1SET) && vp->count > 1) { --vp->count; vp->m_stop.cno = vs_colpos(sp, vp->m_start.lno, (size_t)vp->count); /* * !!! * The | command succeeded if used as a command and the cursor * didn't move, but failed if used as a motion component in the * same situation. */ if (ISMOTION(vp) && vp->m_stop.cno == vp->m_start.cno) { v_nomove(sp); return (1); } } else { /* * !!! * The | command succeeded if used as a command in column 0 * without a count, but failed if used as a motion component * in the same situation. */ if (ISMOTION(vp) && vp->m_start.cno == 0) { v_sol(sp); return (1); } vp->m_stop.cno = 0; } /* * If moving right, non-motion commands move to the end of the range. * Delete and yank stay at the start. Motion commands adjust the * ending point to the character before the current ending charcter. * * If moving left, all commands move to the end of the range. Motion * commands adjust the starting point to the character before the * current starting character. */ if (vp->m_start.cno < vp->m_stop.cno) if (ISMOTION(vp)) { --vp->m_stop.cno; vp->m_final = vp->m_start; } else vp->m_final = vp->m_stop; else { if (ISMOTION(vp)) --vp->m_start.cno; vp->m_final = vp->m_stop; } return (0); }
/* * v_emark -- <mouse click> * Mouse mark. * * PUBLIC: int v_emark __P((SCR *, VICMD *)); */ int v_emark(SCR *sp, VICMD *vp) { SMAP *smp; smp = HMAP + vp->ev.e_lno; if (smp > TMAP) { msgq(sp, M_BERR, "320|Unknown cursor position."); return (1); } vp->m_stop.lno = smp->lno; vp->m_stop.cno = vs_colpos(sp, smp->lno, vp->ev.e_cno + (smp->soff - 1) * sp->cols); return (mark(sp, vp, 0, BQMARK)); }
/* * v_sel_start -- * Start selection. */ static int v_sel_start(SCR *sp, EVENT *evp) { SMAP *smp; VI_PRIVATE *vip; smp = HMAP + evp->e_lno; if (smp > TMAP) { /* XXX */ return (1); } vip = VIP(sp); vip->sel.lno = smp->lno; vip->sel.cno = vs_colpos(sp, smp->lno, evp->e_cno + (smp->soff - 1) * sp->cols); return (0); }
/* * vs_rcm -- * Return the physical column from the line that will display a * character closest to the currently most attractive character * position (which is stored as a screen column). * * PUBLIC: size_t vs_rcm __P((SCR *, db_recno_t, int)); */ size_t vs_rcm(SCR *sp, db_recno_t lno, int islast) { size_t len; /* Last character is easy, and common. */ if (islast) { if (db_get(sp, lno, 0, NULL, &len) || len == 0) return (0); return (len - 1); } /* First character is easy, and common. */ if (sp->rcm == 0) return (0); return (vs_colpos(sp, lno, sp->rcm)); }