Jump to content
BugFix

SciTE - Toggle Block Comments

Recommended Posts

The block comment (internal: box comment) in SciTE cannot be toggled.
I have now created a script that helps. It works with any file type for which the corresponding entries in the properties are created.For toggeling its required to detect, what the user want to do.

Rules for detection:
    - selection starts in an empty line (line break only)
        following line begins with comment.box.start ==> action: uncomment
        otherwise                                    ==> action: comment

    - selection starts in line with text
        line begins with comment.box.start           ==> action: uncomment
        otherwise                                    ==> action: comment

    - selection ends in an empty line AND
      the line before begins with comment.box.end    ==> action: both lines are part of comment block, will deleted

    - selection ends in line with comment.box.end    ==> action: line will deleted

    - At least two lines must be selected, otherwise an error message is output to the console.

This means that in nested block comments there is at least one more line between two comment.box.start markers.

It is recommended to write all block comment settings into "SciTEUser.properties". The setting "comment.box.end.au3" from "SciTEGlobal.properties" is incorrect and must be corrected.

comment.box.start.au3=#cs
#~ If TAB should used as box.middle, define an alternation (e.g. "@Tab"), 
#~ "\t" will not recognised as tab if passed as propertie.
comment.box.tab.alternation=
#~ If you want characters or tab in each line of comment block, define it here.
#~ To use TAB, set the alternation variable here: $(comment.box.tab.alternation)
comment.box.middle.au3=
comment.box.end.au3=#ce

Connection to SciTE
Search a free command number. Use a Hotkey of your choice.
If you have declared an option for user lua scripts (e.g.: "Lua.User.Scripts.Path=C:\code\lua"), copy the script to this folder.
Otherwise copy it to a folder of your choice and change the path in the command: "dofile". But backslashes in the path must be masked. ("\\").
If your path has spaces don't forgot to encapsulate in string delimiters.

# 24 Toggle Block Comment
command.name.24.*=Toggle Block Comment
command.24.*=dofile $(Lua.User.Scripts.Path)/BlockComment.lua
command.mode.24.*=subsystem:lua,savebefore:no
command.shortcut.24.*=Ctrl+Alt+F10

 

Here the lua script:

-- TIME_STAMP   2020-10-04 18:56:11   v 0.5

--[[  Toggle Block Comments   ©BugFix ( autoit[at]bug-fix.info )

	For toggeling its required to detect, what the user want to do.

	Rules for detection:
		- selection starts in an empty line (line break only)
			following line begins with comment.box.start ==> action: uncomment
			otherwise                                    ==> action: comment

		- selection starts in line with text
			line begins with comment.box.start           ==> action: uncomment
			otherwise                                    ==> action: comment

		- selection ends in an empty line AND
		  the line before begins with comment.box.end    ==> action: both lines are part of comment block, will deleted

		- selection ends in line with comment.box.end    ==> action: line will deleted

		- At least two lines must be selected, otherwise an error message is output to the console.

	Properties:
		It is recommended to write all block comment settings into SciTEUser.properties.
		The setting "comment.box.end.au3" from "SciTEGlobal.properties" is incorrect and must be corrected.

		comment.box.start.au3=#cs
		#~ If TAB should used as box.middle, define an alternation (e.g. "@Tab"),
		#~ "\t" will not recognised as tab if passed as propertie.
		comment.box.tab.alternation=
		#~ If you want characters or tab in each line of comment block, define it here.
		#~ To use TAB, set the alternation variable here: $(comment.box.tab.alternation)
		comment.box.middle.au3=
		comment.box.end.au3=#ce
]]

local BlockComment = {
	-- variables
	ext,        -- file extension
	boxStart,   -- property: comment.box.start
	boxMiddle,  -- property: comment.box.middle
	boxEnd,     -- property: comment.box.end
	bMiddle,    -- bool: boxMiddle is defined
	selStart,   -- selection start position
	selEnd,     -- selection end position
	lineStart,  -- selection start line number
	lineEnd,    -- selection end line number
	newText,	-- the text that replaces the selection

	Init = function(self)
		self.ext       = props["FileExt"]
		self.boxStart  = props["comment.box.start."..self.ext]
		self.boxMiddle = props["comment.box.middle."..self.ext]
		local tabAlternation = props["comment.box.tab.alternation"]
		if tabAlternation ~= "" and self.boxMiddle == tabAlternation then self.boxMiddle = "\t" end
		self.boxEnd    = props["comment.box.end."..self.ext]
		self.bMiddle   = not (self.boxMiddle == "")
		self.selStart  = editor.SelectionStart
		self.selEnd    = editor.SelectionEnd
		self.lineStart = editor:LineFromPosition(self.selStart)
		self.lineEnd   = editor:LineFromPosition(self.selEnd)
		self.newText   = ""
	end,

	-- create the line w/wo middle markers
	NewLine = function(self, _num, _uncmt)
		local line = editor:GetLine(_num)
		if _uncmt then
			-- if second last line has box.end AND last line is empty OR
			if (_num == self.lineEnd -1 and self:LineIsEnd(_num) and self:LineIsEmpty(_num +1)) or
			-- if is the last line AND its empty  --> stop proceeding
			(_num == self.lineEnd and self:LineIsEmpty(_num)) then
				return ""
			else
				-- if box.middle exists --> remove it
				if self.bMiddle then line = line:sub(self.boxMiddle:len()+1) end
			end
		else
			-- add box.middle if exists
			line = self.boxMiddle..line
		end
		return line
	end,

	-- checks if line is empty (has only a line break)
	LineIsEmpty = function(self, _lineNum)
		return (editor:GetLine(_lineNum) == "\r\n")
	end,

	-- checks if line has box.start
	LineIsStart = function(self, _lineNum)
		local line = editor:GetLine(_lineNum)
		return ( line:sub(1, self.boxStart:len()):lower() == self.boxStart:lower() )
	end,

	-- checks if line has box.end
	LineIsEnd = function(self, _lineNum)
		local line = editor:GetLine(_lineNum)
		return ( line:sub(1, self.boxEnd:len()):lower() == self.boxEnd:lower() )
	end,

	-- returns "false" if none error
	ErrorCheck = function(self)
		if self.selStart == self.selEnd then
			print("! NONE SELECTION.") return true
		elseif self.boxStart == "" or self.boxEnd == "" then
			print("! ERROR - The comment.box properties for *."..self.ext.." files are missing or incomplete.")
			return true
		elseif self.lineStart == self.lineEnd then
			print("! SINGLE LINE SELECTION. USE LINE COMMENT INSTEAD.") return true
		else
			return false
		end
	end,

	-- creates the text to toggle and replace the selection with it
	Toggle = function(self)
		self:Init()

		if self:ErrorCheck() then return end
		local uncomment = false
		local skip = 0

		-- proceed with first line
		-- if start position is in empty line AND next line has box.start --> uncomment the block
		if self:LineIsEmpty(self.lineStart) and self:LineIsStart(self.lineStart +1) then
			uncomment = true
			skip = 1   -- the following line will ignored now
		-- if line from start position has box.start --> uncomment the block
		elseif self:LineIsStart(self.lineStart) then
			uncomment = true
		-- in other cases comment the block
		else
			-- insert box.start before the first line; if box.middle exists --> insert it too
			self.newText = self.boxStart.."\n"..self.boxMiddle..editor:GetLine(self.lineStart)
		end

		-- proceed with middle lines
		-- if box.middle is defined set/replace it in line
		local n = self.lineStart + 1 + skip
		local line
		while n < self.lineEnd do
			self.newText = self.newText..self:NewLine(n, uncomment)
			n = n + 1
		end

		-- proceed with last line
		line = editor:GetLine(self.lineEnd)

		if not uncomment then
			self.newText = self.newText..self.boxMiddle..line..self.boxEnd
		else -- if uncomment the last line will ignored, but the trailing "\r\n" must deleted
			self.newText = self.newText:sub(1, -3)
		end

		-- replace the selection with the new toggled text
		editor:ReplaceSel(self.newText)
	end
}

BlockComment:Toggle()

As far as I know, it is not possible to overwrite SciTE internal hotkeys. In this case "Ctrl+Shift+B" for IDM_BLOCK_COMMENT. Therefore I used the connection shown here.
But if overwriting is possible, I would be interested in this solution.

BlockComment.lua


Best Regards BugFix  

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Bhooshan
      I need to mute an ongoing call on Microsoft teams without activating the window. Teams allows us to mute using shortcut key Ctrl+Shift+m but only when the window is active.
      # Used set option as ongoing call can be with any person which leads to change in Title Name.
      AutoItSetOption ( "WinTitleMatchMode", 2 ) 
      # I am not clear with the control ID which will be good to use here and also the key combination of ^M       
      ControlSend ( "Microsoft Teams", "", "[CLASS:Intermediate D3D Window; INSTANCE:1]", "{ctrl down}")
       
      Can anyone help...!!! 
       

    • By Sayed
      Hi there, 
      I'm new in AutoIt forms and using AutoIt to automate desktop application (able to automate the application normally but facing issue when I've to re-run the application twice within the same script...so need help in this please)
      here is the steps then followed by the issue in a brief : 
      1- run application . 
      2- do some actions (click menus,activate windows,set texts..)
      3- close the application. 
      4- run the application again & access the same controls.
      5- open the same windows again (like step 2)
      6- perform some validations (by getting texts from some text boxes)
      7- close the application again (and repeat 1-7 for 15 times in average )
      The issue 
      * all controls are accessible in the first run and actions done successfully on controls (for steps 1-3) BUT from the second run of the application from step-4 it's able to set focus only the main application window.
      Note: only unique properties used to while mapping the controls. 
      Error that appear in the console :
      UIAWrappers.au3" (1673) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: $x = Int($t[1] + ($t[3] / 2)) $x = Int($t[1] + (^ ERROR  
      Simple spy code  of one of the controls that has this strange issue(menubar&view menu Item): 
      ;~ *** Standard code maintainable *** #include "UIAWrappers.au3" AutoItSetOption("MustDeclareVars", 1) _UIA_setVar("oP1","Title:=XXX;controltype:=UIA_WindowControlTypeId;class:=WindowsForms10.Window.8.app") ;main app form xxx _UIA_setVar("oP2","Title:=menuStrip1;controltype:=UIA_MenuBarControlTypeId;class:=WindowsForms10.Window.8.app") ;menuStrip1 ;~ $oUIElement=_UIA_getObjectByFindAll("View.mainwindow", "title:=View;ControlType:=UIA_MenuItemControlTypeId", $treescope_subtree) _UIA_setVar("oUIElement","Title:=View;controltype:=UIA_MenuItemControlTypeId;class:=") ;ControlType:=UIA_MenuItemControlTypeId;classname:=") ;~ Actions split away from logical/technical definition above can come from configfiles ;~_UIA_Action("oP1","highlight") _UIA_Action("oP1","setfocus") ;~_UIA_Action("oP2","highlight") _UIA_Action("oP2","setfocus") _UIA_action("oUIElement","highlight") ;~_UIA_action("oUIElement","click")  
       
    • By Fenzik
      Hello All!
      i suggest to set default encoding in Scite4 for Autoit 3 to UTF 8 with Bom encoding, format recommended also in Autoit Help.
      In last editor version, when i open new script, for example Czech characters (č, ř, ž) aren't correct.
      So when i change Encoding to UTF 8 with Bom from Default Code page property state, everithing seems to be OK.
      Thank you and sorry for potentialy duplicated content.
      Fenzik
    • By jitb
      I have an eof problem in SciTE. I keep gitting this knitsu at the end of the open sesion.
      Please see below. The file should end at line 1220 but has invisable lines. What am I doing wrong?
    • By AutoitMike
      Scite 3.4.4
      Win 10
      I click "Help" or press F1, there is no response
      If I use the file explorer and double click Autoit.chm or Autoit3.chm help opens.
      There is no dialog to check or uncheck "Always ask before opening this file" when clicking on these files.
       
      If you are curious as to why I dont have the latest version, I am creating a back up laptop that has a VERY extensive automation application that I have written over the past 15 years.
       
      An extremely potent, powerful, needed function has been deleted in the upgrade of Autoit in recent years that I can not do without. If my main laptop dies, which it almost did, I am in a very bad position. So I bought the exact same laptop and I am "cofiguring" it to work exactly the same as my main laptop. However, this one has been "Upgraded" to Win 10 which I hope is not the problem. 
      Thanks for any help
×
×
  • Create New...