From 65e5fe54bae67fbd6de225fd8cc909401045a099 Mon Sep 17 00:00:00 2001 From: Alex Kost Date: Sun, 15 May 2016 10:34:47 +0300 Subject: 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(-) (limited to 'emacs') diff --git a/emacs/guix-utils.el b/emacs/guix-utils.el index ea9933f5c3..3e4ecc36ab 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) 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. -- cgit v1.2.3