Port mc.ext to INI format.

Ticket #2773: 'include' keyword (for command class def) have no effect
if it was defined before 'Include' keyword (for command def).

Ticket #3742: update comment in mc.ext.ini.

doc: remove mc.ext.ini format description from manual page.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
Andrew Borodin 2022-07-22 20:18:16 +03:00
parent 1cb66b82bd
commit d9eeec9a5a
14 changed files with 1417 additions and 1549 deletions

View File

@ -605,7 +605,7 @@ misc/ext.d/misc.sh
misc/ext.d/text.sh
misc/ext.d/web.sh
misc/macros.d/Makefile
misc/mc.ext
misc/mc.ext.ini
src/Makefile
src/consaver/Makefile

View File

@ -1509,80 +1509,15 @@ comando cd interno\&.
.\"NODE " Edit Extension File"
.SH " Editar el Archivo de Extensiones"
Abre el archivo
.I ~/.config/mc/mc.ext
en nuestro editor. El administrador puede optar por editar, en su lugar,
el archivo de extensiones del sistema
.IR %pkgdatadir%/mc.ext .
El formato del archivo es como sigue:
.PP
Todas las líneas que empiecen con # o estén vacías serán ignoradas.
.PP
Las líneas que comiencen en la primera columna deberán tener el siguiente formato:
.PP
.IR PalabraClave/descripción ,
i. e. todo lo que vaya tras la «/» hasta el fin de línea será la
.IR descripción .
.PP
Las palabras clave son:
.TP
.I shell
\-
.I Descripción
será una extensión (sin comodines). Un archivo coincide si su nombre acaba en
.IR Descripción .
Por ejemplo:
.I shell/.tar
corresponde a
.IR *.tar .
.TP
.I regex
\-
.I Descripción
es una expresión regular. Un archivo coincide si la salida de
.I file %f
encaja con la expresión regular
.I Descripción
(quitando la parte inicial «nombre de archivo:»)
.TP
.I default
\- Coincide para cualquier archivo. Se ignora la
.IR descripción .
.TP
.I include
\- Incorpora una sección común.
.I Descripción
es el nombre de la sección.
.PP
El resto de líneas deben comenzar con un espacio o tabulador y usar el
siguiente formato:
.I PalabraClave=comando
(sin espacios alrededor de «=»), donde
.I PalabraClave
debe ser:
.I Open
(si el usuario pulsa
.I Intro
o dos veces el ratón),
.I View
(F3),
.I Edit
(F4) o
.I Include
(para agregar reglas de la sección común).
.I Comando
es cualquier comando en línea del shell, con
.\"LINK2"
sustitución de macro
.\"Macro Substitution"
simple.
.PP
Las reglas se aplican en estricto orden. Aunque se produzca una
coincidencia, si la acción solicitada no está disponible, se ignora y la
búsqueda continúa (por ejemplo, si un archivo encaja con dos entradas,
pero la acción Ver no está definida en la primera, al pulsar F3, se
ejecuta la acción Ver de la segunda). Por eso, como último recurso
.I default
sí debe incluir todas las acciones.
.I ~/.config/mc/mc.ext.ini
en nuestro editor.
If this file does not exist and you are not root, it will be copied from
.IR %sysconfdir%/mc/mc.ext.ini .
If you are root, you can choose the file to edit: user's
.I ~/.config/mc/mc.ext.ini
or system\-wide
.IR %sysconfdir%/mc/mc.ext.ini .
The format of this file is described in detail in it.
.\"NODE " Background jobs"
.SH " Trabajos en Segundo Plano"
Nos permite controlar el estado de cualquier proceso de Midnight Commander
@ -2900,7 +2835,7 @@ Buscar la próxima coincidencia.
.PP
.B F8
Intercambia entre el modo crudo y procesado: esto mostrará el archivo como se encuentra en disco
o si se ha especificado un filtro de visualización en el archivo mc.ext, entonces
o si se ha especificado un filtro de visualización en el archivo mc.ext.ini, entonces
la salida filtrada. El modo actual es siempre el contrario al mostrado
en la etiqueta del botón, en tanto que el botón muestra el modo en el que entraremos
con la pulsación de esa tecla.
@ -3122,7 +3057,7 @@ de directorio empleando la siguiente sintaxis:
.PP
.I /archivo.tar/utar://[directorio\-dentro\-tar]
.PP
El archivo mc.ext también ofrece un atajo para los archivos tar, esto quiere decir
El archivo mc.ext.ini también ofrece un atajo para los archivos tar, esto quiere decir
que normalmente basta con apuntar a un archivo tar y pulsar Intro para entrar en el
archivo tar. Véase la sección
.\"LINK2"
@ -4009,7 +3944,7 @@ ya estemos ahí, en cuyo caso moverá la selección al último nombre de archivo
Si esta variable está activada (por defecto lo está) se recurrirá al
comando «file» para reconocer los tipos de archivo referidos en el archivo
.\"LINK2"
mc.ext\&.
mc.ext.ini\&.
.\"Edit Extension File"
.TP
.I xtree_mode
@ -4163,11 +4098,11 @@ que de estar definida se emplearía en vez de %pkgdatadir%.
.IP
Archivo de ayuda.
.PP
.I %pkgdatadir%/mc.ext
.I %pkgdatadir%/mc.ext.ini
.IP
Archivo de extensiones por defecto del sistema.
.PP
.I ~/.config/mc/mc.ext
.I ~/.config/mc/mc.ext.ini
.IP
Archivo de usuario de extensiones y configuración de visor y editor. Si
está presente prevalece sobre el contenido de los archivos del sistema.

View File

@ -1299,66 +1299,16 @@ A cd belső parancs
leírásánál.
.\"NODE " Edit Extension File"
.SH " Társítások"
Ez az ~/.config/mc/mc.ext szerkesztéséhez segítségül fogja hívni a
szövegszerkesztődet. A fájl formátuma a következő (a formátum a 3.0\-ás
verzióval megváltozott):
.PP
Minden # jellel kezdődő sor, vagy üres sor kommentárnak tekinthető.
.PP
A sorok az első rovatban látható formátumnak megfelelően kezdődnek:
.PP
.IR kulcsszó/desc ,
pl. akármi a
.I kulcsszó/
után úgy, hogy a sor vége karakter előtt a
.I desc
áll kulcsszó lehet:
.PP
.I shell
.IP
bármely kiterjesztés esetén, amely ponttal kezdődik (nem szükséges a
helyettesítő karaktert beírni, például: .tar az *.tar párja)
.PP
.I regex
.IP
(szabványos kifejezés; regular expression esetén)
.PP
.I type
.IP
(azokra a fájlokra illeszkedik, amelyek tartalmazzák a `file %f`
szöveget. A fájlnév a `file %f` résztől törlődik)
.PP
.I default
.IP
(illeszkedik bármely fájlra, kiterjesztésétől függetlenül)
.PP
A többi sor kezdődhet szóközzel, vagy tabulátorral, a formátumuk pedig a
következő:
.PP
.I keyword=command
(szóközt nem szabad az egyenlőségjel mellé írni), ahol a
.I kulcsszó
lehet:
.PP
.I Open
(ha a felhasználó lenyomja az Enter\-t, vagy duplán kattint),
.I View
(F3) és
.I Edit
(F4).
.PP
.I command
ez bármely egysoros shell parancs lehet, az egyszerű
.\"LINK2"
Macro Helyettesítővel\&.
.\"Macro Substitution"
.PP
A feladatokatokat fentről lefelé értékeljük ki (tehát a sorrend nagyon
fontos). Ha néhány műveletet keresünk, a keresés úgy folytatódik,
mintha ez a cél nem létezne (pl. ha a fájl tartalmazza az első és a
második bejegyzést és a Nézet művelet hiányzik az elsőből, akkor az F3
lenyomására a Nézet művelet a második bejegyzést fogja használni.
Alapértelmezésben végrehajt minden műveletet.
Ez az
.I ~/.config/mc/mc.ext.ini
szerkesztéséhez segítségül fogja hívni a szövegszerkesztődet.
If this file does not exist and you are not root, it will be copied from
.IR %sysconfdir%/mc/mc.ext.ini .
If you are root, you can choose the file to edit: user's
.I ~/.config/mc/mc.ext.ini
or system\-wide
.IR %sysconfdir%/mc/mc.ext.ini .
The format of this file is described in detail in it.
.\"NODE " Background jobs"
.SH " Háttérmunkák"
Ezzel szabályozhatod néhány Commander háttérfolyamat állapotát (csak a
@ -2393,7 +2343,7 @@ A következő egyezőt keresi.
.PP
.B F8
Vált a Nyers és Feldolgozott mód között: ez a fájlt, úgy mutatja meg,
ahogy megtalálta, vagy, ha folyamatszűrő meg van adva az mc.ext fájlban,
ahogy megtalálta, vagy, ha folyamatszűrő meg van adva az mc.ext.ini fájlban,
akkor a szűrő kimenetét. A Jelenlegi mód mindig a másik, mit amit a gomb
felirata mutat.
.PP
@ -2663,7 +2613,7 @@ következő szintaktikájú parancs segítségével tudod átváltani könyvtár
.PP
.I /filename.tar:utar/[dir\-inside\-tar]
.PP
Az mc.ext fájl már tartalmaz gyorsbillentyűket a tar fájlokhoz, ezért
Az mc.ext.ini fájl már tartalmaz gyorsbillentyűket a tar fájlokhoz, ezért
csak rá kell mutatnod a tar fájlra és le kell nyomnod az entert ahhoz,
hogy beléphess a tar fájlba, ehhez nézd meg a
.\"LINK2"
@ -3153,11 +3103,11 @@ ez vissza fog állítódni a /usr könyvtárra.
.IP
A program súgó fájlja.
.PP
.I %pkgdatadir%/mc.ext
.I %pkgdatadir%/mc.ext.ini
.IP
Az alapértelmezett rendszerszintű kiterjesztés fájl.
.PP
.I ~/.config/mc/mc.ext
.I ~/.config/mc/mc.ext.ini
.IP
A felhasználó saját kiterjesztései, nézet beállítások és szerkesztési
beállítások. Ezek felülbírálják a rendszerszintű fájl bejegyzéseit, ha

View File

@ -1314,60 +1314,14 @@ comando cd interno\&.
.\"NODE " Edit Extension File"
.SH " Modifica file estensioni"
Questo comando invocherà l'editor sul file
.IR ~/.config/mc/mc.ext .
Il fomato di questo file è il seguente (il formato è cambiato dalla
versione 3.0):
.PP
Tutte le righe che iniziano per # vengono ignorate.
.PP
Le righe che cominciano dalla prima colonna devono avere il seguente formato:
.PP
.IR parolachiave/descrizione ,
i.e. qualsiasi cosa dopo
.I parolachiave/
fino al fine riga è
.I descrizione
.PP
parolachiave può essere:
.TP
.I shell
(allora descrizione è qualsiasi estensione (no caratteri jolly),
cioè corrisponde a tutti i file *descrizione. Esempio: .tar corrisponde a *.tar)
.TP
.I regex
(descrizione è un'espressione regolare)
.TP
.I type
(file corrisponde se `file %f` corrisponde all'espressione regolare descrizione
(nome del file: a partire da `file %f` viene rimosso))
.TP
.I default
(corrisponde a qualsiasi file indipendentemente dalla descrizione)
.PP
Le altre linee devono cominciare con uno spazio o una tabulazione e devono essere nel formato:
.I parolachiave=comando
(senza spazi intorno a =), dove
.I parolachiave
deve essere:
.I Open
(se l'utente preme Invio o fa doppio clic),
.I View
(F3),
.I Edit
(F4).
.I command
è qualsiasi comando shell di una riga, con la semplice
.\"LINK2"
sostituzione macro\&.
.\"Macro Substitution"
.PP
Gli obiettivi sono valutati dalla cima al fondo, perciò l'ordine è
importante. Se alcune azioni mancano, la ricerca continua come se
la regola non corrispondesse, cioè se un file corrisponde alla prima e
alla seconda voce e manca la voce View in cima, allora premendo F3 verrà
usata l'azione View della seconda voce.
.I Normalmente
dovrebbero corrispondere tutte le azioni.
.IR ~/.config/mc/mc.ext.ini .
If this file does not exist and you are not root, it will be copied from
.IR %sysconfdir%/mc/mc.ext.ini .
If you are root, you can choose the file to edit: user's
.I ~/.config/mc/mc.ext.ini
or system\-wide
.IR %sysconfdir%/mc/mc.ext.ini .
The format of this file is described in detail in it.
.\"NODE " Background jobs"
.SH " Processi in background"
Questo comando permette di controllare lo stato di ogni processo
@ -2425,7 +2379,7 @@ un'espressione di ricerca, altrimenti trova la prossima occorrenza.
.PP
.B F8
Cambia tra modalità Normale/Filtrata: questo mostrerà il file come si
trova su disco o se è stato specificato un filtro nel file mc.ext, come
trova su disco o se è stato specificato un filtro nel file mc.ext.ini, come
esce dal filtro. La modalità corrente è sempre quella diversa da quella
mostrata dall'etichetta del tasto, dato che il bottone rappresenta la
modalità nella quale si entra premendolo.
@ -2672,7 +2626,7 @@ al file tar usare la seguente sintassi:
.PP
.I /nomefile.tar/utar://[dir\-dentro\-tar]
.PP
Il file mc.ext già fornisce un collegamento per il file tar; ciò
Il file mc.ext.ini già fornisce un collegamento per il file tar; ciò
significa che normalmente basta selezionare un file tar e premere invio
per entrare nel file tar, vedere la sezione
.\"LINK2"
@ -3082,7 +3036,7 @@ pannello.
Se questa variabile è abilitata (valore predefinito) userà il comando
file per trovare delle corrispondenze sui tipi di file elencati nel
.\"LINK2"
file mc.ext\&.
file mc.ext.ini\&.
.\"Edit Extension File"
.TP
.I xtree_mode
@ -3146,11 +3100,11 @@ e se la variabile non è impostata, passerà alla directory %pkgdatadir% .
.IP
Il file di aiuto per il programma.
.PP
.I %pkgdatadir%/mc.ext
.I %pkgdatadir%/mc.ext.ini
.IP
Il file delle estensioni di sistema predefinito.
.PP
.I ~/.config/mc/mc.ext
.I ~/.config/mc/mc.ext.ini
.IP
Le estensioni dell'utente, la configurazione del visualizzatore e
dell'editor di file. Se presenti, questi file si sovrappongono ai file di

View File

@ -1483,87 +1483,14 @@ description.
.\"NODE " Edit Extension File"
.SH " Edit Extension File"
This will invoke your editor on the file
.IR ~/.config/mc/mc.ext .
The format of this file following:
.PP
All lines starting with # or empty lines are thrown away.
.PP
Lines starting in the first column should have following format:
.PP
.IR keyword/expr ,
i.e. everything after the slash until new line is
.IR expr .
.PP
.I keyword
can be:
.TP
.I shell
\-
.I expr
is an extension (no wildcards). File matches it its name ends
with
.IR expr .
Example:
.I shell/.tar
matches
.IR *.tar .
.TP
.I regex
\-
.I expr
is a regular expression. File matches if its name matches the regular
expression.
.TP
.I directory
\-
.I expr
is a regular expression. File matches if it is a directory and its name
matches the regular expression.
.TP
.I type
\-
.I expr
is a regular expression. File matches if the output of
.I file %f
without the initial "filename:" part matches regular expression
.IR expr .
.TP
.I default
\- matches any file.
.I expr
is ignored.
.TP
.I include
\- denotes a common section.
.I expr
is the name of the section.
.PP
Other lines should start with a space or tab and should be of the format:
.I keyword=command
(with no spaces around =), where
.I keyword
should be:
.I Open
(invoked on Enter or double click),
.I View
(F3),
.I Edit
(F4) or
.I Include
(to add rules from the common section).
.I command
is any one\-line shell command, with the simple
.\"LINK2"
macro substitution\&.
.\"Macro Substitution"
.PP
Rules are matched from top to bottom, thus the order is important. If
the appropriate action is missing, search continues as if this rule
didn't match (i.e. if a file matches the first and second entry and View
action is missing in the first one, then on pressing F3 the View action
from the second entry will be used).
.I default
should match all the actions.
.IR ~/.config/mc/mc.ext.ini .
If this file does not exist and you are not root, it will be copied from
.IR %sysconfdir%/mc/mc.ext.ini .
If you are root, you can choose the file to edit: user's
.I ~/.config/mc/mc.ext.ini
or system\-wide
.IR %sysconfdir%/mc/mc.ext.ini .
The format of this file is described in detail in it.
.\"NODE " Background jobs"
.SH " Background Jobs"
This lets you control the state of any background Midnight Commander
@ -2975,7 +2902,7 @@ and vice versa.
.TP
.B F8
Toggle Raw/Parsed mode: This will show the file as found on disk or if
a processing filter has been specified in the mc.ext file, then the
a processing filter has been specified in the mc.ext.ini file, then the
output from the filter. Current mode is always the other than written
on the button label, since on the button is the mode which you enter
by that key.
@ -3280,7 +3207,7 @@ tar file by using the following syntax:
.PP
.I /filename.tar/utar://[dir\-inside\-tar]
.PP
The mc.ext file already provides a shortcut for tar files, this means
The mc.ext.ini file already provides a shortcut for tar files, this means
that usually you just point to a tar file and press return to enter
into the tar file, see the
.\"LINK2"
@ -4160,7 +4087,7 @@ the panel.
If this variable is on (the default) it will spawn the file command to
match the file types listed on the
.\"LINK2"
mc.ext file\&.
mc.ext.ini file\&.
.\"Edit Extension File"
.TP
.I xtree_mode
@ -4308,11 +4235,11 @@ environment variable. If it's set, its value is used instead of
.IP
The help file for the program.
.PP
.I %pkgdatadir%/mc.ext
.I %pkgdatadir%/mc.ext.ini
.IP
The default system\-wide extensions file.
.PP
.I ~/.config/mc/mc.ext
.I ~/.config/mc/mc.ext.ini
.IP
User's own extension, view configuration and edit configuration
file. They override the contents of the system wide files if present.

View File

@ -1095,65 +1095,16 @@ przemieszczanie.
.PP
.\"NODE " Edit Extension File"
.SH " Edycja rozszerzeń pliów (Edit Extension File)"
Ta komenda wywoła twój edytor na plik ~/.config/mc/mc.ext. Format tego pliku jest
następujący (zmienił się on począwszy od wersji 3.0):
.PP
Wszystkie linie zaczynające się od #, lub puste, nie są brane pod uwagę.
.PP
Linie zaczynające się od pierwszej kolumny powinny mieć następujący format:
.PP
.IR "słowo kluczowe/wzorzec" ,
tj. wszystko po
.I słowie kluczowym/
dopóki nową linią nie jest
.I wzorzec
.PP
słowami kluczowymi mogą być:
.PP
.I shell
.IP
(wzorzec jest wtedy wyrażeniem (bez jokerów), tj. pasują wszystkie pliki
*wzorzec. Np.: .tar znaczy *.tar)
.PP
.I regex
.IP
(wzorzec jest normalnym wyrażeniem)
.PP
.I type
.IP
(plik spełnia wymagania jeśli `file %f` zgadza się z wyrażeniem wzorca
(nazwa: część z `file %f` jest usuwana))
.PP
.I default
.IP
(wszystkie pliki spełniają, nie ważne jaki jest wzorzec)
.PP
Inne linie powinny zaczynać się od spacji lub tabulacji i powinny
mieć one następujący format:
.PP
.I słowo kluczowe=komenda
(bez spacji przy znaku =), gdzie
.I słowem kluczowym
powinno być:
.PP
.I Open (Otwórz)
(jeśli użytkownik naciśnie Enter lub kliknie dwukrotnie),
.I View (Podgląd)
(F3),
.I Edit (Edytuj)
(F4).
.PP
.I command
jest jakąkolwiek jedną linią powłoki, z zastosowaniem
prostego makra.
.PP
Cele są przeliczane od góry do dołu (porządek jest tu istotny). Jeśli
jakiejś akcji brakuje, poszukiwanie kontynuuje się tak jakby wcześniej
nie nastąpiła żadna zgodność (tj. jeśli zgadza się z wzorcem pierwszym
i trzecim i brakuje w pierwszym akcji View, to naciskając F3 użyta będzie
akcja z trzeciego wzorca). Opcja default powinna wychwycić wszystkie możliwe
akcje.
.PP
Ta komenda wywoła twój edytor na plik
.IR ~/.config/mc/mc.ext.ini .
If this file does not exist and you are not root, it will be copied from
.IR %sysconfdir%/mc/mc.ext.ini .
If you are root, you can choose the file to edit: user's
.I ~/.config/mc/mc.ext.ini
or system\-wide
.IR %sysconfdir%/mc/mc.ext.ini .
The format of this file is described in detail in it.
PP
.\"NODE " Background Jobs"
.SH " Prace w tle (Background jobs)"
Pozwalają ci one kontrolować status jakichkolwiek procesów wykonywanych
@ -2052,7 +2003,7 @@ Szuka następnego wystąpienia.
.B F8
Przełącza tryby Raw i Parsed. Pokaże to plik w postaci takiej w jakiej
został znaleziony na dysku, lub jeśli został wybrany jakiś filtr, bądź
też plik spełnia wymagania w pliku mc.ext, wyświetlane jest to co
też plik spełnia wymagania w pliku mc.ext.ini, wyświetlane jest to co
przekazuje filtr. Aktualne ustawienie jest zawsze przeciwne niż to napisane
na przycisku, przycisk wskazuje zawsze to co się stanie po jego
naciśnięciu.
@ -2300,7 +2251,7 @@ następującej konstrukcji:
.PP
.I /nazwa_pliku.tar:utar/[katalogu\-wewnątrza\-archiwum]
.PP
Plik mc.ext pozwala już na tworzenie skrótów do plików tar, oznacza to, że
Plik mc.ext.ini pozwala już na tworzenie skrótów do plików tar, oznacza to, że
możesz wybrać jakiś plik tar i nacisnąć enter aby do niego wejść, zobacz
sekcję Edycja pliku rozszerzeń po więcej szczegółów na temat tego jak
zostało to pomyślane.
@ -2791,7 +2742,7 @@ Podświetlenie uprawnień również pracuje w tym trybie.
.I use_file_to_guess_type
.IP
Jeśli ta zmienna jest ustawiona (standardowo) próbuje się dostosować
rozszerzenie pliku do tego wybranego w pliku mc.ext.
rozszerzenie pliku do tego wybranego w pliku mc.ext.ini.
.PP
.I xtree_mode
.IP
@ -2854,11 +2805,11 @@ jeśli jest ona nie ustawiona to znowu przetwarzany jest katalog /usr.
.IP
Plik pomocy dla programu.
.PP
%pkgdatadir%/mc.ext
%pkgdatadir%/mc.ext.ini
.IP
Standardowy plik rozszerzeń plików.
.PP
~/.config/mc/mc.ext
~/.config/mc/mc.ext.ini
.IP
Własny plik użytkownika, konfiguruje podgląd i edycje plików. Ma wyższy
priorytet niż plik systemowy.

View File

@ -1412,7 +1412,7 @@ Midnight Commander за счет добавления в личное меню
.PP
После выбора пункта меню
.\"LINK2"
.I "Файл расширений"
.I "Редактировать файл расширений"
.\"Edit Extension File"
вы можете связать с определённым расширением файла (окончанием имени
после последней точки) программу, которая будет запускаться для
@ -1670,86 +1670,17 @@ CDPATH (смотрите описание
встроенной команды cd\&.
.\"The cd internal command"
.\"NODE " Edit Extension File"
.SH " Файл расширений"
.SH " Редактировать файл расширений"
Этот пункт меню "Команда" служит для вызова редактора и редактирования
файла
.BR ~/.config/mc/mc.ext .
Этот файл имеет следующий формат (формат был изменен в версии 3.0):
.PP
Все строки, начинающиеся с #, или пустые строки игнорируются.
.PP
Строки, начинающиеся с первой колонки (будем говорить, что с таких строк
начинаются секции файла расширений), должны иметь следующий формат:
.PP
.IR keyword/desc ,
то есть всё, что стоит после
.I keyword/
и до конца строки, интерпретируется как
.IR desc .
.PP
В качестве keyword может стоять одно из следующих слов:
.TP
.I shell
если desc начинается с точки (мета\-символы не допускаются), то desc \-
это расширение имени файла, то есть шаблону соответствуют все файлы,
оканчивающиеся на desc. Пример: .tar будет означать *.tar. Если desc
не начинается с точки, то desc трактуется как полное имя файла.
.TP
.I regex
desc \- регулярное выражение. Обратите внимание на то, что используется
библиотека GNU regex, в силу чего "\\|" соответствует просто символу
"|", а "|" имеет специальное значение (логическое ИЛИ). Аналогично,
вместо скобок "(" и ")" надо использовать "\\(" и "\\)".
.TP
.I directory
Файл является каталогом, и его имя соответствует регулярному выражению desc.
.TP
.I type
в этом случае выбираются такие файлы, для которых `file %f`
соответствует регулярному выражению desc (часть filename: из `file %f`
удалена).
.TP
.I default
подходит любой файл, независимо от того, какое значение принимает desc.
.TP
.I include
\- означает общую секцию.
.PP
Все строки в секции, кроме первой, должны начинаться с пробела или
символа табуляции и иметь следующий формат:
.PP
.I keyword=command
(без пробелов возле "="), где
.I keyword
должно быть:
.PP
.I Open
(строка задаёт действия, выполняемые в том случае, когда пользователь
нажимает Enter или дважды щёлкает мышкой по имени файла),
.I View
(F3),
.I Edit
(F4) или
.I Include
(для добавления правил из общей секции).
.PP
.I command
\- любая однострочная команда оболочки, в которой допускаются простые
.\"LINK2"
макроподстановки\&.
.\"Macro Substitution"
.PP
Действие вычисляется сверху вниз (таким образом порядок следования
важен). Если некоторое действие пропущено, поиск продолжается как в
случае, если это действие не соответствует условию. Другими словами если
файл соответствует первой и второй секции, но действие View пропущено в
первой секции, то при нажатии клавиши
.B F3
будет использовано действие
.I View
из второй секции.
.B default
должно описывать все действия.
.BR ~/.config/mc/mc.ext.ini .
Если этот файл не существует и вы не root, этот файл будет скопирован с
.IR %sysconfdir%/mc/mc.ext.ini .
Если вы root, вы можете выбрать, какой из файлов редактировать: пользовательский
.I ~/.config/mc/mc.ext.ini
или системный
.IR %sysconfdir%/mc/mc.ext.ini .
Формат этого файла подробно описан в нём самом.
.\"NODE " Background Jobs"
.SH " Фоновые задания"
Этот пункт меню позволяет вам управлять фоновыми заданиями, запущенными
@ -3394,7 +3325,7 @@ ASCII и шестнадцатеричный (hex). Для переключени
.B F8
Переключение между режимами Raw/Parsed: файл отображается либо в том
виде, как он записан на диске, либо пропущенным через фильтр, который
задан для этого типа файлов в mc.ext. Текущий режим отображения всегда
задан для этого типа файлов в mc.ext.ini. Текущий режим отображения всегда
обратный по отношению к тому, который указан на экранной кнопке
.BR F8 ,
поскольку на кнопке указывается режим, к которому осуществляется переход
@ -3777,7 +3708,7 @@ tar\-файлам, используя команду chdir. Для перехо
.PP
.I cd ./filename.tar/utar://[dir\-inside\-tar]
.PP
Файл mc.ext по умолчанию содержит команды для просмотра
Файл mc.ext.ini по умолчанию содержит команды для просмотра
tar\-файлов, то есть обычно для получения списка файлов tar\-архива
достаточно просто переместить указатель на имя tar\-файла и нажать
.BR Enter .
@ -4688,7 +4619,7 @@ subshell. Если она установлена, то при нажатии
.B file
для определения типа файла в соответствии с типами файлов, указанными в файле
.\"LINK2"
mc.ext\&.
mc.ext.ini\&.
.\"Edit Extension File"
.PP
.I xtree_mode
@ -4837,11 +4768,11 @@ insert=\\e[Op
.IP
Файл подсказки для программы.
.PP
.I %pkgdatadir%/mc.ext
.I %pkgdatadir%/mc.ext.ini
.IP
Используемый по умолчанию общесистемный файл расширений.
.PP
.I ~/.config/mc/mc.ext
.I ~/.config/mc/mc.ext.ini
.IP
Файл расширений пользователя. Если этот файл существует, он используется
вместо общесистемного файла расширений.

View File

@ -1282,84 +1282,14 @@ awk '$9 ~! /incoming/ { print $9 }' < /var/log/xferlog
.\"NODE " Edit Extension File"
.SH " Уреди датотеку врста"
Ово покреће ваш уређивач над датотеком
.IR ~/.config/mc/mc.ext .
Формат ове датотеке је следећи:
.PP
Сви редови који почињу на # или празни редови се одбацују.
.PP
Редови који почињу у првој колони би требало да су у следећем формату:
.PP
.IR кључна_реч/израз ,
тј. све од косе црте до знака за нови ред је
.IR израз .
.PP
.I кључна_реч
може да буде:
.TP
.I shell
\-
.I израз
је врста (без џокерских знакова). Датотека задовољава услов ако се
њено име завршава на
.IR израз .
На пример, израз:
.I shell/.tar
задовољава
.IR *.tar .
.TP
.I regex
\-
.I израз
је регуларни израз. Датотека задовољава услов ако њен назив задовољава
регуларни израз.
.TP
.I type
\-
.I израз
је регуларни израз. Датотека задовољава услов ако излаз наредбе
.I file %f
без почетног дела `назив_датотеке:' задовољава регуларни израз
.IR израз .
.TP
.I default
\- (подразумевано) задовољава било која датотека.
.I израз
се занемарује.
.TP
.I include
\- означава општи одељак.
.I израз
је назив одељка.
.PP
Други редови би требало да почињу размаком или табулатором и требало
би да су у формату:
.I кључна_реч=наредба
(без размака око знака =), где би
.I кључна_реч
требало да буде:
.I Open
(покретање при притиску на тастер `Enter' или двоструком притиску
дугмета миша),
.I View
(преглед са F3),
.I Edit
(уређивање са F4) или
.I Include
(за додавање правила из општег одељка).
.I наредба
је било која наредба љуске од једног реда, уз једноставну
.\"LINK2"
замену макроа\&.
.\"Macro Substitution"
.PP
Правила се задовољавају од врха до дна, па је стога редослед битан.
Ако одговарајућа радња не постоји, претрага се наставља, као да
правило није ни постојало (нпр. ако датотека задовољава први и други
унос а радња под `View' (Преглед) недостаје у првом уносу, онда ће се
при притиску на F3 користити радња под `View' из другог уноса).
Правило
.I default
(подразумевано) би требало да задовољи све радње.
.IR ~/.config/mc/mc.ext.ini .
If this file does not exist and you are not root, it will be copied from
.IR %sysconfdir%/mc/mc.ext.ini .
If you are root, you can choose the file to edit: user's
.I ~/.config/mc/mc.ext.ini
or system\-wide
.IR %sysconfdir%/mc/mc.ext.ini .
The format of this file is described in detail in it.
.\"NODE " Background jobs"
.SH " Позадински послови"
Ово вам омогућава да управљате стањем било ког позадинског процеса
@ -2416,7 +2346,7 @@ linux би вас одвело у /usr/src/linux).
.PP
.B F8
Смењује сирови/рашчлањени режим: ово ће приказати датотеку онако каква
је она на диску или, у случају да је у датотеци mc.ext задан филтар за
је она на диску или, у случају да је у датотеци mc.ext.ini задан филтар за
обраду, као излаз филтра. Текући режим је увек онај други од оног
који стоји на натпису дугмета, пошто се на дугмету налази режим који
укључујете тим тастером.
@ -2677,7 +2607,7 @@ if the
.PP
.I /datoteka.tar/utar://[дир\-унутар\-дат]
.PP
Датотека `mc.ext' већ садржи пречицу за датотеке врсте `tar', што
Датотека `mc.ext.ini' већ садржи пречицу за датотеке врсте `tar', што
значи да можете само показати на датотеку врсте `tar' и притиснути
`Return' или `Enter' да бисте ушли у њу; погледајте одељак
.\"LINK2"
@ -3089,7 +3019,7 @@ base_color=normal=white,default:marked=magenta,default
Уколико је ова променљива укључена (подразумевано), ПН ће покренути
наредбу `file' за одређивање врсте датотека које су задане у
.\"LINK2"
датотеци `mc.ext'\&.
датотеци `mc.ext.ini'\&.
.\"Edit Extension File"
.TP
.I xtree_mode
@ -3151,11 +3081,11 @@ insert=\\e[Op
.IP
Датотека помоћи за програм.
.PP
.I %pkgdatadir%/mc.ext
.I %pkgdatadir%/mc.ext.ini
.IP
Подразумевана системска датотека врста.
.PP
.I ~/.config/mc/mc.ext
.I ~/.config/mc/mc.ext.ini
.IP
Корисничке датотеке врста, подешавања прегледача и уређивача. Уколико
постоје, оне заобилазе системске датотеке.

View File

@ -55,7 +55,8 @@
#define MC_ASHRC_FILE "ashrc"
#define MC_INPUTRC_FILE "inputrc"
#define MC_CONFIG_FILE "ini"
#define MC_EXT_FILE "mc.ext"
#define MC_EXT_FILE "mc.ext.ini"
#define MC_EXT_OLD_FILE "mc.ext"
#define MC_FILEPOS_FILE "filepos"
#define MC_HISTORY_FILE "history"
#define MC_HOTLIST_FILE "hotlist"

View File

@ -70,6 +70,7 @@ static const struct
/* User should move this file with applying some changes in file */
{ &mc_config_str, MC_EXT_FILE },
{ &mc_config_str, MC_EXT_OLD_FILE },
/* data */
{ &mc_data_str, MC_SKINS_DIR },

View File

@ -2,7 +2,7 @@
SUBDIRS = ext.d macros.d skins syntax
LIBFILES_OUT = mc.ext
LIBFILES_OUT = mc.ext.ini
noinst_DATA = xterm.ad

View File

@ -1,850 +0,0 @@
# Midnight Commander 3.0 extension file
# Warning: Structure of this file has changed completely with version 3.0
#
# All lines starting with # or empty lines are thrown away.
# Lines starting in the first column should have following format:
#
# keyword/descNL, i.e. everything after keyword/ until new line is desc
#
# keyword can be:
#
# shell (desc is, when starting with a dot, any extension (no wildcars),
# i.e. matches all the files *desc . Example: .tar matches *.tar;
# if it doesn't start with a dot, it matches only a file of that name)
#
# shell/i (desc is, when starting with a dot, any extension (no wildcars),
# The same as shell but with case insensitive.
#
# regex (desc is an extended regular expression)
# Please note that we are using the GNU regex library and thus
# \| matches the literal | and | has special meaning (or) and
# () have special meaning and \( \) stand for literal ( ).
#
# regex/i (desc is an extended regular expression)
# The same as regex but with case insensitive.
#
# type (file matches this if `file %f` matches regular expression desc
# (the filename: part from `file %f` is removed))
# Ignored if the "file" utility isn't used (not found in configure
step or disabled in ini file).
#
# type/i (file matches this if `file %f` matches regular expression desc)
# The same as type but with case insensitive.
#
# directory (matches any directory matching regular expression desc)
#
# include (matches an include directive)
#
# default (matches any file no matter what desc is)
#
# Other lines should start with a space or tab and should be in the format:
#
# keyword=commandNL (with no spaces around =), where keyword should be:
#
# Open (if the user presses Enter or doubleclicks it),
#
# View (F3), Edit (F4)
#
# Include is the keyword used to add any further entries from an include/
# section
#
# command is any one-line shell command, with the following substitutions:
#
# %% -> % character
# %p -> name of the current file (without path, but pwd is its path).
# Also provided to external application as MC_EXT_BASENAME
# global variable
# %f -> name of the current file. Unlike %p, if file is located on a
# non-local virtual filesystem, i.e. either tarfs or ftpfs,
# then the file will be temporarily copied into a local directory
# and %f will be the full path to this local temporal file.
# If you don't want to get a local copy and want to get the
# virtual fs path (like /#ftp:ftp.cvut.cz/pub/hungry/xword), then
# use %d/%p instead of %f.
# Also provided to external application as MC_EXT_FILENAME
# global variable
# %d -> name of the current directory (pwd, without trailing slash)
# Also provided to external application as MC_EXT_CURRENTDIR
# global variable
# %s -> "selected files", i.e. space separated list of tagged files if any
# or name of the current file.
# Also provided to external application as MC_EXT_SELECTED
# global variable
# %t -> list of tagged files
# Also provided to external application as MC_EXT_ONLYTAGGED
# global variable
# %u -> list of tagged files (they'll be untaged after the command)
#
# (If these 6 letters are in uppercase, they refer to the other panel.
# But you shouldn't have to use it in this file.)
#
#
# %cd -> the rest is a path mc should change into (cd won't work, since it's
# a child process). %cd handles even vfs names.
#
# %view -> the command you type will be piped into mc's internal file viewer
# if you type only the %view and no command, viewer will load %f file
# instead (i.e. no piping, so it is different to %view cat %f)
# %view may be directly followed by {} with a list of any of
# ascii (Ascii mode), hex (Hex mode), nroff (color highlighting for
# text using backspace for bold and underscore) and unform
# (no highlighting for nroff sequences) separated by commas.
#
# %var -> You use it like this: %var{VAR:default}. This macro will expand
# to the value of the VAR variable in the environment if it's set
# otherwise the value in default will be used. This is similar to
# the Bourne shell ${VAR-default} construct.
#
# Rules are applied from top to bottom, thus the order is important.
# If some actions are missing, search continues as if this target didn't
# match (i.e. if a file matches the first and second entry and View action
# is missing in the first one, then on pressing F3 the View action from
# the second entry will be used. default should catch all the actions.
#
# Any new entries you develop for you are always welcome if they are
# useful on more than one system. You can post your modifications
# as tickets at www.midnight-commander.org
### Changes ###
#
# Reorganization: 2012-03-07 Slava Zanko <slavazanko@gmail.com>
# 2021-03-28 Andrew Borodin <aborodin@vmail.ru>
# 2021-08-24 Tomas Szepe <szepe@pinerecords.com>
### GIT Repo ###
# gitfs changeset
regex/^\[git\]
Open=%cd %p/changesetfs://
View=%cd %p/patchsetfs://
### Archives ###
# Since we use "file -z", we should use regex/ and shell/ at first, then type/.
# .tgz, .tpz, .tar.gz, .tar.z, .tar.Z, .ipk, .gem
regex/\.t([gp]?z|ar\.g?[zZ])$|\.ipk$|\.gem$
Open=%cd %p/utar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view tar.gz
shell/.tar.bz
# Open=%cd %p/utar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view tar.bzip
regex/\.t(ar\.bz2|bz2?|b2)$
Open=%cd %p/utar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view tar.bzip2
# .tar.lzma, .tlz
regex/\.t(ar\.lzma|lz)$
Open=%cd %p/utar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view tar.lzma
# .tar.lz
shell/.tar.lz
Open=%cd %p/utar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view tar.lz
# .tar.lz4, .tlz4
regex/\.t(ar\.lz4|lz4)$
Open=%cd %p/utar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view tar.lz4
# .tar.xz, .txz
regex/\.t(ar\.xz|xz)$
Open=%cd %p/utar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view tar.xz
# .tar.zst, .tzst
regex/\.t(ar\.zst|zst)$
Open=%cd %p/utar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view tar.zst
# .tar.F - used in QNX
shell/.tar.F
# Open=%cd %p/utar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view tar.F
# .qpr/.qpk - QNX Neutrino package installer files
regex/\.qp[rk]$
Open=%cd %p/utar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view tar.qpr
# tar
shell/i/.tar
Open=%cd %p/utar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view tar
# arj
regex/i/\.a(rj|[0-9][0-9])$
Open=%cd %p/uarj://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view arj
# cab
shell/i/.cab
Open=%cd %p/ucab://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view cab
# ha
shell/i/.ha
Open=%cd %p/uha://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view ha
# rar
regex/i/\.r(ar|[0-9][0-9])$
Open=%cd %p/urar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view rar
# ALZip
shell/i/.alz
Open=%cd %p/ualz://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view alz
# cpio
shell/.cpio.Z
Open=%cd %p/ucpio://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view cpio.z
shell/.cpio.lz
Open=%cd %p/ucpio://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view cpio.lz
shell/.cpio.lz4
Open=%cd %p/ucpio://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view cpio.lz4
shell/.cpio.xz
Open=%cd %p/ucpio://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view cpio.xz
shell/.cpio.zst
Open=%cd %p/ucpio://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view cpio.zst
shell/.cpio.gz
Open=%cd %p/ucpio://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view cpio.gz
shell/i/.cpio
Open=%cd %p/ucpio://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view cpio
# initrd
regex/^(initramfs.*\.img|initrd(-.+)?\.img(-.+)?)$
Open=%cd %p/ucpio://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view cpio
# 7zip archives (they are not man pages)
shell/i/.7z
Open=%cd %p/u7z://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view 7z
# patch
regex/\.(diff|patch)(\.bz2)$
Open=%cd %p/patchfs://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view bz2
regex/\.(diff|patch)(\.(gz|Z))$
Open=%cd %p/patchfs://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view gz
regex/\.(diff|patch)(\.xz)$
Open=%cd %p/patchfs://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view xz
regex/\.(diff|patch)(\.zst)$
Open=%cd %p/patchfs://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view zst
# ls-lR
regex/(^|\.)ls-?lR(\.gz|Z|bz2)$
Open=%cd %p/lslR://
# trpm
shell/.trpm
Open=%cd %p/trpm://
View=%view{ascii} @EXTHELPERSDIR@/package.sh view trpm
# RPM packages (SuSE uses *.spm for source packages)
regex/\.(src\.rpm|spm)$
Open=%cd %p/rpm://
View=%view{ascii} @EXTHELPERSDIR@/package.sh view src.rpm
shell/.rpm
Open=%cd %p/rpm://
View=%view{ascii} @EXTHELPERSDIR@/package.sh view rpm
# deb
regex/\.u?deb$
Open=%cd %p/deb://
View=%view{ascii} @EXTHELPERSDIR@/package.sh view deb
# dpkg
shell/.debd
Open=%cd %p/debd://
View=%view{ascii} @EXTHELPERSDIR@/package.sh view debd
# apt
shell/.deba
Open=%cd %p/deba://
View=%view{ascii} @EXTHELPERSDIR@/package.sh view deba
# ISO9660
shell/i/.iso
Open=%cd %p/iso9660://
View=%view{ascii} @EXTHELPERSDIR@/misc.sh view iso9660
regex/\.(diff|patch)$
Open=%cd %p/patchfs://
View=%view{ascii} @EXTHELPERSDIR@/misc.sh view cat
# ar library
regex/\.s?a$
Open=%cd %p/uar://
#Open=%view{ascii} ar tv %f
View=%view{ascii} @EXTHELPERSDIR@/misc.sh view ar
# gplib
shell/i/.lib
Open=%cd %p/ulib://
View=%view{ascii} @EXTHELPERSDIR@/misc.sh view lib
# Mailboxes
type/^ASCII\ mail\ text
Open=%cd %p/mailfs://
### Sources ###
# C/C++
regex/i/\.(c|cc|cpp)$
Include=editor
# C/C++ header
regex/i/\.(h|hh|hpp)$
Include=editor
# Fortran
shell/i/.f
Include=editor
# Assembler
regex/i/\.(s|asm)$
Include=editor
# .so libraries
regex/\.(so|so\.[0-9\.]*)$
View=%view{ascii} @EXTHELPERSDIR@/misc.sh view so
# Object
type/^ELF
#Open=%var{PAGER:more} %f
View=%view{ascii} @EXTHELPERSDIR@/misc.sh view elf
### Documentation ###
# Texinfo
#regex/\.(te?xi|texinfo)$
# GNU Info page
type/^Info\ text
Open=@EXTHELPERSDIR@/text.sh open info
shell/.info
Open=@EXTHELPERSDIR@/text.sh open info
# Exception: .3gp are video files not manual pages
shell/i/.3gp
Include=video
# Troff with me macros.
# Exception - "read.me" is not a nroff file.
shell/read.me
Open=
View=
shell/.me
Open=@EXTHELPERSDIR@/text.sh open nroff.me %var{PAGER:more}
View=%view{ascii,nroff} @EXTHELPERSDIR@/text.sh view nroff.me %var{PAGER:more}
# Troff with ms macros.
shell/.ms
Open=@EXTHELPERSDIR@/text.sh open nroff.ms %var{PAGER:more}
View=%view{ascii,nroff} @EXTHELPERSDIR@/text.sh view nroff.ms %var{PAGER:more}
# Manual page - compressed
type/troff.*gzip compressed
Open=@EXTHELPERSDIR@/text.sh open man.gz %var{PAGER:more}
View=%view{ascii,nroff} @EXTHELPERSDIR@/text.sh view man.gz %var{PAGER:more}
type/troff.*bzip compressed
Open=@EXTHELPERSDIR@/text.sh open man.bz %var{PAGER:more}
View=%view{ascii,nroff} @EXTHELPERSDIR@/text.sh view man.bz %var{PAGER:more}
type/troff.*bzip2 compressed
Open=@EXTHELPERSDIR@/text.sh open man.bz2 %var{PAGER:more}
View=%view{ascii,nroff} @EXTHELPERSDIR@/text.sh view man.bz2 %var{PAGER:more}
# Manual page
type/troff or preprocessor input
Open=@EXTHELPERSDIR@/text.sh open man %var{PAGER:more}
View=%view{ascii,nroff} @EXTHELPERSDIR@/text.sh view man %var{PAGER:more}
regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.lz$
Open=@EXTHELPERSDIR@/text.sh open man.lz %var{PAGER:more}
View=%view{ascii,nroff} @EXTHELPERSDIR@/text.sh view man.lz %var{PAGER:more}
regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.lz4$
Open=@EXTHELPERSDIR@/text.sh open man.lz4 %var{PAGER:more}
View=%view{ascii,nroff} @EXTHELPERSDIR@/text.sh view man.lz4 %var{PAGER:more}
regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.lzma$
Open=@EXTHELPERSDIR@/text.sh open man.lzma %var{PAGER:more}
View=%view{ascii,nroff} @EXTHELPERSDIR@/text.sh view man.lzma %var{PAGER:more}
regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.xz$
Open=@EXTHELPERSDIR@/text.sh open man.xz %var{PAGER:more}
View=%view{ascii,nroff} @EXTHELPERSDIR@/text.sh view man.xz %var{PAGER:more}
regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.zst$
Open=@EXTHELPERSDIR@/text.sh open man.zst %var{PAGER:more}
View=%view{ascii,nroff} @EXTHELPERSDIR@/text.sh view man.zst %var{PAGER:more}
# Perl pod page
shell/.pod
Open=@EXTHELPERSDIR@/text.sh open pod %var{PAGER:more}
View=%view{ascii,nroff} @EXTHELPERSDIR@/text.sh view pod %var{PAGER:more}
# CHM
shell/i/.chm
Open=@EXTHELPERSDIR@/text.sh open chm
### Images ###
type/^GIF
Include=image
type/^JPEG
View=%view{ascii} @EXTHELPERSDIR@/image.sh view jpeg
Include=image
type/^PC\ bitmap
Include=image
type/^PNG
Include=image
type/^JNG
Include=image
type/^MNG
Include=image
type/^TIFF
Include=image
type/^PBM
Include=image
type/^PGM
Include=image
type/^PPM
Include=image
type/^Netpbm
Include=image
shell/.xcf
Open=@EXTHELPERSDIR@/image.sh open xcf
shell/.xbm
Open=@EXTHELPERSDIR@/image.sh open xbm
shell/.xpm
Include=image
View=@EXTHELPERSDIR@/image.sh view xpm %f
shell/.ico
Include=image
shell/i/.svg
View=%view{ascii} @EXTHELPERSDIR@/image.sh view svg
Open=@EXTHELPERSDIR@/image.sh open svg
### Sound files ###
regex/i/\.(wav|snd|voc|au|smp|aiff|snd|m4a|ape|aac|wv)$
Open=@EXTHELPERSDIR@/sound.sh open common
View=%view{ascii} @EXTHELPERSDIR@/sound.sh view common
regex/i/\.(mod|s3m|xm|it|mtm|669|stm|ult|far)$
Open=@EXTHELPERSDIR@/sound.sh open mod
shell/i/.waw22
Open=@EXTHELPERSDIR@/sound.sh open wav22
shell/i/.mp3
Open=@EXTHELPERSDIR@/sound.sh open mp3
View=%view{ascii} @EXTHELPERSDIR@/sound.sh view mp3
regex/i/\.og[gax]$
Open=@EXTHELPERSDIR@/sound.sh open ogg
View=%view{ascii} @EXTHELPERSDIR@/sound.sh view ogg
shell/i/.opus
Open=@EXTHELPERSDIR@/sound.sh open opus
View=%view{ascii} @EXTHELPERSDIR@/sound.sh view opus
regex/i/\.(spx|flac)$
Open=@EXTHELPERSDIR@/sound.sh open common
regex/i/\.(midi?|rmid?)$
Open=@EXTHELPERSDIR@/sound.sh open midi
shell/i/.wma
Open=@EXTHELPERSDIR@/sound.sh open wma
View=%view{ascii} @EXTHELPERSDIR@/sound.sh view wma
### Play lists ###
regex/i/\.(m3u|pls)$
Open=@EXTHELPERSDIR@/sound.sh open playlist
### Video ###
shell/i/.avi
Include=video
regex/i/\.as[fx]$
Include=video
shell/i/.divx
Include=video
shell/i/.mkv
Include=video
regex/i/\.(mov|qt)$
Include=video
regex/i/\.(mp4|m4v|mpe?g)$
Include=video
# MPEG-2 TS container + H.264 codec
shell/i/.mts
Include=video
shell/i/.ts
Include=video
shell/i/.vob
Include=video
shell/i/.wmv
Include=video
regex/i/\.fl[icv]$
Include=video
shell/i/.ogv
Include=video
regex/i/\.ra?m$
Open=@EXTHELPERSDIR@/video.sh open ram
# WebM
shell/i/.webm
Include=video
type/WebM
Include=video
### Documents ###
# Postscript
type/^PostScript
Open=@EXTHELPERSDIR@/doc.sh open ps
View=%view{ascii} @EXTHELPERSDIR@/doc.sh view ps
# PDF
type/^PDF
Open=@EXTHELPERSDIR@/doc.sh open pdf
View=%view{ascii} @EXTHELPERSDIR@/doc.sh view pdf
# html
regex/i/\.html?$
Open=@EXTHELPERSDIR@/web.sh open html
View=%view{ascii} @EXTHELPERSDIR@/web.sh view html
# StarOffice 5.2
shell/.sdw
Open=@EXTHELPERSDIR@/doc.sh open ooffice
# StarOffice 6 and OpenOffice.org formats
regex/i/\.(odt|fodt|ott|sxw|stw|ods|fods|ots|sxc|stc|odp|fodp|otp|sxi|sti|odg|fodg|otg|sxd|std|odb|odf|sxm|odm|sxg)$
Open=@EXTHELPERSDIR@/doc.sh open ooffice
View=%view{ascii} @EXTHELPERSDIR@/doc.sh view odt
# AbiWord
shell/.abw
Open=@EXTHELPERSDIR@/doc.sh open abw
# Gnumeric
shell/i/.gnumeric
Open=@EXTHELPERSDIR@/doc.sh open gnumeric
# Microsoft Word Document
regex/i/\.(do[ct]|wri|docx)$
Open=@EXTHELPERSDIR@/doc.sh open msdoc
View=%view{ascii} @EXTHELPERSDIR@/doc.sh view msdoc
type/^Microsoft\ Word
Open=@EXTHELPERSDIR@/doc.sh open msdoc
View=%view{ascii} @EXTHELPERSDIR@/doc.sh view msdoc
# RTF document
shell/i/.rtf
Open=@EXTHELPERSDIR@/doc.sh open msdoc
# Microsoft Excel Worksheet
regex/i/\.(xl[sw]|xlsx)$
Open=@EXTHELPERSDIR@/doc.sh open msxls
View=%view{ascii} @EXTHELPERSDIR@/doc.sh view msxls
type/^Microsoft\ Excel
Open=@EXTHELPERSDIR@/doc.sh open msxls
View=%view{ascii} @EXTHELPERSDIR@/doc.sh view msxls
# Microsoft PowerPoint Presentation
regex/i/\.(pp[ts]|pptx)$
Open=@EXTHELPERSDIR@/doc.sh open msppt
View=%view{ascii} @EXTHELPERSDIR@/doc.sh view msppt
# Use OpenOffice.org/LibreOffice to open any MS Office documents
type/^Microsoft\ Office\ Document
Open=@EXTHELPERSDIR@/doc.sh open ooffice
type/^Microsoft\ OOXML
Open=@EXTHELPERSDIR@/doc.sh open ooffice
# Framemaker
type/^FrameMaker
Open=@EXTHELPERSDIR@/doc.sh open framemaker
# DVI
shell/i/.dvi
Open=@EXTHELPERSDIR@/doc.sh open dvi
View=%view{ascii} @EXTHELPERSDIR@/doc.sh view dvi
# TeX
shell/i/.tex
Include=editor
# Markdown
shell/i/.md
Include=editor
# DjVu
regex/i/\.djvu?$
Open=@EXTHELPERSDIR@/doc.sh open djvu
View=%view{ascii} @EXTHELPERSDIR@/doc.sh view djvu
# Comic Books
regex/i/\.cb[zr]$
Open=@EXTHELPERSDIR@/doc.sh open comic
# Epup, mobi, fb2
regex/i/\.(epub|mobi|fb2)$
Open=@EXTHELPERSDIR@/doc.sh open ebook
View=%view{ascii} @EXTHELPERSDIR@/doc.sh view ebook
### Miscellaneous ###
# Compiled Java classes
shell/.class
View=%view{ascii} @EXTHELPERSDIR@/misc.sh view javaclass
# Imakefile
shell/Imakefile
Open=xmkmf -a
# Makefile.PL (MakeMaker)
regex/^Makefile\.(PL|pl)$
Open=%var{PERL:perl} %f
# Makefile
regex/[Mm]akefile
Open=make -f %f %{Enter parameters}
# sqlite3.db
type/^SQLite 3.x database
Open=@EXTHELPERSDIR@/misc.sh open sqlite
View=%view{ascii} @EXTHELPERSDIR@/misc.sh view sqlite
# dbf
shell/i/.dbf
Open=@EXTHELPERSDIR@/misc.sh open dbf
View=%view{ascii} @EXTHELPERSDIR@/misc.sh view dbf
# REXX script
regex/\.(rexx?|cmd)$
Open=rexx %f %{Enter parameters};echo "Press ENTER";read y
# Disk images for Commodore computers (VIC20, C64, C128)
shell/i/.d64
Open=%cd %p/uc1541://
View=%view{ascii} c1541 %f -list
Extract=c1541 %f -extract
# Glade, a user interface designer for GTK+ and GNOME
shell/i/.glade
Open=@EXTHELPERSDIR@/misc.sh open glade
# Gettext Catalogs
regex/\.g?mo$
View=%view{ascii} @EXTHELPERSDIR@/misc.sh view mo
# po
shell/.po
Open=@EXTHELPERSDIR@/misc.sh open po
# lyx
shell/i/.lyx
Open=@EXTHELPERSDIR@/misc.sh open lyx
View=%view{ascii} @EXTHELPERSDIR@/misc.sh view lyx
# torrent
shell/i/.torrent
View=%view{ascii} @EXTHELPERSDIR@/misc.sh view torrent
### Plain compressed files ###
# ace
shell/i/.ace
Open=%cd %p/uace://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view ace
Extract=unace x %f
# arc
shell/i/.arc
Open=%cd %p/uarc://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view arc
Extract=arc x %f '*'
Extract (with flags)=I=%{Enter any Arc flags:}; if test -n "$I"; then arc x $I %f; fi
# zip
shell/i/.zip
Open=%cd %p/uzip://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view zip
# zoo
shell/i/.zoo
Open=%cd %p/uzoo://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view zoo
# lz4
shell/i/.lz4
Open=@EXTHELPERSDIR@/archive.sh view lz4 %var{PAGER:more}
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view lz4
# WIM
shell/i/\.wim
Open=%cd %p/uwim://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view wim
# gzip
type/\(gzip compressed
Open=@EXTHELPERSDIR@/archive.sh view gz %var{PAGER:more}
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view gz
# bzip2
type/\(bzip2 compressed
Open=@EXTHELPERSDIR@/archive.sh view bzip2 %var{PAGER:more}
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view bz2
# bzip
type/\(bzip compressed
Open=@EXTHELPERSDIR@/archive.sh view bzip %var{PAGER:more}
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view bzip
# compress
type/\(compress'd
Open=@EXTHELPERSDIR@/archive.sh view gz %var{PAGER:more}
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view gz
# lz
type/\(lzip compressed
Open=@EXTHELPERSDIR@/archive.sh view lz %var{PAGER:more}
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view lz
# lzma
type/\(LZMA compressed
Open=@EXTHELPERSDIR@/archive.sh view lzma %var{PAGER:more}
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view lzma
# xz
type/\(XZ compressed
Open=@EXTHELPERSDIR@/archive.sh view xz %var{PAGER:more}
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view xz
# zstd
type/\(Zstandard compressed
Open=@EXTHELPERSDIR@/archive.sh view zst %var{PAGER:more}
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view zst
# zip
type/\(Zip archive
Open=%cd %p/uzip://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view zip
# jar(zip)
type/i/\(Java\ (Jar\ file|archive)\ data\ \((zip|JAR)\)
Open=%cd %p/uzip://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view zip
# lha
type/^LHa\ .*archive
Open=%cd %p/ulha://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view lha
# PAK
type/^PAK\ .*archive
Open=%cd %p/unar://
View=%view{ascii} @EXTHELPERSDIR@/archive.sh view pak
# Parity Archive
type/^Parity\ Archive\ Volume\ Set
Open=@EXTHELPERSDIR@/archive.sh open par2
### Includes
# includes should be at end of bindings
include/editor
Open=%var{EDITOR:vi} %f
include/image
Open=@EXTHELPERSDIR@/image.sh open ALL_FORMATS
View=%view{ascii} @EXTHELPERSDIR@/image.sh view ALL_FORMATS
include/video
Open=@EXTHELPERSDIR@/video.sh open ALL_FORMATS
View=%view{ascii} @EXTHELPERSDIR@/video.sh view ALL_FORMATS
### Default ###
# Default target for anything not described above
default/*
Open=
View=
### EOF ###

1126
misc/mc.ext.ini.in Normal file

File diff suppressed because it is too large Load Diff

View File

@ -91,7 +91,8 @@ typedef char *(*quote_func_t) (const char *name, gboolean quote_percent);
* With this we avoid loading/parsing the file each time we
* need it
*/
static char *data = NULL;
static mc_config_t *ext_ini = NULL;
static gchar **ext_ini_groups = NULL;
static vfs_path_t *localfilecopy_vpath = NULL;
static char buffer[BUF_1K];
@ -103,6 +104,9 @@ static gboolean is_cd = FALSE;
static gboolean written_nonspace = FALSE;
static gboolean do_local_copy = FALSE;
static const char *descr_group = "mc.ext.ini";
static const char *default_group = "Default";
/* --------------------------------------------------------------------------------------------- */
/*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */
@ -428,8 +432,6 @@ exec_extension (WPanel * panel, void *target, const vfs_path_t * filename_vpath,
FILE *cmd_file;
char *cmd = NULL;
g_return_val_if_fail (lc_data != NULL, NULL);
pbuffer = NULL;
localmtime = 0;
quote_func = name_quote;
@ -761,6 +763,22 @@ regex_check_type (const vfs_path_t * filename_vpath, const char *ptr, gboolean c
/* --------------------------------------------------------------------------------------------- */
static void
check_old_extension_file (void)
{
char *extension_old_file;
extension_old_file = mc_config_get_full_path (MC_EXT_OLD_FILE);
if (exist_file (extension_old_file))
message (D_ERROR, _("Warning"),
_("You have an outdated %s file.\nMidnight Commander now uses %s file.\n"
"Please copy your modifications of the old file to the new one."),
extension_old_file, MC_EXT_FILE);
g_free (extension_old_file);
}
/* --------------------------------------------------------------------------------------------- */
static gboolean
load_extension_file (void)
{
@ -772,6 +790,9 @@ load_extension_file (void)
if (!exist_file (extension_file))
{
g_free (extension_file);
check_old_extension_file ();
check_stock_mc_ext:
extension_file = mc_build_filename (mc_global.sysconfig_dir, MC_EXT_FILE, (char *) NULL);
if (!exist_file (extension_file))
@ -779,40 +800,41 @@ load_extension_file (void)
g_free (extension_file);
extension_file =
mc_build_filename (mc_global.share_data_dir, MC_EXT_FILE, (char *) NULL);
if (!exist_file (extension_file))
MC_PTR_FREE (extension_file);
}
mc_user_ext = FALSE;
}
g_file_get_contents (extension_file, &data, NULL, NULL);
g_free (extension_file);
if (data == NULL)
if (extension_file != NULL)
{
ext_ini = mc_config_init (extension_file, TRUE);
g_free (extension_file);
}
if (ext_ini == NULL)
return FALSE;
if (strstr (data, "default/") == NULL)
/* Check version */
if (!mc_config_has_group (ext_ini, descr_group))
{
if (strstr (data, "regex/") == NULL && strstr (data, "shell/") == NULL &&
strstr (data, "type/") == NULL)
flush_extension_file ();
if (!mc_user_ext)
{
MC_PTR_FREE (data);
char *title;
if (!mc_user_ext)
{
char *title;
title =
g_strdup_printf (_(" %s%s file error"), mc_global.sysconfig_dir, MC_EXT_FILE);
message (D_ERROR, title,
_("The format of the %s%s file has changed with version 3.0. "
"It seems that the installation failed. Please fetch a fresh copy "
"from the Midnight Commander package."),
mc_global.sysconfig_dir, MC_EXT_FILE);
g_free (title);
return FALSE;
}
home_error = TRUE;
goto check_stock_mc_ext;
title = g_strdup_printf (_(" %s%s file error"), mc_global.sysconfig_dir, MC_EXT_FILE);
message (D_ERROR, title,
_("The format of the %s%s file has changed with version 4.0. "
"It seems that the installation has failed. Please fetch a fresh copy "
"from the Midnight Commander package."),
mc_global.sysconfig_dir, MC_EXT_FILE);
g_free (title);
return FALSE;
}
home_error = TRUE;
goto check_stock_mc_ext;
}
if (home_error)
@ -822,7 +844,7 @@ load_extension_file (void)
extension_file = mc_config_get_full_path (MC_EXT_FILE);
title = g_strdup_printf (_("%s file error"), extension_file);
message (D_ERROR, title,
_("The format of the %s file has changed with version 3.0. You may either want "
_("The format of the %s file has changed with version 4.0. You may either want "
"to copy it from %s%s or use that file as an example of how to write it."),
extension_file, mc_global.sysconfig_dir, MC_EXT_FILE);
g_free (extension_file);
@ -839,7 +861,11 @@ load_extension_file (void)
void
flush_extension_file (void)
{
MC_PTR_FREE (data);
g_strfreev (ext_ini_groups);
ext_ini_groups = NULL;
mc_config_deinit (ext_ini);
ext_ini = NULL;
}
/* --------------------------------------------------------------------------------------------- */
@ -861,19 +887,19 @@ int
regex_command_for (void *target, const vfs_path_t * filename_vpath, const char *action,
vfs_path_t ** script_vpath)
{
char *p, *q, *r, c;
const char *filename;
size_t file_len;
size_t filename_len;
gboolean found = FALSE;
gboolean error_flag = FALSE;
int ret = 0;
struct stat mystat;
int view_at_line_number = 0;
char *include_target = NULL;
size_t include_target_len = 0;
#ifdef USE_FILE_CMD
gboolean have_type = FALSE; /* Flag used by regex_check_type() */
#endif
char **group_iter;
char *include_group = NULL;
const char *current_group;
if (filename_vpath == NULL)
return 0;
@ -888,184 +914,170 @@ regex_command_for (void *target, const vfs_path_t * filename_vpath, const char *
action = "View";
}
if (data == NULL && !load_extension_file ())
if (ext_ini == NULL && !load_extension_file ())
return 0;
mc_stat (filename_vpath, &mystat);
filename = vfs_path_get_last_path_str (filename_vpath);
filename = x_basename (filename);
file_len = strlen (filename);
filename_len = strlen (filename);
for (p = data; *p != '\0'; p++)
if (ext_ini_groups == NULL)
ext_ini_groups = mc_config_get_groups (ext_ini, NULL);
/* find matched type, regex or shell pattern */
for (group_iter = ext_ini_groups; *group_iter != NULL && !found; group_iter++)
{
for (q = p; whitespace (*q); q++)
;
if (*q == '\n' || *q == '\0')
p = q; /* empty line */
if (*p == '#') /* comment */
while (*p != '\0' && *p != '\n')
p++;
if (*p == '\n')
continue;
if (*p == '\0')
break;
if (p == q)
enum
{
/* i.e. starts in the first column, should be keyword/descNL */
gboolean case_insense;
TYPE_UNUSED,
TYPE_NOT_FOUND,
TYPE_FOUND
} type_state = TYPE_UNUSED;
found = FALSE;
q = strchr (p, '\n');
if (q == NULL)
q = strchr (p, '\0');
c = *q;
*q = '\0';
if (include_target != NULL)
{
if ((strncmp (p, "include/", 8) == 0)
&& (strncmp (p + 8, include_target, include_target_len) == 0))
found = TRUE;
}
else if (strncmp (p, "regex/", 6) == 0)
{
mc_search_t *search;
const gchar *g = *group_iter;
gchar *pattern;
gboolean ignore_case;
p += 6;
case_insense = (strncmp (p, "i/", 2) == 0);
if (case_insense)
p += 2;
if (strcmp (g, descr_group) == 0 || strncmp (g, "Include/", 8) == 0
|| strcmp (g, default_group) == 0)
continue;
search = mc_search_new (p, DEFAULT_CHARSET);
if (search != NULL)
{
search->search_type = MC_SEARCH_T_REGEX;
search->is_case_sensitive = !case_insense;
found = mc_search_run (search, filename, 0, file_len, NULL);
mc_search_free (search);
}
}
else if (strncmp (p, "directory/", 10) == 0)
{
if (S_ISDIR (mystat.st_mode)
&& mc_search (p + 10, DEFAULT_CHARSET, vfs_path_as_str (filename_vpath),
MC_SEARCH_T_REGEX))
found = TRUE;
}
else if (strncmp (p, "shell/", 6) == 0)
{
int (*cmp_func) (const char *s1, const char *s2, size_t n) = strncmp;
/* The "Directory" parameter is a special case: if it's present then
"Type", "Regex", and "Shell" parameters are ignored */
pattern = mc_config_get_string_raw (ext_ini, g, "Directory", NULL);
if (pattern != NULL)
{
found = S_ISDIR (mystat.st_mode)
&& mc_search (pattern, DEFAULT_CHARSET, vfs_path_as_str (filename_vpath),
MC_SEARCH_T_REGEX);
g_free (pattern);
p += 6;
case_insense = (strncmp (p, "i/", 2) == 0);
if (case_insense)
{
p += 2;
cmp_func = strncasecmp;
}
continue; /* stop if found */
}
if (*p == '.' && file_len >= (size_t) (q - p))
{
if (cmp_func (p, filename + file_len - (q - p), q - p) == 0)
found = TRUE;
}
else
{
if ((size_t) (q - p) == file_len && cmp_func (p, filename, file_len) == 0)
found = TRUE;
}
}
#ifdef USE_FILE_CMD
else if (use_file_to_check_type && strncmp (p, "type/", 5) == 0)
if (use_file_to_check_type)
{
pattern = mc_config_get_string_raw (ext_ini, g, "Type", NULL);
if (pattern != NULL)
{
GError *mcerror = NULL;
p += 5;
ignore_case = mc_config_get_bool (ext_ini, g, "TypeIgnoreCase", FALSE);
type_state =
regex_check_type (filename_vpath, pattern, ignore_case, &have_type, &mcerror)
? TYPE_FOUND : TYPE_NOT_FOUND;
g_free (pattern);
case_insense = (strncmp (p, "i/", 2) == 0);
if (case_insense)
p += 2;
found = regex_check_type (filename_vpath, p, case_insense, &have_type, &mcerror);
if (mc_error_message (&mcerror, NULL))
error_flag = TRUE; /* leave it if file cannot be opened */
}
#endif /* USE_FILE_CMD */
else if (strncmp (p, "default/", 8) == 0)
found = TRUE;
*q = c;
if (type_state == TYPE_NOT_FOUND)
continue;
}
}
#endif /* USE_FILE_CMD */
pattern = mc_config_get_string_raw (ext_ini, g, "Regex", NULL);
if (pattern != NULL)
{
mc_search_t *search;
ignore_case = mc_config_get_bool (ext_ini, g, "RegexIgnoreCase", FALSE);
search = mc_search_new (pattern, DEFAULT_CHARSET);
g_free (pattern);
if (search != NULL)
{
search->search_type = MC_SEARCH_T_REGEX;
search->is_case_sensitive = !ignore_case;
found = mc_search_run (search, filename, 0, filename_len, NULL);
mc_search_free (search);
}
found = found && (type_state == TYPE_UNUSED || type_state == TYPE_FOUND);
}
else
{ /* List of actions */
p = q;
q = strchr (p, '\n');
if (q == NULL)
q = strchr (p, '\0');
if (found && !error_flag)
{
pattern = mc_config_get_string_raw (ext_ini, g, "Shell", NULL);
if (pattern != NULL)
{
r = strchr (p, '=');
if (r != NULL)
{
c = *r;
*r = '\0';
if (strcmp (p, "Include") == 0)
{
char *t;
int (*cmp_func) (const char *s1, const char *s2, size_t n);
size_t pattern_len;
include_target = p + 8;
t = strchr (include_target, '\n');
ignore_case = mc_config_get_bool (ext_ini, g, "ShellIgnoreCase", FALSE);
cmp_func = ignore_case ? strncasecmp : strncmp;
pattern_len = strlen (pattern);
if (t != NULL)
include_target_len = (size_t) (t - include_target);
else
include_target_len = strlen (include_target);
if (*pattern == '.' && filename_len >= pattern_len)
found =
cmp_func (pattern, filename + filename_len - pattern_len, pattern_len) == 0;
else
found = pattern_len == filename_len
&& cmp_func (pattern, filename, filename_len) == 0;
*r = c;
p = q;
found = FALSE;
g_free (pattern);
if (*p == '\0')
break;
continue;
}
if (strcmp (action, p) != 0)
*r = c;
else
{
*r = c;
for (p = r + 1; whitespace (*p); p++)
;
/* Empty commands just stop searching
* through, they don't do anything
*/
if (p < q)
{
vfs_path_t *sv;
sv = exec_extension (current_panel, target, filename_vpath, r + 1,
view_at_line_number);
if (script_vpath != NULL)
*script_vpath = sv;
else
exec_cleanup_script (sv);
ret = 1;
}
break;
}
}
found = found && (type_state == TYPE_UNUSED || type_state == TYPE_FOUND);
}
else
found = type_state == TYPE_FOUND;
}
}
/* group is found, process actions */
if (found)
{
char *include_value;
group_iter--;
/* "Include" parameter has the highest priority over any actions */
include_value = mc_config_get_string_raw (ext_ini, *group_iter, "Include", NULL);
if (include_value != NULL)
{
/* find "Include/include_value" group */
include_group = g_strconcat ("Include/", include_value, (char *) NULL);
g_free (include_value);
found = mc_config_has_group (ext_ini, include_group);
}
}
if (found)
current_group = include_group != NULL ? include_group : *group_iter;
else
{
current_group = default_group;
found = mc_config_has_group (ext_ini, current_group);
}
if (found && !error_flag)
{
gchar *action_value;
action_value = mc_config_get_string_raw (ext_ini, current_group, action, NULL);
/* Empty commands just stop searching through, they don't do anything */
if (action_value != NULL && *action_value != '\0')
{
vfs_path_t *sv;
sv = exec_extension (current_panel, target, filename_vpath, action_value,
view_at_line_number);
if (script_vpath != NULL)
*script_vpath = sv;
else
exec_cleanup_script (sv);
ret = 1;
}
p = q;
if (*p == '\0')
break;
g_free (action_value);
}
g_free (include_group);
return (error_flag ? -1 : ret);
}