[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
|