Vous allez me répondre que je suis une banane car ça existe déja en natif !
Oui, effectivement ça existe déja. En pressant la touche TAB deux fois de suite j'ai bien la fin du mot clé sur la même ligne que le mot clé. j'avais envie d'une présentation plus conventionnelle.
Ce qui suit est un complément du tutoriel que j'ai fais sur ce lien.
L'objectif de cet outil est de placer le fin du mot clé en dessous du mot clé en respectant la même indentation.
■ Quel est le principe de l'outil ?
- Un utilisateur tape un mot clé. Par exemple "If" et presse la combinaison de touche ALT + ESPACE
- L'outil va automatiquement insérer une ligne sous la ligne contenant "If" et placer "EndIf" sous cette ligne vide en respectant l'indentation du mot "If"
■ Schéma de l'application.
- Détection de la combinaison de touche associé à l'outil.
- Vérifier que le mot situé juste à gauche du curseur est bien un mot clé.
- Si mot clé :
. Sauvegarder le contexte clipboard
. Bufferiser la ligne contenant l'indentation + la fin du mot clé.
. Copier ce buffer dans le clipboard
. Insérer la fin du mot clé.
. Restorer le contexte clipboard
■ Le code.
Code : Tout sélectionner
;-=============================================================================
;
; Project ...... : Editor Helper
; Name ......... : EditorHelper.pb
; Type ......... : Main Code
; Author ....... : falsam
; CreateDate ... : 03, October 2017
; Compiler ..... : PureBasic V5.60 (x86)
; Flags ........ : None
; Subsystem .... : none
; TargetOS ..... : Windows
; License ...... :
; Link ......... :
; Description .. : IDE TOOLS - Automatically generates the end keyword of a keyword.
;
;==============================================================================
;
; IDE Installation
;
; Menu Tools -> Configure Tools - > New
;
; CommandeLine : Select the executable of your tool
; Name : Editor Helper (or whatever you want)
; Shortcut : ALT + ESPACE (or whatever you want)
;
;==============================================================================
EnableExplicit
Define.s LigCol, ClipBoardBuffer, Buffer, KeyWord
Define.i HandleIDESci, Offset, CursorPosition, n, Tabulation, Result
;Structure du contexte clipboard pour sauvegarde et restoration
;Clipboard context Structure For backup And restoration
Structure NewClipBoard
Texte.s
Image.l
EndStructure
Define.NewClipBoard Clipboard
;Structure mots clés / Keyword structure
Structure NewKeyWord
EndWord.s
EndStructure
Define NewMap KeyWords.NewKeyWord()
;Initialisation de mots clés / Initialization of keywords
AddMapElement(KeyWords(), "enumeration")
KeyWords()\EndWord = "EndEnumeration"
AddMapElement(KeyWords(), "structure")
KeyWords()\EndWord = "EndStructure"
AddMapElement(KeyWords(), "procedure")
KeyWords()\EndWord = "EndProcedure"
AddMapElement(KeyWords(), "if")
KeyWords()\EndWord = "EndIf"
AddMapElement(KeyWords(), "for")
KeyWords()\EndWord = "Next"
AddMapElement(KeyWords(), "foreach")
KeyWords()\EndWord = "Next"
AddMapElement(KeyWords(), "select")
KeyWords()\EndWord = "EndSelect"
AddMapElement(KeyWords(), "while")
KeyWords()\EndWord = "Wend"
AddMapElement(KeyWords(), "interface")
KeyWords()\EndWord = "EndInterface"
AddMapElement(KeyWords(), "repeat")
KeyWords()\EndWord = "Until"
AddMapElement(KeyWords(), "datasection")
KeyWords()\EndWord = "EndDataSection"
;Handle de l'IDE / Handle of IDE
HandleIDESci=Val(GetEnvironmentVariable("PB_TOOL_Scintilla"))
If HandleIDESci
;Position du curseur dans le source en cours d'édition / Cursor position in the source being edited
SendMessageTimeout_(HandleIDESci,#SCI_GETSELECTIONSTART, 0, 0, #SMTO_ABORTIFHUNG, 2000, @CursorPosition)
;Mémorise la position du curseur pour l'indentation (Nombre d'espaces avant le mot clé)
;Stores the cursor position For indentation (Number of spaces before the keyword)
LigCol = GetEnvironmentVariable("PB_TOOL_Cursor") ;Lig x Col
;Recherche du mot se trouvant juste devant le cursor / Search for the word just in front of the cursor
Offset = CursorPosition
For n = 1 To CursorPosition
Offset - 1
SendMessageTimeout_(HandleIDESci,#SCI_GETCHARAT, Offset, 0, #SMTO_ABORTIFHUNG, 2000, @Result)
If (Result >= 65 And Result < 90) Or (Result >= 97 And Result <= 122)
Buffer + Chr(Result)
Else
Break
EndIf
Next
;Calculer l'indentation / Calculate the indentation
Tabulation = Val(StringField(LigCol, 2, "x")) - Len(Buffer) - 1
;Quel est le mot se trouvant à gauche du curseur ? / What is the word to the left of the cursor?
KeyWord = LCase(ReverseString(Buffer))
;Si le mot clé existe : Mise à jour de l'IDE / If the keyword exists: IDE update
If FindMapElement(KeyWords(), KeyWord)
;Mémoriser le contexte clipboard / Memorize the clipboard context
Clipboard\Texte = GetClipboardText()
Clipboard\Image = GetClipboardImage(#PB_Any)
;Mettre à jour l'IDE / Update the IDE
SetClipboardText(Chr(32) + #CRLF$ + #CRLF$ + LSet(Chr(32), Tabulation) + KeyWords()\EndWord)
SendMessage_(HandleIDESci, #WM_PASTE, 0, 0)
;Restoration du context clipboard / Restoration of the clipboard context
SetClipboardText(Clipboard\Texte)
SetClipboardImage(Clipboard\Image)
;Retour à la position de départ
SendMessageTimeout_(HandleIDESci, #SCI_GOTOPOS, CursorPosition +1, 0, #SMTO_ABORTIFHUNG, 2000, #Null)
EndIf
Else
MessageRequester("Information", "This application must be run from the PureBasic IDE.")
EndIf
■ Installation.
Menu Outils -> Outils personnalisés - > Nouveau
Ligne de commande : Sélectionnez l'exécutable de votre outil
Nom : Editor Helper (Ou ce que vous voulez)
Touches de raccourci : ALT + ESPACE (Ou ce que vous voulez)
Ne pas utiliser la fonction native ScintillaSendMessage()
Bons tests.