মিট: "সূচি_ফর্ম্যাট" এ শর্তাধীন তারিখ বিন্যাস


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-dateআর্গুমেন্ট হিসাবে 1 এর ফলাফলের সাথে কল করুন (কারণ |শেষে রয়েছে)।
  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;
}

এটি মিউট্রিক লাইনের সাথে একসাথে চলেছে:

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; % এম গোপন বার্তা সংখ্যা যদি ওয়াই এক্স-লেবেল হেডার হয় থ্রেড ধসে করা হয়, এবং% Y এবং% যদি বর্তমান।

বার্তার তারিখ এবং সময়টির আসল বিন্যাসটি সম্পন্ন করে strftime(3), যা শর্তাধীন বিন্যাসকে মোটেই সমর্থন করে না।

এটা তোলে পারে একটি হওয়া আদৌ কি সম্ভব কুশ্রী ক্রমাগত বার্তা ফাইল 'rewriting দ্বারা কার্যসংক্রান্ত Date:হেডার, কিন্তু আমি যে কাজ করতে অন্তত চাইবেন না। তবে এটি সবচেয়ে কম খারাপ সম্ভাবনা যা আমি ভাবতে পারি।

আমি যে আসল সমাধানটি ভাবতে পারি তা হ'ল হয় মাতগুলিতে এই জাতীয় সমর্থন বাস্তবায়ন করা (যা প্রায় নিশ্চিতভাবে থান্ডারবার্ড এটি করে কীভাবে), অথবা strftimeশর্তসাপেক্ষ্য বিন্যাসকে সমর্থন করে এমন একটি প্রতিস্থাপন লিখুন এবং এলডিপ্রেলয়েড বা অনুরূপ প্রক্রিয়া ব্যবহার করে ইনজেকশন দেবে। তবে, পরবর্তীকালে, মূটের সমস্ত তারিখ এবং সময় প্রদর্শন প্রভাবিত করবে যা কেবলমাত্র বার্তা সূচকের সাথে সম্পর্কিত নয়, স্ট্রফটাইমের মধ্য দিয়ে যায়।


2
আপনি যদি 1.5+ সংস্করণ ব্যবহার করেন (যা আপনার একেবারে উচিত) তবে একটি উপায় আছে। তারিখ শিরোনামগুলি পুনরায়

এফডাব্লুআইডাব্লু, আপনার উত্তরটি আমার কাছে পৌঁছেছে।
একটি সিভিএন

4

কোনও কারণে মুটের নতুন সংস্করণ (1.7 সেই সমস্যাটি দেখিয়েছিল) '14' এবং '32' অক্ষরের সাথে তারিখের স্ট্রিংয়ের উপসর্গ করে, যা স্ট্রিংকে একটি ইন্টিতে রূপান্তর থেকে আটকে রাখে। লাইন পরিবর্তন

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

সম্ভবত একটি নির্বোধ সমাধান, তবে এটি আমার পক্ষে কাজ করে।


4

@ মার্কাসের সি সংস্করণটি কিছুটা সম্পাদনা করা হয়েছে (যদিও এখনও %বিষয়টির কোনও সমাধান নেই ):

// -*- 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


ডাউনটা কেন? এই উত্তর দিয়ে কিছু ভুল?
আরকাদিউস দ্রবকিজিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.