Emacs的智能家居

时间:2020-03-06 14:50:25  来源:igfitidea点击:

我们可以对Emacs中的Home键采取明智的做法吗?聪明的意思是,它应该转到第一个非空白字符,而不是转到字符号0,并在第二次按下时转到0,然后在第三次返回到第一个非空白,依此类推。
拥有明智的选择也将是一件好事。

解决方案

(defun smart-beginning-of-line ()
  "Move point to first non-whitespace character or beginning-of-line.

Move point to the first non-whitespace character on this line.
If point was already at that position, move point to beginning of line."
  (interactive "^") ; Use (interactive) in Emacs 22 or older
  (let ((oldpos (point)))
    (back-to-indentation)
    (and (= oldpos (point))
         (beginning-of-line))))

(global-set-key [home] 'smart-beginning-of-line)

我不太确定智能终端会做什么。我们通常有很多尾随空格吗?

注意:此功能与Robert Vukovi?的主要区别在于,即使光标已经在该位置,他也始终移至第一次按键时的第一个非空白字符。在这种情况下,矿山将移至第0列。

另外,他使用了"(行开始)",而我使用了"(缩进)"。这些非常相似,但是它们之间存在一些差异。 (back-to-indentation)总是移到一行的第一个非空白字符。 "(行首)"有时会移过它认为无关紧要的非空白字符。例如,在仅注释行上,它移动到注释文本的第一个字符,而不是注释标记。但是,根据我们喜欢的行为,可以在我们的任何一个答案中使用这两个函数。

这可以在GNU Emacs上使用,我没有在XEmacs上尝试过。

(defun My-smart-home () "Odd home to beginning of line, even home to beginning of text/code."
    (interactive)
    (if (and (eq last-command 'My-smart-home)
            (/= (line-beginning-position) (point)))
    (beginning-of-line)
    (beginning-of-line-text))
)

(global-set-key [home] 'My-smart-home)

请注意,已经有一个返回缩进功能,该功能可以执行我们希望第一个智能家居功能执行的操作,即转到该行上的第一个非空白字符。默认情况下,它绑定到M-m。

感谢便捷功能。我现在一直在使用它,并喜欢它。我只做了一个小改动:
(交互的)
变成:
(交互式" ^")

从emacs帮助:
如果字符串以" ^"开头并且" shift-select-mode"为非零,则Emacs首先调用函数" handle-shift-select"。

基本上,如果使用shift-select-mode,这会使从当前位置到行的开始进行原点复归选择。在minibuffer中特别有用。