gpt4 book ai didi

emacs - 跨线的“语义”运动

转载 作者:行者123 更新时间:2023-12-04 23:05:09 30 4
gpt4 key购买 nike

考虑下面这行 Lisp 代码:

        (some-function 7 8 | 9) ;; some comment. note the extra indentation

该点位于“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跳过 fill prefix (在编程语言中,如果在注释中,这通常是注释标记)。见 Smart home in 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))))

关于emacs - 跨线的“语义”运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14243583/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com