Midnight Commander не восстанавливает активную панель

Если я перехожу по определённым путям в панелях MC, а затем выхожу из него, то при следующем запуске состояние той панели, в которой не было курсора в момент выхода, будет восстановлено, а панель где был курсор сбросится в домашнюю директорию.

Меня такое поведение дико раздражает! Это единственная причина, по которой я никак не могу приучить себя пользоваться данным менеджером. Кто вообще придумал, что за положением курсора нужно следить при выходе? В каких ситуациях и кому это может быть удобно!? Возможно ли это исправить, чтобы MC запоминал ОБЕ панели?


Ответы (1 шт):

Автор решения: DiD

Таких опций там не предусмотрено.

Дело в том, что в активной панели при запуске МС отображает не домашнюю директорию, а директорию в которой он запущен. Чтобы он открыл нужную директорию, необходимо запускать его из этой директории.

По комбинации клавиш Ctrl+\ откроется инструмент список "горячих" папок. В этот список можно добавить папки, которые часто используются. Это может упростить переходы по глубоким директориям.

Дальше навязывается вопрос: а зачем вообще выходить из MC?

Например, если вам нужно набрать длинную команду, или посмотреть результаты работы предыдущей команды, можно нажать Ctrl+O и потом с той же Ctrl+O вернуться обратно.

Если вы работаете удалённо, то имеет смысл использовать какой-нибудь мультиплексор. Самые распространённые - screen и tmux. При разрыве канала связи сессия остаётся. К ней можно "при-аттачиться", когда связь будет восстановлена. Соответственно, и MC сохранит своё состояние.

Если работаете удалённо с нестабильным каналом связи (с постоянными короткими разрывами), можно также использовать mosh. Он сохраняет состояние на клиенте так, что если случится разрыв, он сам переконнектится и приаттачится к сессии, а вы при этом можете где-нибудь в vim печатать свой код и даже не заметите разрыва.

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

И я всё же написал этот скрипт. Его можно сохранить по пути /usr/local/bin/mc. После добавления файла необходимо проверить чтобы в переменной $PATH папка /usr/local/bin стояла перед папкой /usr/bin. Если вы пользовались mc в терминале до этого, терминал можно закрыть и открыть новое окно терминала.

#!/bin/bash

MC_MODE="0" 
MC_PATH="" 
MC_TITLE="" 
MC_CH0="" MC_CH1="" MC_CH2="" MC_CH3=""
MC_TSRART=$(echo -ne "\033")
MC_TEND=$(echo -ne "\007")
export MC_MODE MC_PATH MC_TITLE MC_CH0 MC_CH1 MC_CH2 MC_CH3 MC_TSTART MC_TEND
mkdir -p /tmp/mc-$USER
if [ -f /tmp/mc-$USER/last.path ]
then cd $(tail -1 /tmp/mc-$USER/last.path)
     rm -f /tmp/mc-$USER/last.path
fi
/usr/bin/mc | while IFS="" read -r -N 1 CH
     do  
         printf "%s" "$CH"
         if [ "$MC_MODE" = "0" ]
         then
             MC_CH0="$MC_CH1"
             MC_CH1="$MC_CH2"
             MC_CH2="$MC_CH3"
             MC_CH3="$CH"
             if [ "$MC_CH0" = "$MC_TSRART" ] && [ "$MC_CH1" = "]" ] && [ "$MC_CH2" = "0" ] && [ "$MC_CH3" = ";" ] 
             then
                 MC_MODE=1
                 MC_TITLE=""
             fi
         else
             if [ "$CH" = "$MC_TEND" ]
             then
                 MC_MODE=0
                 MC_PATH=$(cut -d':' -f2- <<< "$MC_TITLE")
                 echo "$MC_PATH" > /tmp/mc-$USER/last.path
                 MC_CH0=""
                 MC_CH1=""
                 MC_CH2=""
                 MC_CH3=""
             else
                 MC_TITLE="$MC_TITLE$CH"
             fi
         fi
     done

asciicast

→ Ссылка