Ticket #2848: fixup of user-defined keymap load.
Modify algorithm of keymap files load: 1) Unconditionally load /usr/share/mc/mc.keymap 2) Unconditionally load /etc/mc/mc.keymap Then load one of following user-defined keymaps, stop on success: 3) set via --keymap command line option 4) set via MC_KEYMAP environment variable 5) set via keymap key in config file 6) ~/.config/mc/mc.keymap Fix of double load of keymap file if name is same as name of system-wide keymap file. Update man pages. Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
Этот коммит содержится в:
родитель
23ad3ecda1
Коммит
99ead577f7
@ -66,7 +66,7 @@ Display configure options.
|
||||
Reset softkeys to their default from the termcap/terminfo
|
||||
database. Only useful on HP terminals when the function keys don't work.
|
||||
.TP
|
||||
.I \-K file
|
||||
.I \-K file, \-\-keymap=file
|
||||
Specify a name of keymap file in the command line.
|
||||
.TP
|
||||
.I \-\-nokeymap
|
||||
@ -325,7 +325,13 @@ the input lines in the query dialogs.
|
||||
.\"NODE " Keys_redefine"
|
||||
.SH " Redefine hotkey bindings"
|
||||
Hotkey bindings may be read from external file (keymap\-file).
|
||||
A keymap\-file is searched on the following algorithm (to the first one found):
|
||||
Initially, Mignight Commander creates key bindings using keymap defined
|
||||
in the source code. Then, two files
|
||||
.B %prefix%/share/mc/mc.keymap
|
||||
and
|
||||
.B %sysconfdir%/mc/mc.keymap
|
||||
are loaded always, sequentially reassigned key bindings defined earlier.
|
||||
User\-defined keymap\-file is searched on the following algorithm (to the first one found):
|
||||
.IP
|
||||
.br
|
||||
1) command line option
|
||||
@ -345,11 +351,6 @@ of config file.
|
||||
4) File
|
||||
.B ~/.config/mc/mc.keymap
|
||||
.br
|
||||
5) File
|
||||
.B %sysconfdir%/mc/mc.keymap
|
||||
.br
|
||||
6) File
|
||||
.B %prefix%/share/mc/mc.keymap
|
||||
.PP
|
||||
Command line option, environment variable and parameter in config file may
|
||||
contain the absolute path to the keymap\-file (with the extension \.keymap
|
||||
|
@ -79,7 +79,7 @@ UNIX\-подобных операционных системах.
|
||||
termcap/terminfo. Этот ключ используется только на терминалах HP, где
|
||||
функциональные клавиши не работают.
|
||||
.TP
|
||||
.I \-K файл
|
||||
.I \-K файл, \-\-keymap=файл
|
||||
Задаёт файл клавиатурных команд для переопределения привязки клавиатурных
|
||||
комбинаций к действиям.
|
||||
.TP
|
||||
@ -320,8 +320,14 @@ S\-<символ> означает, что нужно держать в нажа
|
||||
.\"NODE " Keys_redefine"
|
||||
.SH " Переопределение клавиатурных команд"
|
||||
Клавиатурные команды могут быть прочитаны из внешнего файла.
|
||||
Поиск файла клавиатурных команд производится по следующему алгоритму
|
||||
(до первого нахождения файла):
|
||||
Сначала Midnight Commander создаёт карту клавиатурных команд из списка,
|
||||
определённого в исходном коде. Затем всегда загружаются два файла
|
||||
.B %sysconfdir%/mc/mc.keymap
|
||||
и
|
||||
.B %prefix%/share/mc/mc.keymap ,
|
||||
последовательно переопределяя ранее загруженные команды.
|
||||
Поиск файла клавиатурных команд, определённого пользователем, производится
|
||||
по следующему алгоритму (до первого нахождения файла):
|
||||
.IP
|
||||
.br
|
||||
1) параметр командной строки
|
||||
@ -341,12 +347,6 @@ S\-<символ> означает, что нужно держать в нажа
|
||||
4) файл
|
||||
.B ~/.config/mc/mc.keymap
|
||||
.br
|
||||
5) файл
|
||||
.B %sysconfdir%/mc/mc.keymap
|
||||
.br
|
||||
6) файл
|
||||
.B %prefix%/share/mc/mc.keymap
|
||||
|
||||
.PP
|
||||
Параметры в трёх первых случаях могут содержать абсолютный путь к файлу
|
||||
клавиатурных команд либо просто название схемы привязки (с расширением
|
||||
|
108
src/setup.c
108
src/setup.c
@ -371,22 +371,15 @@ static const struct
|
||||
/**
|
||||
Get name of config file.
|
||||
|
||||
\param subdir
|
||||
if not NULL, then config also search into specified subdir.
|
||||
|
||||
\param config_file_name
|
||||
If specified filename is relative, then will search in standart patches.
|
||||
|
||||
\return
|
||||
Newly allocated path to config name or NULL if file not found.
|
||||
|
||||
If config_file_name is a relative path, then search config in stantart paths.
|
||||
@param subdir If not NULL, config is also searched in specified subdir.
|
||||
@param config_file_name If relative, file if searched in standard paths.
|
||||
@returns Newly allocated string with config name or NULL if file is not found.
|
||||
*/
|
||||
static char *
|
||||
load_setup_get_full_config_name (const char *subdir, const char *config_file_name)
|
||||
{
|
||||
/*
|
||||
TODO: IMHO, in future this function must be placed into mc_config module.
|
||||
TODO: IMHO, in future, this function shall be placed in mcconfig module.
|
||||
*/
|
||||
char *lc_basename, *ret;
|
||||
|
||||
@ -394,8 +387,11 @@ load_setup_get_full_config_name (const char *subdir, const char *config_file_nam
|
||||
return NULL;
|
||||
|
||||
if (g_path_is_absolute (config_file_name))
|
||||
return g_strdup (config_file_name);
|
||||
|
||||
{
|
||||
ret = g_strdup (config_file_name);
|
||||
canonicalize_pathname (ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
lc_basename = g_path_get_basename (config_file_name);
|
||||
if (lc_basename == NULL)
|
||||
@ -409,6 +405,7 @@ load_setup_get_full_config_name (const char *subdir, const char *config_file_nam
|
||||
if (exist_file (ret))
|
||||
{
|
||||
g_free (lc_basename);
|
||||
canonicalize_pathname (ret);
|
||||
return ret;
|
||||
}
|
||||
g_free (ret);
|
||||
@ -421,6 +418,7 @@ load_setup_get_full_config_name (const char *subdir, const char *config_file_nam
|
||||
if (exist_file (ret))
|
||||
{
|
||||
g_free (lc_basename);
|
||||
canonicalize_pathname (ret);
|
||||
return ret;
|
||||
}
|
||||
g_free (ret);
|
||||
@ -433,11 +431,13 @@ load_setup_get_full_config_name (const char *subdir, const char *config_file_nam
|
||||
g_free (lc_basename);
|
||||
|
||||
if (exist_file (ret))
|
||||
{
|
||||
canonicalize_pathname (ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
g_free (ret);
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
@ -519,7 +519,7 @@ static void
|
||||
load_setup_init_config_from_file (mc_config_t ** config, const char *fname)
|
||||
{
|
||||
/*
|
||||
TODO: IMHO, in future this function must be placed into mc_config module.
|
||||
TODO: IMHO, in future, this function shall be placed in mcconfig module.
|
||||
*/
|
||||
if (exist_file (fname))
|
||||
{
|
||||
@ -676,9 +676,10 @@ static mc_config_t *
|
||||
load_setup_get_keymap_profile_config (gboolean load_from_file)
|
||||
{
|
||||
/*
|
||||
TODO: IMHO, in future this function must be placed into mc_config module.
|
||||
TODO: IMHO, in future, this function shall be placed in mcconfig module.
|
||||
*/
|
||||
mc_config_t *keymap_config;
|
||||
char *share_keymap, *sysconfig_keymap;
|
||||
char *fname, *fname2;
|
||||
|
||||
/* 0) Create default keymap */
|
||||
@ -686,47 +687,56 @@ load_setup_get_keymap_profile_config (gboolean load_from_file)
|
||||
if (!load_from_file)
|
||||
return keymap_config;
|
||||
|
||||
/* load and merge global keymaps */
|
||||
|
||||
/* 1) /usr/share/mc (mc_global.share_data_dir) */
|
||||
fname = g_build_filename (mc_global.share_data_dir, GLOBAL_KEYMAP_FILE, NULL);
|
||||
load_setup_init_config_from_file (&keymap_config, fname);
|
||||
g_free (fname);
|
||||
share_keymap = g_build_filename (mc_global.share_data_dir, GLOBAL_KEYMAP_FILE, NULL);
|
||||
load_setup_init_config_from_file (&keymap_config, share_keymap);
|
||||
|
||||
/* 2) /etc/mc (mc_global.sysconfig_dir) */
|
||||
fname = g_build_filename (mc_global.sysconfig_dir, GLOBAL_KEYMAP_FILE, NULL);
|
||||
load_setup_init_config_from_file (&keymap_config, fname);
|
||||
sysconfig_keymap = g_build_filename (mc_global.sysconfig_dir, GLOBAL_KEYMAP_FILE, NULL);
|
||||
load_setup_init_config_from_file (&keymap_config, sysconfig_keymap);
|
||||
|
||||
/* then load and merge one of user-defined keymap */
|
||||
|
||||
/* 3) --keymap=<keymap> */
|
||||
fname = load_setup_get_full_config_name (NULL, mc_args__keymap_file);
|
||||
if (fname != NULL && strcmp (fname, sysconfig_keymap) != 0 && strcmp (fname, share_keymap) != 0)
|
||||
{
|
||||
load_setup_init_config_from_file (&keymap_config, fname);
|
||||
goto done;
|
||||
}
|
||||
g_free (fname);
|
||||
|
||||
/* 3) ${XDG_CONFIG_HOME}/mc */
|
||||
/* 4) getenv("MC_KEYMAP") */
|
||||
fname = load_setup_get_full_config_name (NULL, g_getenv ("MC_KEYMAP"));
|
||||
if (fname != NULL && strcmp (fname, sysconfig_keymap) != 0 && strcmp (fname, share_keymap) != 0)
|
||||
{
|
||||
load_setup_init_config_from_file (&keymap_config, fname);
|
||||
goto done;
|
||||
}
|
||||
g_free (fname);
|
||||
|
||||
/* 5) main config; [Midnight Commander] -> keymap */
|
||||
fname2 = mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, "keymap", NULL);
|
||||
if (fname2 != NULL && *fname2 != '\0')
|
||||
fname = load_setup_get_full_config_name (NULL, fname2);
|
||||
g_free (fname2);
|
||||
if (fname != NULL && strcmp (fname, sysconfig_keymap) != 0 && strcmp (fname, share_keymap) != 0)
|
||||
{
|
||||
load_setup_init_config_from_file (&keymap_config, fname);
|
||||
goto done;
|
||||
}
|
||||
g_free (fname);
|
||||
|
||||
/* 6) ${XDG_CONFIG_HOME}/mc/mc.keymap */
|
||||
fname = mc_config_get_full_path (GLOBAL_KEYMAP_FILE);
|
||||
load_setup_init_config_from_file (&keymap_config, fname);
|
||||
|
||||
done:
|
||||
g_free (fname);
|
||||
|
||||
/* 4) main config; [Midnight Commander] -> keymap */
|
||||
fname2 =
|
||||
mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, "keymap", GLOBAL_KEYMAP_FILE);
|
||||
fname = load_setup_get_full_config_name (NULL, fname2);
|
||||
if (fname != NULL)
|
||||
{
|
||||
load_setup_init_config_from_file (&keymap_config, fname);
|
||||
g_free (fname);
|
||||
}
|
||||
g_free (fname2);
|
||||
|
||||
/* 5) getenv("MC_KEYMAP") */
|
||||
fname = load_setup_get_full_config_name (NULL, g_getenv ("MC_KEYMAP"));
|
||||
if (fname != NULL)
|
||||
{
|
||||
load_setup_init_config_from_file (&keymap_config, fname);
|
||||
g_free (fname);
|
||||
}
|
||||
|
||||
/* 6) --keymap=<keymap> */
|
||||
fname = load_setup_get_full_config_name (NULL, mc_args__keymap_file);
|
||||
if (fname != NULL)
|
||||
{
|
||||
load_setup_init_config_from_file (&keymap_config, fname);
|
||||
g_free (fname);
|
||||
}
|
||||
g_free (sysconfig_keymap);
|
||||
g_free (share_keymap);
|
||||
|
||||
return keymap_config;
|
||||
}
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user