考虑下面这行 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/