qemacs-commit
[Top][All Lists]
Advanced

[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 */
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]