]> git.wh0rd.org Git - nano.git/commitdiff
Latest tab completion update, sort of works =)
authorChris Allegretta <chrisa@asty.org>
Tue, 14 Nov 2000 17:46:06 +0000 (17:46 +0000)
committerChris Allegretta <chrisa@asty.org>
Tue, 14 Nov 2000 17:46:06 +0000 (17:46 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@281 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

files.c
po/nano.pot
proto.h
winio.c

diff --git a/files.c b/files.c
index 4640119828008dd3484b37e41ffbe5aec88c9cd4..9afed0115212bbf2c032b2650e2c73635e2c36f5 100644 (file)
--- a/files.c
+++ b/files.c
@@ -551,10 +551,13 @@ char **cwd_tab_completion(char *buf, int *num_matches)
        tmp = buf + strlen(buf);
        while (*tmp != '/' && tmp != buf)
           tmp--;
-       strncpy(dirName, buf, tmp - buf);
-       dirName[tmp - buf] = 0;
+
        tmp++;
 
+       strncpy(dirName, buf, tmp - buf + 1);
+       dirName[tmp - buf] = 0;
+/*     tmp++; */
+
     } else {
        if ((dirName = getcwd(NULL, 0)) == NULL)
            return matches;
@@ -602,20 +605,21 @@ char **cwd_tab_completion(char *buf, int *num_matches)
     return (matches);
 }
 
-/* This function now return an int which refers to how much the 
+/* This function now has an arg which refers to how much the 
  * statusbar (place) should be advanced, i.e. the new cursor pos.
  */
-int input_tab(char *buf, int place, int lastWasTab)
+char *input_tab(char *buf, int place, int lastWasTab, int *newplace)
 {
     /* Do TAB completion */
     static int num_matches = 0, match_matches = 0;
     static char **matches = (char **) NULL;
-    int pos = place, newplace = 0, i = 0, col = 0, editline = 0;
+    int pos = place, i = 0, col = 0, editline = 0;
     int longestname = 0;
     char *foo;
+    struct stat fileinfo;
 
     if (lastWasTab == FALSE) {
-       char *tmp, *matchBuf;
+       char *tmp, *copyto, *matchBuf;
 
        /* For now, we will not bother with trying to distinguish
         * whether the cursor is in/at a command extression -- we
@@ -636,6 +640,8 @@ int input_tab(char *buf, int place, int lastWasTab)
 
        /* Free up any memory already allocated */
        if (matches != NULL) {
+           for (i = i; i < num_matches; i++)
+               free(matches[i]);
            free(matches);
            matches = (char **) NULL;
            num_matches = 0;
@@ -656,22 +662,80 @@ int input_tab(char *buf, int place, int lastWasTab)
        /* Don't leak memory */
        free(matchBuf);
 
+#ifdef DEBUG
+       fprintf(stderr, "%d matches found...\n", num_matches);
+#endif
        /* Did we find exactly one match? */
        switch(num_matches) {
        case 0:
            blank_edit();
            break;
        case 1:
-           buf = nrealloc(buf, strlen(buf) + strlen(matches[0]) - pos + 1);
+
+           buf = nrealloc(buf, strlen(buf) + strlen(matches[0]) + 1);
+
+           if (strcmp(buf, "") && strstr(buf, "/")) {
+               for (tmp = buf + strlen(buf); *tmp != '/' && tmp != buf; tmp--)
+                   ;
+               tmp++;
+           }
+           else
+               tmp = buf;
+
+           if (!strcmp(tmp, matches[0])) {
+
+               /* Is it a directory? */
+               if (stat(buf, &fileinfo) == -1)
+                       break;
+               else if (S_ISDIR(fileinfo.st_mode)) {
+                       strncat(buf, "/", 1);
+                       *newplace += 1;
+               }
+               break;
+           }
+
+           copyto = tmp;
+           for (pos = 0; *tmp == matches[0][pos] && 
+                       pos <= strlen(matches[0]); pos++)
+               tmp++;
+
+
+#ifdef DEBUG
+           fprintf(stderr, "buf = \'%s\'\n", buf);
+/*         fprintf(stderr, "copyto = \'%s\'\n", copyto); */
+           fprintf(stderr, "matches[0] = \'%s\'\n", matches[0]);
+           fprintf(stderr, "pos = %d\n", pos);
+           fflush(stderr);
+#endif
+
            /* write out the matched command */
-           strncpy(buf + pos, matches[0] + pos,
-                   strlen(matches[0]) - pos);
-           newplace += strlen(matches[0]) - pos;
+           strncpy(copyto, matches[0],  strlen(matches[0]) + 1);
+           *newplace += strlen(matches[0]) - pos;
+
+               if (stat(buf, &fileinfo) == -1)
+                   ;
+               else if (S_ISDIR(fileinfo.st_mode)) {
+                       strncat(buf, "/", 1);
+                       *newplace += 1;
+               }
+
            break;
        default:
            /* Check to see if all matches share a beginning, and if so
                tack it onto buf and then beep */
 
+           if (strcmp(buf, "") && strstr(buf, "/")) {
+               for (tmp = buf + strlen(buf); *tmp != '/' && tmp != buf; tmp--)
+                   ;
+               tmp++;
+           }
+           else
+               tmp = buf;
+
+           for (pos = 0; *tmp == matches[0][pos] && *tmp != 0 &&
+                       pos <= strlen(matches[0]); pos++)
+               tmp++;
+
            while (1) {
                match_matches = 0;
 
@@ -686,8 +750,8 @@ int input_tab(char *buf, int place, int lastWasTab)
                    /* All the matches have the same character at pos+1,
                        so paste it into buf... */
                    buf = nrealloc(buf, strlen(buf) + 2);
-                   strncpy(buf + pos, matches[0] + pos, 1);
-                   newplace++;
+                   strncat(buf, matches[0] + pos, 1);
+                   *newplace += 1;
                    pos++;
                } else {
                    beep();
@@ -728,6 +792,8 @@ int input_tab(char *buf, int place, int lastWasTab)
 
                strcat(foo, "  ");
 
+               /* Disable el cursor */
+               curs_set(0);
                /* now, put the match on the screen */
                waddnstr(edit, foo, strlen(foo));
                col += strlen(foo);
@@ -752,5 +818,6 @@ int input_tab(char *buf, int place, int lastWasTab)
     }
 
     edit_refresh();
-    return newplace;
+    curs_set(1);
+    return buf;
 }
index b07f124ad91e3dfec07d657b20c86f2f90fa6f1e..b761475e11f39f6ec19ca1cc70c60aeeb4a76f7e 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-11-09 23:23-0500\n"
+"POT-Creation-Date: 2000-11-13 23:13-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -107,7 +107,7 @@ msgstr ""
 msgid "File exists, OVERWRITE ?"
 msgstr ""
 
-#: files.c:741
+#: files.c:807
 msgid "(more)"
 msgstr ""
 
@@ -384,7 +384,7 @@ msgid "Case Sens"
 msgstr ""
 
 #: global.c:344 global.c:364 global.c:375 global.c:385 global.c:401
-#: global.c:405 global.c:411 winio.c:1008
+#: global.c:405 global.c:411 winio.c:1011
 msgid "Cancel"
 msgstr ""
 
@@ -773,41 +773,41 @@ msgstr ""
 msgid "Replaced 1 occurence"
 msgstr ""
 
-#: search.c:443 search.c:536 search.c:552
+#: search.c:443 search.c:538 search.c:554
 msgid "Replace Cancelled"
 msgstr ""
 
-#: search.c:486
+#: search.c:488
 msgid "Replace this instance?"
 msgstr ""
 
-#: search.c:494
+#: search.c:496
 msgid "Replace failed: unknown subexpression!"
 msgstr ""
 
-#: search.c:569
+#: search.c:571
 #, c-format
 msgid "Replace with [%s]"
 msgstr ""
 
-#: search.c:573 search.c:577
+#: search.c:575 search.c:579
 msgid "Replace with"
 msgstr ""
 
 #. Ask for it
-#: search.c:612
+#: search.c:614
 msgid "Enter line number"
 msgstr ""
 
-#: search.c:614
+#: search.c:616
 msgid "Aborted"
 msgstr ""
 
-#: search.c:634
+#: search.c:636
 msgid "Come on, be reasonable"
 msgstr ""
 
-#: search.c:639
+#: search.c:641
 #, c-format
 msgid "Only %d lines available, skipping to last line"
 msgstr ""
@@ -817,67 +817,67 @@ msgstr ""
 msgid "actual_x_from_start for xplus=%d returned %d\n"
 msgstr ""
 
-#: winio.c:421
+#: winio.c:424
 #, c-format
 msgid "input '%c' (%d)\n"
 msgstr ""
 
-#: winio.c:459
+#: winio.c:462
 msgid "New Buffer"
 msgstr ""
 
-#: winio.c:462
+#: winio.c:465
 msgid "  File: ..."
 msgstr ""
 
-#: winio.c:470
+#: winio.c:473
 msgid "Modified"
 msgstr ""
 
-#: winio.c:922
+#: winio.c:925
 #, c-format
 msgid "Moved to (%d, %d) in edit buffer\n"
 msgstr ""
 
-#: winio.c:933
+#: winio.c:936
 #, c-format
 msgid "current->data = \"%s\"\n"
 msgstr ""
 
-#: winio.c:978
+#: winio.c:981
 #, c-format
 msgid "I got \"%s\"\n"
 msgstr ""
 
-#: winio.c:1003
+#: winio.c:1006
 msgid "Yes"
 msgstr ""
 
-#: winio.c:1005
+#: winio.c:1008
 msgid "All"
 msgstr ""
 
-#: winio.c:1007
+#: winio.c:1010
 msgid "No"
 msgstr ""
 
-#: winio.c:1144
+#: winio.c:1147
 #, c-format
 msgid "do_cursorpos: linepct = %f, bytepct = %f\n"
 msgstr ""
 
-#: winio.c:1148
+#: winio.c:1151
 msgid "line %d of %d (%.0f%%), character %d of %d (%.0f%%)"
 msgstr ""
 
-#: winio.c:1276
+#: winio.c:1279
 msgid "Dumping file buffer to stderr...\n"
 msgstr ""
 
-#: winio.c:1278
+#: winio.c:1281
 msgid "Dumping cutbuffer to stderr...\n"
 msgstr ""
 
-#: winio.c:1280
+#: winio.c:1283
 msgid "Dumping a buffer to stderr...\n"
 msgstr ""
diff --git a/proto.h b/proto.h
index ced01509333b60eab26827f9d6ae09f9c3f559cb..55691dda38dc582a9b5ec2c2214a385f1a6d145b 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -88,7 +88,7 @@ int do_down(void);
 int do_left(void);
 int do_right(void);
 int check_wildcard_match(const char *text, const char *pattern);
-int input_tab(char *buf, int place, int lastWasTab);
+char *input_tab(char *buf, int place, int lastWasTab, int *newplace);
 
 void shortcut_init(void);
 void lowercase(char *src);
diff --git a/winio.c b/winio.c
index db8902c45d21e11ec70f20951ebc49476c5dfe83..8e78e4c711c7a65b6fd8582d26e72fddf970b1c5 100644 (file)
--- a/winio.c
+++ b/winio.c
@@ -248,7 +248,7 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut s[], int slen,
               int start_x)
 {
     int kbinput = 0, j = 0, x = 0, xend;
-    int x_left = 0, inputlen, tabbed = 0;
+    int x_left = 0, inputlen, tabbed = 0, shift = 0;
     char *inputbuf;
     
     inputbuf = nmalloc(strlen(def) + 1);
@@ -332,7 +332,10 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut s[], int slen,
        case NANO_CONTROL_I:
            if (allowtabs) {
                tabbed++;
-               x += input_tab(inputbuf, (x - x_left), tabbed - 1);
+               shift = 0;
+               inputbuf = input_tab(inputbuf, (x - x_left), 
+                               tabbed - 1, &shift);
+               x += shift;
                nanoget_repaint(buf, inputbuf, x);
                tabbed = 1;
            }