Qual é a função de seleção de palavra / símbolo vinculada a <double-mouse-1>

11

Adoro a capacidade de selecionar palavras / símbolos no ponto que atualmente faço com o clique duplo do mouse. Gostaria de poder fazer isso a partir do teclado e, portanto, gostaria de vinculá-lo a um pressionamento de tecla (ou talvez já o seja?), Por isso preciso do nome da função. Presumo que a função já deva existir, mas não consigo descobrir qual é o nome.

Tentei, C-h kmas quando clico duas vezes no mouse, <down-mouse-1>aparece a ajuda (presumo que o sistema de ajuda não aguarde o segundo clique ou algo assim). Também procurei na documentação em que essa funcionalidade está definida na seção 21.2, mas ela não diz o nome da função.

Atualização: para atalhos de teclado típicos, suponho que seja o equivalente ao <C-left>seguido pelos <C-S-right>quais são left-worde right-wordrespectivamente, embora a tecla shift seja mantida para o último. (Eu não entendo completamente a relação entre as designações do teclado com a tecla shift e o mapeamento para funções, a ajuda para <C-S-right>traduzi-lo <C-right>antes de identificá-lo como right-word)

Chip Grandits
fonte
O uso C-h be a pesquisa nesse buffer mostram as <double-mouse-1>chamadas mouse-set-point(de "mouse.el") com algum evento específico. Não tenho certeza quanto isso ajuda :)
VanLaser
1
Para o relacionamento entre a versão deslocada e a não deslocada de C-direita e C-esquerda, é o efeito de shift-selection-mode(consulte (info "(emacs) Shift Selection")). Veja também emacs.stackexchange.com/questions/12858/…
YoungFrog
@YoungFrog esse tipo de complicação é o que geralmente mantém a maior parte da minha programação do emacs como macros de teclado. Uma macro kbd simples baseada em <right> <C-left> <C-S-right>meios que eu não preciso abordar completamente questões sutis discutidas detalhadamente nesse link.
precisa saber é o seguinte

Respostas:

9

Na verdade, é um pouco complicado. Quando você clica duas vezes, mouse-1há várias ações. <down-mouse-1>ocorre primeiro quando você pressiona o botão. Então mouse-1ocorre, quando você solta o botão.

<down-mouse-1>está vinculado ao comando mouse-drag-region, e esse comando chama mouse-drag-track. Essa função conta os cliques do botão do mouse e acompanha qualquer movimento do mouse (se você clicar duas vezes, significa que não moveu o mouse).

mouse-drag-trackchama a função mouse-start-end para determinar o intervalo de texto a ser selecionado. Ele passa para mouse-start-enda posição em que você clicou, os dois primeiros argumentos e a contagem de cliques, como o terceiro argumento. Isto é 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.

A contagem de cliques passada como o terceiro arg ( MODE) é 1 para um clique duplo.

Você não poderá chamar apenas parte desse código a partir de uma sequência de teclas do teclado, mas examinar o código poderá ajudá-lo a escrever um comando de ligação de teclas do teclado para fazer o que deseja.

Desenhou
fonte
Obrigado por explicar por C-h k que não funciona para eventos do mouse. A melhor maneira que descobri para investigar como o Emacs "está manipulando o mouse" é gravá-lo como uma macro de teclado, nomeá-lo e, em seguida, ver o código gerado pelo insert-kbd-macro Geralmente, eu não tentaria usar um evento de mouse em um macro, essas macros temporárias são úteis apenas para ver o que o Emacs está fazendo.
precisa saber é o seguinte
6

O @Drew explicou algumas das complexidades associadas aos eventos vinculados às ações do mouse. Quanto ao seu objetivo final de marcar a palavra no momento usando o teclado, você pode estar interessado na região de expansão .

expand-regionpermite manipular a região por unidades semânticas. Por exemplo, quando nenhuma região está ativa, a chamada er/expand-region(normalmente vinculada a C-=) marcará a palavra atual. A chamada novamente expande a região para a frase atual. E então o parágrafo, seção etc. As unidades reais dependerão do modo em que você está; portanto, nos modos lisp, eles seriam símbolo, expressão que encerra o símbolo, expressão que encerra essa expressão etc.

A página vinculada tem mais explicações e um vídeo demonstrando isso.

Tyler
fonte
1
sim, vejo o pacote de região de expansão na lista de pacotes da melpa. Muito útil, estou surpreso por não ser o padrão no Emacs ou, pelo menos, incluído no CEDET. Obrigado pela dica!
precisa saber é o seguinte
Grandeza de fichas: isso depende do (s) autor (es) que enviam seu pacote para a FSF com a devida atribuição de direitos autorais. Não pode ser uma parte padrão do Emacs se os autores não o tiverem enviado.
phils
2

Aqui está uma função que eu extraí mouse-set-regionque faz a marcação quando você clica duas vezes:

(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))))
abo-abo
fonte