From: Mate Kukri <[email protected]>

Refer to the previous commit for a general description of the shortcuts.

This adds the same shortcuts to the multi-line menu entry editor.

Signed-off-by: Mate Kukri <[email protected]>
---
 grub-core/normal/menu_entry.c | 145 ++++++++++++++++++++++++++++++++++
 1 file changed, 145 insertions(+)

diff --git a/grub-core/normal/menu_entry.c b/grub-core/normal/menu_entry.c
index 8b0d17e3f..73d30293c 100644
--- a/grub-core/normal/menu_entry.c
+++ b/grub-core/normal/menu_entry.c
@@ -686,6 +686,48 @@ backward_char (struct screen *screen, int update)
   return 1;
 }
 
+static int
+forward_word (struct screen *screen, int update)
+{
+  int prev_column = screen->column;
+  struct line *linep;
+
+  linep = screen->lines + screen->line;
+  while (screen->column < linep->len && grub_isspace 
(linep->buf[screen->column]))
+    ++screen->column;
+  while (screen->column < linep->len && grub_isalnum 
(linep->buf[screen->column]))
+    ++screen->column;
+  if (prev_column == screen->column)
+    {
+      if (! forward_char (screen, 0))
+       return 0;
+    }
+  if (update)
+    update_screen_all (screen, screen->num_lines, 0, 0, 0, NO_LINE);
+  return 1;
+}
+
+static int
+backward_word (struct screen *screen, int update)
+{
+  int prev_column = screen->column;
+  struct line *linep;
+
+  linep = screen->lines + screen->line;
+  while (screen->column > 0 && grub_isspace (linep->buf[screen->column - 1]))
+    screen->column--;
+  while (screen->column > 0 && grub_isalnum (linep->buf[screen->column - 1]))
+    screen->column--;
+  if (prev_column == screen->column)
+    {
+      if (! backward_char (screen, 0))
+       return 0;
+    }
+  if (update)
+    update_screen_all (screen, screen->num_lines, 0, 0, 0, NO_LINE);
+  return 1;
+}
+
 static int
 previous_line (struct screen *screen, int update)
 {
@@ -869,6 +911,88 @@ backward_delete_char (struct screen *screen, int update)
   return 1;
 }
 
+static int
+delete_word (struct screen *screen, int swap_whitespace, int update)
+{
+  struct line *linep;
+  unsigned i;
+  int del;
+
+  linep = screen->lines + screen->line;
+  for (i = 0; i < screen->nterms; i++)
+    screen->terms[i].orig_num =
+      get_logical_num_lines (linep, &screen->terms[i]);
+
+  del = 0;
+  if (swap_whitespace)
+    {
+      while (screen->column + del < linep->len
+            && grub_isalnum (linep->buf[screen->column + del]))
+       del++;
+      while (screen->column + del < linep->len
+            && grub_isspace (linep->buf[screen->column + del]))
+       del++;
+    }
+  else
+    {
+      while (screen->column + del < linep->len
+            && grub_isspace (linep->buf[screen->column + del]))
+       del++;
+      while (screen->column + del < linep->len
+            && grub_isalnum (linep->buf[screen->column + del]))
+       del++;
+    }
+
+  if (del == 0)
+    {
+      if (!delete_char (screen, update))
+       return 0;
+    }
+  else
+    {
+      grub_memmove (linep->buf + screen->column,
+                   linep->buf + screen->column + del,
+                   (linep->len - screen->column -
+                    del) * sizeof (linep->buf[0]));
+      linep->len -= del;
+
+      for (i = 0; i < screen->nterms; i++)
+       {
+         grub_free (linep->pos[i]);
+         linep->pos[i] = 0;
+       }
+
+      screen->real_column = screen->column;
+
+      if (update)
+       {
+         for (i = 0; i < screen->nterms; i++)
+           {
+             int new_num;
+             new_num = get_logical_num_lines (linep, &screen->terms[i]);
+             if (screen->terms[i].orig_num != new_num)
+               update_screen (screen, &screen->terms[i],
+                              screen->line, screen->column, 0, 0, ALL_LINES);
+             else
+               update_screen (screen, &screen->terms[i],
+                              screen->line, screen->column, 0, 0,
+                              SINGLE_LINE);
+           }
+       }
+    }
+  return 1;
+}
+
+static int
+backward_delete_word (struct screen *screen, int update)
+{
+  if (screen->line == 0 && screen->column == 0)
+    return 1;
+  if (!backward_word (screen, 0))
+    return 0;
+  return delete_word (screen, 1, update);
+}
+
 static int
 kill_line (struct screen *screen, int continuous, int update)
 {
@@ -1436,6 +1560,27 @@ grub_menu_entry_run (grub_menu_entry_t entry)
          /* FIXME */
          break;
 
+       case GRUB_TERM_CTRL | GRUB_TERM_KEY_LEFT:
+         if (! backward_word (screen, 1))
+           goto fail;
+         break;
+
+       case GRUB_TERM_CTRL | GRUB_TERM_KEY_RIGHT:
+         if (! forward_word (screen, 1))
+           goto fail;
+         break;
+
+       case GRUB_TERM_CTRL | 'w':
+       case GRUB_TERM_ALT | GRUB_TERM_BACKSPACE:
+         if (! backward_delete_word (screen, 1))
+           goto fail;
+         break;
+
+       case GRUB_TERM_CTRL | GRUB_TERM_KEY_DC:
+         if (! delete_word (screen, 0, 1))
+           goto fail;
+         break;
+
        default:
          if (grub_isprint (c))
            {
-- 
2.39.5


_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to