Função para buscar uma sequencia de caracteres e posicionar a digitação após

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

gumapira
Posts: 1
Joined: 08 Dec 2020, 13:25

Função para buscar uma sequencia de caracteres e posicionar a digitação após

Post by gumapira » 08 Dec 2020, 13:36

Olá, boa tarde,
Sou novo nessa comunidade, e gostaria de criar uma função que ao clicar um conjunto de teclas, por exemplo "Ctrl+Q" buscasse uma sequência de caracteres, no caso a sequência seria ": " (dois pontos+espaço), e gostaria que a digitação fosse posicionado logo após essa sequência.
Alguém poderia me ajudar a como começar?

Desde já agradeço pela atenção
User avatar
Gio
Posts: 1116
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Função para buscar uma sequencia de caracteres e posicionar a digitação após

Post by Gio » 14 Dec 2020, 11:51

Bom dia Gumapira.

Você pode fazer isso usando enviando alguns sinais de atalhos de teclado, o clipboard e depois enviando uma quantidade calculada de comandos de teclas de seta (esquerda, direita, etc).

OBS: O código abaixo faz uso do clipboard (copiar e colar). Portanto, se você tiver algo importante copiado no ctrl+c, saiba que vai perder a cópia quando rodar a rotina.

Code: Select all

SetKeyDelay, -1 ; Começamos definindo que o comando Send não tenha qualquer espera entre os envios de sinais de tecla.
^q::
ClipBoard := "" ; Primeiro, esvaziamos o clipboard.
Send {ctrl down}ac{ctrl up}{right} ; Depois, utilizamos o atalho ctrl+A para selecionar todo o texto e depois ctrl+c para copiar todo o texto, e por fim enviamos um sinal de tecla de seta direita para garantir que o caret seja posicionado NO FINAL do texto.
ClipWait, 2 ; Então esperamos até 2 segundos para que o clipboard receba os dados da cópia do texto.
TEXTO_COPIADO := Clipboard ; E depois colocamos o texto copiado em uma variável do script para poder trabalhar em cima dele.
Clipboard := "" ; E então apagamos o clipboard.
POSICAO_DESEJADA := InStr(TEXTO_COPIADO, ": ") ; Iniciamos encontrando a posição da sequência ": " usando um chamado à função embutida InStr()
TEXTO_POSTERIOR := SubStr(TEXTO_COPIADO, POSICAO_DESEJADA) ; Agora, isolamos e copiamos todo o texto que estiver APÓS essa posição.
StringSplit, CRLF_, TEXTO_POSTERIOR, `n ; Daí, descobrimos quantas linhas temos após essa posição, pois isso influenciará a quantidade de sinais de tecla de seta à esquerda que teremos que enviar.

MOVIMENTOS := StrLen(TEXTO_COPIADO) - POSICAO_DESEJADA - CRLF_0 ; Então calculamos a quantidade de movimentos de seta à esquerda necessária para posicionar o caret naquela posição. O cálculo envolve o total de caracteres do texto inteiro, menos a posição da expressão ": " e menos o total de linhas após a posição da expressão ": ". 

If (POSICAO_DESEJADA > 0) ; Então se a posição desejada tiver sido encontrada (o que saberemos através da variável conter uma posição diferente de 0).
{
	Send {left %MOVIMENTOS%} ; Enviamos a quantidade calculada de sinais de tecla de seta esquerda para chegar na posição desejada.
}
Return

Não posso garantir que o código acima vá funcionar em todo e qualquer editor de texto ou campo de edição de texto, mas pelos meus testes, deve funcionar na maioria. O código também está sempre supondo que você o acionou em um campo de edição de texto, portanto, não o acione se não estiver em um lugar desses. Outra coisa importante: no código acima a preferência será sempre do PRIMEIRO resultado encontrado (ou seja, o que estiver mais acima no texto). Você pode mudar isso se quiser alterando o código (este aqui é só um exemplo).
Post Reply

Return to “Ajuda e Suporte Geral”