00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "config.h"
00014 #include "vi.h"
00015
00016
00017
00018 MARK m_row(m, cnt, key)
00019 MARK m;
00020 long cnt;
00021 int key;
00022 {
00023 DEFAULT(1);
00024
00025
00026 cnt--;
00027 switch (key)
00028 {
00029 case 'H':
00030 cnt = topline + cnt;
00031 break;
00032
00033 case 'M':
00034 cnt = topline + (LINES - 1) / 2;
00035 break;
00036
00037 case 'L':
00038 cnt = botline - cnt;
00039 break;
00040 }
00041
00042
00043 return MARK_AT_LINE(cnt);
00044 }
00045
00046
00047
00048 MARK m_z(m, cnt, key)
00049 MARK m;
00050 long cnt;
00051 int key;
00052 {
00053 long newtop;
00054 int i;
00055
00056
00057 if (cnt < 0 || cnt > nlines)
00058 {
00059 return MARK_UNSET;
00060 }
00061 if (cnt)
00062 {
00063 m = MARK_AT_LINE(cnt);
00064 newtop = cnt;
00065 }
00066 else
00067 {
00068 newtop = markline(m);
00069 }
00070
00071
00072 for (i = 0; key >= '0' && key <= '9'; key = getkey(0))
00073 {
00074 i = i * 10 + key - '0';
00075 }
00076 #ifndef CRUNCH
00077 if (i > 0 && i <= LINES - 1)
00078 {
00079 *o_window = i;
00080 wset = TRUE;
00081 }
00082 #else
00083
00084 #endif
00085
00086
00087 switch (key)
00088 {
00089 case '\n':
00090 #if OSK
00091 case '\l':
00092 #else
00093 case '\r':
00094 #endif
00095 case '+':
00096 break;
00097
00098 case '.':
00099 case 'z':
00100 newtop -= LINES / 2;
00101 break;
00102
00103 case '-':
00104 newtop -= LINES - 1;
00105 break;
00106
00107 default:
00108 return MARK_UNSET;
00109 }
00110
00111
00112 redraw(MARK_UNSET, FALSE);
00113 if (newtop >= 1)
00114 {
00115 topline = newtop;
00116 }
00117 else
00118 {
00119 topline = 1L;
00120 }
00121 redrawrange(0L, INFINITY, INFINITY);
00122
00123
00124 return m;
00125 }
00126
00127
00128
00129
00130
00131
00132
00133 MARK m_scroll(m, cnt, key)
00134 MARK m;
00135 long cnt;
00136 int key;
00137 {
00138 MARK tmp;
00139
00140
00141 switch (key)
00142 {
00143 case ctrl('F'):
00144 case ctrl('B'):
00145 DEFAULT(1);
00146 redrawrange(0L, INFINITY, INFINITY);
00147 cnt = cnt * (LINES - 1) - 2;
00148 break;
00149
00150 case ctrl('E'):
00151 case ctrl('Y'):
00152 DEFAULT(1);
00153 break;
00154
00155 case ctrl('U'):
00156 case ctrl('D'):
00157 if (cnt == 0)
00158 {
00159 cnt = *o_scroll;
00160 }
00161 else
00162 {
00163 if (cnt > LINES - 1)
00164 {
00165 cnt = LINES - 1;
00166 }
00167 *o_scroll = cnt;
00168 }
00169 break;
00170 }
00171
00172
00173 switch (key)
00174 {
00175 case ctrl('B'):
00176 case ctrl('Y'):
00177 case ctrl('U'):
00178 cnt = topline - cnt;
00179 if (cnt < 1L)
00180 {
00181 cnt = 1L;
00182 m = MARK_FIRST;
00183 }
00184 tmp = MARK_AT_LINE(cnt) + markidx(m);
00185 redraw(tmp, FALSE);
00186 if (markline(m) > botline)
00187 {
00188 m = MARK_AT_LINE(botline);
00189 }
00190 break;
00191
00192 case ctrl('F'):
00193 case ctrl('E'):
00194 case ctrl('D'):
00195 cnt = botline + cnt;
00196 if (cnt > nlines)
00197 {
00198 cnt = nlines;
00199 m = MARK_LAST;
00200 }
00201 tmp = MARK_AT_LINE(cnt) + markidx(m);
00202 redraw(tmp, FALSE);
00203 if (markline(m) < topline)
00204 {
00205 m = MARK_AT_LINE(topline);
00206 }
00207 break;
00208 }
00209
00210 return m;
00211 }