[2/4] emacs: Extend 'guix-mapinsert'.

Message ID 1464446174-1868-2-git-send-email-alezost@gmail.com
State New

Commit Message

Alex Kost May 28, 2016, 2:36 p.m. UTC
  * emacs/guix-utils.el (guix-mapinsert): Add 'indent' and 'column'
  keyword arguments.
 emacs/guix-utils.el | 33 +++++++++++++++++++++++++--------
 1 file changed, 25 insertions(+), 8 deletions(-)


Ludovic Courtès May 30, 2016, 9:14 p.m. UTC | #1
Alex Kost <alezost@gmail.com> skribis:

> * emacs/guix-utils.el (guix-mapinsert): Add 'indent' and 'column'
>   keyword arguments.

I’m intimidated by ‘dolist’, but it LGTM.  :-)



diff --git a/emacs/guix-utils.el b/emacs/guix-utils.el
index ea9933f..3e4ecc3 100644
--- a/emacs/guix-utils.el
+++ b/emacs/guix-utils.el
@@ -84,16 +84,33 @@  If FORMAT is non-nil, format VAL with FORMAT."
                 (format format str)
-(defun guix-mapinsert (function sequence separator)
+(cl-defun guix-mapinsert (function sequence separator &key indent column)
   "Like `mapconcat' but for inserting text.
 Apply FUNCTION to each element of SEQUENCE, and insert SEPARATOR
-at point between each FUNCTION call."
-  (when sequence
-    (funcall function (car sequence))
-    (mapc (lambda (obj)
-            (insert separator)
-            (funcall function obj))
-          (cdr sequence))))
+at point between each FUNCTION call.
+If INDENT is non-nil, it should be a number of spaces used to
+indent each line of the inserted text.
+If COLUMN is non-nil, it should be a column number which
+shouldn't be exceeded by the inserted text."
+  (pcase sequence
+    (`(,first . ,rest)
+     (let* ((indent (or indent 0))
+            (max-column (and column (- column indent))))
+       (guix-with-indent indent
+         (funcall function first)
+         (dolist (element rest)
+           (let ((before-sep-pos (and column (point))))
+             (insert separator)
+             (let ((after-sep-pos (and column (point))))
+               (funcall function element)
+               (when (and column
+                          (> (current-column) max-column))
+                 (save-excursion
+                   (delete-region before-sep-pos after-sep-pos)
+                   (goto-char before-sep-pos)
+                   (insert "\n")))))))))))
 (defun guix-insert-button (label &optional type &rest properties)
   "Make button of TYPE with LABEL and insert it at point.