emacs: Add 'guix-with-indent'.
* emacs/guix-utils.el (guix-with-indent): New macro. (guix-memoized-font-lock-keywords): Rename to... (guix-utils-font-lock-keywords): ... this. Add it. * emacs/guix-info.el (guix-info-insert-entry-default): Use it.
This commit is contained in:
		
							parent
							
								
									778437ed9f
								
							
						
					
					
						commit
						36c00c61fa
					
				
					 2 changed files with 21 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -219,13 +219,11 @@ ENTRIES should have a form of `guix-entries'."
 | 
			
		|||
  "Insert ENTRY of ENTRY-TYPE into the current info buffer.
 | 
			
		||||
If INDENT-LEVEL is non-nil, indent displayed information by this
 | 
			
		||||
number of `guix-info-indent' spaces."
 | 
			
		||||
  (let ((region-beg (point)))
 | 
			
		||||
  (guix-with-indent (* (or indent-level 0)
 | 
			
		||||
                       guix-info-indent)
 | 
			
		||||
    (mapc (lambda (param)
 | 
			
		||||
            (guix-info-insert-param param entry entry-type))
 | 
			
		||||
          (guix-info-get-displayed-params entry-type))
 | 
			
		||||
    (when indent-level
 | 
			
		||||
      (indent-rigidly region-beg (point)
 | 
			
		||||
                      (* indent-level guix-info-indent)))))
 | 
			
		||||
          (guix-info-get-displayed-params entry-type))))
 | 
			
		||||
 | 
			
		||||
(defun guix-info-insert-entry (entry entry-type &optional indent-level)
 | 
			
		||||
  "Insert ENTRY of ENTRY-TYPE into the current info buffer.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,6 +64,17 @@ Use `guix-time-format'."
 | 
			
		|||
  "Return one-line string from a multi-line STR."
 | 
			
		||||
  (replace-regexp-in-string "\n" " " str))
 | 
			
		||||
 | 
			
		||||
(defmacro guix-with-indent (indent &rest body)
 | 
			
		||||
  "Evaluate BODY and indent inserted text by INDENT number of spaces."
 | 
			
		||||
  (declare (indent 1) (debug t))
 | 
			
		||||
  (let ((region-beg-var (make-symbol "region-beg"))
 | 
			
		||||
        (indent-var     (make-symbol "indent")))
 | 
			
		||||
    `(let ((,region-beg-var (point))
 | 
			
		||||
           (,indent-var     ,indent))
 | 
			
		||||
       ,@body
 | 
			
		||||
       (unless (zerop ,indent-var)
 | 
			
		||||
         (indent-rigidly ,region-beg-var (point) ,indent-var)))))
 | 
			
		||||
 | 
			
		||||
(defun guix-format-insert (val &optional face format)
 | 
			
		||||
  "Convert VAL into a string and insert it at point.
 | 
			
		||||
If FACE is non-nil, propertize VAL with FACE.
 | 
			
		||||
| 
						 | 
				
			
			@ -303,9 +314,13 @@ See `defun' for the meaning of arguments."
 | 
			
		|||
     ,(or docstring
 | 
			
		||||
          (format "Memoized version of `%S'." definition))))
 | 
			
		||||
 | 
			
		||||
(defvar guix-memoized-font-lock-keywords
 | 
			
		||||
 | 
			
		||||
(defvar guix-utils-font-lock-keywords
 | 
			
		||||
  (eval-when-compile
 | 
			
		||||
    `((,(rx "("
 | 
			
		||||
    `((,(rx "(" (group "guix-with-indent")
 | 
			
		||||
            symbol-end)
 | 
			
		||||
       . 1)
 | 
			
		||||
      (,(rx "("
 | 
			
		||||
            (group "guix-memoized-" (or "defun" "defalias"))
 | 
			
		||||
            symbol-end
 | 
			
		||||
            (zero-or-more blank)
 | 
			
		||||
| 
						 | 
				
			
			@ -314,7 +329,7 @@ See `defun' for the meaning of arguments."
 | 
			
		|||
       (1 font-lock-keyword-face)
 | 
			
		||||
       (2 font-lock-function-name-face nil t)))))
 | 
			
		||||
 | 
			
		||||
(font-lock-add-keywords 'emacs-lisp-mode guix-memoized-font-lock-keywords)
 | 
			
		||||
(font-lock-add-keywords 'emacs-lisp-mode guix-utils-font-lock-keywords)
 | 
			
		||||
 | 
			
		||||
(provide 'guix-utils)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue