Skip to content

skk-mode: okurigana behaviour#2116

Open
tani wants to merge 2 commits intolem-project:mainfrom
tani:tani-skk-mode
Open

skk-mode: okurigana behaviour#2116
tani wants to merge 2 commits intolem-project:mainfrom
tani:tani-skk-mode

Conversation

@tani
Copy link
Contributor

@tani tani commented Mar 2, 2026

Summary

This PR includes the last two commits and fixes SKK state transitions around okurigana and backspace behavior.
Note that I use AI to write the code. Thanks.

What Changed

  • Fixed skk-delete-backward so deleting during early okurigana state restores expected henkan state instead of leaving inconsistent marker/preedit state.
  • Refined uppercase/okurigana start conditions:
    • okurigana start happens only after a reading segment exists and preedit is empty.
  • Added regression tests covering:
    • delete behavior after starting okurigana,
    • uppercase vowel behavior,
    • KII vs KiI consistency.

Examples

  • KI
    • Before: could incorrectly enter okurigana flow in some paths
    • After: stays normal henkan reading (▽き)
  • KiI / KII
    • After: both are treated consistently and show ▽き*i
  • KiR<DEL>
    • After: delete cancels initial okurigana-start cleanly and returns to plain henkan reading
      (▽き)

Validation

  • Ran asdf:test-system "lem-skk-mode/tests" in Nix dev shell.
  • Tests pass.

tani added 2 commits March 3, 2026 07:52
Refine okurigana-start conditions so uppercase input starts okurigana only after a resolved reading segment, preserving normal KI behavior while allowing KiI/KII equivalence. Add regression tests for KI, KII vs KiI, and delete behavior around initial okurigana state.
@code-contractor-app
Copy link
Contributor

code-contractor-app bot commented Mar 2, 2026

❌ Code Contractor Validation: FAILED

=== Contract: contract ===

✓ Code Contractor Validation Result
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

📋 Contract Source: Repository

📊 Statistics:
  Files Changed:    3
  Lines Added:      116
  Lines Deleted:    3
  Total Changed:    119
  Delete Ratio:     0.03 (3%)

Status: FAILED ❌

🤖 AI Providers:
  - codex — model: gpt-5-mini

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ Violations Found (1):

[ERROR] internal_symbol_rule
  AI check failed: "internal_symbol_rule"
  ❌ Reason:
    The diff's added code calls package-internal symbols instead of using
    exported symbols from the public `lem`/`lem-core` API. Several added
    test and implementation lines use package-internal qualified symbols
    (double-colon `::` or package paths), which violates the rule to use
    exported symbols from `lem` or `lem-core` and avoid internal symbol
    access.
📋 Contract Configuration: contract (Source: Repository)
version: 2

trigger:
  paths:
    - "extensions/**"
    - "frontends/**/*.lisp"
    - "src/**"
    - "tests/**"
    - "contrib/**"
    - "**/*.asd"
  head_branches:
    exclude:
      - 'revert-*'

validation:
  limits:
    max_total_changed_lines: 400
    max_delete_ratio: 0.5
    max_files_changed: 10
    severity: warning

  ai:
    system_prompt: |
      You are a senior Common Lisp engineer reviewing code for Lem editor.
      Lem is a text editor with multiple frontends (ncurses, SDL2, webview).
      Focus on maintainability, consistency with existing code, and Lem-specific conventions.
    rules:
      # === File Structure ===
      - name: defpackage_rule
        prompt: |
          First form must be `defpackage` or `uiop:define-package`.
          Package name should match filename (e.g., `foo.lisp` → `:lem-ext/foo` or `:lem-foo`).
          Extensions must use `lem-` prefix (e.g., `:lem-python-mode`).

      - name: file_structure_rule
        prompt: |
          File organization (top to bottom):
          1. defpackage
          2. defvar/defparameter declarations
          3. Key bindings (define-key, define-keys)
          4. Class/struct definitions
          5. Functions and commands

      # === Style ===
      - name: loop_keywords_rule
        prompt: |
          Loop keywords must use colons: `(loop :for x :in list :do ...)`
          NOT: `(loop for x in list do ...)`

      - name: naming_conventions_rule
        prompt: |
          Naming conventions:
          - Functions/variables: kebab-case (e.g., `find-buffer`)
          - Special variables: *earmuffs* (e.g., `*global-keymap*`)
          - Constants: +plus-signs+ (e.g., `+default-tab-size+`)
          - Predicates: -p suffix for functions (e.g., `buffer-modified-p`)
          - Do NOT use -p suffix for user-configurable variables

      # === Documentation ===
      - name: docstring_rule
        prompt: |
          Required docstrings for:
          - Exported functions, methods, classes
          - `define-command` (explain what the command does)
          - Generic functions (`:documentation` option)
          Important functions should explain "why", not just "what".
        severity: warning

      # === Lem-Specific ===
      - name: internal_symbol_rule
        prompt: |
          Use exported symbols from `lem` or `lem-core` package.
          Avoid `lem::internal-symbol` access.
          If internal access is necessary, document why.

      - name: error_handling_rule
        prompt: |
          - `error`: Internal/programming errors
          - `editor-error`: User-facing errors (displayed in echo area)
          Always use `editor-error` for messages shown to users.

      - name: frontend_interface_rule
        prompt: |
          Frontend-specific code must use `lem-if:*` protocol.
          Do not call frontend implementation directly from core.
        severity: warning

      # === Functional Style ===
      - name: functional_style_rule
        prompt: |
          Prefer explicit function arguments over dynamic variables.
          Avoid using `defvar` for state passed between functions.
          Exception: Well-documented cases like `*current-buffer*`.

      - name: dynamic_symbol_call_rule
        prompt: |
          Avoid `uiop:symbol-call`. Rethink architecture instead.
          If unavoidable, document the reason.

      # === Libraries ===
      - name: alexandria_usage_rule
        prompt: |
          Alexandria utilities allowed: `if-let`, `when-let`, `with-gensyms`, etc.
          Avoid: `alexandria:curry` (use explicit lambdas)
          Avoid: `alexandria-2:*` functions not yet used in codebase

      # === Macros ===
      - name: macro_style_rule
        prompt: |
          Keep macros small. For complex logic, use `call-with-*` pattern:
          ```lisp
          (defmacro with-foo (() &body body)
            `(call-with-foo (lambda () ,@body)))
          ```
          Prefer `list` over backquote outside macros.

💬 Feedback

Reply to a violation comment with:

  • /dismiss <reason> - Report false positive or not applicable
📚 About Code Contractor

Declarative Code Standards That Learn and Improve

Define domain-specific validation rules in YAML.
Your contracts document team knowledge and evolve into more accurate AI enforcement.

Want this for your repo?
Install Code Contractor

@tani tani changed the title Tani skk mode skk-mode: okurigana behaviour Mar 2, 2026
Copy link
Contributor

@code-contractor-app code-contractor-app bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Contractor validation failed ❌ — see the sticky comment for full results.

(setf (buffer-value buf 'lem-skk-mode/state::skk-state) state)

;; KiR -> henkan-key: "き", okurigana starts with consonant "r".
(lem-skk-mode/conversion::process-skk-char #\K)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Contractor: internal_symbol_rule

Contract: contract

AI check failed: "internal_symbol_rule"

Reason:
The diff's added code calls package-internal symbols instead of using exported symbols from the public lem/lem-core API. Several added test and implementation lines use package-internal qualified symbols (double-colon :: or package paths), which violates the rule to use exported symbols from lem or lem-core and avoid internal symbol access.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant