我发现自己经常手动修正缩进,所以我正在寻找一种方法,当我进入或离开一条线时,根据模式自动缩进一条线。目前我只是使用next-line
包装previous-line
和indent-according-to-mode
命令,并将我的C-n和C-p重新绑定到新函数,如下所示:
(defun next-line-and-indent (&optional arg try-vscroll)
"Move to the next line and indent according to mode."
(interactive)
(indent-according-to-mode)
(next-line arg try-vscroll)
(indent-according-to-mode))
(defun previous-line-and-indent (&optional arg try-vscroll)
"Move to the previous line and indent according to mode."
(interactive)
(indent-according-to-mode)
(previous-line arg try-vscroll)
(indent-according-to-mode))
这是有效的,但是是肮脏的感觉和诸如此类的东西,它也不会覆盖通过C-n和C-p以外的任何方式输入或排出的线。是否有一些我找不到的钩子,如enter-line
和leave-line
?
答案 0 :(得分:1)
您可以使用命令前挂钩和后命令挂钩来确定点是否与之前的命令位于同一行上?
(defun my-auto-indent-remember ()
"Remember the current beginning and end of line."
(setq my-auto-indent-line-beginning-position (line-beginning-position))
(setq my-auto-indent-line-end-position (line-end-position)))
(defun my-auto-indent ()
"Indent if we have changed lines."
(and (boundp 'my-auto-indent-line-beginning-position)
(boundp 'my-auto-indent-line-end-position)
(or (< (point) my-auto-indent-line-beginning-position)
(> (point) my-auto-indent-line-end-position))
(indent-according-to-mode)))
(add-hook 'pre-command-hook 'my-auto-indent-remember)
(add-hook 'post-command-hook 'my-auto-indent)
我简直无法想象这是一个好主意,顺便说一句,但我不得不尝试一下:)
启用它后,我已经已经经历了意外的重新缩进,只是在将其四个空格缩进Stack Overflow之后尝试复制该代码。
每当缩进错误时,我发现快速indent-region
几乎总能修复所有内容。
这段代码没有处理“留下一行”的位,顺便说一句,我不确定在命令后这是怎么回事。您可能必须捕获预先命令的已知移动命令,并在那里缩进。你可以 在my-auto-indent-remember中使用无条件(缩进模式)轻松测试这个想法。
答案 1 :(得分:0)
您可以尝试以下操作:
(define-key global-map (kbd "RET") 'newline-and-indent)
应该切换到新行并根据当前缩进设置自动缩进。