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

commits at source.squeak.org commits at source.squeak.org
Mon Nov 1 18:53:41 UTC 2021


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