* Tomas Styblo <[EMAIL PROTECTED]> [Mon, 25 Nov 2002]:
> * Andrew V. Samoilov <[EMAIL PROTECTED]> [Mon, 25 Nov 2002]:
> > >Here is a patch which adds a new configuration option:
> > >
> > >    history_show_duplicates
> > >
> > >The option specifies whether the history panels will show
> > >duplicate entries more than once. 
> > 
> > Maybe it will be more consistent to use HISTCONTROL environment variable?
> 
> It's in fact a very good idea. I'll provide the new patch in a few
> days.

Here is the new patch. It allows the user to set the HISTCONTROL
environment variable to a value of "ignoredups" if he wants to
have only unique entries in history widgets.

-- 
Tomas Styblo <[EMAIL PROTECTED]>
PGP: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xC97EA4B6
"People demand freedom of speech as a compensation for
 the freedom of thought which they seldom use." -Kierkegaard
diff -purN mc-4.6.0-pre1/doc/mc.1.in mc-4.6.0-pre1.dev/doc/mc.1.in
--- mc-4.6.0-pre1/doc/mc.1.in   Wed Aug 21 03:08:46 2002
+++ mc-4.6.0-pre1.dev/doc/mc.1.in       Fri Nov 29 02:41:05 2002
@@ -1041,7 +1041,10 @@ contents or the date times, it just chec
 .PP
 The Command history command shows a list of typed commands. The
 selected command is copied to the command line. The command history
-can also be accessed by typing M-p or M-n.
+can also be accessed by typing M-p or M-n. Duplicate history entries
+are ignored if environment variable
+.B HISTCONTROL 
+is set to a value of "ignoredups".
 .PP
 The
 .\"LINK2"
diff -purN mc-4.6.0-pre1/src/setup.c mc-4.6.0-pre1.dev/src/setup.c
--- mc-4.6.0-pre1/src/setup.c   Mon Aug 19 06:16:47 2002
+++ mc-4.6.0-pre1.dev/src/setup.c       Fri Nov 29 03:33:19 2002
@@ -60,6 +60,7 @@
 extern char *find_ignore_dirs;
 
 extern int num_history_items_recorded;
+extern int history_ignoredups;
 
 char *profile_name;            /* .mc/ini */
 char *global_profile_name;     /* mc.lib */
@@ -496,7 +497,7 @@ setup_init (void)
 void
 load_setup (void)
 {
-    char *profile;
+    char *profile, *hc;
     int    i;
 
     profile = setup_init ();
@@ -510,6 +511,15 @@ load_setup (void)
        *options [i].opt_addr =
            get_int (profile, options [i].opt_name, *options [i].opt_addr);
 
+    /* Get configuration from environment variables. */
+    /* Find out if the user wants to ignore duplicate history entries.
+     * Store the result into a global variable. This variable 
+     * will never be modified. */
+    hc = getenv("HISTCONTROL");
+    if (hc && ! strcmp(hc, "ignoredups")) {
+       history_ignoredups = 1;
+    }
+
     load_layout (profile);
 
     load_panelize ();
diff -purN mc-4.6.0-pre1/src/widget.c mc-4.6.0-pre1.dev/src/widget.c
--- mc-4.6.0-pre1/src/widget.c  Sat Jul 20 04:54:52 2002
+++ mc-4.6.0-pre1.dev/src/widget.c      Fri Nov 29 04:05:28 2002
@@ -47,6 +47,9 @@ static int button_event (Gpm_Event *even
 
 int quote = 0;
 
+/* Ignore duplicate history entries ? Initialized in setup.c. */
+int history_ignoredups = 0; 
+
 static int
 button_callback (Dlg_head *h, WButton *b, int Msg, int Par)
 {
@@ -798,12 +801,12 @@ int num_history_items_recorded = 60;
 
 Hist *history_get (char *input_name)
 {
-    int i;
-    Hist *old, *new;
+    int i, omitdup = 0;
+    Hist *old, *new, *hd;
     char *profile;
-    
-    old = new = NULL;
-    
+
+    old = new = hd = NULL;
+
     if (!num_history_items_recorded)   /* this is how to disable */
        return 0;
     if (!input_name)
@@ -818,12 +821,27 @@ Hist *history_get (char *input_name)
        GetPrivateProfileString (input_name, key_name, "", this_entry, sizeof 
(this_entry), profile);
        if (!*this_entry)
            break;
-       new = g_new0 (Hist, 1);
-       new->text = g_strdup (this_entry);
-       new->prev = old;        /* set up list pointers */
-       if (old)
-           old->next = new;
-       old = new;
+
+       /* Test if current entry is a duplicate. */
+       if (history_ignoredups) {
+        hd = old;
+           omitdup = 0;
+           while (hd) {
+               if (! strcmp (hd->text, this_entry)) {
+                   omitdup = 1;
+                   break;
+               }
+               hd = hd->prev;
+           }
+       }
+       if (! omitdup) {
+           new = g_new0 (Hist, 1);
+           new->text = g_strdup (this_entry);
+           new->prev = old;    /* set up list pointers */
+           if (old)
+               old->next = new;
+           old = new;
+       }
     }
     g_free (profile);
     return new;                        /* return pointer to last entry in list */
@@ -831,9 +849,10 @@ Hist *history_get (char *input_name)
 
 void history_put (char *input_name, Hist *h)
 {
-    int i;
+    int i, omitdup = 0;
     char *profile;
-
+    Hist *hd;
+    
     if (!input_name)
        return;
 
@@ -847,7 +866,6 @@ void history_put (char *input_name, Hist
        return;
 
     profile = concat_dir_and_file (home_dir, HISTORY_FILE_NAME);
-
     if ((i = open (profile, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) != -1)
        close (i);
     /* Just in case I forgot to strip passwords somewhere -- Norbert */
@@ -867,11 +885,23 @@ void history_put (char *input_name, Hist
        profile_clean_section (input_name, profile);
 
     /* dump histories into profile */
-    for (i = 0; h; h = h->next){
-       if (h->text){
+    for (i = 0; h; h = h->next) {
+       if (h->text) {
+           /* Test if current entry is a duplicate. */
+           if (history_ignoredups) {
+               hd = h->prev;
+               omitdup = 0;
+               while (hd) {
+                   if (! strcmp (hd->text, h->text)) {
+                       omitdup = 1;
+                       break;
+                   }
+                   hd = hd->prev;
+               }
+           }
 
-           /* probably aren't any null entries, but lets be sure */
-           if (*(h->text)){
+           /* Skip duplicates and make sure there aren't any null entries. */
+           if (! omitdup && *(h->text)){
                char key_name[BUF_TINY];
                g_snprintf (key_name, sizeof(key_name), "%d", i++);
                WritePrivateProfileString (input_name, key_name, h->text, profile);
@@ -1061,7 +1091,7 @@ push_history (WInput *in, char *text)
        N_(" FTP to machine "),
        N_(" SMB link to machine ")
     };
-    Hist *new;
+    Hist *new, *hd;
     char *p;
     int i;
 
@@ -1075,10 +1105,39 @@ push_history (WInput *in, char *text)
     if (!*p)
         return 0;
     if (in->history){
+       /* Go to the last element of the history list. */
        while (in->history->next)
            in->history = in->history->next;
-       if (!strcmp (in->history->text, text))
-           return 1;
+       if (history_ignoredups) {
+           /* If the new entry is a duplicate of any of the existing 
+            * entries then move it to the end of the history list
+            * instead of pushing it again. The result is that the last
+            * command used is always presented as the first choice. */
+           hd = in->history;
+           while (hd) {
+               if (! strcmp(hd->text, text)) {
+                   if (hd != in->history) {
+                       /* If the found dup is not the last entry
+                        * then move the dup to the end. */
+                       in->history->next = hd;
+                       hd->next->prev = hd->prev;
+                       if (hd->prev) /* If dup is not first entry. */
+                           hd->prev->next = hd->next;
+                       hd->next = NULL;
+                       hd->prev = in->history;
+                       in->history = hd;
+                   }
+                   return 1;
+               }
+               hd = hd->prev;
+           }
+       }
+       else {
+           /* The default mc behaviour: push the entry only if
+            * it is not a duplicate of the _previous_ entry. */
+           if (!strcmp (in->history->text, text))
+               return 1;
+       }
        new = g_new (Hist, 1);
        in->history->next = new;
     } else

Attachment: msg01392/pgp00000.pgp
Description: PGP signature

Reply via email to