Ответ 1
Meta - m
Я использую emacs для разработки и очень часто нужно перейти к началу строки (C-a). Однако, если строка имеет отступ, я хотел бы перейти к точке начала кода.
Итак, во время просмотра кода: ( ) for x in xy|z:
. При вводе C-a получаем следующее: |( ) for x in xyz:
. Но вместо этого мне бы хотелось: ( ) |for x in xyz:
Здесь | указывает курсор и() указывает пробелы или вкладки.
Как я могу заставить это сделать?
Meta - m
Любимый способ справиться с этим состоит в том, чтобы 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))
Я делаю тот же самый трюк, что и Трей, но по умолчанию не в начале строки, а в отступе. Он требует немного больше кода, потому что нет функции "начала-отступки", о которой я знаю.
(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 и делать так, чтобы вы делали то, что вы хотите чаще всего, но все же можете легко создавать встроенное поведение.
По умолчанию 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)
Этот код сначала переходит к фактическому началу/концу, новое поведение появляется при последующих нажатиях. Таким образом, любые старые макросы клавиатуры будут работать, как ожидалось!