[squeak-dev] The Inbox: Morphic-ct.1792.mcz

marcel.taeumel at hpi.de marcel.taeumel at hpi.de
Fri Dec 10 10:03:39 UTC 2021


Hi Christoph --

Chevrons (<>) are not a good idea for autoEnclose because of the regular #< and #> messages.

Not sure about quotes ("" '') because those are dead keys on some platforms and layouts ...

Best,
Marcel

On 2021-11-01T18:53:41+00:00, commits at source.squeak.org wrote:

> A new version of Morphic was added to project The Inbox:
> http://source.squeak.org/inbox/Morphic-ct.1792.mcz
> 
> ==================== Summary ====================
> 
> Name: Morphic-ct.1792
> Author: ct
> Time: 1 November 2021, 7:53:35.595429 pm
> UUID: d73224ba-841c-b647-a544-0d171ae13e69
> Ancestors: Morphic-eem.1784
> 
> Editors: Extends autoEnclose and blinkPrevParen: to also support quotes and chevrons, which is just consistent with encloseSelection imho.
> 
> =============== Diff against Morphic-eem.1784 ===============
> 
> Item was changed:
>   ----- Method: SmalltalkEditor>>blinkPrevParen: (in category 'parenblinking') -----
>   blinkPrevParen: aCharacter
>   	"Same as super, but tries to follow the Smalltalk syntax."
>   
>   	| openDelimiter closeDelimiter level string here inside |
>   	string := paragraph text string.
>   	here := pointBlock stringIndex.
>   	openDelimiter := aCharacter.
> + 	closeDelimiter := '([{<"''|' at: (')]}>"''|' indexOf: openDelimiter).
> - 	closeDelimiter := '([{' at: (')]}' indexOf: openDelimiter).
>   	level := 1.
>   	inside := nil. "Tricky."
>   	(here > 1 and: [ (string at: here - 1) = $$ ]) ifTrue: [ ^self ]. "Just a character literal."
>   	[ level > 0 and: [ here > 1 ] ] whileTrue: [
>   		| hereChar |
>   		hereChar := string at: (here := here - 1).
>   		inside "Are we inside a comment or string literal?"
>   			ifNotNil: [ "Yes."
>   				hereChar = inside ifTrue: [
>   					(here > 1 and: [ (string at: here - 1) ~= inside ])
>   						ifTrue: [ inside := nil ]
>   						ifFalse: [ here := here - 1 ] ] ]
>   			ifNil: [
>   				(here > 1 and: [ (string at: here - 1) = $$ ]) "Just a character literal."
>   					ifTrue: [ here := here - 1 ]
>   					ifFalse: [
>   						hereChar
>   							caseOf: {
>   								[ closeDelimiter ] -> [
>   									(level := level - 1) = 0 ifTrue: [
>   										^self blinkParenAt: here ] ].
>   								[ openDelimiter ] -> [  level := level + 1 ].
>   								[ $" ] -> [ inside := $" ].
>   								[ $' ] -> [ inside := $' ] }
>   							otherwise: [] ] ] ]!
> 
> Item was changed:
>   ----- Method: TextEditor class>>autoEnclose (in category 'preferences') -----
>   autoEnclose
> + 	<preference: 'Auto enclose brackets () {} [] '''' "" || <>'
> - 	<preference: 'Auto enclose brackets () {} []'
>   		categoryList: #('Morphic' 'editing')
>   		description: 'When true, typing an opening parenthesis, bracket or square-bracket will also add its corresponding closing character after the cursor so you can type within the bracket.'
>   		type: #Boolean>
>   		
>   	^ AutoEnclose ifNil: [ false ]!
> 
> Item was changed:
>   ----- Method: TextEditor>>autoEncloseFor: (in category 'typing support') -----
>   autoEncloseFor: typedChar 
>   	"Answer whether typeChar was handled by auto-enclosure.  Caller should call normalCharacter if not."
>   	| openers closers |
> + 	openers := '([{<"''|'.
> + 	closers := ')]}>"''|'.
> - 	openers := '([{'.
> - 	closers := ')]}'.
>   	(closers includes: typedChar) ifTrue:
>   		[ | pos |
>   		self blinkPrevParen: typedChar.
>   		((pos := self indexOfNextNonwhitespaceCharacter) notNil and: [ (paragraph string at: pos) = typedChar ])
>   			ifTrue:
>   				[ self
>   					moveCursor: [ : position | position + pos - pointBlock stringIndex + 1 ]
>   					forward: true
>   					select: false.
> + 				^ true ] ].
> - 				^ true ]
> - 			ifFalse: [ ^ false ] ].
>   	(openers includes: typedChar) ifTrue:
>   		[ self
>   			openTypeIn;
>   			addString: typedChar asString;
>   			addString: (closers at: (openers indexOf: typedChar)) asString;
>   			insertAndCloseTypeIn;
>   			
>   			moveCursor: [ : position | position - 1 ]
>   			forward: false
>   			select: false.
>   		^ true ].
>   	^ false!
> 
> Item was changed:
>   ----- Method: TextEditor>>blinkPrevParen: (in category 'parenblinking') -----
>   blinkPrevParen: aCharacter
>   	"Used if not Shout"
>   	| openDelimiter closeDelimiter level string here hereChar |
>   	string := paragraph string.
>   	here := pointBlock stringIndex.
>   	openDelimiter := aCharacter.
> + 	closeDelimiter := '([{<"''|' at: (')]}>''"|' indexOf: openDelimiter).
> - 	closeDelimiter := '([{' at: (')]}' indexOf: openDelimiter).
>   	level := 1.
>   	[level > 0 and: [here > 1]]
>   		whileTrue:
>   			[hereChar := string at: (here := here - 1).
>   			hereChar = closeDelimiter
>   				ifTrue:
>   					[level := level - 1.
>   					level = 0
>   						ifTrue: [^ self blinkParenAt: here]]
>   				ifFalse:
>   					[hereChar = openDelimiter
>   						ifTrue: [level := level + 1]]]!
> 
> 


More information about the Squeak-dev mailing list