Pregunta:
Tengo un búfer (no un archivo) que contiene datos. Me gustaría una función que le permita al usuario seleccionar 1 o más líneas de este búfer, por ejemplo, escribiendo una expresión regular, y que devuelva el resultado como una lista de líneas seleccionadas.
El resultado sería equivalente a una ejecución grep
dentro de helm
excepto que, como resultado de validar la selección, no quiero visitar las líneas coincidentes, sino obtenerlas en una lista.
Respuesta:
Si entendí correctamente, entra la expresión regular, sale la lista de líneas coincidentes.
Aquí hay un comienzo para esto:
(helm-occur-init-source)
(defvar helm-source-lines (copy-alist helm-source-occur))
(setcdr (assoc 'action helm-source-lines) 'helm-lines-action)
(defun helm-lines-action (x)
(with-current-buffer "*helm lines*"
(cdr
(split-string
(buffer-substring-no-properties
(point-min)
(point-max))
"\n"
t))))
(defun helm-lines ()
"Preconfigured helm for Occur."
(interactive)
(let ((bufs (list (buffer-name (current-buffer)))))
(helm-attrset 'moccur-buffers bufs helm-source-lines)
(helm-set-local-variable 'helm-multi-occur-buffer-list bufs)
(helm-set-local-variable
'helm-multi-occur-buffer-tick
(cl-loop for b in bufs
collect (buffer-chars-modified-tick (get-buffer b)))))
(helm :sources 'helm-source-lines
:buffer "*helm lines*"
:truncate-lines t))
(setq test (helm-lines))
Si no desea números de línea, puede cambiar algunas teclas:
(setq helm-source-lines
(assq-delete-all 'filter-one-by-one helm-source-lines))
(setcdr (assoc 'get-line helm-source-lines)
'buffer-substring)