跨越一条线的"语义"运动

vem*_*emv 4 emacs elisp

考虑以下Lisp代码行:

        (some-function 7 8 | 9) ;; some comment. note the extra indentation
Run Code Online (Sandbox Code Playgroud)

该点位于'8'和'9'之间.如果我执行(move-beginning-of-line),该点将被放置在行的绝对开头,而不是'('.

同样适用于move-end-of-line:如果我执行一次,我会发现将点放在')',如果我再次执行它,则将其放在行的绝对末尾.有些IDE表现得那样.

我试图实现这个但是卡住了,我的解决方案在缓冲区末端和迷你缓冲区之间表现得特别糟糕.是否有提供此功能的库?

Gil*_*il' 5

我不知道任何库,但它可以在几行Elisp中完成.

对于行部分的开头,捆绑的函数beginning-of-line-textback-to-indentation(M-m)移动到行的"有趣"部分的开头.back-to-indentation只忽略空格而beginning-of-line-text忽略填充前缀(在编程语言中,这通常是注释标记,如果在注释中).请参阅Emacs中的智能家居,了解如何在实际线和逻辑线的开头之间进行切换.

对于行尾部分,以下函数实现了您所描述的内容.函数end-of-line-code移动到行的末尾,除了尾随空格和可选的尾随注释.该函数end-of-line-or-code执行此操作,但如果该点已经在目标位置,或者该行仅包含空格和注释,则该点移动到实际行的末尾.

(defun end-of-line-code ()
  (interactive "^")
  (save-match-data
    (let* ((bolpos (progn (beginning-of-line) (point)))
           (eolpos (progn (end-of-line) (point))))
      (if (comment-search-backward bolpos t)
          (search-backward-regexp comment-start-skip bolpos 'noerror))
      (skip-syntax-backward " " bolpos))))

(defun end-of-line-or-code ()
  (interactive "^")
  (let ((here (point)))
    (end-of-line-code)
    (if (or (= here (point))
        (bolp))
        (end-of-line))))
Run Code Online (Sandbox Code Playgroud)