NSTextView 语法高亮

作者:编程家 分类: objective 时间:2025-07-31

在Mac操作系统中,开发者可以使用NSTextView来实现文本编辑器的功能。除了普通的文本输入,NSTextView还支持语法高亮的功能,可以使代码更加清晰易读。本文将介绍如何在NSTextView中实现语法高亮,并提供一个简单的示例代码。

首先,我们需要创建一个NSTextView对象,并设置其属性来启用语法高亮。代码如下所示:

swift

let textView = NSTextView(frame: CGRect(x: 0, y: 0, width: 400, height: 300))

textView.isRichText = false

textView.isEditable = true

textView.isSelectable = true

textView.allowsUndo = true

textView.usesFindPanel = true

textView.usesFontPanel = true

textView.font = NSFont.userFixedPitchFont(ofSize: 14)

textView.textColor = NSColor.textColor

textView.backgroundColor = NSColor.textBackgroundColor

let textStorage = NSTextStorage()

let layoutManager = NSLayoutManager()

textStorage.addLayoutManager(layoutManager)

let textContainer = NSTextContainer(size: textView.bounds.size)

layoutManager.addTextContainer(textContainer)

textView.textStorage = textStorage

以上代码创建了一个大小为400x300的NSTextView对象,并设置了一些常用属性,如是否可编辑、是否可选中、是否支持撤销操作等。同时,还设置了字体和颜色属性,以及文本容器和布局管理器。这些设置可以根据实际需求进行调整。

接下来,我们需要定义一个语法高亮的颜色方案。在这个示例中,我们将使用一个简单的方案,将关键字设置为蓝色,注释设置为灰色。代码如下:

swift

let keywordAttributes: [NSAttributedString.Key: Any] = [.foregroundColor: NSColor.blue]

let commentAttributes: [NSAttributedString.Key: Any] = [.foregroundColor: NSColor.gray]

func highlightSyntax() {

guard let text = textView.textStorage?.string else { return }

let attributedString = NSMutableAttributedString(string: text)

let keywordRegex = try! NSRegularExpression(pattern: "\\b(let|var|func|class|if|else|for|while)\\b", options: .caseInsensitive)

let commentRegex = try! NSRegularExpression(pattern: "//.*", options: .caseInsensitive)

let keywordMatches = keywordRegex.matches(in: text, options: [], range: NSRange(location: 0, length: text.utf16.count))

for match in keywordMatches {

attributedString.addAttributes(keywordAttributes, range: match.range)

}

let commentMatches = commentRegex.matches(in: text, options: [], range: NSRange(location: 0, length: text.utf16.count))

for match in commentMatches {

attributedString.addAttributes(commentAttributes, range: match.range)

}

textView.textStorage?.setAttributedString(attributedString)

}

以上代码中,我们定义了两个正则表达式,一个用于匹配关键字(如let、var、func等),另一个用于匹配注释(以//开头的行)。然后,我们使用这两个正则表达式找到匹配的文本,并为其添加相应的属性,即关键字设置为蓝色,注释设置为灰色。最后,我们将处理后的富文本设置给NSTextView的textStorage属性,从而实现语法高亮的效果。

为了使语法高亮能够实时生效,我们可以在NSTextView的文本变化时调用highlightSyntax()函数。代码如下:

swift

NotificationCenter.default.addObserver(forName: NSText.didChangeNotification, object: textView, queue: .main) { _ in

highlightSyntax()

}

以上代码使用了NotificationCenter来监听NSText的didChangeNotification通知,当文本发生变化时,调用highlightSyntax()函数进行语法高亮。

现在,我们已经完成了在NSTextView中实现语法高亮的代码。接下来,我们可以将其应用到实际的项目中,例如开发一个简单的代码编辑器。

代码编辑器示例

在本示例中,我们将创建一个简单的代码编辑器,使用NSTextView来实现文本输入和语法高亮的功能。用户可以在编辑器中输入代码,并实时看到语法高亮的效果。

首先,我们需要创建一个NSTextView对象,并设置其属性。代码如下:

swift

let textView = NSTextView(frame: NSRect(x: 0, y: 0, width: 400, height: 300))

textView.isEditable = true

textView.isRichText = false

textView.usesFindPanel = true

textView.usesFontPanel = true

textView.font = NSFont.userFixedPitchFont(ofSize: 14)

textView.textColor = NSColor.textColor

以上代码创建了一个大小为400x300的NSTextView对象,并设置了一些常用属性,如是否可编辑、是否支持查找和替换、字体和颜色等。

接下来,我们需要定义一个语法高亮的函数。在这个示例中,我们将使用一个简单的方案,将关键字设置为蓝色,注释设置为灰色。代码如下:

swift

let keywordAttributes: [NSAttributedString.Key: Any] = [.foregroundColor: NSColor.blue]

let commentAttributes: [NSAttributedString.Key: Any] = [.foregroundColor: NSColor.gray]

func highlightSyntax() {

guard let text = textView.string else { return }

let attributedString = NSMutableAttributedString(string: text)

let keywordRegex = try! NSRegularExpression(pattern: "\\b(let|var|func|class|if|else|for|while)\\b", options: .caseInsensitive)

let commentRegex = try! NSRegularExpression(pattern: "//.*", options: .caseInsensitive)

let keywordMatches = keywordRegex.matches(in: text, options: [], range: NSRange(location: 0, length: text.utf16.count))

for match in keywordMatches {

attributedString.addAttributes(keywordAttributes, range: match.range)

}

let commentMatches = commentRegex.matches(in: text, options: [], range: NSRange(location: 0, length: text.utf16.count))

for match in commentMatches {

attributedString.addAttributes(commentAttributes, range: match.range)

}

textView.textStorage?.setAttributedString(attributedString)

}

以上代码中,我们定义了两个正则表达式,一个用于匹配关键字(如let、var、func等),另一个用于匹配注释(以//开头的行)。然后,我们使用这两个正则表达式找到匹配的文本,并为其添加相应的属性,即关键字设置为蓝色,注释设置为灰色。最后,我们将处理后的富文本设置给NSTextView的textStorage属性,从而实现语法高亮的效果。

为了使语法高亮能够实时生效,我们可以在NSTextView的文本变化时调用highlightSyntax()函数。代码如下:

swift

NotificationCenter.default.addObserver(forName: NSText.didChangeNotification, object: textView, queue: .main) { _ in

highlightSyntax()

}

以上代码使用了NotificationCenter来监听NSText的didChangeNotification通知,当文本发生变化时,调用highlightSyntax()函数进行语法高亮。

最后,我们将NSTextView添加到视图中,并设置一些必要的布局约束。代码如下:

swift

let view = NSView(frame: NSRect(x: 0, y: 0, width: 400, height: 300))

view.addSubview(textView)

textView.translatesAutoresizingMaskIntoConstraints = false

NSLayoutConstraint.activate([

textView.leadingAnchor.constraint(equalTo: view.leadingAnchor),

textView.trailingAnchor.constraint(equalTo: view.trailingAnchor),

textView.topAnchor.constraint(equalTo: view.topAnchor),

textView.bottomAnchor.constraint(equalTo: view.bottomAnchor)

])

以上代码创建了一个大小为400x300的NSView对象,并将NSTextView添加到其中。然后,我们设置了一些必要的布局约束,以确保NSTextView填满整个视图。

现在,我们已经完成了一个简单的代码编辑器示例,其中使用了NSTextView的语法高亮功能。用户可以在编辑器中输入代码,并实时看到语法高亮的效果。开发者可以根据实际需求进一步定制和扩展这个示例,以实现更多功能。

本文介绍了如何在Mac操作系统中使用NSTextView实现语法高亮的功能。通过设置NSTextView的属性,并使用正则表达式匹配文本并添加属性,我们可以实现代码的语法高亮。同时,本文还提供了一个简单的代码编辑器示例,展示了如何将语法高亮应用到实际项目中。

希望本文对你理解NSTextView的语法高亮功能有所帮助,并能够在实际开发中得到应用。如果你对这个话题感兴趣,可以进一步探索NSTextView的其他功能和用法,以及更复杂的语法高亮方案。