Remove tab width constraints, was [2, 4, 8], now [1...

This commit is contained in:
Renaud 2016-02-24 13:22:54 +08:00
parent 3e27fcf19e
commit c390cf2a3e
7 changed files with 77 additions and 62 deletions

View File

@ -51,13 +51,14 @@ static unsigned getgoal( struct line *dlp) {
/* Take tabs, ^X and \xx hex characters into account */
if( c == '\t')
col |= tabmask ;
col += tabwidth - col % tabwidth ;
else if( c < 0x20 || c == 0x7F)
col += 1 ;
else if( c >= 0x80 && c <= 0xA0)
col += 2 ;
else if( c >= 0x80 && c <= 0xA0)
col += 3 ;
else
col += 1 ;
col += 1 ;
if( col > curgoal)
break ;

View File

@ -210,8 +210,9 @@ static void vtputc(int c)
if (c == '\t') {
do {
vtputc(' ');
} while (((vtcol + taboff) & tabmask) != 0);
return;
} while( ((vtcol + taboff) % tabwidth) != 0) ;
return ;
}
if (c < 0x20) {
@ -580,13 +581,13 @@ void updpos(void)
i += utf8_to_unicode( lp->l_text, i, curwp->w_doto, &c) ;
if( c == '\t')
curcol |= tabmask ;
curcol += tabwidth - curcol % tabwidth ;
else if( c < 0x20 || c == 0x7F)
curcol += 1 ; /* displayed as ^c */
curcol += 2 ; /* displayed as ^c */
else if( c >= 0x80 && c <= 0xA0)
curcol += 2 ; /* displayed as \xx */
++curcol;
curcol += 3 ; /* displayed as \xx */
else
curcol += 1 ;
}
/* if extended, flag so and update the virtual line image */

13
eval.c
View File

@ -734,7 +734,7 @@ static char *gtenv( char *vname) {
case EVRVAL:
return i_to_a(rval);
case EVTAB:
return i_to_a(tabmask + 1);
return i_to_a( tabwidth) ;
case EVOVERLAP:
return i_to_a(overlap);
case EVSCROLLCOUNT:
@ -1049,10 +1049,13 @@ static int svar(struct variable_description *var, char *value)
case EVRVAL:
break;
case EVTAB:
tabmask = atoi(value) - 1;
if( tabmask != 0x07 && tabmask != 0x03 && tabmask != 1)
tabmask = 0x07;
curwp->w_flag |= WFHARD;
c = atoi( value) ;
if( c > 0) {
tabwidth = c ;
curwp->w_flag |= WFHARD;
} else
status = FALSE ;
break;
case EVOVERLAP:
overlap = atoi(value);

View File

@ -70,7 +70,7 @@ int execute(int c, int f, int n)
if (curwp->w_bufp->b_mode & MDOVER &&
curwp->w_doto < curwp->w_dotp->l_used &&
(lgetc(curwp->w_dotp, curwp->w_doto) != '\t' ||
((curwp->w_doto) & tabmask) == tabmask))
((curwp->w_doto) % tabwidth) == (tabwidth - 1)))
ldelchar(1, FALSE);
/* do the appropriate insertion */

18
line.c
View File

@ -26,7 +26,7 @@
#include "window.h"
int tabmask = 0x07 ; /* tabulator mask */
int tabwidth = 8 ; /* column span of a tab */
#define BLOCK_SIZE 16 /* Line block chunk size. */
@ -418,13 +418,15 @@ int linsert( int n, unicode_t c) {
*
* int c; character to overwrite on current position
*/
static int lowrite(int c)
{
if (curwp->w_doto < curwp->w_dotp->l_used &&
(lgetc(curwp->w_dotp, curwp->w_doto) != '\t' ||
((curwp->w_doto) & tabmask) == tabmask))
ldelchar(1, FALSE);
return linsert(1, c);
static int lowrite( int c) {
if( curwp->w_doto < curwp->w_dotp->l_used
&& (
lgetc(curwp->w_dotp, curwp->w_doto) != '\t' ||
((curwp->w_doto) % tabwidth) == (tabwidth - 1)
))
ldelchar( 1, FALSE) ;
return linsert( 1, c) ;
}
/*

2
line.h
View File

@ -28,7 +28,7 @@ struct line {
#define lputc(lp, n, c) ((lp)->l_text[(n)]=(c))
#define llength(lp) ((lp)->l_used)
extern int tabmask ;
extern int tabwidth ;
char *getkill( void) ;

View File

@ -179,12 +179,13 @@ int getccol(int bflg)
if( bflg && c != ' ' && c != '\t') /* Request Stop at first non-blank */
break;
if (c == '\t')
col |= tabmask;
col += tabwidth - col % tabwidth ;
else if (c < 0x20 || c == 0x7F) /* displayed as ^c */
++col;
col += 2 ;
else if (c >= 0x80 && c <= 0xa0) /* displayed as \xx */
col += 2;
++col;
col += 3 ;
else
col += 1 ;
}
return col;
}
@ -213,10 +214,11 @@ int setccol(int pos)
/* advance one character */
c = lgetc(curwp->w_dotp, i);
if (c == '\t')
col |= tabmask;
col += tabwidth - col % tabwidth ;
else if (c < 0x20 || c == 0x7F)
++col;
++col;
col += 2 ;
else
col += 1 ;
}
/* set us at the new position */
@ -329,10 +331,9 @@ int detab(int f, int n)
/* if we have a tab */
if (lgetc(curwp->w_dotp, curwp->w_doto) == '\t') {
ldelchar(1, FALSE);
insspace(TRUE,
(tabmask + 1) -
(curwp->w_doto & tabmask));
insspace( TRUE, tabwidth - curwp->w_doto % tabwidth);
}
forwchar(FALSE, 1);
}
@ -353,7 +354,7 @@ int detab(int f, int n)
*/
int entab(int f, int n)
{
#define nextab(a) (a & ~tabmask) + (tabmask+1)
#define nextab(a) (a + tabwidth - a % tabwidth)
int inc; /* increment to next line [sgn(n)] */
int fspace; /* pointer to first space if in a run */
@ -759,38 +760,45 @@ int deblank(int f, int n)
/*
* Insert a newline, then enough tabs and spaces to duplicate the indentation
* of the previous line. Assumes tabs are every eight characters. Quite simple.
* of the previous line. Assumes tabs are every tabwidth characters.
* Figure out the indentation of the current line. Insert a newline by calling
* the standard routine. Insert the indentation by inserting the right number
* of tabs and spaces. Return TRUE if all ok. Return FALSE if one of the
* subcomands failed. Normally bound to "C-J".
*/
int indent(int f, int n)
{
int nicol;
int c;
int i;
int indent( int f, int n) {
int nicol ;
int i ;
if (curbp->b_mode & MDVIEW) /* don't allow this command if */
return rdonly(); /* we are in read only mode */
if (n < 0)
return FALSE;
while (n--) {
nicol = 0;
for (i = 0; i < llength(curwp->w_dotp); ++i) {
c = lgetc(curwp->w_dotp, i);
if (c != ' ' && c != '\t')
break;
if (c == '\t')
nicol |= tabmask;
++nicol;
}
if (lnewline() == FALSE
|| ((i = nicol / 8) != 0 && linsert(i, '\t') == FALSE)
|| ((i = nicol % 8) != 0 && linsert(i, ' ') == FALSE))
return FALSE;
if( curbp->b_mode & MDVIEW) /* don't allow this command if */
return rdonly() ; /* we are in read only mode */
if( n < 0)
return FALSE ;
/* number of columns to indent */
nicol = 0 ;
for( i = 0 ; i < llength( curwp->w_dotp) ; i += 1) {
int c ;
c = lgetc( curwp->w_dotp, i) ;
if( c == '\t')
nicol += tabwidth - nicol % tabwidth ;
else if( c == ' ')
nicol += 1 ;
else
break ;
}
return TRUE;
i = nicol / tabwidth ; /* # of tab to insert */
nicol %= tabwidth ; /* # of space to insert */
while( n--)
if( lnewline() == FALSE
|| ( i != 0 && linsert( i, '\t') == FALSE)
|| ( nicol != 0 && linsert( nicol, ' ') == FALSE))
return FALSE ;
return TRUE ;
}
/*