转到代码行的开头:Emacs

我使用emacs进行开发,经常需要移动到一行( Ca )的开头。 但是,如果行缩进,我想移动到代码开始点。

所以( ) for x in xy|z:浏览代码时:( ( ) for x in xy|z: 。 在inputCa时,我们得到这个: |( ) for x in xyz: 但是,我想这个:( ( ) |for x in xyz:

在这里| 表示光标,()表示空格或制表符。

我怎样才能使这种情况发生?

我最喜欢的方式是在行的开头和代码的开始之间切换Ca。 你可以用这个函数来做到这一点:

 (defun beginning-of-line-or-indentation () "move to beginning of line, or indentation" (interactive) (if (bolp) (back-to-indentation) (beginning-of-line))) 

并将适当的绑定添加到您最喜欢的模式映射:

 (eval-after-load "cc-mode" '(define-key c-mode-base-map (kbd "Ca") 'beginning-of-line-or-indentation)) 

我也和Trey一样扯皮,但是默认缩进而不是开始。 它只需要稍微多一点的代码,因为我没有“缩进开始”的function。

 (defun smart-line-beginning () "Move point to the beginning of text on the current line; if that is already the current position of point, then move it to the beginning of the line." (interactive) (let ((pt (point))) (beginning-of-line-text) (when (eq pt (point)) (beginning-of-line)))) 

这可能会让你继续使用Ctrla ,并让它做你最想要的东西,同时还可以轻松地获得内置的行为。

默认情况下, Meta-m运行back-to-indentation ,根据文档将“移动到该行上的第一个非空白字符”。

现代IDE中常见的习惯用法是在第二次按下时在第一个/最后一个非空白处移动:

 (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))) (defun my--smart-end-of-line () "Move point to `end-of-line'. If repeat command it cycle position between last non-whitespace and `end-of-line'." (interactive "^") (if (and (eq last-command 'my--smart-end-of-line) (= (line-end-position) (point))) (skip-syntax-backward " " (line-beginning-position)) (end-of-line))) (global-set-key [home] 'my--smart-beginning-of-line) (global-set-key [end] 'my--smart-end-of-line) 

这个代码首先转到实际的开始/结束,在后续的印刷机上出现新的行为。 所以,任何旧的键盘macros将按预期工作!