From 12a9b2fecfec43490682bc25396eb17fc61c6b8c Mon Sep 17 00:00:00 2001 From: qwertyyb Date: Fri, 14 Apr 2023 15:47:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9C=A8=E6=95=B0=E5=AD=97=E5=90=8E?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E5=8F=A5=E5=8F=B7=E6=97=B6=EF=BC=8C=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=BD=AC=E4=B8=BA=E5=B0=8F=E6=95=B0=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Fire/FireInputController.swift | 35 ++++++++++++++++++-------- Fire/Preferences/PunctuationPane.swift | 4 +++ Fire/types.swift | 2 ++ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/Fire/FireInputController.swift b/Fire/FireInputController.swift index 8c2f409..19a7c51 100644 --- a/Fire/FireInputController.swift +++ b/Fire/FireInputController.swift @@ -17,6 +17,7 @@ typealias NotificationObserver = (name: Notification.Name, callback: (_ notifica class FireInputController: IMKInputController { private var _candidates: [Candidate] = [] private var _hasNext: Bool = false + private var _lastInputIsNumber = false internal var inputMode: InputMode { get { Fire.shared.inputMode } set(value) { Fire.shared.inputMode = value } @@ -152,6 +153,16 @@ class FireInputController: IMKInputController { return nil } + private func predictorHandler(event: NSEvent) -> Bool? { + if Defaults[.enableDotAfterNumber] && event.keyCode == kVK_ANSI_Period && _lastInputIsNumber { + insertText(".") + _lastInputIsNumber = false + return true + } + _lastInputIsNumber = false + return nil + } + private func pageKeyHandler(event: NSEvent) -> Bool? { // +/-/arrowdown/arrowup翻页 let keyCode = event.keyCode @@ -176,9 +187,8 @@ class FireInputController: IMKInputController { } private func deleteKeyHandler(event: NSEvent) -> Bool? { - let keyCode = event.keyCode // 删除键删除字符 - if keyCode == kVK_Delete { + if event.keyCode == kVK_Delete { if _originalString.count > 0 { _originalString = String(_originalString.dropLast()) return true @@ -231,14 +241,17 @@ class FireInputController: IMKInputController { // 获取输入的字符 let string = event.characters! // 当前输入的是数字,选择当前候选列表中的第N个字符 v - if let pos = Int(string), _originalString.count > 0 { - let index = pos - 1 - if index < _candidates.count { - insertCandidate(_candidates[index]) - } else { - _originalString += string + if let pos = Int(string) { + if _originalString.count > 0 { + let index = pos - 1 + if index < _candidates.count { + insertCandidate(_candidates[index]) + } else { + _originalString += string + } + return true } - return true + _lastInputIsNumber = true } return nil } @@ -292,6 +305,7 @@ class FireInputController: IMKInputController { hotkeyHandler, flagChangedHandler, enModeHandler, + predictorHandler, pageKeyHandler, deleteKeyHandler, charKeyHandler, @@ -356,9 +370,10 @@ class FireInputController: IMKInputController { NSLog("insertText: %@", text) let value = NSAttributedString(string: text) try client()?.insertText(value, replacementRange: replacementRange()) + _lastInputIsNumber = text.last != nil && Int(String(text.last!)) != nil clean() } - + // 往输入框中插入原始字符 func insertOriginText() { if self._originalString.count > 0 { diff --git a/Fire/Preferences/PunctuationPane.swift b/Fire/Preferences/PunctuationPane.swift index 53741b0..73778f4 100644 --- a/Fire/Preferences/PunctuationPane.swift +++ b/Fire/Preferences/PunctuationPane.swift @@ -13,6 +13,7 @@ import Defaults struct PunctuationPane: View { @Default(.punctuationMode) private var punctuationMode @Default(.customPunctuationSettings) private var customPunctuationSettings + @Default(.enableDotAfterNumber) private var enableDotAfterNumber var body: some View { Preferences.Container(contentWidth: 450) { Preferences.Section(title: "") { @@ -24,6 +25,9 @@ struct PunctuationPane: View { } Spacer(minLength: 150) } + HStack { + Toggle("数字后输入 “。”自动转为 “.”", isOn: $enableDotAfterNumber) + } VStack(alignment: .leading) { Text("自定义符号") Spacer(minLength: 4) diff --git a/Fire/types.swift b/Fire/types.swift index b02cd60..6a405cf 100644 --- a/Fire/types.swift +++ b/Fire/types.swift @@ -115,6 +115,8 @@ extension Defaults.Keys { // 标点符号配置 static let punctuationMode = Key("punctuationMode", default: PunctuationMode.zhhans) static let customPunctuationSettings = Key<[String: String]>("customPunctuationSettings", default: punctuation) + // 数字后输入"。"自动转为"." + static let enableDotAfterNumber = Key("enableDotAfterNumber", default: true) static let wbTablePath = Key( "wbTableURL",