информационная команда и справочные страницы

Fedora 19 (хотя я сомневаюсь, что это актуально)

Если я вызову команду info для темы, которая на самом деле не имеет узла info, но имеет справочную страницу, info, по-видимому, создаст узел с именем (*manpages*)<topic> из справочной страницы — на лету .

Я не могу нигде найти документацию об этой функции и (очевидно) описание того, как это делается.

Может ли кто-нибудь указать мне на документацию по этому поводу?


person RoUS    schedule 06.08.2014    source источник


Ответы (2)


Я проверил автономное информационное руководство GNU и Информационное руководство GNU и не нашел ничего, кроме небольшого признака того, что эта функция существует. В описании параметра --all мы можем прочитать это:

--все -а

Find all files matching the given menu-item (a file or node name).
Three usage patterns are supported, as follows.

First, if --all is used together with --where, info prints the names
of all matching files found on standard output (including *manpages*
if relevant) and exits.

Так что я боюсь, что единственная документация - это исходный код. В info.c вы можете найти следующую функцию. Найдите «Вернуться к загрузке справочной страницы». комментарий.

/* Get the initial Info file, either by following menus from "(dir)Top",
   or what the user specifed with values in filename. */
static char *
get_initial_file (char *filename, int *argc, char ***argv, char **error)
{
  char *initial_file = 0;           /* First file loaded by Info. */
  REFERENCE *entry;

  /* If there are any more arguments, the initial file is the
     dir entry given by the first one. */
  if (!filename && (*argv)[0])
    {
      /* If they say info -O info, we want to show them the invocation node
         for standalone info; there's nothing useful in info.texi.  */
      if (goto_invocation_p && (*argv)[0]
          && mbscasecmp ((*argv)[0], "info") == 0)
        (*argv)[0] = "info-stnd";

      entry = lookup_dir_entry ((*argv)[0], 0);
      if (entry)
        {
          initial_file = info_find_fullpath (entry->filename, 0);
          if (initial_file)
            {
              (*argv)++; /* Advance past first remaining argument. */
              (*argc)--;

              /* Store full path, so that we find the already loaded file in
                 info_find_file, and show the full path if --where is used. */
              entry->filename = initial_file;
              add_pointer_to_array (info_copy_reference (entry),
                  ref_index, ref_list, ref_slots, 2);
              return initial_file;
            }
        }
    }

  /* User used "--file". */
  if (filename)
    {
      initial_file = info_find_fullpath (filename, 0);

      if (!initial_file)
        {
          if (filesys_error_number)
            *error = filesys_error_string (filename, filesys_error_number);
        }
      else
        return initial_file;
    }

  /* File name lookup. */
  if (!filename && (*argv)[0])
    {
      /* Try finding a file with this name, in case
         it exists, but wasn't listed in dir. */
      initial_file = info_find_fullpath ((*argv)[0], 0);
      if (initial_file)
        {
          (*argv)++; /* Advance past first remaining argument. */
          (*argc)--;
          return initial_file;
        }
      else
        asprintf (error, _("No menu item `%s' in node `%s'."),
            (*argv)[0], "(dir)Top");
    }

  /* Fall back to loading man page. */
  if (filename || (*argv)[0])
    {
      NODE *man_node;

      debug (3, ("falling back to manpage node"));

      man_node = get_manpage_node (filename ? filename : (*argv)[0]);
      if (man_node)
        {
          add_pointer_to_array
            (info_new_reference (MANPAGE_FILE_BUFFER_NAME,
               filename ? filename : (*argv)[0]),
             ref_index, ref_list, ref_slots, 2);

          initial_file = MANPAGE_FILE_BUFFER_NAME;
          return initial_file;
        }
    }

  /* Inexact dir lookup. */
  if (!filename && (*argv)[0])
    {
      entry = lookup_dir_entry ((*argv)[0], 1);
      if (entry)
        {
          (*argv)++; /* Advance past first remaining argument. */
          (*argc)--;
          /* Clear error message. */
          free (*error);
          *error = 0;

          initial_file = info_find_fullpath (entry->filename, 0);
          /* Store full path, so that we find the already loaded file in
             info_find_file, and show the full path if --where is used. */
          entry->filename = initial_file;
          add_pointer_to_array (info_copy_reference (entry),
              ref_index, ref_list, ref_slots, 2);
          return initial_file;
        }
    }

  /* Otherwise, we want the dir node.  The only node to be displayed
     or output will be "Top". */
  return 0;
}

man.h содержит определение MANPAGE_FILE_BUFFER_NAME:

#define MANPAGE_FILE_BUFFER_NAME "*manpages*"
person Bill    schedule 09.08.2014

info — это такая же команда, как и man, вы можете протестировать команду: info make, но info Читать документацию в формате Info.

person user1990    schedule 06.08.2014
comment
Я знаю об отношениях между двумя инструментами как о средствах чтения документации, но не знаю, как info превращает справочную страницу в узел info по запросу. - person RoUS; 06.08.2014