CodeEditApp / CodeEditSourceEditor

A code editor view written in Swift powered by tree-sitter.
https://codeeditapp.github.io/CodeEditSourceEditor/documentation/codeeditsourceeditor
MIT License
517 stars 84 forks source link

🐞 Line number font is incorrect #58

Closed austincondiff closed 1 year ago

austincondiff commented 2 years ago

The line number font does not align with Xcode.

image

Left: Xcode | Right: CodeEdit

The font needs to be sans-serif, narrower, with the color less prominent.

lukepistrol commented 2 years ago

Just want to leave this here. Did some research a while back and this might help:

private var lineGutterFont: NSFont {
    let fontSize: Double = 10

    // TODO: calculate the font size depending on the editors font size.
    let font = NSFont.monospacedSystemFont(ofSize: fontSize, weight: .medium)

    let alt0NoSlash: [NSFontDescriptor.FeatureKey: Int] = [
        .selectorIdentifier: 6,
        .typeIdentifier: kStylisticAlternativesType,
    ]

    let alt1NoSerif: [NSFontDescriptor.FeatureKey: Int] = [
        .selectorIdentifier: 8,
        .typeIdentifier: kStylisticAlternativesType,
    ]

    let descriptor = font.fontDescriptor.addingAttributes([.featureSettings: [alt0NoSlash, alt1NoSerif]])

    return NSFont(descriptor: descriptor, size: 0) ?? font
}
austincondiff commented 2 years ago

That gets me the alternate characters like the open 4 however I still need to be able to reduce the width and tracking. Any idea how I might do that?

lukepistrol commented 2 years ago

That gets me the alternate characters like the open 4 however I still need to be able to reduce the width and tracking. Any idea how I might do that?

Maybe something here

ben-p-commits commented 1 year ago

@austincondiff, @lukepistrol - I believe the font you're looking for is actually sneakily bundled into Xcode.

take a look in: /Applications/Xcode.app/Contents/SharedFrameworks/DVTUserInterfaceKit.framework/Versions/A/Resources/Fonts

and say hello to this little guy: XcodeDigits-regular.ttf

image

I would guess that it's proprietary.

austincondiff commented 1 year ago

I am aware of Xcode Digits after digging through the app contents. I have thought about sneaking it in, but probably not as I think you are right in that it might be proprietary (not clear if it is or isn't). I think we can get a look like this with the SF variable font (not sure if we can use it now or if we need to wait).

ben-p-commits commented 1 year ago

Looks like variable fonts are only available in OS 13+...

https://developer.apple.com/documentation/appkit/nsfont/width?changes=latest_3_5_2

austincondiff commented 1 year ago

We will be using ExtensionKit and the new form style in Settings. The though it once we are out of beta, 13 will be standard by that point. So I'd say let's try to achieve the same look with variable fonts!

austincondiff commented 1 year ago

@ben-p-commits we will be increasing our minimum target to macOS 13 if you wanted to take a stab at doing this via variable fonts.

ben-p-commits commented 1 year ago

I just updated to ventura- happy to dive back in!

On Thu, Feb 16, 2023 at 6:30 PM Austin Condiff @.***> wrote:

@ben-p-commits https://github.com/ben-p-commits we will be increasing our minimum target to macOS 13 if you wanted to take a stab at doing this via variable fonts.

— Reply to this email directly, view it on GitHub https://github.com/CodeEditApp/CodeEditTextView/issues/58#issuecomment-1433879964, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABGVDZJTIPDW7RS4TQ5BD43WX22BTANCNFSM6AAAAAAQMVPYSY . You are receiving this because you were mentioned.Message ID: @.***>

austincondiff commented 1 year ago

@ben-p-commits Perfect, I am assigning this to you.

austincondiff commented 1 year ago

@Eliulm would you like to try to include this in your PR (#163) or should we tackle this later?

If so let me know. You might look at variable fonts as mentioned.

Eliulm commented 1 year ago

@austincondiff Yeah, I will see what I can do.

austincondiff commented 1 year ago

@Eliulm it looks like #163 was merged. Feel free to open a separate PR.

Eliulm commented 1 year ago

So I looked into it and found that apple only ships the SF Pro font as a variable font. This means that it is the only font where I can adjust the glyph width, as far as I know. However, the problem with that font is, that It does not have the open four:

image

The SF Mono font has the open four, but the problem there is, as you pointed out before, that the glyphs are a bit wider than the Xcode digits font:

Screenshot 2023-03-18 at 13 58 49 Screenshot 2023-03-18 at 14 01 25

As of now, I do not know, how I could change that :/

austincondiff commented 1 year ago

The open 4 is an alternate character.

https://user-images.githubusercontent.com/806104/226121452-2343071c-6d4d-404a-98e4-503d90433699.mov

I forget how, but there is a way to do this in Swift.

Eliulm commented 1 year ago

I have found the stylistic set, that uses the open four. However, it also uses zero with a slash. I have tried all other stylistic sets, but none have the zero with a slash and the open four at the same time. This is how it currently looks like now: (Xcode left, CE right)

ruler_comparison

I also made the ruler font size dependent on the text font size:

var rulerFont: NSFont {
        let fontSize: Double = (font.pointSize - 1) + 0.7 // 11.7 @ 12font and 1,7 lineheight
        let fontAdvance: Double = font.pointSize * 0.49 + 0.6
        let fontWeight = NSFont.Weight(rawValue: 0.0005)
        let fontWidth = NSFont.Width(rawValue: -0.13)

        let font = NSFont.systemFont(ofSize: fontSize, weight: fontWeight, width: fontWidth)

        /// Set the 4 to open four and alter the shape of 6 and 9
        let alt469: [NSFontDescriptor.FeatureKey: Int] = [
            .selectorIdentifier: 12,
            .typeIdentifier: kStylisticAlternativesType
        ]

        /// Make all digits monospaced
        let monoSpaceDigits: [NSFontDescriptor.FeatureKey: Int] = [
            .selectorIdentifier: 0,
            .typeIdentifier: kNumberSpacingType
        ]

        let features = [alt469, monoSpaceDigits]
        let descriptor = font.fontDescriptor.addingAttributes([.featureSettings: features, .fixedAdvance: fontAdvance])
        return NSFont(descriptor: descriptor, size: 0) ?? font
    }
thecoolwinter commented 1 year ago

@Eliulm It looks like your alt469 is enabling the high legibility setting (kStylisticAltSixOnSelector = 12) which enables the slashed 0. You'll have to add the alt 4 and alt 6 and 9 separately using their respective keys:

let alt4: [NSFontDescriptor.FeatureKey: Int] = [
    .selectorIdentifier: kStylisticAltOneOnSelector,
    .typeIdentifier: kStylisticAlternativesType
]

let alt6and9: [NSFontDescriptor.FeatureKey: Int] = [
    .selectorIdentifier: kStylisticAltTwoOnSelector,
    .typeIdentifier: kStylisticAlternativesType
]

Left: Xcode, Right: CE

Screenshot 2023-03-22 at 1 26 50 PM
Eliulm commented 1 year ago

@thecoolwinter Awesome, thank you!

austincondiff commented 1 year ago

@Eliulm how are we looking with this?

Eliulm commented 1 year ago

Done, going to create a PR soon