2.1.0 RTM // Disassembly, etc. Merge PR#111 from upd/2.1.0RTM
This commit is contained in:
commit
620c8ee0e8
|
@ -0,0 +1,44 @@
|
|||
### **請在開新的工單之前閱讀《[故障提報與用儀器捉蟲](https://vchewing.github.io/BUGREPORT.html)》按照裡面的方法先電郵聯絡、或至少在開工單之後電郵知會之。因各種可能原因,威注音的主程式師可能無法隨時收取 GitHub 與 Gitee 的工單提醒訊息。**
|
||||
|
||||
### 請勿利用工單遞交**詞語新增請求**。所有「詞語新增請求」請一律使用電郵提報。
|
||||
|
||||
**摘要**
|
||||
請簡單說明您遇到了什麼問題。這份表格雖然是中文的(我們相信注音輸入法的用戶應該都能看懂中文),但開發團隊可以使用中英文溝通,您也可以使用英文提報問題。
|
||||
|
||||
**快速分類**
|
||||
請問您遇到的是:
|
||||
|
||||
- [ ] 輸入法崩潰或正在接受文字輸入的應用程式崩潰
|
||||
- [ ] 輸入法叫不出來,或無法正確敲出中文
|
||||
- [ ] 無法切換至特定功能的啟用/停用狀態
|
||||
- [ ] 輸入法效能有問題(執行速度太慢/電腦發燙)
|
||||
- [ ] 輸入法應用程式介面顯示不正常(IMK 選字窗的應用介面美術瑕疵恕不受理,因為是 Apple 負責的)
|
||||
- [ ] 輸入法亂放屁(請確保偏好設定內的廉恥模式的勾沒有被去掉)
|
||||
- [ ] 其他
|
||||
|
||||
**問題發生步驟**
|
||||
請問您是怎麼遇到這個問題的?像是:
|
||||
|
||||
1. 先執行某個接收文字的客體應用
|
||||
2. 開始在某個區域打字
|
||||
3. 切換到某種設定/模式…
|
||||
|
||||
**預期正常狀況**
|
||||
您覺得這是不正常的狀況,那您覺得正常結果應該是…?
|
||||
|
||||
**螢幕截圖或螢幕錄製**
|
||||
如果您能夠提供像螢幕截圖或螢幕錄製供大家參考,我們可以從畫面中,看出更多只從文字內容無法了解的線索。
|
||||
|
||||
**電腦環境**
|
||||
請問您在怎樣的環境遇到這個問題?
|
||||
|
||||
- 威注音版本:(請填寫版本)
|
||||
- 注音排列與基礎鍵盤佈局:(在偏好設定視窗的「鍵盤設定」內可以查詢到)
|
||||
- macOS 版本:(請填寫版本與建置編號,例:「13.0 (22A5321d)」)
|
||||
- 在哪個應用程式中打字遇到問題:(應用程式名稱/版本)
|
||||
- 電腦機種:(筆電或桌機,使用 Intel 或 Apple Silicon CPU)
|
||||
- 其他特殊設備:(請填寫是否有外接螢幕、特製鍵盤如非標準美式鍵盤等)
|
||||
- 特殊設定:(是否原本正常,改了某個系統設定後就遇到問題)
|
||||
|
||||
**其他**
|
||||
其他你覺得問題發生的疑點,或其他你想跟威注音開發團隊說的話。
|
|
@ -0,0 +1,55 @@
|
|||
---
|
||||
name: 功能問題提報
|
||||
about: 請告訴我們您遇到什麼問題
|
||||
title: "[功能問題提報]"
|
||||
labels: "BUG / DEBUFF / REGRESSION"
|
||||
assignees: ""
|
||||
---
|
||||
|
||||
### **請在開新的工單之前閱讀《[故障提報與用儀器捉蟲](https://vchewing.github.io/BUGREPORT.html)》按照裡面的方法先電郵聯絡、或至少在開工單之後電郵知會之。因各種可能原因,威注音的主程式師可能無法隨時收取 GitHub 與 Gitee 的工單提醒訊息。**
|
||||
|
||||
**摘要**
|
||||
請簡單說明您遇到了什麼問題。這份表格雖然是中文的(我們相信注音輸入法的用戶應該都能看懂中文),但開發團隊可以使用中英文溝通,您也可以使用英文提報問題。
|
||||
|
||||
**快速分類**
|
||||
請問您遇到的是:
|
||||
|
||||
- [ ] 輸入法崩潰或正在接受文字輸入的應用程式崩潰
|
||||
- [ ] 輸入法叫不出來,或無法正確敲出中文
|
||||
- [ ] 無法切換至特定功能的啟用/停用狀態
|
||||
- [ ] 輸入法效能有問題(執行速度太慢/電腦發燙)
|
||||
- [ ] 輸入法應用程式介面顯示不正常(IMK 選字窗的應用介面美術瑕疵恕不受理,因為是 Apple 負責的)
|
||||
- [ ] 輸入法亂放屁(請確保偏好設定內的廉恥模式的勾沒有被去掉)
|
||||
- [ ] 其他
|
||||
|
||||
**問題發生步驟**
|
||||
請問您是怎麼遇到這個問題的?像是:
|
||||
|
||||
1. 先執行某個接收文字的客體應用
|
||||
2. 開始在某個區域打字
|
||||
3. 切換到某種設定/模式…
|
||||
|
||||
**預期正常狀況**
|
||||
您覺得這是不正常的狀況,那您覺得正常結果應該是…?
|
||||
|
||||
**螢幕截圖或螢幕錄製**
|
||||
如果您能夠提供像螢幕截圖或螢幕錄製供大家參考,我們可以從畫面中,看出更多只從文字內容無法了解的線索。
|
||||
|
||||
**小麥注音是否也有該問題**
|
||||
威注音一開始是小麥注音的下游。雖經大量修改與重構,但也難免會受到之前繼承過來的可能存在的上游 Bug 或設計缺陷的影響。
|
||||
|
||||
所以呢,這個問題也請答覆。但如果是威注音特有功能出現故障的話,那這個問題可以不用答覆。
|
||||
|
||||
**電腦環境**
|
||||
請問您在怎樣的環境遇到這個問題?
|
||||
|
||||
- 威注音版本:(請填寫版本)
|
||||
- 注音排列與基礎鍵盤佈局:(在偏好設定視窗的「鍵盤設定」內可以查詢到)
|
||||
- macOS 版本:(請填寫版本與建置編號,例:「13.0 (22A5321d)」)
|
||||
- 在哪個應用程式中打字遇到問題:(應用程式名稱/版本)
|
||||
- 電腦機種:(筆電或桌機,使用 Intel 或 Apple Silicon CPU)
|
||||
- 其他特殊設備:(請填寫是否有外接螢幕、特製鍵盤如非標準美式鍵盤等)
|
||||
- 特殊設定:(是否原本正常,改了某個系統設定後就遇到問題)
|
||||
|
||||
**其他**
|
||||
其他你覺得問題發生的疑點,或其他你想跟威注音開發團隊說的話。
|
|
@ -0,0 +1,30 @@
|
|||
---
|
||||
name: 功能建議
|
||||
about: 告訴我們您還有什麼沒被滿足的需求
|
||||
title: "[功能建議]"
|
||||
labels: "Q&A / DISCUSSION"
|
||||
assignees: ""
|
||||
---
|
||||
|
||||
**免責聲明**
|
||||
|
||||
威注音輸入法保留拒絕任何種類的功能建議的權利(本來就有)。
|
||||
|
||||
閱讀來自各位使用者的功能建議請求,是一回事;**但**威注音研發方怎樣利用這些建議請求背後的潛在資訊、來制定威注音接下來的研發方向(或可能棄用相關想法),則是**另一回事**。
|
||||
|
||||
**痛點**
|
||||
請告訴我們為什麼目前威注音沒辦法解決您的問題。您可以講一個能讓讀者得以感同身受的小故事,比如:
|
||||
|
||||
- 我從 xx 年前開始,使用了 xx 輸入法,我相當依賴其中一項功能,但是威注音沒有...
|
||||
- 一直以來我在輸入 xx 這類內容的時候,都很花時間,我想要有更有效率的辦法…
|
||||
|
||||
**功能說明**
|
||||
請大致說明您想要的功能,最後會看起來會像是怎樣。當然最簡單的說明可能會像是「跟 xxx 輸入法一樣」,但請您諒解,不是什麼人都用過你之前用過的那套輸入法(更何況像 mac 版漢音輸入法那樣的必須買來不一定能買得來的老機種+灌上不一定能下載到的老系統才能重新體驗,成本很大),其他人想了解「跟 xxx 輸入法一樣」,首先還得找到那套輸入法,而且有些年代久遠的輸入法還找不到,這樣雙方的認知不同,會大幅降低溝通效率。
|
||||
|
||||
比方說,您想要某種符號表設計,或許可以提供我們一個草圖,或是其他你喜歡的輸入法的符號表的截圖。遇到某些更複雜的情境,您也可以考慮錄製螢幕畫面供大家參考。
|
||||
|
||||
**替代方案**
|
||||
請問,您目前是用什麼方法,可以做到就算沒有這項功能,也可以達最後目的。或著,如果這項功能開發與其他功能衝突,您起碼可以接受什麼方案?
|
||||
|
||||
**其他**
|
||||
其他你想跟威注音開發團隊說的話。
|
|
@ -0,0 +1,24 @@
|
|||
---
|
||||
name: 原廠辭典問題提報
|
||||
about: 請告訴我們與原廠辭典有關的問題
|
||||
title: "[原廠辭典問題提報]"
|
||||
labels: "BUG / DEBUFF / REGRESSION"
|
||||
assignees: ""
|
||||
---
|
||||
|
||||
### **請在開新的工單之前閱讀《[故障提報與用儀器捉蟲](https://vchewing.github.io/BUGREPORT.html)》按照裡面的方法先電郵聯絡、或至少在開工單之後電郵知會之。因各種可能原因,威注音的主程式師可能無法隨時收取 GitHub 與 Gitee 的工單提醒訊息。**
|
||||
|
||||
### 請勿利用工單遞交**詞語新增請求**。所有「詞語新增請求」請一律使用電郵提報。
|
||||
|
||||
**分類**
|
||||
|
||||
- [ ] 錯字或錯誤讀音
|
||||
- [ ] 缺字/詞
|
||||
- [ ] 字詞權重(優先級)問題
|
||||
- [ ] 其他
|
||||
|
||||
**說明**
|
||||
請說明是哪個字寫錯或是標音錯誤,以及正確的寫法與念法。
|
||||
|
||||
**相關資料**
|
||||
像是字典的連結等。
|
|
@ -2,9 +2,7 @@
|
|||
// ====================
|
||||
// This code is released under the MIT license (SPDX-License-Identifier: MIT)
|
||||
|
||||
import Carbon
|
||||
import Cocoa
|
||||
import Foundation
|
||||
|
||||
extension Date {
|
||||
static func - (lhs: Date, rhs: Date) -> TimeInterval {
|
||||
|
|
|
@ -29,7 +29,11 @@ final class PreferencesTabViewController: NSViewController, PreferencesStyleCont
|
|||
}
|
||||
|
||||
override func loadView() {
|
||||
view = NSView()
|
||||
let newView = NSVisualEffectView()
|
||||
newView.material = NSVisualEffectView.Material.sidebar
|
||||
newView.blendingMode = NSVisualEffectView.BlendingMode.behindWindow
|
||||
newView.state = NSVisualEffectView.State.active
|
||||
view = newView
|
||||
view.translatesAutoresizingMaskIntoConstraints = false
|
||||
}
|
||||
|
||||
|
@ -135,7 +139,7 @@ final class PreferencesTabViewController: NSViewController, PreferencesStyleCont
|
|||
// View controller animations only work on macOS 10.14 and newer.
|
||||
let options: NSViewController.TransitionOptions
|
||||
if #available(macOS 10.14, *) {
|
||||
options = animated && isAnimated ? [.crossfade] : []
|
||||
options = animated && isAnimated ? [.slideUp] : []
|
||||
} else {
|
||||
options = []
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 8378080fb4d7c0593ed9054132d9ece589bace81
|
||||
Subproject commit a0a2565cbede65e189951bc8cd44197b3e3d7cda
|
|
@ -73,6 +73,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelega
|
|||
fsStreamHelper.delegate = self
|
||||
_ = fsStreamHelper.start()
|
||||
|
||||
mgrPrefs.fixOddPreferences()
|
||||
mgrPrefs.setMissingDefaults()
|
||||
|
||||
// 只要使用者沒有勾選檢查更新、沒有主動做出要檢查更新的操作,就不要檢查更新。
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
// marks, or product names of Contributor, except as required to fulfill notice
|
||||
// requirements defined in MIT License.
|
||||
|
||||
import Cocoa
|
||||
|
||||
enum AppleKeyboardConverter {
|
||||
static let arrDynamicBasicKeyLayout: [String] = [
|
||||
"com.apple.keylayout.ZhuyinBopomofo",
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// marks, or product names of Contributor, except as required to fulfill notice
|
||||
// requirements defined in MIT License.
|
||||
|
||||
import Cocoa
|
||||
import Foundation
|
||||
|
||||
// 註:所有 InputState 型別均不適合使用 Struct,因為 Struct 無法相互繼承派生。
|
||||
|
||||
|
@ -171,6 +171,8 @@ public enum InputState {
|
|||
return converted
|
||||
}
|
||||
|
||||
public var committingBufferConverted: String { composingBufferConverted }
|
||||
|
||||
init(composingBuffer: String, cursorIndex: Int, reading: String = "", nodeValuesArray: [String] = []) {
|
||||
self.composingBuffer = composingBuffer
|
||||
self.reading = reading
|
||||
|
@ -230,6 +232,17 @@ public enum InputState {
|
|||
var textToCommit: String = ""
|
||||
var tooltip: String = ""
|
||||
|
||||
override public var committingBufferConverted: String {
|
||||
let committingBuffer = nodeValuesArray.joined()
|
||||
let converted = IME.kanjiConversionIfRequired(committingBuffer)
|
||||
if converted.utf16.count != composingBuffer.utf16.count
|
||||
|| converted.count != composingBuffer.count
|
||||
{
|
||||
return composingBuffer
|
||||
}
|
||||
return converted
|
||||
}
|
||||
|
||||
override init(composingBuffer: String, cursorIndex: Int, reading: String = "", nodeValuesArray: [String] = []) {
|
||||
super.init(
|
||||
composingBuffer: composingBuffer, cursorIndex: cursorIndex, reading: reading, nodeValuesArray: nodeValuesArray
|
||||
|
@ -490,8 +503,8 @@ public enum InputState {
|
|||
return cursorIndexU8..<min(cursorIndexU8 + chosenCandidateString.count, composingBuffer.count - 1)
|
||||
}
|
||||
}()
|
||||
let strSegmentedRear = composingBuffer.map { String($0) }[0..<u8Range.lowerBound].joined()
|
||||
let strSegmentedFront = composingBuffer.map { String($0) }[u8Range.upperBound...].joined()
|
||||
let strSegmentedRear = composingBuffer.charComponents[0..<u8Range.lowerBound].joined()
|
||||
let strSegmentedFront = composingBuffer.charComponents[u8Range.upperBound...].joined()
|
||||
let newBufferConverted: String = NotEmpty(
|
||||
composingBuffer: strSegmentedRear + chosenCandidateString + strSegmentedFront, cursorIndex: 0
|
||||
).composingBufferConverted
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
/// 被封裝的「與 Megrez 組字引擎和 Tekkon 注拼引擎對接的」各種工具函式。
|
||||
/// 注意:不要把 composer 注拼槽與 compositor 組字器這兩個概念搞混。
|
||||
|
||||
import Cocoa
|
||||
import Foundation
|
||||
|
||||
// MARK: - 委任協定 (Delegate).
|
||||
|
||||
|
@ -69,6 +69,8 @@ public class KeyHandler {
|
|||
|
||||
/// 初期化。
|
||||
public init() {
|
||||
/// 同步組字器單個詞的幅位長度上限。
|
||||
Megrez.Compositor.maxSpanLength = mgrPrefs.maxCandidateLength
|
||||
/// 組字器初期化。因為是首次初期化變數,所以這裡不能用 ensureCompositor() 代勞。
|
||||
compositor = Megrez.Compositor(with: currentLM, separator: "-")
|
||||
/// 注拼槽初期化。
|
||||
|
@ -140,20 +142,26 @@ public class KeyHandler {
|
|||
///
|
||||
/// 威注音輸入法截至 v1.9.3 SP2 版為止都受到上游的這個 Bug 的影響,且在 v1.9.4 版利用該函式修正了這個缺陷。
|
||||
/// 該修正必須搭配至少天權星組字引擎 v2.0.2 版方可生效。算法可能比較囉唆,但至少在常用情形下不會再發生該問題。
|
||||
/// - Parameter theCandidate: 要拿來覆寫的詞音配對。
|
||||
func consolidateCursorContext(with theCandidate: Megrez.Compositor.Candidate) {
|
||||
/// - Parameters:
|
||||
/// - theCandidate: 要拿來覆寫的詞音配對。
|
||||
/// - cursorSpecified: 給定作業目標游標位置(不知道怎麼用的話就不要用),不設定的話則改用 actualCandidateCursor。
|
||||
func consolidateCursorContext(with theCandidate: Megrez.Compositor.Candidate = .init(), cursorSpecified: Int? = nil) {
|
||||
var cursorSpecified = cursorSpecified ?? actualCandidateCursor
|
||||
if cursorSpecified != actualCandidateCursor {
|
||||
cursorSpecified = max(0, min(cursorSpecified, compositor.width - 1)) // 糾正傳入的數值。
|
||||
}
|
||||
let grid = compositor
|
||||
var frontBoundaryEX = compositor.width - 1
|
||||
var rearBoundaryEX = 0
|
||||
if grid.overrideCandidate(theCandidate, at: actualCandidateCursor) {
|
||||
guard let node = compositor.walkedNodes.findNode(at: actualCandidateCursor, target: &frontBoundaryEX) else {
|
||||
if grid.overrideCandidate(theCandidate, at: cursorSpecified) {
|
||||
guard let node = compositor.walkedNodes.findNode(at: cursorSpecified, target: &frontBoundaryEX) else {
|
||||
return
|
||||
}
|
||||
rearBoundaryEX = max(0, frontBoundaryEX - node.keyArray.count)
|
||||
}
|
||||
|
||||
var frontBoundary = 0
|
||||
guard let node = compositor.walkedNodes.findNode(at: actualCandidateCursor, target: &frontBoundary) else { return }
|
||||
guard let node = compositor.walkedNodes.findNode(at: cursorSpecified, target: &frontBoundary) else { return }
|
||||
|
||||
var rearBoundary = min(max(0, frontBoundary - node.keyArray.count), rearBoundaryEX) // 防呆
|
||||
frontBoundary = max(min(frontBoundary, compositor.width), frontBoundaryEX) // 防呆。
|
||||
|
@ -184,7 +192,7 @@ public class KeyHandler {
|
|||
position += currentNode.keyArray.count
|
||||
continue
|
||||
}
|
||||
let values = currentNode.currentPair.value.map { String($0) }
|
||||
let values = currentNode.currentPair.value.charComponents
|
||||
for (subPosition, key) in currentNode.keyArray.enumerated() {
|
||||
guard values.count > subPosition else { break } // 防呆,應該沒有發生的可能性
|
||||
let thePair = Megrez.Compositor.Candidate(
|
||||
|
@ -364,6 +372,33 @@ public class KeyHandler {
|
|||
composer.phonabetCombinationCorrectionEnabled = mgrPrefs.autoCorrectReadingCombination
|
||||
}
|
||||
|
||||
/// 返回前一個游標位置的可解析的漢字讀音。
|
||||
/// 返回的內容分別是:「完整讀音」「去掉聲調的讀音」「是否有聲調」。
|
||||
var previousParsableReading: (String, String, Bool)? {
|
||||
if compositor.cursor == 0 { return nil }
|
||||
let cursorPrevious = max(compositor.cursor - 1, 0)
|
||||
let rawData = compositor.keys[cursorPrevious]
|
||||
let components = rawData.charComponents
|
||||
var hasIntonation = false
|
||||
for neta in components {
|
||||
if !Tekkon.allowedPhonabets.contains(neta) || neta == " " { return nil }
|
||||
if Tekkon.allowedIntonations.contains(neta) { hasIntonation = true }
|
||||
}
|
||||
if hasIntonation, components.count == 1 { return nil } // 剔除純聲調之情形
|
||||
let rawDataSansIntonation = hasIntonation ? components.dropLast(1).joined() : rawData
|
||||
return (rawData, rawDataSansIntonation, hasIntonation)
|
||||
}
|
||||
|
||||
/// 檢測某個傳入的按鍵訊號是否為聲調鍵。
|
||||
/// - Parameter input: 傳入的按鍵訊號。
|
||||
/// - Returns: 判斷結果:是否為聲調鍵。
|
||||
func isIntonationKey(_ input: InputSignal) -> Bool {
|
||||
var theComposer = composer // 複製一份用來做實驗。
|
||||
theComposer.clear() // 清空各種槽的內容。
|
||||
theComposer.receiveKey(fromCharCode: input.charCode)
|
||||
return theComposer.hasToneMarker(withNothingElse: true)
|
||||
}
|
||||
|
||||
// MARK: - Extracted methods and functions (Megrez).
|
||||
|
||||
/// 將輸入法偏好設定同步至語言模組內。
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
/// 該檔案乃按鍵調度模組當中「用來規定在選字窗出現時的按鍵行為」的部分。
|
||||
|
||||
import Cocoa
|
||||
import Foundation
|
||||
|
||||
// MARK: - § 對選字狀態進行調度 (Handle Candidate State).
|
||||
|
||||
|
|
|
@ -33,6 +33,32 @@ extension KeyHandler {
|
|||
// 如果是的話,就將這次傳入的這個按鍵訊號塞入注拼槽內且標記為「keyConsumedByReading」。
|
||||
// 函式 composer.receiveKey() 可以既接收 String 又接收 UniChar。
|
||||
if !skipPhoneticHandling && composer.inputValidityCheck(key: input.charCode) {
|
||||
// 引入 macOS 內建注音輸入法的行為,允許用除了陰平以外的聲調鍵覆寫前一個漢字的讀音。
|
||||
// 但如果要覆寫的內容會導致游標身後的字音沒有對應的辭典記錄的話,那就只蜂鳴警告一下。
|
||||
proc: if [0, 1].contains(mgrPrefs.specifyIntonationKeyBehavior), composer.isEmpty, !input.isSpace {
|
||||
// prevReading 的內容分別是:「完整讀音」「去掉聲調的讀音」「是否有聲調」。
|
||||
guard let prevReading = previousParsableReading, isIntonationKey(input) else { break proc }
|
||||
var theComposer = composer
|
||||
prevReading.0.charComponents.forEach { theComposer.receiveKey(fromPhonabet: $0) }
|
||||
// 發現要覆寫的聲調與覆寫對象的聲調雷同的情況的話,直接跳過處理。
|
||||
let oldIntonation: Tekkon.Phonabet = theComposer.intonation
|
||||
theComposer.receiveKey(fromCharCode: input.charCode)
|
||||
if theComposer.intonation == oldIntonation, mgrPrefs.specifyIntonationKeyBehavior == 1 { break proc }
|
||||
theComposer.intonation.clear()
|
||||
// 檢查新的漢字字音是否在庫。
|
||||
let temporaryReadingKey = theComposer.getComposition()
|
||||
if currentLM.hasUnigramsFor(key: theComposer.getComposition()) {
|
||||
compositor.dropKey(direction: .rear)
|
||||
walk() // 這裡必須 Walk 一次、來更新目前被 walk 的內容。
|
||||
composer = theComposer
|
||||
// 這裡不需要回呼 buildInputtingState,因為當前輸入的聲調鍵一定是合規的、會在之後回呼 buildInputtingState。
|
||||
} else {
|
||||
IME.prtDebugIntel("4B0DD2D4:語彙庫內無「\(temporaryReadingKey)」的匹配記錄,放棄覆寫游標身後的內容。")
|
||||
errorCallback()
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
composer.receiveKey(fromCharCode: input.charCode)
|
||||
keyConsumedByReading = true
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
/// 該檔案乃按鍵調度模組當中「用來規定當 IMK 接受按鍵訊號時且首次交給按鍵調度模組處理時、
|
||||
/// 按鍵調度模組要率先處理」的部分。據此判斷是否需要將按鍵處理委派給其它成員函式。
|
||||
|
||||
import Cocoa
|
||||
import Foundation
|
||||
|
||||
// MARK: - § 根據狀態調度按鍵輸入 (Handle Input with States)
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
/// 該檔案乃按鍵調度模組的用以承載「根據按鍵行為來調控模式」的各種成員函式的部分。
|
||||
|
||||
import Cocoa
|
||||
import Foundation
|
||||
|
||||
// MARK: - § 根據按鍵行為來調控模式的函式 (Functions Interact With States).
|
||||
|
||||
|
@ -30,7 +30,7 @@ extension KeyHandler {
|
|||
/// 這樣就可以免除不必要的類型轉換。
|
||||
for theNode in compositor.walkedNodes {
|
||||
let strNodeValue = theNode.value
|
||||
let arrSplit: [String] = Array(strNodeValue).map { String($0) }
|
||||
let arrSplit: [String] = Array(strNodeValue).charComponents
|
||||
let codepointCount = arrSplit.count
|
||||
/// 藉下述步驟重新將「可見游標位置」對齊至「組字器內的游標所在的讀音位置」。
|
||||
/// 每個節錨(NodeAnchor)都有自身的幅位長度(spanningLength),可以用來
|
||||
|
@ -173,6 +173,13 @@ extension KeyHandler {
|
|||
return true
|
||||
}
|
||||
|
||||
// 阻止用於行內注音輸出的熱鍵。
|
||||
if input.isControlHold, input.isCommandHold, input.isEnter {
|
||||
IME.prtDebugIntel("1198E3E5")
|
||||
errorCallback()
|
||||
return true
|
||||
}
|
||||
|
||||
// Enter
|
||||
if input.isEnter {
|
||||
if let keyHandlerDelegate = delegate {
|
||||
|
@ -409,7 +416,25 @@ extension KeyHandler {
|
|||
) -> Bool {
|
||||
guard state is InputState.Inputting else { return false }
|
||||
|
||||
if input.isShiftHold {
|
||||
// 引入 macOS 內建注音輸入法的行為,允許用 Shift+BackSpace 解構前一個漢字的讀音。
|
||||
switch mgrPrefs.specifyShiftBackSpaceKeyBehavior {
|
||||
case 0:
|
||||
guard input.isShiftHold, composer.isEmpty else { break }
|
||||
guard let prevReading = previousParsableReading else { break }
|
||||
// prevReading 的內容分別是:「完整讀音」「去掉聲調的讀音」「是否有聲調」。
|
||||
compositor.dropKey(direction: .rear)
|
||||
walk() // 這裡必須 Walk 一次、來更新目前被 walk 的內容。
|
||||
prevReading.1.charComponents.forEach { composer.receiveKey(fromPhonabet: $0) }
|
||||
stateCallback(buildInputtingState)
|
||||
return true
|
||||
case 1:
|
||||
stateCallback(InputState.EmptyIgnoringPreviousState())
|
||||
stateCallback(InputState.Empty())
|
||||
return true
|
||||
default: break
|
||||
}
|
||||
|
||||
if input.isShiftHold, input.isOptionHold {
|
||||
stateCallback(InputState.EmptyIgnoringPreviousState())
|
||||
stateCallback(InputState.Empty())
|
||||
return true
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// marks, or product names of Contributor, except as required to fulfill notice
|
||||
// requirements defined in MIT License.
|
||||
|
||||
import Cocoa
|
||||
import Foundation
|
||||
|
||||
/// Shiki's Notes: The cursor index in the IMK inline composition buffer
|
||||
/// still uses UTF16 index measurements. This means that any attempt of
|
||||
|
@ -53,4 +53,10 @@ extension String {
|
|||
let arr = Array(utf16)[r].map { $0 }
|
||||
return String(utf16CodeUnits: arr, count: arr.count)
|
||||
}
|
||||
|
||||
public var charComponents: [String] { map { String($0) } }
|
||||
}
|
||||
|
||||
extension Array where Element == String.Element {
|
||||
public var charComponents: [String] { map { String($0) } }
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ extension ctlInputMethod {
|
|||
/// 這樣分開處理很有必要,不然 handle() 函式會陷入無限迴圈。
|
||||
/// - Parameter event: 由 IMK 選字窗接收的裝置操作輸入事件。
|
||||
/// - Returns: 回「`true`」以將該案件已攔截處理的訊息傳遞給 IMK;回「`false`」則放行、不作處理。
|
||||
func commonEventHandler(_ event: NSEvent!) -> Bool {
|
||||
func commonEventHandler(_ event: NSEvent) -> Bool {
|
||||
// 用 Shift 開關半形英數模式,僅對 macOS 10.15 及之後的 macOS 有效。
|
||||
let shouldUseHandle =
|
||||
(IME.arrClientShiftHandlingExceptionList.contains(clientBundleIdentifier)
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
// marks, or product names of Contributor, except as required to fulfill notice
|
||||
// requirements defined in MIT License.
|
||||
|
||||
import Cocoa
|
||||
import InputMethodKit
|
||||
|
||||
/// 輸入法控制模組,乃在輸入法端用以控制輸入行為的基礎型別。
|
||||
|
@ -111,8 +110,6 @@ class ctlInputMethod: IMKInputController {
|
|||
keyHandler.clear() // 這句不要砍,因為後面 handle State.Empty() 不一定執行。
|
||||
keyHandler.ensureParser()
|
||||
|
||||
mgrPrefs.fixOddPreferences()
|
||||
|
||||
if isASCIIMode {
|
||||
if mgrPrefs.disableShiftTogglingAlphanumericalMode {
|
||||
isASCIIMode = false
|
||||
|
@ -200,19 +197,24 @@ class ctlInputMethod: IMKInputController {
|
|||
|
||||
/// 接受所有鍵鼠事件為 NSEvent,讓輸入法判斷是否要處理、該怎樣處理。
|
||||
/// - Parameters:
|
||||
/// - event: 裝置操作輸入事件。
|
||||
/// - event: 裝置操作輸入事件,可能會是 nil。
|
||||
/// - sender: 呼叫了該函式的客體(無須使用)。
|
||||
/// - Returns: 回「`true`」以將該案件已攔截處理的訊息傳遞給 IMK;回「`false`」則放行、不作處理。
|
||||
@objc(handleEvent:client:) override func handle(_ event: NSEvent!, client sender: Any!) -> Bool {
|
||||
_ = sender // 防止格式整理工具毀掉與此對應的參數。
|
||||
|
||||
// 就這傳入的 NSEvent 都還有可能是 nil,Apple InputMethodKit 團隊到底在搞三小。
|
||||
guard let event = event else { return false }
|
||||
|
||||
// IMK 選字窗處理,當且僅當啟用了 IMK 選字窗的時候才會生效。
|
||||
// 這樣可以讓 interpretKeyEvents() 函式自行判斷:
|
||||
// - 是就地交給 super.interpretKeyEvents() 處理?
|
||||
// - 還是藉由 delegate 扔回 ctlInputMethod 給 KeyHandler 處理?
|
||||
if let ctlCandidateCurrent = ctlInputMethod.ctlCandidateCurrent as? ctlCandidateIMK, ctlCandidateCurrent.visible {
|
||||
let event: NSEvent! = ctlCandidateIMK.replaceNumPadKeyCodes(target: event) ?? event
|
||||
proc: if let ctlCandidateCurrent = ctlInputMethod.ctlCandidateCurrent as? ctlCandidateIMK {
|
||||
guard ctlCandidateCurrent.visible else { break proc }
|
||||
let event: NSEvent = ctlCandidateIMK.replaceNumPadKeyCodes(target: event) ?? event
|
||||
let input = InputSignal(event: event)
|
||||
|
||||
// Shift+Enter 是個特殊情形,不提前攔截處理的話、會有垃圾參數傳給 delegate 的 keyHandler 從而崩潰。
|
||||
// 所以這裡直接將 Shift Flags 清空。
|
||||
if input.isShiftHold, input.isEnter {
|
||||
|
@ -237,6 +239,7 @@ class ctlInputMethod: IMKInputController {
|
|||
return true
|
||||
}
|
||||
|
||||
// 聯想詞選字。
|
||||
if let newChar = ctlCandidateIMK.defaultIMKSelectionKey[event.keyCode], input.isShiftHold,
|
||||
isAssociatedPhrasesState
|
||||
{
|
||||
|
@ -273,6 +276,15 @@ class ctlInputMethod: IMKInputController {
|
|||
resetKeyHandler()
|
||||
}
|
||||
|
||||
/// 指定輸入法要遞交出去的內容(雖然威注音可能並未用到這個函式)。
|
||||
/// - Parameter sender: 呼叫了該函式的客體(無須使用)。
|
||||
/// - Returns: 字串內容,或者 nil。
|
||||
override func composedString(_ sender: Any!) -> Any! {
|
||||
_ = sender // 防止格式整理工具毀掉與此對應的參數。
|
||||
guard let state = state as? InputState.NotEmpty else { return "" }
|
||||
return state.committingBufferConverted
|
||||
}
|
||||
|
||||
// MARK: - IMKCandidates 功能擴充
|
||||
|
||||
/// 生成 IMK 選字窗專用的候選字串陣列。
|
||||
|
@ -329,6 +341,7 @@ class ctlInputMethod: IMKInputController {
|
|||
/// IMK 選字窗限定函式,只要選字窗確認了某個候選字詞的選擇、就會呼叫這個函式。
|
||||
/// - Parameter candidateString: 已經確認的候選字詞內容。
|
||||
override open func candidateSelected(_ candidateString: NSAttributedString!) {
|
||||
let candidateString: NSAttributedString = candidateString ?? .init(string: "")
|
||||
if state is InputState.AssociatedPhrases {
|
||||
if !mgrPrefs.alsoConfirmAssociatedCandidatesByEnter {
|
||||
handle(state: InputState.EmptyIgnoringPreviousState())
|
||||
|
|
|
@ -62,7 +62,7 @@ extension ctlInputMethod: ctlCandidateDelegate {
|
|||
/// 該函式僅由 IMK 選字窗來存取,且對接給 commonEventHandler()。
|
||||
/// - Parameter event: 由 IMK 選字窗接收的裝置操作輸入事件。
|
||||
/// - Returns: 回「`true`」以將該案件已攔截處理的訊息傳遞給 IMK;回「`false`」則放行、不作處理。
|
||||
@discardableResult func sharedEventHandler(_ event: NSEvent!) -> Bool {
|
||||
@discardableResult func sharedEventHandler(_ event: NSEvent) -> Bool {
|
||||
commonEventHandler(event)
|
||||
}
|
||||
|
||||
|
@ -121,12 +121,15 @@ extension ctlInputMethod: ctlCandidateDelegate {
|
|||
|
||||
if let state = state as? InputState.ChoosingCandidate {
|
||||
let selectedValue = state.candidates[index]
|
||||
keyHandler.fixNode(candidate: selectedValue, respectCursorPushing: true, preConsolidate: true)
|
||||
keyHandler.fixNode(
|
||||
candidate: selectedValue, respectCursorPushing: true,
|
||||
preConsolidate: mgrPrefs.consolidateContextOnCandidateSelection
|
||||
)
|
||||
|
||||
let inputting = keyHandler.buildInputtingState
|
||||
|
||||
if mgrPrefs.useSCPCTypingMode {
|
||||
handle(state: InputState.Committing(textToCommit: inputting.composingBuffer))
|
||||
handle(state: InputState.Committing(textToCommit: inputting.composingBufferConverted))
|
||||
// 此時是逐字選字模式,所以「selectedValue.1」是單個字、不用追加處理。
|
||||
if mgrPrefs.associatedPhrasesEnabled,
|
||||
let associatePhrases = keyHandler.buildAssociatePhraseState(
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
// requirements defined in MIT License.
|
||||
|
||||
import Cocoa
|
||||
import Foundation
|
||||
|
||||
// MARK: - Tooltip Display and Candidate Display Methods
|
||||
|
||||
|
|
|
@ -169,6 +169,10 @@ extension ctlInputMethod {
|
|||
withTitle: NSLocalizedString("About vChewing…", comment: ""),
|
||||
action: #selector(showAbout(_:)), keyEquivalent: ""
|
||||
)
|
||||
menu.addItem(
|
||||
withTitle: NSLocalizedString("CheatSheet", comment: "") + "…",
|
||||
action: #selector(showCheatSheet(_:)), keyEquivalent: ""
|
||||
)
|
||||
if optionKeyPressed {
|
||||
menu.addItem(
|
||||
withTitle: NSLocalizedString("Uninstall vChewing…", comment: ""),
|
||||
|
@ -188,22 +192,23 @@ extension ctlInputMethod {
|
|||
if #available(macOS 10.15, *) {
|
||||
NSApp.setActivationPolicy(.accessory)
|
||||
ctlPrefUI.shared.controller.show(preferencePane: Preferences.PaneIdentifier(rawValue: "General"))
|
||||
ctlPrefUI.shared.controller.window?.level = .floating
|
||||
ctlPrefUI.shared.controller.window?.level = .statusBar
|
||||
} else {
|
||||
showPrefWindowTraditional()
|
||||
showLegacyPreferences()
|
||||
}
|
||||
}
|
||||
|
||||
@objc func showLegacyPreferences(_: Any?) {
|
||||
showPrefWindowTraditional()
|
||||
}
|
||||
|
||||
private func showPrefWindowTraditional() {
|
||||
@objc func showLegacyPreferences(_: Any? = nil) {
|
||||
(NSApp.delegate as? AppDelegate)?.showPreferences()
|
||||
NSApp.activate(ignoringOtherApps: true)
|
||||
}
|
||||
|
||||
@objc func toggleSCPCTypingMode(_: Any?) {
|
||||
@objc func showCheatSheet(_: Any?) {
|
||||
guard let url = Bundle.main.url(forResource: "shortcuts", withExtension: "html") else { return }
|
||||
NSWorkspace.shared.openFile(url.path, withApplication: "Safari")
|
||||
}
|
||||
|
||||
@objc func toggleSCPCTypingMode(_: Any? = nil) {
|
||||
resetKeyHandler()
|
||||
NotifierController.notify(
|
||||
message: String(
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
// marks, or product names of Contributor, except as required to fulfill notice
|
||||
// requirements defined in MIT License.
|
||||
|
||||
import Carbon
|
||||
import Cocoa
|
||||
import InputMethodKit
|
||||
|
||||
// The namespace of this input method.
|
||||
public enum vChewing {}
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
// marks, or product names of Contributor, except as required to fulfill notice
|
||||
// requirements defined in MIT License.
|
||||
|
||||
import Carbon
|
||||
import Cocoa
|
||||
import InputMethodKit
|
||||
|
||||
public class InputSourceHelper: NSObject {
|
||||
@available(*, unavailable)
|
||||
|
|
|
@ -34,6 +34,8 @@ public enum UserDef: String, CaseIterable {
|
|||
case kHalfWidthPunctuationEnabled = "HalfWidthPunctuationEnable"
|
||||
case kMoveCursorAfterSelectingCandidate = "MoveCursorAfterSelectingCandidate"
|
||||
case kEscToCleanInputBuffer = "EscToCleanInputBuffer"
|
||||
case kSpecifyIntonationKeyBehavior = "SecifyIntonationKeyBehavior"
|
||||
case kSpecifyShiftBackSpaceKeyBehavior = "SpecifyShiftBackSpaceKeyBehavior"
|
||||
case kSpecifyShiftTabKeyBehavior = "SpecifyShiftTabKeyBehavior"
|
||||
case kSpecifyShiftSpaceKeyBehavior = "SpecifyShiftSpaceKeyBehavior"
|
||||
case kAllowBoostingSingleKanjiAsUserPhrase = "AllowBoostingSingleKanjiAsUserPhrase"
|
||||
|
@ -50,6 +52,7 @@ public enum UserDef: String, CaseIterable {
|
|||
case kTogglingAlphanumericalModeWithLShift = "TogglingAlphanumericalModeWithLShift"
|
||||
case kUpperCaseLetterKeyBehavior = "UpperCaseLetterKeyBehavior"
|
||||
case kDisableShiftTogglingAlphanumericalMode = "DisableShiftTogglingAlphanumericalMode"
|
||||
case kConsolidateContextOnCandidateSelection = "ConsolidateContextOnCandidateSelection"
|
||||
|
||||
case kUseIMKCandidateWindow = "UseIMKCandidateWindow"
|
||||
case kHandleDefaultCandidateFontsByLangIdentifier = "HandleDefaultCandidateFontsByLangIdentifier"
|
||||
|
@ -78,6 +81,8 @@ private let kMaxCandidateListTextSize: CGFloat = 196
|
|||
|
||||
private let kDefaultKeys = "123456789"
|
||||
|
||||
private let kDefaultBasicKeyboardLayout = "com.apple.keylayout.ZhuyinBopomofo"
|
||||
|
||||
// MARK: - UserDefaults extension.
|
||||
|
||||
extension UserDefaults {
|
||||
|
@ -136,7 +141,7 @@ struct CandidateListTextSize {
|
|||
|
||||
// MARK: -
|
||||
|
||||
enum MandarinParser: Int {
|
||||
enum MandarinParser: Int, CaseIterable {
|
||||
case ofStandard = 0
|
||||
case ofETen = 1
|
||||
case ofHsu = 2
|
||||
|
@ -215,6 +220,12 @@ public enum mgrPrefs {
|
|||
UserDefaults.standard.setDefault(
|
||||
mgrPrefs.shouldAutoReloadUserDataFiles, forKey: UserDef.kShouldAutoReloadUserDataFiles.rawValue
|
||||
)
|
||||
UserDefaults.standard.setDefault(
|
||||
mgrPrefs.specifyIntonationKeyBehavior, forKey: UserDef.kSpecifyIntonationKeyBehavior.rawValue
|
||||
)
|
||||
UserDefaults.standard.setDefault(
|
||||
mgrPrefs.specifyShiftBackSpaceKeyBehavior, forKey: UserDef.kSpecifyShiftBackSpaceKeyBehavior.rawValue
|
||||
)
|
||||
UserDefaults.standard.setDefault(
|
||||
mgrPrefs.specifyShiftTabKeyBehavior, forKey: UserDef.kSpecifyShiftTabKeyBehavior.rawValue
|
||||
)
|
||||
|
@ -283,6 +294,9 @@ public enum mgrPrefs {
|
|||
UserDefaults.standard.setDefault(
|
||||
mgrPrefs.disableShiftTogglingAlphanumericalMode, forKey: UserDef.kDisableShiftTogglingAlphanumericalMode.rawValue
|
||||
)
|
||||
UserDefaults.standard.setDefault(
|
||||
mgrPrefs.consolidateContextOnCandidateSelection, forKey: UserDef.kConsolidateContextOnCandidateSelection.rawValue
|
||||
)
|
||||
|
||||
// -----
|
||||
|
||||
|
@ -354,7 +368,7 @@ public enum mgrPrefs {
|
|||
}
|
||||
|
||||
@UserDefault(
|
||||
key: UserDef.kBasicKeyboardLayout.rawValue, defaultValue: "com.apple.keylayout.ZhuyinBopomofo"
|
||||
key: UserDef.kBasicKeyboardLayout.rawValue, defaultValue: kDefaultBasicKeyboardLayout
|
||||
)
|
||||
static var basicKeyboardLayout: String
|
||||
|
||||
|
@ -408,6 +422,9 @@ public enum mgrPrefs {
|
|||
@UserDefault(key: UserDef.kDisableShiftTogglingAlphanumericalMode.rawValue, defaultValue: false)
|
||||
static var disableShiftTogglingAlphanumericalMode: Bool
|
||||
|
||||
@UserDefault(key: UserDef.kConsolidateContextOnCandidateSelection.rawValue, defaultValue: true)
|
||||
static var consolidateContextOnCandidateSelection: Bool
|
||||
|
||||
// MARK: - Settings (Tier 2)
|
||||
|
||||
@UserDefault(key: UserDef.kUseIMKCandidateWindow.rawValue, defaultValue: false)
|
||||
|
@ -524,6 +541,12 @@ public enum mgrPrefs {
|
|||
@UserDefault(key: UserDef.kEscToCleanInputBuffer.rawValue, defaultValue: true)
|
||||
static var escToCleanInputBuffer: Bool
|
||||
|
||||
@UserDefault(key: UserDef.kSpecifyIntonationKeyBehavior.rawValue, defaultValue: 0)
|
||||
static var specifyIntonationKeyBehavior: Int
|
||||
|
||||
@UserDefault(key: UserDef.kSpecifyShiftBackSpaceKeyBehavior.rawValue, defaultValue: 0)
|
||||
static var specifyShiftBackSpaceKeyBehavior: Int
|
||||
|
||||
@UserDefault(key: UserDef.kSpecifyShiftTabKeyBehavior.rawValue, defaultValue: false)
|
||||
static var specifyShiftTabKeyBehavior: Bool
|
||||
|
||||
|
@ -695,6 +718,54 @@ extension mgrPrefs {
|
|||
mgrPrefs.disableShiftTogglingAlphanumericalMode = false
|
||||
mgrPrefs.togglingAlphanumericalModeWithLShift = false
|
||||
}
|
||||
// 介面語言選項糾錯。
|
||||
var filteredAppleLanguages = Set<String>()
|
||||
appleLanguages.forEach {
|
||||
if IME.arrSupportedLocales.contains($0) {
|
||||
filteredAppleLanguages.insert($0)
|
||||
}
|
||||
}
|
||||
if !filteredAppleLanguages.isEmpty {
|
||||
appleLanguages = Array(filteredAppleLanguages)
|
||||
} else {
|
||||
UserDefaults.standard.removeObject(forKey: UserDef.kAppleLanguages.rawValue)
|
||||
}
|
||||
// 注拼槽注音排列選項糾錯。
|
||||
var isMandarinParserOptionValid = false
|
||||
MandarinParser.allCases.forEach {
|
||||
if $0.rawValue == mandarinParser { isMandarinParserOptionValid = true }
|
||||
}
|
||||
if !isMandarinParserOptionValid {
|
||||
mandarinParser = 0
|
||||
}
|
||||
// 基礎鍵盤排列選項糾錯。
|
||||
var inputSourceTIS: TISInputSource? {
|
||||
var result: TISInputSource?
|
||||
let list = TISCreateInputSourceList(nil, true).takeRetainedValue() as! [TISInputSource]
|
||||
let matchedTISString = mgrPrefs.basicKeyboardLayout
|
||||
for source in list {
|
||||
guard let ptrCat = TISGetInputSourceProperty(source, kTISPropertyInputSourceCategory) else { continue }
|
||||
let category = Unmanaged<CFString>.fromOpaque(ptrCat).takeUnretainedValue()
|
||||
guard category == kTISCategoryKeyboardInputSource else { continue }
|
||||
guard let ptrSourceID = TISGetInputSourceProperty(source, kTISPropertyInputSourceID) else { continue }
|
||||
let sourceID = String(Unmanaged<CFString>.fromOpaque(ptrSourceID).takeUnretainedValue())
|
||||
if sourceID == matchedTISString { result = source }
|
||||
}
|
||||
return result
|
||||
}
|
||||
if inputSourceTIS == nil {
|
||||
mgrPrefs.basicKeyboardLayout = kDefaultBasicKeyboardLayout
|
||||
}
|
||||
// 其它多元選項參數自動糾錯。
|
||||
if ![0, 1, 2].contains(specifyIntonationKeyBehavior) {
|
||||
specifyIntonationKeyBehavior = 0
|
||||
}
|
||||
if ![0, 1, 2].contains(specifyShiftBackSpaceKeyBehavior) {
|
||||
specifyShiftBackSpaceKeyBehavior = 0
|
||||
}
|
||||
if ![0, 1, 2].contains(upperCaseLetterKeyBehavior) {
|
||||
upperCaseLetterKeyBehavior = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ extension vChewing {
|
|||
public func valuesFor(key: String) -> [String] {
|
||||
var pairs: [String] = []
|
||||
if let arrRangeRecords: String = rangeMap[key] {
|
||||
pairs.append(contentsOf: arrRangeRecords.map { String($0) })
|
||||
pairs.append(contentsOf: arrRangeRecords.charComponents)
|
||||
}
|
||||
var set = Set<String>()
|
||||
return pairs.filter { set.insert($0).inserted }
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// marks, or product names of Contributor, except as required to fulfill notice
|
||||
// requirements defined in MIT License.
|
||||
|
||||
import Cocoa
|
||||
import Foundation
|
||||
|
||||
/// 我們不能讓 mgrLangModel 這個靜態管理器來承載下面這些副本變數。
|
||||
/// 所以,這些副本變數只能放在 mgrLangModel 的外部。
|
||||
|
|
|
@ -28,7 +28,7 @@ public class CandidateKeyLabel: NSObject {
|
|||
|
||||
public protocol ctlCandidateDelegate: AnyObject {
|
||||
var isAssociatedPhrasesState: Bool { get }
|
||||
func sharedEventHandler(_ event: NSEvent!) -> Bool
|
||||
func sharedEventHandler(_ event: NSEvent) -> Bool
|
||||
func candidateCountForController(_ controller: ctlCandidateProtocol) -> Int
|
||||
func candidatesForController(_ controller: ctlCandidateProtocol) -> [(String, String)]
|
||||
func ctlCandidate(_ controller: ctlCandidateProtocol, candidateAtIndex index: Int)
|
||||
|
@ -116,19 +116,19 @@ public class ctlCandidate: NSWindowController, ctlCandidateProtocol {
|
|||
|
||||
public func reloadData() {}
|
||||
|
||||
public func showNextPage() -> Bool {
|
||||
@discardableResult public func showNextPage() -> Bool {
|
||||
false
|
||||
}
|
||||
|
||||
public func showPreviousPage() -> Bool {
|
||||
@discardableResult public func showPreviousPage() -> Bool {
|
||||
false
|
||||
}
|
||||
|
||||
public func highlightNextCandidate() -> Bool {
|
||||
@discardableResult public func highlightNextCandidate() -> Bool {
|
||||
false
|
||||
}
|
||||
|
||||
public func highlightPreviousCandidate() -> Bool {
|
||||
@discardableResult public func highlightPreviousCandidate() -> Bool {
|
||||
false
|
||||
}
|
||||
|
||||
|
|
|
@ -20,15 +20,7 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol {
|
|||
}
|
||||
}
|
||||
|
||||
public var visible: Bool = false {
|
||||
didSet {
|
||||
if visible {
|
||||
show()
|
||||
} else {
|
||||
hide()
|
||||
}
|
||||
}
|
||||
}
|
||||
public var visible: Bool = false { didSet { visible ? show() : hide() } }
|
||||
|
||||
public var windowTopLeftPoint: NSPoint {
|
||||
get {
|
||||
|
@ -124,99 +116,50 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol {
|
|||
private var currentPageIndex: Int = 0
|
||||
|
||||
private var pageCount: Int {
|
||||
guard let delegate = delegate else {
|
||||
return 0
|
||||
}
|
||||
guard let delegate = delegate else { return 0 }
|
||||
let totalCount = delegate.candidateCountForController(self)
|
||||
let keyLabelCount = keyLabels.count
|
||||
return totalCount / keyLabelCount + ((totalCount % keyLabelCount) != 0 ? 1 : 0)
|
||||
}
|
||||
|
||||
public func showNextPage() -> Bool {
|
||||
guard delegate != nil else { return false }
|
||||
if pageCount == 1 { return highlightNextCandidate() }
|
||||
if currentPageIndex + 1 >= pageCount { clsSFX.beep() }
|
||||
currentPageIndex = (currentPageIndex + 1 >= pageCount) ? 0 : currentPageIndex + 1
|
||||
if selectedCandidateIndex == candidates(self).count - 1 { return false }
|
||||
selectedCandidateIndex = min(selectedCandidateIndex + keyCount, candidates(self).count - 1)
|
||||
switch currentLayout {
|
||||
case .horizontal:
|
||||
moveDown(self)
|
||||
case .vertical:
|
||||
moveRight(self)
|
||||
}
|
||||
// 該函式會影響 IMK 選字窗。
|
||||
@discardableResult public func showNextPage() -> Bool {
|
||||
do { currentLayout == .vertical ? moveRight(self) : moveDown(self) }
|
||||
return true
|
||||
}
|
||||
|
||||
public func showPreviousPage() -> Bool {
|
||||
guard delegate != nil else { return false }
|
||||
if pageCount == 1 { return highlightPreviousCandidate() }
|
||||
if currentPageIndex == 0 { clsSFX.beep() }
|
||||
currentPageIndex = (currentPageIndex == 0) ? pageCount - 1 : currentPageIndex - 1
|
||||
if selectedCandidateIndex == 0 { return true }
|
||||
selectedCandidateIndex = max(selectedCandidateIndex - keyCount, 0)
|
||||
switch currentLayout {
|
||||
case .horizontal:
|
||||
moveUp(self)
|
||||
case .vertical:
|
||||
moveLeft(self)
|
||||
}
|
||||
// 該函式會影響 IMK 選字窗。
|
||||
@discardableResult public func showPreviousPage() -> Bool {
|
||||
do { currentLayout == .vertical ? moveLeft(self) : moveUp(self) }
|
||||
return true
|
||||
}
|
||||
|
||||
public func highlightNextCandidate() -> Bool {
|
||||
guard let delegate = delegate else { return false }
|
||||
selectedCandidateIndex =
|
||||
(selectedCandidateIndex + 1 >= delegate.candidateCountForController(self))
|
||||
? 0 : selectedCandidateIndex + 1
|
||||
switch currentLayout {
|
||||
case .horizontal:
|
||||
moveRight(self)
|
||||
// 該函式會影響 IMK 選字窗。
|
||||
@discardableResult public func highlightNextCandidate() -> Bool {
|
||||
do { currentLayout == .vertical ? moveDown(self) : moveRight(self) }
|
||||
return true
|
||||
case .vertical:
|
||||
moveDown(self)
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
public func highlightPreviousCandidate() -> Bool {
|
||||
guard let delegate = delegate else { return false }
|
||||
selectedCandidateIndex =
|
||||
(selectedCandidateIndex == 0)
|
||||
? delegate.candidateCountForController(self) - 1 : selectedCandidateIndex - 1
|
||||
switch currentLayout {
|
||||
case .horizontal:
|
||||
moveLeft(self)
|
||||
// 該函式會影響 IMK 選字窗。
|
||||
@discardableResult public func highlightPreviousCandidate() -> Bool {
|
||||
do { currentLayout == .vertical ? moveUp(self) : moveLeft(self) }
|
||||
return true
|
||||
case .vertical:
|
||||
moveUp(self)
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
public func candidateIndexAtKeyLabelIndex(_ index: Int) -> Int {
|
||||
guard let delegate = delegate else {
|
||||
return Int.max
|
||||
}
|
||||
|
||||
guard let delegate = delegate else { return Int.max }
|
||||
let result = currentPageIndex * keyLabels.count + index
|
||||
return result < delegate.candidateCountForController(self) ? result : Int.max
|
||||
}
|
||||
|
||||
public var selectedCandidateIndex: Int {
|
||||
get {
|
||||
selectedCandidate()
|
||||
}
|
||||
set {
|
||||
selectCandidate(withIdentifier: newValue)
|
||||
}
|
||||
get { selectedCandidate() }
|
||||
set { selectCandidate(withIdentifier: newValue) }
|
||||
}
|
||||
|
||||
public func set(windowTopLeftPoint: NSPoint, bottomOutOfScreenAdjustmentHeight height: CGFloat) {
|
||||
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) {
|
||||
self.doSet(
|
||||
windowTopLeftPoint: windowTopLeftPoint, bottomOutOfScreenAdjustmentHeight: height
|
||||
)
|
||||
self.doSet(windowTopLeftPoint: windowTopLeftPoint, bottomOutOfScreenAdjustmentHeight: height)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -235,9 +178,7 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol {
|
|||
}
|
||||
}
|
||||
|
||||
if adjustedHeight > screenFrame.size.height / 2.0 {
|
||||
adjustedHeight = 0.0
|
||||
}
|
||||
if adjustedHeight > screenFrame.size.height / 2.0 { adjustedHeight = 0.0 }
|
||||
|
||||
let windowSize = candidateFrame().size
|
||||
|
||||
|
@ -247,9 +188,7 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol {
|
|||
}
|
||||
|
||||
// top over the screen?
|
||||
if adjustedPoint.y >= screenFrame.maxY {
|
||||
adjustedPoint.y = screenFrame.maxY - 1.0
|
||||
}
|
||||
if adjustedPoint.y >= screenFrame.maxY { adjustedPoint.y = screenFrame.maxY - 1.0 }
|
||||
|
||||
// right
|
||||
if adjustedPoint.x + windowSize.width >= screenFrame.maxX {
|
||||
|
@ -257,9 +196,7 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol {
|
|||
}
|
||||
|
||||
// left
|
||||
if adjustedPoint.x < screenFrame.minX {
|
||||
adjustedPoint.x = screenFrame.minX
|
||||
}
|
||||
if adjustedPoint.x < screenFrame.minX { adjustedPoint.x = screenFrame.minX }
|
||||
|
||||
setCandidateFrameTopLeft(adjustedPoint)
|
||||
}
|
||||
|
@ -273,36 +210,21 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol {
|
|||
guard let delegate = delegate else { return }
|
||||
if input.isEsc || input.isBackSpace || input.isDelete || (input.isShiftHold && !input.isSpace) {
|
||||
_ = delegate.sharedEventHandler(event)
|
||||
} else if input.isSymbolMenuPhysicalKey || input.isSpace {
|
||||
if input.isShiftHold {
|
||||
} else if input.isSymbolMenuPhysicalKey {
|
||||
// 符號鍵的行為是固定的,不受偏好設定影響。
|
||||
switch currentLayout {
|
||||
case .horizontal:
|
||||
moveUp(self)
|
||||
case .vertical:
|
||||
moveLeft(self)
|
||||
}
|
||||
} else {
|
||||
switch currentLayout {
|
||||
case .horizontal:
|
||||
moveDown(self)
|
||||
case .vertical:
|
||||
moveRight(self)
|
||||
case .horizontal: input.isShiftHold ? moveUp(self) : moveDown(self)
|
||||
case .vertical: input.isShiftHold ? moveLeft(self) : moveRight(self)
|
||||
}
|
||||
} else if input.isSpace {
|
||||
switch mgrPrefs.specifyShiftSpaceKeyBehavior {
|
||||
case true: _ = input.isShiftHold ? highlightNextCandidate() : showNextPage()
|
||||
case false: _ = input.isShiftHold ? showNextPage() : highlightNextCandidate()
|
||||
}
|
||||
} else if input.isTab {
|
||||
switch currentLayout {
|
||||
case .horizontal:
|
||||
if input.isShiftHold {
|
||||
moveLeft(self)
|
||||
} else {
|
||||
moveRight(self)
|
||||
}
|
||||
case .vertical:
|
||||
if input.isShiftHold {
|
||||
moveUp(self)
|
||||
} else {
|
||||
moveDown(self)
|
||||
}
|
||||
switch mgrPrefs.specifyShiftTabKeyBehavior {
|
||||
case true: _ = input.isShiftHold ? showPreviousPage() : showNextPage()
|
||||
case false: _ = input.isShiftHold ? highlightPreviousCandidate() : highlightNextCandidate()
|
||||
}
|
||||
} else {
|
||||
if let newChar = ctlCandidateIMK.defaultIMKSelectionKey[event.keyCode] {
|
||||
|
@ -334,12 +256,10 @@ public class ctlCandidateIMK: IMKCandidates, ctlCandidateProtocol {
|
|||
}
|
||||
}
|
||||
|
||||
if mgrPrefs.useSCPCTypingMode {
|
||||
if !input.isReservedKey {
|
||||
if mgrPrefs.useSCPCTypingMode, !input.isReservedKey {
|
||||
_ = delegate.sharedEventHandler(event)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if delegate.isAssociatedPhrasesState,
|
||||
!input.isPageUp, !input.isPageDown, !input.isCursorForward, !input.isCursorBackward,
|
||||
|
|
|
@ -432,7 +432,7 @@ public class ctlCandidateUniversal: ctlCandidate {
|
|||
layoutCandidateView()
|
||||
}
|
||||
|
||||
override public func showNextPage() -> Bool {
|
||||
@discardableResult override public func showNextPage() -> Bool {
|
||||
guard delegate != nil else { return false }
|
||||
if pageCount == 1 { return highlightNextCandidate() }
|
||||
if currentPageIndex + 1 >= pageCount { clsSFX.beep() }
|
||||
|
@ -445,7 +445,7 @@ public class ctlCandidateUniversal: ctlCandidate {
|
|||
return true
|
||||
}
|
||||
|
||||
override public func showPreviousPage() -> Bool {
|
||||
@discardableResult override public func showPreviousPage() -> Bool {
|
||||
guard delegate != nil else { return false }
|
||||
if pageCount == 1 { return highlightPreviousCandidate() }
|
||||
if currentPageIndex == 0 { clsSFX.beep() }
|
||||
|
@ -458,7 +458,7 @@ public class ctlCandidateUniversal: ctlCandidate {
|
|||
return true
|
||||
}
|
||||
|
||||
override public func highlightNextCandidate() -> Bool {
|
||||
@discardableResult override public func highlightNextCandidate() -> Bool {
|
||||
guard let delegate = delegate else { return false }
|
||||
selectedCandidateIndex =
|
||||
(selectedCandidateIndex + 1 >= delegate.candidateCountForController(self))
|
||||
|
@ -466,7 +466,7 @@ public class ctlCandidateUniversal: ctlCandidate {
|
|||
return true
|
||||
}
|
||||
|
||||
override public func highlightPreviousCandidate() -> Bool {
|
||||
@discardableResult override public func highlightPreviousCandidate() -> Bool {
|
||||
guard let delegate = delegate else { return false }
|
||||
selectedCandidateIndex =
|
||||
(selectedCandidateIndex == 0)
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
// marks, or product names of Contributor, except as required to fulfill notice
|
||||
// requirements defined in MIT License.
|
||||
|
||||
import Cocoa
|
||||
import SwiftUI
|
||||
|
||||
extension NSImage {
|
||||
|
@ -68,7 +67,7 @@ extension NSImage {
|
|||
|
||||
@available(macOS 10.15, *)
|
||||
class ctlPrefUI {
|
||||
lazy var controller = PreferencesWindowController(
|
||||
var controller = PreferencesWindowController(
|
||||
panes: [
|
||||
Preferences.Pane(
|
||||
identifier: Preferences.PaneIdentifier(rawValue: "General"),
|
||||
|
|
|
@ -25,6 +25,8 @@ struct suiPrefPaneDictionary: View {
|
|||
forKey: UserDef.kFetchSuggestionsFromUserOverrideModel.rawValue)
|
||||
@State private var selUseFixecCandidateOrderOnSelection: Bool = UserDefaults.standard.bool(
|
||||
forKey: UserDef.kUseFixecCandidateOrderOnSelection.rawValue)
|
||||
@State private var selConsolidateContextOnCandidateSelection: Bool = UserDefaults.standard.bool(
|
||||
forKey: UserDef.kConsolidateContextOnCandidateSelection.rawValue)
|
||||
|
||||
private let contentMaxHeight: Double = 430
|
||||
private let contentWidth: Double = {
|
||||
|
@ -112,7 +114,7 @@ struct suiPrefPaneDictionary: View {
|
|||
).controlSize(.small)
|
||||
Divider()
|
||||
Toggle(
|
||||
LocalizedStringKey("Enable CNS11643 Support (2022-07-20)"),
|
||||
LocalizedStringKey("Enable CNS11643 Support (2022-08-02)"),
|
||||
isOn: $selEnableCNS11643.onChange {
|
||||
mgrPrefs.cns11643Enabled = selEnableCNS11643
|
||||
mgrLangModel.setCNSEnabled(mgrPrefs.cns11643Enabled)
|
||||
|
@ -143,6 +145,12 @@ struct suiPrefPaneDictionary: View {
|
|||
mgrPrefs.useFixecCandidateOrderOnSelection = selUseFixecCandidateOrderOnSelection
|
||||
}
|
||||
)
|
||||
Toggle(
|
||||
LocalizedStringKey("Consolidate the context on confirming candidate selection"),
|
||||
isOn: $selConsolidateContextOnCandidateSelection.onChange {
|
||||
mgrPrefs.consolidateContextOnCandidateSelection = selConsolidateContextOnCandidateSelection
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
// marks, or product names of Contributor, except as required to fulfill notice
|
||||
// requirements defined in MIT License.
|
||||
|
||||
import Cocoa
|
||||
import SwiftUI
|
||||
|
||||
@available(macOS 10.15, *)
|
||||
|
@ -38,6 +37,10 @@ struct suiPrefPaneExperience: View {
|
|||
forKey: UserDef.kUpperCaseLetterKeyBehavior.rawValue)
|
||||
@State private var selDisableShiftTogglingAlphanumericalMode: Bool = UserDefaults.standard.bool(
|
||||
forKey: UserDef.kDisableShiftTogglingAlphanumericalMode.rawValue)
|
||||
@State private var selSpecifyIntonationKeyBehavior = UserDefaults.standard.integer(
|
||||
forKey: UserDef.kSpecifyIntonationKeyBehavior.rawValue)
|
||||
@State private var selSpecifyShiftBackSpaceKeyBehavior = UserDefaults.standard.integer(
|
||||
forKey: UserDef.kSpecifyShiftBackSpaceKeyBehavior.rawValue)
|
||||
|
||||
private let contentMaxHeight: Double = 430
|
||||
private let contentWidth: Double = {
|
||||
|
@ -55,6 +58,22 @@ struct suiPrefPaneExperience: View {
|
|||
|
||||
var body: some View {
|
||||
ScrollView {
|
||||
VStack {
|
||||
_VSpacer(minHeight: 24)
|
||||
Text(
|
||||
"\u{2022} "
|
||||
+ NSLocalizedString(
|
||||
"Please use mouse wheel to scroll this page. The CheatSheet is available in the IME menu.",
|
||||
comment: ""
|
||||
) + "\n\u{2022} "
|
||||
+ NSLocalizedString(
|
||||
"Note: The “Delete ⌫” key on Mac keyboard is named as “BackSpace ⌫” here in order to distinguish the real “Delete ⌦” key from full-sized desktop keyboards. If you want to use the real “Delete ⌦” key on a Mac keyboard with no numpad equipped, you have to press “Fn+⌫” instead.",
|
||||
comment: ""
|
||||
)
|
||||
)
|
||||
.preferenceDescription()
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
}.frame(maxWidth: contentWidth)
|
||||
Preferences.Container(contentWidth: contentWidth) {
|
||||
Preferences.Section(label: { Text(LocalizedStringKey("Cursor Selection:")) }) {
|
||||
Picker(
|
||||
|
@ -77,6 +96,22 @@ struct suiPrefPaneExperience: View {
|
|||
}
|
||||
).controlSize(.small)
|
||||
}
|
||||
Preferences.Section(label: { Text(LocalizedStringKey("Shift+BackSpace:")) }) {
|
||||
Picker(
|
||||
"",
|
||||
selection: $selSpecifyShiftBackSpaceKeyBehavior.onChange {
|
||||
mgrPrefs.specifyShiftBackSpaceKeyBehavior = selSpecifyShiftBackSpaceKeyBehavior
|
||||
}
|
||||
) {
|
||||
Text(LocalizedStringKey("Disassemble the previous reading, dropping its intonation")).tag(0)
|
||||
Text(LocalizedStringKey("Clear the entire inline composition buffer like Shift+Delete")).tag(1)
|
||||
Text(LocalizedStringKey("Always drop the previous reading")).tag(2)
|
||||
}
|
||||
.labelsHidden()
|
||||
.pickerStyle(RadioGroupPickerStyle())
|
||||
Text(LocalizedStringKey("Disassembling process does not work with non-phonetic reading keys."))
|
||||
.preferenceDescription()
|
||||
}
|
||||
Preferences.Section(title: "(Shift+)Tab:") {
|
||||
Picker(
|
||||
"",
|
||||
|
@ -124,6 +159,36 @@ struct suiPrefPaneExperience: View {
|
|||
Text(LocalizedStringKey("Choose the behavior of Shift+Letter key with letter inputs."))
|
||||
.preferenceDescription()
|
||||
}
|
||||
Preferences.Section(label: { Text(LocalizedStringKey("Intonation Key:")) }) {
|
||||
Picker(
|
||||
"",
|
||||
selection: $selSpecifyIntonationKeyBehavior.onChange {
|
||||
mgrPrefs.specifyIntonationKeyBehavior = selSpecifyIntonationKeyBehavior
|
||||
}
|
||||
) {
|
||||
Text(LocalizedStringKey("Override the previous reading's intonation with candidate-reset")).tag(0)
|
||||
Text(LocalizedStringKey("Only override the intonation of the previous reading if different")).tag(1)
|
||||
Text(LocalizedStringKey("Always type intonations to the inline composition buffer")).tag(2)
|
||||
}
|
||||
.labelsHidden()
|
||||
.pickerStyle(RadioGroupPickerStyle())
|
||||
Text(LocalizedStringKey("Specify the behavior of intonation key when syllable composer is empty."))
|
||||
.preferenceDescription()
|
||||
}
|
||||
Preferences.Section(title: "Shift:") {
|
||||
Toggle(
|
||||
LocalizedStringKey("Completely disable using Shift key to toggle alphanumerical mode"),
|
||||
isOn: $selDisableShiftTogglingAlphanumericalMode.onChange {
|
||||
mgrPrefs.disableShiftTogglingAlphanumericalMode = selDisableShiftTogglingAlphanumericalMode
|
||||
}
|
||||
)
|
||||
Toggle(
|
||||
LocalizedStringKey("Also toggle alphanumerical mode with Left-Shift"),
|
||||
isOn: $selTogglingAlphanumericalModeWithLShift.onChange {
|
||||
mgrPrefs.togglingAlphanumericalModeWithLShift = selTogglingAlphanumericalModeWithLShift
|
||||
}
|
||||
).disabled(mgrPrefs.disableShiftTogglingAlphanumericalMode == true)
|
||||
}
|
||||
Preferences.Section(label: { Text(LocalizedStringKey("Misc Settings:")) }) {
|
||||
Toggle(
|
||||
LocalizedStringKey("Enable Space key for calling candidate window"),
|
||||
|
@ -149,18 +214,6 @@ struct suiPrefPaneExperience: View {
|
|||
mgrPrefs.alsoConfirmAssociatedCandidatesByEnter = selAlsoConfirmAssociatedCandidatesByEnter
|
||||
}
|
||||
)
|
||||
Toggle(
|
||||
LocalizedStringKey("Also toggle alphanumerical mode with Left-Shift"),
|
||||
isOn: $selTogglingAlphanumericalModeWithLShift.onChange {
|
||||
mgrPrefs.togglingAlphanumericalModeWithLShift = selTogglingAlphanumericalModeWithLShift
|
||||
}
|
||||
).disabled(mgrPrefs.disableShiftTogglingAlphanumericalMode == true)
|
||||
Toggle(
|
||||
LocalizedStringKey("Completely disable using Shift key to toggling alphanumerical mode"),
|
||||
isOn: $selDisableShiftTogglingAlphanumericalMode.onChange {
|
||||
mgrPrefs.disableShiftTogglingAlphanumericalMode = selDisableShiftTogglingAlphanumericalMode
|
||||
}
|
||||
)
|
||||
Toggle(
|
||||
LocalizedStringKey("Allow backspace-editing miscomposed readings"),
|
||||
isOn: $selKeepReadingUponCompositionError.onChange {
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
// marks, or product names of Contributor, except as required to fulfill notice
|
||||
// requirements defined in MIT License.
|
||||
|
||||
import Cocoa
|
||||
import SwiftUI
|
||||
|
||||
@available(macOS 10.15, *)
|
||||
|
@ -52,8 +51,6 @@ struct suiPrefPaneGeneral: View {
|
|||
}
|
||||
}()
|
||||
|
||||
let enabledFontSizes = [12, 14, 16, 17, 18, 20, 22, 24, 32, 64, 96]
|
||||
|
||||
var body: some View {
|
||||
ScrollView {
|
||||
Preferences.Container(contentWidth: contentWidth) {
|
||||
|
@ -64,9 +61,21 @@ struct suiPrefPaneGeneral: View {
|
|||
mgrPrefs.candidateListTextSize = CGFloat(selCandidateUIFontSize)
|
||||
}
|
||||
) {
|
||||
ForEach(0...(enabledFontSizes.count - 1), id: \.self) { id in
|
||||
Text(String(enabledFontSizes[id])).tag(enabledFontSizes[id])
|
||||
}.id(UUID())
|
||||
Group {
|
||||
Text("12").tag(12)
|
||||
Text("14").tag(14)
|
||||
Text("16").tag(16)
|
||||
Text("17").tag(17)
|
||||
Text("18").tag(18)
|
||||
Text("20").tag(20)
|
||||
Text("22").tag(22)
|
||||
Text("24").tag(24)
|
||||
}
|
||||
Group {
|
||||
Text("32").tag(32)
|
||||
Text("64").tag(64)
|
||||
Text("96").tag(96)
|
||||
}
|
||||
}
|
||||
.labelsHidden()
|
||||
.frame(width: 120.0)
|
||||
|
|
|
@ -68,6 +68,14 @@ struct suiPrefPaneKeyboard: View {
|
|||
}
|
||||
}
|
||||
).frame(width: 180).disabled(mgrPrefs.useIMKCandidateWindow)
|
||||
if mgrPrefs.useIMKCandidateWindow {
|
||||
Text(
|
||||
LocalizedStringKey(
|
||||
"⚠︎ This feature in IMK Candidate Window defects. Please consult Apple Developer Relations\nand tell them the related Radar ID: #FB11300759."
|
||||
)
|
||||
)
|
||||
.preferenceDescription()
|
||||
} else {
|
||||
Text(
|
||||
LocalizedStringKey(
|
||||
"Choose or hit Enter to confim your prefered keys for selecting candidates."
|
||||
|
@ -75,6 +83,7 @@ struct suiPrefPaneKeyboard: View {
|
|||
)
|
||||
.preferenceDescription()
|
||||
}
|
||||
}
|
||||
Preferences.Section(label: { Text(LocalizedStringKey("Phonetic Parser:")) }) {
|
||||
HStack {
|
||||
Picker(
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
"vChewing crashed while handling previously loaded UOM observation data. These data files are cleaned now to ensure the usability." = "vChewing crashed while handling previously loaded UOM observation data. These data files are cleaned now to ensure the usability.";
|
||||
"About vChewing…" = "About vChewing…";
|
||||
"vChewing Preferences…" = "vChewing Preferences…";
|
||||
"CheatSheet" = "CheatSheet";
|
||||
"Uninstallation" = "Uninstallation";
|
||||
"Uninstall vChewing…" = "Uninstall vChewing…";
|
||||
"This will remove vChewing Input Method from this user account, requiring your confirmation." = "This will remove vChewing Input Method from this user account, requiring your confirmation.";
|
||||
|
@ -58,9 +59,6 @@
|
|||
"Symbol & Emoji Input" = "Symbol & Emoji Input";
|
||||
"Edit User Symbol & Emoji Data…" = "Edit User Symbol & Emoji Data…";
|
||||
"Choose your desired user data folder." = "Choose your desired user data folder.";
|
||||
"Cursor is between \"%@\" and \"%@\"." = "Cursor is between \"%@\" and \"%@\".";
|
||||
"Cursor is to the rear of \"%@\"." = "Cursor is to the rear of \"%@\".";
|
||||
"Cursor is in front of \"%@\"." = "Cursor is in front of \"%@\".";
|
||||
"Loading CHS Core Dict..." = "Loading CHS Core Dict...";
|
||||
"Loading CHT Core Dict..." = "Loading CHT Core Dict...";
|
||||
"Core Dict loading complete." = "Core Dict loading complete.";
|
||||
|
@ -88,10 +86,13 @@
|
|||
|
||||
// SwiftUI Preferences
|
||||
"(Shift+)Space:" = "(Shift+)Space:";
|
||||
"⚠︎ This feature in IMK Candidate Window defects. Please consult Apple Developer Relations\nand tell them the related Radar ID: #FB11300759." = "⚠︎ This feature in IMK Candidate Window defects. Please consult Apple Developer Relations\nand tell them the related Radar ID: #FB11300759.";
|
||||
"Allow backspace-editing miscomposed readings" = "Allow backspace-editing miscomposed readings";
|
||||
"Allow boosting / excluding a candidate of single kanji" = "Allow boosting / excluding a candidate of single kanji";
|
||||
"Allow using Enter key to confirm associated candidate selection" = "Allow using Enter key to confirm associated candidate selection";
|
||||
"Also toggle alphanumerical mode with Left-Shift" = "Also toggle alphanumerical mode with Left-Shift";
|
||||
"Always drop the previous reading" = "Always drop the previous reading";
|
||||
"Always type intonations to the inline composition buffer" = "Always type intonations to the inline composition buffer";
|
||||
"Always use fixed listing order in candidate window" = "Always use fixed listing order in candidate window";
|
||||
"An accommodation for elder computer users." = "An accommodation for elder computer users.";
|
||||
"Apple ABC (equivalent to English US)" = "Apple ABC (equivalent to English US)";
|
||||
|
@ -119,8 +120,10 @@
|
|||
"Choose the phonetic layout for Mandarin parser." = "Choose the phonetic layout for Mandarin parser.";
|
||||
"Choose your desired user data folder path. Will be omitted if invalid." = "Choose your desired user data folder path. Will be omitted if invalid.";
|
||||
"Choose your preferred layout of the candidate window." = "Choose your preferred layout of the candidate window.";
|
||||
"Clear the entire inline composition buffer like Shift+Delete" = "Clear the entire inline composition buffer like Shift+Delete";
|
||||
"Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" = "Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter";
|
||||
"Completely disable using Shift key to toggling alphanumerical mode" = "Completely disable using Shift key to toggling alphanumerical mode";
|
||||
"Completely disable using Shift key to toggle alphanumerical mode" = "Completely disable using Shift key to toggle alphanumerical mode";
|
||||
"Consolidate the context on confirming candidate selection" = "Consolidate the context on confirming candidate selection";
|
||||
"Cursor Selection:" = "Cursor Selection:";
|
||||
"Dachen (Microsoft Standard / Wang / 01, etc.)" = "Dachen (Microsoft Standard / Wang / 01, etc.)";
|
||||
"Dachen 26 (libChewing)" = "Dachen 26 (libChewing)";
|
||||
|
@ -129,8 +132,10 @@
|
|||
"Dictionary" = "Dictionary";
|
||||
"Directly commit lowercased letters" = "Directly commit lowercased letters";
|
||||
"Directly commit uppercased letters" = "Directly commit uppercased letters";
|
||||
"Disassemble the previous reading, dropping its intonation" = "Disassemble the previous reading, dropping its intonation";
|
||||
"Disassembling process does not work with non-phonetic reading keys." = "Disassembling process does not work with non-phonetic reading keys.";
|
||||
"Emulating select-candidate-per-character mode" = "Emulating select-candidate-per-character mode";
|
||||
"Enable CNS11643 Support (2022-07-20)" = "Enable CNS11643 Support (2022-07-20)";
|
||||
"Enable CNS11643 Support (2022-08-02)" = "Enable CNS11643 Support (2022-08-02)";
|
||||
"Enable Space key for calling candidate window" = "Enable Space key for calling candidate window";
|
||||
"Enable symbol input support (incl. certain emoji symbols)" = "Enable symbol input support (incl. certain emoji symbols)";
|
||||
"English" = "English";
|
||||
|
@ -149,18 +154,24 @@
|
|||
"IBM" = "IBM";
|
||||
"IMK candidate window relies on certain Apple private APIs which are force-exposed by using bridging headers. Its usability, at this moment, is only guaranteed from macOS 10.14 Mojave to macOS 13 Ventura. Further tests are required in the future in order to tell whether it is usable in newer macOS releases." = "IMK candidate window relies on certain Apple private APIs which are force-exposed by using bridging headers. Its usability, at this moment, is only guaranteed from macOS 10.14 Mojave to macOS 13 Ventura. Further tests are required in the future in order to tell whether it is usable in newer macOS releases.";
|
||||
"in front of the phrase (like macOS built-in Zhuyin IME)" = "in front of the phrase (like macOS built-in Zhuyin IME)";
|
||||
"Intonation Key:" = "Intonation Key:";
|
||||
"Japanese" = "Japanese";
|
||||
"Keyboard Shortcuts:" = "Keyboard Shortcuts:";
|
||||
"Keyboard" = "Keyboard";
|
||||
"Misc Settings:" = "Misc Settings:";
|
||||
"MiTAC" = "MiTAC";
|
||||
"Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only." = "Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only.";
|
||||
"Note: The “Delete ⌫” key on Mac keyboard is named as “BackSpace ⌫” here in order to distinguish the real “Delete ⌦” key from full-sized desktop keyboards. If you want to use the real “Delete ⌦” key on a Mac keyboard with no numpad equipped, you have to press “Fn+⌫” instead." = "Note: The “Delete ⌫” key on Mac keyboard is named as “BackSpace ⌫” here in order to distinguish the real “Delete ⌦” key from full-sized desktop keyboards. If you want to use the real “Delete ⌦” key on a Mac keyboard with no numpad equipped, you have to press “Fn+⌫” instead.";
|
||||
"Only override the intonation of the previous reading if different" = "Only override the intonation of the previous reading if different";
|
||||
"Output Settings:" = "Output Settings:";
|
||||
"Override the previous reading's intonation with candidate-reset" = "Override the previous reading's intonation with candidate-reset";
|
||||
"Phonetic Parser:" = "Phonetic Parser:";
|
||||
"Please use mouse wheel to scroll this page. The CheatSheet is available in the IME menu." = "Please use mouse wheel to scroll this page. The CheatSheet is available in the IME menu.";
|
||||
"Push the cursor in front of the phrase after selection" = "Push the cursor in front of the phrase after selection";
|
||||
"Secondary Pinyin with Numeral Intonation" = "Secondary Pinyin with Numeral Intonation";
|
||||
"Seigyou" = "Seigyou (JinYei)";
|
||||
"Selection Keys:" = "Selection Keys:";
|
||||
"Shift+BackSpace:" = "Shift+BackSpace:";
|
||||
"Shift+Letter:" = "Shift+Letter:";
|
||||
"Show Hanyu-Pinyin in the inline composition buffer & tooltip" = "Show Hanyu-Pinyin in the inline composition buffer & tooltip";
|
||||
"Show page buttons in candidate window" = "Show page buttons in candidate window";
|
||||
|
@ -168,6 +179,7 @@
|
|||
"Some client apps (like Chromium-cored browsers: MS Edge, Google Chrome, etc.) may duplicate Shift-key inputs due to their internal bugs, and their devs are less likely to fix their bugs of such. vChewing has its accommodation procedures enabled by default for known Chromium-cored browsers. If you want the same accommodation for other client apps, please tick this checkbox on." = "Some client apps (like Chromium-cored browsers: MS Edge, Google Chrome, etc.) may duplicate Shift-key inputs due to their internal bugs, and their devs are less likely to fix their bugs of such. vChewing has its accommodation procedures enabled by default for known Chromium-cored browsers. If you want the same accommodation for other client apps, please tick this checkbox on.";
|
||||
"Space to +cycle candidates, Shift+Space to +cycle pages" = "Space to +cycle candidates, Shift+Space to +cycle pages";
|
||||
"Space to +cycle pages, Shift+Space to +cycle candidates" = "Space to +cycle pages, Shift+Space to +cycle candidates";
|
||||
"Specify the behavior of intonation key when syllable composer is empty." = "Specify the behavior of intonation key when syllable composer is empty.";
|
||||
"Starlight" = "Starlight";
|
||||
"Stop farting (when typed phonetic combination is invalid, etc.)" = "Stop farting (when typed phonetic combination is invalid, etc.)";
|
||||
"This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later." = "This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later.";
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
"vChewing crashed while handling previously loaded UOM observation data. These data files are cleaned now to ensure the usability." = "vChewing crashed while handling previously loaded UOM observation data. These data files are cleaned now to ensure the usability.";
|
||||
"About vChewing…" = "About vChewing…";
|
||||
"vChewing Preferences…" = "vChewing Preferences…";
|
||||
"CheatSheet" = "CheatSheet";
|
||||
"Uninstallation" = "Uninstallation";
|
||||
"Uninstall vChewing…" = "Uninstall vChewing…";
|
||||
"This will remove vChewing Input Method from this user account, requiring your confirmation." = "This will remove vChewing Input Method from this user account, requiring your confirmation.";
|
||||
|
@ -58,9 +59,6 @@
|
|||
"Symbol & Emoji Input" = "Symbol & Emoji Input";
|
||||
"Edit User Symbol & Emoji Data…" = "Edit User Symbol & Emoji Data…";
|
||||
"Choose your desired user data folder." = "Choose your desired user data folder.";
|
||||
"Cursor is between \"%@\" and \"%@\"." = "Cursor is between \"%@\" and \"%@\".";
|
||||
"Cursor is to the rear of \"%@\"." = "Cursor is to the rear of \"%@\".";
|
||||
"Cursor is in front of \"%@\"." = "Cursor is in front of \"%@\".";
|
||||
"Loading CHS Core Dict..." = "Loading CHS Core Dict...";
|
||||
"Loading CHT Core Dict..." = "Loading CHT Core Dict...";
|
||||
"Core Dict loading complete." = "Core Dict loading complete.";
|
||||
|
@ -88,10 +86,13 @@
|
|||
|
||||
// SwiftUI Preferences
|
||||
"(Shift+)Space:" = "(Shift+)Space:";
|
||||
"⚠︎ This feature in IMK Candidate Window defects. Please consult Apple Developer Relations\nand tell them the related Radar ID: #FB11300759." = "⚠︎ This feature in IMK Candidate Window defects. Please consult Apple Developer Relations\nand tell them the related Radar ID: #FB11300759.";
|
||||
"Allow backspace-editing miscomposed readings" = "Allow backspace-editing miscomposed readings";
|
||||
"Allow boosting / excluding a candidate of single kanji" = "Allow boosting / excluding a candidate of single kanji";
|
||||
"Allow using Enter key to confirm associated candidate selection" = "Allow using Enter key to confirm associated candidate selection";
|
||||
"Also toggle alphanumerical mode with Left-Shift" = "Also toggle alphanumerical mode with Left-Shift";
|
||||
"Always drop the previous reading" = "Always drop the previous reading";
|
||||
"Always type intonations to the inline composition buffer" = "Always type intonations to the inline composition buffer";
|
||||
"Always use fixed listing order in candidate window" = "Always use fixed listing order in candidate window";
|
||||
"An accommodation for elder computer users." = "An accommodation for elder computer users.";
|
||||
"Apple ABC (equivalent to English US)" = "Apple ABC (equivalent to English US)";
|
||||
|
@ -119,8 +120,10 @@
|
|||
"Choose the phonetic layout for Mandarin parser." = "Choose the phonetic layout for Mandarin parser.";
|
||||
"Choose your desired user data folder path. Will be omitted if invalid." = "Choose your desired user data folder path. Will be omitted if invalid.";
|
||||
"Choose your preferred layout of the candidate window." = "Choose your preferred layout of the candidate window.";
|
||||
"Clear the entire inline composition buffer like Shift+Delete" = "Clear the entire inline composition buffer like Shift+Delete";
|
||||
"Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" = "Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter";
|
||||
"Completely disable using Shift key to toggling alphanumerical mode" = "Completely disable using Shift key to toggling alphanumerical mode";
|
||||
"Completely disable using Shift key to toggle alphanumerical mode" = "Completely disable using Shift key to toggle alphanumerical mode";
|
||||
"Consolidate the context on confirming candidate selection" = "Consolidate the context on confirming candidate selection";
|
||||
"Cursor Selection:" = "Cursor Selection:";
|
||||
"Dachen (Microsoft Standard / Wang / 01, etc.)" = "Dachen (Microsoft Standard / Wang / 01, etc.)";
|
||||
"Dachen 26 (libChewing)" = "Dachen 26 (libChewing)";
|
||||
|
@ -129,8 +132,10 @@
|
|||
"Dictionary" = "Dictionary";
|
||||
"Directly commit lowercased letters" = "Directly commit lowercased letters";
|
||||
"Directly commit uppercased letters" = "Directly commit uppercased letters";
|
||||
"Disassemble the previous reading, dropping its intonation" = "Disassemble the previous reading, dropping its intonation";
|
||||
"Disassembling process does not work with non-phonetic reading keys." = "Disassembling process does not work with non-phonetic reading keys.";
|
||||
"Emulating select-candidate-per-character mode" = "Emulating select-candidate-per-character mode";
|
||||
"Enable CNS11643 Support (2022-07-20)" = "Enable CNS11643 Support (2022-07-20)";
|
||||
"Enable CNS11643 Support (2022-08-02)" = "Enable CNS11643 Support (2022-08-02)";
|
||||
"Enable Space key for calling candidate window" = "Enable Space key for calling candidate window";
|
||||
"Enable symbol input support (incl. certain emoji symbols)" = "Enable symbol input support (incl. certain emoji symbols)";
|
||||
"English" = "English";
|
||||
|
@ -149,18 +154,24 @@
|
|||
"IBM" = "IBM";
|
||||
"IMK candidate window relies on certain Apple private APIs which are force-exposed by using bridging headers. Its usability, at this moment, is only guaranteed from macOS 10.14 Mojave to macOS 13 Ventura. Further tests are required in the future in order to tell whether it is usable in newer macOS releases." = "IMK candidate window relies on certain Apple private APIs which are force-exposed by using bridging headers. Its usability, at this moment, is only guaranteed from macOS 10.14 Mojave to macOS 13 Ventura. Further tests are required in the future in order to tell whether it is usable in newer macOS releases.";
|
||||
"in front of the phrase (like macOS built-in Zhuyin IME)" = "in front of the phrase (like macOS built-in Zhuyin IME)";
|
||||
"Intonation Key:" = "Intonation Key:";
|
||||
"Japanese" = "Japanese";
|
||||
"Keyboard Shortcuts:" = "Keyboard Shortcuts:";
|
||||
"Keyboard" = "Keyboard";
|
||||
"Misc Settings:" = "Misc Settings:";
|
||||
"MiTAC" = "MiTAC";
|
||||
"Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only." = "Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only.";
|
||||
"Note: The “Delete ⌫” key on Mac keyboard is named as “BackSpace ⌫” here in order to distinguish the real “Delete ⌦” key from full-sized desktop keyboards. If you want to use the real “Delete ⌦” key on a Mac keyboard with no numpad equipped, you have to press “Fn+⌫” instead." = "Note: The “Delete ⌫” key on Mac keyboard is named as “BackSpace ⌫” here in order to distinguish the real “Delete ⌦” key from full-sized desktop keyboards. If you want to use the real “Delete ⌦” key on a Mac keyboard with no numpad equipped, you have to press “Fn+⌫” instead.";
|
||||
"Only override the intonation of the previous reading if different" = "Only override the intonation of the previous reading if different";
|
||||
"Output Settings:" = "Output Settings:";
|
||||
"Override the previous reading's intonation with candidate-reset" = "Override the previous reading's intonation with candidate-reset";
|
||||
"Phonetic Parser:" = "Phonetic Parser:";
|
||||
"Please use mouse wheel to scroll this page. The CheatSheet is available in the IME menu." = "Please use mouse wheel to scroll this page. The CheatSheet is available in the IME menu.";
|
||||
"Push the cursor in front of the phrase after selection" = "Push the cursor in front of the phrase after selection";
|
||||
"Secondary Pinyin with Numeral Intonation" = "Secondary Pinyin with Numeral Intonation";
|
||||
"Seigyou" = "Seigyou (JinYei)";
|
||||
"Selection Keys:" = "Selection Keys:";
|
||||
"Shift+BackSpace:" = "Shift+BackSpace:";
|
||||
"Shift+Letter:" = "Shift+Letter:";
|
||||
"Show Hanyu-Pinyin in the inline composition buffer & tooltip" = "Show Hanyu-Pinyin in the inline composition buffer & tooltip";
|
||||
"Show page buttons in candidate window" = "Show page buttons in candidate window";
|
||||
|
@ -168,6 +179,7 @@
|
|||
"Some client apps (like Chromium-cored browsers: MS Edge, Google Chrome, etc.) may duplicate Shift-key inputs due to their internal bugs, and their devs are less likely to fix their bugs of such. vChewing has its accommodation procedures enabled by default for known Chromium-cored browsers. If you want the same accommodation for other client apps, please tick this checkbox on." = "Some client apps (like Chromium-cored browsers: MS Edge, Google Chrome, etc.) may duplicate Shift-key inputs due to their internal bugs, and their devs are less likely to fix their bugs of such. vChewing has its accommodation procedures enabled by default for known Chromium-cored browsers. If you want the same accommodation for other client apps, please tick this checkbox on.";
|
||||
"Space to +cycle candidates, Shift+Space to +cycle pages" = "Space to +cycle candidates, Shift+Space to +cycle pages";
|
||||
"Space to +cycle pages, Shift+Space to +cycle candidates" = "Space to +cycle pages, Shift+Space to +cycle candidates";
|
||||
"Specify the behavior of intonation key when syllable composer is empty." = "Specify the behavior of intonation key when syllable composer is empty.";
|
||||
"Starlight" = "Starlight";
|
||||
"Stop farting (when typed phonetic combination is invalid, etc.)" = "Stop farting (when typed phonetic combination is invalid, etc.)";
|
||||
"This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later." = "This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later.";
|
||||
|
|
|
@ -0,0 +1,765 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>New Page</title>
|
||||
<style>
|
||||
body { font: 15px / 1.4 Tahoma; }
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body { background: #333; color: white; }
|
||||
}
|
||||
td { padding-left: 10px; padding-right: 10px; min-width: auto; }
|
||||
td:first-child { text-align: right; }
|
||||
tr:nth-child(odd) { background-color: #88888820 }
|
||||
tr:nth-child(even) { background-color: #88888830; }
|
||||
tr:hover { background-color: #88888810; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1><strong>Keyboard Shortcut CheatSheet(macOS)</strong></h1>
|
||||
<div>This article describes keyboard shortcuts used as of vChewing 2.1.0 update.</div>
|
||||
<div>Please use mouse wheel to scroll this page.</div>
|
||||
<div>This article uses certain macOS keyboard symbols to simplify the description. Note:</div>
|
||||
<ol>
|
||||
<li>The names of BackSpace and Delete keys conform to Windows and Linux standard。</li>
|
||||
<li>The names of arrow keys are redefined according to the text writing direction.</li>
|
||||
<li>The verb "shang4-ping2 (上屏)" used in Simplified Chinese is replaced by its standard term "commit".</li>
|
||||
<li>vChewing don't handle (real) numpad inputs (numbers and math symbols from there) except that the candidate window is shown up and number / math symbol keys are used as candidate keys.</li>
|
||||
<li>The "number keys" referred by this article only indicate those number keys in the main keyboard area.</li>
|
||||
<li>The term "ICB" is short for "inline composition buffer" which is also called "pre-edit area" by the Text Service Framework in Microsoft Windows.</li>
|
||||
<li>The term "PCB" is short for "phonabet combination buffer" and is operated by the Tekkon composer. It appears in ICB when user is typing phonabets. The input method retrieve combined reading keys from PCB, checking whether it is valid (having record in the dictionary), and put valid results into the Megrez compositor. The entire ICB appears as a facade in front of Megrez and Tekkon.</li>
|
||||
<li>vChewing doesn't use Zonble's term "before" & "after" since they are extremely misleading. We use "front/rear (back, tail)" & "forward / backward" which refers to the typing direction.</li>
|
||||
<li>The term"symbol menu state" only refers to the categorized symbol menu.</li>
|
||||
</ol>
|
||||
<div> </div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>Symbols</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>Mac Keyboard</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌘</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>CMD (Command / Windows / Super)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Alt (Option)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Ctrl (Control)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Shift</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇪</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Caps (Caps Lock)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌫</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Bksp (Backspace. Apple calls it "Delete")</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌦</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Del (This is the real "Delete")</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⎋</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Esc (Escape)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Space</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Tab</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Return (Combined with Enter ⌤ key)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↑</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Left-hand key: Up when horizontal typing, Right when vertical typing.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↓</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Right-hand key: Down when horizontal typing, Left when vertical typing.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Backward key: Left when horizontal typing, Up when vertical typing.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>→</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Forward key: Right when horizontal typing, Down when vertical typing.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↖︎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Home</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↘︎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>End</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇞</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>PgUp (Page Up)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇟</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>PgDn (Page Down)</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>These shortcuts are for toggling certain function modes. You can disable these shortcuts in vChewing Preferences.</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>Shortcuts</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>Function Modes</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ P</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Per-character selection mode (i.e. SCPC mode).</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ K</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Kang-Xi conversion mode.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ A</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Associated phrases mode (only usable in SCPC mode).</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ J</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>JIS conversion mode.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ L</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>CNS11643 all-char mode.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ H</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Half-width punctuation mode.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ M</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Currency numeral output. This converts "一二" to "壹貳".</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>These shortcuts are available for serving basic typing functions.</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>Shortcuts</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>Functions</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>Notes</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ Commit everything in the inline composition buffer.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Requiring that ICB is not empty and the IME is not in marking state.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥→</div>
|
||||
<div>⌥←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ Push cursor forward by node.</div>
|
||||
<div>‧ Pull cursor back by node.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Requiring that ICB is not empty.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥↑</div>
|
||||
<div>⌥↓</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ Rotate candidates clockwise.</div>
|
||||
<div>‧ Rotate candidates counter-clockwise.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Requiring that ICB is not empty.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧␣</div>
|
||||
<div>⇧⌘␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ Rotate candidates clockwise.</div>
|
||||
<div>‧ Rotate candidates counter-clockwise.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>The same as above, but optimized for single-hand operation. You can swipe your thumb from left ⌘ to ␣ key.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇥</div>
|
||||
<div>⇧⇥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ Rotate candidates clockwise.</div>
|
||||
<div>‧ Rotate candidates counter-clockwise.</div>
|
||||
<div>## Has compatibility issues with Facebook. ##</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>The same as above by default, can be changed for calling candidate window (in vChewing Preferences).</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥⌃→</div>
|
||||
<div>⌥⌃←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ Push cursor to the front edge of the ICB.</div>
|
||||
<div>‧ Pull cursor to the tail of the ICB.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Requiring that ICB is not empty.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↘︎</div>
|
||||
<div>↖︎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ Push cursor to the front edge of the ICB.</div>
|
||||
<div>‧ Pull cursor to the tail of the ICB.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>As above.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧→</div>
|
||||
<div>⇧←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Control the marking range in the ICB.</div>
|
||||
<div>After that, you can do further operations prompted on the screen.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Requiring that ICB is not empty.</div>
|
||||
<div>When there are things marked, the input method turns into Marking State.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Dump the marked range (reading-phrase pair) into user dictionary. If the pair already exists, this operation will boost its score weight.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Only works in marking state.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧⌘⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Nerf the marked existing reading-phrase pair with a negative score of -114.514.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Only works in marking state.</div>
|
||||
<div>Not effective with user associated phrases.</div>
|
||||
<div>Nerfed weight (score) is saved in user dictionary.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌫</div>
|
||||
<div>⌦</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Dump the marked existing reading-phrase pair into the user phrase filter list. vChewing omits all pairs "on the list" when querying candidates from dictionary.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Only works in marking state.</div>
|
||||
<div>Not effective with user associated phrases.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧⌦</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Clear the entire ICB.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Requiring that ICB is not empty and the IME is not in marking state.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧⌫</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Disassembly the previous reading (i.e. the reading at the rear of the cursor) and remove its intonation. Will remove the previous reading if it is not able to be disassembled.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Requiring that ICB is not empty and the IME is not in marking state. Its behavior can be specified in vChewing Preferences.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>Intonation key</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Attempt to disassembly the previous reading (i.e. the reading at the rear of the cursor), remove its intonation, and override its intonation with the intonation key pressed. Will insert standalone intonation mark if previous reading doesn't exist or is not able to be disassembled.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Requiring that ICB is not empty and the IME is not in marking state. Its behavior can be specified in vChewing Preferences.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⌥⌘⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Dump the current ICB to W3C Ruby HTML format. The pronunciations are written in textbook format.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Requiring that ICB is not empty and the IME is not in marking state. One can specify whether it dumps Hanyu-Pinyin or Phonabets in vChewing Preferences.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⌘⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Dump the current ICB to pronunciation string thread. All intonations are written at last. If Hanyu-Pinyin, intonations are numerals.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Requiring that ICB is not empty and the IME is not in marking state. One can specify whether it dumps Hanyu-Pinyin or Phonabets. If in vChewing Phrase Editor, all readings are joined with "-" symbol.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Type full-width space when the ICB is empty.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Can be press-and-hold for consecutive inputs.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>Hold ⌥⇧</div>
|
||||
<div>and type Number Keys</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Type full-width Arabic numbers when the ICB is empty.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>will output half-width Arabic numbers instead if the IME is in half-width punctuation mode.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>~</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Categorized symbol menu. It can be customized by creating your own "symbols.dat" file in libchewing symbol format and save it into your user dictionary folder.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>JIS keyboards have to use the "_" key (to the left of your right-hand ⇧ key) instead since it doesn't have "~" key.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥ ~</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Non-categorized symbol menu.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>JIS keyboards have to use the "_" key (to the left of your right-hand ⇧ key) instead since it doesn't have "~" key.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇞</div>
|
||||
<div>⇟</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Call candidate window.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Requiring that ICB is not empty.</div>
|
||||
<div>Candidate window automatically appears in SCPC mode.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Call candidate window.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>As above but can be disabled in vChewing Preferences.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⎋</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Clear the entire ICB if not in marking state.</div>
|
||||
<div>Quit the marking state if in the marking state.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Its behavior (when not in marking state) can be disabled in vChewing Preferences. If so, it will only clear the unfinished pronunciation in the PCB.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>Left⇧</div>
|
||||
<div>Right⇧</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Toggle alphanumerical input mode.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Can be disabled in vChewing Preferences.</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>The following shortcuts are usable when <strong>the default Voltaire MK3 Candidate Window</strong> is shown up:</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>Shortcuts</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>Functions</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>Notes</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Confirm the highlighted candidate.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Can be disabled (in vChewing preferences) for associated phrase candidates.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇥</div>
|
||||
<div>⇧⇥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ Highlight the next candidate.</div>
|
||||
<div>‧ Highlight the previous candidate.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Can be redesignated in vChewing Preferences for rotating pages with exception: It only rotates when there's only one page.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
<div>⇧␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Rotate pages or candidates clockwise, according to its settings in vChewing Preferences.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>It rotates candidates when there is only one page.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇞</div>
|
||||
<div>⇟</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Flip pages.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>It rotates candidates when there is only one page.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↖︎</div>
|
||||
<div>↘︎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ Choose the total first candidate.</div>
|
||||
<div>‧ Choose the total last candidate.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>It buzzes / farts for unnecessary operations.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⎋</div>
|
||||
<div>⌫</div>
|
||||
<div>⌦</div>
|
||||
<div>⇧→</div>
|
||||
<div>⇧←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Back to the previous symbol menu level. If not available, closes the candidate window.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>It always closes the candidate window if is not in the symbol menu state. ESC key may close Spotlight window.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>Hold ⇧</div>
|
||||
<div>and type Candidate Keys</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Choose designated associated phrase candidate.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>The "^" symbol indicates that the current candidate window is for associated phrases.</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>The following shortcuts are usable when <strong>the IMK Candidate Window</strong> is shown up:</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>Shortcuts</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>Functions</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>Notes</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Confirm the highlighted candidate.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Can be disabled (in vChewing preferences) for associated phrase candidates.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇥</div>
|
||||
<div>⇧⇥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ Highlight the next candidate.</div>
|
||||
<div>‧ Highlight the previous candidate.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Can be redesignated in vChewing Preferences for rotating pages.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
<div>⇧␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Rotate pages or candidates clockwise, according to its settings in vChewing Preferences.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>No exceptions happen even if there's only one page.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇞</div>
|
||||
<div>⇟</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Flip pages.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>No exceptions happen even if there's only one page.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⎋</div>
|
||||
<div>⌫</div>
|
||||
<div>⌦</div>
|
||||
<div>⇧→</div>
|
||||
<div>⇧←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Back to the previous symbol menu level. If not available, closes the candidate window.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>It always closes the candidate window if is not in the symbol menu state. ESC key may close Spotlight window.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>Hold ⇧</div>
|
||||
<div>and type Candidate Keys</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Choose designated associated phrase candidate.</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>The "⇧" symbol indicates that the current candidate window is for associated phrases.</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>$ EOF.</div>
|
||||
</body>
|
||||
</html>
|
|
@ -3,6 +3,7 @@
|
|||
"About vChewing…" = "威注音について…";
|
||||
"vChewing Preferences…" = "入力機能設定…";
|
||||
"Uninstallation" = "入力アプリの卸除(おろしのぞき)";
|
||||
"CheatSheet" = "キー取扱説明";
|
||||
"Uninstall vChewing…" = "入力アプリを卸除く…";
|
||||
"This will remove vChewing Input Method from this user account, requiring your confirmation." = "これにて威注音入力アプリをこのアカウントから卸除しますが、宜しいですか。";
|
||||
"Check Later" = "後でやる";
|
||||
|
@ -58,9 +59,6 @@
|
|||
"Symbol & Emoji Input" = "符号&絵文字入力";
|
||||
"Edit User Symbol & Emoji Data…" = "ユーザー符号&絵文字辞書を編集…";
|
||||
"Choose your desired user data folder." = "欲しがるユーザー辞書フォルダをお選びください。";
|
||||
"Cursor is between \"%@\" and \"%@\"." = "カーソルは「%@」と「%@」に間れ。";
|
||||
"Cursor is to the rear of \"%@\"." = "カーソルは「%@」の後ろに。";
|
||||
"Cursor is in front of \"%@\"." = "カーソルは「%@」の前に。";
|
||||
"Loading CHS Core Dict..." = "簡体中国語核心辞書読込中…";
|
||||
"Loading CHT Core Dict..." = "繁体中国語核心辞書読込中…";
|
||||
"Core Dict loading complete." = "核心辞書読込完了";
|
||||
|
@ -88,10 +86,13 @@
|
|||
|
||||
// SwiftUI Preferences
|
||||
"(Shift+)Space:" = "(Shift+)Space:";
|
||||
"⚠︎ This feature in IMK Candidate Window defects. Please consult Apple Developer Relations\nand tell them the related Radar ID: #FB11300759." = "⚠︎ この機能は IMK 候補陳列ウィンドウにサポートされておりません。\nApple Developer Relations に案件番号 #FB11300759 を教えながらクレームしてください。";
|
||||
"Allow backspace-editing miscomposed readings" = "効かぬ音読みを BackSpace で再編集";
|
||||
"Allow boosting / excluding a candidate of single kanji" = "即排除/即最優先にできる候補の文字数の最低限は1字とする";
|
||||
"Allow using Enter key to confirm associated candidate selection" = "Enter キーを連想語彙候補の確認のために使う";
|
||||
"Also toggle alphanumerical mode with Left-Shift" = "左側の Shift キーでも英数入力モードの切り替え";
|
||||
"Always drop the previous reading" = "カーソルの後部の音読みを常に削除する";
|
||||
"Always type intonations to the inline composition buffer" = "常に入力緩衝列に音調を入力する";
|
||||
"Always use fixed listing order in candidate window" = "候補文字を固定順番で陳列する";
|
||||
"An accommodation for elder computer users." = "年配なるユーザーのために提供した機能である。";
|
||||
"Apple ABC (equivalent to English US)" = "Apple ABC (Apple U.S. キーボードと同じ)";
|
||||
|
@ -119,8 +120,10 @@
|
|||
"Choose the phonetic layout for Mandarin parser." = "共通語分析器の注音配列をご指定ください。";
|
||||
"Choose your desired user data folder path. Will be omitted if invalid." = "欲しがるユーザー辞書保存先をご指定ください。無効なる保存先設定は省かれる。";
|
||||
"Choose your preferred layout of the candidate window." = "入力候補陳列の仕様をご指定ください。";
|
||||
"Clear the entire inline composition buffer like Shift+Delete" = "Shift+Delete のように入力緩衝列を消す";
|
||||
"Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" = "Ctrl(+Option)+Command+Enter で出すのを漢語弁音と変換";
|
||||
"Completely disable using Shift key to toggling alphanumerical mode" = "Shift キーの英数入力モードの切り替え機能を徹底的に禁ず";
|
||||
"Completely disable using Shift key to toggle alphanumerical mode" = "Shift キーの英数入力モードの切り替え機能を徹底的に禁ず";
|
||||
"Consolidate the context on confirming candidate selection" = "候補陳列ウィンドウで候補を選ぶ時に文脈を強固する";
|
||||
"Cursor Selection:" = "カーソル候補呼出:";
|
||||
"Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千配列 (Microsoft 標準・王安・零壹など)";
|
||||
"Dachen 26 (libChewing)" = "酷音大千 26 キー配列";
|
||||
|
@ -129,8 +132,10 @@
|
|||
"Dictionary" = "辞書設定";
|
||||
"Directly commit lowercased letters" = "ローマ字(小文字)を直接出力";
|
||||
"Directly commit uppercased letters" = "ローマ字(大文字)を直接出力";
|
||||
"Disassemble the previous reading, dropping its intonation" = "カーソルの後部の音読みを解き、その音調を除く";
|
||||
"Disassembling process does not work with non-phonetic reading keys." = "実の意味の音読みだけを解くことができる。";
|
||||
"Emulating select-candidate-per-character mode" = "漢字1つづつ全候補選択入力モード";
|
||||
"Enable CNS11643 Support (2022-07-20)" = "全字庫モード // 入力可能な漢字数を倍増す (2022-07-20)";
|
||||
"Enable CNS11643 Support (2022-08-02)" = "全字庫モード // 入力可能な漢字数を倍増す (2022-08-02)";
|
||||
"Enable Space key for calling candidate window" = "Space キーで入力候補を呼び出す";
|
||||
"Enable symbol input support (incl. certain emoji symbols)" = "僅かなる絵文字も含む符号入力サポートを起用";
|
||||
"English" = "英語";
|
||||
|
@ -149,18 +154,24 @@
|
|||
"IBM" = "IBM 配列";
|
||||
"IMK candidate window relies on certain Apple private APIs which are force-exposed by using bridging headers. Its usability, at this moment, is only guaranteed from macOS 10.14 Mojave to macOS 13 Ventura. Further tests are required in the future in order to tell whether it is usable in newer macOS releases." = "IMK 候補陳列ウィンドウは、Apple の未公開のAPIを「bridging-header」という強引的な手段で引き出して利用した機能である。現時点で macOS 10.14 Mojave から macOS 13 Ventura まで利用可能であるが、その後の新しい macOS との互換性の話はまだ早い。";
|
||||
"in front of the phrase (like macOS built-in Zhuyin IME)" = "単語の前で // macOS 内蔵注音入力のやり方";
|
||||
"Intonation Key:" = "音調キー:";
|
||||
"Japanese" = "和語";
|
||||
"Keyboard Shortcuts:" = "ショートカット:";
|
||||
"Keyboard" = "配列設定";
|
||||
"Misc Settings:" = "他の設定:";
|
||||
"MiTAC" = "神通配列";
|
||||
"Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only." = "QWERTY 以外の英数キーボードは弁音以外の配列に不適用。";
|
||||
"Note: The “Delete ⌫” key on Mac keyboard is named as “BackSpace ⌫” here in order to distinguish the real “Delete ⌦” key from full-sized desktop keyboards. If you want to use the real “Delete ⌦” key on a Mac keyboard with no numpad equipped, you have to press “Fn+⌫” instead." = "ご注意:Mac キーボードの「Delete ⌫」キーはここで「BackSpace ⌫」と呼ばれ、それはパソコンの常識としての本物の「Delete ⌦」と区別するためである。もし、テンキーの付いていない Mac キーボードで本物の「Delete ⌦」を使いたければ、代わりに「Fn+⌫」をご使用ください。";
|
||||
"Only override the intonation of the previous reading if different" = "カーソルの後部の音読みの異なる音調だけを上書きする";
|
||||
"Output Settings:" = "出力設定:";
|
||||
"Override the previous reading's intonation with candidate-reset" = "カーソルの後部の音読みの音調を上書きし、候補選択状態を戻す";
|
||||
"Phonetic Parser:" = "注音配列:";
|
||||
"Please use mouse wheel to scroll this page. The CheatSheet is available in the IME menu." = "マウスホイールでこのページをご覧ください。キーに関する取扱説明のアクセスはメニューに。";
|
||||
"Push the cursor in front of the phrase after selection" = "候補選択の直後、すぐカーソルを単語の向こうに推し進める";
|
||||
"Secondary Pinyin with Numeral Intonation" = "国音二式 (ローマ字+数字音調)";
|
||||
"Seigyou" = "精業配列";
|
||||
"Selection Keys:" = "言選り用キー:";
|
||||
"Shift+BackSpace:" = "Shift+BackSpace:";
|
||||
"Shift+Letter:" = "Shift+文字キー:";
|
||||
"Show Hanyu-Pinyin in the inline composition buffer & tooltip" = "弁音合併入力(入力緩衝列とヒントで音読みを漢語弁音に)";
|
||||
"Show page buttons in candidate window" = "入力候補陳列の側にページボタンを表示";
|
||||
|
@ -168,6 +179,7 @@
|
|||
"Some client apps (like Chromium-cored browsers: MS Edge, Google Chrome, etc.) may duplicate Shift-key inputs due to their internal bugs, and their devs are less likely to fix their bugs of such. vChewing has its accommodation procedures enabled by default for known Chromium-cored browsers. If you want the same accommodation for other client apps, please tick this checkbox on." = "いくつかのアプリ(例えば MS Edge や Google Chrome などのような Chromium 系ブラウザー)には「Shift キーの入力イベントを複数化してしまう」という支障があり、そしてアプリそれぞれの開発元に修復される可能性はほぼゼロだと言える。威注音入力アプリは対策用の特殊措置を普段に起用している。別のアプリにも同じ特殊措置が欲しければ、これをチェックしてください。";
|
||||
"Space to +cycle candidates, Shift+Space to +cycle pages" = "Shift+Space で次のページ、Space で次の候補文字を";
|
||||
"Space to +cycle pages, Shift+Space to +cycle candidates" = "Space で次のページ、Shift+Space で次の候補文字を";
|
||||
"Specify the behavior of intonation key when syllable composer is empty." = "音読組立緩衝列が空かされた時の音調キーの行為をご指定ください。";
|
||||
"Starlight" = "星光配列";
|
||||
"Stop farting (when typed phonetic combination is invalid, etc.)" = "マナーモード // 外すと入力間違った時に変な声が出る";
|
||||
"This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later." = "これは Apple Bug Report #FB10978412 の臨時対策であり、macOS 12 からの macOS に効き、IMK 以外の候補陳列ウィンドウに作用する。Apple は macOS 11 からの macOS のために該当 Bug を修復すべきである。";
|
||||
|
|
|
@ -0,0 +1,762 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="ja">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>New Page</title>
|
||||
<style>
|
||||
body { font: 15px / 1.4 Tahoma; }
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body { background: #333; color: white; }
|
||||
}
|
||||
td { padding-left: 10px; padding-right: 10px; min-width: 110px; }
|
||||
td:first-child { text-align: right; }
|
||||
tr:nth-child(odd) { background-color: #88888820 }
|
||||
tr:nth-child(even) { background-color: #88888830; }
|
||||
tr:hover { background-color: #88888810; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1><strong>キーボードショートカット取り扱い説明書(macOS)</strong></h1>
|
||||
<div>この文章は、威注音入力アプリ 2.1.0 アップデートのキーボードショートカットの取り扱う方法を説明します。</div>
|
||||
<div>マウスホイールでこの文章をご覧ください。</div>
|
||||
<div>この文章は、簡単に説明できるために、いくつか macOS 専用のキー符号を用います。そして付記もございます:</div>
|
||||
<ol>
|
||||
<li>「BackSpace」と「Delete」この二つキーは、Windows & Linux のキーボードの「BackSpace」/「Delete」の意味です。</li>
|
||||
<li>方向キーは、言葉の書写方向によって、この文章で別の名前がございます。</li>
|
||||
<li>簡体中国語の「上屏」は「commit」の意味であり、この文章で「commit」の和訳は「送り出す」とします。</li>
|
||||
<li>テンキーは、候補選択だけのために、威注音に取り扱われております。それ以外の場合は威注音に無視されます。</li>
|
||||
<li>「数字キー」はこの文章で「テンキー」と別のキーで、ノートパソコンもデスクトップキーボードも利用できる数字入力用キーです。</li>
|
||||
<li> (inline composition buffer)」の意味です。</li>
|
||||
<li>「PCB」は「音読組立緩衝列 (phonabet combination buffer)」の意味です、音読組立エンジン「鉄恨」に操られております。威注音入力アプリは音読みの入力イベントを受けて、音読組立エンジンに送って、音読みを組み立てから、組み立てた結果を使って「辞書に変換候補資料の有無」を確認してから、その音読みを言葉組立エンジン「天権星」に挿入します。「ICB」そのものは「PCB」を含んで、音読組立エンジンと言葉組立エンジンの共同の見せ掛けです。</li>
|
||||
<li>「前後」の「後」は「あと」でなく、「うしろ」の意味です。即ち、「前後」の意味は、言葉の書写方向に参考する表現です。</li>
|
||||
<li>「符号メニュー状態」は「分類符号メニュー」だけの話でございます。「未分類符号メニュー」の専属入力状態はございません。</li>
|
||||
</ol>
|
||||
<div> </div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>符号</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>Mac キーボード</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌘</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>CMD (Command / Windows / Super)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌥</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Alt (Option)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌃</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Ctrl (Control)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Shift</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⇪</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Caps (Caps Lock)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌫</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Bksp (Backspace. Apple に "Delete" と呼ばれていますが…)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌦</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Del (これが本物の "Delete" です)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⎋</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Esc (Escape)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Space</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⇥</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Tab</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Return (Enter <strong>⌤</strong> キーと合併処理されております)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↑</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>左手キー: 横書きの上、縦書きの右。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↓</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>右手キー: 横書きの下、縦書きの左。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>お退き: 横書きの左、縦書きの上。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>→</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>お進み: 横書きの右、縦書きの下。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>↖︎</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Home</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>↘︎</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>End</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⇞</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>PgUp (Page Up)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⇟</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>PgDn (Page Down)</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>下記のショートカットは、いくつか機能モードの切り替えのために利用できます。入力機能設定で無効と設定できます。</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>ショートカット</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>機能モード</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌃</strong>⇧⌘ P</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>全候補入力モード (漢字を一つづつ入力)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌃</strong>⇧⌘ K</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>康煕文字変換モード</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌃</strong>⇧⌘ A</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>全候補入力で連想語彙</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌃</strong>⇧⌘ J</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>JIS 新字体モード</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌃</strong>⇧⌘ L</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>CNS11643 全字庫モード</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌃</strong>⇧⌘ H</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>半角句読モード</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌃</strong>⇧⌘ M</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>数字大字変換モード (例え:「一二」→「壹貳」)</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>下記のショートカットは、文字の基本入力機能専用である。</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>ショートカット</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>機能</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>補記</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>‧</strong> ICBの内容をすべて送り出す。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB が空っぽでなければ、そして IME がマーキング状態中でなければ、の話。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌥</strong>→</div>
|
||||
<div><strong>⌥</strong>←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>‧</strong> カーソルを前に1つ節点押す。</div>
|
||||
<div><strong>‧</strong> カーソルを後ろに1つ節点引く。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB が空っぽでなければ、の話。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌥</strong>↑</div>
|
||||
<div><strong>⌥</strong>↓</div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>‧</strong> 次の文字候補を適用する。</div>
|
||||
<div><strong>‧</strong> 直前の文字候補を適用する。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB が空っぽでなければ、の話。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧␣</div>
|
||||
<div>⇧⌘␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>‧</strong> 次の文字候補を適用する。</div>
|
||||
<div><strong>‧</strong> 直前の文字候補を適用する。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>上記と同じですが、左手だけで使える。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⇥</strong></div>
|
||||
<div>⇧<strong>⇥</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>‧</strong> 次の文字候補を適用する。</div>
|
||||
<div><strong>‧</strong> 直前の文字候補を適用する。</div>
|
||||
<div>## Facebook で使用不可 ##</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>上記と同じですが、入力機能設定で別機能(候補ウィンドウを呼出)と設定できる。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌥⌃</strong>→</div>
|
||||
<div><strong>⌥⌃</strong>←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>‧</strong> カーソルを ICB の前端に押し尽くす。</div>
|
||||
<div><strong>‧</strong> カーソルを ICB の後端に押し尽くす。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB が空っぽでなければ、の話。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>↘︎</strong></div>
|
||||
<div><strong>↖︎</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>‧</strong> カーソルを ICB の前端に押し尽くす。</div>
|
||||
<div><strong>‧</strong> カーソルを ICB の後端に押し尽くす。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>上記のと同じ。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧→</div>
|
||||
<div>⇧←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB のマーキング範囲を調整する。</div>
|
||||
<div>その後、画面の指示によって別操作可能。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICBが空っぽでなければ、の話。</div>
|
||||
<div>マーキング範囲はゼロではない限り、IME はマーキング状態中である。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>マーキング範囲所定の「候補+音読み」をユーザー辞書に書き出す。もし辞書に既存のなら、その優先順位を最優先にする。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>IME がマーキング状態中であれば、の話。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧⌘⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>マーキング範囲所定の、辞書既存の「候補+音読み」のスコアを強制的に「-114.514」と弱化する。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>IME がマーキング状態中であれば、の話。連想語彙に効けぬ。弱化したスコアはユーザー辞書に登録される。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌫</strong></div>
|
||||
<div><strong>⌦</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>マーキング範囲所定の、辞書既存の「候補+音読み」を辞書条目排除表に書き出す。威注音が辞書から変換候補を探すときに、この排除表に記されたものは結果陳列から全部除かれてしまう。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>IME がマーキング状態中であれば、の話。連想語彙に効けぬ。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧<strong>⌦</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB を空っぽにする。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB が空っぽでなければ、そして IME がマーキング状態中でなければ、の話。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧<strong>⌫</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>カーソルの後部の音読みを解き、その音調を除く。解けない場合、その音読みを削除する。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB が空っぽでなければ、そして IME がマーキング状態中でなければ、の話。入力機能設定で別機能と設定できる。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>音調キー</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>カーソルの後部の音読みを解き、その音調を音調キーの音調と変更する。解けない場合、音調キーの音調符号を ICB に挿入する。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB が空っぽでなければ、そして IME がマーキング状態中でなければ、の話。入力機能設定で別機能と設定できる。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌃⌥</strong>⌘⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>W3C の Ruby HTML 様式基準に沿って、ICB の内容を全てルビー HTML コードと変換してから送り出す。音読みの様式は教科書様式。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB が空っぽでなければ、そして IME がマーキング状態中でなければ、の話。入力機能設定で「送り出すのは注音か漢語弁音か」と指定できる。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌃</strong>⌘⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB の音読み内容を全て送り出す。音調符号は最後で書く様式。漢語弁音の場合、数字音調符号を使う。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB が空っぽでなければ、そして IME がマーキング状態中でなければ、の話。入力機能設定で「送り出すのは注音か漢語弁音か」と指定できる。威注音辞書データ編集アプリに入力するときに、音読みは全部「-」その半角符号で接合される。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB が空っぽの場合に、全角スペースを入力。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>連続入力可能。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌥</strong>⇧を</div>
|
||||
<div>押しながら</div>
|
||||
<div>数字キー</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB が空っぽの場合に、全角アラビア数字を入力。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>半角句読モードの場合、半角アラビア数字が送り出される。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>~</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>分類符号メニューを呼び出す。「symbols.dat」というファイルを作って、LIBCHEWINGの符号データ様式基準に沿って内容を作れば、このメニューの内容をご自分で作れる。作ったファイルはユーザー辞書フォルダに置く。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>JIS キーボードの場合、「~」キーではなく、「_」キーである。もともと JIS キーボードには「~」キーが存在しないので。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⌥</strong> ~</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>未分類符号メニューを呼び出す。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>JIS キーボードの場合、「~」キーではなく、「_」キーである。もともと JIS キーボードには「~」キーが存在しないので。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⇞</strong></div>
|
||||
<div><strong>⇟</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>文字候補ウィンドウを呼び出す。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ICB が空っぽでなければ、の話。全候補入力モードの場合、文字候補は自動的に表れる。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>文字候補ウィンドウを呼び出す。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>上記のと同じですが、入力機能設定で別機能と設定できる。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⎋</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>マーキング状態の場合は、マーキング状態を中止する。</div>
|
||||
<div>マーキング状態以外の場合、ICB を空っぽにする。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>入力機能設定で別機能(未完成な音読みを PCB から削除)と設定できる。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>左⇧</div>
|
||||
<div>右⇧</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>英数入力モードの切り替え。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>入力機能設定で無効と設定できる。</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>もし、<strong>Voltaire MK3</strong> が文字候補ウィンドウと設定されたら、文字候補ウィンドウ操作用のショートカット:</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>ショートカット</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>機能</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>補記</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>現在選んだ文字候補を確認する。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>連想語彙をこのキーで確認したくない場合、入力機能設定で無効と設定できる。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⇥</strong></div>
|
||||
<div>⇧<strong>⇥</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>‧</strong> 次の文字候補を選ぶ。</div>
|
||||
<div><strong>‧</strong> 直前の文字候補を選ぶ。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>選択対象はページにしたい場合、入力機能設定で。 1ページだけの場合、選択対処は文字候補のみ。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
<div>⇧␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>次の文字候補を選ぶか、或いは次のページを選ぶか、入力設定次第。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>1ページだけの場合、選択対処は文字候補のみ。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⇞</strong></div>
|
||||
<div><strong>⇟</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ページ操作。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>1ページだけの場合、選択対処は文字候補のみ。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>↖︎</strong></div>
|
||||
<div><strong>↘︎</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>‧</strong> はじめの文字候補を選ぶ。</div>
|
||||
<div><strong>‧</strong> 最後の文字候補を選ぶ。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>余計な操作の場合、ピーという音、或いは放屁の音。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⎋</strong></div>
|
||||
<div><strong>⌫</strong></div>
|
||||
<div><strong>⌦</strong></div>
|
||||
<div>⇧→</div>
|
||||
<div>⇧←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>直前の符号メニューに戻る。直前の符号メニューのない場合、文字候補ウィンドウを閉じる。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>符号入力状態以外の場合、常に文字候補ウィンドウを閉じる。ESC キーは Spotlight を閉じてしまう場合がある。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧を押しながら</div>
|
||||
<div>言選り用キーを</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>所定の連想文字候補を確認する。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>連想文字候補ウィンドウには「^」記号がある。</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>もし、<strong>IMKCandidates</strong> が文字候補ウィンドウと設定されたら、文字候補ウィンドウ操作用のショートカット:</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>ショートカット</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>機能</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>補記</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>現在選んだ文字候補を確認する。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>連想語彙をこのキーで確認したくない場合、入力機能設定で無効と設定できる。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⇥</strong></div>
|
||||
<div>⇧<strong>⇥</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>‧</strong> 次の文字候補を選ぶ。</div>
|
||||
<div><strong>‧</strong> 直前の文字候補を選ぶ。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>選択対象はページにしたい場合、入力機能設定で。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
<div>⇧␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>次の文字候補を選ぶか、或いは次のページを選ぶか、入力設定次第。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>例外処理なし。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⇞</strong></div>
|
||||
<div><strong>⇟</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div>ページ操作。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>例外処理なし。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>⎋</strong></div>
|
||||
<div><strong>⌫</strong></div>
|
||||
<div><strong>⌦</strong></div>
|
||||
<div>⇧→</div>
|
||||
<div>⇧←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>直前の符号メニューに戻る。直前の符号メニューのない場合、文字候補ウィンドウを閉じる。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>符号入力状態以外の場合、常に文字候補ウィンドウを閉じる。ESC キーは Spotlight を閉じてしまう場合がある。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧を押しながら</div>
|
||||
<div>言選り用キーを</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>所定の連想文字候補を確認する。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>連想文字候補ウィンドウには「⇧」記号がある。</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>$ EOF.</div>
|
||||
</body>
|
||||
</html>
|
|
@ -2,6 +2,7 @@
|
|||
"vChewing crashed while handling previously loaded UOM observation data. These data files are cleaned now to ensure the usability." = "威注音输入法的使用者半衰记忆模组在观测时崩溃,相关半衰记忆资料档案内容已全部清空。";
|
||||
"About vChewing…" = "关于威注音…";
|
||||
"vChewing Preferences…" = "威注音偏好设定…";
|
||||
"CheatSheet" = "热键指南";
|
||||
"Uninstallation" = "卸除输入法";
|
||||
"Uninstall vChewing…" = "卸除威注音…";
|
||||
"This will remove vChewing Input Method from this user account, requiring your confirmation." = "此举会将威注音自当前系统使用者帐户卸除。请确认。";
|
||||
|
@ -10,7 +11,7 @@
|
|||
"Check for Update Completed" = "新版检查完毕";
|
||||
"You are already using the latest version of vChewing." = "目前使用的已经是最新版本。";
|
||||
"Update Check Failed" = "无法检查新版";
|
||||
"There may be no internet connection or the server failed to respond.\n\nError message: %@" = "网路连线失败,或是服务器没有回应。\n\n错误说明:%@";
|
||||
"There may be no internet connection or the server failed to respond.\n\nError message: %@" = "网路连线失败,或是伺服器没有回应。\n\n错误说明:%@";
|
||||
"OK" = "确定";
|
||||
"Dismiss" = "关闭本视窗";
|
||||
"New Version Available" = "有新版可下载";
|
||||
|
@ -25,7 +26,7 @@
|
|||
"Unable to create the user phrase file." = "无法创建自订语汇档案。";
|
||||
"Please check the permission at \"%@\"." = "请检查此处的存取权限:\"%@\".";
|
||||
"Edit Excluded Phrases…" = "编辑要滤除的语汇…";
|
||||
"Half-Width Punctuation Mode" = "半角标点模式";
|
||||
"Half-Width Punctuation Mode" = "半形标点模式";
|
||||
"\"%@\" length must ≥ 2 for a user phrase." = "「%@」字数不足以自订语汇。";
|
||||
"\"%@\" length should ≤ %d for a user phrase." = "「%@」字数超过 %d、无法自订。";
|
||||
"\"%@\" selected. ENTER to add user phrase." = "「%@」敲 Enter 添入自订语汇。";
|
||||
|
@ -40,7 +41,7 @@
|
|||
"Maximum 15 candidate keys allowed." = "选字键最多只能指定十五个。";
|
||||
"⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ 语汇置换功能已启用,会波及语汇自订。";
|
||||
"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ 无法处理:组字区字数与读音数不对应。";
|
||||
"Per-Char Select Mode" = "仿真逐字选字输入";
|
||||
"Per-Char Select Mode" = "模拟逐字选字输入";
|
||||
"CNS11643 Mode" = "全字库模式";
|
||||
"JIS Shinjitai Output" = "JIS 新字体模式";
|
||||
"Per-Char Associated Phrases" = "逐字选字联想模式";
|
||||
|
@ -58,9 +59,6 @@
|
|||
"Symbol & Emoji Input" = "符号&绘文字输入";
|
||||
"Edit User Symbol & Emoji Data…" = "编辑自订符号&绘文字资料…";
|
||||
"Choose your desired user data folder." = "请选择您想指定的使用者语汇档案目录。";
|
||||
"Cursor is between \"%@\" and \"%@\"." = "游标介于「%@」与「%@」之间。";
|
||||
"Cursor is to the rear of \"%@\"." = "游标在「%@」的后方。";
|
||||
"Cursor is in front of \"%@\"." = "游标在「%@」的前方。.";
|
||||
"Loading CHS Core Dict..." = "载入简体中文核心辞典…";
|
||||
"Loading CHT Core Dict..." = "载入繁体中文核心辞典…";
|
||||
"Core Dict loading complete." = "核心辞典载入完毕";
|
||||
|
@ -88,10 +86,13 @@
|
|||
|
||||
// SwiftUI Preferences
|
||||
"(Shift+)Space:" = "(Shift+)空格键:";
|
||||
"⚠︎ This feature in IMK Candidate Window defects. Please consult Apple Developer Relations\nand tell them the related Radar ID: #FB11300759." = "⚠︎ 该功能因 IMK 选字窗自身缺陷而无法实作。\n请携 Radar 编号 #FB11300759 找 Apple Developer Relations 投诉。";
|
||||
"Allow backspace-editing miscomposed readings" = "允许对无效的读音使用 BackSpace 编辑";
|
||||
"Allow boosting / excluding a candidate of single kanji" = "将可以就地升权/排除的候选字词的最短词长设为单个汉字";
|
||||
"Allow using Enter key to confirm associated candidate selection" = "允许使用 Enter 确认当前选中的联想词";
|
||||
"Also toggle alphanumerical mode with Left-Shift" = "也允许使用左侧的 Shift 键盘切换英数输入模式";
|
||||
"Always drop the previous reading" = "始终剔除游标正后方的字音";
|
||||
"Always type intonations to the inline composition buffer" = "始终在内文组字区内键入声调符号";
|
||||
"Always use fixed listing order in candidate window" = "以固定顺序来陈列选字窗内的候选字";
|
||||
"An accommodation for elder computer users." = "针对年长使用者的习惯而提供。";
|
||||
"Apple ABC (equivalent to English US)" = "Apple ABC (与 Apple 美规键盘等价)";
|
||||
|
@ -119,8 +120,10 @@
|
|||
"Choose the phonetic layout for Mandarin parser." = "请指定普通话/国音分析器所使用的注音排列。";
|
||||
"Choose your desired user data folder path. Will be omitted if invalid." = "请在此指定您想指定的使用者语汇档案目录。无效值会被忽略。";
|
||||
"Choose your preferred layout of the candidate window." = "选择您所偏好的候选字窗布局。";
|
||||
"Clear the entire inline composition buffer like Shift+Delete" = "像 Shift+Delete 那样清空当前组字区内容";
|
||||
"Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" = "Ctrl(+Option)+Command+Enter 输出汉语拼音而非注音";
|
||||
"Completely disable using Shift key to toggling alphanumerical mode" = "彻底禁止使用 Shift 键切换英数模式";
|
||||
"Completely disable using Shift key to toggle alphanumerical mode" = "彻底禁止使用 Shift 键切换英数模式";
|
||||
"Consolidate the context on confirming candidate selection" = "在使用选字窗选字时,自動巩固上下文";
|
||||
"Cursor Selection:" = "选字游标:";
|
||||
"Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微软标准/王安/零壹/仲鼎/国乔)";
|
||||
"Dachen 26 (libChewing)" = "酷音大千二十六键排列";
|
||||
|
@ -129,8 +132,10 @@
|
|||
"Dictionary" = "辞典设定";
|
||||
"Directly commit lowercased letters" = "直接递交小写字母";
|
||||
"Directly commit uppercased letters" = "直接递交大写字母";
|
||||
"Disassemble the previous reading, dropping its intonation" = "析构游标正后方的字音,且剔除其声调";
|
||||
"Disassembling process does not work with non-phonetic reading keys." = "析构行为仅针对组字器内「身为汉字读音」的读音索引单元有效。";
|
||||
"Emulating select-candidate-per-character mode" = "模拟 90 年代前期注音逐字选字输入风格";
|
||||
"Enable CNS11643 Support (2022-07-20)" = "启用 CNS11643 全字库支援 (2022-07-20)";
|
||||
"Enable CNS11643 Support (2022-08-02)" = "启用 CNS11643 全字库支援 (2022-08-02)";
|
||||
"Enable Space key for calling candidate window" = "敲空格键以呼出候选字窗";
|
||||
"Enable symbol input support (incl. certain emoji symbols)" = "启用包括少许绘文字在内的符号输入支援";
|
||||
"English" = "英语";
|
||||
|
@ -149,18 +154,24 @@
|
|||
"IBM" = "IBM 排列";
|
||||
"IMK candidate window relies on certain Apple private APIs which are force-exposed by using bridging headers. Its usability, at this moment, is only guaranteed from macOS 10.14 Mojave to macOS 13 Ventura. Further tests are required in the future in order to tell whether it is usable in newer macOS releases." = "IMK 选字窗依赖于 Apple 的私有 API,而且是借由桥接档案头强制曝露的方法使用的。目前,该功能仅在 macOS 10.14 Mojave 至 macOS 13 Ventura 系统内有测试过可用性。至于在未来的 macOS 发行版当中是否可用,则需要另行测试、才能下结论。";
|
||||
"in front of the phrase (like macOS built-in Zhuyin IME)" = "将游标置于词语前方 // macOS 内建注音风格";
|
||||
"Intonation Key:" = "声调键:";
|
||||
"Japanese" = "和语";
|
||||
"Keyboard Shortcuts:" = "键盘快捷键:";
|
||||
"Keyboard Shortcuts:" = "键盘快速键:";
|
||||
"Keyboard" = "键盘设定";
|
||||
"Misc Settings:" = "杂项:";
|
||||
"MiTAC" = "神通排列";
|
||||
"Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only." = "QWERTY 以外的英数布局是为了拼音排列使用者而准备的。";
|
||||
"Note: The “Delete ⌫” key on Mac keyboard is named as “BackSpace ⌫” here in order to distinguish the real “Delete ⌦” key from full-sized desktop keyboards. If you want to use the real “Delete ⌦” key on a Mac keyboard with no numpad equipped, you have to press “Fn+⌫” instead." = "注意:Mac 键盘的「Delete ⌫」键在此被称作「BackSpace 退格键 ⌫」以与 PC 键盘的真正的「Delete ⌦」键彼此区分开。若您想在没有数字小键盘的 Mac 电脑上使用真正的「Delete ⌦」按键的话,请改用「Fn+⌫」。";
|
||||
"Only override the intonation of the previous reading if different" = "仅在键入的声调与游标正后方的字音不同时,尝试覆写";
|
||||
"Output Settings:" = "输出设定:";
|
||||
"Override the previous reading's intonation with candidate-reset" = "尝试对游标正后方的字音覆写声调,且重设其选字状态";
|
||||
"Phonetic Parser:" = "注音排列:";
|
||||
"Please use mouse wheel to scroll this page. The CheatSheet is available in the IME menu." = "请利用滑鼠滚轮检视该页面。也请洽输入法选单内的热键指南。";
|
||||
"Push the cursor in front of the phrase after selection" = "在选字后将游标置于该字词的前方";
|
||||
"Secondary Pinyin with Numeral Intonation" = "国音二式+数字标调";
|
||||
"Seigyou" = "精业排列";
|
||||
"Selection Keys:" = "选字键:";
|
||||
"Shift+BackSpace:" = "Shift+退格键:";
|
||||
"Shift+Letter:" = "Shift+字母键:";
|
||||
"Show Hanyu-Pinyin in the inline composition buffer & tooltip" = "拼音并击(组字区与工具提示内显示汉语拼音)";
|
||||
"Show page buttons in candidate window" = "在选字窗内显示翻页按钮";
|
||||
|
@ -168,6 +179,7 @@
|
|||
"Some client apps (like Chromium-cored browsers: MS Edge, Google Chrome, etc.) may duplicate Shift-key inputs due to their internal bugs, and their devs are less likely to fix their bugs of such. vChewing has its accommodation procedures enabled by default for known Chromium-cored browsers. If you want the same accommodation for other client apps, please tick this checkbox on." = "某些应用(比如像是 MS Edge 或者 Chrome 这样的 Chromium 核心的浏览器)可能会使输入的 Shift 按键讯号被重复输入,且其有关研发方很可能不打算修复这些产品缺陷。威注音针对这些应用预设启用了相容措施。如果您希望在任何应用当中都启用该措施的话,请勾选之。";
|
||||
"Space to +cycle candidates, Shift+Space to +cycle pages" = "Shift+空格键 换下一页,空格键 换选下一个候选字";
|
||||
"Space to +cycle pages, Shift+Space to +cycle candidates" = "空格键 换下一页,Shift+空格键 换选下一个候选字";
|
||||
"Specify the behavior of intonation key when syllable composer is empty." = "指定声调键(在注拼槽为「空」状态时)的行为。";
|
||||
"Starlight" = "星光排列";
|
||||
"Stop farting (when typed phonetic combination is invalid, etc.)" = "廉耻模式 // 取消勾选的话,敲错字时会有异音";
|
||||
"This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later." = "该方法是 Apple Bug Report #FB10978412 的保守治疗方案,用来仅针对 macOS 12 开始的系统,且仅对非 IMK 选字窗起作用。Apple 应该对 macOS 11 开始的系统修复这个 Bug。";
|
||||
|
|
|
@ -0,0 +1,795 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="zh-Hans">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>New Page</title>
|
||||
<style>
|
||||
body { font: 15px / 1.4 Tahoma; }
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body { background: #333; color: white; }
|
||||
}
|
||||
td { padding-left: 10px; padding-right: 10px; min-width: auto; }
|
||||
td:first-child { text-align: right; }
|
||||
tr:nth-child(odd) { background-color: #88888820 }
|
||||
tr:nth-child(even) { background-color: #88888830; }
|
||||
tr:hover { background-color: #88888810; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1><strong>键盘热键使用手册(macOS)</strong></h1>
|
||||
<div>本文对应至少威注音 2.1.0 版。请利用滑鼠滚轮检视该页面。</div>
|
||||
<div>为了简化下文表述,这里介绍一下本文会用到的 macOS 的键盘符号。注:</div>
|
||||
<ol>
|
||||
<li>BackSpace 与 Delete 采 Windows 称谓。</li>
|
||||
<li>下表内的四个方向键的称谓,均为根据文字书写顺序方向而言的相对方向称谓。</li>
|
||||
<li>简体中文使用者请注意本文「递交」一词的意义与「上屏」相同,英文都是「Commit」。</li>
|
||||
<li>威注音不会对数字小键盘拦截响应(小键盘 Enter 键除外),除非有选字窗出现、且有数字小键盘内能输入的字符被设为选字键。</li>
|
||||
<li>本文下文出现的所有「数字键」均指主键盘区域的数字键。</li>
|
||||
<li>本文用语「(内文)组字区」代指「inline composition buffer」,在微软术语体系当中也被称作「pre-edit area」。</li>
|
||||
<li>本文用语「组音区」是指由铁恨注拼引擎操纵的注音组音区。组音区会在使用者敲注音时出现在内文组字区内。输入法自组音区取得读音,在验证其具有对应的辞典记录之后,将其插入至天权星组字引擎。整个内文组字区相当于组字引擎与注拼引擎的统合外在表现。</li>
|
||||
<li>为了保证表达与讨论的有效性、减少歧义,本文在讨论前后关系时,只用「往前/往后」「前方/后方」,且仅以文字书写方向为这些用语的方向参照。这与 Zonble 的「Before-After」前后术语逻辑体系不同:威注音在使用英文术语的情况下只用「Front / Rear (Back, Bail)」、「Forward / Backward」。</li>
|
||||
<li>所谓「符号选单状态」仅代指分类波浪符号选单。</li>
|
||||
</ol>
|
||||
<div> </div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>符号</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>mac 键盘</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌘</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>CMD (Command / Windows / Super)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Alt (Option)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Ctrl (Control)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Shift</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇪</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Caps (Caps Lock)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌫</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Bksp (Backspace,被 Apple 称为 Delete)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌦</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Del (这才是真的 Delete)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⎋</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Esc (Escape)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Space (空格)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Tab</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Return (与 Enter ⌤ 合并处理)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↑</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>左手方向键,也就是:横排书写时的上方向键,纵排书写时的右方向键</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↓</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>右手方向键,也就是:横排书写时的下方向键,纵排书写时的左方向键</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>向后方向键,也就是:横排书写时的左方向键,纵排书写时的上方向键</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>→</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>向前方向键,也就是:横排书写时的右方向键,纵排书写时的下方向键</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↖︎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Home</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↘︎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>End</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇞</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>PgUp (Page Up)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇟</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>PgDn (Page Down)</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>下述热键用以作为模式切换开关,可在偏好设定内停用:</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>热键</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>模式</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ P</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>模拟逐字选字输入(就是ㄅ半那样的输入方式)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ K</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>康熙正体字模式(某些汉字会变成对应的康熙字元)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ A</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>逐字选字联想模式(就是ㄅ半的联想词)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ J</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>日文 JIS 新字体模式(方便在日本的网站线上邮购)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ L</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>全字库模式(不另外安装全字库字型的话,某些候选字会显示成方块)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ H</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>半形标点模式(程式虱专用)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ M</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>大写汉字数字输出(会将「一二三四五」转为「壹贰参肆伍」)</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>下述热键则为敲字时的基础功能:</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>热键</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>功能</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>备注</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 递交输出当前组字区的全部内容。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>组字区有内容时才会生效;</div>
|
||||
<div>输入法并非处于标记模式时才会生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥→</div>
|
||||
<div>⌥←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 令组字区游标向前移动一个词语节点</div>
|
||||
<div>‧ 令组字区游标向后移动一个词语节点</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>组字区有内容时才会生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥↑</div>
|
||||
<div>⌥↓</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 以固定顺序就地轮替候选字(下一个候选字)</div>
|
||||
<div>‧ 以固定顺序就地轮替候选字(上一个候选字)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>组字区有内容时才会生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧␣</div>
|
||||
<div>⇧⌘␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 以固定顺序就地轮替候选字(下一个候选字)</div>
|
||||
<div>‧ 以固定顺序就地轮替候选字(上一个候选字)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>同上,但可用左手单手操作:</div>
|
||||
<div>大拇指可以从 ⌘ 扫到 ␣ 上。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇥</div>
|
||||
<div>⇧⇥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 以固定顺序就地轮替候选字(下一个候选字)</div>
|
||||
<div>‧ 以固定顺序就地轮替候选字(上一个候选字)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>同上,可在偏好设定内改为呼叫选字窗。</div>
|
||||
<div>无法用于脸书,因为脸书会拦截 Tab 键。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥⌃→</div>
|
||||
<div>⌥⌃←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 迅速将组字区内的游标挪到组字区最前方</div>
|
||||
<div>‧ 迅速将组字区内的游标挪到组字区最后方</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>组字区有内容时才会生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↘︎</div>
|
||||
<div>↖︎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 迅速将组字区内的游标挪到组字区最前方</div>
|
||||
<div>‧ 迅速将组字区内的游标挪到组字区最后方</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>同上。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧→</div>
|
||||
<div>⇧←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>控制组字区内的高亮标记选择范围,</div>
|
||||
<div>之后可进行被荧幕所提示的操作。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>组字区有内容时才会生效;</div>
|
||||
<div>当有高亮选择内容时,输入法处于标记模式。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>将当前高亮标记了的词音配对新增至使用者辞典。</div>
|
||||
<div>如果已经是既有词音配对的话,则会提升其权重。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>输入法处于标记模式时才会生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧⌘⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>将高亮标记了的当前在库的词音配对的权重</div>
|
||||
<div>压低至 -114.514。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>输入法处于标记模式时才会生效;</div>
|
||||
<div>相关记录存于使用者语汇档案当中;</div>
|
||||
<div>对使用者联想词无法生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌫</div>
|
||||
<div>⌦</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>将当前高亮标记了的词音配对新增至语汇滤除表,</div>
|
||||
<div>输入法在拿读音查询在库语汇时会忽略相关结果。</div>
|
||||
<div>也就是俗称的「就地删词」。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>输入法处于标记模式时才会生效;</div>
|
||||
<div>对使用者联想词无法生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧⌦</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>清空当前组字区。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>输入法不处于标记模式时才会生效。</div>
|
||||
<div>组字区有内容时才会生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧⌫</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>析构掉游标身后的汉字读音,</div>
|
||||
<div>使其等待新的声调输入。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>输入法不处于标记模式时才会生效。</div>
|
||||
<div>组字区有内容时才会生效。</div>
|
||||
<div>该行为可在新版偏好设定内修改。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>声调键</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>析构掉游标身后的汉字读音,</div>
|
||||
<div>且使用声调键的读音复写之。</div>
|
||||
<div>若发现不可析构,则直接输入声调。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>输入法不处于标记模式时才会生效。</div>
|
||||
<div>组字区有内容时才会生效。</div>
|
||||
<div>该行为可在新版偏好设定内修改。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⌥⌘⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>将当前组字区递交为网页 Ruby 读音标记格式,</div>
|
||||
<div>其拼音 / 注音书写符合教科书书写排版规范:</div>
|
||||
<div>也就是拼音标调在字母上、注音先写轻声标记。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>组字区有内容时才会生效;</div>
|
||||
<div>可在偏好设定内设定是输出注音还是拼音。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⌘⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>将当前组字区的读音串单独递交输出,</div>
|
||||
<div>输出的汉语拼音采 12345 数字标调、</div>
|
||||
<div>输出的注音的轻声标记是在注音符号之后才写的。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>组字区有内容时才会生效;</div>
|
||||
<div>可在偏好设定内设定是输出注音还是拼音;</div>
|
||||
<div>预设情况下,读音以西文半形空格相连,但是</div>
|
||||
<div>在威注音语汇编辑器内则以西文半形减号相连</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>在组字区内没有内容时,输入全形空格</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>可摁住不放以连续输入。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>摁住 ⌥⇧</div>
|
||||
<div>敲数字键</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>在组字区内没有内容时,用来输入全形阿拉伯数字</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>如果目前已经启用了半形标点模式的话,</div>
|
||||
<div>则该热键会输入半形阿拉伯数字。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>~</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>分类波浪符号选单(类似新酷音),</div>
|
||||
<div>可在使用者辞典目录内写 symbols.dat 自订内容。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>JIS 键盘注意:</div>
|
||||
<div>得用右 Shift 左侧的「_」键取代「~」键。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥ ~</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>不分类的波浪符号选单(类似小麦注音)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>JIS 键盘注意:</div>
|
||||
<div>得用右 Shift 左侧的「_」键取代「~」键。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇞</div>
|
||||
<div>⇟</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>呼叫选字窗</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>组字区有内容时才会生效。</div>
|
||||
<div>逐字选字模式会自动跳选字窗。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>呼叫选字窗</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>同上,但可在偏好设定内停用。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⎋</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>非标记模式下,清空整个组字区。</div>
|
||||
<div>标记模式下,退出标记模式。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>其在非标记模式下的行为可在偏好设定内停用,届时仅会清空注拼槽。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>右⇧</div>
|
||||
<div>左⇧</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>切换英数输入模式的开关。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>左⇧可在偏好设定内停用。</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>下述热键则为<strong>预设 Voltaire MK3 选字窗正在显示(也就是你正在选字)时</strong>可以用的功能:</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>热键</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>功能</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>备注</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>确认选字窗内的当前候选字</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>联想词选字时,该功能可在偏好设定内启用或停用。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇥</div>
|
||||
<div>⇧⇥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 选字窗内选中下一个候选字(正向轮替)</div>
|
||||
<div>‧ 选字窗内选中上一个候选字(反向轮替)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>可以在偏好设定内更改轮替对象为页,但是有例外:</div>
|
||||
<div>当候选字词只有一页时,轮替对象仍为候选字词本身。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
<div>⇧␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>根据输入法偏好设定来决定</div>
|
||||
<div>是正向轮替页面还是候选字词</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>当候选字词只有一页时,轮替对象仍为候选字词本身。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇞</div>
|
||||
<div>⇟</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>翻页</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>候选字词只有一页时,轮替对象为候选字词本身。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↖︎</div>
|
||||
<div>↘︎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 选中第一个候选字</div>
|
||||
<div>‧ 选中最后一个候选字</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>多余的操作会触发蜂鸣。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⎋</div>
|
||||
<div>⌫</div>
|
||||
<div>⌦</div>
|
||||
<div>⇧→</div>
|
||||
<div>⇧←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>回退到上一层符号选单、或关掉选字窗</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>不是符号选单状态的场合,一律关掉选字窗。</div>
|
||||
<div>其中,Esc 按键可能会导致 Spotlight 关闭。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>摁住 ⇧</div>
|
||||
<div>敲选字键</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>选择指定的联想候选词(会有^标记)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>与奇摩输入法行为一致。</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>下述热键则为在开发道场内启用的 <strong>IMK 选字窗正在显示(也就是你正在选字)时</strong>可以用的功能:</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>热键</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>功能</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>备注</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>确认选字窗内的当前候选字</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>联想词选字时,该功能可在偏好设定内启用或停用。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇥</div>
|
||||
<div>⇧⇥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 选字窗内选中下一个候选字(正向轮替)</div>
|
||||
<div>‧ 选字窗内选中上一个候选字(反向轮替)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>可以在偏好设定内更改轮替对象为页。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
<div>⇧␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>根据输入法偏好设定来决定</div>
|
||||
<div>是正向轮替页面还是候选字词</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>轮替对象种类不会改变。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇞</div>
|
||||
<div>⇟</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>翻页</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>候选字词只有一页时,轮替对象种类也不会改变。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⎋</div>
|
||||
<div>⌫</div>
|
||||
<div>⌦</div>
|
||||
<div>⇧→</div>
|
||||
<div>⇧←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>回退到上一层符号选单、或关掉选字窗</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>不是符号选单状态的场合,一律关掉选字窗。</div>
|
||||
<div>其中,Esc 按键可能会导致 Spotlight 关闭。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>摁住 ⇧</div>
|
||||
<div>敲选字键</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>选择指定的联想候选词(会有^标记)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>与奇摩输入法行为一致。</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>$ EOF.</div>
|
||||
</body>
|
||||
</html>
|
|
@ -2,6 +2,7 @@
|
|||
"vChewing crashed while handling previously loaded UOM observation data. These data files are cleaned now to ensure the usability." = "威注音輸入法的使用者半衰記憶模組在觀測時崩潰,相關半衰記憶資料檔案內容已全部清空。";
|
||||
"About vChewing…" = "關於威注音…";
|
||||
"vChewing Preferences…" = "威注音偏好設定…";
|
||||
"CheatSheet" = "熱鍵指南";
|
||||
"Uninstallation" = "卸除輸入法";
|
||||
"Uninstall vChewing…" = "卸除威注音…";
|
||||
"This will remove vChewing Input Method from this user account, requiring your confirmation." = "此舉會將威注音自當前系統使用者帳戶卸除。請確認。";
|
||||
|
@ -58,9 +59,6 @@
|
|||
"Symbol & Emoji Input" = "符號&繪文字輸入";
|
||||
"Edit User Symbol & Emoji Data…" = "編輯自訂符號&繪文字資料…";
|
||||
"Choose your desired user data folder." = "請選擇您想指定的使用者語彙檔案目錄。";
|
||||
"Cursor is between \"%@\" and \"%@\"." = "游標介於「%@」與「%@」之間。";
|
||||
"Cursor is to the rear of \"%@\"." = "游標在「%@」的後方。";
|
||||
"Cursor is in front of \"%@\"." = "游標在「%@」的前方。.";
|
||||
"Loading CHS Core Dict..." = "載入簡體中文核心辭典…";
|
||||
"Loading CHT Core Dict..." = "載入繁體中文核心辭典…";
|
||||
"Core Dict loading complete." = "核心辭典載入完畢";
|
||||
|
@ -88,10 +86,13 @@
|
|||
|
||||
// SwiftUI Preferences
|
||||
"(Shift+)Space:" = "(Shift+)空格鍵:";
|
||||
"⚠︎ This feature in IMK Candidate Window defects. Please consult Apple Developer Relations\nand tell them the related Radar ID: #FB11300759." = "⚠︎ 該功能因 IMK 選字窗自身缺陷而無法實作。\n請攜 Radar 編號 #FB11300759 找 Apple Developer Relations 投訴。";
|
||||
"Allow backspace-editing miscomposed readings" = "允許對無效的讀音使用 BackSpace 編輯";
|
||||
"Allow boosting / excluding a candidate of single kanji" = "將可以就地升權/排除的候選字詞的最短詞長設為單個漢字";
|
||||
"Allow using Enter key to confirm associated candidate selection" = "允許使用 Enter 確認當前選中的聯想詞";
|
||||
"Also toggle alphanumerical mode with Left-Shift" = "也允許使用左側的 Shift 鍵盤切換英數輸入模式";
|
||||
"Always drop the previous reading" = "始終剔除游標正後方的字音";
|
||||
"Always type intonations to the inline composition buffer" = "始終在內文組字區內鍵入聲調符號";
|
||||
"Always use fixed listing order in candidate window" = "以固定順序來陳列選字窗內的候選字";
|
||||
"An accommodation for elder computer users." = "針對年長使用者的習慣而提供。";
|
||||
"Apple ABC (equivalent to English US)" = "Apple ABC (與 Apple 美規鍵盤等價)";
|
||||
|
@ -119,8 +120,10 @@
|
|||
"Choose the phonetic layout for Mandarin parser." = "請指定普通話/國音分析器所使用的注音排列。";
|
||||
"Choose your desired user data folder path. Will be omitted if invalid." = "請在此指定您想指定的使用者語彙檔案目錄。無效值會被忽略。";
|
||||
"Choose your preferred layout of the candidate window." = "選擇您所偏好的候選字窗佈局。";
|
||||
"Clear the entire inline composition buffer like Shift+Delete" = "像 Shift+Delete 那樣清空當前組字區內容";
|
||||
"Commit Hanyu-Pinyin instead on Ctrl(+Option)+Command+Enter" = "Ctrl(+Option)+Command+Enter 輸出漢語拼音而非注音";
|
||||
"Completely disable using Shift key to toggling alphanumerical mode" = "徹底禁止使用 Shift 鍵切換英數模式";
|
||||
"Completely disable using Shift key to toggle alphanumerical mode" = "徹底禁止使用 Shift 鍵切換英數模式";
|
||||
"Consolidate the context on confirming candidate selection" = "在使用選字窗選字時,自動鞏固上下文";
|
||||
"Cursor Selection:" = "選字游標:";
|
||||
"Dachen (Microsoft Standard / Wang / 01, etc.)" = "大千排列 (微軟標準/王安/零壹/仲鼎/國喬)";
|
||||
"Dachen 26 (libChewing)" = "酷音大千二十六鍵排列";
|
||||
|
@ -129,8 +132,10 @@
|
|||
"Dictionary" = "辭典設定";
|
||||
"Directly commit lowercased letters" = "直接遞交小寫字母";
|
||||
"Directly commit uppercased letters" = "直接遞交大寫字母";
|
||||
"Disassemble the previous reading, dropping its intonation" = "析構游標正後方的字音,且剔除其聲調";
|
||||
"Disassembling process does not work with non-phonetic reading keys." = "析構行為僅針對組字器內「身為漢字讀音」的讀音索引單元有效。";
|
||||
"Emulating select-candidate-per-character mode" = "模擬 90 年代前期注音逐字選字輸入風格";
|
||||
"Enable CNS11643 Support (2022-07-20)" = "啟用 CNS11643 全字庫支援 (2022-07-20)";
|
||||
"Enable CNS11643 Support (2022-08-02)" = "啟用 CNS11643 全字庫支援 (2022-08-02)";
|
||||
"Enable Space key for calling candidate window" = "敲空格鍵以呼出候選字窗";
|
||||
"Enable symbol input support (incl. certain emoji symbols)" = "啟用包括少許繪文字在內的符號輸入支援";
|
||||
"English" = "英語";
|
||||
|
@ -149,18 +154,24 @@
|
|||
"IBM" = "IBM 排列";
|
||||
"IMK candidate window relies on certain Apple private APIs which are force-exposed by using bridging headers. Its usability, at this moment, is only guaranteed from macOS 10.14 Mojave to macOS 13 Ventura. Further tests are required in the future in order to tell whether it is usable in newer macOS releases." = "IMK 選字窗依賴於 Apple 的私有 API,而且是藉由橋接檔案頭強制曝露的方法使用的。目前,該功能僅在 macOS 10.14 Mojave 至 macOS 13 Ventura 系統內有測試過可用性。至於在未來的 macOS 發行版當中是否可用,則需要另行測試、才能下結論。";
|
||||
"in front of the phrase (like macOS built-in Zhuyin IME)" = "將游標置於詞語前方 // macOS 內建注音風格";
|
||||
"Intonation Key:" = "聲調鍵:";
|
||||
"Japanese" = "和語";
|
||||
"Keyboard Shortcuts:" = "鍵盤快速鍵:";
|
||||
"Keyboard" = "鍵盤設定";
|
||||
"Misc Settings:" = "雜項:";
|
||||
"MiTAC" = "神通排列";
|
||||
"Non-QWERTY alphanumerical keyboard layouts are for Pinyin parser only." = "QWERTY 以外的英數佈局是為了拼音排列使用者而準備的。";
|
||||
"Note: The “Delete ⌫” key on Mac keyboard is named as “BackSpace ⌫” here in order to distinguish the real “Delete ⌦” key from full-sized desktop keyboards. If you want to use the real “Delete ⌦” key on a Mac keyboard with no numpad equipped, you have to press “Fn+⌫” instead." = "注意:Mac 鍵盤的「Delete ⌫」鍵在此被稱作「BackSpace 退格鍵 ⌫」以與 PC 鍵盤的真正的「Delete ⌦」鍵彼此區分開。若您想在沒有數字小鍵盤的 Mac 電腦上使用真正的「Delete ⌦」按鍵的話,請改用「Fn+⌫」。";
|
||||
"Only override the intonation of the previous reading if different" = "僅在鍵入的聲調與游標正後方的字音不同時,嘗試覆寫";
|
||||
"Output Settings:" = "輸出設定:";
|
||||
"Override the previous reading's intonation with candidate-reset" = "嘗試對游標正後方的字音覆寫聲調,且重設其選字狀態";
|
||||
"Phonetic Parser:" = "注音排列:";
|
||||
"Please use mouse wheel to scroll this page. The CheatSheet is available in the IME menu." = "請利用滑鼠滾輪檢視該頁面。也請洽輸入法選單內的熱鍵指南。";
|
||||
"Push the cursor in front of the phrase after selection" = "在選字後將游標置於該字詞的前方";
|
||||
"Secondary Pinyin with Numeral Intonation" = "國音二式+數字標調";
|
||||
"Seigyou" = "精業排列";
|
||||
"Selection Keys:" = "選字鍵:";
|
||||
"Shift+BackSpace:" = "Shift+退格鍵:";
|
||||
"Shift+Letter:" = "Shift+字母鍵:";
|
||||
"Show Hanyu-Pinyin in the inline composition buffer & tooltip" = "拼音並擊(組字區與工具提示內顯示漢語拼音)";
|
||||
"Show page buttons in candidate window" = "在選字窗內顯示翻頁按鈕";
|
||||
|
@ -168,6 +179,7 @@
|
|||
"Some client apps (like Chromium-cored browsers: MS Edge, Google Chrome, etc.) may duplicate Shift-key inputs due to their internal bugs, and their devs are less likely to fix their bugs of such. vChewing has its accommodation procedures enabled by default for known Chromium-cored browsers. If you want the same accommodation for other client apps, please tick this checkbox on." = "某些應用(比如像是 MS Edge 或者 Chrome 這樣的 Chromium 核心的瀏覽器)可能會使輸入的 Shift 按鍵訊號被重複輸入,且其有關研發方很可能不打算修復這些產品缺陷。威注音針對這些應用預設啟用了相容措施。如果您希望在任何應用當中都啟用該措施的話,請勾選之。";
|
||||
"Space to +cycle candidates, Shift+Space to +cycle pages" = "Shift+空格鍵 換下一頁,空格鍵 換選下一個候選字";
|
||||
"Space to +cycle pages, Shift+Space to +cycle candidates" = "空格鍵 換下一頁,Shift+空格鍵 換選下一個候選字";
|
||||
"Specify the behavior of intonation key when syllable composer is empty." = "指定聲調鍵(在注拼槽為「空」狀態時)的行為。";
|
||||
"Starlight" = "星光排列";
|
||||
"Stop farting (when typed phonetic combination is invalid, etc.)" = "廉恥模式 // 取消勾選的話,敲錯字時會有異音";
|
||||
"This only works since macOS 12 with non-IMK candidate window as an alternative wordaround of Apple Bug Report #FB10978412. Apple should patch that for macOS 11 and later." = "該方法是 Apple Bug Report #FB10978412 的保守治療方案,用來僅針對 macOS 12 開始的系統,且僅對非 IMK 選字窗起作用。Apple 應該對 macOS 11 開始的系統修復這個 Bug。";
|
||||
|
|
|
@ -0,0 +1,795 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="zh-Hant">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>New Page</title>
|
||||
<style>
|
||||
body { font: 15px / 1.4 Tahoma; }
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body { background: #333; color: white; }
|
||||
}
|
||||
td { padding-left: 10px; padding-right: 10px; min-width: auto; }
|
||||
td:first-child { text-align: right; }
|
||||
tr:nth-child(odd) { background-color: #88888820 }
|
||||
tr:nth-child(even) { background-color: #88888830; }
|
||||
tr:hover { background-color: #88888810; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1><strong>鍵盤熱鍵使用手冊(macOS)</strong></h1>
|
||||
<div>本文對應至少威注音 2.1.0 版。請利用滑鼠滾輪檢視該頁面。</div>
|
||||
<div>為了簡化下文表述,這裡介紹一下本文會用到的 macOS 的鍵盤符號。註:</div>
|
||||
<ol>
|
||||
<li>BackSpace 與 Delete 採 Windows 稱謂。</li>
|
||||
<li>下表內的四個方向鍵的稱謂,均為根據文字書寫順序方向而言的相對方向稱謂。</li>
|
||||
<li>簡體中文使用者請注意本文「遞交」一詞的意義與「上屏」相同,英文都是「Commit」。</li>
|
||||
<li>威注音不會對數字小鍵盤攔截響應(小鍵盤 Enter 鍵除外),除非有選字窗出現、且有數字小鍵盤內能輸入的字符被設為選字鍵。</li>
|
||||
<li>本文下文出現的所有「數字鍵」均指主鍵盤區域的數字鍵。</li>
|
||||
<li>本文用語「(內文)組字區」代指「inline composition buffer」,在微軟術語體系當中也被稱作「pre-edit area」。</li>
|
||||
<li>本文用語「組音區」是指由鐵恨注拼引擎操縱的注音組音區。組音區會在使用者敲注音時出現在內文組字區內。輸入法自組音區取得讀音,在驗證其具有對應的辭典記錄之後,將其插入至天權星組字引擎。整個內文組字區相當於組字引擎與注拼引擎的統合外在表現。</li>
|
||||
<li>為了保證表達與討論的有效性、減少歧義,本文在討論前後關係時,只用「往前/往後」「前方/後方」,且僅以文字書寫方向為這些用語的方向參照。這與 Zonble 的「Before-After」前後術語邏輯體系不同:威注音在使用英文術語的情況下只用「Front / Rear (Back, Bail)」、「Forward / Backward」。</li>
|
||||
<li>所謂「符號選單狀態」僅代指分類波浪符號選單。</li>
|
||||
</ol>
|
||||
<div> </div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>符號</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>mac 鍵盤</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌘</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>CMD (Command / Windows / Super)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Alt (Option)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Ctrl (Control)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Shift</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇪</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Caps (Caps Lock)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌫</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Bksp (Backspace,被 Apple 稱為 Delete)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌦</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Del (這才是真的 Delete)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⎋</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Esc (Escape)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Space (空格)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Tab</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Return (與 Enter ⌤ 合併處理)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↑</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>左手方向鍵,也就是:橫排書寫時的上方向鍵,縱排書寫時的右方向鍵</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↓</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>右手方向鍵,也就是:橫排書寫時的下方向鍵,縱排書寫時的左方向鍵</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>向後方向鍵,也就是:橫排書寫時的左方向鍵,縱排書寫時的上方向鍵</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>→</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>向前方向鍵,也就是:橫排書寫時的右方向鍵,縱排書寫時的下方向鍵</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↖︎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>Home</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↘︎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>End</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇞</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>PgUp (Page Up)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇟</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>PgDn (Page Down)</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>下述熱鍵用以作為模式切換開關,可在偏好設定內停用:</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>熱鍵</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>模式</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ P</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>模擬逐字選字輸入(就是ㄅ半那樣的輸入方式)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ K</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>康熙正體字模式(某些漢字會變成對應的康熙字元)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ A</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>逐字選字聯想模式(就是ㄅ半的聯想詞)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ J</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>日文 JIS 新字體模式(方便在日本的網站線上郵購)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ L</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>全字庫模式(不另外安裝全字庫字型的話,某些候選字會顯示成方塊)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ H</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>半形標點模式(程式蝨專用)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⇧⌘ M</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>大寫漢字數字輸出(會將「一二三四五」轉為「壹貳參肆伍」)</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>下述熱鍵則為敲字時的基礎功能:</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>熱鍵</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>功能</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>備註</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 遞交輸出當前組字區的全部內容。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>組字區有內容時才會生效;</div>
|
||||
<div>輸入法並非處於標記模式時才會生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥→</div>
|
||||
<div>⌥←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 令組字區游標向前移動一個詞語節點</div>
|
||||
<div>‧ 令組字區游標向後移動一個詞語節點</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>組字區有內容時才會生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥↑</div>
|
||||
<div>⌥↓</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 以固定順序就地輪替候選字(下一個候選字)</div>
|
||||
<div>‧ 以固定順序就地輪替候選字(上一個候選字)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>組字區有內容時才會生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧␣</div>
|
||||
<div>⇧⌘␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 以固定順序就地輪替候選字(下一個候選字)</div>
|
||||
<div>‧ 以固定順序就地輪替候選字(上一個候選字)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>同上,但可用左手單手操作:</div>
|
||||
<div>大拇指可以從 ⌘ 掃到 ␣ 上。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇥</div>
|
||||
<div>⇧⇥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 以固定順序就地輪替候選字(下一個候選字)</div>
|
||||
<div>‧ 以固定順序就地輪替候選字(上一個候選字)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>同上,可在偏好設定內改為呼叫選字窗。</div>
|
||||
<div>無法用於臉書,因為臉書會攔截 Tab 鍵。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥⌃→</div>
|
||||
<div>⌥⌃←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 迅速將組字區內的游標挪到組字區最前方</div>
|
||||
<div>‧ 迅速將組字區內的游標挪到組字區最後方</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>組字區有內容時才會生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↘︎</div>
|
||||
<div>↖︎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 迅速將組字區內的游標挪到組字區最前方</div>
|
||||
<div>‧ 迅速將組字區內的游標挪到組字區最後方</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>同上。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧→</div>
|
||||
<div>⇧←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>控制組字區內的高亮標記選擇範圍,</div>
|
||||
<div>之後可進行被螢幕所提示的操作。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>組字區有內容時才會生效;</div>
|
||||
<div>當有高亮選擇內容時,輸入法處於標記模式。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>將當前高亮標記了的詞音配對新增至使用者辭典。</div>
|
||||
<div>如果已經是既有詞音配對的話,則會提升其權重。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>輸入法處於標記模式時才會生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧⌘⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>將高亮標記了的當前在庫的詞音配對的權重</div>
|
||||
<div>壓低至 -114.514。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>輸入法處於標記模式時才會生效;</div>
|
||||
<div>相關記錄存於使用者語彙檔案當中;</div>
|
||||
<div>對使用者聯想詞無法生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌫</div>
|
||||
<div>⌦</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>將當前高亮標記了的詞音配對新增至語彙濾除表,</div>
|
||||
<div>輸入法在拿讀音查詢在庫語彙時會忽略相關結果。</div>
|
||||
<div>也就是俗稱的「就地刪詞」。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>輸入法處於標記模式時才會生效;</div>
|
||||
<div>對使用者聯想詞無法生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧⌦</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>清空當前組字區。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>輸入法不處於標記模式時才會生效。</div>
|
||||
<div>組字區有內容時才會生效。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧⌫</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>析構掉游標身後的漢字讀音,</div>
|
||||
<div>使其等待新的聲調輸入。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>輸入法不處於標記模式時才會生效。</div>
|
||||
<div>組字區有內容時才會生效。</div>
|
||||
<div>該行為可在新版偏好設定內修改。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>聲調鍵</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>析構掉游標身後的漢字讀音,</div>
|
||||
<div>且使用聲調鍵的讀音複寫之。</div>
|
||||
<div>若發現不可析構,則直接輸入聲調。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>輸入法不處於標記模式時才會生效。</div>
|
||||
<div>組字區有內容時才會生效。</div>
|
||||
<div>該行為可在新版偏好設定內修改。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⌥⌘⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>將當前組字區遞交為網頁 Ruby 讀音標記格式,</div>
|
||||
<div>其拼音 / 注音書寫符合教科書書寫排版規範:</div>
|
||||
<div>也就是拼音標調在字母上、注音先寫輕聲標記。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>組字區有內容時才會生效;</div>
|
||||
<div>可在偏好設定內設定是輸出注音還是拼音。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌃⌘⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>將當前組字區的讀音串單獨遞交輸出,</div>
|
||||
<div>輸出的漢語拼音採 12345 數字標調、</div>
|
||||
<div>輸出的注音的輕聲標記是在注音符號之後才寫的。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>組字區有內容時才會生效;</div>
|
||||
<div>可在偏好設定內設定是輸出注音還是拼音;</div>
|
||||
<div>預設情況下,讀音以西文半形空格相連,但是</div>
|
||||
<div>在威注音語彙編輯器內則以西文半形減號相連</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇧␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>在組字區內沒有內容時,輸入全形空格</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>可摁住不放以連續輸入。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>摁住 ⌥⇧</div>
|
||||
<div>敲數字鍵</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>在組字區內沒有內容時,用來輸入全形阿拉伯數字</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>如果目前已經啟用了半形標點模式的話,</div>
|
||||
<div>則該熱鍵會輸入半形阿拉伯數字。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>~</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>分類波浪符號選單(類似新酷音),</div>
|
||||
<div>可在使用者辭典目錄內寫 symbols.dat 自訂內容。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>JIS 鍵盤注意:</div>
|
||||
<div>得用右 Shift 左側的「_」鍵取代「~」鍵。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⌥ ~</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>不分類的波浪符號選單(類似小麥注音)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>JIS 鍵盤注意:</div>
|
||||
<div>得用右 Shift 左側的「_」鍵取代「~」鍵。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇞</div>
|
||||
<div>⇟</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>呼叫選字窗</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>組字區有內容時才會生效。</div>
|
||||
<div>逐字選字模式會自動跳選字窗。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>呼叫選字窗</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>同上,但可在偏好設定內停用。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⎋</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>非標記模式下,清空整個組字區。</div>
|
||||
<div>標記模式下,退出標記模式。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>其在非標記模式下的行為可在偏好設定內停用,屆時僅會清空注拼槽。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>右⇧</div>
|
||||
<div>左⇧</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>切換英數輸入模式的開關。</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>左⇧可在偏好設定內停用。</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>下述熱鍵則為<strong>預設 Voltaire MK3 選字窗正在顯示(也就是你正在選字)時</strong>可以用的功能:</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>熱鍵</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>功能</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>備註</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>確認選字窗內的當前候選字</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>聯想詞選字時,該功能可在偏好設定內啟用或停用。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇥</div>
|
||||
<div>⇧⇥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 選字窗內選中下一個候選字(正向輪替)</div>
|
||||
<div>‧ 選字窗內選中上一個候選字(反向輪替)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>可以在偏好設定內更改輪替對象為頁,但是有例外:</div>
|
||||
<div>當候選字詞只有一頁時,輪替對象仍為候選字詞本身。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
<div>⇧␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>根據輸入法偏好設定來決定</div>
|
||||
<div>是正向輪替頁面還是候選字詞</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>當候選字詞只有一頁時,輪替對象仍為候選字詞本身。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇞</div>
|
||||
<div>⇟</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>翻頁</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>候選字詞只有一頁時,輪替對象為候選字詞本身。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>↖︎</div>
|
||||
<div>↘︎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 選中第一個候選字</div>
|
||||
<div>‧ 選中最後一個候選字</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>多餘的操作會觸發蜂鳴。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⎋</div>
|
||||
<div>⌫</div>
|
||||
<div>⌦</div>
|
||||
<div>⇧→</div>
|
||||
<div>⇧←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>回退到上一層符號選單、或關掉選字窗</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>不是符號選單狀態的場合,一律關掉選字窗。</div>
|
||||
<div>其中,Esc 按鍵可能會導致 Spotlight 關閉。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>摁住 ⇧</div>
|
||||
<div>敲選字鍵</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>選擇指定的聯想候選詞(會有^標記)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>與奇摩輸入法行為一致。</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>下述熱鍵則為在開發道場內啟用的 <strong>IMK 選字窗正在顯示(也就是你正在選字)時</strong>可以用的功能:</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div><strong>熱鍵</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>功能</strong></div>
|
||||
</td>
|
||||
<td>
|
||||
<div><strong>備註</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⏎</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>確認選字窗內的當前候選字</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>聯想詞選字時,該功能可在偏好設定內啟用或停用。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇥</div>
|
||||
<div>⇧⇥</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>‧ 選字窗內選中下一個候選字(正向輪替)</div>
|
||||
<div>‧ 選字窗內選中上一個候選字(反向輪替)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>可以在偏好設定內更改輪替對象為頁。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>␣</div>
|
||||
<div>⇧␣</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>根據輸入法偏好設定來決定</div>
|
||||
<div>是正向輪替頁面還是候選字詞</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>輪替對象種類不會改變。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⇞</div>
|
||||
<div>⇟</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>翻頁</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>候選字詞只有一頁時,輪替對象種類也不會改變。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>⎋</div>
|
||||
<div>⌫</div>
|
||||
<div>⌦</div>
|
||||
<div>⇧→</div>
|
||||
<div>⇧←</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>回退到上一層符號選單、或關掉選字窗</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>不是符號選單狀態的場合,一律關掉選字窗。</div>
|
||||
<div>其中,Esc 按鍵可能會導致 Spotlight 關閉。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>摁住 ⇧</div>
|
||||
<div>敲選字鍵</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>選擇指定的聯想候選詞(會有^標記)</div>
|
||||
</td>
|
||||
<td>
|
||||
<div>與奇摩輸入法行為一致。</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div> </div>
|
||||
<div>$ EOF.</div>
|
||||
</body>
|
||||
</html>
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21223" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21223"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
|
@ -719,7 +718,7 @@
|
|||
<constraints>
|
||||
<constraint firstAttribute="height" constant="16" id="lGu-fQ-Nvc"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="check" title="Enable CNS11643 Support (2022-07-20)" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="W24-T4-cg0">
|
||||
<buttonCell key="cell" type="check" title="Enable CNS11643 Support (2022-08-02)" bezelStyle="regularSquare" imagePosition="left" controlSize="small" inset="2" id="W24-T4-cg0">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="cellTitle"/>
|
||||
</buttonCell>
|
||||
|
|
|
@ -84,7 +84,7 @@
|
|||
"ueU-Rz-a1C.title" = "Choose the behavior of (Shift+)Tab key in the candidate window.";
|
||||
"VdT-fw-7pQ.title" = "Debug Mode";
|
||||
"vpd-zx-GIk.title" = "Seigyou (JinYei)";
|
||||
"W24-T4-cg0.title" = "Enable CNS11643 Support (2022-07-20)";
|
||||
"W24-T4-cg0.title" = "Enable CNS11643 Support (2022-08-02)";
|
||||
"wFR-zX-M8H.title" = "Show Hanyu-Pinyin in the inline composition buffer & tooltip";
|
||||
"wN3-k3-b2a.title" = "Choose your desired user data folder path. Will be omitted if invalid.";
|
||||
"wQ9-px-b07.title" = "Apple Dynamic Bopomofo Basic Keyboard Layouts (Dachen & Eten Traditional) must match the Dachen parser in order to be functional.";
|
||||
|
|
|
@ -57,7 +57,7 @@
|
|||
"FVC-br-H57.title" = "候補文字そのもの";
|
||||
"GlJ-Ns-9eE.title" = "システム設定に準ずる";
|
||||
"hSv-LJ-Cq3.title" = "僅かなる絵文字も含む符号入力サポートを起用";
|
||||
"iRg-wx-Nx2.title" = "入力候補陣列の候補文字の字号をご指定ください。";
|
||||
"iRg-wx-Nx2.title" = "入力候補陳列の候補文字の字号をご指定ください。";
|
||||
"iWy-Nw-QKB.title" = "Ctrl(+Option)+Command+Enter で出すのを漢語弁音と変換";
|
||||
"jQC-12-UuK.ibShadowedObjectValues[0]" = "Item 1";
|
||||
"jQC-12-UuK.ibShadowedObjectValues[1]" = "Item 2";
|
||||
|
@ -84,7 +84,7 @@
|
|||
"ueU-Rz-a1C.title" = "入力候補陳列での (Shift+)Tab キーの輪番切替対象をご指定ください。";
|
||||
"VdT-fw-7pQ.title" = "欠陥辿着モード";
|
||||
"vpd-zx-GIk.title" = "精業配列";
|
||||
"W24-T4-cg0.title" = "全字庫モード // 入力可能の漢字数倍増 (2022-07-20)";
|
||||
"W24-T4-cg0.title" = "全字庫モード // 入力可能の漢字数倍増 (2022-08-02)";
|
||||
"wFR-zX-M8H.title" = "弁音合併入力(入力緩衝列とヒントで音読みを漢語弁音に)";
|
||||
"wN3-k3-b2a.title" = "欲しがるユーザー辞書保存先をご指定ください。無効の保存先設定は効かぬ。";
|
||||
"wQ9-px-b07.title" = "Apple 動態注音キーボード (大千と倚天伝統) を使うには、共通語分析器の注音配列を大千と設定すべきである。";
|
||||
|
|
|
@ -84,7 +84,7 @@
|
|||
"ueU-Rz-a1C.title" = "指定 (Shift+)Tab 热键在选字窗内的轮替操作对象。";
|
||||
"VdT-fw-7pQ.title" = "侦错模式";
|
||||
"vpd-zx-GIk.title" = "精业";
|
||||
"W24-T4-cg0.title" = "启用 CNS11643 全字库支援 (2022-07-20)";
|
||||
"W24-T4-cg0.title" = "启用 CNS11643 全字库支援 (2022-08-02)";
|
||||
"wFR-zX-M8H.title" = "拼音并击(组字区与工具提示内显示汉语拼音)";
|
||||
"wN3-k3-b2a.title" = "请在此指定您想指定的使用者语汇档案目录。无效值会被忽略。";
|
||||
"wQ9-px-b07.title" = "Apple 动态注音键盘布局(大千与倚天)要求普通话/国音分析器的注音排列得配置为大千排列。";
|
||||
|
|
|
@ -84,7 +84,7 @@
|
|||
"ueU-Rz-a1C.title" = "指定 (Shift+)Tab 熱鍵在選字窗內的輪替操作對象。";
|
||||
"VdT-fw-7pQ.title" = "偵錯模式";
|
||||
"vpd-zx-GIk.title" = "精業";
|
||||
"W24-T4-cg0.title" = "啟用 CNS11643 全字庫支援 (2022-07-20)";
|
||||
"W24-T4-cg0.title" = "啟用 CNS11643 全字庫支援 (2022-08-02)";
|
||||
"wFR-zX-M8H.title" = "拼音並擊(組字區與工具提示內顯示漢語拼音)";
|
||||
"wN3-k3-b2a.title" = "請在此指定您想指定的使用者語彙檔案目錄。無效值會被忽略。";
|
||||
"wQ9-px-b07.title" = "Apple 動態注音鍵盤佈局(大千與倚天)要求普通話/國音分析器的注音排列得配置為大千排列。";
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2.0.0</string>
|
||||
<string>2.1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2002</string>
|
||||
<string>2101</string>
|
||||
<key>UpdateInfoEndpoint</key>
|
||||
<string>https://gitee.com/vchewing/vChewing-macOS/raw/main/Update-Info.plist</string>
|
||||
<key>UpdateInfoSite</key>
|
||||
|
|
|
@ -726,7 +726,7 @@
|
|||
<key>USE_HFS+_COMPRESSION</key>
|
||||
<false/>
|
||||
<key>VERSION</key>
|
||||
<string>2.0.0</string>
|
||||
<string>2.1.0</string>
|
||||
</dict>
|
||||
<key>TYPE</key>
|
||||
<integer>0</integer>
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
5B09307628B6FC3B0021F8C5 /* shortcuts.html in Resources */ = {isa = PBXBuildFile; fileRef = 5B09307828B6FC3B0021F8C5 /* shortcuts.html */; };
|
||||
5B0AF8B527B2C8290096FE54 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0AF8B427B2C8290096FE54 /* StringExtension.swift */; };
|
||||
5B11328927B94CFB00E58451 /* AppleKeyboardConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B11328827B94CFB00E58451 /* AppleKeyboardConverter.swift */; };
|
||||
5B21176C287539BB000443A9 /* ctlInputMethod_HandleStates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B21176B287539BB000443A9 /* ctlInputMethod_HandleStates.swift */; };
|
||||
|
@ -203,6 +204,10 @@
|
|||
5B05A47B27AFF7CA00437698 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
5B05A47C27AFF7CF00437698 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
5B05A47F27AFF84200437698 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/frmAboutWindow.strings; sourceTree = "<group>"; };
|
||||
5B09307728B6FC3B0021F8C5 /* zh-Hant */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; lineEnding = 0; name = "zh-Hant"; path = "zh-Hant.lproj/shortcuts.html"; sourceTree = "<group>"; };
|
||||
5B09307928B6FC3F0021F8C5 /* zh-Hans */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; lineEnding = 0; name = "zh-Hans"; path = "zh-Hans.lproj/shortcuts.html"; sourceTree = "<group>"; };
|
||||
5B09307A28B6FC400021F8C5 /* en */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; lineEnding = 0; name = en; path = en.lproj/shortcuts.html; sourceTree = "<group>"; };
|
||||
5B09307B28B6FC410021F8C5 /* ja */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; lineEnding = 0; name = ja; path = ja.lproj/shortcuts.html; sourceTree = "<group>"; };
|
||||
5B0AF8B427B2C8290096FE54 /* StringExtension.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = StringExtension.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
||||
5B0C5EDF27C7D9870078037C /* dataCompiler.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = dataCompiler.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
||||
5B11328827B94CFB00E58451 /* AppleKeyboardConverter.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = AppleKeyboardConverter.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
||||
|
@ -532,6 +537,7 @@
|
|||
5B62A33027AE78E500A19448 /* Resources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5B09307828B6FC3B0021F8C5 /* shortcuts.html */,
|
||||
5BF9DA2428840E6200DBD48E /* template-associatedPhrases-chs.txt */,
|
||||
5BF9DA2C2884247800DBD48E /* template-associatedPhrases-cht.txt */,
|
||||
5BF9DA2328840E6200DBD48E /* template-exclusions.txt */,
|
||||
|
@ -1049,6 +1055,7 @@
|
|||
5BF9DA2D288427E000DBD48E /* template-associatedPhrases-cht.txt in Resources */,
|
||||
5BEDB725283B4C250078EB25 /* data-chs.plist in Resources */,
|
||||
5BF9DA2928840E6200DBD48E /* template-associatedPhrases-chs.txt in Resources */,
|
||||
5B09307628B6FC3B0021F8C5 /* shortcuts.html in Resources */,
|
||||
5BBBB76D27AED5DB0023B93A /* frmAboutWindow.xib in Resources */,
|
||||
5BF9DA2B28840E6200DBD48E /* template-userphrases.txt in Resources */,
|
||||
5BBBB77527AED70B0023B93A /* MenuIcon-SCVIM.png in Resources */,
|
||||
|
@ -1281,6 +1288,17 @@
|
|||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
5B09307828B6FC3B0021F8C5 /* shortcuts.html */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
5B09307728B6FC3B0021F8C5 /* zh-Hant */,
|
||||
5B09307928B6FC3F0021F8C5 /* zh-Hans */,
|
||||
5B09307A28B6FC400021F8C5 /* en */,
|
||||
5B09307B28B6FC410021F8C5 /* ja */,
|
||||
);
|
||||
name = shortcuts.html;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
5B73FB6027B2BE1300E9BF49 /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
|
@ -1431,7 +1449,7 @@
|
|||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2002;
|
||||
CURRENT_PROJECT_VERSION = 2101;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
|
@ -1441,7 +1459,7 @@
|
|||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 2.0.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests;
|
||||
|
@ -1470,13 +1488,13 @@
|
|||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2002;
|
||||
CURRENT_PROJECT_VERSION = 2101;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 2.0.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewingTests;
|
||||
|
@ -1507,7 +1525,7 @@
|
|||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 2002;
|
||||
CURRENT_PROJECT_VERSION = 2101;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
|
@ -1528,7 +1546,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 2.0.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor;
|
||||
|
@ -1557,7 +1575,7 @@
|
|||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 2002;
|
||||
CURRENT_PROJECT_VERSION = 2101;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
|
@ -1574,7 +1592,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 2.0.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor;
|
||||
|
@ -1689,7 +1707,7 @@
|
|||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 2002;
|
||||
CURRENT_PROJECT_VERSION = 2101;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = "";
|
||||
|
@ -1717,7 +1735,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 2.0.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
|
@ -1746,7 +1764,7 @@
|
|||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 2002;
|
||||
CURRENT_PROJECT_VERSION = 2101;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = "";
|
||||
|
@ -1768,7 +1786,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 2.0.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
|
@ -1791,7 +1809,7 @@
|
|||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 2002;
|
||||
CURRENT_PROJECT_VERSION = 2101;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
|
@ -1811,7 +1829,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 2.0.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingInstaller;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
|
@ -1833,7 +1851,7 @@
|
|||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 2002;
|
||||
CURRENT_PROJECT_VERSION = 2101;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
|
@ -1847,7 +1865,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 2.0.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingInstaller;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
|
|
|
@ -467,9 +467,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testInvalidBpmf() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("eul4").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("eul4").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -482,9 +480,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testInputting() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("18 m,45j/ fu. g0 xup6xu;6").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("18 m,45j/ fu. g0 xup6xu;6").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -500,9 +496,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testInputtingNihao() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -518,9 +512,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testInputtingTianKong() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("wu0 dj/ ").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("wu0 dj/ ").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -536,9 +528,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testCommittingNihao() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -580,9 +570,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testDelete() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -662,9 +650,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testBackspaceToDeleteReading() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -696,9 +682,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testBackspaceAtBegin() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -739,9 +723,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testBackspaceToDeleteReadingWithText() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -777,9 +759,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testBackspace() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -818,9 +798,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testCursorWithReading() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -855,9 +833,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testCursor() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -948,9 +924,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testCandidateWithDown() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -985,9 +959,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
let enabled = mgrPrefs.chooseCandidateUsingSpace
|
||||
mgrPrefs.chooseCandidateUsingSpace = true
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -1023,9 +995,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
let enabled = mgrPrefs.chooseCandidateUsingSpace
|
||||
mgrPrefs.chooseCandidateUsingSpace = false
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: InputState.Empty()) { newState in
|
||||
|
@ -1079,9 +1049,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
let enabled = mgrPrefs.chooseCandidateUsingSpace
|
||||
mgrPrefs.chooseCandidateUsingSpace = false
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -1117,9 +1085,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testHomeAndEnd() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -1191,9 +1157,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testHomeAndEndWithReading() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -1245,9 +1209,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testMarkingLeftAtBegin() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -1279,9 +1241,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testMarkingRightAtEnd() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -1304,9 +1264,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testMarkingLeft() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -1371,9 +1329,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testMarkingRight() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -1455,9 +1411,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
|
||||
func testCancelMarking() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -1503,9 +1457,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
let enabled = mgrPrefs.escToCleanInputBuffer
|
||||
mgrPrefs.escToCleanInputBuffer = false
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -1535,9 +1487,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
let enabled = mgrPrefs.escToCleanInputBuffer
|
||||
mgrPrefs.escToCleanInputBuffer = false
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -1571,9 +1521,7 @@ class KeyHandlerTestsNormalCHS: XCTestCase {
|
|||
let enabled = mgrPrefs.escToCleanInputBuffer
|
||||
mgrPrefs.escToCleanInputBuffer = true
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3cl").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3cl").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [], isVerticalTyping: false)
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
|
|
@ -190,9 +190,7 @@ class KeyHandlerTestsSCPCCHT: XCTestCase {
|
|||
|
||||
func testInputNi() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [])
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -209,9 +207,7 @@ class KeyHandlerTestsSCPCCHT: XCTestCase {
|
|||
|
||||
func testInputNi3() {
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [])
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -230,9 +226,7 @@ class KeyHandlerTestsSCPCCHT: XCTestCase {
|
|||
func testCancelCandidateUsingDelete() {
|
||||
mgrPrefs.useSCPCTypingMode = true
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [])
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -257,9 +251,7 @@ class KeyHandlerTestsSCPCCHT: XCTestCase {
|
|||
func testCancelCandidateUsingEsc() {
|
||||
mgrPrefs.useSCPCTypingMode = true
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("su3").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("su3").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [])
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -285,9 +277,7 @@ class KeyHandlerTestsSCPCCHT: XCTestCase {
|
|||
mgrPrefs.useSCPCTypingMode = true
|
||||
handler.forceOpenStringInsteadForAssociatePhrases("二 百五")
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("-41").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("-41").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [])
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
@ -308,9 +298,7 @@ class KeyHandlerTestsSCPCCHT: XCTestCase {
|
|||
let enabled = mgrPrefs.associatedPhrasesEnabled
|
||||
mgrPrefs.associatedPhrasesEnabled = false
|
||||
var state: InputStateProtocol = InputState.Empty()
|
||||
let keys = Array("aul ").map {
|
||||
String($0)
|
||||
}
|
||||
let keys = Array("aul ").charComponents
|
||||
for key in keys {
|
||||
let input = InputSignal(inputText: key, keyCode: 0, charCode: charCode(key), flags: [])
|
||||
_ = handler.handle(input: input, state: state) { newState in
|
||||
|
|
Loading…
Reference in New Issue