aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt1
-rw-r--r--common/common.h1
-rw-r--r--common/log.c23
-rw-r--r--common/mem.h12
-rw-r--r--common/options.c4
-rw-r--r--man/vi.151
-rw-r--r--vi/vs_refresh.c15
7 files changed, 60 insertions, 47 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0c935b3c2a19..9451eaa89799 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -37,7 +37,6 @@ if (NOT APPLE)
endif()
add_compile_options($<$<CONFIG:Release>:-Wuninitialized>)
add_compile_options($<$<CONFIG:Release>:-Wno-dangling-else>)
-add_compile_options(-Wno-string-compare)
add_compile_options(-Wstack-protector -fstack-protector)
add_compile_options(-Wstrict-aliasing -fstrict-aliasing)
diff --git a/common/common.h b/common/common.h
index 45f22fb49d1b..fd97a4655cf5 100644
--- a/common/common.h
+++ b/common/common.h
@@ -17,6 +17,7 @@
#include <db.h>
#endif
#include <regex.h> /* May refer to the bundled regex. */
+#include <stdint.h>
/*
* Forward structure declarations. Not pretty, but the include files
diff --git a/common/log.c b/common/log.c
index 96b246efad02..7aad94d7e74a 100644
--- a/common/log.c
+++ b/common/log.c
@@ -18,7 +18,6 @@
#include <fcntl.h>
#include <libgen.h>
#include <limits.h>
-#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -706,30 +705,18 @@ apply_with(int (*db_func)(SCR *, recno_t, CHAR_T *, size_t), SCR *sp,
recno_t lno, u_char *p, size_t len)
{
#ifdef USE_WIDECHAR
- typedef unsigned long nword;
-
static size_t blen;
- static nword *bp;
- nword *lp = (nword *)((uintptr_t)p / sizeof(nword) * sizeof(nword));
-
- if (lp != (nword *)p) {
- int offl = ((uintptr_t)p - (uintptr_t)lp) << 3;
- int offr = (sizeof(nword) << 3) - offl;
- size_t i, cnt = (len + sizeof(nword) / 2) / sizeof(nword);
+ static u_char *bp;
+ if (!is_aligned(p, sizeof(unsigned long))) {
if (len > blen) {
blen = p2roundup(MAX(len, 512));
- REALLOC(sp, bp, nword *, blen);
+ REALLOC(sp, bp, u_char *, blen);
if (bp == NULL)
return (1);
}
- for (i = 0; i < cnt; ++i)
-#if BYTE_ORDER == BIG_ENDIAN
- bp[i] = (lp[i] << offl) ^ (lp[i+1] >> offr);
-#else
- bp[i] = (lp[i] >> offl) ^ (lp[i+1] << offr);
-#endif
- p = (u_char *)bp;
+ memmove(bp, p, len);
+ p = bp;
}
#endif
return db_func(sp, lno, (CHAR_T *)p, len / sizeof(CHAR_T));
diff --git a/common/mem.h b/common/mem.h
index d24ec0b50b09..0c83b70dec2f 100644
--- a/common/mem.h
+++ b/common/mem.h
@@ -212,6 +212,18 @@ p2roundup(size_t n)
return (n);
}
+/*
+ * is_aligned --
+ * Determine whether the program can safely read an object with an
+ * alignment requirement from ptr.
+ *
+ * See also: https://clang.llvm.org/docs/LanguageExtensions.html#alignment-builtins
+ */
+static __inline int
+is_aligned(void *ptr, size_t alignment) {
+ return ((uintptr_t)ptr % alignment) == 0;
+}
+
/* Additional TAILQ helper. */
#define TAILQ_ENTRY_ISVALID(elm, field) \
((elm)->field.tqe_prev != NULL)
diff --git a/common/options.c b/common/options.c
index c3d1f7343f9a..87d5c5a88521 100644
--- a/common/options.c
+++ b/common/options.c
@@ -181,6 +181,8 @@ OPTLIST const optlist[] = {
{L("shellmeta"), NULL, OPT_STR, 0},
/* O_SHIFTWIDTH 4BSD */
{L("shiftwidth"), NULL, OPT_NUM, OPT_NOZERO},
+/* O_SHOWFILENAME */
+ {L("showfilename"), NULL, OPT_0BOOL, 0},
/* O_SHOWMATCH 4BSD */
{L("showmatch"), NULL, OPT_0BOOL, 0},
/* O_SHOWMODE 4.4BSD */
@@ -317,7 +319,7 @@ opts_init(SCR *sp, int *oargs)
/* Set numeric and string default values. */
#define OI(indx, str) do { \
a.len = STRLEN(str); \
- if ((CHAR_T*)str != b2) /* GCC puts strings in text-space. */ \
+ if (STRCMP((CHAR_T*)str, b2) != 0) \
(void)MEMCPY(b2, str, a.len+1); \
if (opts_set(sp, argv, NULL)) { \
optindx = indx; \
diff --git a/man/vi.1 b/man/vi.1
index 0fa49224353f..596657319eee 100644
--- a/man/vi.1
+++ b/man/vi.1
@@ -12,11 +12,13 @@
.\" that you would have purchased it, or if any company wishes to
.\" redistribute it, contributions to the authors would be appreciated.
.\"
-.Dd November 2, 2013
+.Dd April 18, 2024
.Dt VI 1
.Os
.Sh NAME
-.Nm ex , vi , view
+.Nm ex ,
+.Nm vi ,
+.Nm view
.Nd text editors
.Sh SYNOPSIS
.Nm ex
@@ -302,7 +304,7 @@ Quit editing and leave
(if you've modified the file, but not saved your changes,
.Nm vi
will refuse to quit).
-.It Cm :q!
+.It Cm :q\&!
Quit, discarding any modifications that you may have made.
.El
.Pp
@@ -706,7 +708,7 @@ Execute the
.Nm ex
command being entered, or cancel it if it is only partial.
.Pp
-.It Aq Cm control-]
+.It Aq Cm control-\(rB
Push a tag reference onto the tag stack.
.Pp
.It Aq Cm control-\(ha
@@ -830,7 +832,7 @@ or
to the position of the cursor before the last of the following commands:
.Aq Cm control-A ,
.Aq Cm control-T ,
-.Aq Cm control-] ,
+.Aq Cm control-\(rB ,
.Cm % ,
.Cm \(aq ,
.Cm \` ,
@@ -1809,8 +1811,8 @@ Display buffers, Cscope connections, screens or tags.
.Op Ar +cmd
.Op Ar file
.Xc
-Edit a different file. The capitalized command opens a new screen below the
-current screen.
+Edit a different file.
+The capitalized command opens a new screen below the current screen.
.Pp
.It Xo
.Cm exu Ns Op Cm sage
@@ -1833,8 +1835,8 @@ Display and optionally change the file name.
.Xc
.Nm vi
mode only.
-Foreground the specified screen. The capitalized command opens a new screen
-below the current screen.
+Foreground the specified screen.
+The capitalized command opens a new screen below the current screen.
.Pp
.It Xo
.Op Ar range
@@ -1921,8 +1923,8 @@ Write the abbreviations, editor options and maps to the specified
.Op Cm !\&
.Op Ar
.Xc
-Edit the next file from the argument list. The capitalized command opens a
-new screen below the current screen.
+Edit the next file from the argument list.
+The capitalized command opens a new screen below the current screen.
.\" .Pp
.\" .It Xo
.\" .Op Ar line
@@ -1943,8 +1945,8 @@ option.
.Cm rev Ns Op Cm ious Ns
.Op Cm !\&
.Xc
-Edit the previous file from the argument list. The capitalized command opens
-a new screen below the current screen.
+Edit the previous file from the argument list.
+The capitalized command opens a new screen below the current screen.
.Pp
.It Xo
.Op Ar range
@@ -2107,8 +2109,8 @@ character is usually
.Op Cm !\&
.Ar tagstring
.Xc
-Edit the file containing the specified tag. The capitalized command opens a
-new screen below the current screen.
+Edit the file containing the specified tag.
+The capitalized command opens a new screen below the current screen.
.Pp
.It Xo
.Cm tagn Ns Op Cm ext Ns
@@ -2178,8 +2180,8 @@ Enter
.Op Ar file
.Xc
.Nm vi
-mode only. Edit a different file by opening a new screen below the current
-screen.
+mode only.
+Edit a different file by opening a new screen below the current screen.
.Pp
.It Xo
.Cm viu Ns Op Cm sage
@@ -2226,7 +2228,8 @@ Write the entire file, or
.Sq !\&
overwrites a different, preexisting file.
.Sq >>
-appends to a file that may preexist. Whitespace followed by
+appends to a file that may preexist.
+Whitespace followed by
.Sq !\&
pipes the file to
.Ar shell-command .
@@ -2479,7 +2482,7 @@ Set the number of lines about which the editor reports changes or yanks.
.It Cm ruler Bq off
.Nm vi
only.
-Display a row/column ruler on the colon command line.
+Display a row/column/percentage ruler on the colon command line.
.It Cm scroll , scr Bq "window size / 2"
Set the number of lines scrolled.
.It Cm searchincr Bq off
@@ -2505,6 +2508,10 @@ Set the meta characters checked to determine if file name expansion
is necessary.
.It Cm shiftwidth , sw Bq 8
Set the autoindent and shift command indentation width.
+.It Cm showfilename Bq off
+.Nm vi
+only.
+Display the file name on the colon command line.
.It Cm showmatch , sm Bq off
.Nm vi
only.
@@ -2773,10 +2780,8 @@ and \*(Gt0 if an error occurs.
.Xr ctags 1 ,
.Xr iconv 1 ,
.Xr re_format 7
-.Rs
-.%T vi/ex reference manual
-.%U https://docs.freebsd.org/44doc/usd/13.viref/paper.pdf
-.Re
+.Pp
+.Lk https://docs.freebsd.org/44doc/usd/13.viref/paper.pdf "Vi/Ex Reference Manual"
.Sh STANDARDS
.Nm nex Ns / Ns Nm nvi
is close to
diff --git a/vi/vs_refresh.c b/vi/vs_refresh.c
index b64ec7392cbb..406a89ad7d9d 100644
--- a/vi/vs_refresh.c
+++ b/vi/vs_refresh.c
@@ -774,7 +774,8 @@ vs_modeline(SCR *sp)
size_t cols, curcol, curlen, endpoint, len, midpoint;
const char *t = NULL;
int ellipsis;
- char buf[20];
+ char buf[30];
+ recno_t last;
gp = sp->gp;
@@ -795,7 +796,7 @@ vs_modeline(SCR *sp)
/* If more than one screen in the display, show the file name. */
curlen = 0;
- if (IS_SPLIT(sp)) {
+ if (IS_SPLIT(sp) || O_ISSET(sp, O_SHOWFILENAME)) {
CHAR_T *wp, *p;
size_t l;
@@ -846,8 +847,14 @@ vs_modeline(SCR *sp)
cols = sp->cols - 1;
if (O_ISSET(sp, O_RULER)) {
vs_column(sp, &curcol);
- len = snprintf(buf, sizeof(buf), "%lu,%lu",
- (u_long)sp->lno, (u_long)(curcol + 1));
+
+ if (db_last(sp, &last) || last == 0)
+ len = snprintf(buf, sizeof(buf), "%lu,%zu",
+ (u_long)sp->lno, curcol + 1);
+ else
+ len = snprintf(buf, sizeof(buf), "%lu,%zu %lu%%",
+ (u_long)sp->lno, curcol + 1,
+ (u_long)(sp->lno * 100) / last);
midpoint = (cols - ((len + 1) / 2)) / 2;
if (curlen < midpoint) {