Midnight Commander (MC)

From FluxboxPL.org

Midnight Commander (w skrócie MC) to niekwestionowany lider wśród konsolowych menedżerów plików.

O MC napisano już wiele, dlatego żeby nie powielać świetnej dokumentacji (man mc) skupię się na przykładowych zastosowaniach.

Spis treści

Cechy

  • program "pod konsolę" - przydatny w przypadku awarii lub braku X'ów
  • bardzo szybki, interfejs w ncurses lub opcjonalnie w slang
  • wbudowany edytor tekstu (mcedit) z ponad 40 schematami kolorowana składni
  • wbudowany, łatwy do modyfikacji wirtualny system plików extfs oferujący obsługę m.in:
    • ftp, fish (ssh, rsh), smb
    • archiwów
    • płyt audio
    • obrazów płyt (iso9660)
  • szybki dostęp do konsoli bez zamykania programu
  • okno informacyjne oraz szybki podgląd plików w drugim panelu
  • wyszukiwarka plików
  • lista często odwiedzanych "miejsc" (katalogi, zasoby sieciowe)
  • obsługa myszy w konsoli tekstowej
  • bardzo użyteczne menu użytkownika
  • ograniczone (do kilku wybranych) kolorowanie plików na liście w zależności od ich typu
  • skróty klawiaturowe, których nie można zmienić
  • rozmiar wyświetlanych plików podawany jedynie w bajtach

Twórcy innych menedżerów plików wprowadzają czasami własny format wtyczek/skryptów, utrudniając swobodną konfigurację programu. Często też implementują funkcjonalność, którą z powodzeniem dostarczyć mogą zewnętrzne, specjalizowane narzędzia. MC jest pod tym względem prosty i logiczny: korzysta z już istniejących, sprawdzonych mechanizmów. Jego pliki konfiguracyjne (nie licząc podstawowej konfiguracji dostępnej z poziomu menu) to w zasadzie zwykłe skrypty powłoki, dlatego aby docenić takie rozwiązanie, bardzo pomocną okazuje się chociażby podstawowa umiejętność ich pisania.

Najlepiej prześledzić to na przykładzie tzw. menu użytkownika.

Menu użytkownika

Plik $HOME/.mc/menu.

Wywoływane klawiszem F2 na pliku/katalogu. Zawartość menu zależy od typu pliku, ale nie tylko. Co to oznacza w praktyce?

F2 na pliku tekstowym:

F2 na pliku tekstowym

F2 na pliku dźwiękowym:

F2 na pliku dźwiękowym

Działa ono na podobnej zasadzie co znana z innych menedżerów plików opcja "otwórz za pomocą...", ale jest o tyle wygodniejsze, że zawsze wyskakuje w tym samym miejscu (środek ekranu) i może być w prosty sposób obsługiwane za pomocą klawiatury.

Jeśli dodać do tego dobre wsparcie dla wyrażeń regularnych oraz wbudowane tzw. "warunki" do określania typu plików, w rezultacie otrzymamy świetne narzędzie, za pomocą którego możemy korzystać z wielu programów konsolowych z poziomu jednego interfejsu. Dobrym przykładem są wszelkiego rodzaju konwertery plików działające z linii poleceń. Świetnie nadają się do włączenia w menu użytkownika.

Przykład prostego wpisu do menu:

+ f \.[Oo][Gg][Gg]$ & ! t t
k       konwertuj ogg na wav
	oggdec %f

W pierwszej linii można oczywiście napisać po prostu \.ogg, jednak warto od razu stosować tutaj wyrażenia regularne (jak w przykładzie), MC będzie mógł wówczas rozpoznawać rozszerzenie bez względu na wielkość liter. Linia 2 - wpis dowolny, linia 3 - właściwe polecenie, które zostanie uruchomione na zadanym pliku (lub plikach). Jeśli chodzi o tajemnicze literki/znaki pojedyncze, to uściślają one dokładne działanie menu, od nich zależy czy opcja w menu ma się pojawić na pliku pojedynczym czy też kilku zaznaczonych, na pliku zwykłym czy może na katalogu, itd. - odsyłam koniecznie do man mc.

Ciekawą opcją okazuje się wbudowane proste okienko dialogowe, przydatne w przypadku monitu o jakiś parametr wywołanego z menu programu.

Przykład:

+ f \.[Oo][Gg][Gg]$ & ! t t
k       wytnij fragment z ogg
	CMD=%{podaj czas do wycięcia}
	oggsplt -n %f $CMD

W linii 3 wprowadzamy zmienną CMD, której zapytanie wraz z polem wpisu zostanie wyświetlona przy parametrze (-n) programu oggsplt.

okienko monitu

Korzystając z tradycyjnych mechanizmów takich jak instrukcje warunkowe, pętle, zmienne itp., możemy tworzyć bardziej rozbudowane menu.

Przykład ukazujący filozofię korzystania z innych narzędzi w MC:

+ f \.[Tt][Xx][Tt]$ & t r & ! t t
t       konwertuj windows cp1250 na iso-8859-2
	check=`polcnv -t %f | grep 1250`
	   if [ "$check" != "" ]; then
	      polcnv -w %f -i `echo %f.conv`
	      mv `echo %f.conv` %f
	   fi	

Linia 3 - zmienna check, która przy pomocy narzędzia polcnv sprawdza czy zadany plik jest w kodowaniu windowsowym (przy okazji korzysta przez potok z narzędzia grep). Linia 4 - standardowe sprawdzenie warunku za pomocą programu test. Dalej już właściwa obsługa potrzebnego programu ze wsparciem echo.

Jak widać, są to najzwyklejsze skrypty z dodatkiem kilku charakterystycznych dla MC wzorców reprezentujących plik. W praktyce oznacza to, że co prostsze skrypty można wstawić do menu, dokonując jedynie drobnych zmian.

Menu równie dobrze może się zmieniać w zależności od katalogu.

Przykład:

+ d /tmp/!pkg 
s       utwórz slack-desc
	CMD=%{podaj nazwę}
	ver=%{podaj wersję}
	   if [ -d `pwd`/install ]; then 
	      rm -rf `pwd`/install
	   else
	      mkdir `pwd`/install
	      cd `pwd`/install
	      touch slack-desc 
	
	      echo "     |-----handy-ruler------------------------------------------------------|
	      $CMD: $CMD-$ver
	      $CMD:
	      $CMD: $CMD -
	      $CMD: 
	      $CMD: 
	      $CMD: 
	      $CMD:
	      $CMD: 
	      $CMD: $(date +%%d-%%m-%%Y)
	      $CMD: 
	      $CMD:" > slack-desc	
	      mcedit slack-desc
	   fi  

Co to robi? Tworzy plik slack-desc dla pakietów Slackware, ale tylko w konkretnym katalogu. Ale od początku: najpierw definicja katalogu, w którym dana opcja ma się pojawić w menu (/tmp/!pkg), następnie monit o nazwę i wersję pakietu (okienko monitujące może być używane więcej niż jeden raz), dalej sprawdzanie czy niezbędny katalog istnieje, na końcu edycja wbudowanym mceditem zawartości tworzonego pliku, do którego automatycznie wstawiana jest data utworzenia.

Typy plików

Plik $HOME/.mc/bindings.

Konfiguracja przebiega na bardzo podobnej zasadzie co konfiguracja menu. Używamy przede wszystkim wyrażeń regularnych oraz, jeśli zachodzi taka potrzeba, poleceń powłoki. Typ pliku można określić nie tylko po rozszerzeniu, ale i zawartości jaką zwróci polecenie file. Z pomocą przychodzi wówczas słowo kluczowe type, a przydaje się wtedy, gdy samo rozszerzenie nie musi dać pewności co do typu pliku, przykładem niech będzie plik ogg - nie wiadomo czy jest to plik dźwiękowy czy video:

 
type/Theora video
        Open=(mplayer %f >/dev/null 2>&1 &)
        View=%view{ascii} ogginfo %f
	
type/Vorbis audio
        Open=(audacious %f 2>/dev/null &)
        View=%view{ascii} exiftool %f

W obydwu przykładach zdefiniowane są dwie różne akcje: jedna dla domyślnego uruchomienia (Open), druga dla podglądu (View). To kolejna mocna strona MC - możliwość wyświetlania wyniku polecenia wewnątrz samego MC za pomocą makra %view (klawisz F3 na pliku). Dla każdego typu pliku można określić za pomocą czego, i w jaki sposób mają być wyświetlane wyniki zdefiniowanego programu. W powyższych przykładach dla pierwszego będą wyświetlane szczegółowe informacje o pliku ogg (theora), w drugim - wyniki takie zwracać będzie narzędzie exiftool.

Przy okazji ważna dla MC sprawa. Jako że bardzo często stosuje się w nim narzędzia konsolowe lubiące wyrzucać na ekran różnego rodzaju komunikaty, koniecznym staje się przekierowanie tychże komunikatów poprzez (przykładowy) wpis >/dev/null 2>&1 &. W przeciwnym razie ekran MC zostanie zaśmiecony ewentualnymi komunikatami.

Jak, przy konfiguracji rozpoznawania typu plików wykorzystać polecenia powłoki? Można przykładowo użyć zmiennej systemowej DISPLAY (echo $DISPLAY) aby określić który program ma zostać uruchomiony w przypadku działających X'ów, a który w czystej powłoce. Można sprawdzać dostępność wpisanych programów (operator ||), itd.

Kolory

Plik $HOME/.mc/ini.

Dosyć uciążliwy element konfiguracji bo obłożony ograniczeniami: ilość dostępnych kolorów jest bardzo ograniczona, wpis konfiguracyjny musi być zachowany w jednej linii podczas gdy często zajmuje 2 i więcej, przez co bardzo utrudnia czytelność.

Przykład:

[Colors]
base_color=normal=default,default:reverse=yellow,default:gauge=green,white:errors=white,red:input=black,yellow:menu=black,white:menusel=white,default:menuhot=red,white:menuhotsel=black,yellow:dnormal=default,default:dfocus=black,yellow:dhotnormal=yellow,default:dhotfcous=blue,yellow:helpnormal=white,default:helplink=yellow,default:helpslink=black,yellow:helpbold=green,default:helpitalic=white,black:executable=green,default:selected=black,white:marked=yellow,default:markselect=black,yellow:directory=white,default:link=cyan,default:device=brightgreen,default:special=magenta,default:core=red,default:editnormal=default,default:editbold=default,default
Uwaga! Linii z sekcją kolorów nie można złamać.

Obramowanie menu = ten sam kolor co selected.

Każde słowo kluczowe posiada dwa kolory: tła i powierzchni.

Definicje kolorów można podawać przy wywołaniu MC z parametrem -C, dzięki czemu można mieć MC w różnych wariantach kolorostycznych.

Przezroczystość

Za przezroczystość MC nie odpowiada on sam, a emulator terminala, w którym zostanie uruchomiony. Elementy mające być przezroczyste muszą otrzymać "kolor" default, zaś właściwy wpis powinien znajdować się w odpowiednim pliku, najczęściej jest to $HOME/.Xdefaults. Przykładowo dla aterma będzie to wpis:

Aterm*transparent: true

Równie dobrze emulator terminala można uruchomić z odpowiednim parametrem, dla aterma będzie to -tr.

Inne

  • Aby przy wychodzeniu z MC uniknąć zamykania programów spod niego uruchomionych, należy podać parametr -u przy starcie MC.

Zależności

  • ncurses lub slang
  • glib2
  • gpm (opcjonalnie dla obsługi myszy w trybie tekstowym)

Zrzuty ekranu

przykładowy zrzut ekranu MC

Linki

Strona projektu:

Nieco rozbudowana wersja MC z m.in lepszym kolorowaniem plików i eksperymentalną łatką do nagrywania cd. Niestety projekt już nierozwijany:

Ydiff: patch na MC oraz samodzielna aplikacja umożliwiająca podgląd różnic w zaznaczonych plikach:

Rr9 17:14, 23 lip 2007 (CEST)