Подтвердить что ты не робот

Переход к началу строки кода: Emacs

Я использую emacs для разработки и очень часто нужно перейти к началу строки (C-a). Однако, если строка имеет отступ, я хотел бы перейти к точке начала кода.

Итак, во время просмотра кода: ( ) for x in xy|z:. При вводе C-a получаем следующее: |( ) for x in xyz:. Но вместо этого мне бы хотелось: ( ) |for x in xyz:

Здесь | указывает курсор и() указывает пробелы или вкладки.

Как я могу заставить это сделать?

4b9b3361

Ответ 1

Meta - m

Ответ 2

Любимый способ справиться с этим состоит в том, чтобы C-a переключался между началом строки и началом кода. Вы можете сделать это с помощью этой функции:

(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 "C-a") 'beginning-of-line-or-indentation))

Ответ 3

Я делаю тот же самый трюк, что и Трей, но по умолчанию не в начале строки, а в отступе. Он требует немного больше кода, потому что нет функции "начала-отступки", о которой я знаю.

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

Это, вероятно, позволит вам продолжать использовать Ctrl - a и делать так, чтобы вы делали то, что вы хотите чаще всего, но все же можете легко создавать встроенное поведение.

Ответ 4

По умолчанию Meta-m запускает back-to-indentation, который согласно в документации будет "Перенести точку на первый символ без пробелов в этой строке".

Ответ 5

Общая идиома среди современных 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)

Этот код сначала переходит к фактическому началу/концу, новое поведение появляется при последующих нажатиях. Таким образом, любые старые макросы клавиатуры будут работать, как ожидалось!