LINUX.ORG.RU

patch: mcedit external command


0

1

Привет всем. Долго сидел на MC 4.7.0. Теперь вот перешел на 4.8.12 Вроде пользоваться уже можно. Предлагаю для обсуждения заплатку для команды редактора «Вставить вывод внешней команды». Сама команда очень удобна, в стиле самых первых UNIX-редакторов, но ей похоже никто не пользуется, ибо дефект до сих пор не исправлен. Дефект в том, что при выполнении команды типа sort над выделенным блоком MC просто подвисает, ибо sort ждёт данных со stdin. Патч исправляет это. После исправления становится лишней команда редактора «Сортировать».

diff -urN mc-4.8.11.old/src/editor/editcmd.c mc-4.8.11/src/editor/editcmd.c
--- mc-4.8.11.old/src/editor/editcmd.c	2014-02-19 08:26:55.000000000 +0400
+++ mc-4.8.11/src/editor/editcmd.c	2014-02-19 08:25:06.000000000 +0400
@@ -3141,6 +3141,10 @@
     char *exp, *tmp, *tmp_edit_temp_file;
     int e;
 
+    const char *stdin_str = "/dev/null";
+    off_t start_mark, end_mark;
+    int  block_present_flag = 0;
+
     exp =
         input_dialog (_("Paste output of external command"),
                       _("Enter shell command(s):"), MC_HISTORY_EDIT_PASTE_EXTCMD, NULL,
@@ -3151,12 +3155,20 @@
     if (!exp)
         return 1;
 
+    if (eval_marks (edit, &start_mark, &end_mark)) {
+	stdin_str = mc_config_get_full_path (EDIT_BLOCK_FILE);
+	edit_save_block (edit, stdin_str, start_mark, end_mark);
+	block_present_flag = 1;
+    }
+
     tmp_edit_temp_file = mc_config_get_full_path (EDIT_TEMP_FILE);
-    tmp = g_strconcat (exp, " > ", tmp_edit_temp_file, (char *) NULL);
+    tmp = g_strconcat ( "< ", stdin_str, " ", exp, " > ", tmp_edit_temp_file, (char *) NULL);
     g_free (tmp_edit_temp_file);
     e = system (tmp);
     g_free (tmp);
     g_free (exp);
+    if (block_present_flag)
+	g_free(stdin_str);
 
     if (e)
     {
@@ -3165,6 +3177,10 @@
     }
 
     edit->force |= REDRAW_COMPLETELY;
+    if (block_present_flag) {
+	if (edit_block_delete_cmd (edit))
+	    return 1;
+    }
 
     {
         vfs_path_t *tmp_vpath;


Ответ на: комментарий от angel_il

Нечего освобождать память, предположительно выделенную при наличии блока запросом mc_config_get_full_path ? Беглый осмотр исходников показывает, что осталось ещё много мест, где освобождают память после этой функции

seyko2
() автор топика
Ответ на: комментарий от seyko2

Ну уж если придираться, то на g_free (const char *) компилятор будет выражать недовольство.
И block_present_flag должен быть типа gboolean.

akk ★★★★★
()
Ответ на: комментарий от akk

проморгал

Вызвать g_free ((char *) stdin_str)? Да, не заметил...

А вообще const char * означает, что мы используем указатель только для чтения.

PS: Тут попытался изменить диалог при удалении директорий. Перед запросом «каталог не пустой» показывается сканирование каталога с подсчётом файлов и их суммарным размером. Так вот хотел «каталог не пустой» вывести на фоне этой информации. Не получилось. Удалось только смеcтить запрос вверх/вниз, чтоб не загораживал хоть количество файлов, которые собираемся удалять.

seyko2
() автор топика
6 ноября 2015 г.
Ответ на: комментарий от angel_il

А где у нас репозитарий?

Вот нашёл https://github.com/MidnightCommander ? Это вполне официальный? Просто ради интереса попробовал приложить данный патч, и он спокойно приложился к текущей версии. То есть его там до сих пор не было. Мож у нас где-то более официальный репозитарий?

PS: Travis CI замонал своими проверками. Особенно поразила проверка на форматирование в предопределённом стиле GNU...

seyko2
() автор топика
Ответ на: А где у нас репозитарий? от seyko2

Re: А где у нас репозитарий?

Особенно поразила проверка на форматирование в предопределённом стиле GNU...

Ибо нефиг превращать код в письмо из Прстоквашино.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.