2008-09-28 2 views
36

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

ответ

58
(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) иногда перемещается мимо символов без пробелов, которые он считает несущественными. Например, в строке только для комментариев он перемещается к первому символу текста комментария, а не к маркеру комментариев. Но любая функция может использоваться в любом из наших ответов, в зависимости от того, какое поведение вы предпочитаете.

+1

К сожалению, это не работает с CuA включено, и в этом случае сдвиг для выбора не работает, сдвиг дома для выбора полной строки не работает. Какие-либо предложения? – 2010-05-27 08:40:28

+0

@ Александр Штольц, я никогда не использую cua-mode, но попробуйте добавить `(поместите 'умное начало-в-линию' CUA 'move)` после `defun` (т.е. перед` global-set-key` линия). – cjm 2010-05-27 09:18:14

12

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

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

6

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

С помощью Emacs: Если строка начинается с ^' and Shift-выбора режима»не является нулевым, Emacs сначала вызывает функцию `handle-shift-select '.

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

0

Я адаптировать @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) 
2

Существует в настоящее время пакет, который делает именно это, mwim (Move Где я имею в виду)

Смежные вопросы