<double-mouse-1>에 바인딩 된 선택 단어 / 기호 기능은 무엇입니까


11

나는 현재 더블 마우스 클릭으로하는 지점에서 단어 / 기호를 선택할 수있는 기능을 좋아합니다. 키보드에서 할 수 있기를 원하므로 키 입력 (또는 이미 있을까요?)에 바인딩하고 싶습니다. 그래서 함수 이름이 필요합니다. 함수가 이미 존재한다고 가정하지만 이름이 무엇인지 알 수 없습니다.

시도 C-h k했지만 마우스를 두 번 클릭하면 도움말이 <down-mouse-1>표시됩니다 (도움말 시스템이 두 번째 클릭을 기다리지 않는다고 가정합니다). 또한 21.2 장에서이 기능이 정의 된 문서를 검색했지만 함수 이름을 말하지 않았습니다.

업데이트 : 일반적인 키 바인딩을 위해 나는에 해당하는 가정하자 <C-left>다음에 <C-S-right>하는 수 있습니다 left-wordright-word시프트 키가 후자 개최하고 있지만, 각각. (Shift 키가있는 키보드 지정과 기능에 대한 매핑 사이의 관계를 완전히 이해하지 못합니다.로 식별하기 전에 <C-S-right>번역 하는 데 도움 <C-right>이됩니다. right-word)


C-h b해당 버퍼를 사용 하고 검색 하면 특정 이벤트가있는 "mouse.el"의 <double-mouse-1>호출이 표시 mouse-set-point됩니다. 이것이 얼마나 도움이되는지 확실치 않습니다 :)
VanLaser

1
시프트 된 버전과 시프트되지 않은 버전의 C- 오른쪽 및 C- 왼쪽 사이의 관계는 효과입니다 shift-selection-mode(참조 (info "(emacs) Shift Selection")). 또한 참조 emacs.stackexchange.com/questions/12858/...
YoungFrog

@YoungFrog 그런 종류의 합병증은 종종 대부분의 emacs 프로그래밍을 키보드 매크로로 유지합니다. 간단한 kbd 매크로를 기반으로 <right> <C-left> <C-S-right>한다는 것은 해당 링크에서 오랫동안 논의 된 미묘한 문제를 완전히 해결할 필요가 없음 을 의미합니다.
Chip Grandits

답변:


9

실제로 약간 복잡합니다. 두 번 클릭하면 mouse-1여러 작업이 있습니다. <down-mouse-1>버튼을 누르면 먼저 발생합니다. 그런 다음 mouse-1버튼에서 손을 떼면 발생합니다.

<down-mouse-1>명령에 바인딩 mouse-drag-region되고 해당 명령이 호출 mouse-drag-track됩니다. 이 기능은 마우스 버튼 클릭을 계산하고 마우스 움직임을 추적합니다 (두 번 클릭하면 마우스를 움직이지 않았 음을 의미).

mouse-drag-trackmouse-start-end 선택할 텍스트 범위를 결정하는 함수 를 호출합니다 . 그것은에 전달 mouse-start-end세 번째 인수로, 당신이 클릭 한 위치, 처음 두 인수 및 클릭 수입니다. 이것은 mouse-start-end:

mouse-start-end is a compiled Lisp function in `mouse.el'.

(mouse-start-end START END MODE)

Return a list of region bounds based on START and END according to MODE.
If MODE is 0 then set point to (min START END), mark to (max START END).
If MODE is 1 then set point to start of word at (min START END),
mark to end of word at (max START END).
If MODE is 2 then do the same for lines.

두 번째 클릭으로 세 번째 인수 ( MODE) 로 전달 된 클릭 수 는 1입니다.

키보드 키 시퀀스에서이 코드 중 일부만 호출 할 수는 없지만 코드를 검사하면 원하는 키보드 키 바인딩 가능 명령을 작성하는 데 도움이 될 수 있습니다.


마우스 이벤트에서 작동하지 않는 이유 를 설명해 주셔서 감사 C-h k합니다. 내가 Emacs가 "마우스를 다루는"방법을 조사하기 위해 알아 낸 가장 좋은 방법은 마우스를 키보드 매크로로 기록하고 이름을 지정한 다음 insert-kbd-macro 일반적으로 생성 된 코드를 보는 것입니다. 이 임시 매크로는 Emacs가하는 일을 보는 데 유용합니다.
Chip Grandits

6

@Drew는 마우스 동작과 관련된 이벤트와 관련된 복잡성을 설명했습니다. 키보드를 사용하여 특정 지점에 단어를 표시하는 궁극적 인 목표는 확장 영역에 관심이있을 수 있습니다 .

expand-region시맨틱 단위로 영역을 조작 할 수 있습니다. 예를 들어, 지역이 활성화되어 있지 않은 경우 er/expand-region(일반적으로 C-=)를 호출 하면 현재 단어가 표시됩니다. 다시 호출하면 영역이 현재 문장으로 확장됩니다. 그런 다음 단락, 섹션 등 실제 단위는 사용하는 모드에 따라 달라 지므로 lisp 모드에서는 기호, 기호를 묶는 식, 해당 식을 묶는 식 등이됩니다.

링크 된 페이지에는 자세한 설명과이를 보여주는 비디오가 있습니다.


1
예 melpa의 패키지 목록에 확장 영역 패키지가 있습니다. 매우 유용합니다. Emacs에서 기본값이 아니거나 CEDET과 함께 번들로 제공되는 것이 놀랍습니다. 팁 고마워!
Chip Grandits

Chip Grandits : 적절한 저작권 할당을 통해 FSF에 패키지를 제출 한 저자에 따라 다릅니다. 저자가 제출하지 않은 경우 Emacs의 기본 부분이 될 수 없습니다.
phils

2

여기에서 추출한 기능은 mouse-set-region두 번 클릭 할 때 표시됩니다.

(defun ora-mark-like-double-mouse-1 ()
  (interactive)
  (let ((bnd (mouse-start-end (point) (point) 1)))
    (goto-char (car bnd))
    (push-mark)
    (set-mark (point))
    (goto-char (cadr bnd))))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.