Умный дом в Emacs - PullRequest
       19

Умный дом в Emacs

38 голосов
/ 28 сентября 2008

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

Ответы [ 6 ]

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

12 голосов
/ 28 сентября 2008

Это работает с 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)
6 голосов
/ 27 сентября 2010

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

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

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

4 голосов
/ 29 сентября 2008

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

2 голосов
/ 27 декабря 2015

Теперь есть пакет, который делает именно это, mwim (Переместить, где я имею в виду)

0 голосов
/ 06 сентября 2014

Я адаптирую код @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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...