mutt: "index_format" में सशर्त दिनांक प्रारूप


15

मेरे पास index_formatम्यूट में निम्नलिखित मूल्य सेट हैं :

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

जो प्रारूप में दिनांक प्रदर्शित करता है

2013 Dec 5

मैं सोच रहा था कि क्या ईमेल कितना पुराना है, इस पर निर्भर करते हुए अलग-अलग तारीख के फॉर्मेट संभव हैं। उस से मेरा मतलब है:

for less than 7 days:  today, yesterday, tuesday, monday
this year:             Dec 5
older than this year:  2013 Dec 5

मुझे लगता है कि मैंने थंडरबर्ड में यह कार्यक्षमता देखी है। म्यूट में यह अच्छा होगा

जवाबों:


16

यदि आप म्यूट (v1.5 +) के "विकास" संस्करण का उपयोग कर रहे हैं - और आपको बिल्कुल करना चाहिए - मैनुअल में वर्णित के रूप में एक बाहरी फिल्टर का उपयोग करने की संभावना है ।

पहले आपको एक स्क्रिप्ट की आवश्यकता होती है जो संदेश की आयु के अनुसार विभिन्न चीजों का उत्पादन कर सकती है। यहाँ पायथन में एक उदाहरण दिया गया है:

#!/usr/bin/env python
"""mutt format date

Prints different index_format strings for mutt according to a
messages age.

The single command line argument should be a unix timestamp
giving the message's date (%{}, etc. in Mutt).
"""

import sys
from datetime import datetime

INDEX_FORMAT = "%Z {} %?X?(%X)&   ? %-22.22F  %.100s %> %5c%"

def age_fmt(msg_date, now):
    # use iso date for messages of the previous year and before
    if msg_date.date().year < now.date().year:
        return '%[%Y-%m-%d]'

    # use "Month Day" for messages of this year
    if msg_date.date() < now.date():
        return '%10[%b %e]'

    # if a message appears to come from the future
    if msg_date > now:
        return '  b0rken'

    # use only the time for messages that arrived today
    return '%10[%H:%m]'

if __name__ == '__main__':
    msg_date = datetime.fromtimestamp(int(sys.argv[1]))
    now = datetime.now()
    print INDEX_FORMAT.format(age_fmt(msg_date, now))

इसे mutt-fmt-dateअपने पेट पर कहीं के रूप में सहेजें ।

दो बातें यहां महत्वपूर्ण हैं:

  • प्रारूप स्ट्रिंग में एक आक्षेप है {}जिसमें age_fmt()पायथन द्वारा वापसी मूल्य के साथ प्रतिस्थापित किया गया है।
  • प्रारूप स्ट्रिंग को समाप्त करना %होगा ताकि मट इसकी व्याख्या करेगा।

तो आप इसे अपने .muttrcरूप में उपयोग कर सकते हैं :

set index_format="mutt-fmt-date %[%s] |"

मट तो जाएगा

  1. %[%s]प्रारूप स्ट्रिंग के लिए नियमों के अनुसार व्याख्या करें ।
  2. mutt-fmt-date1 के परिणाम के साथ कॉल करें । तर्क के रूप में ( |अंत में)।
  3. इसकी व्याख्या करें कि यह स्क्रिप्ट से प्रारूप स्ट्रिंग के रूप में फिर से क्या मिलता है (क्योंकि %अंत में)।

कैविएट : स्क्रिप्ट को हर उस संदेश के लिए निष्पादित किया जाएगा जो प्रदर्शित होना है। मेलबॉक्स के माध्यम से स्क्रॉल करते समय परिणामी विलंब काफी ध्यान देने योग्य हो सकता है।

यहाँ सी में एक संस्करण है जो कुछ हद तक पर्याप्त रूप से प्रदर्शन करता है:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#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, *recent, *today;
    const char *format;

    current_time = time(NULL);

    if (argc!=6) {
        printf("Usage: %s old recent today format timestamp\n", argv[0]);
        return 2;
    }

    old = argv[1];
    recent = argv[2];
    today = argv[3];

    format = argv[4];

    message_time = atoi(argv[5]);

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

    return 0;
}

यह muttrc लाइन के साथ एक साथ जाता है:

set index_format='mfdate "%[%d.%m.%y]" "%8[%e. %b]" "%8[%H:%m]" "%Z %%s %-20.20L %?y?[%-5.5y]&       ? %?M?+& ?%s%%" "%[%s]" |'

मेरे पास अभी तक इसे डिबग करने का समय नहीं है, लेकिन इस समाधान और विषयों के साथ एक समस्या प्रतीत होती है जिसमें% साइन होते हैं। पैच की सराहना की जाएगी!

1
मैंने एक इनाम बनाया है। क्या आपके पास कोई विचार है कि बग को कैसे ठीक किया जाए?
मार्टिन वेगाटर

7

दुर्भाग्य से, यह मुट के वर्तमान संस्करणों के साथ संभव नहीं दिखता है।

$index_formatविभिन्न संदेश मेटाडेटा से आरेखण प्रारूप निर्दिष्ट करने वालों का एक विशिष्ट सेट का समर्थन करता है। इसे मट मैनुअल में वर्णित किया गया है (या यहाँ "स्थिर" संस्करण का प्रलेखन उसी के लिए है ), और जैसा कि आप तालिका से देख सकते हैं, केवल कुछ प्रारूप निर्दिष्टकर्ता हैं जो सशर्त हैं। वे हैं %M, %yऔर %Y; % M छिपे हुए संदेशों की संख्या है यदि थ्रेड ढह गया है, और% y और% Y एक्स-लेबल हेडर हैं यदि मौजूद है।

संदेश की तारीख और समय की वास्तविक स्वरूपण द्वारा किया जाता है strftime(3), जो सशर्त स्वरूपण का समर्थन नहीं करता है।

यह हो सकता है एक ऐसा करने के लिए संभव हो सकता है बदसूरत लगातार संदेश फ़ाइलें 'लिख कर समाधान का Date:हेडर, लेकिन मुझे लगता है कि ऐसा करने के लिए कम से कम नहीं करना चाहते। हालाँकि, यह कम से कम बुरी संभावना है जो मैं सोच सकता हूं।

एकमात्र वास्तविक समाधान जिसके बारे में मैं सोच सकता हूं कि या तो मट में इस तरह के समर्थन को लागू करना होगा (जो लगभग निश्चित रूप से थंडरबर्ड ऐसा करता है), या एक प्रतिस्थापन लिखिए strftimeजो सशर्त स्वरूपण का समर्थन करता है और एलडी_प्रेलोड या इसी तरह के तंत्र का उपयोग करके इंजेक्ट करता है। उत्तरार्द्ध, हालांकि, Mutt में सभी दिनांक और समय प्रदर्शन को प्रभावित करेगा , जो केवल संदेश अनुक्रमणिका से संबंधित नहीं, स्ट्रैप्टम से गुजरता है।


2
यदि आप संस्करण 1.5+ का उपयोग कर रहे हैं (जो आपको बिल्कुल चाहिए), तो एक तरीका है। दिनांक हेडर को फिर से लिखने का सुझाव प्रफुल्लित करने वाला है, हालांकि ...

@ एचपी एफडब्ल्यूआईडब्ल्यू, आपके उत्तर से मेरा उत्थान हुआ।
एक CVn

4

किसी कारण से म्यूट के नए संस्करणों (1.7 ने दिखाया कि समस्या) '14' और '32' अक्षरों के साथ तारीख स्ट्रिंग को उपसर्ग करते हैं, जो स्ट्रिंग को एक इंट में परिवर्तित करने से एटोई रखते हैं। को लाइन बदलना

message_time = atoi(2+argv[7]);

संभवतः एक बेवकूफ समाधान है, लेकिन यह मेरे लिए काम करता है।


4

@Marcus का संस्करण थोड़ा सा संपादित किया गया है (फिर भी %इस विषय में कोई समाधान नहीं है ):

// -*- coding:utf-8-unix; mode:c; -*-
/*
    Sets mutt index date based on mail age.

build:
    gcc mutt-index-date-formatter.c -o mutt-index-format
use this line in .muttrc:
    set index_format = 'mutt-index-format "%9[%d.%m.%y]" "%9[%e.%b]" "%8[%a %H:%m]" "%[%H:%m]" "%3C [%Z] %?X?%2X& -? %%s %-20.20L %?M?+%-2M&   ? %s %> [%4c]asladfg" "%[%s]" |'*/
// ////////////////////////////////////////////////////////////////

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

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

int main(int argc, const char *argv[]) {
    time_t current_time;
    time_t message_time;
    struct tm *ltime;
    unsigned int todays_seconds=0;
    unsigned int seconds_this_morning=0;

    const char *last_year, *this_year, *last_months, *last_week, *today;
    const char *format;
    char *concat_str;

    current_time = time(NULL);
    ltime = localtime(&current_time);
    todays_seconds = ltime->tm_hour*3600 + ltime->tm_min*60 + ltime->tm_sec;
    seconds_this_morning = current_time - todays_seconds;  // unix time @ 00:00

    if (argc != 7) {
        printf("Usage: %s last_year this_year last_week today format timestamp\n", argv[0]);
        return 2;
    }

    last_year    = argv[1];
    this_year    = argv[2];
    last_week    = argv[3];
    today        = argv[4];

    format       = argv[5];

    message_time = atoi(2 + argv[6]);

    if (message_time >= seconds_this_morning) {
        asprintf(&concat_str, "    %s", today);
        printf(format, concat_str);
    } else if (message_time >= seconds_this_morning - DAY) {
        asprintf(&concat_str, "ydy %s", today);
        printf(format, concat_str);
    } else if (message_time > seconds_this_morning - WEEK) {
        printf(format, last_week);
    } else if (message_time/YEAR < current_time/YEAR) {
        printf(format, last_year);
    } else {
        printf(format, this_year);
    }

    return 0;
}

यह प्रारूप निम्नानुसार है (सभी समय 24 वें प्रारूप में हैं):

  • 02:04 आज के मेल के लिए
  • ydy 02:04 कल के मेल के लिए
  • Thu 02:04 पिछले 7 दिनों के मेल के लिए
  • 27.Mar चालू वर्ष के मेल के लिए
  • 13.12.16 पिछले वर्षों के मेल के लिए

इस उदाहरण में पूर्ण सूचकांक प्रारूप है #no [flags] #no_of_attachments date sender subject msg_size


3

कुछ संशोधन किए, लेकिन "विषय में%" को हल नहीं किया

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define DAY (time_t)86400
#define WEEK (time_t)604800
#define MONTH (time_t)2678400
#define YEAR (time_t)31556926

/*I use this line in .muttrc: 
 * set index_format        = '/home/marcus/.mutt/mfdate "%9[%d.%m.%y]" "%9[%e.%b]" " [%6[%e.%b]]" "%8[%a %H:%m]" "    %[%H:%m]" "%Z %%s %?X?%2X&  ? %-20.20L %?M?+%-2M&   ? %.86s %> [%4c]asladfg" "%[%s]" |'*/
int main(int argc, const char *argv[]) {
    time_t current_time;
    time_t message_time;
    struct tm *ltime;
    unsigned int todays_seconds=0;
    unsigned int seconds_this_morning=0;


    const char *last_year, *this_year, *last_months, *last_week, *today;
    const char *format;

    current_time = time(NULL);
    ltime = localtime(&current_time);
    todays_seconds = ltime->tm_hour*3600 + ltime->tm_min*60 + ltime->tm_sec;
    seconds_this_morning = current_time - todays_seconds;

    if (argc!=8) {
        printf("Usage: %s last_year this_year today format timestamp\n", argv[0]);
        return 2;
    }

    last_year    = argv[1];
    this_year    = argv[2];
    last_months  = argv[3];
    last_week    = argv[4];
    today        = argv[5];

    format       = argv[6];

    message_time = atoi(argv[7]);

    /*
     *if ((message_time+YEAR) < current_time) {
     *    printf(format, last_year);
     *} else if ((message_time+MONTH) < current_time) {
     *    printf(format, this_year);
     *} else if ((message_time+WEEK) < current_time) {
     *    printf(format, last_months);
     *} else if ((message_time+DAY) < current_time) {
     *    printf(format, last_week);
     *} else {
     *    printf(format, today);
     *}
     */

    if ((message_time/YEAR) < (current_time/YEAR)) {
        printf(format, last_year);
    } else if ((message_time/MONTH) < (current_time/MONTH)) {
        printf(format, this_year);
    } else if ((message_time + WEEK) < current_time) {
    /*} else if ((message_time/DAY) < (current_time/DAY)) {*/
        printf(format, last_months);
    /*
     *} else if ((message_time+DAY) < current_time) {
     *    printf(format, last_week);
     */
    } else if ((message_time ) < seconds_this_morning) {
        printf(format, last_week);
    } else {
        printf(format, today);
    }

    return 0;
}

अच्छा होगा यदि आप अपने द्वारा किए गए परिवर्तनों और उनके पीछे के कारणों को संक्षेप में प्रस्तुत करें।
ज़गरिम्सन

0

यह index_formatचर

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

साथ mfdate.cमें उपयोगकर्ता हॉप द्वारा इस उत्तर में प्रस्तुत संशोधित :

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#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और जैसा कि आप देख रहे हैं %कि विषय में साइन की कोई समस्या नहीं है , अगर यही असली समस्या थी:यहाँ छवि विवरण दर्ज करें

यह प्रारंभिक "सिर्फ काम करने वाला" संस्करण है क्योंकि आपके मूल प्रश्न पर करीब से नज़र डालने के बाद मुझे यकीन नहीं है कि यह वही है जो आप चाहते हैं। हालाँकि, अगर यह वही है जो आप मुझे बताना चाहते हैं और हम सोचेंगे कि इसे और बेहतर कैसे बनाया जाए।

संपादित करें :

यह आपके पसंदीदा के साथ भी काम कर सकता है index_format:

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

mfdate.c:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#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;
}

यहाँ छवि विवरण दर्ज करें

संपादित करें :

मुझे समझाएं कि यह कैसे काम करता है:

mfdate2 तथ्य होते हैं:

"%[%s]"

तथा:

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

पहला तर्क केवल time of the message, जैसा कि 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कि The number of seconds since the Epochसमझाया गया है man strftime। पहला तर्क गणना करने के लिए कितने साल के संदेश है और क्या लेबल प्रयोग किया जाता है: old, recentया todayयह होना चाहिए।

दूसरा तर्क index_format चर का शेष भाग है । इसका उपयोग mfdateकेवल मुद्रण के लिए किया जाता है, लेकिन एक अतिरिक्त %जोड़ा जाता है printfक्योंकि यह म्यूट मैनुअल में कहता है :

लौटी स्ट्रिंग का उपयोग प्रदर्शन के लिए किया जाएगा। यदि लौटा हुआ स्ट्रिंग% में समाप्त होता है, तो इसे दूसरी बार फॉर्मेटर के माध्यम से पारित किया जाएगा।

प्रत्येक %को यहां दोगुना कर दिया गया है क्योंकि हम एक शाब्दिक %द्वारा किए गए दूसरे प्रारूपण को पारित करना चाहते हैं mutt


क्यों होता है पतन? इस उत्तर में कुछ भी गलत है?
अर्कादियुस ड्राज्स्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.