Introduction
Introduction Statistics Contact Development Disclaimer Help
tex: alternate file - neatvi - [fork] simple vi-type editor with UTF-8 support
git clone git://src.adamsgaard.dk/neatvi
Log
Files
Refs
README
---
commit 6ec7a51894148a1051971d3b7628094f70cf2c9e
parent 24a8fe7457134dd4423c4700bf715077b5f26df4
Author: Ali Gholami Rudi <[email protected]>
Date: Thu, 14 May 2015 17:47:47 +0430
ex: alternate file
Diffstat:
M ex.c | 23 ++++++++++++++++++++---
M vi.c | 25 ++++++++++++++++---------
M vi.h | 7 +++++--
3 files changed, 41 insertions(+), 14 deletions(-)
---
diff --git a/ex.c b/ex.c
t@@ -191,15 +191,32 @@ static void ec_edit(char *ec)
char arg[EXLEN];
int fd;
ex_arg(ec, arg);
- fd = open(arg, O_RDONLY);
+ if (!strcmp(arg, "%") || !arg[0]) {
+ strcpy(arg, xpath);
+ } else if (!strcmp(arg, "#")) {
+ char xpath_tmp[PATHLEN];
+ int xrow_tmp = xrow;
+ strcpy(xpath_tmp, xpath_alt);
+ strcpy(xpath_alt, xpath);
+ strcpy(xpath, xpath_tmp);
+ xrow = xrow_alt;
+ xrow_alt = xrow_tmp;
+ xcol = 0;
+ xtop = 0;
+ } else {
+ strcpy(xpath_alt, xpath);
+ snprintf(xpath, PATHLEN, "%s", arg);
+ xrow_alt = xrow;
+ xrow = xvis ? 0 : 1 << 20;
+ }
+ fd = open(xpath, O_RDONLY);
lbuf_rm(xb, 0, lbuf_len(xb));
if (fd >= 0) {
lbuf_rd(xb, fd, 0);
close(fd);
}
- xrow = MAX(0, lbuf_len(xb) - 1);
+ xrow = MAX(0, MIN(xrow, lbuf_len(xb) - 1));
lbuf_undofree(xb);
- snprintf(xpath, PATHLEN, "%s", arg);
}
static void ec_read(char *ec)
diff --git a/vi.c b/vi.c
t@@ -12,11 +12,14 @@
#include <string.h>
#include "vi.h"
-char xpath[PATHLEN]; /* current file */
-struct lbuf *xb; /* current buffer */
-int xrow, xcol, xtop; /* current row, column, and top row */
-int xled = 1; /* use the line editor */
-int xdir = 'L'; /* current direction context */
+char xpath[PATHLEN]; /* current file */
+char xpath_alt[PATHLEN]; /* alternate file */
+struct lbuf *xb; /* current buffer */
+int xrow, xcol, xtop; /* current row, column, and top row */
+int xrow_alt; /* alternate row, column, and top row */
+int xled = 1; /* use the line editor */
+int xdir = 'L'; /* current direction context */
+int xvis; /* visual mode */
int xquit;
static char vi_findlast[256]; /* the last searched keyword */
static int vi_finddir; /* the last search direction */
t@@ -859,6 +862,10 @@ static void vi(void)
case TK_CTL('g'):
vi_status();
break;
+ case TK_CTL('^'):
+ ex_command("e #");
+ redraw = 1;
+ break;
case ':':
term_pos(xrows, led_pos(":", 0));
term_kill();
t@@ -978,24 +985,24 @@ static void vi(void)
int main(int argc, char *argv[])
{
- int visual = 1;
char ecmd[PATHLEN];
int i;
xb = lbuf_make();
+ xvis = 1;
for (i = 1; i < argc && argv[i][0] == '-'; i++) {
if (argv[i][1] == 's')
xled = 0;
if (argv[i][1] == 'e')
- visual = 0;
+ xvis = 0;
if (argv[i][1] == 'v')
- visual = 1;
+ xvis = 1;
}
dir_init();
if (i < argc) {
snprintf(ecmd, PATHLEN, "e %s", argv[i]);
ex_command(ecmd);
}
- if (visual)
+ if (xvis)
vi();
else
ex();
diff --git a/vi.h b/vi.h
t@@ -104,8 +104,8 @@ int term_read(int timeout);
void term_record(void);
void term_commit(void);
-#define TK_CTL(x) ((x) - 96)
-#define TK_ESC 27
+#define TK_CTL(x) ((x) & 037)
+#define TK_ESC (TK_CTL('['))
/* line-oriented input and output */
char *led_prompt(char *pref, char *post);
t@@ -119,11 +119,14 @@ void ex(void);
void ex_command(char *cmd);
/* global variables */
+extern int xvis;
extern struct lbuf *xb;
extern int xrow;
extern int xcol;
extern int xtop;
extern int xled;
+extern int xrow_alt;
extern char xpath[];
+extern char xpath_alt[];
extern int xquit;
extern int xdir;
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.