LINUX.ORG.RU

Кому нужно автосохранение/восстановление директорий на обоих панелях при старте/выходе mc?

 


1

1

А давайте поговорим о [не]нужности сабжа?

Лично меня всё время задалбывало, что mc при следующем старте всегда забывал в какой директории он был последний раз. А как у вас? Или смирились?

Upd1:

Первый вариант патча https://pastebin.com/8rep3VTN

★★★★★

Последнее исправление: justAmoment (всего исправлений: 1)

Он вроде запоминает, при автосохранении настроек, но только для неактивной панели.

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

Он вроде запоминает, при автосохранении настроек, но только для неактивной панели.

Да, именно так и было до сегодняшнего дня.

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

А теперь что изменилось? Авторам логику подвезли?

По сабжу: Всем нужно, нет никакого смысла делать такое ... наполовину.

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

А теперь что изменилось? Авторам логику подвезли?

А сегодня меня это окончательно достало. И я наваял патч.

$ cat ~/rpmbuild/SOURCES/mc-2panels.patch
--- ../mc-4.8.19.orig/src/setup.h	2017-03-05 01:51:39.000000000 +0800
+++ src/setup.h	2018-02-05 18:24:54.884665367 +0800
@@ -117,6 +117,9 @@
 extern char *spell_language;
 #endif
 
+/* Value of "current_dir" key in ini file */
+extern char *saved_current_dir;
+
 /* Value of "other_dir" key in ini file */
 extern char *saved_other_dir;
 
--- ../mc-4.8.19.orig/src/setup.c	2017-03-05 01:51:39.000000000 +0800
+++ src/setup.c	2018-02-05 18:11:14.352771282 +0800
@@ -192,6 +192,9 @@
 char *spell_language = NULL;
 #endif
 
+/* Value of "current_dir" key in ini file */
+char *saved_current_dir = NULL;
+
 /* Value of "other_dir" key in ini file */
 char *saved_other_dir = NULL;
 
@@ -1005,8 +1008,12 @@
     {
         char *dirs;
 
+        dirs = get_panel_dir_for (current_panel);
+        mc_config_set_string (mc_global.panels_config, "Dirs", "current_dir", dirs);
+
         dirs = get_panel_dir_for (other_panel);
         mc_config_set_string (mc_global.panels_config, "Dirs", "other_dir", dirs);
+
         g_free (dirs);
     }
 
--- ../mc-4.8.19.orig/src/main.c	2017-03-05 01:51:39.000000000 +0800
+++ src/main.c	2018-02-05 18:11:14.352771282 +0800
@@ -291,6 +291,7 @@
     {
         vfs_shut ();
         done_setup ();
+        g_free (saved_current_dir);
         g_free (saved_other_dir);
         mc_event_deinit (NULL);
         goto startup_exit_falure;
@@ -305,6 +306,13 @@
         char *buffer;
         vfs_path_t *vpath;
 
+        buffer = mc_config_get_string (mc_global.panels_config, "Dirs", "current_dir", ".");
+        vpath = vfs_path_from_str (buffer);
+        if (vfs_file_is_local (vpath))
+            saved_current_dir = buffer;
+        else
+            g_free (buffer);
+
         buffer = mc_config_get_string (mc_global.panels_config, "Dirs", "other_dir", ".");
         vpath = vfs_path_from_str (buffer);
         if (vfs_file_is_local (vpath))
@@ -485,6 +493,7 @@
         g_list_free_full ((GList *) mc_run_param0, (GDestroyNotify) mcedit_arg_free);
 
     g_free (mc_run_param1);
+    g_free (saved_current_dir);
     g_free (saved_other_dir);
 
     mc_config_deinit_config_paths ();
--- ../mc-4.8.19.orig/src/filemanager/midnight.c	2017-03-05 01:51:38.000000000 +0800
+++ src/filemanager/midnight.c	2018-02-05 18:11:14.352771282 +0800
@@ -601,7 +601,8 @@
         if (mc_run_param0 == NULL && mc_run_param1 == NULL)
         {
             /* no arguments */
-            current_dir = NULL; /* assume current dir */
+            //current_dir = NULL; /* assume current dir */
+            current_dir = saved_current_dir;    /* from ini */
             other_dir = saved_other_dir;        /* from ini */
         }
         else if (mc_run_param0 != NULL && mc_run_param1 != NULL)
@@ -628,7 +629,8 @@
         if (mc_run_param0 == NULL && mc_run_param1 == NULL)
         {
             /* no arguments */
-            current_dir = NULL; /* assume current dir */
+            //current_dir = NULL; /* assume current dir */
+            current_dir = saved_current_dir;    /* from ini */
             other_dir = saved_other_dir;        /* from ini */
         }
         else if (mc_run_param0 != NULL && mc_run_param1 != NULL)

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

И теперь в моём варианте мультивселенной mc лично для меня и сохраняет и восстанавливает состояние обоих панелей.

Если нужно, то могу написать краткую инструкцию как пропатчить mc для fedora 26.

justAmoment ★★★★★
() автор топика

А давайте поговорим о [не]нужности сабжа?

В моем кейсе MC запускается из терминала когда я нахожусь в каком-то каталоге и хочу его посмотреть. В таком кейсе как раз логично открывать текущий каталог. По хорошему на это хватит и одной панели, а на другой должен быть открыть каталог, из которого (или в который) я буду скидывать файлы в текущий каталог (или sftp-сессия, или еще что-то подобное), но на сколько я знаю поддержки libastral в mc нет.

А чтоб запоминал есть опчия -P \ --printpwd (man mc).

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

Вчера собирал mc так вот в конце сборке он указал, что для автосохранения последнего выбранного каталога добавьте скрипт в ваш .bashrc

 * To enable exiting to latest working directory,
 * put this into your ~/.bashrc:
 * . /usr/libexec/mc/mc.sh

Silerus ★★★★
()

subj уже давно стандарт де факто, как MS office например, в мире linux.

Какой консольный файловый менеджер есть лучше, чем MC, для linux?

Из аналогов нагуглил: lfm (Last File Manager) - написан на python Vifm - для фанатов vim'а

zyxar
()
Ответ на: комментарий от justAmoment

Инструкция хорошо, но на мой взгляд, гораздо интереснее было бы протолкнуть патч в официальный репозиторий. Спасибо за неравнодушие к судьбе mc.

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

Инструкция хорошо, но на мой взгляд, гораздо интереснее было бы протолкнуть патч в официальный репозиторий. Спасибо за неравнодушие к судьбе mc.

Вот я и открыл топик, чтобы обсудить [не]нужность данной опции. И раньше где-то видел, что на лоре были люди, причастные к разработке mc. Хотелось бы услышать их мнение. И какие шаги нужно сделать, если есть желание доработать какую-нибудь фичу.

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

Да, я вчера смотрел на этот враппер. Оно вообще работает так как задумано? А то у меня по адресу /var/tmp/mc-user никаких pwd файлов не создавалось.

justAmoment ★★★★★
() автор топика

задалбывало, что mc при следующем старте всегда забывал в какой директории он был последний раз

Опиши полный сценарий. Обычно раздражает, что mc выходит не в ту директорию, которая была на активной панели, и это лечится, как уже писали, при помощи mc-wrapper (процесс (mc) не может поменять текущий каталог другого процесса (шелла), поэтому был придуман этот костылик).

В безусловном восстановлении последнего каталога при запуске из коробки смысла не вижу. Мне всегда нужен текущий каталог шелла.

Если такая фича нужна, например, из-за того, что ты запускаешь mc из GUI, а не из шелла, это можно решить обёрткой наподобие mc-wrapper, т.е. не трогая код mc.

Грубо так (не проверял):

#!/bin/sh
lastdirfile=~/.config/mc/lastdir
read lastdir <$lastdirfile
mc -P $lastdirfile "$lastdir"

unterwulf
()
Ответ на: комментарий от justAmoment

не побывал, для меня автосохранение путей это зло, потому как часто удаляю каталоги из консоли в ручную, а он,mc, потом когда не находит их - жутко матерится. Просто обратил внимание вчера на строку после сборке и запомнил.

Silerus ★★★★
()

Я обычно его запускаю, когда что-то сделать через него быстрее в текущей директории. Или указываю директории для обоих панелей, если надо.

Если оно будет выключаемо, то почему нет?

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

Костыли-костылики с этими врапперами.

Там целых 4 файла наскриптовано. При этом вычисляется текущий пользователь. Под него создаётся «временный» файл в каталоге /var/tmp/mc-username. И всё для того, чтобы сохранить только одну настройку рабочего каталога? Или там подразумевалось, что ещё куча всякого будет происходить?

Хотя при этом, у каждого пользователя mc есть целый каталог с конфигами по адресу ~/.config/mc. И имя каталога с пассивной панели итак сохраняется в ~/.config/mc/panels.ini при каждом выходе в параметр Dirs/other_dir.

justAmoment ★★★★★
() автор топика
Последнее исправление: justAmoment (всего исправлений: 1)
Ответ на: Костыли-костылики с этими врапперами. от justAmoment

И всё для того, чтобы сохранить одну только одну настройку рабочего каталога?

Нет. Для того, чтобы заставить вызвавший mc шелл перейти в последний рабочий каталог mc. Никакими настройками в mc эту задачу не решить.

unterwulf
()
Ответ на: комментарий от Silerus

для меня автосохранение путей это зло, потому как часто удаляю каталоги из консоли в ручную, а он,mc, потом когда не находит их - жутко матерится. Просто обратил внимание вчера на строку после сборке и запомнил.

Не находит при старте?

Проверил у себя при старте mc. У меня не матерится на неправильные каталоги, что записанные в инишке, что переданные через аргументы. Просто молча открывает текущий каталог на обоих панелях.

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

не помню, давно это было, мне абсолютно не важно запоминает он путь или нет, я обычно четко указываю пути для одной из панелей при старте

Silerus ★★★★
()

Лично мне нравится это. Правда, восстанавливается лишь одна вкладка, а не обе. Ну и другой косяк: у меня обычно минимум 5 mc открыто, хотелось бы иметь какие-то дефолтные настройки, в каких директориях следующий раз mc открывать.

anonymous
()
Ответ на: комментарий от unterwulf

Нет. Для того, чтобы заставить вызвавший mc шелл перейти в последний рабочий каталог mc. Никакими настройками в mc эту задачу не решить.

Проверил код. Действительно, эта настройка не относится к старту mc вообще никак. Она участвует только при выходе из mc. Но так как я всю жизнь выходил из mc, написав «exit» внизу, то опция никогда не срабатывала. А срабатывает, если выходить только через «F10». Пофиксил в коде. Теперь срабатывает и при написании «exit».

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

Ну и другой косяк: у меня обычно минимум 5 mc открыто, хотелось бы иметь какие-то дефолтные настройки, в каких директориях следующий раз mc открывать.

Думал над этим. В принципе, если создать список пресетов (в каждом пункте по два связанных значения «имена каталогов для левой и правой панели»). И показывать этот список для интерактивного выбора при старте mc. То да, такое, думаю, возможно сделать, но кодить побольше надо.

justAmoment ★★★★★
() автор топика

Не нужно.

Есть директория с мильоном файлов.
Открываем на нее mc и - зависание.
Теперь сколько бы раз не запустили mc будет зависать.

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

Есть директория с мильоном файлов.
Открываем на нее mc и - зависание.
Теперь сколько бы раз не запустили mc будет зависать.

Ровно один раз зависнет. После этого берём и удаляем ~/.config/mc/panels.ini. Ну, или чистим в нём раздел [Dirs], если твой vi умеет не только бибикать.

Если реализовать идею с интерактивным выбором из списка каталогов перед запуском mc, то mc ещё и спросит: «Желает ли барин снова зайти в это каталог, али какими другими извращениями заняться»?

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

В безусловном восстановлении последнего каталога при запуске из коробки смысла не вижу. Мне всегда нужен текущий каталог шелла.

Почему безусловной? По [автосохранении настроек] или по отдельной опции в меню.

Я понимаю вашу логику запуска из текущего каталога, но на этом фоне восстановление неактивной панели это еще более странная логика

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

Почему безусловной?

Под «безусловным» имел в виду поведение по умолчанию. На мой взгляд, исходя из принципа наименьшего удивления начальным активным каталогом по умолчанию должен быть текущий.

Тому, кто хочет иного, уже даны опции запуска и шелл, чтоб их заскриптовать в соответствии со своими нуждами :-)

восстановление неактивной панели это еще более странная логика

Никогда не понимал как оно работает, но иногда там действительно оказывается нужный каталог. Если задуматься, это довольно неплохой подход: по крайней мере я не могу выдумать вариант лучше. Один каталог на обеих панелях бессмысленен, т.к. существует комбинация Alt+I.

unterwulf
()
11 марта 2018 г.

Памятка по патчингу mc

По мотивам

https://wiki.russianfedora.pro/index.php?title=Как_пересобрать_RPM-пакет

Команды 
# — от суперпользователя
$ — от обычного пользователя

  1. Первоначальная подготовка:
    1. # dnf install rpmdevtools dnf-plugins-core
      
    2. $ rpmdev-setuptree
      
  2. Исходники:
    1. $ cd ~/rpmbuild/SRPMS
      $ dnf download --source mc
      
    2. $ rpm -ivh mc-4.8.19-7.fc27.src.rpm
      
    3. Результат:
      $ tree ~/rpmbuild 
      /home/user/rpmbuild
      ├── BUILD
      ├── RPMS
      ├── SOURCES
      │   ├── Extends-TMPDIR_DEFAULT-to-mc-wrapper-scripts.patch
      │   ├── mc-4.8.19.tar.xz
      │   └── mc-tmpdir.patch
      ├── SPECS
      │   └── mc.spec
      └── SRPMS
          └── mc-4.8.19-7.fc27.src.rpm
      
      5 directories, 5 files
      
    4. Подготовка зависимостей
      # dnf builddep /home/user/rpmbuild/SPECS/mc.spec
      
    5. Развернём исходники
      $ rpmbuild -bp ~/rpmbuild/SPECS/mc.spec
      
    6. Делаем копию оригинала (нужно для подготовки патчей)
      $ mv ~/rpmbuild/BUILD/mc-4.8.19 ~/rpmbuild/BUILD/mc-4.8.19.orig
      
      Делаем рабочую копию
      $ cp -rp ~/rpmbuild/BUILD/mc-4.8.19.orig ~/rpmbuild/BUILD/mc-4.8.19-\(2018-03-10\)
      
  3. Работа:
    1. Правим исходники в рабочей копии mc-4.8.19-(2018-03-10)
    2. Формируем патч
      $ cd ${HOME}/rpmbuild/BUILD/mc-4.8.19-\(2018-03-10\)
      $ diff -u ../mc-4.8.19.orig/src/filemanager/midnight.c src/filemanager/midnight.c  > "${HOME}/rpmbuild/SOURCES/mc-2panels.patch"
      
    3. Корректируем ~/rpmbuild/SPECS/mc.spec
      1. Добавляем наши патчи в список
        Patch2:		%{name}-2panels.patch
        Patch3:		%{name}-fix-filter-hotkey.patch
        
      2. По желанию, исправляем Release: 7%{?dist} на Release: 7.20180310%{?dist}
      3. По желанию, добавляем строчки в секцию %changelog
    4. Сборка нового пакета
      rpmbuild -ba ~/rpmbuild/SPECS/mc.spec
  4. Оптимизация сборки:
    1. Пишем 2 bash скрипта примерно с таким содержимым
      $ cat ~/rpmbuild/BUILD/make_patch_build_mc.sh
      #!/bin/bash
      
      ./make_patch_mc.sh
      
      cd ../SPECS
      rpmbuild -ba mc.spec
      и
      $ cat ~/rpmbuild/BUILD/make_patch_mc.sh
      #!/bin/bash
      
      # file patch name
      fpn1="${HOME}/rpmbuild/SOURCES/mc-2panels.patch"
      fpn2="${HOME}/rpmbuild/SOURCES/mc-fix-filter-hotkey.patch"
      
      cd mc-4.8.19-\(2018-03-10\)
      
      diff -u ../mc-4.8.19.orig/src/setup.h			src/setup.h			  > "${fpn1}"
      diff -u ../mc-4.8.19.orig/src/setup.c			src/setup.c			 >> "${fpn1}"
      diff -u ../mc-4.8.19.orig/src/main.c			src/main.c			 >> "${fpn1}"
      diff -u ../mc-4.8.19.orig/src/filemanager/midnight.c	src/filemanager/midnight.c	 >> "${fpn1}"
      
      diff -u ../mc-4.8.19.orig/lib/global.h			lib/global.h			  > "${fpn2}"
      diff -u ../mc-4.8.19.orig/lib/global.c			lib/global.c			 >> "${fpn2}"
      diff -u ../mc-4.8.19.orig/lib/widget/menu.c		lib/widget/menu.c		 >> "${fpn2}"
      diff -u ../mc-4.8.19.orig/src/filemanager/cmd.c		src/filemanager/cmd.c		 >> "${fpn2}"
  5. Рекурсия до достижения нужного результата: работаем с 3.1 потом запускаем скрипт сборки 4.1.
  6. Результат сборки:
    $ tree ~/rpmbuild/RPMS
    /home/user/rpmbuild/RPMS
    └── x86_64
        ├── mc-4.8.19-7.20180310.fc27.x86_64.rpm
        ├── mc-debuginfo-4.8.19-7.20180310.fc27.x86_64.rpm
        └── mc-debugsource-4.8.19-7.20180310.fc27.x86_64.rpm
    
justAmoment ★★★★★
() автор топика
Последнее исправление: justAmoment (всего исправлений: 1)
Ответ на: комментарий от justAmoment

Если реализовать идею с
интерактивным выбором из списка каталогов перед запуском mc, то mc ещё и спросит: «Желает ли барин
снова зайти в это каталог, али какими другими извращениями
заняться»?

Мне нравится, когда софт работает при запуске, а не вопросы задаёт

По сабжу - не нужно, но ничего не имею против, если будет выключено по умолчанию

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