[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

02/05: emacs: Extend 'guix-mapinsert'.

From: Alex Kost
Subject: 02/05: emacs: Extend 'guix-mapinsert'.
Date: Tue, 31 May 2016 20:52:07 +0000 (UTC)

alezost pushed a commit to branch master
in repository guix.

commit 65e5fe54bae67fbd6de225fd8cc909401045a099
Author: Alex Kost <address@hidden>
Date:   Sun May 15 10:34:47 2016 +0300

    emacs: Extend 'guix-mapinsert'.
    * emacs/guix-utils.el (guix-mapinsert): Add 'indent' and 'column'
    keyword arguments.
 emacs/guix-utils.el |   33 +++++++++++++++++++++++++--------
 1 file changed, 25 insertions(+), 8 deletions(-)

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.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]