2013-12-10 4 views
1

Я пытаюсь написать функцию, которая позволит мне выбрать (в интерактивном режиме) месяц и год для org-agenda-month-view - который использует формат 201312 (без двойных кавычек) на декабрь 2013 года. Я хотел бы использовать либо слова (December), либо цифры (12) за месяц, но вам нужна помощь (пожалуйста), чтобы декодировать имя месяца в целое число - что-то вроде (if (not (integer-p month)) (setq month (decode-name-of-month month))).Как расшифровать название месяца в целое число

Кроме того, любые указатели о том, как объединить два моих read-stringlet привязок в только одно действие было бы весьма признателен - то есть, иметь возможность вводить вручную January 2014 или 01 2014; вместо первого ввода January, а затем ввода 2014 в двух отдельных действиях.

(let* (
    (year (read-string "Insert the year: ")) 
    (month (read-string "Insert the month: "))) 
    (org-agenda nil "1") 
    (org-agenda-month-view (read (format "%s%02s" year month)))) 

EDIT (11 декабря 2013): Первый рабочий проект основывается на полезные ответы по @Drew и @Sean Перри. Добавлена ​​переменная org-agenda-start-day, которая позволяет (org-agenda nil "1") отображать [в самом начале] правильный месяц на основе пользовательского ввода - функция org-agenda-month-view больше не нужна. Обновление переменной lawlist-parse-time-months исправить опечатку, а также дополнительные возможности - например, 01, 02 и т.д.

(defvar lawlist-parse-time-months '(
    ("1" . "01") 
    ("01" . "01") 
    ("jan" . "01") 
    ("january" . "01") 
    ("2" . "02") 
    ("02" . "02") 
    ("feb" . "02") 
    ("february". "02") 
    ("3" . "03") 
    ("03" . "03") 
    ("mar" . "03") 
    ("march" . "03") 
    ("4" . "04") 
    ("04" . "04") 
    ("apr" . "04") 
    ("april" . "04") 
    ("5" . "05") 
    ("05" . "05") 
    ("may" . "05") 
    ("6" . "06") 
    ("06" . "06") 
    ("jun" . "06") 
    ("june" . "06") 
    ("7" . "07") 
    ("07" . "07") 
    ("jul" . "07") 
    ("july" . "07") 
    ("8" . "08") 
    ("08" . "08") 
    ("aug" . "08") 
    ("august" . "08") 
    ("9" . "09") 
    ("09" . "09") 
    ("sep" . "09") 
    ("september" . "09") 
    ("10" . "10") 
    ("oct" . "10") 
    ("october" . "10") 
    ("11" . "11") 
    ("nov" . "11") 
    ("november" . "11") 
    ("12" . "12") 
    ("dec" . "12") 
    ("december" . "12"))) 

(defun encode-name-of-month (month_name) 
    (cdr (assoc (downcase month_name) lawlist-parse-time-months))) 

(defun decode-name-of-month (month) 
    (car (rassoc month lawlist-parse-time-months))) 

(defun foo (month year) 
    (interactive 
    (let* ((mon+yr (split-string 
        (read-string "Month and year: " nil nil 
           (format-time-string "%B %Y"(current-time))) 
        nil 'TRIM)) 
      (mon  (car mon+yr)) 
      (yr  (cadr mon+yr)) 
      (m2  (condition-case nil (format "%d" mon) (error nil)))) 
    (list (or m2 mon) yr))) 
    (setq org-agenda-start-day (concat year "-" (encode-name-of-month month) "-" "01")) 
    (org-agenda nil "1")) 

ответ

1
(require 'parse-time) ;; in standard lib 
(defun encode-name-of-month (month_name) 
    (cdr (assoc (downcase month_name) parse-time-months)) 
) 
(defun decode-name-of-month (month) 
    (car (rassoc month parse-time-months)) 
) 

Это должно вам начать работу.

+0

Большое спасибо за помощь - очень благодарен !!! – lawlist

1
(defun foo (month year) 
    (interactive 
    (let* ((mon+yr (split-string 
        (read-string "Month and year: " nil nil 
           (format-time-string "%B %Y"(current-time))) 
        nil 'TRIM)) 
      (mon  (car mon+yr)) 
      (yr  (cadr mon+yr)) 
      (m2  (condition-case nil (format "%d" mon) (error nil)))) 
    (list (or m2 mon) yr))) 
    (message "Month: %s, Year: %s" month year)) 

M-x foo 12 2013   ==> Month: 12, Year: 2013 
M-x foo December 2013 ==> Month: December, Year: 2013 
M-x foo Dec 2013  ==> Month: Dec, Year: 2013 
M-x foo Nebraska 200000 ==> Month: Nebraska, Year: 200000 

Но вы получите идею. (Проверьте действительных названий месяцев и месяц & год чисел.)

+0

Большое спасибо за помощь - очень благодарен !!! – lawlist

+0

В такой ситуации (то есть, когда ответы от двух или более людей способствовали решению), что является политически правильным способом (пожалуйста), чтобы обработать разметку ответа? Возможно, сделайте комментарий под обоими ответами, в котором говорится, как каждый из них был полезен, а затем выберите один из них с утверждением, что «... из-за ограничений форума (т. Е. Только для того, чтобы выбрать один из различных правильных ответов), этот был выбран ...." ? – lawlist

+1

@lawlist - Пожалуйста, дайте кредит пользователю с меньшим количеством баллов. Спасибо. – Drew

Смежные вопросы