分享和討論倉頡輸入法相關的資訊和内容
版面规则
公正客觀講理,杜絶廢話連篇
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

現在按這個rime配置,我實現了用;'選二三重,但是我如果同時也想用數字鍵2和3選重,要如何改?

代码: 全选

在 Rime (鼠鬚管/小狼毫) 配置中,`alternative_select_keys` 只能為每個候選位置指定單一按鍵。如果您希望**同時**支援 `;`、`'` 和數字鍵 `2`、`3` 來選取第二、三重,最標準且穩定的做法是利用 **`key_binder`(按鍵綁定)** 功能。

請按照以下三個步驟修改您的 `haha.schema.yaml` 檔案:

### 1. 在 `engine/processors` 中啟用 `key_binder`

原本的配置中缺少了按鍵編譯器,需要將 `- key_binder` 加進去(建議放在靠前的位置,以便優先攔截按鍵):

```yaml
engine:
  processors:
    - ascii_composer
    - key_binder        # 新增這一行
    - speller
    - selector
    - punctuator
    - express_editor

```

---

### 2. 修改 `menu` 區塊

將原本的 `alternative_select_keys` 改回標準的數字選鍵 `select_keys`。這樣一來,選單預設就會支援 `2` 和 `3` 鍵,且候選字標籤會顯示為數字:

```yaml
menu:
  page_size: 9
  select_keys: "123456789"  # 改為標準數字選鍵

```

---

### 3. 在檔案末尾添加 `key_binder` 設定

新增以下區塊。這段程式碼的意思是:當畫面上**有候選字選單時(`when: has_menu`)**,按下分號 `;` 會自動映射為數字 `2`,按下單引號 `'` 會自動映射為數字 `3`;而當沒有候選選單時,它們依然會維持原本的標點符號功能。

```yaml
key_binder:
  bindings:
    - { accept: semicolon, send: 2, when: has_menu }
    - { accept: apostrophe, send: 3, when: has_menu }

```

---

> **提示:** 修改完成並儲存檔案後,切換到該輸入法並點擊 Rime 的 **「重新部署」(Deploy)**,新設定就會立即生效。此時不論您按 `;`、`'` 還是數字鍵 `2`、`3`,都能順利選取對應的候選字。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

代码: 全选

在.lime格式的導出中,文件頭更改為:

@format@|lime-text-v2
@version@|日期加時間
@cname@|哈哈倉頡
@selkey@|123456789
@endkey@|abcdefghijklmnopqrstuvwxyz
@spacestyle@|0
%chardef begin
code|word|score|basescore
aa|測|0|123
ab|試|0|456
%chardef end


碼表內容寫在
%chardef begin
至
%chardef end
之中,其中第四欄使用之前的倒序數字。

如遇以下符號則轉碼:

\\ = literal backslash
\| = literal pipe when `|` is the delimiter
\@ = literal at-sign
\% = literal percent

只需給出要修改的地方,不需要注釋,不要有空行。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

gemini thinking:

代码: 全选

const limeFilename = `lime_${fileVersion}.txt`;
const d = new Date();
const dateTimeStr = d.getFullYear() + String(d.getMonth() + 1).padStart(2, '0') + String(d.getDate()).padStart(2, '0') + String(d.getHours()).padStart(2, '0') + String(d.getMinutes()).padStart(2, '0') + String(d.getSeconds()).padStart(2, '0');
const escapeLime = (str) => str.replace(/\\/g, '\\\\').replace(/\|/g, '\\|').replace(/@/g, '\\@').replace(/%/g, '\\%');
const limeHeader = `@format@|lime-text-v2\n@version@|${dateTimeStr}\n@cname@|哈哈倉頡\n@selkey@|123456789\n@endkey@|abcdefghijklmnopqrstuvwxyz\n@spacestyle@|0\n%chardef begin\ncode|word|score|basescore`;
const limeBody = tableLines.map((line, index) => {
const [code, char] = line.split('\t');
return `${escapeLime(code)}|${escapeLime(char)}|0|${totalLines - index}`;
}).join('\n');
const limeContent = `${limeHeader}\n${limeBody}\n%chardef end`;
createDownloadLink(limeFilename, limeContent);
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

haha_20260523_162540.lime2

試試看這個行不行。
附件
haha_20260523_162540.lime2.7z
(161.71 KiB) 已下载 23 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

domchar5751.html

在results-three-col內的三個textarea-header的最右邊處加上一個「轉textarea的svg按鈕」,當點擊時,其下方的result-scroll-list將隱藏,並在原位出現一個寬高相同的textarea,內容就是這個result-list。

需要給出所有要修改的地方和所要替換的代碼,不需給出全部代碼。
附件
domchar5751.html.7z
(14.5 KiB) 已下载 22 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

Close應該改為Finish,當執行Finish後,Reset Edit Changes應只能退回到最後一次Finish的狀態。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

gemini pro:

代码: 全选

這是一個非常實用且能提升工作效率的改進。我已經為你準備好對應的修改代碼。我們將分幾個部分進行替換,無需更動全部代碼,只需按照下方的指示覆蓋指定的區塊即可。

以下是需要修改的 5 個地方:

### 1. 修改 HTML:重構三欄顯示區與按鈕名稱

在 HTML 的 `<div class="results-three-col">` 區塊,我們加入 SVG 按鈕和對應的 Textarea。同時將 `btnCloseEdit` 按鈕名稱從 Close 改為 Finish。

**找到以下代碼:**

```html
          <div class="results-three-col">
            <div class="result-col">
              <div class="textarea-header">Duplication Results (<span id="dupResultCount">0</span>)</div>
              <ul id="collapseMultipleText" class="result-scroll-list"></ul>
            </div>
            <div class="result-col">
              <div class="textarea-header">Deduplication Results (<span id="dedupResultCount">0</span>)</div>
              <ul id="gzhahaText" class="result-scroll-list"></ul>
            </div>
            <div class="result-col">
              <div class="textarea-header">Out of Bounds (<span id="outOfBoundsCount">0</span>)</div>
              <ul id="outOfBoundsText" class="result-scroll-list"></ul>
            </div>
          </div>

```

和

```html
            <button id="btnCloseEdit" class="edit-action-btn" onclick="handleEditCloseOnly()">Close</button>

```

**替換為:**

```html
          <div class="results-three-col">
            <div class="result-col">
              <div class="textarea-header" style="display: flex; justify-content: space-between; align-items: center;">
                <span>Duplication Results (<span id="dupResultCount">0</span>)</span>
                <svg onclick="toggleTextarea('collapseMultipleText')" style="cursor:pointer; width:20px; height:20px; fill:#666; transition: fill 0.2s;" onmouseover="this.style.fill='#2196f3'" onmouseout="this.style.fill='#666'" viewBox="0 0 24 24"><path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z"/></svg>
              </div>
              <ul id="collapseMultipleText" class="result-scroll-list"></ul>
              <textarea id="collapseMultipleText_textarea" class="result-textarea" style="display:none; flex: 1; margin-top: 5px; box-sizing: border-box;"></textarea>
            </div>
            <div class="result-col">
              <div class="textarea-header" style="display: flex; justify-content: space-between; align-items: center;">
                <span>Deduplication Results (<span id="dedupResultCount">0</span>)</span>
                <svg onclick="toggleTextarea('gzhahaText')" style="cursor:pointer; width:20px; height:20px; fill:#666; transition: fill 0.2s;" onmouseover="this.style.fill='#2196f3'" onmouseout="this.style.fill='#666'" viewBox="0 0 24 24"><path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z"/></svg>
              </div>
              <ul id="gzhahaText" class="result-scroll-list"></ul>
              <textarea id="gzhahaText_textarea" class="result-textarea" style="display:none; flex: 1; margin-top: 5px; box-sizing: border-box;"></textarea>
            </div>
            <div class="result-col">
              <div class="textarea-header" style="display: flex; justify-content: space-between; align-items: center;">
                <span>Out of Bounds (<span id="outOfBoundsCount">0</span>)</span>
                <svg onclick="toggleTextarea('outOfBoundsText')" style="cursor:pointer; width:20px; height:20px; fill:#666; transition: fill 0.2s;" onmouseover="this.style.fill='#2196f3'" onmouseout="this.style.fill='#666'" viewBox="0 0 24 24"><path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z"/></svg>
              </div>
              <ul id="outOfBoundsText" class="result-scroll-list"></ul>
              <textarea id="outOfBoundsText_textarea" class="result-textarea" style="display:none; flex: 1; margin-top: 5px; box-sizing: border-box;"></textarea>
            </div>
          </div>

```

和

```html
            <button id="btnCloseEdit" class="edit-action-btn" onclick="handleEditCloseOnly()">Finish</button>

```

---

### 2. 添加 SVG 切換顯示的 JavaScript 邏輯

請將這段處理 `ul` 列表和 `textarea` 切換的函式加在 `<script>` 的最底部(或 `switchTab` 函式下方)。

**新增代碼:**

```javascript
      function toggleTextarea(id) {
        const list = document.getElementById(id);
        const ta = document.getElementById(id + '_textarea');
        if (list.style.display !== 'none') {
          list.style.display = 'none';
          ta.style.display = 'block';
        } else {
          list.style.display = 'block';
          ta.style.display = 'none';
        }
      }

```

---

### 3. 將資料同步賦值給 Textarea

在 `runDomu1LogicAndGetIntegratedText` 函式中,當程式渲染 list 的同時,也把原始文本放入 textarea 中。

**找到以下代碼:**

```javascript
        document.getElementById('collapseMultipleText').innerHTML = createClickableList(collapseLines);
        document.getElementById('dupResultCount').textContent = collapseLines.length;

        document.getElementById('gzhahaText').innerHTML = createClickableList(gzhahaLines);
        document.getElementById('dedupResultCount').textContent = gzhahaLines.length;

        document.getElementById('outOfBoundsText').innerHTML = createClickableList(outOfBoundsLines);
        document.getElementById('outOfBoundsCount').textContent = outOfBoundsLines.length;

```

**替換為:**

```javascript
        document.getElementById('collapseMultipleText').innerHTML = createClickableList(collapseLines);
        document.getElementById('collapseMultipleText_textarea').value = collapseLines.join('\n');
        document.getElementById('dupResultCount').textContent = collapseLines.length;

        document.getElementById('gzhahaText').innerHTML = createClickableList(gzhahaLines);
        document.getElementById('gzhahaText_textarea').value = gzhahaLines.join('\n');
        document.getElementById('dedupResultCount').textContent = gzhahaLines.length;

        document.getElementById('outOfBoundsText').innerHTML = createClickableList(outOfBoundsLines);
        document.getElementById('outOfBoundsText_textarea').value = outOfBoundsLines.join('\n');
        document.getElementById('outOfBoundsCount').textContent = outOfBoundsLines.length;

```

---

### 4. 修改 Finish (Close) 邏輯,保存為最新的撤銷狀態基準點

在 `handleEditCloseOnly` 中,不再清除快照(`originalSnapshotState.clear()`),而是將當下的狀態重新記錄為最新基準點。

**找到以下代碼:**

```javascript
      // Closes the editing interface and returns to the input box viewport
      function handleEditCloseOnly() {
        document.getElementById('inputArea').style.display = 'block';
        document.getElementById('editArea').style.display = 'none';
        document.getElementById('codeInput').value = '';
        currentEditCode = '';
        currentTargetWord = '';
        selectedEditItem = null;
        justMovedItem = null;
        activeEditKeys.clear();
        changedWords.clear();
        pendingAction = null;
        originalSnapshotState.clear();
        undoStack = [];
        redoStack = [];
        renderActionLogs(); // Visually empty out the log UI on close
        updateActionButtonsUI();
      }

```

**替換為:**

```javascript
      // Finishes the editing session and establishes current state as the new baseline
      function handleEditCloseOnly() {
        document.getElementById('inputArea').style.display = 'block';
        document.getElementById('editArea').style.display = 'none';
        document.getElementById('codeInput').value = '';
        
        // 將當前的編輯結果保存為下一次 Reset 的新基準點
        originalSnapshotState = getSystemState();
        
        currentEditCode = '';
        currentTargetWord = '';
        selectedEditItem = null;
        justMovedItem = null;
        activeEditKeys.clear();
        changedWords.clear();
        pendingAction = null;
        undoStack = [];
        redoStack = [];
        renderActionLogs(); // Visually empty out the log UI on close
        updateActionButtonsUI();
      }

```
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

domchar5752.html

Reset只退回到上一次finish的狀態。「重碼情況、尹末去重、四碼重碼」都能變為textarae。
附件
domchar5752.html.7z
(14.95 KiB) 已下载 15 次
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

  haha:
    ascii_mode: 0
    author: "尹卂"
    height: 50
    name: "哈哈倉頡鍵盤"
    keys: [{click: "Up", width: "25", height: "30"}, {click: "Down", width: "25", height: "30"}, {click: "Left", width: "25", height: "30"}, {click: "Right", width: "25", height: "30"}, {click: q, label: "手", long_click: "!"}, {click: w, label: "田", long_click: "@"}, {click: e, label: "水", long_click: "#"}, {click: r, label: "口", long_click: "$"}, {click: t, label: "廿", long_click: "%"}, {click: y, label: "卜", long_click: "^"}, {click: u, label: "山", long_click: "&"}, {click: i, label: "戈", long_click: "*"}, {click: o, label: "人", long_click: "("}, {click: p, label: "心", long_click: ")"}, {width: 5}, {click: a, label: "日", long_click: "`"}, {click: s, label: "尸", long_click: "~"}, {click: d, label: "木", long_click: "-"}, {click: f, label: "火", long_click: "_"}, {click: g, label: "土", long_click: "="}, {click: h, label: "竹", long_click: "+"}, {click: j, label: "十", long_click: ";"}, {click: k, label: "大", long_click: ":"}, {click: l, label: "中", long_click: "'"}, {click: Shift_L, send_bindings: false, width: "15"}, {click: z, label: "重", long_click: "\""}, {click: x, label: "難", long_click: "{"}, {click: c, label: "金", long_click: "}"}, {click: v, label: "女", long_click: "|"}, {click: b, label: "月", long_click: "\\"}, {click: n, label: "弓", long_click: "["}, {click: m, label: "一", long_click: "]"}, {click: BackSpace, width: 15}, {click: Mode_switch, width: "15"}, {click: Keyboard_symbols}, {ascii: ",", click: ",", long_click: "<"}, {click: space, width: 30}, {ascii: ".", click: ".", long_click: ">"}, {ascii: "/", click: "/", long_click: "?"}, {click: Return, composing: Return1, long_click: Escape, width: 15}]
    width: 10

以上是trime輸入法的鍵盤配置。現在我希望中文時shift是esc,英文時才是shift,如何修改?

代码: 全选

  haha:
    ascii_mode: 0
    author: "尹卂"
    height: 50
    name: "哈哈倉頡鍵盤"
    keys: [{click: "Up", width: "25", height: "30"}, {click: "Down", width: "25", height: "30"}, {click: "Left", width: "25", height: "30"}, {click: "Right", width: "25", height: "30"}, {click: q, label: "手", long_click: "!"}, {click: w, label: "田", long_click: "@"}, {click: e, label: "水", long_click: "#"}, {click: r, label: "口", long_click: "$"}, {click: t, label: "廿", long_click: "%"}, {click: y, label: "卜", long_click: "^"}, {click: u, label: "山", long_click: "&"}, {click: i, label: "戈", long_click: "*"}, {click: o, label: "人", long_click: "("}, {click: p, label: "心", long_click: ")"}, {width: 5}, {click: a, label: "日", long_click: "`"}, {click: s, label: "尸", long_click: "~"}, {click: d, label: "木", long_click: "-"}, {click: f, label: "火", long_click: "_"}, {click: g, label: "土", long_click: "="}, {click: h, label: "竹", long_click: "+"}, {click: j, label: "十", long_click: ";"}, {click: k, label: "大", long_click: ":"}, {click: l, label: "中", long_click: "'"}, {click: Shift_L, send_bindings: false, width: "15"}, {click: z, label: "重", long_click: "\""}, {click: x, label: "難", long_click: "{"}, {click: c, label: "金", long_click: "}"}, {click: v, label: "女", long_click: "|"}, {click: b, label: "月", long_click: "\\"}, {click: n, label: "弓", long_click: "["}, {click: m, label: "一", long_click: "]"}, {click: BackSpace, width: 15}, {click: Mode_switch, width: "15"}, {click: Keyboard_symbols}, {ascii: ",", click: ",", long_click: "<"}, {click: space, width: 30}, {ascii: ".", click: ".", long_click: ">"}, {ascii: "/", click: "/", long_click: "?"}, {click: Return, composing: Return1, long_click: Escape, width: 15}]
    width: 10

以上是trime輸入法的鍵盤配置。現在我希望中文時shift是esc,英文時才是shift,如何修改?

代码: 全选

在 Trime(同文輸入法)中,鍵盤配置是透過 `ascii_mode` 來區分中文與英文模式的。在你提供的配置中,開頭已經指定了 `ascii_mode: 0`(代表這是**中文模式**的鍵盤)。

要達到「中文時 Shift 變成 Escape,英文時保持 Shift」的需求,最乾淨的做法是將中文鍵盤配置中的 `Shift_L` 修改為 `Escape`,並確保你有另一個 `ascii_mode: 1` 的英文鍵盤配置。

以下是具體的修改步驟:

### 1. 修改中文鍵盤配置(haha)

在你原本的 `haha` 配置中,找到左下角的 `Shift_L` 按鍵:
`{click: Shift_L, send_bindings: false, width: "15"}`

將它修改為 `Escape`。為了讓鍵盤表面更直觀,建議加上 `label: "Esc"`:

```yaml
{click: Escape, label: "Esc", width: "15"}

```

---

### 2. 完整修改後的中文鍵盤代碼

修改後的 `haha` 區塊如下(已將 `Shift_L` 改為 `Escape`):

```yaml
  haha:
    ascii_mode: 0
    author: "尹卂"
    height: 50
    name: "哈哈倉頡鍵盤"
    keys: [{click: "Up", width: "25", height: "30"}, {click: "Down", width: "25", height: "30"}, {click: "Left", width: "25", height: "30"}, {click: "Right", width: "25", height: "30"}, {click: q, label: "手", long_click: "!"}, {click: w, label: "田", long_click: "@"}, {click: e, label: "水", long_click: "#"}, {click: r, label: "口", long_click: "$"}, {click: t, label: "廿", long_click: "%"}, {click: y, label: "卜", long_click: "^"}, {click: u, label: "山", long_click: "&"}, {click: i, label: "戈", long_click: "*"}, {click: o, label: "人", long_click: "("}, {click: p, label: "心", long_click: ")"}, {width: 5}, {click: a, label: "日", long_click: "`"}, {click: s, label: "尸", long_click: "~"}, {click: d, label: "木", long_click: "-"}, {click: f, label: "火", long_click: "_"}, {click: g, label: "土", long_click: "="}, {click: h, label: "竹", long_click: "+"}, {click: j, label: "十", long_click: ";"}, {click: k, label: "大", long_click: ":"}, {click: l, label: "中", long_click: "'"}, {click: Escape, label: "Esc", width: "15"}, {click: z, label: "重", long_click: "\""}, {click: x, label: "難", long_click: "{"}, {click: c, label: "金", long_click: "}"}, {click: v, label: "女", long_click: "|"}, {click: b, label: "月", long_click: "\\"}, {click: n, label: "弓", long_click: "["}, {click: m, label: "一", long_click: "]"}, {click: BackSpace, width: 15}, {click: Mode_switch, width: "15"}, {click: Keyboard_symbols}, {ascii: ",", click: ",", long_click: "<"}, {click: space, width: 30}, {ascii: ".", click: ".", long_click: ">"}, {ascii: "/", click: "/", long_click: "?"}, {click: Return, composing: Return1, long_click: Escape, width: 15}]
    width: 10

```

---

### 3. 確保英文模式下仍是 Shift

如果你的 Trime 在切換到英文模式(由 `Mode_switch` 觸發)時,使用的是系統預設的 `latin` 鍵盤,那麼那邊的 Shift 本來就是正常的,你不需要做額外設定。

但如果你希望**英文模式也使用這個一模一樣的佈局,只是把 Esc 變回 Shift**,你需要在下方複製一份配置,建立一個專門給英文用的 `haha_ascii` 鍵盤:

```yaml
  haha_ascii:
    ascii_mode: 1  # 這裡設為 1 代表英文模式
    author: "尹卂"
    height: 50
    name: "哈哈倉頡鍵盤(英)"
    # 這裡的 keys 保持你原本的設定,也就是含有 {click: Shift_L, send_bindings: false, width: "15"} 的版本
    keys: [{click: "Up", width: "25", height: "30"}, {click: "Down", width: "25", height: "30"}, {click: "Left", width: "25", height: "30"}, {click: "Right", width: "25", height: "30"}, {click: q, label: "手", long_click: "!"}, {click: w, label: "田", long_click: "@"}, {click: e, label: "水", long_click: "#"}, {click: r, label: "口", long_click: "$"}, {click: t, label: "廿", long_click: "%"}, {click: y, label: "卜", long_click: "^"}, {click: u, label: "山", long_click: "&"}, {click: i, label: "戈", long_click: "*"}, {click: o, label: "人", long_click: "("}, {click: p, label: "心", long_click: ")"}, {width: 5}, {click: a, label: "日", long_click: "`"}, {click: s, label: "尸", long_click: "~"}, {click: d, label: "木", long_click: "-"}, {click: f, label: "火", long_click: "_"}, {click: g, label: "土", long_click: "="}, {click: h, label: "竹", long_click: "+"}, {click: j, label: "十", long_click: ";"}, {click: k, label: "大", long_click: ":"}, {click: l, label: "中", long_click: "'"}, {click: Shift_L, send_bindings: false, width: "15"}, {click: z, label: "重", long_click: "\""}, {click: x, label: "難", long_click: "{"}, {click: c, label: "金", long_click: "}"}, {click: v, label: "女", long_click: "|"}, {click: b, label: "月", long_click: "\\"}, {click: n, label: "弓", long_click: "["}, {click: m, label: "一", long_click: "]"}, {click: BackSpace, width: 15}, {click: Mode_switch, width: "15"}, {click: Keyboard_symbols}, {ascii: ",", click: ",", long_click: "<"}, {click: space, width: 30}, {ascii: ".", click: ".", long_click: ">"}, {ascii: "/", click: "/", long_click: "?"}, {click: Return, composing: Return1, long_click: Escape, width: 15}]
    width: 10

```

修改完成後,記得在手機上進入同文輸入法設定,點擊「部署」(Deploy)讓新的鍵盤設定生效。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

ejime網頁輸入法須改:

一,手機端,逗號和句號頂字上屏時,會彈出輸入法。

二,增加各種中文標點頂字上屏。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

rime如何設置可使當空碼時,即編碼不對應碼表中的任何字詞,按空白鍵會清空編碼而不是使英文串上屏?

代码: 全选

在 RIME 中,預設情況下如果輸入了碼表中不存在的「空碼」,按下空白鍵(Space)會將殘留的英文編碼直接送上螢幕。若想改為「按空白鍵直接清空編碼」,主要有以下兩種實現方式。您可以根據使用的輸入方案(拼音或形碼)選擇最適合的方法:

---

### 方法一:修改按鍵綁定(通用於所有方案,最推薦)

這個方法利用了 RIME 快捷鍵的順序匹配機制:**有候選字時正常選字,無候選字(空碼)時讓空白鍵化身為清空鍵(Escape)**。

請打開您的 **`default.custom.yaml`**(全局生效)或 **`方案ID.custom.yaml`**(僅特定方案生效,例如 `luna_pinyin.custom.yaml`),在 `patch:` 下加入以下設定:

```yaml
patch:
  # 使用 /+ 可以將新規則附加到既有清單後方,防止覆蓋掉原本預設的其他快捷鍵
  "key_binder/bindings/+:":
    - { when: has_menu, accept: space, send: space }   # 有候選字時,按空白鍵正常選字/上屏
    - { when: composing, accept: space, send: Escape } # 空碼時(有編碼但無候選字),按空白鍵等同於按 Esc 清空

```

> ⚠️ **重要細節:** 這兩行的**順序絕對不能顛倒**!因為當有候選字時,`composing`(編碼中)狀態同樣成立。如果把 `composing` 放前面,會導致不論有沒有字,按空白鍵都會直接把字串沖掉。

---

### 方法二:修改 Speller 自動清空設定(最適合形碼方案,如五筆、倉頡)

如果您使用的是五筆、倉頡、鄭碼等固定碼長或結構嚴謹的形碼方案,RIME 核心內建了 `speller/auto_clear` 屬性,處理起來會更為優雅。

請打開您的 **`方案ID.custom.yaml`**(例如 `wubi86.custom.yaml` 或 `cangjie5.custom.yaml`),在 `patch:` 下加入:

```yaml
patch:
  speller/auto_clear: manual

```

`auto_clear` 共有三種參數可供選擇,您可以依平時的打字習慣調整:

* **`manual`(手動清屏):** 當輸入出現空碼時,按下空白鍵、回車鍵或下一個字母鍵,會直接刷掉當前編碼,絕不上屏。
* **`auto`(自動清屏):** 只要一打出空碼(碼表中查無此組合),不需要按任何鍵,編碼就會在零點幾秒內自動消失。
* **`max_length`(滿碼清屏):** 只有在打滿最大碼長(例如五筆 4 碼、倉頡 5 碼)且依然是空碼時,按下一鍵才會自動清空。

---

### 💡 變更生效步驟

1. 編輯並儲存上述的 `.custom.yaml` 檔案(請務必注意 YAML 格式的縮排,必須使用空格,不能用 Tab)。
2. 右鍵點擊工作列或選單列的 RIME(小狼毫 / 鼠鬚管 / 中州韻)圖示。
3. 點選 **「重新部署」(Redeploy)**。
4. 部署完成後,就可以切換過去測試空碼時的清空效果了!
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

所上傳的是一個網頁輸入法,在手機端,當候選區有字時,按逗號會頂字上屏,即候選區的首字會和逗號一起上屏,這時為什麼會彈出手機的系統輸入法?

若單按逗號和句號,都不會彈出系統輸入法。

查找原因並給出解決方案。需要告知所要修改的地方,不需要給出全部代碼。

代码: 全选

這是一個非常經典的行動端瀏覽器焦點(Focus)處理問題!

### 🔍 查找原因

在你的 `ejcjclick(e)`(處理虛擬鍵盤點擊)函數中,為了不讓手機的系統輸入法彈出,你在函數的最後面統一調用了 `input_area.blur()` 來強制失焦。

而每次調用 `send_char()` 函數時,裡面都會執行 `input_area.focus()` 來確保游標正確插入文字。當候選區**沒有字**的時候,按逗號只會調用 1 次 `send_char()`(1 次 focus),緊接著執行結尾的 `blur()`,系統鍵盤來不及彈出就被收回了。

但是,當候選區**有字**時,原代碼的寫法是:

1. 先 `send_char(pre_input_zh[0]);` (第 1 次 focus)
2. 再 `send_char(e.target.innerHTML);` (第 2 次 focus)

在同一個事件循環中**連續觸發兩次 focus**,會導致行動端瀏覽器(特別是 iOS Safari 或 Android Chrome)的焦點狀態機發生混亂,最後的 `blur()` 就無法成功壓制住系統鍵盤,導致它彈了出來。整個 `ejcjclick` 函數裡,也只有標點符號這個區塊會連續調用兩次 `send_char`。

---

### 🛠️ 解決方案

既然 `send_char()` 本身就支援字串插入,我們只需要**把候選字和標點符號合併成一個字串**,然後只調用一次 `send_char()` 就能完美解決這個 Bug。

請找到 `function ejcjclick(e)` 裡面的這段代碼:

```javascript
	// ejcjonline_punkkey
	else if (e.target.classList.contains("ejcjonline_punkkey")) {
		if (pre_input.length > 0) {
			if (pre_input_zh.length > 0) {
				send_char(pre_input_zh[0]);
			}
			pre_input = '';
			pre_input_c = '';
			display_input();
		}
		send_char(e.target.innerHTML);
	}

```

**將其修改為:**

```javascript
	// ejcjonline_punkkey
	else if (e.target.classList.contains("ejcjonline_punkkey")) {
		let str_to_send = "";
		if (pre_input.length > 0) {
			if (pre_input_zh.length > 0) {
				str_to_send += pre_input_zh[0];
			}
			pre_input = '';
			pre_input_c = '';
			display_input();
		}
		str_to_send += e.target.innerHTML;
		send_char(str_to_send);
	}

```

這樣修改後,無論有沒有候選字,按標點符號都只會觸發一次 `focus()`,最後的 `blur()` 就能順利把系統鍵盤攔截下來了!
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

在電腦端,當候選區有字時,按shift加數字鍵,或按-=等符號鍵,都將轉成一個中文標點之後頂字上屏。用於選二三四重的「;'/」不能頂字上屏,但當候選區無字時仍能夠轉成中文標點上屏。

在代碼中留出可以填入對應中文標點的位置。

需要給出所要修改的地方,不用給出全部代碼,所有的代碼和注釋都要使用英文。


gemini pro永遠是首選:

代码: 全选

To implement this feature, we can create a mapping dictionary for the English symbols to their corresponding Chinese punctuations. Then, we can intercept these keystrokes inside the `ejcjkeydown` function using the `e.key` property.

Here are the specific snippets you need to add or modify. All code and comments are provided in English as requested.

### 1. Define the Punctuation Mapping

Add this dictionary outside of your event listeners (for example, near your other constants like `e2c` or `zh_char`). You can easily modify the Chinese punctuations in the placeholders provided.

```javascript
// Chinese punctuation mapping dictionary.
// Feel free to modify the Chinese punctuations to fit your exact needs.
const zh_punk_map = {
    "!" : "!",
    "@" : "@",
    "#" : "#",
    "$" : "$",
    "%" : "%",
    "^" : "︿",
    "&" : "&",
    "*" : "*",
    "(" : "(",
    ")" : ")",
    "-" : "-",
    "_" : "_",
    "=" : "=",
    "+" : "+",
    "[" : "〔",
    "]" : "〕",
    "{" : "{",
    "}" : "}",
    "\\": "\",
    "|" : "|",
    ";" : ";",
    ":" : ":",
    "'" : "’",
    "\"": "”",
    "<" : "《",
    ">" : "》",
    "/" : "/",
    "?" : "?"
};

```

### 2. Modify the `ejcjkeydown` Function

Insert the interception logic at the very beginning of the `if (zh_mode)` block inside your `ejcjkeydown(e)` function.

```javascript
// Inside the ejcjkeydown function, update the beginning of the if (zh_mode) block:

function ejcjkeydown(e) {
    // ... (existing focus and Shift key check logic) ...

    if (zh_mode) {
        // Keys used for 2nd, 3rd, and 4th candidate selection
        const selection_keys = [";", "'", "/"];

        // Check if the pressed key is a mapped punctuation symbol
        if (zh_punk_map.hasOwnProperty(e.key)) {
            
            if (pre_input.length === 0) {
                // Candidate area is empty: Output the Chinese punctuation directly
                e.preventDefault();
                send_char(zh_punk_map[e.key]);
                return; // Stop further execution for this event
            } 
            else if (!selection_keys.includes(e.key)) {
                // Candidate area has text AND it's NOT a selection key:
                // Output the first candidate, then output the Chinese punctuation
                e.preventDefault();
                
                if (pre_input_zh.length > 0) {
                    send_char(pre_input_zh[0]);
                }
                
                // Clear the input buffer
                pre_input = '';
                pre_input_c = '';
                display_input();
                
                // Output the corresponding Chinese punctuation
                send_char(zh_punk_map[e.key]);
                return; // Stop further execution for this event
            }
            // If it IS a selection key (; ' /) and candidate area HAS text,
            // it will bypass this block and let your original selection logic below handle it.
        }

        // a~z
        if (e.keyCode >= 65 && e.keyCode <= 90 && !e.ctrlKey && !e.shiftKey) {
            // ... (your original code continues here) ...

```
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

發現了哈哈倉頡的一個錯字

帖子 ejsoon »

预:錯編為nnmo,應該改為nnmb。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5811
注册时间: 2022年 11月 18日 17:36
联系:

Re: 發現了哈哈倉頡的一個錯字

帖子 ejsoon »

ejsoon 写了: 2026年 5月 30日 10:48 预:錯編為nnmo,應該改為nnmb。
早在去年鶴飛四季就寫了,我好像也改了,但是不知為何又沒改:

代码: 全选

劑:我希望直接yxl打出。
逻:取碼錯誤,正確取碼為ywln。
鹾:可考慮取ywtq。
龈:可考慮取yuav。
龃:可考慮取yubm。

    yus 齠
    yus 龌
    yush 龆
    yusj 齱
    yusm 齷

「齷」應當比「齷」常用,建議如此調整:

    yus 齷
    yush 齠
    yush 龆
    yusj 齱
    yusm 龌

譭:此字並不常用,各地均不視為規範用字,而「誥」字較常用。
諛:有「阿諛奉承」一詞。
逊:可考虑取yndf。
娆:有詩句「分外妖娆(嬈)」,不知是否算常用。
迳:我希望直接yni打出。
颃:可考虑取ynmb。
歧:「分歧」、「歧視」的「歧」字常用。
遼:「遼寧」、「遼闊」的「遼」字常用。
辫:可考虑取yjvm。
逑:「君子好逑」很常用。
褻:「猥褻」的「褻」字常用。
畳:建議改回wbbm,畢竟此碼僅一字。
婊:這應是vq開頭最常用的字,希望直接vq打出。
婧:改成vqm。
嫵:有常用詞「嫵媚」,「乆亾兦」三個都是異體字,日常不用。
婀:有「婀娜多姿」一詞。
缥、缅:選其中一個放在vmm重碼位,且要先於「缰」。
縮:可考慮取vfjo。
紡:為什麼排到最後位去了?
繹:「演繹」的「繹」字怎麼排到後面去了?
繅:「繅絲」的「繅」常用。
紉:「縫紉」的「紉」字怎麼排到後面去了?
繮、纒 重碼位對調。
嫻:這個字才常用。
莲:建議置前。
蒭:不常用,改回tpuu。
靳:「鞦韆」的「鞦」比「靳」更常用吧?
韃:同上一個評價。
莺:希望直接tbp打出。
sv為空碼,选「屫」,之后「匨」用svm打出。
孱:「孱弱」的「孱」比「屙」常用。
屢:若為繁體字優先的碼表,則「屢」要置前。
鸥:此字比「悘」常用。
聹:有「耵聹」一詞,「聴」要降級。
騾:「駟」和「騾」哪個常用?

    sa 翫
    sah 鷵
    sahn 飁
    sav 匽

「鷵」和「飁」任選其一作為sa的取碼,「翫」改為sam,這樣整體碼长平衡一些。
嘘:考慮改成rypc。
顕:是ac開頭常見異體字,正體為「顯」。
鄤:基本區內ae開頭的字只有它,不妨直接輸ae出此字。
閾:有「閾值」這個詞。
閔:再去核實一下這個字使用頻率是否比「閡」高。
be空碼
貅:有「貔貅」一詞。
胧:有「朦胧(朧)」一詞。
刚:「刚」比「腌」常用。
瞠:「瞠」跟「眯」哪個常用?
睨:有「睥睨」一詞,我讀中學時見過此詞。
瞰:字身取碼變成頭尾兩碼,要改成bumj,注意要排第一位,因為是較常用字,有詞語「鳥瞰」。
盹:「打盹」的「盹」。
矇:使用頻率比「睓」。
瞇:字身取碼變成頭尾兩碼,要改成buyf。
鍊:cd開頭有兩個字常用——「鍊」和「鉢」,且前者使用頻率比后者高,建議優先顯示「鍊」。
釵:ce開頭唯一常用字,建議優先顯示。
颁:字身取碼變成頭尾兩碼,要改成chmb。

    chp 錉
    chpr 銽
    chpy 鹈

「鹈」是否為三字當中最常用的字?
鋮:作為人名用字,建議直接cih打出。
颂:字身取碼變成頭尾兩碼,要改成cimb。
竞:希望直接ytr打出。
鑣:有「分道揚鑣」一詞,建議直接cip打出,並放在第一位。
銬:「手銬」的「銬」應提前。
錙:有「錙銖必較」一詞。
cyh空碼,建議「鎚」補上。
銃:建議直接cyi打出,避免與「鋶」重碼。
鑪:「爐」的異體,可考虑提前。
樱:要放在dbo碼位第一位。
梘:建議置前,「梖」改回dbuc。
橇:「雪橇」的「橇」字常用。
椟:有「买椟还珠(買櫝還珠)」一詞。
槟:「槟(檳)榔」的「槟」字常用。
榗:不常用,建議改回dmia。
榷:「商榷」的「榷」字常用。
桦:建議置前。
韟:不常用,建議改回dqha。
韢:不常用,建議改回dqji。
栩:dsm為空碼,建議放此字。
梮:不常用,建議改回dssr。
楞:似乎沒必要置前。
dyc為空碼。
灏:考虑改回eafo。
edh為空碼,「淅」可以補上。
湃:「澎湃」的「湃」字為常用字,要置前。
溴:常見化學元素,建議置前。
潟:日本地名「新潟」。
渤:「黄渤」、「渤海」。
ekl為空碼。
淵:希望直接elx打出。
涎:有常用詞「垂涎三尺」。
瀲:有「瀲灩」一詞,「溣」應改回原碼eoob。
滟:有「潋滟」一詞。
灩/灧:任意一個均比「潂」,只是不知臺、港哪個字常用。
滷:「滷水」的「滷」常用,「澟」改回eywd。
煜:常見人名用字。
糌:「糟粕」的「粕」字、「糗事」的「糗」都比「糌」字常用,要改成fdho。
糉:你去問一下臺、港朋友用「粽」還是「糉」多。
燔:不常用,建議改回fhdw。
炉:不妨直接fi打出。
燶:這個字使用頻率比「燤燇爡」高嗎?
壸:取碼錯誤,正確取碼為gbmc。
壙:似乎不常用,改回gitc。
埞:字頻是否比「垸塇坾」高?
塛:為何跟「堙」一樣都設gmw?
籙:不常用,建議改回hcve。
稍:建議改回hdfb。
穫:「收穫」的「穫」須提前。
秽:「污秽(穢)」的「秽」常用。
篓:「废纸篓(廢紙簍)」的「篓」常用。
鸌:建議直接hft打出,而「鸃」改成hftg。
魉:可考慮改himo。
卮:希望直接hms打出,「笻」改回hmsl。
簷:「屋簷」的「簷」字常用,希望直接hnc打出。
徉:「徜徉」的「徉」常用。
筼:可考慮改hrbo。
籬:「籠」比「籬」更常用吧?
禤:似乎是姓氏來著?
飆:若是繁體字優先的碼表,請將其置前。
冽:「凜冽」的「冽」字比「冮」常用。
净:建議置前。
译:改回ineq。
诋:「诋毁(詆毀)」的「诋」字怎麼排到第二位去了?
辶:日常不會打偏旁,建議置后。
顑:不常用,要改irmb。
賫、赍:哪個正體?哪個異體?
轅:有成語「南轅北轍」。
鸪:「鹧鸪」的「鸪」常用。
瘍:「潰瘍」的「瘍」常用。
剎:若是繁體字優先的碼表,請將其置前,與「弒、弑」優先級統一。
狞:「狰狞(猙獰)」的「狞」常用。
猢:「樹倒猢猻散」的「猢」常用。
疱:希望直接kpr打出。
衬、襟:若為繁體字優先碼表,「襟」置前;否則「衬」置前。
蛊、蝌:若為繁體字優先碼表,則應「蝌」在前。
蟏、蠨:若為繁體字優先碼表,則應「蠨」在前。
襤:若為繁體字優先碼表,則應置前。
褶:若為繁體字優先碼表,則應置前。
鴆:若為繁體字優先碼表,則應「鴆」在前。
冑、胄:臺標為前者,陸標為後者。
霑:有個名人當中有此字,可適當置於mbey首位。
飘:考慮改成mfhn。
压、丟:若為繁體字優先碼表,則應「丟」在前。
珏:人名、商標名較常見字。
珺:人名較常見字。
魇:考慮改成mkhi。
甦:「甦醒」的「甦」跟「魘」哪個常用一些?
靥:考慮改成mkmw。
黡:考慮改成mkwg。
殇:考慮改成mnon。
殒:考慮改成mnrb。
砚:考慮改成mrbh。
矾、砓:建議對調。
砥:有「砥礪」一詞。
磣:有「寒磣」一詞。
硷、礆:若為繁體字優先碼表,則「礆」應排在「硷」前面。
磡:有「紅磡」一詞。
励:應msk打出。
厄:若為繁體字優先碼表,則「厄」應置前。
蠶:建議mua直接打出。
贾:考慮改成mwbo。
酾、釃:若為繁體字優先碼表,則「釃」應置前。
酝:「酝酿(醞釀)」的「酝」字常用。
觥:「觥籌交錯」的「觥」。
鯣、鯤:建議兩者交換。
鰍:「泥鰍」的「鰍」常用。
鱅、鱇:建議兩者交換。
鯇:調整至nfjm首位。
矜:字身取碼變成頭尾兩碼,要改成,應改為nhoi,且置於此碼首位。
鹜:常見動物名。
陨:考慮改成nlrb。
彌:若為繁體字優先碼表,則「彌」應置前。
鳅:「泥鳅」的「鳅」常用。
鲄:建議放在首位。
预:考慮改成nnmb。
张、弛:若為繁體字優先碼表,則「弛」應置前。
馈:「反馈(饋)」的「馈」比「腐蚀(蝕)」的「蚀」用得多。
赁:考慮改成ogbo。
侨:考慮改成ohkl。
餞:「蜜餞」的「餞」應比「飴」常用。
佈:比「俺」常用。
觎:考慮改成onbh。
伋、氡:建議交換。
侈:「奢侈」的「侈」比「俑」常用。
氤、氳:「氤」優先,因其為「氤氳」的第一個字。
剣:考慮改成ooln。
斂:若為繁體字優先碼表,則「斂」應置前。

    op 他
    op 化
    op 仑
    op 伈
    op 侥

「侥」應放在「化」與「仑」之間。

    ophj 锤
    ophj 钎
    ophj 锺
    ophj 锻
    ophj 铢
    ophj 锧
    ophj 铦
    ophj 锸

建議排:锻、锤、铢、钎、锧、锸、锺。
倾:考慮改成opmo。
锱:「锱铢必较(錙銖必較)」的「锱」。
债:考慮改成oqmo。
儼:若為繁體字優先碼表,則「儼」應置前。
侦:考慮改oybo。
惆:「惆悵」的「惆」常用。
颍:考慮改成pemo。
恤:考慮改成phbt。
鸵:「鸵」比「忓」常用。
邬:「邬」比「忊」常用。
懺:若為繁體字優先碼表,則「懺」應置前。
愾:希望「同仇敵愾」的「愾」字可直接pon打出。
毖:不常用,改回ppph。
愜:若為繁體字優先碼表,則「愜」應置前。
撈:希望直接qff打出。
捩:「轉捩點」的「捩」。
摻:希望直接qii打出。
抰、抌:建議兩者調換。
揽:「揽(攬)」比「扪(捫)」常用。
捔:考慮改回qnbg。
搎、掹:建議兩者調換。
嘅:屬於方言特有字,不及「唧」使用廣泛。
嗳:考慮改囦rbbe。
啉:不如「噤若寒蟬」的「噤」常用。
啖:不如「嘮」常用。
呥:不如「噎」常用。
嗻:「嗻」比「嚝」常用。
咤:「叱咤」的「咤」比「喀」常用。
躝:建議排在rman的第一位,因為「躙」為「躪」異體,「躢」為「蹋」異體,「躝」是方言比較常用的字,這與「唧、嘅」一例不同。
蹭:「蹭吃蹭喝」的「蹭」比「哂笑」的「哂」常用。
躊:「躊躇」的「躊」比「噖」常用。
踎:比「呩」、「躎」常用。
呍、跮:建議兩者調換。
躪:「蹂躪」的「躪」比「踖」常用。
嗕、躒:建議兩者調換。
喕、躅:建議兩者調換。
嘾、躀:建議兩者調換。
躂:「蹓躂」的「躂」。
躚:「蹁躚」的「躚」。
呚:不及「勋(勳)」常用。哗:比「吪」常用。
嚖、嘒:互為正異體,前者為異,後者為正。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
回复
  • 相似主题
    回复总数
    阅读次数
    最新帖子

在线用户

正浏览此版面之用户: 没有注册用户 和 2 访客