[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemacs-commit] qemacs dired.c extras.c qe.c qe.h
From: |
Charlie Gordon |
Subject: |
[Qemacs-commit] qemacs dired.c extras.c qe.c qe.h |
Date: |
Sat, 31 Dec 2016 06:12:17 -0500 (EST) |
CVSROOT: /sources/qemacs
Module name: qemacs
Changes by: Charlie Gordon <chqrlie> 16/12/31 06:12:17
Modified files:
. : dired.c extras.c qe.c qe.h
Log message:
dired: add filelist mode
- add `WF_FILELIST` window flag for preview-mode tests
- add `argval` argument to `do_dired()`
- `dired_view_file()` displays message and returns preview pane
- `dired` command with argument selects filelist mode with navigation
pane
bound to C-u C-x C-d
- add `filelist` command
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/dired.c?cvsroot=qemacs&r1=1.74&r2=1.75
http://cvs.savannah.gnu.org/viewcvs/qemacs/extras.c?cvsroot=qemacs&r1=1.50&r2=1.51
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.c?cvsroot=qemacs&r1=1.241&r2=1.242
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.h?cvsroot=qemacs&r1=1.231&r2=1.232
Patches:
Index: dired.c
===================================================================
RCS file: /sources/qemacs/qemacs/dired.c,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -b -r1.74 -r1.75
--- dired.c 27 Dec 2016 12:31:36 -0000 1.74
+++ dired.c 31 Dec 2016 11:12:16 -0000 1.75
@@ -1050,7 +1050,7 @@
}
}
-static void dired_view_file(EditState *s, const char *filename)
+static EditState *dired_view_file(EditState *s, const char *filename)
{
EditBuffer *b;
EditState *e;
@@ -1058,7 +1058,7 @@
e = find_window(s, KEY_RIGHT, NULL);
if (!e)
- return;
+ return NULL;
/* close previous temporary buffers, if any */
b = e->b;
@@ -1076,11 +1076,14 @@
/* disable wrapping to get nicer display */
/* XXX: should wrap lines unless window is narrow */
//e->wrap = WRAP_TRUNCATE; // causes bug on very long lines
+ put_status(e, "Previewing %s", filename);
+ return e;
} else {
/* if file failed to load, show a scratch buffer */
b = eb_new("*scratch*", BF_SAVELOG | BF_UTF8 | BF_PREVIEW);
eb_printf(b, "Cannot load file %s", filename);
switch_to_buffer(e, b);
+ return NULL;
}
}
@@ -1098,7 +1101,7 @@
if (s->b->flags & BF_PREVIEW) {
EditState *e = find_window(s, KEY_LEFT, NULL);
- if (e && (e->b->flags & BF_DIRED)) {
+ if (e && (e->flags & WF_FILELIST)) {
s->qe_state->active_window = e;
return;
}
@@ -1252,7 +1255,7 @@
/* open dired window on the left. The directory of the current file is
used */
-void do_dired(EditState *s)
+void do_dired(EditState *s, int argval)
{
QEmacsState *qs = s->qe_state;
EditBuffer *b;
@@ -1268,6 +1271,11 @@
* recursive listing and multi directory patterns.
*/
+ if (argval != NO_ARG) {
+ do_filelist(s, argval);
+ return;
+ }
+
/* Should reuse previous dired buffer for same filespec */
b = eb_scratch("*dired*", BF_READONLY | BF_UTF8);
@@ -1284,7 +1292,7 @@
eb_set_filename(b, filename);
width = qs->width / 5;
- e = insert_window_left(b, width, WF_MODELINE);
+ e = insert_window_left(b, width, WF_MODELINE | WF_FILELIST);
/* set dired mode: dired_mode_init() will load buffer content */
edit_set_mode(e, &dired_mode);
@@ -1355,11 +1363,13 @@
};
static CmdDef dired_global_commands[] = {
- CMD0( KEY_CTRLX(KEY_CTRL('d')), KEY_NONE,
- "dired", do_dired)
+ CMD2( KEY_CTRLX(KEY_CTRL('d')), KEY_NONE,
+ "dired", do_dired, ESi, "ui")
CMD_DEF_END,
};
+static int filelist_init(void);
+
static int dired_init(void)
{
/* inherit from list mode */
@@ -1381,6 +1391,114 @@
qe_register_cmd_table(dired_commands, &dired_mode);
qe_register_cmd_table(dired_global_commands, NULL);
+ filelist_init();
+
+ return 0;
+}
+
+/*---------------- filelist mode ----------------*/
+
+static char filelist_last_buf[MAX_FILENAME_SIZE];
+
+static ModeDef filelist_mode;
+
+static void filelist_display_hook(EditState *s)
+{
+ char buf[MAX_FILENAME_SIZE];
+ char dir[MAX_FILENAME_SIZE];
+ char filename[MAX_FILENAME_SIZE];
+ QEmacsState *qs = s->qe_state;
+ EditState *e;
+ int i, len, offset, target_line;
+
+ offset = eb_goto_bol(s->b, s->offset);
+ len = eb_fgets(s->b, buf, sizeof(buf), offset, &offset);
+ buf[len] = '\0';
+
+ if (s->x1 == 0 && s->y1 == 0 && s->width != qs->width
+ && *buf && !strequal(buf, filelist_last_buf)) {
+ /* open file so that user can see it before it is selected */
+ /* XXX: find a better solution (callback) */
+ pstrcpy(filelist_last_buf, sizeof(filelist_last_buf), buf);
+ get_default_path(s->b, offset, dir, sizeof(dir));
+ makepath(filename, sizeof(filename), dir, buf);
+ target_line = 0;
+ if (access(filename, R_OK)) {
+ for (i = 0; i < len; i++) {
+ if (buf[i] == ':' || buf[i] == *"()") {
+ buf[i] = '\0';
+ target_line = strtol(buf + i + 1, NULL, 10);
+ break;
+ }
+ }
+ if (*buf) {
+ makepath(filename, sizeof(filename), dir, buf);
+ }
+ }
+ if (!access(filename, R_OK)) {
+ e = dired_view_file(s, filename);
+ if (e) {
+ e->wrap = WRAP_TRUNCATE;
+ if (target_line > 0)
+ do_goto_line(e, target_line, 0);
+ }
+ } else {
+ put_status(s, "No access to %s", filename);
+ }
+ }
+}
+
+void do_filelist(EditState *s, int argval)
+{
+ QEmacsState *qs = s->qe_state;
+ EditState *e;
+
+ e = insert_window_left(s->b, qs->width / 5, WF_MODELINE | WF_FILELIST);
+ if (e != NULL) {
+ edit_set_mode(e, &filelist_mode);
+ e->wrap = WRAP_TRUNCATE;
+ filelist_last_buf[0] = '\0';
+ qs->active_window = e;
+ }
+}
+
+static int filelist_mode_init(EditState *s, EditBuffer *b, int flags)
+{
+ if (s) {
+ s->wrap = WRAP_TRUNCATE;
+ }
+ return 0;
+}
+
+static CmdDef filelist_commands[] = {
+ CMD0( KEY_RET, KEY_RIGHT,
+ "filelist-select", do_other_window)
+ CMD0( KEY_TAB, KEY_NONE,
+ "filelist-tab", do_other_window)
+ /* filelist-abort should restore previous buffer in right-window
+ * or at least exit preview mode */
+ CMD1( KEY_CTRL('g'), KEY_NONE,
+ "filelist-abort", do_delete_window, 0)
+ CMD_DEF_END,
+};
+
+static CmdDef filelist_global_commands[] = {
+ CMD2( KEY_NONE, KEY_NONE,
+ "filelist", do_filelist, ESi, "ui")
+ CMD_DEF_END,
+};
+
+static int filelist_init(void)
+{
+ memcpy(&filelist_mode, &text_mode, sizeof(ModeDef));
+ filelist_mode.name = "filelist";
+ filelist_mode.mode_name = NULL;
+ filelist_mode.mode_probe = NULL;
+ filelist_mode.mode_init = filelist_mode_init;
+ filelist_mode.display_hook = filelist_display_hook;
+ qe_register_mode(&filelist_mode, MODEF_VIEW);
+ qe_register_cmd_table(filelist_commands, &filelist_mode);
+ qe_register_cmd_table(filelist_global_commands, NULL);
return 0;
}
Index: extras.c
===================================================================
RCS file: /sources/qemacs/qemacs/extras.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -b -r1.50 -r1.51
--- extras.c 26 Dec 2016 15:01:58 -0000 1.50
+++ extras.c 31 Dec 2016 11:12:16 -0000 1.51
@@ -1266,12 +1266,13 @@
eb_printf(b1, "%*s: %d, %d\n", w, "xleft, ytop", s->xleft, s->ytop);
eb_printf(b1, "%*s: %d, %d\n", w, "width, height", s->width, s->height);
eb_printf(b1, "%*s: %d, %d, %d, %d\n", w, "x1, y1, x2, y2", s->x1, s->y1,
s->x2, s->y2);
- eb_printf(b1, "%*s: %#x %s%s%s%s%s\n", w, "flags", s->flags,
+ eb_printf(b1, "%*s: %#x %s%s%s%s%s%s\n", w, "flags", s->flags,
(s->flags & WF_POPUP) ? " POPUP" : "",
(s->flags & WF_MODELINE) ? " MODELINE" : "",
(s->flags & WF_RSEPARATOR) ? " RSEPARATOR" : "",
(s->flags & WF_POPLEFT) ? " POPLEFT" : "",
- (s->flags & WF_HIDDEN) ? " HIDDEN" : "");
+ (s->flags & WF_HIDDEN) ? " HIDDEN" : "",
+ (s->flags & WF_FILELIST) ? " FILELIST" : "");
eb_printf(b1, "%*s: %d\n", w, "offset", s->offset);
eb_printf(b1, "%*s: %d\n", w, "offset_top", s->offset_top);
eb_printf(b1, "%*s: %d\n", w, "offset_bottom", s->offset_bottom);
Index: qe.c
===================================================================
RCS file: /sources/qemacs/qemacs/qe.c,v
retrieving revision 1.241
retrieving revision 1.242
diff -u -b -r1.241 -r1.242
--- qe.c 27 Dec 2016 12:31:36 -0000 1.241
+++ qe.c 31 Dec 2016 11:12:16 -0000 1.242
@@ -984,7 +984,7 @@
#ifndef CONFIG_TINY
if (s->b->flags & BF_PREVIEW) {
EditState *e = find_window(s, KEY_LEFT, NULL);
- if (e && (e->b->flags & BF_DIRED)
+ if (e && (e->flags & WF_FILELIST)
&& dir < 0 && eb_at_bol(s->b, s->offset)) {
s->qe_state->active_window = e;
return;
@@ -8480,7 +8480,7 @@
#if !defined(CONFIG_TINY) && !defined(CONFIG_WIN32)
if (is_player && !session_loaded && (_optind >= argc ||
S_ISDIR(s->b->st_mode))) {
/* if player, go to directory mode by default if no file selected */
- do_dired(s);
+ do_dired(s, NO_ARG);
s = qs->active_window;
}
#endif
Index: qe.h
===================================================================
RCS file: /sources/qemacs/qemacs/qe.h,v
retrieving revision 1.231
retrieving revision 1.232
diff -u -b -r1.231 -r1.232
--- qe.h 27 Dec 2016 10:13:46 -0000 1.231
+++ qe.h 31 Dec 2016 11:12:16 -0000 1.232
@@ -1235,6 +1235,7 @@
#define WF_RSEPARATOR 0x0004 /* right window separator */
#define WF_POPLEFT 0x0008 /* left side window */
#define WF_HIDDEN 0x0010 /* hidden window, used for temporary changes */
+#define WF_FILELIST 0x1000 /* window is interactive file list */
OWNED char *prompt; /* optional window prompt, utf8 */
//const char *mode_line;
@@ -2100,7 +2101,8 @@
/* dired.c */
-void do_dired(EditState *s);
+void do_dired(EditState *s, int argval);
+void do_filelist(EditState *s, int argval);
/* syntax colorizers */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemacs-commit] qemacs dired.c extras.c qe.c qe.h,
Charlie Gordon <=