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

Умный дом в Emacs

У вас есть умное поведение для домашнего ключа в Emacs? Умным я подразумеваю, что вместо перехода к символьному номеру 0 он должен перейти к первому непустому символу и перейти к 0 при втором нажатии и вернуться к первому непустому в третьем и так далее. У умного конца было бы неплохо.

4b9b3361

Ответ 1

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

Я не совсем уверен, какой умный конец. Как правило, у вас есть много отстающих пробелов?

Примечание.. Основное различие между этой функцией и Робертом Вуковичем заключается в том, что он всегда переходит к первому непустому символу при первом нажатии клавиши, даже если курсор уже существует. В этом случае шахта переместится в столбец 0.

Кроме того, он использовал (beginning-of-line-text), где я использовал (back-to-indentation). Они очень похожи, но между ними есть некоторые различия. (back-to-indentation) всегда перемещается к первому символу без пробелов в строке. (beginning-of-line-text) иногда перемещается мимо символов без пробелов, которые он считает несущественными. Например, в строке только для комментариев он перемещается к первому символу текста комментария, а не к маркеру комментариев. Но любая функция может использоваться в любом из наших ответов, в зависимости от того, какое поведение вы предпочитаете.

Ответ 2

Это работает с 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)

Ответ 3

Спасибо за эту удобную функцию. Я использую его все время и люблю его. Я сделал только одно небольшое изменение: (Интерактивный) будет выглядеть так: (интерактивный "^" )

Из справки emacs: Если строка начинается с ^' and shift-select-mode ', она не равна нулю, Emacs сначала вызывает функцию `handle-shift-select'.

В основном это означает, что вы выбираете shift-home из текущей позиции в начало строки, если вы используете режим выбора shift. Это особенно полезно в минибуфере.

Ответ 4

Обратите внимание, что уже есть функция возврата к отступу, которая делает то, что вы хотите, чтобы первая функция смарт-дома выполняла, т.е. переходила к первому символу без пробелов в строке. По умолчанию он привязан к M-m.

Ответ 5

Теперь есть пакет, который делает именно это, mwim (Move Where я Mean)

Ответ 6

Я адаптирую код @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)