Jump to content

SciTE - Internet search in the editor based by search engine or search site.


Recommended Posts

This lua script gives you the ability, to search for selected text or word from cursor in an search engine or on an search site of your choice.You can select the engine/site from a list, that you have defined in your user properties.

To get the right call for your search engine, open the engine and search for one word. You need the url without the searched word. Write to your properties an display name for this engine and, separated by a comma, the url. See my example in the script header.

For the list with  search sites, you need display name and site address (without http://).

It will searched for the full selected text or, if none selection exists, for the word touched by the cursor. You can allow in the properties, that also will recognized words with dots (like objVar.Property).

The script uses the shell.dll. But if you don't have installed it, the browser will opened with an command line call. Thats why the command window will pop up for a short moment.

You'll find details for installation and key bindings inside the script. Look for free command numbers in SciTE. By default installation, the numbers must be greater than 35 (max. 49).

-- TIME_STAMP   2018-09-02 09:22:03


	This script publicates two functions
	- InetSearch.Engine()
	  You can search for the selected/touched text in SciTE and can select a search engine of your choice.

	- InetSearch.Site()
	  You can search for the selected/touched text in SciTE with a defined search engine and can select a search site of your choice.

	Copy this script in your Lua scripts folder.
	Load this file in the Lua startup: dofile("Full\\Path\\InetSearch.lua")

	in "SciTEUser.properties" the following properties with search engines and search sites of your choice:

	#~ Inet Search Settings
	#~ List of engines. "display-name,search-url" (if not set: google.com will used)
	#~ If only one entry exists, the selection box will not shown.
	Inet.Search.Engines= \
	Google,https://www.google.de/search?q=| \
	MetaGer,https://metager.de/meta/meta.ger3?focus=web&eingabe=| \
	Bing,https://www.bing.com/search?q=| \
	Ask,https://de.ask.com/web?q=| \

	#~ Engine for site based search
	#~ Use display name from engines list (if not set: google.com will used)

	#~ List of sites for site based search. "display-name,site-url"
	#~ If not set, it searches without a special site.
	#~ If only one entry exists, the selection box will not shown.
	Inet.Search.SearchOnSite.Sites= \
	AutoIt DE,autoit.de| \
	AutoIt EN,autoitscript.com| \

	#~ By default, words will detected without dots. (0)
	#~ You can allow dots, to detect object variables with properties or methods too.

	#~ Search commands
	#~ Search word from cursor with engine selection
	command.name.9.*=Search with engine selection
	command.9.*=dostring InetSearch.Engine()

	#~ Search word from cursor with search site selection
	command.name.5.*=Search with site selection
	command.5.*=dostring InetSearch.Site()


InetSearch = {}
InetSearch.Handler = EventClass:new(Common)

	local engineFallback = "Google,https://www.google.com/search?q="  -- default search engine: "display-name,search-url"
	local search_type    = nil
	local engine_url     = nil
	local search_item    = nil
	local search_site    = nil
	local tableSelection = nil
	local list_type      = 16

	------------------------------------------------------------------------- Load library protected
	local require_protected = function(_lib)
		local loaded_lib
		if pcall(function() loaded_lib = require(_lib)  end) then return loaded_lib
		else return nil end
	end --> require_protected
	local shell = require_protected("shell")                    -- loads the shell library if exists

	------------------------------------------------------------------------------ Starts the search
	local RunSearch  = function(_item, _url, _site)
		local sSite = ''
		if _site ~= nil then sSite = "%20site:".._site end
		local sCmd = _url.._item..sSite
		if shell then shell.exec(sCmd)
		else os.execute('start "" "'..sCmd..'"') end
	end --> RunSearch

	----------------------------------------------------------------------------- Show the user list
	local ShowSelectionList = function()
		-- create the selection list (display names from engines or sites)
		local sep, list = '_', tableSelection[1][1]
		for i = 2, #tableSelection do
			list = list..sep..tableSelection[i][1]
		local sep_tmp = editor.AutoCSeparator
		editor.AutoCSeparator = string.byte(sep)
		editor:UserListShow(list_type, list)
		editor.AutoCSeparator = sep_tmp
	end --> ShowSelectionList

	--------------------------------------------------------------------------- Select the user list
	function InetSearch.Handler:OnUserListSelection(_tp, _sel)
		if _tp == list_type then
			local url
			for i = 1, #tableSelection do
				if tableSelection[i][1] == _sel then
					url = tableSelection[i][2]
			if search_type == 'site' then
				search_site = url
				search_site = nil
				engine_url = url
			RunSearch(search_item, engine_url, search_site)

	--------------------------------------------------------- List of search engines from properties
	local GetEngines = function()
		local sEngines = props['Inet.Search.Engines']
		-- without settings, the default search engine will used
		if sEngines == '' then sEngines = engineFallback end
		local tEngines = {}
		for entry in sEngines:gmatch('([^|]+)|-') do
			for name, url in entry:gmatch('([^,]+),(.+)') do
				table.insert(tEngines, {name, url})
		return tEngines
	end --> GetEngines

	----------------------------------------------------------- List of search sites from properties
	local GetSearchSites = function()
		local sSites = props['Inet.Search.SearchOnSite.Sites']
		if sSites == '' then return nil end
		local tSites = {}
		for entry in sSites:gmatch('([^|]+)|-') do
			for name, url in entry:gmatch('([^,]+),(.+)') do
				table.insert(tSites, {name, url})
		return tSites
	end --> GetSearchSites

	-------------------------------------------------------------------------------- Get search item
	local GetSearchItem = function()
		local sSelect = editor:GetSelText()
		if sSelect ~= '' then return sSelect end

		local allowDots = false
		if props['Inet.Search.Allow.Punctuation'] == '1' then allowDots = true end

		local caret = editor.CurrentPos
		local iLine = editor:LineFromPosition(caret)
		local iZero = editor:PositionFromLine(iLine)
		local iLineEnd = editor.CurrentPos
		editor.CurrentPos = caret

		local iStart = editor:WordStartPosition(caret)
		if allowDots then
			while iStart > iZero and editor:textrange(iStart -1, iStart) == '.' do
				iStart = editor:WordStartPosition(iStart -1)
		local iEnd = editor:WordEndPosition(caret)
		if allowDots then
			while iEnd < iLineEnd and editor:textrange(iEnd, iEnd +1) == '.' do
				iEnd = editor:WordEndPosition(iEnd +1)
		sSelect = editor:textrange(iStart, iEnd):gsub('^([^%w]+)', ''):gsub('([^%w]+)$', '')

		return sSelect
	end --> GetSearchItem

	------------------------------------------------------------------- Search with engine selection
	local SearchEngineBased = function()
		search_type = 'engine'
		search_item = GetSearchItem()
		if search_item == '' then return nil end
		tableSelection = GetEngines()
		-- only one entry: selection box will not shown
		if #tableSelection == 1 then
			RunSearch(search_item, tableSelection[1][2], nil)

	end --> SearchEngineBased

	-------------------------------------------------------------- Search with search site selection
	local SearchSiteBased = function()
		search_type = 'site'
		search_item = GetSearchItem()
		if search_item == '' then return nil end
		-- get the default engine for site based searching
		for _, url in engineFallback:gmatch('([^,]+),(.+)') do
			engine_url = url
		-- if is set, use search engine from properties
		local sEngine = props['Inet.Search.SearchOnSite.Engine']
		if sEngine ~= '' then
			local tEngines = GetEngines()
			for i = 1, #tEngines do
				if tEngines[i][1] == sEngine then
					engine_url = tEngines[i][2]
		tableSelection = GetSearchSites()
		-- if none entries for search sites, use simple search
		if tableSelection == nil then
			RunSearch(search_item, engine_url, nil)
			-- only one entry: selection box will not shown
			if #tableSelection == 1 then
				RunSearch(search_item, engine_url, tableSelection[1][2])
	end --> SearchSiteBased

	---------------------------------------------------------------------------- Publicate functions
	InetSearch.Engine = SearchEngineBased
	InetSearch.Site = SearchSiteBased



Edited by BugFix

Best Regards BugFix  

Link to comment
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

  • Create New...