"Handy Tasks 1" by rfavero

Rating: 10.0 (1 votes)

Report this Script

Name: Handy Tasks 1
Uploaded By: rfavero
Date Created: Aug. 11, 2010 5:34 p.m.
Date Modified: Aug. 16, 2010 10:07 a.m.
Description: 1) Jump to Matching Brace | 2) Select to Matching Brace | 3) Count Words in Selection | 4) Filename to Clipboard ** Please vote and leave a comment so others know if they should take the time to bother with this script.
Num Views: 921
Num Downloads: 310

Contents

Download this script

###############################################################################
# This is a list of a few handy tasks:
#
#	- Jump to Matching Brace
#		This script will move the cursor to a matching brace. This can be very useful if
#       a matching brace is not showing on the screen.
#
#	- Select to Matching Brace
#		This script will move the cursor to a matching brace and select the text between
#       the two braces. This can be very useful if you want to copy the text between two
#		braces to another document so you can examine the text in isolation -- maybe for
#		searching, for example.
#
#	- Count Words in Selection
#		Count the words in a selecation. This is useful if you want to see how many
#		words there are in a selected area of a document. A word is a sequence of
#		non-whitespace characters.
#
#	- Filename to Clipboard
#		Copies the filename of a document to the clipboard. Clones the functionality
#		available when you right-click on a tab.
#
#	I make these scripts available in the public domain. There are no restrictions on
#	their use, and no attribution is necessary. No warranty is made. Use at your own risk.
#
# Author: Rob Favero
#
###############################################################################

import pn
import scintilla
from pypn.decorators import script

#
# Jump to a matching brace and optionally highlight the text between the
# two matching braces.
#
def GotoToMB(doSelect):
	doc = pn.CurrentDoc()
	if doc is None:
		return
	editor = scintilla.Scintilla(doc)
	curPos = editor.CurrentPos
	#
	# I need to do something a little funny here. The highlighting of braces occurs if
	# the cursor is located to either the left of a brace or to the right of
	# a brace. However, the BraceMatch function in Scintilla only returns a matching
	# location if the cursor is positioned on the left side of a brace. The following
	# lines will move the cursor, even if it is positioned to the right of a brace.
	# Also, I need to account for the case where two braces, either both open braces
	# or both closed braces, are adjacent and the cursor is positioned between them.
	# In this situation, the brace to the left of the cursor is the one that gets
	# highlighted, so the jump needs to be based on the highlighted one.
	#
	# To achieve the desired behavior, first see if we can match a brace on the character
	# to the left of the cursor. If that does not result in a match, try a match on the
	# character to the right of the cursor.
	if (curPos > 0):
		matchPos = editor.BraceMatch(curPos - 1)
		if (matchPos > -1):
			if (doSelect):
				editor.SetSel(curPos, matchPos + 1)
			else:
				editor.SetSel(matchPos + 1, matchPos + 1)
			return
	matchPos = editor.BraceMatch(curPos)
	if (matchPos > -1):
		if (doSelect):
			editor.SetSel(curPos, matchPos + 1)
		else:
			editor.SetSel(matchPos + 1, matchPos + 1)
		return
	return

#
# Move the cursor to a matching brace.
#
@script("Jump to Matching Brace", "Handy Tasks")
def JumpToMB():
	GotoToMB(False)
	return

#
# Move the cursor to a matching brace and select the text in between.
#
@script("Select to Matching Brace", "Handy Tasks")
def SelectToMB():
	GotoToMB(True)
	return

#
# Count the number of words (whitespace separated characters) in a selection (or
# entire document if there is no selection).
#
@script("Count Words", "Handy Tasks")
def CountWordsInSel():
	doc = pn.CurrentDoc()
	if doc is None:
		return
	editor = scintilla.Scintilla(doc)
	start = editor.SelectionStart
	end = editor.SelectionEnd
	if (start == end):
		start = 0
		end = editor.Length
	text = editor.GetTextRange(start, end)
	newDoc = pn.NewDocument(None)
	newEditor = scintilla.Scintilla(newDoc)
	words = len(text.split())
	output = str(words) + " words"
	newEditor.AppendText(len(output), output)
	newEditor.SetSavePoint()
	return

#
# Copy the filename of the document to the clipboard.
#
@script("Filename to Clipboard", "Handy Tasks")
def GetFileName():
	doc = pn.CurrentDoc()
	if doc is None:
		return
	editor = scintilla.Scintilla(doc)
	output = str(doc.FileName)
	editor.CopyText(len(output), output)
	return

Comments:

Please vote and leave a comment so others know if they should take the time to consider using this script.

Posted by rfavero on Aug. 16, 2010 at 10:06 a.m.