Различные результаты, когда функция elisp запускается разными способами; Зачем? - PullRequest
4 голосов
/ 01 декабря 2011

РЕДАКТИРОВАТЬ: Возможно (в оригинальном сообщении) я использовал термин "переходный процесс" неправильно (я еще недостаточно знаком с жаргоном). На самом деле я имею в виду, что выделенная область исчезнет сразу же, когда пользователь нажмет навигационные клавиши , например. клавиши со стрелками ... (2-е редактирование: я удалил слово "переходный процесс")


Особая проблема выбора региона, чтобы пользователь получил "движение курсора с помощью клавиши подсветки исчезнет" была проклятием моего существования в последнее время. Я получаю разные результаты в зависимости от того, как я запускаю следующий скрипт.

Почему он дает разные результаты, а точнее, есть ли способ заставить его производить "клавиши курсора заставляют подсветку исчезать" независимо от того, какой режим работает, или когда он оценивается во время тестирование? .. Режим CUA имеет такое поведение, но мне действительно нужно, чтобы режим не CUA делал это тоже (и eval, если это возможно) ...

Вот результаты, за которыми следует код. (GNU Emacs 23.1.1)

  • Режим CUA включен

    1. Оценка с помощью C-x C-e - и (call-trans-hi), и (trans-hi)
      NO-GO : и установить метку, и переместить точку в EOL, но ничего не будет выделено.

    2. Выполнить M-x call-trans-hi
      хорошо: работает отлично; область подсвечивается, а затем исчезает при первом нажатии клавиши.

    3. Через связывание ключей C-f1
      хорошо: работает отлично; область подсвечивается, а затем исчезает при первом нажатии клавиши.

  • без режима CUA (в основном стандартный emacs)

    1. Оценка через C-x C-e
      NO-GO : То же, что и 1., когда CUA включен.

    2. Выполнить M-x call-trans-hi
      NO-GO : строка выделена, , но она липкая! и для ее очистки требуется C-g (выход из клавиатуры).

    3. С помощью привязки ключей C-f1
      NO-GO : строка выделена, , но она липкая! и для очистки требуется C-g (выход из клавиатуры).


 ;test (trans-hi) EOL
 (defun trans-hi ()
   "transient highlight"
     (beginning-of-line)
     (push-mark (point))
     (end-of-line)
     (activate-mark))

 ;test (call-trans-hi) EOL
 (defun call-trans-hi ()
   "call transient highlight"
     (interactive)
     (trans-hi))
 (global-set-key [C-f1] 'call-trans-hi)

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Когда вы посмотрите на источник activate-mark, вы увидите, что он просто устанавливает некоторые переменные. Я полагаю, именно поэтому вы не видите метку в обоих 1. , потому что фактическое выделение происходит в некоторых вещах, которые выполняются при интерактивном выполнении функций вместо простого их вызова.

В других случаях отсутствия CUA-режима, именно так работает переходная подсветка вне CUA-режима. Если вы хотите поведение в режиме CUA, используйте режим CUA, соответственно. эта часть этого.

EDIT:

Это изменение (добавление строки setq) к trans-hi заставляет подсветку работать так, как вы хотите?

(defun trans-hi ()
  "transient highlight"
  (beginning-of-line)
  (push-mark (point))
  (end-of-line)
  (setq transient-mark-mode (cons 'only transient-mark-mode))
  (activate-mark))
0 голосов
/ 01 декабря 2011

Если вы хотите, чтобы регион выделен, когда вы отмечаете его, вам нужно активировать второстепенный режим transient-mark-mode.

Когда регион выделен и введен символ, по умолчанию отключить подсветку и вставить символ в курсор.

При желании вы можете удалить выбранный регион, активировав режим delete-selection-mode.

...