Требуется ли, чтобы `argv [0]` из `execve ()` совпадал с компонентом базового имени аргумента `pathname`?

Эта переменная index_format

set index_format='mfdate "%[%s]" "%4C %Z %[!%b %d %Y] %-17.17F (%3l) %s" |'

вместе с этим модифицированным mfdate.c, представленным в этом ответе от пользователя hop:

#include 
#include 
#include 

#define DAY (time_t)86400
#define YEAR (time_t)31556926

int main(int argc, const char *argv[]) {
  time_t current_time;
  time_t message_time;

  const char *old = "old";
  char *recent = "recent";
  char *today = "today";
  const char *format;

  current_time = time(NULL);

  if (argc != 3) {
    printf("Usage: %s format\n", argv[0]);
    return EXIT_FAILURE;
  }

  format = argv[2];

  message_time = atoi(argv[1]);

  if ((message_time/YEAR) < (current_time/YEAR)) {
    printf("%s,%s", old, format);
  } else if ((message_time/DAY) < (current_time/DAY)) {
    printf("%s,%s", recent, format);
  } else {
    printf("%s,%s", today, format);
  }

  return EXIT_SUCCESS;
}

у меня корректно работает в mutt 1.6.1 и как видите проблем со знаком % в теме нет , если это вот в чем заключалась настоящая проблема: enter image description here

Это первоначальная «просто рабочая» версия, потому что, внимательно изучив ваш первоначальный вопрос, я не уверен, что это то, что вы хотите. Однако, если это то то, что вам нужно, дайте мне знать, и мы подумаем, как сделать его лучше.

РЕДАКТИРОВАТЬ:

Он также может работать с вашим предпочтительным index_format:

set index_format='mfdate "%[%s]" "%%Z %%{%%Y %%b %%e  %%H:%%M} %%?X?(%%X)&   ? %%-22.22F  %%.100s %%> %%5c" |'

mfdate.c:

#include 
#include 
#include 

#define DAY (time_t)86400
#define YEAR (time_t)31556926

int main(int argc, const char *argv[]) {
  time_t current_time;
  time_t message_time;

  const char *old = "old";
  char *recent = "recent";
  char *today = "today";
  const char *format;

  current_time = time(NULL);

  if (argc != 3) {
    printf("Usage: %s format\n", argv[0]);
    return EXIT_FAILURE;
  }

  format = argv[2];

  message_time = atoi(argv[1]);

  if ((message_time/YEAR) < (current_time/YEAR)) {
    printf("%s,%s%%", old, format);
  } else if ((message_time/DAY) < (current_time/DAY)) {
    printf("%s,%s%%", recent, format);
  } else {
    printf("%s,%s%%", today, format);
  }

  return 0;
}

enter image description here

EDIT:

Позвольте мне объяснить, как это работает:

mfdate принимает 2 аргумента:

"%[%s]"

и:

"%%Z %%{%%Y %%b %%e  %%H:%%M} %%?X?(%%X)&   ? %%-22.22F  %%.100s %%> %%5c"

Первый аргумент только время сообщения, как описано в Документация index_format в .muttrc:

# %[fmt]  the date and time of the message is converted to the local
#         time zone, and ``fmt'' is expanded by the library function
#         ``strftime''; a leading bang disables locales

В этом случае fmt заменяется на %s, поскольку %s означает количество секунд с начала Эпохи, как описано в man strftime. То Первый аргумент используется для вычисления того, сколько лет сообщению и что ярлык: старый, недавний или сегодня должен быть.

Второй аргумент — оставшаяся часть index_format Переменная. Он используется в mfdate только для печати, но дополнительный % используется добавлено в конец printf, потому что, как сказано в руководстве по Mutt:

Возвращаемая строка будет использоваться для отображения. Если возвращенная строка оканчивается на %, он будет пропущен через средство форматирования во второй раз.

Каждый % удваивается здесь, потому что мы хотим передать литерал % в второе форматирование сделал mutt.

0
28.11.2018, 23:34
0 ответов

Теги

Похожие вопросы