mouse – Obtenga puntos al principio / final de la línea visual sin utilizar el movimiento vertical

Pregunta:

P : Cómo obtener los puntos al principio y al final de cada línea visual de la ventana actual, sin usar vertical-motion , cuando el word-wrap es t (también conocido como visual-line-mode ).

Para este experimento, estoy usando algunas de las funciones de la sección del manual titulada Acceso a eventos del mouse : http://www.gnu.org/software/emacs/manual/html_node/elisp/Accessing-Mouse.html

ANTECEDENTES: Como todos sabemos, vertical-motion es muy costoso en términos de tiempo. Tengo un modo menor personalizado que es similar a vline.elhttp://www.emacswiki.org/emacs/vline.el – excepto que el mío funciona con word-wrap / visual-line-mode . Estoy buscando un método más rápido para realizar cálculos en cada ciclo de comando. En este momento, hago una pasada de la ventana actual (cada ciclo de comando) usando vertical-motion para obtener la siguiente información: apuntar al principio / final de toda la línea; apuntar al principio / final de la línea visual; el número de columna visual al final de la línea visual (que puede ser diferente del número de columna real cuando una línea está envuelta en el borde de la ventana); apunte en cada ubicación en una línea vertical desde la posición del cursor que se extiende desde el inicio de la ventana hasta el final de la ventana; y otra información diversa basada en todo lo anterior, por ejemplo, colores de caras de primer plano / fondo y códigos de caracteres en las diversas ubicaciones, números de línea, etc.

(setq word-wrap t)

(setq truncate-lines nil)

(progn
  (remove-overlays) ;; after-string properties prevent `posn-at-point` from working right.
  (let* (
      pt
      posn-at-x-y
      (counter 0)
      (window-height (window-height))
      (window-header-line-height (window-header-line-height))
      (frame-char-height (frame-char-height))
      (position (posn-at-point))
      (posn-x-y (nth 2 position))
      (posn-actual-col-row (nth 6 position)))
    (while (<= counter window-height)
      (unless
          (and
            (= counter 0)
            (= 0 window-header-line-height))
        (setq posn-at-x-y (posn-at-x-y (car posn-x-y) (* frame-char-height counter))))
      (setq pt (nth 1 posn-at-x-y))
      (setq counter (1+ counter))
      (message "counter: %s | %s" counter (if (integerp pt) (char-after pt) pt)))))

Respuesta:

Primer borrador

En cuanto a x , un píxel menos que (window-body-width nil t) cuando se usa junto con posn-at-xy producirá el punto al final de la línea visual. En cuanto a x , cero devolverá el punto al comienzo de la línea visual. Consulte el diagrama del manual en la sección relacionada con los tamaños de las ventanas : https://www.gnu.org/software/emacs/manual/html_node/elisp/Window-Sizes.html

(progn
  (remove-overlays)
  (let* (
      pt
      posn-at-x-y
      (counter 0)
      (window-body-width (window-body-width nil t))
      (last-available-x (1- window-body-width))
      (window-height (window-height))
      (window-header-line-height (window-header-line-height))
      (frame-char-height (frame-char-height))
      (position (posn-at-point))
      (posn-x-y (nth 2 position))
      (posn-actual-col-row (nth 6 position)) ) ;; not presently used
    (while (<= counter window-height)
      (unless
          (and
            (= counter 0)
            (= 0 window-header-line-height))
        (setq posn-at-x-y (posn-at-x-y (car posn-x-y) (* frame-char-height counter)))
        (setq posn-x-y (nth 2 posn-at-x-y)))
      (setq pt (nth 1 posn-at-x-y))
      (message "counter: %s | pt: %s | pbovl: %s | peovl: %s"
        counter
        (if (integerp pt)
          pt ;; (char-after pt) -- not presently used.
          pt)
        (nth 1 (posn-at-x-y 0
          (if (= counter 0)
            (cdr posn-x-y)
            (+ window-header-line-height (cdr posn-x-y)))))
        (nth 1 (posn-at-x-y last-available-x
          (if (= counter 0)
            (cdr posn-x-y)
            (+ window-header-line-height (cdr posn-x-y))))))
      (setq counter (1+ counter)))))

Leave a Comment

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

Scroll to Top

web tasarım