У вас есть умное поведение для домашнего ключа в Emacs? Умным я подразумеваю, что вместо перехода к символьному номеру 0 он должен перейти к первому непустому символу и перейти к 0 при втором нажатии и вернуться к первому непустому в третьем и так далее. У умного конца было бы неплохо.
Умный дом в Emacs
Ответ 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)