自动换行 -- 在视觉行末尾叠加"后字符串"时使用"光标 t"



问题:当point位于视觉换行行的末尾(但不是该行的末尾)时,光标不尊重覆盖after-stringcursor t设置——即光标出现在下一个视觉换行的开头,而不是当前视觉换行的末尾。

在这个例子/问题中,我们假设变量word-wrapt,变量truncate-linesnil。它不一定是visual-line-mode是活跃的,但它当然可以是。目标是将水平标尺从视觉行的末端延伸到右窗口边缘,并修复当point位于视觉换行行的末端(但不是在该行的末端)时发生的问题。

下面的代码在的任何情况下都可以工作,除了当光标位于视觉上换行的行末尾时(但不是在行末尾)。在编程上,在这种情况下,光标如何在视觉上保持位于覆盖after-string的开头?

(defun example ()
(interactive)
  (let* (
    peovl
    peovl+1
    (col-eovl
      (save-excursion
          (let ((movement-indicator (vertical-motion 1)))
            (when (= movement-indicator 1)
              (backward-char 1)))
          (setq peovl (point))
          (setq peovl+1 (1+ peovl))
          (- (current-column) (progn (vertical-motion 0) (current-column)))))
    (current-underline-length (- (window-width) col-eovl))
    (underline (propertize (char-to-string ?u2009)
          'display `(space :width ,current-underline-length)
          'face '(:underline "blue")
          'cursor t)))
  (remove-overlays)
  (unless (= peovl (point-at-eol))
    (overlay-put (make-overlay peovl peovl+1) 'display ""))
  (overlay-put (make-overlay peovl peovl) 'after-string underline)))

当在视觉换行的最后一点添加具有'after-string属性的覆盖到空格字符(即数字32字符代码)时,光标将完全跳过覆盖。cursor t属性将被忽略。

解决方案/变通方法是使用'display属性来代替,当试图达到原海报所描述的视觉效果时。

(defun example ()
(interactive)
  (remove-overlays)
  (let* (
    result
    peovl
    peovl+1
    (opoint (point))
    (peol (point-at-eol))
    (underscore "_")
    (col-eovl
      (save-excursion
          (let ((movement-indicator (vertical-motion 1)))
            (when (= movement-indicator 1)
              (backward-char 1)))
          (setq peovl (point))
          (setq peovl+1 (1+ peovl))
          (- (current-column) (progn (vertical-motion 0) (current-column)))))
    (current-underline-length (- (window-width) col-eovl))
    (eol-underline (propertize (char-to-string ?u2009)
          'display `(space :width ,current-underline-length)
          'face '(:underline "blue")
          'cursor t))
    (underscore-concatenated
      (progn
        (dotimes (i current-underline-length)
          (setq result (concat underscore result))) result))
    (wrapped-peovl-underline (propertize underscore-concatenated
          'face '(:foreground "blue")
          'cursor t)) )
    (if
        (and
          (= opoint peovl)
          (not (= peovl peol)))
      (overlay-put (make-overlay peovl peovl+1) 'display wrapped-peovl-underline)
      (unless (= peovl peol)
        (overlay-put (make-overlay peovl peovl+1) 'display ""))
      (overlay-put (make-overlay peovl peovl) 'after-string eol-underline))))

相关内容

最新更新