Переход к началу строки кода: Emacs - PullRequest
40 голосов
/ 17 мая 2011

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

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

Здесь |обозначает курсор, а () обозначает пробелы или символы табуляции.

Как мне это сделать?

Ответы [ 5 ]

78 голосов
/ 17 мая 2011

Meta м

31 голосов
/ 18 мая 2011

Мой любимый способ справиться с этим - это иметь 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))
18 голосов
/ 31 августа 2011

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

(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 голосов
/ 12 декабря 2011

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

1 голос
/ 14 февраля 2016

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...