vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit a073b008c1e6f90eac9b5a82227f77ebedde0576 parent eaf98a2af2bd9650aaed6f7bbc6ff30c75141e31 Author: Matthias Braun <matze@braunis.de> Date: Sat, 3 Jan 2015 03:30:46 -0800 Add the :x(it)? command Diffstat:
| M | config.def.h | | | 1 | + |
| M | vis.c | | | 11 | +++++++++++ |
2 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/config.def.h b/config.def.h @@ -63,6 +63,7 @@ static Command cmds[] = { { "^v(split)?$", cmd_vsplit, false }, { "^wq!?$", cmd_wq, false }, { "^w(rite)?$", cmd_write, false }, + { "^x(it)?!?$", cmd_xit, false }, { /* array terminator */ }, }; diff --git a/vis.c b/vis.c @@ -509,6 +509,8 @@ static bool cmd_new(Filerange*, const char *argv[]); static bool cmd_vnew(Filerange*, const char *argv[]); /* save the file displayed in the current window and close it */ static bool cmd_wq(Filerange*, const char *argv[]); +/* save the file displayed in the current window if it was changed, then close the window */ +static bool cmd_xit(Filerange*, const char *argv[]); /* save the file displayed in the current window to the name given. * do not change internal filname association. further :w commands * without arguments will still write to the old filename */ @@ -1380,6 +1382,15 @@ static bool cmd_quit(Filerange *range, const char *argv[]) { return true; } +static bool cmd_xit(Filerange *range, const char *argv[]) { + if (text_modified(vis->win->text) && !cmd_write(range, argv)) { + bool force = strchr(argv[0], '!') != NULL; + if (!force) + return false; + } + return cmd_quit(range, argv); +} + static bool cmd_bdelete(Filerange *range, const char *argv[]) { bool force = strchr(argv[0], '!') != NULL; Text *txt = vis->win->text;