Emacs的智能家居

时间:2008-09-28 05:50:36

标签: emacs

你能在Emacs中拥有智能行为吗?通过智能我的意思是,它不应该转到字符编号0,而是应该转到第一个非空白字符,然后在第二次按下时转到0,在第三个按下转到第一个非空白,依此类推。 拥有聪明的结局也会很好。

7 个答案:

答案 0 :(得分:60)

(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)

我不太确定聪明的结局会做什么。你通常有很多尾随空格吗?

注意:这个函数和RobertVuković之间的主要区别在于,即使光标已经存在,他总是会移动到第一个按键上的第一个非空白字符。在这种情况下,我将移至第0列。

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

答案 1 :(得分:12)

这适用于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)

答案 2 :(得分:6)

感谢这个方便的功能。我现在一直使用它并喜欢它。我做了一个小改动: (互动) 变为: (互动“^”)

来自emacs帮助: 如果字符串以^' and开头,则shift-select-mode'为非零,Emacs首先调用函数`handle-shift-select'。

如果使用shift-select-mode,基本上这会使shift-home从当前位置选择到行首。它在迷你缓冲器中特别有用。

答案 3 :(得分:4)

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

答案 4 :(得分:2)

现在有一个包就是这样,mwim(移动我的意思)

答案 5 :(得分:0)

我首先调整@Vucovic代码跳转到beggining-of-line

(defun my-smart-beginning-of-line ()
  "Move point to beginning-of-line. If repeat command it cycle
position between `back-to-indentation' and `beginning-of-line'."
  (interactive "^")
  (if (and (eq last-command 'my-smart-beginning-of-line)
           (= (line-beginning-position) (point)))
      (back-to-indentation)
    (beginning-of-line)))

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

答案 6 :(得分:0)

我的版本:移至可视行的开头,第一个非空白或行的开头。

(defun smart-beginning-of-line ()
    "Move point to beginning-of-line or first non-whitespace character"
  (interactive "^")
  (let ((p (point)))
    (beginning-of-visual-line)
    (if (= p (point)) (back-to-indentation))
    (if (= p (point)) (beginning-of-line))))
(global-set-key [home] 'smart-beginning-of-line)
(global-set-key "\C-a" 'smart-beginning-of-line)

[home]"\C-a"(Ctrl + a)键:

  • 将光标移动(指向)视线的起点。
  • 如果它已经在可视行的开头,则将其移至该行的第一个非空白字符。
  • 如果已经存在,请将其移至行首。
  • 移动时,请保持区域(interactive "^")。

这取自@cjm和@thomas;然后添加视觉线条。 (对不起,我的英语不好)。