考虑以下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表现得那样.
我试图实现这个但是卡住了,我的解决方案在缓冲区末端和迷你缓冲区之间表现得特别糟糕.是否有提供此功能的库?
我不知道任何库,但它可以在几行Elisp中完成.
对于行部分的开头,捆绑的函数beginning-of-line-text和back-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)