vi: introduce FEATURE_VI_8BIT (as vi currently is not Unicode capable,

people may want to disable display of high-bit chars)
ip: build fixlet
This commit is contained in:
Denis Vlasenko 2007-12-22 17:00:11 +00:00
parent 94e3365b8f
commit e3cbfb91d2
3 changed files with 53 additions and 24 deletions

View File

@ -98,6 +98,16 @@ config FEATURE_VI_MAX_LEN
Contrary to what you may think, this is not eating much. Contrary to what you may think, this is not eating much.
Make it smaller than 4k only if you are very limited on memory. Make it smaller than 4k only if you are very limited on memory.
config FEATURE_VI_8BIT
bool "Allow vi to display 8-bit chars (otherwise shows dots)"
default y
depends on VI
help
If your terminal can display characters with high bit set,
you may want to enable this. Note: vi is not Unicode-capable.
If your terminal combines several 8-bit bytes into one character
(as in Unicode mode), this will not work properly.
config FEATURE_VI_COLON config FEATURE_VI_COLON
bool "Enable \":\" colon commands (no \"ex\" mode)" bool "Enable \":\" colon commands (no \"ex\" mode)"
default y default y

View File

@ -25,13 +25,27 @@
#define ENABLE_FEATURE_VI_CRASHME 0 #define ENABLE_FEATURE_VI_CRASHME 0
#if ENABLE_LOCALE_SUPPORT #if ENABLE_LOCALE_SUPPORT
#define Isprint(c) isprint((c))
#if ENABLE_FEATURE_VI_8BIT
#define Isprint(c) isprint(c)
#else #else
/* 0x9b is Meta-ESC */ #define Isprint(c) (isprint(c) && (unsigned char)(c) < 0x7f)
#define Isprint(c) ((unsigned char)(c) >= ' ' && (c) != 0x7f && (unsigned char)(c) != 0x9b)
#endif #endif
#else
/* 0x9b is Meta-ESC */
#if ENABLE_FEATURE_VI_8BIT
#define Isprint(c) ((unsigned char)(c) >= ' ' && (c) != 0x7f && (unsigned char)(c) != 0x9b)
#else
#define Isprint(c) ((unsigned char)(c) >= ' ' && (unsigned char)(c) < 0x7f)
#endif
#endif
enum { enum {
MAX_TABSTOP = 32, // sanity limit MAX_TABSTOP = 32, // sanity limit
// User input len. Need not be extra big. // User input len. Need not be extra big.
@ -1162,7 +1176,7 @@ static int next_tabstop(int col)
} }
//----- Synchronize the cursor to Dot -------------------------- //----- Synchronize the cursor to Dot --------------------------
static void sync_cursor(char * d, int *row, int *col) static void sync_cursor(char *d, int *row, int *col)
{ {
char *beg_cur; // begin and end of "d" line char *beg_cur; // begin and end of "d" line
char *end_scr; // begin and end of screen char *end_scr; // begin and end of screen
@ -1209,19 +1223,22 @@ static void sync_cursor(char * d, int *row, int *col)
// find out what col "d" is on // find out what col "d" is on
co = 0; co = 0;
do { // drive "co" to correct column while (tp < d) { // drive "co" to correct column
if (*tp == '\n') //vda || *tp == '\0') if (*tp == '\n') //vda || *tp == '\0')
break; break;
if (*tp == '\t') { if (*tp == '\t') {
if (d == tp && cmd_mode) { /* handle tabs like real vi */ // handle tabs like real vi
if (d == tp && cmd_mode) {
break; break;
} else { } else {
co = next_tabstop(co); co = next_tabstop(co);
} }
} else if (*tp < ' ' || *tp == 127) { } else if ((unsigned char)*tp < ' ' || *tp == 0x7f) {
co++; // display as ^X, use 2 columns co++; // display as ^X, use 2 columns
} }
} while (tp++ < d && ++co); co++;
tp++;
}
// "co" is the column where "dot" is. // "co" is the column where "dot" is.
// The screen has "columns" columns. // The screen has "columns" columns.
@ -1367,15 +1384,17 @@ static char *move_to_col(char *p, int l)
p = begin_line(p); p = begin_line(p);
co = 0; co = 0;
do { while (co < l && p < end) {
if (*p == '\n') //vda || *p == '\0') if (*p == '\n') //vda || *p == '\0')
break; break;
if (*p == '\t') { if (*p == '\t') {
co = next_tabstop(co); co = next_tabstop(co);
} else if (*p < ' ' || *p == 127) { } else if (*p < ' ' || *p == 127) {
co++; // display as ^X, use 2 columns co++; // display as ^X, use 2 columns
} }
} while (++co <= l && p++ < end); co++;
p++;
}
return p; return p;
} }
@ -2081,6 +2100,7 @@ static void cookmode(void)
#if ENABLE_FEATURE_VI_USE_SIGNALS #if ENABLE_FEATURE_VI_USE_SIGNALS
static void winch_sig(int sig ATTRIBUTE_UNUSED) static void winch_sig(int sig ATTRIBUTE_UNUSED)
{ {
// FIXME: do it in main loop!!!
signal(SIGWINCH, winch_sig); signal(SIGWINCH, winch_sig);
if (ENABLE_FEATURE_VI_WIN_RESIZE) { if (ENABLE_FEATURE_VI_WIN_RESIZE) {
get_terminal_width_height(0, &columns, &rows); get_terminal_width_height(0, &columns, &rows);
@ -2735,11 +2755,9 @@ static void redraw(int full_screen)
} }
//----- Format a text[] line into a buffer --------------------- //----- Format a text[] line into a buffer ---------------------
// Returns number of leading chars which should be ignored
// (return value is always <= offset)
static char* format_line(char *src, int li) static char* format_line(char *src, int li)
{ {
char c; unsigned char c;
int co; int co;
int ofs = offset; int ofs = offset;
char *dest = scr_out_buf; // [MAX_SCR_COLS + MAX_TABSTOP * 2] char *dest = scr_out_buf; // [MAX_SCR_COLS + MAX_TABSTOP * 2]
@ -2747,8 +2765,8 @@ static char* format_line(char *src, int li)
memset(dest, ' ', MAX_SCR_COLS + MAX_TABSTOP * 2); memset(dest, ' ', MAX_SCR_COLS + MAX_TABSTOP * 2);
c = '~'; // char in col 0 in non-existent lines is '~' c = '~'; // char in col 0 in non-existent lines is '~'
for (co = 0; co < MAX_SCR_COLS + MAX_TABSTOP; co++) { for (co = 0; co < columns + MAX_TABSTOP; co++) {
// are there chars in text[] and have we gone past the end // have we gone past the end?
if (src < end) { if (src < end) {
c = *src++; c = *src++;
if (c == '\n') if (c == '\n')
@ -2756,7 +2774,7 @@ static char* format_line(char *src, int li)
if ((c & 0x80) && !Isprint(c)) { if ((c & 0x80) && !Isprint(c)) {
c = '.'; c = '.';
} }
if ((unsigned char)c < ' ' || c == 0x7f) { if (c < ' ' || c == 0x7f) {
if (c == '\t') { if (c == '\t') {
c = ' '; c = ' ';
// co % 8 != 7 // co % 8 != 7
@ -2907,14 +2925,15 @@ static void refresh(int full_screen)
//----- Execute a Vi Command ----------------------------------- //----- Execute a Vi Command -----------------------------------
static void do_cmd(char c) static void do_cmd(char c)
{ {
const char *msg; const char *msg = msg; // for compiler
char c1, *p, *q, *save_dot; char c1, *p, *q, *save_dot;
char buf[12]; char buf[12];
int cnt, i, j, dir, yf; int dir = dir; // for compiler
int cnt, i, j, yf;
// c1 = c; // quiet the compiler // c1 = c; // quiet the compiler
// cnt = yf = dir = 0; // quiet the compiler // cnt = yf = 0; // quiet the compiler
// msg = p = q = save_dot = buf; // quiet the compiler // msg = p = q = save_dot = buf; // quiet the compiler
memset(buf, '\0', 12); memset(buf, '\0', 12);
show_status_line(); show_status_line();

View File

@ -90,7 +90,7 @@ int ip_main(int argc, char **argv)
USE_FEATURE_IP_RULE(IP_rule,) USE_FEATURE_IP_RULE(IP_rule,)
IP_none IP_none
}; };
int (*ip_func)(char **argv) = ip_print_help; int (*ip_func)(char**) = ip_print_help;
argv = ip_parse_common_args(argv + 1); argv = ip_parse_common_args(argv + 1);
if (*argv) { if (*argv) {