Subject: bug#78043: Cursor gets stuck after inline code input in comint buffer when using markdown-mode, bypassing prompt lines starting with '>'

From: Kang Tu <[email-masked]>
Date: Fri, 25 Apr 2025 06:56:56 -0700

Thanks for replying!

Actually we are wondering if it is a comint-mode bug. This line suppose to
suppress markdown-mode rendering on comint input line (start with >
character): https://github.com/tninja/aider.el/blob/main/aider-core.el#L67,
However it doesn't work as expected.

We are discussed in this github issue, and font-lock-defaults seems to be
right: https://github.com/tninja/aider.el/issues/126#issuecomment-2816839141,
so we suspect it is a comint-mode bug, for not being able to override on
comint input line.

Would you mind help take a look at this?

Regards

Kang

On Thu, Apr 24, 2025 at 11:12 PM Eli Zaretskii <[email-masked]> wrote:

> > From: Kang Tu <[email-masked]>
> > Date: Thu, 24 Apr 2025 08:39:57 -0700
> >
> > To: [email-masked]
> > Subject: Cursor gets stuck after inline code input in comint buffer when
> >  using markdown-mode, bypassing prompt lines starting with '>'
> > Description:
> >  To avoid interfering with input, I implemented logic to bypass markdown
> >  rendering on prompt input lines, which start with '>'
> >
> >  I suspect this issue is related to the interaction between markdown-mode
> >  rendering and comint input handling, especially regarding the bypass
> logic
> >  for prompt lines.
> >
> > Environment:
> >  > Please refactoring `main.go`
> >
> >  - Emacs version: 30.1
> >  - markdown-mode version: 2.5
> >  - OS: ubuntu 24.04 / mac osx
> >
> > Attachments:
> >  I am using Emacs comint buffer with markdown-mode enabled to render the
> >  output as formatted Markdown.
> >
> >  Actual behavior:
> >  The cursor gets stuck after inline code input on the prompt line.
> >
> >  However, when I type inline code surrounded by backticks on a prompt
> line
> >  like:
> >
> >  Any advice or known fixes for this interaction issue between
> markdown-mode
> >  and comint would be much appreciated.
> >
> >  The cursor gets stuck after finishing the inline code and I cannot
> continue
> >  typing.
> >
> >  - Minimal input example
> >   - Please refactoring `main.go`
> >  - Relevant markdown-mode and comint configuration snippets (especially
> >  bypass logic for prompt lines)
> >  (defun aider--apply-markdown-highlighting ()
> >   "Set up markdown highlighting for aider buffer with optimized
> performance.
> >  Ignore lines starting with '>' (command prompts/input)."
> >   ;; 1) Use `markdown-mode`'s syntax table:
> >   (set-syntax-table (make-syntax-table markdown-mode-syntax-table))
> >   ;; 2) For multiline constructs (like fenced code blocks), enable
> >  `markdown-syntax-propertize`:
> >   (setq-local syntax-propertize-function #'markdown-syntax-propertize)
> >   ;; 3) Reuse `markdown-mode`'s font-lock keywords for highlighting,
> >   ;;    but add a rule to prevent markdown highlighting on lines starting
> >  with '>'.
> >   (setq-local font-lock-defaults
> >               (list (cons
> >                      ;; Rule to apply default face to prompt lines,
> without
> >  overriding.
> >                      ;; This aims to prevent subsequent markdown rules in
> >  this list
> >                      ;; from applying, while still allowing
> >  comint-highlight-input.
> >                      '("^>.*$" 0 'default nil) ;; ==> this line did
> bypass
> >  prompt input line, update nil to t doesn't help
> >                      ;; Original markdown keywords
> >                      markdown-mode-font-lock-keywords)
> >                     nil ;; KEYWORDS-ONLY
> >                     nil ;; CASE-FOLD
> >                     nil ;; SYNTAX-ALIST
> >                     nil)) ;; SYNTAX-BEGIN
> >   ;; 4) Enable fenced code block highlighting, and disable special font
> >  processing:
> >   (setq-local markdown-fontify-code-blocks-natively t)
> >   ;; https://github.com/tninja/aider.el/issues/113
> >   ;; TODO: temporary solution to disable bold, italic. need a better way
> >  than this, if we want to keep them in reply text
> >   ;; Note: The rule added above is a more targeted way to handle prompts
> >  than disabling these globally.
> >   ;; Consider if these are still needed or can be re-enabled depending on
> >  desired appearance for non-prompt text.
> >   (setq-local markdown-regex-bold nil)
> >   (setq-local markdown-regex-italic nil)
> >   (setq-local markdown-regex-strike-through nil)
> >   ;; 5) Jit-lock and other
> >   (setq-local font-lock-multiline t)  ;; Handle multiline constructs
> >  efficiently
> >   (setq-local jit-lock-contextually nil)  ;; Disable contextual analysis
> >   (setq-local font-lock-support-mode 'jit-lock-mode)  ;; Ensure JIT lock
> is
> >  used
> >   (setq-local jit-lock-defer-time 0)
> >   ;; 6) Register font-lock explicitly:
> >   (font-lock-mode 1)
> >   ;; 7) Force immediate fontification of visible area:
> >   (font-lock-flush)
> >   (font-lock-ensure))
> >  - Screenshots if any
> >
> >  Steps to reproduce:
> >  1. Open a comint buffer (e.g., shell or custom comint).
> >  2. Enable markdown-mode for the buffer, with special handling to skip
> >  rendering lines starting with '>'.
> >  3. In the prompt line, type an inline code snippet with backticks, e.g.:
> >    > Please refactoring `main.go`
> >  4. Observe that after typing `main.go`, the cursor is stuck and cannot
> >  continue.
> >
> >  Expected behavior:
> >  The cursor should move freely and the input should work normally, with
> >  prompt lines properly bypassed from markdown rendering.
>
> Thanks.
>
> AFAIU, markdown-mode is not part of Emacs and not on GNU ELPA.  If so,
> would you please report this first to the developers of markdown-mode?
> If, after investigating the problem, they come to the conclusion that
> it's a bug in Emacs core, please come back here with the results of
> their investigations, and we will take a look at this.
>