| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 | (defun org-agenda-switch-to (&optional delete-other-windows)  "Go to the Org-mode file which contains the item at point."  (interactive)  (let ((cb (current-buffer))	(line (org-current-line))	(col (current-column))	(buf (current-buffer))	(pos (point)))    (with-current-buffer (get-buffer-create "OrgAgendaGotoLog")      (goto-char (point-max))      (insert "--------------------------------------------------------\n")      (insert (format "This command: %s\n" this-command))      (insert (format "Last command: %s\n" last-command))      (insert (format "Line/Column/Point: %d/%d/%d\n" line col pos))))  (orglog-describe-char (point))  (let* ((marker (or (get-text-property (point) 'org-marker)		     (org-agenda-error)))	 (buffer (marker-buffer marker))	 (pos (marker-position marker)))    (switch-to-buffer buffer)    (and delete-other-windows (delete-other-windows))    (widen)    (goto-char pos)    (when (org-mode-p)      (org-show-context 'agenda)      (save-excursion	(and (outline-next-heading)	     (org-flag-heading nil))))    (let ((cb (current-buffer))	  (pos (point)))      (with-current-buffer (get-buffer-create "OrgAgendaGotoLog")      (goto-char (point-max))	(insert (format "Arrived: %s %d\n" cb pos))))))(defun org-agenda-goto (&optional highlight)  "Go to the Org-mode file which contains the item at point."  (interactive)  (let ((cb (current-buffer))	(line (org-current-line))	(col (current-column))	(buf (current-buffer))	(pos (point)))    (with-current-buffer (get-buffer-create "OrgAgendaGotoLog")      (goto-char (point-max))      (insert "--------------------------------------------------------\n")      (insert (format "This command: %s\n" this-command))      (insert (format "Last command: %s\n" last-command))      (insert (format "Line/Column/Point: %d/%d/%d\n" line col pos))))  (orglog-describe-char (point))  (let* ((marker (or (get-text-property (point) 'org-marker)		     (org-agenda-error)))	 (buffer (marker-buffer marker))	 (pos (marker-position marker)))    (switch-to-buffer-other-window buffer)    (widen)    (goto-char pos)    (when (org-mode-p)      (org-show-context 'agenda)      (save-excursion	(and (outline-next-heading)	     (org-flag-heading nil)))) ; show the next heading    (run-hooks 'org-agenda-after-show-hook)    (and highlight (org-highlight (point-at-bol) (point-at-eol)))    (let ((cb (current-buffer))	  (pos (point)))      (with-current-buffer (get-buffer-create "OrgAgendaGotoLog")	(goto-char (point-max))	(insert (format "Arrived: %s %d\n" cb pos))))))(defun orglog-describe-char (pos)  "Describe the character after POS (interactively, the character after point).The information includes character code, charset and code points in it,syntax, category, how the character is encoded in a file,character composition information (if relevant),as well as widgets, buttons, overlays, and text properties."  (interactive "d")  (if (>= pos (point-max))      (error "No character follows specified position"))  (let* ((char (char-after pos))	 (charset (char-charset char))	 (composition (find-composition pos nil nil t))	 (component-chars nil)	 (display-table (or (window-display-table)			    buffer-display-table			    standard-display-table))	 (disp-vector (and display-table (aref display-table char)))	 (multibyte-p enable-multibyte-characters)	 (overlays (mapcar #'(lambda (o) (overlay-properties o))			   (overlays-at pos)))	 (char-description (if (not multibyte-p)			       (single-key-description char)			     (if (< char 128)				 (single-key-description char)			       (string-to-multibyte				(char-to-string char)))))	 (text-props-desc	  (let ((tmp-buf (generate-new-buffer " *text-props*")))	    (unwind-protect		(progn		  (describe-text-properties pos tmp-buf)		  (with-current-buffer tmp-buf (buffer-string)))	      (kill-buffer tmp-buf))))	 item-list max-width unicode)    (if (or (< char 256)	    (memq 'mule-utf-8 (find-coding-systems-region pos (1+ pos)))	    (get-char-property pos 'untranslated-utf-8))	(setq unicode (or (get-char-property pos 'untranslated-utf-8)			  (encode-char char 'ucs))))    (setq item-list	  `(("character"	     ,(format "%s (%d, #o%o, #x%x%s)"		      (apply 'propertize char-description			     (text-properties-at pos))		      char char char		      (if unicode			  (format ", U+%04X" unicode)			"")))	    ("charset"	     ,`(insert-text-button		,(symbol-name charset)		'type 'help-character-set 'help-args '(,charset))	     ,(format "(%s)" (charset-description charset)))	    ("code point"	     ,(let ((split (split-char char)))		`(insert-text-button		  ,(if (= (charset-dimension charset) 1)		       (format "#x%02X" (nth 1 split))		     (format "#x%02X #x%02X" (nth 1 split)			     (nth 2 split)))		  'action (lambda (&rest ignore)			    (list-charset-chars ',charset)			    (with-selected-window				(get-buffer-window "*Character List*" 0)			      (goto-char (point-min))			      (forward-line 2) ;Skip the header.			      (let ((case-fold-search nil))				(search-forward ,(char-to-string char)						nil t))))		  'help-echo		  "mouse-2, RET: show this character in its character set")))	    ("syntax"	     ,(let ((syntax (syntax-after pos)))		(with-temp-buffer		  (internal-describe-syntax-value syntax)		  (buffer-string))))	    ("category"	     ,@(let ((category-set (char-category-set char)))		 (if (not category-set)		     '("-- none --")		   (mapcar #'(lambda (x) (format "%c:%s"						 x (category-docstring x)))			   (category-set-mnemonics category-set)))))	    ,@(let ((props (aref char-code-property-table char))		    ps)		(when props		  (while props		    (push (format "%s:" (pop props)) ps)		    (push (format "%s;" (pop props)) ps))		  (list (cons "Properties" (nreverse ps)))))	    ("to input"	     ,@(let ((key-list (and (eq input-method-function					'quail-input-method)				    (quail-find-key char))))		 (if (consp key-list)		     (list "type"			   (mapconcat #'(lambda (x) (concat "\"" x "\""))				      key-list " or ")			   "with"			   `(insert-text-button			     ,current-input-method			     'type 'help-input-method			     'help-args '(,current-input-method))))))	    ("buffer code"	     ,(encoded-string-description	       (string-as-unibyte (char-to-string char)) nil))	    ("file code"	     ,@(let* ((coding buffer-file-coding-system)		      (encoded (encode-coding-char char coding)))		 (if encoded		     (list (encoded-string-description encoded coding)			   (format "(encoded by coding system %S)" coding))		   (list "not encodable by coding system"			 (symbol-name coding)))))	    ("display"	     ,(cond	       (disp-vector		(setq disp-vector (copy-sequence disp-vector))		(dotimes (i (length disp-vector))		  (setq char (aref disp-vector i))		  (aset disp-vector i			(cons char (describe-char-display				    pos (glyph-char char)))))		(format "by display table entry [%s] (see below)"			(mapconcat			 #'(lambda (x)			     (format "?%c" (glyph-char (car x))))			 disp-vector " ")))	       (composition		(let ((from (car composition))		      (to (nth 1 composition))		      (next (1+ pos))		      (components (nth 2 composition))		      ch)		  (setcar composition			  (and (< from pos) (buffer-substring from pos)))		  (setcar (cdr composition)			  (and (< next to) (buffer-substring next to)))		  (dotimes (i (length components))		    (if (integerp (setq ch (aref components i)))			(push (cons ch (describe-char-display pos ch))			      component-chars)))		  (setq component-chars (nreverse component-chars))		  (format "composed to form \"%s\" (see below)"			  (buffer-substring from to))))	       (t		(let ((display (describe-char-display pos char)))		  (if (display-graphic-p (selected-frame))		      (if display			  (concat			   "by this font (glyph code)\n"			   (format "     %s (#x%02X)"				   (car display) (cdr display)))			"no font available")		    (if display			(format "terminal code %s" display)		      "not encodable for terminal"))))))	    ,@(let ((face		     (if (not (or disp-vector composition))			 (cond			  ((and show-trailing-whitespace				(save-excursion (goto-char pos)						(looking-at "[ \t]+$")))			   'trailing-whitespace)			  ((and nobreak-char-display unicode (eq unicode '#xa0))			   'nobreak-space)			  ((and nobreak-char-display unicode (eq unicode '#xad))			   'escape-glyph)			  ((and (< char 32) (not (memq char '(9 10))))			   'escape-glyph)))))		(if face (list (list "hardcoded face"				     `(insert-text-button				       ,(symbol-name face)				       'type 'help-face 'help-args '(,face))))))	    ,@(let ((unicodedata (and unicode				      (describe-char-unicode-data unicode))))		(if unicodedata		    (cons (list "Unicode data" " ") unicodedata)))))    (setq max-width (apply #'max (mapcar #'(lambda (x)					     (if (cadr x) (length (car x)) 0))					 item-list)))    (with-current-buffer (get-buffer-create "OrgAgendaGotoLog")      (goto-char (point-max))      (set-buffer-multibyte multibyte-p)      (let ((formatter (format "%%%ds:" max-width)))	(dolist (elt item-list)	  (when (cadr elt)	    (insert (format formatter (car elt)))	    (dolist (clm (cdr elt))	      (if (eq (car-safe clm) 'insert-text-button)		  (progn (insert " ") (eval clm))		(when (>= (+ (current-column)			     (or (string-match "\n" clm)				 (string-width clm))			     1)			  (window-width))		  (insert "\n")		  (indent-to (1+ max-width)))		(insert " " clm)))	    (insert "\n"))))            (when overlays	(save-excursion	  (goto-char (point-min))	  (re-search-forward "character:[ \t\n]+")	  (let* ((end (+ (point) (length char-description))))	    (mapc #'(lambda (props)		      (let ((o (make-overlay (point) end)))			(while props			  (overlay-put o (car props) (nth 1 props))			  (setq props (cddr props)))))		  overlays))))            (when disp-vector	(insert	 "\nThe display table entry is displayed by ")	(if (display-graphic-p (selected-frame))	    (progn	      (insert "these fonts (glyph codes):\n")	      (dotimes (i (length disp-vector))		(insert (glyph-char (car (aref disp-vector i))) ?:			(propertize " " 'display '(space :align-to 5))			(if (cdr (aref disp-vector i))			    (format "%s (#x%02X)" (cadr (aref disp-vector i))				    (cddr (aref disp-vector i)))			  "-- no font --")			"\n")		(let ((face (glyph-face (car (aref disp-vector i)))))		  (when face		    (insert (propertize " " 'display '(space :align-to 5))			    "face: ")		    (insert (concat "`" (symbol-name face) "'"))		    (insert "\n")))))	  (insert "these terminal codes:\n")	  (dotimes (i (length disp-vector))	    (insert (car (aref disp-vector i))		    (propertize " " 'display '(space :align-to 5))		    (or (cdr (aref disp-vector i)) "-- not encodable --")		    "\n"))))            (when composition	(insert "\nComposed")	(if (car composition)	    (if (cadr composition)		(insert " with the surrounding characters \""			(car composition) "\" and \""			(cadr composition) "\"")	      (insert " with the preceding character(s) \""		      (car composition) "\""))	  (if (cadr composition)	      (insert " with the following character(s) \""		      (cadr composition) "\"")))	(insert " by the rule:\n\t("		(mapconcat (lambda (x)			     (format (if (consp x) "%S" "?%c") x))			   (nth 2 composition)			   " ")		")")	(insert  "\nThe component character(s) are displayed by ")	(if (display-graphic-p (selected-frame))	    (progn	      (insert "these fonts (glyph codes):")	      (dolist (elt component-chars)		(insert "\n " (car elt) ?:			(propertize " " 'display '(space :align-to 5))			(if (cdr elt)			    (format "%s (#x%02X)" (cadr elt) (cddr elt))			  "-- no font --"))))	  (insert "these terminal codes:")	  (dolist (elt component-chars)	    (insert "\n  " (car elt) ":"		    (propertize " " 'display '(space :align-to 5))		    (or (cdr elt) "-- not encodable --"))))	(insert "\nSee the variable `reference-point-alist' for "		"the meaning of the rule.\n"))            (if text-props-desc (insert text-props-desc)))))
 |