diff --git a/doc/man/mc.1.in b/doc/man/mc.1.in index 26ae6c629..1ac90b0a5 100644 --- a/doc/man/mc.1.in +++ b/doc/man/mc.1.in @@ -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 diff --git a/doc/man/ru/mc.1.in b/doc/man/ru/mc.1.in index c498e0cb9..30e6516c7 100644 --- a/doc/man/ru/mc.1.in +++ b/doc/man/ru/mc.1.in @@ -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 Параметры в трёх первых случаях могут содержать абсолютный путь к файлу клавиатурных команд либо просто название схемы привязки (с расширением diff --git a/src/setup.c b/src/setup.c index 2b6c9bf74..062f6c2f8 100644 --- a/src/setup.c +++ b/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= */ + 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= */ - 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; }