emacs - 跨线的“语义”运动

标签 emacs elisp

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

相关文章:

emacs - 如何在所有模式下在 emacs 中获得自动缩进(非智能缩进)

emacs - 在Emacs中定义新语法

emacs - 如何使 describe-function "C-h f"默认不区分大小写

emacs - emacs 'site' 代表什么?

emacs - 如何在 emacs 中将待办事项优先级组织为列?

Emacs 错误地寻找 .el 而不是 .elc

c - 在gdb中调试时如何检查哪个文件声明了变量?

html - 使用一个 org-mode 文件创建多页面网站

java - 在 emacs 中更改 java 模式的缩进样式

emacs - 在启动时添加 Hook 到 emacs scrap