MyTetra Share
Делитесь знаниями!
Как пропатчить Midnight Commander, чтобы в HEX-режиме всегда отображалось 16 байт на строку
Время создания: 04.07.2023 13:32
Текстовые метки: linux, mc. midnight, commander, hex, шестнадцатеричный, 16, байт, строка, столбцы, дамп, dump
Раздел: Компьютер - Linux - Bash - Терминал
Запись: xintrea/mytetra_syncro/master/base/1688466774ln5u0lbtit/text.html на raw.github.com

Режим отображения шестнадцатеричного дампа (HEX) в Midnight Commander зависит от ширины экрана. Чем больше ширина, тем больше столбцов помещается на экране. Но это крайне неудобно, так как привычнее всего видеть дамп из шестнадцати стобцов HEX-чисел. Каждый раз менять размер терминального окна при просмотре HEX-дампа - тоже на вариант.


Наже представлен полноценный патч, который создает в настройках поле "HEX viewer bytes per line", в которой по-умолчанию задано 16 байт. И при работе данного патча, HEX-дамп всегда остается шириной 16 байт, безотносительно того, какой ширины окно терминала.


Автор патча - товарищ demidrol с сайта linux.org.ru.



diff --git a/src/editor/editoptions.c b/src/editor/editoptions.c

index 11fd79caa..ffdc13b30 100644

--- a/src/editor/editoptions.c

+++ b/src/editor/editoptions.c

@@ -117,8 +117,8 @@ edit_reload_syntax (void *data, void *user_data)

 void

 edit_options_dialog (WDialog * h)

 {

-    char wrap_length[16], tab_spacing[16];

-    char *p, *q;

+    char wrap_length[16], tab_spacing[16], bytes_per_line[16];

+    char *p, *q, *r;

     int wrap_mode = 0;

     gboolean old_syntax_hl;

 

@@ -134,6 +134,7 @@ edit_options_dialog (WDialog * h)

 

     g_snprintf (wrap_length, sizeof (wrap_length), "%d", option_word_wrap_line_length);

     g_snprintf (tab_spacing, sizeof (tab_spacing), "%d", option_tab_spacing);

+    g_snprintf (bytes_per_line, sizeof (bytes_per_line), "%d", option_bytes_per_line);

 

     if (option_auto_para_formatting)

         wrap_mode = 1;

@@ -177,6 +178,8 @@ edit_options_dialog (WDialog * h)

                     QUICK_CHECKBOX (N_("&Group undo"), &option_group_undo, NULL),

                     QUICK_LABELED_INPUT (N_("Word wrap line length:"), input_label_left, wrap_length,

                                          "edit-word-wrap", &p, NULL, FALSE, FALSE, INPUT_COMPLETE_NONE),

+                    QUICK_LABELED_INPUT (N_("Hex viewer bytes per line:"), input_label_left, bytes_per_line,

+                                         "view-bytes-per-line", &r, NULL, FALSE, FALSE, INPUT_COMPLETE_NONE),

                 QUICK_STOP_GROUPBOX,

             QUICK_STOP_COLUMNS,

             QUICK_BUTTONS_OK_CANCEL,

@@ -215,6 +218,14 @@ edit_options_dialog (WDialog * h)

         g_free (q);

     }

 

+    if (r != NULL)

+    {

+        option_bytes_per_line = atoi (r);

+        if (option_bytes_per_line <= 0)

+            option_bytes_per_line = -1;

+        g_free (r);

+    }

+

     if (wrap_mode == 1)

     {

         option_auto_para_formatting = TRUE;

diff --git a/src/setup.c b/src/setup.c

index 085b1d15b..fc761a7c4 100644

--- a/src/setup.c

+++ b/src/setup.c

@@ -122,6 +122,9 @@ gboolean copymove_persistent_attr = TRUE;

 /* Tab size */

 int option_tab_spacing = DEFAULT_TAB_SPACING;

 

+/* Hex viewer bytes per line (0 to disable) */

+int option_bytes_per_line = 0;

+

 /* Ugly hack to allow panel_save_setup to work as a place holder for */

 /* default panel values */

 int saving_setup;

@@ -393,6 +396,7 @@ static const struct

 #ifdef USE_INTERNAL_EDIT

     { "editor_word_wrap_line_length", &option_word_wrap_line_length },

     { "editor_option_save_mode", &option_save_mode },

+    { "viewer_bytes_per_line", &option_bytes_per_line },

 #endif /* USE_INTERNAL_EDIT */

     { NULL, NULL }

 };

@@ -533,6 +537,8 @@ load_config (void)

 #ifdef USE_INTERNAL_EDIT

     if (option_word_wrap_line_length <= 0)

         option_word_wrap_line_length = DEFAULT_WRAP_LINE_LENGTH;

+    if (option_bytes_per_line < 0)

+        option_bytes_per_line = 0;

 #else

     /* Reset forced in case of build without internal editor */

     use_internal_edit = FALSE;

diff --git a/src/setup.h b/src/setup.h

index b43420f63..cfa6d754f 100644

--- a/src/setup.h

+++ b/src/setup.h

@@ -91,6 +91,7 @@ extern gboolean copymove_persistent_attr;

 extern gboolean classic_progressbar;

 extern gboolean easy_patterns;

 extern int option_tab_spacing;

+extern int option_bytes_per_line;

 extern gboolean auto_save_setup;

 extern gboolean only_leading_plus_minus;

 extern int cd_symlinks;

diff --git a/src/viewer/display.c b/src/viewer/display.c

index be6d60eb7..2f9d386ce 100644

--- a/src/viewer/display.c

+++ b/src/viewer/display.c

@@ -324,7 +324,10 @@ mcview_update_bytes_per_line (WView * view)

 

     g_assert (bytes != 0);

 

-    view->bytes_per_line = bytes;

+    view->bytes_per_line =

+      (option_bytes_per_line > 0) && (bytes > option_bytes_per_line) ?

+      option_bytes_per_line :

+      bytes;

     view->dirty = mcview_max_dirt_limit + 1;    /* To force refresh */

 }


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования