Elisp: простая оболочка над «заданной точкой мыши» изменяет поведение

«Заданная точка мыши» - это функция, которая вызывается в Emacs с помощью «двойного щелчка мышью» по слову, чтобы задать область вокруг него и активировать. Я сделал над ним простую оболочку и привязал ее вместо стандартной, например:

(defun mouse-set-point-highlight-occurs (EVENT)
  (interactive "e")
  (mouse-set-point EVENT))

(global-set-key (kbd "<double-mouse-1>") 'mouse-set-point-highlight-occurs)

Как видите, он ничего не делает, кроме простой передачи аргумента, поэтому поведение не следует менять. Но теперь при двойном щелчке область появляется только на мгновение, а затем исчезает. Что может быть в этом плохого?


person Hi-Angel    schedule 07.09.2014    source источник


Ответы (1)


Короткий ответ: вы хотите позвонить mouse-set-region вместо mouse-set-point.

Более длинный ответ: часть того, что вы видите, является давней ошибкой в ​​том, как работает код выбора области мыши. Если вы посмотрите на код mouse-drag-track (который является рабочей лошадкой для mouse-drag-region, привязанного к down-mouse-1), вы увидите, что эта функция является той, которая реализует поведение mouse-set-point в случае double-mouse-1 (т. Е. Проверяет, соответствует ли привязка mouse-set-point и то есть он выполняет свой собственный код вместо mouse-set-point).

В магистрали Emacs (т.е. не в том, что будет выпущено как 24.4, а в следующем), этот код был изменен, чтобы работать «более нормально». Но даже в магистрали Emacs ваш код не будет работать правильно: вам нужно дополнительно передать не-nil второй аргумент в mouse-set-point, чтобы указать, что вы не просто хотите установить точку, а на самом деле установить регион .

person Stefan    schedule 08.09.2014
comment
Хм ... Так, наверное, я должен установить свою функцию вместо mouse-set-point, верно? Как это (setq mouse-set-point-highlight-occurs 'mouse-set-point), и не меняйте функцию, которая вызывается, когда я делаю двойной щелчок. Это будет работать? Кстати, mouse-set-region тоже не работает. - person Hi-Angel; 08.09.2014
comment
Ладно, «setq» не работает. Он никогда не работал с указателем на функцию в переменных, только с «car» и «cdr». Я бы счел это ошибкой =. = В любом случае, я делаю самодельную версию mouse-set-region, и у нее точно такая же проблема, как и у тех, которые я пробовал раньше. Вот он pastebin.com/cXdaLhRx У вас есть идеи? - person Hi-Angel; 08.09.2014
comment
Я не знаю, как еще это сказать: в вашем mouse-set-point-highlight-occurs вам нужно позвонить mouse-set-region вместо mouse-set-point. - person Stefan; 08.09.2014
comment
Это именно то, что я делаю, и это не сработало. Вам это подходит? - person Hi-Angel; 08.09.2014
comment
На рабочем компьютере у меня установлено больше более поздних версий Emacs, чем дома, и я тоже протестировал их здесь. Тоже не работает. Проблема точно такая же, если не брать во внимание то, что я называю: mouse-set-point или mouse-set-region. - person Hi-Angel; 08.09.2014
comment
Извините, я, вероятно, ввел вас в заблуждение насчет того, что я делаю, потому что тот факт, что я проверил ваш совет, я упомянул с нечеткой фразой «Кстати, mouse-set-region тоже не работает». - person Hi-Angel; 08.09.2014
comment
Хм, похоже, вы правы: mouset-set-region в Emacs ‹= 24.4 вам тоже не поможет. Код, который вам нужно запустить, не привязан к какой-либо функции, он скрыт в середине mouse-drag-track. В транке Emacs mouse-set-region работает OTOH. - person Stefan; 08.09.2014
comment
Стефан, ну что ж, это не большая проблема, потому что это Emacs ☺ Не могли бы вы сказать, что не так с [этой ручной функцией] (pastebin.com/cXdaLhRx), которая должна быть заменой багов в недавнем Emacses mouse-set-region? Он страдает той же проблемой, что и все, что я пробовал здесь, и сейчас он ничего не делает, кроме mouse-set-region функциональности. - person Hi-Angel; 08.09.2014
comment
Просто потому, что второй re-search-forward не двигается. - person Stefan; 08.09.2014
comment
Спасибо большое, теперь работает. Я просто добавил строку (right-char) перед (re-search-forward…. Если кто-то столкнется с такой же проблемой, вы можете дать ему следующий код: з - person Hi-Angel; 08.09.2014