¿Cómo usar helm para completar fuentes que son líneas en un búfer?

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)

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım