10
votes

Calendrier Emacs: Afficher plus de 3 mois?

dans EMACS, lorsque vous affichez le calendrier avec mx calendrier , vous obtenez un affichage de trois mois - le mois dernier, ce mois-ci et le mois prochain - dans une nouvelle fenêtre qui vient de 8 lignes.

est-il possible de générer un calendrier de douze mois dans une fenêtre de taille total?


0 commentaires

4 Réponses :


6
votes

Il ne semble pas être un moyen facile de le faire. J'ai pu assommer le code suivant, qui montrera tous douze mois, dans une rangée, dans un cadre séparé.

(require 'cl)
(require 'calendar)

(defun twelve-month-calendar ()
  (interactive)
  (let ((calendar-buffer (get-buffer-create "12-month calendar"))
        (month 12)
        (year 2012))
    (set-buffer calendar-buffer)
    (setq calendar-frame (make-frame))
    (make-variable-buffer-local 'font-lock-face)
    (set-face-attribute 'default calendar-frame :height 70)
    (set-frame-width calendar-frame 300)
    (erase-buffer)
    (dotimes (i 12)
      (calendar-generate-month month year 0)
      (calendar-increment-month month year -1))
    (calendar-mode)))


3 commentaires

Vous semblez avoir du codé dur l'année 2012? Quelque chose comme ça pourrait être préférable: (chaîne-to-numéro (Format-time-chaîne "% Y" (heure actuelle)))


Cela fonctionne en quelque sorte, mais tout est affiché en ligne unique.


Ne fonctionne pas dans EMACS 25.3.1, entraîne un cadre vide avec Text "Décembre 2012", renvoie le message Calendrier-bougeoir-colonne: mauvais type d'argument: wholenump, -3



6
votes

Calendrier de 12 mois - Scrolls par mois (avant / arrière) xxx


 exemple


3 commentaires

Cela ne fonctionne pas pour moi, il jette une erreur: "La fonction" Calendrier-for-boucle "n'est pas connue pour être définie."


@gsl - Merci d'avoir signalé le problème. J'ai ajouté la fonction manquante et j'ai testé la réponse dans EMACS 27 pour vérifier que cela fonctionne comme annoncé.


Merci, ça marche parfaitement maintenant.



0
votes

Ce n'est pas facile de le faire, le code pour générer un calendrier est le suivant: xxx

ici, (DOTImes (i 3) ...) génère 3 mois Dans une rangée.

Donc, si vous souhaitez générer plus de 3 mois de plus de 1 rangée, vous devez remplacer Calendar-générer fonctionner par vous-même, comme indiqué par @Luke.


1 commentaires

En fait, générer plus de 3 mois n'est pas la partie difficile - ce qui est semi-difficile, ce sont les algorithmes de déplacement du point à la date et de placer des superpositions pour des vacances, des anniversaires et des réunions, ainsi que des défilements en avant et en arrière. L'algorithme du calendrier de 12 mois est ici ici Stackoverflow.com/a/21709710/2112489 et ici Stackoverflow.com/a/21834918/2112489 . À ce stade, il n'existe que des algorithmes publiquement disponibles pour déplacer le curseur à ce jour sur les calendriers de 3 mois ou de 12 mois. Si vous êtes enclin à écrire des algorithmes supplémentaires, ce serait un excellent :)



2
votes

J'ai modifié "Calendrier de 12 mois - Scrolls par mois (Awaws / Backwards)" Réponse et adapté à Emacs Post 23.3 Version - Pas de calendrier-for-boucle Code> Macro - et changé de défilement de d'un mois à un an. Cette version montrent l'ensemble du calendrier pour l'année en cours. Aller en arrière qui et transfère > code> d'une année. Il ne montre pas à l'écran entier, mais à moitié écran, qui facilite l'utilisation lors de la navigation verticale et c'est plus comme une version étendue de la construction dans le calendrier.

;; https://stackoverflow.com/questions/9547912/emacs-calendar-show-more-than-3-months
(defun farynaio/year-calendar (&optional year)
  "Generate a one year calendar that can be scrolled by year in each direction.
This is a modification of:  http://homepage3.nifty.com/oatu/emacs/calendar.html
See also: https://stackoverflow.com/questions/9547912/emacs-calendar-show-more-than-3-months"
  (interactive)
  (require 'calendar)
  (let* (
      (current-year (number-to-string (nth 5 (decode-time (current-time)))))
      (month 0)
      (year (if year year (string-to-number (format-time-string "%Y" (current-time))))))
    (switch-to-buffer (get-buffer-create calendar-buffer))
    (when (not (eq major-mode 'calendar-mode))
      (calendar-mode))
    (setq displayed-month month)
    (setq displayed-year year)
    (setq buffer-read-only nil)
    (erase-buffer)
    ;; horizontal rows
    (dotimes (j 4)
      ;; vertical columns
      (dotimes (i 3)
        (calendar-generate-month
          (setq month (+ month 1))
          year
          ;; indentation / spacing between months
          (+ 5 (* 25 i))))
      (goto-char (point-max))
      (insert (make-string (- 10 (count-lines (point-min) (point-max))) ?\n))
      (widen)
      (goto-char (point-max))
      (narrow-to-region (point-max) (point-max)))
    (widen)
    (goto-char (point-min))
    (setq buffer-read-only t)))

(defun farynaio/scroll-year-calendar-forward (&optional arg event)
  "Scroll the yearly calendar by year in a forward direction."
  (interactive (list (prefix-numeric-value current-prefix-arg)
                     last-nonmenu-event))
  (unless arg (setq arg 0))
  (save-selected-window
    (if (setq event (event-start event)) (select-window (posn-window event)))
    (unless (zerop arg)
      (let* (
              (year (+ displayed-year arg)))
        (jarfar/year-calendar year)))
    (goto-char (point-min))
    (run-hooks 'calendar-move-hook)))

(defun farynaio/scroll-year-calendar-backward (&optional arg event)
  "Scroll the yearly calendar by year in a backward direction."
  (interactive (list (prefix-numeric-value current-prefix-arg)
                     last-nonmenu-event))
  (farynaio/scroll-year-calendar-forward (- (or arg 1)) event))

(define-key calendar-mode-map "<" 'farynaio/scroll-year-calendar-backward)
(define-key calendar-mode-map ">" 'farynaio/scroll-year-calendar-forward)

(defalias 'year-calendar 'farynaio/year-calendar)


4 commentaires

Il affiche une période de 12 mois, mais lors de la navigation avec << / code> ou > il revient à la section 3 mois à la fois.


Probablement des liaisons clés manquantes. J'ai mis à jour la réponse, avec la version que j'utilise maintenant, fonctionne sans problème. Essayez-le maintenant.


Parfait, merci. Vous pouvez envisager de le faire un petit paquet, car il s'agit d'une caractéristique que beaucoup trouveraient utiles.


Vous êtes le bienvenu. J'y penserai, la majeure partie du crédit devrait aller à @lawlist, je viens de modifier certaines choses.