dans EMACS, lorsque vous affichez le calendrier avec est-il possible de générer un calendrier de douze mois dans une fenêtre de taille total? p> mx calendrier code>, 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. p>
4 Réponses :
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)))
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))) code>
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 i>
Calendrier de 12 mois - Scrolls par mois (avant / arrière) strong>
p> p>
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.
Ce n'est pas facile de le faire, le code pour générer un calendrier est le suivant: ici, Donc, si vous souhaitez générer plus de 3 mois de plus de 1 rangée, vous devez remplacer (DOTImes (i 3) ...) code> génère 3 mois Dans une rangée. p> Calendar-générer fonctionner code> par vous-même, comme indiqué par @Luke. p> p>
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
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)
Il affiche une période de 12 mois, mais lors de la navigation avec << / code> ou > code> 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.