GNU bug report logs - #80029
30.2; csharp-mode wrong identation for catch...when blocks

Previous Next

Package: emacs;

Reported by: Philippe Vaucher <philippe.vaucher <at> gmail.com>

Date: Thu, 18 Dec 2025 14:36:02 UTC

Severity: normal

Found in version 30.2

To reply to this bug, email your comments to 80029 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#80029; Package emacs. (Thu, 18 Dec 2025 14:36:03 GMT) Full text and rfc822 format available.

Acknowledgement sent to Philippe Vaucher <philippe.vaucher <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Thu, 18 Dec 2025 14:36:04 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Philippe Vaucher <philippe.vaucher <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 30.2; csharp-mode wrong identation for catch...when blocks
Date: Thu, 18 Dec 2025 15:34:41 +0100
If you try to indent the following in `csharp-mode':

    try
    {
    }
    catch (PipelineStoppedException) when (cancellationToken.IsCancellationRequested)
    {
    }

It displays like this:

    try
    {
    }
    catch (PipelineStoppedException) when (cancellationToken.IsCancellationRequested)
                                     {


In GNU Emacs 30.2 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.41, cairo version 1.18.0) of 2025-09-17 built on
 stvs-pv-laptop-01
Windowing system distributor 'Microsoft Corporation', version 11.0.12010000
System Description: Ubuntu 24.04.3 LTS

Configured using:
 'configure --with-modules --with-sqlite3'

Configured features:
CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG LCMS2 LIBSELINUX LIBXML2 MODULES NOTIFY INOTIFY PDUMPER
PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS WEBP X11 XDBE XIM XINPUT2 XPM GTK3 ZLIB

Important settings:
  value of $LANG: C.UTF-8
  locale-coding-system: utf-8-unix

Major mode: C#//

Minor modes in effect:
  global-git-commit-mode: t
  global-hl-todo-mode: t
  hl-todo-mode: t
  global-atomic-chrome-edit-mode: t
  projectile-rails-global-mode: t
  projectile-mode: t
  dumb-jump-mode: t
  evil-goggles-mode: t
  global-evil-visualstar-mode: t
  evil-visualstar-mode: t
  global-evil-matchit-mode: t
  evil-matchit-mode: t
  global-evil-mc-mode: t
  evil-mc-mode: t
  global-evil-surround-mode: t
  evil-surround-mode: t
  global-evil-collection-unimpaired-mode: t
  evil-collection-unimpaired-mode: t
  evil-mode: t
  evil-local-mode: t
  display-time-mode: t
  global-auto-revert-mode: t
  delete-selection-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  global-whitespace-cleanup-mode: t
  whitespace-cleanup-mode: t
  which-key-mode: t
  save-place-mode: t
  global-move-dup-mode: t
  move-dup-mode: t
  editorconfig-mode: t
  recentf-mode: t
  global-corfu-mode: t
  corfu-mode: t
  marginalia-mode: t
  vertico-mode: t
  savehist-mode: t
  amx-mode: t
  beacon-mode: t
  override-global-mode: t
  straight-use-package-mode: t
  straight-package-neutering-mode: t
  global-eldoc-mode: t
  show-paren-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  minibuffer-regexp-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/home/philippe/.emacs.d/straight/build/bind-key/bind-key hides /usr/local/share/emacs/30.2/lisp/bind-key
/home/philippe/.emacs.d/straight/build/transient/transient hides /usr/local/share/emacs/30.2/lisp/transient
/home/philippe/.emacs.d/straight/build/which-key/which-key hides /usr/local/share/emacs/30.2/lisp/which-key
/home/philippe/.emacs.d/straight/build/use-package/use-package hides /usr/local/share/emacs/30.2/lisp/use-package/use-package
/home/philippe/.emacs.d/straight/build/use-package/use-package-jump hides /usr/local/share/emacs/30.2/lisp/use-package/use-package-jump
/home/philippe/.emacs.d/straight/build/use-package/use-package-ensure hides /usr/local/share/emacs/30.2/lisp/use-package/use-package-ensure
/home/philippe/.emacs.d/straight/build/use-package/use-package-bind-key hides /usr/local/share/emacs/30.2/lisp/use-package/use-package-bind-key
/home/philippe/.emacs.d/straight/build/use-package/use-package-diminish hides /usr/local/share/emacs/30.2/lisp/use-package/use-package-diminish
/home/philippe/.emacs.d/straight/build/use-package/use-package-ensure-system-package hides /usr/local/share/emacs/30.2/lisp/use-package/use-package-ensure-system-package
/home/philippe/.emacs.d/straight/build/use-package/use-package-lint hides /usr/local/share/emacs/30.2/lisp/use-package/use-package-lint
/home/philippe/.emacs.d/straight/build/use-package/use-package-delight hides /usr/local/share/emacs/30.2/lisp/use-package/use-package-delight
/home/philippe/.emacs.d/straight/build/use-package/use-package-core hides /usr/local/share/emacs/30.2/lisp/use-package/use-package-core
/home/philippe/.emacs.d/straight/build/less-css-mode/less-css-mode hides /usr/local/share/emacs/30.2/lisp/textmodes/less-css-mode
/home/philippe/.emacs.d/straight/build/project/project hides /usr/local/share/emacs/30.2/lisp/progmodes/project
/home/philippe/.emacs.d/straight/build/xref/xref hides /usr/local/share/emacs/30.2/lisp/progmodes/xref
/home/philippe/.emacs.d/straight/build/org/ox-org hides /usr/local/share/emacs/30.2/lisp/org/ox-org
/home/philippe/.emacs.d/straight/build/org/ol-irc hides /usr/local/share/emacs/30.2/lisp/org/ol-irc
/home/philippe/.emacs.d/straight/build/org/ox-latex hides /usr/local/share/emacs/30.2/lisp/org/ox-latex
/home/philippe/.emacs.d/straight/build/org/ob-ruby hides /usr/local/share/emacs/30.2/lisp/org/ob-ruby
/home/philippe/.emacs.d/straight/build/org/org-attach-git hides /usr/local/share/emacs/30.2/lisp/org/org-attach-git
/home/philippe/.emacs.d/straight/build/org/org-plot hides /usr/local/share/emacs/30.2/lisp/org/org-plot
/home/philippe/.emacs.d/straight/build/org/oc-natbib hides /usr/local/share/emacs/30.2/lisp/org/oc-natbib
/home/philippe/.emacs.d/straight/build/org/org-ctags hides /usr/local/share/emacs/30.2/lisp/org/org-ctags
/home/philippe/.emacs.d/straight/build/org/ol-eshell hides /usr/local/share/emacs/30.2/lisp/org/ol-eshell
/home/philippe/.emacs.d/straight/build/org/ob-C hides /usr/local/share/emacs/30.2/lisp/org/ob-C
/home/philippe/.emacs.d/straight/build/org/ol-mhe hides /usr/local/share/emacs/30.2/lisp/org/ol-mhe
/home/philippe/.emacs.d/straight/build/org/ob-ref hides /usr/local/share/emacs/30.2/lisp/org/ob-ref
/home/philippe/.emacs.d/straight/build/org/org-pcomplete hides /usr/local/share/emacs/30.2/lisp/org/org-pcomplete
/home/philippe/.emacs.d/straight/build/org/org-inlinetask hides /usr/local/share/emacs/30.2/lisp/org/org-inlinetask
/home/philippe/.emacs.d/straight/build/org/ol hides /usr/local/share/emacs/30.2/lisp/org/ol
/home/philippe/.emacs.d/straight/build/org/oc-bibtex hides /usr/local/share/emacs/30.2/lisp/org/oc-bibtex
/home/philippe/.emacs.d/straight/build/org/org-clock hides /usr/local/share/emacs/30.2/lisp/org/org-clock
/home/philippe/.emacs.d/straight/build/org/ob-eshell hides /usr/local/share/emacs/30.2/lisp/org/ob-eshell
/home/philippe/.emacs.d/straight/build/org/org-element-ast hides /usr/local/share/emacs/30.2/lisp/org/org-element-ast
/home/philippe/.emacs.d/straight/build/org/org-goto hides /usr/local/share/emacs/30.2/lisp/org/org-goto
/home/philippe/.emacs.d/straight/build/org/org-lint hides /usr/local/share/emacs/30.2/lisp/org/org-lint
/home/philippe/.emacs.d/straight/build/org/oc-csl hides /usr/local/share/emacs/30.2/lisp/org/oc-csl
/home/philippe/.emacs.d/straight/build/org/ob-core hides /usr/local/share/emacs/30.2/lisp/org/ob-core
/home/philippe/.emacs.d/straight/build/org/ox-beamer hides /usr/local/share/emacs/30.2/lisp/org/ox-beamer
/home/philippe/.emacs.d/straight/build/org/org-src hides /usr/local/share/emacs/30.2/lisp/org/org-src
/home/philippe/.emacs.d/straight/build/org/org-crypt hides /usr/local/share/emacs/30.2/lisp/org/org-crypt
/home/philippe/.emacs.d/straight/build/org/ob-scheme hides /usr/local/share/emacs/30.2/lisp/org/ob-scheme
/home/philippe/.emacs.d/straight/build/org/org-keys hides /usr/local/share/emacs/30.2/lisp/org/org-keys
/home/philippe/.emacs.d/straight/build/org/ob-sass hides /usr/local/share/emacs/30.2/lisp/org/ob-sass
/home/philippe/.emacs.d/straight/build/org/ob-css hides /usr/local/share/emacs/30.2/lisp/org/ob-css
/home/philippe/.emacs.d/straight/build/org/org-refile hides /usr/local/share/emacs/30.2/lisp/org/org-refile
/home/philippe/.emacs.d/straight/build/org/ob-calc hides /usr/local/share/emacs/30.2/lisp/org/ob-calc
/home/philippe/.emacs.d/straight/build/org/ob-julia hides /usr/local/share/emacs/30.2/lisp/org/ob-julia
/home/philippe/.emacs.d/straight/build/org/org-id hides /usr/local/share/emacs/30.2/lisp/org/org-id
/home/philippe/.emacs.d/straight/build/org/ol-doi hides /usr/local/share/emacs/30.2/lisp/org/ol-doi
/home/philippe/.emacs.d/straight/build/org/org-mobile hides /usr/local/share/emacs/30.2/lisp/org/org-mobile
/home/philippe/.emacs.d/straight/build/org/org-persist hides /usr/local/share/emacs/30.2/lisp/org/org-persist
/home/philippe/.emacs.d/straight/build/org/ob-screen hides /usr/local/share/emacs/30.2/lisp/org/ob-screen
/home/philippe/.emacs.d/straight/build/org/ol-docview hides /usr/local/share/emacs/30.2/lisp/org/ol-docview
/home/philippe/.emacs.d/straight/build/org/org-timer hides /usr/local/share/emacs/30.2/lisp/org/org-timer
/home/philippe/.emacs.d/straight/build/org/ob-exp hides /usr/local/share/emacs/30.2/lisp/org/ob-exp
/home/philippe/.emacs.d/straight/build/org/org-habit hides /usr/local/share/emacs/30.2/lisp/org/org-habit
/home/philippe/.emacs.d/straight/build/org/org-indent hides /usr/local/share/emacs/30.2/lisp/org/org-indent
/home/philippe/.emacs.d/straight/build/org/org-duration hides /usr/local/share/emacs/30.2/lisp/org/org-duration
/home/philippe/.emacs.d/straight/build/org/org-fold hides /usr/local/share/emacs/30.2/lisp/org/org-fold
/home/philippe/.emacs.d/straight/build/org/ob-matlab hides /usr/local/share/emacs/30.2/lisp/org/ob-matlab
/home/philippe/.emacs.d/straight/build/org/org-attach hides /usr/local/share/emacs/30.2/lisp/org/org-attach
/home/philippe/.emacs.d/straight/build/org/ob-latex hides /usr/local/share/emacs/30.2/lisp/org/ob-latex
/home/philippe/.emacs.d/straight/build/org/ox-odt hides /usr/local/share/emacs/30.2/lisp/org/ox-odt
/home/philippe/.emacs.d/straight/build/org/org-macs hides /usr/local/share/emacs/30.2/lisp/org/org-macs
/home/philippe/.emacs.d/straight/build/org/ob-lob hides /usr/local/share/emacs/30.2/lisp/org/ob-lob
/home/philippe/.emacs.d/straight/build/org/ol-rmail hides /usr/local/share/emacs/30.2/lisp/org/ol-rmail
/home/philippe/.emacs.d/straight/build/org/ob-fortran hides /usr/local/share/emacs/30.2/lisp/org/ob-fortran
/home/philippe/.emacs.d/straight/build/org/ob-shell hides /usr/local/share/emacs/30.2/lisp/org/ob-shell
/home/philippe/.emacs.d/straight/build/org/ob hides /usr/local/share/emacs/30.2/lisp/org/ob
/home/philippe/.emacs.d/straight/build/org/ob-tangle hides /usr/local/share/emacs/30.2/lisp/org/ob-tangle
/home/philippe/.emacs.d/straight/build/org/org-feed hides /usr/local/share/emacs/30.2/lisp/org/org-feed
/home/philippe/.emacs.d/straight/build/org/ob-maxima hides /usr/local/share/emacs/30.2/lisp/org/ob-maxima
/home/philippe/.emacs.d/straight/build/org/ox-md hides /usr/local/share/emacs/30.2/lisp/org/ox-md
/home/philippe/.emacs.d/straight/build/org/org-datetree hides /usr/local/share/emacs/30.2/lisp/org/org-datetree
/home/philippe/.emacs.d/straight/build/org/ob-eval hides /usr/local/share/emacs/30.2/lisp/org/ob-eval
/home/philippe/.emacs.d/straight/build/org/ob-java hides /usr/local/share/emacs/30.2/lisp/org/ob-java
/home/philippe/.emacs.d/straight/build/org/ob-sql hides /usr/local/share/emacs/30.2/lisp/org/ob-sql
/home/philippe/.emacs.d/straight/build/org/org-agenda hides /usr/local/share/emacs/30.2/lisp/org/org-agenda
/home/philippe/.emacs.d/straight/build/org/org-tempo hides /usr/local/share/emacs/30.2/lisp/org/org-tempo
/home/philippe/.emacs.d/straight/build/org/ol-bbdb hides /usr/local/share/emacs/30.2/lisp/org/ol-bbdb
/home/philippe/.emacs.d/straight/build/org/ol-w3m hides /usr/local/share/emacs/30.2/lisp/org/ol-w3m
/home/philippe/.emacs.d/straight/build/org/ob-lisp hides /usr/local/share/emacs/30.2/lisp/org/ob-lisp
/home/philippe/.emacs.d/straight/build/org/ob-clojure hides /usr/local/share/emacs/30.2/lisp/org/ob-clojure
/home/philippe/.emacs.d/straight/build/org/ob-sqlite hides /usr/local/share/emacs/30.2/lisp/org/ob-sqlite
/home/philippe/.emacs.d/straight/build/org/org-compat hides /usr/local/share/emacs/30.2/lisp/org/org-compat
/home/philippe/.emacs.d/straight/build/org/ob-haskell hides /usr/local/share/emacs/30.2/lisp/org/ob-haskell
/home/philippe/.emacs.d/straight/build/org/ox hides /usr/local/share/emacs/30.2/lisp/org/ox
/home/philippe/.emacs.d/straight/build/org/ob-R hides /usr/local/share/emacs/30.2/lisp/org/ob-R
/home/philippe/.emacs.d/straight/build/org/ob-ditaa hides /usr/local/share/emacs/30.2/lisp/org/ob-ditaa
/home/philippe/.emacs.d/straight/build/org/ob-table hides /usr/local/share/emacs/30.2/lisp/org/ob-table
/home/philippe/.emacs.d/straight/build/org/ob-forth hides /usr/local/share/emacs/30.2/lisp/org/ob-forth
/home/philippe/.emacs.d/straight/build/org/org-mouse hides /usr/local/share/emacs/30.2/lisp/org/org-mouse
/home/philippe/.emacs.d/straight/build/org/ol-gnus hides /usr/local/share/emacs/30.2/lisp/org/ol-gnus
/home/philippe/.emacs.d/straight/build/org/ob-gnuplot hides /usr/local/share/emacs/30.2/lisp/org/ob-gnuplot
/home/philippe/.emacs.d/straight/build/org/ox-man hides /usr/local/share/emacs/30.2/lisp/org/ox-man
/home/philippe/.emacs.d/straight/build/org/org-archive hides /usr/local/share/emacs/30.2/lisp/org/org-archive
/home/philippe/.emacs.d/straight/build/org/org-footnote hides /usr/local/share/emacs/30.2/lisp/org/org-footnote
/home/philippe/.emacs.d/straight/build/org/ob-comint hides /usr/local/share/emacs/30.2/lisp/org/ob-comint
/home/philippe/.emacs.d/straight/build/org/ob-octave hides /usr/local/share/emacs/30.2/lisp/org/ob-octave
/home/philippe/.emacs.d/straight/build/org/ob-org hides /usr/local/share/emacs/30.2/lisp/org/ob-org
/home/philippe/.emacs.d/straight/build/org/ol-info hides /usr/local/share/emacs/30.2/lisp/org/ol-info
/home/philippe/.emacs.d/straight/build/org/ob-emacs-lisp hides /usr/local/share/emacs/30.2/lisp/org/ob-emacs-lisp
/home/philippe/.emacs.d/straight/build/org/ol-man hides /usr/local/share/emacs/30.2/lisp/org/ol-man
/home/philippe/.emacs.d/straight/build/org/org-faces hides /usr/local/share/emacs/30.2/lisp/org/org-faces
/home/philippe/.emacs.d/straight/build/org/ob-makefile hides /usr/local/share/emacs/30.2/lisp/org/ob-makefile
/home/philippe/.emacs.d/straight/build/org/oc-basic hides /usr/local/share/emacs/30.2/lisp/org/oc-basic
/home/philippe/.emacs.d/straight/build/org/ob-js hides /usr/local/share/emacs/30.2/lisp/org/ob-js
/home/philippe/.emacs.d/straight/build/org/ox-icalendar hides /usr/local/share/emacs/30.2/lisp/org/ox-icalendar
/home/philippe/.emacs.d/straight/build/org/org-capture hides /usr/local/share/emacs/30.2/lisp/org/org-capture
/home/philippe/.emacs.d/straight/build/org/oc hides /usr/local/share/emacs/30.2/lisp/org/oc
/home/philippe/.emacs.d/straight/build/org/ob-ocaml hides /usr/local/share/emacs/30.2/lisp/org/ob-ocaml
/home/philippe/.emacs.d/straight/build/org/org-num hides /usr/local/share/emacs/30.2/lisp/org/org-num
/home/philippe/.emacs.d/straight/build/org/org-protocol hides /usr/local/share/emacs/30.2/lisp/org/org-protocol
/home/philippe/.emacs.d/straight/build/org/ob-processing hides /usr/local/share/emacs/30.2/lisp/org/ob-processing
/home/philippe/.emacs.d/straight/build/org/ob-awk hides /usr/local/share/emacs/30.2/lisp/org/ob-awk
/home/philippe/.emacs.d/straight/build/org/ob-sed hides /usr/local/share/emacs/30.2/lisp/org/ob-sed
/home/philippe/.emacs.d/straight/build/org/ox-publish hides /usr/local/share/emacs/30.2/lisp/org/ox-publish
/home/philippe/.emacs.d/straight/build/org/ob-lua hides /usr/local/share/emacs/30.2/lisp/org/ob-lua
/home/philippe/.emacs.d/straight/build/org/ox-koma-letter hides /usr/local/share/emacs/30.2/lisp/org/ox-koma-letter
/home/philippe/.emacs.d/straight/build/org/ob-plantuml hides /usr/local/share/emacs/30.2/lisp/org/ob-plantuml
/home/philippe/.emacs.d/straight/build/org/org-element hides /usr/local/share/emacs/30.2/lisp/org/org-element
/home/philippe/.emacs.d/straight/build/org/ob-python hides /usr/local/share/emacs/30.2/lisp/org/ob-python
/home/philippe/.emacs.d/straight/build/org/org-colview hides /usr/local/share/emacs/30.2/lisp/org/org-colview
/home/philippe/.emacs.d/straight/build/org/ob-perl hides /usr/local/share/emacs/30.2/lisp/org/ob-perl
/home/philippe/.emacs.d/straight/build/org/ol-bibtex hides /usr/local/share/emacs/30.2/lisp/org/ol-bibtex
/home/philippe/.emacs.d/straight/build/org/org-fold-core hides /usr/local/share/emacs/30.2/lisp/org/org-fold-core
/home/philippe/.emacs.d/straight/build/org/oc-biblatex hides /usr/local/share/emacs/30.2/lisp/org/oc-biblatex
/home/philippe/.emacs.d/straight/build/org/ob-lilypond hides /usr/local/share/emacs/30.2/lisp/org/ob-lilypond
/home/philippe/.emacs.d/straight/build/org/org-list hides /usr/local/share/emacs/30.2/lisp/org/org-list
/home/philippe/.emacs.d/straight/build/org/org-table hides /usr/local/share/emacs/30.2/lisp/org/org-table
/home/philippe/.emacs.d/straight/build/org/org-version hides /usr/local/share/emacs/30.2/lisp/org/org-version
/home/philippe/.emacs.d/straight/build/org/org-entities hides /usr/local/share/emacs/30.2/lisp/org/org-entities
/home/philippe/.emacs.d/straight/build/org/ox-html hides /usr/local/share/emacs/30.2/lisp/org/ox-html
/home/philippe/.emacs.d/straight/build/org/ol-eww hides /usr/local/share/emacs/30.2/lisp/org/ol-eww
/home/philippe/.emacs.d/straight/build/org/ox-ascii hides /usr/local/share/emacs/30.2/lisp/org/ox-ascii
/home/philippe/.emacs.d/straight/build/org/org-macro hides /usr/local/share/emacs/30.2/lisp/org/org-macro
/home/philippe/.emacs.d/straight/build/org/org-loaddefs hides /usr/local/share/emacs/30.2/lisp/org/org-loaddefs
/home/philippe/.emacs.d/straight/build/org/ob-dot hides /usr/local/share/emacs/30.2/lisp/org/ob-dot
/home/philippe/.emacs.d/straight/build/org/ob-groovy hides /usr/local/share/emacs/30.2/lisp/org/ob-groovy
/home/philippe/.emacs.d/straight/build/org/org hides /usr/local/share/emacs/30.2/lisp/org/org
/home/philippe/.emacs.d/straight/build/org/org-cycle hides /usr/local/share/emacs/30.2/lisp/org/org-cycle
/home/philippe/.emacs.d/straight/build/org/ox-texinfo hides /usr/local/share/emacs/30.2/lisp/org/ox-texinfo
/home/philippe/.emacs.d/straight/build/eldoc/eldoc hides /usr/local/share/emacs/30.2/lisp/emacs-lisp/eldoc
/home/philippe/.emacs.d/straight/build/seq/seq hides /usr/local/share/emacs/30.2/lisp/emacs-lisp/seq
/home/philippe/.emacs.d/straight/build/compat/compat hides /usr/local/share/emacs/30.2/lisp/emacs-lisp/compat
/home/philippe/.emacs.d/straight/build/let-alist/let-alist hides /usr/local/share/emacs/30.2/lisp/emacs-lisp/let-alist

Features:
(shadow emacsbug csharp-mode c-ts-common treesit cc-langs cc-mode cc-fonts cc-guess cc-menus cc-cmds tramp trampver
tramp-integration files-x tramp-message tramp-compat xdg tramp-loaddefs emacsql-sqlite-builtin face-remap
evil-collection-forge forge-repos forge-tablist hl-line forge-topics forge-commands forge-semi forge-bitbucket
forge-gogs forge-gitea forge-gitlab forge-github forge-client forge-forgejo forge-notify forge-revnote forge-pullreq
forge-issue forge-discussion forge-topic yaml parse-time iso8601 eieio-custom bug-reference forge-post
evil-collection-markdown-mode markdown-mode evil-collection-outline noutline outline forge-repo forge forge-core
ghub-legacy ghub-graphql treepy gsexp ghub url-http url-gw url-auth forge-db closql emacsql-sqlite emacsql
emacsql-compiler eieio-base magit-bookmark evil-collection-magit magit-submodule magit-blame magit-stash magit-reflog
magit-bisect magit-push magit-pull magit-fetch magit-clone magit-remote magit-commit magit-sequence magit-notes
magit-worktree magit-tag magit-merge magit-branch magit-reset magit-files magit-refs magit-status magit
evil-collection-magit-repos magit-repos magit-apply magit-wip magit-log which-func evil-collection-imenu imenu
magit-diff evil-collection-smerge-mode smerge-mode diff git-commit evil-collection-log-edit log-edit pcvs-util add-log
magit-core magit-autorevert magit-margin magit-transient magit-process evil-collection-with-editor with-editor shell
pcomplete server magit-mode transient browse-url benchmark magit-git magit-base evil-collection-magit-section
magit-section format-spec cursor-sensor crm llama cond-let evil-collection-vc-git vc-git evil-collection-diff-mode
diff-mode track-changes vc-dispatcher backup-each-save evil-collection-go-mode go-mode find-file etags fileloop
generator switch-window switch-window-mvborder switch-window-asciiart quail gnutls network-stream nsm mailalias smtpmail
textsec uni-scripts url url-proxy url-privacy url-expand url-methods url-history idna-mapping ucs-normalize
uni-confusable textsec-check sort help-fns radix-tree cl-print backtrace ispell cape-keyword dabbrev mail-extr message
sendmail mailcap yank-media puny dired-quick-sort hydra lv ls-lisp dired-filter dired-hacks-utils dired-aux dired-x
evil-collection-dired vlf-setup dired dired-loaddefs rfc822 mml mml-sec evil-collection-epa epa derived epg rfc6068
epg-config gnus-util time-date mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums
mail-prsvr mailabbrev mail-utils gmm-utils mailheader vertico-directory mule-util vertico-sort minibuf-eldef facemenu
two-column pcase ialign-autoloads hl-todo hl-todo-autoloads crux-autoloads firestarter-autoloads disk-usage-autoloads
benchmark-init-autoloads suggest-autoloads loop-autoloads request-autoloads pkg-info-autoloads epl-autoloads
impatient-mode-autoloads simple-httpd-autoloads htmlize-autoloads hookify-autoloads google-translate-autoloads
chronos-autoloads docker-autoloads tablist-autoloads aio-autoloads evil-collection-atomic-chrome atomic-chrome websocket
url-cookie generate-lisp-file url-domsuf url-util bindat let-alist atomic-chrome-autoloads websocket-autoloads
let-alist-autoloads vterm-autoloads eat-autoloads exec-path-from-shell exec-path-from-shell-autoloads ztree-autoloads
treemacs-autoloads cfrs-autoloads posframe-autoloads pfuture-autoloads ace-window-autoloads avy-autoloads
switch-window-autoloads sr-speedbar-autoloads projectile-rails rake f inflections inf-ruby evil-collection-ruby-mode
ruby-mode smie autoinsert projectile-rails-autoloads rake-autoloads inf-ruby-autoloads inflections-autoloads projectile
evil-collection-grep grep evil-collection-compile compile evil-collection-comint comint ansi-osc ansi-color ibuf-ext
evil-collection-ibuffer ibuffer ibuffer-loaddefs ibuffer-tramp-autoloads goto-last-change-autoloads wgrep-ag-autoloads
wgrep-autoloads bm-autoloads dumb-jump evil-collection-popup popup dash evil-collection-xref xref project
dumb-jump-autoloads neotree-autoloads dirtree-autoloads windata-autoloads tree-mode-autoloads dired-du-autoloads
dired-imenu-autoloads dired-subtree-autoloads dired-ranger-autoloads dired-quick-sort-autoloads hydra-autoloads
dired-filter-autoloads dired-hacks-utils-autoloads ag-autoloads ace-jump-mode-autoloads forge-autoloads yaml-autoloads
ghub-autoloads treepy-autoloads closql-autoloads emacsql-autoloads fullframe fullframe-autoloads
git-timemachine-autoloads git-messenger-autoloads gist-autoloads gh-autoloads marshal-autoloads logito-autoloads
pcache-autoloads litable-autoloads chess-autoloads fireplace-autoloads sunshine-autoloads undo-fu undo-fu-autoloads
evil-goggles pulse evil-goggles-autoloads evil-exchange evil-exchange-autoloads evil-visualstar
evil-visualstar-autoloads evil-matchit evil-matchit-evil-setup evil-matchit-sdk semantic/lex semantic/fw mode-local
find-func evil-matchit-autoloads evil-collection-evil-mc evil-mc evil-mc-command-execute evil-mc-command-record
evil-mc-cursor-make evil-mc-region evil-mc-cursor-state evil-mc-undo evil-mc-vars evil-mc-known-commands evil-mc-common
evil-mc-autoloads evil-numbers evil-numbers-autoloads evil-surround evil-surround-autoloads evil-collection-unimpaired
evil-collection-which-key evil-collection-vertico evil-collection-tabulated-list evil-collection-tab-bar
evil-collection-simple evil-collection-replace evil-collection-process-menu evil-collection-kmacro evil-collection-info
evil-collection-indent evil-collection-help evil-collection-embark evil-collection-elisp-mode evil-collection-eldoc
evil-collection-corfu evil-collection-consult evil-collection-buff-menu evil-collection-bookmark evil-collection
annalist evil-collection-autoloads annalist-autoloads evil evil-integration evil-maps evil-commands reveal evil-jumps
evil-command-window evil-types evil-search evil-ex evil-macros evil-repeat evil-states evil-core evil-common rect
evil-vars evil-autoloads goto-chg-autoloads time autorevert filenotify delsel macrostep-autoloads emr-autoloads
iedit-autoloads clang-format-autoloads projectile-autoloads paredit-autoloads list-utils-autoloads popup-autoloads
elmacro-autoloads vlf-autoloads yasnippet-snippets-autoloads yasnippet-snippets yasnippet yasnippet-autoloads
whitespace-cleanup-mode whitespace whitespace-cleanup-mode-autoloads which-key which-key-autoloads
visual-regexp-steroids-autoloads visual-regexp-autoloads saveplace pretty-symbols-autoloads move-dup move-dup-autoloads
expand-region-autoloads eros-autoloads eimp-autoloads editorconfig editorconfig-core editorconfig-core-handle
editorconfig-fnmatch backup-each-save-autoloads recentf tree-widget wid-edit cape cape-autoloads corfu corfu-autoloads
marginalia marginalia-autoloads consult-dir-autoloads project-autoloads xref-autoloads embark-consult consult bookmark
text-property-search pp embark-consult-autoloads consult-autoloads embark ffap thingatpt url-parse auth-source eieio
eieio-core icons password-cache json map url-vars embark-autoloads vertico vertico-autoloads fussy compat flx
fussy-autoloads flx-autoloads fuz-bin-dyn fuz-bin fuz-bin-autoloads savehist amx s amx-autoloads yaml-mode-autoloads
web-mode-autoloads vimrc-mode-autoloads textile-mode-autoloads slim-mode-autoloads systemd-autoloads scss-mode-autoloads
sass-mode-autoloads rails-log-mode-autoloads rubocop-autoloads enh-ruby-mode-autoloads powershell-autoloads
php-mode-autoloads lsp-mode-autoloads eldoc-autoloads lv-autoloads spinner-autoloads ht-autoloads f-autoloads
elisp-depmap-autoloads dash-autoloads css-eldoc-autoloads less-css-mode-autoloads json-mode-autoloads rx
json-snatcher-autoloads js2-mode-autoloads nsis-mode-autoloads nix-mode-autoloads nginx-mode-autoloads
ini-mode-autoloads haml-mode-autoloads go-mode-autoloads qt-pro-mode-autoloads cc-styles cc-align cc-engine cc-vars
cc-defs dockerfile-mode-autoloads coffee-mode-autoloads cmake-mode-autoloads gptel-autoloads aider-autoloads s-autoloads
markdown-mode-autoloads ai-code-interface-autoloads magit-autoloads with-editor-autoloads magit-section-autoloads
llama-autoloads claude-code-autoloads inheritenv-autoloads transient-autoloads cond-let-autoloads compat-autoloads
seq-autoloads tabbar-autoloads minimap-autoloads fill-column-indicator-autoloads symon-autoloads edmacro kmacro
rainbow-mode-autoloads make-color-autoloads zenity-color-picker-autoloads beacon beacon-autoloads airline-cool-theme
airline-themes powerline byte-opt advice powerline-separators ring color powerline-themes airline-themes-autoloads
powerline-autoloads finder-inf silex-monokai-theme use-package use-package-ensure use-package-delight
use-package-diminish use-package-bind-key bind-key easy-mmode use-package-core use-package-autoloads info
bind-key-autoloads straight-autoloads cl-seq cl-extra help-mode straight subr-x cl-macs gv cl-loaddefs cl-lib bytecomp
byte-compile rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode
mwheel term/x-win x-win term/common-win x-dnd touch-screen tool-bar dnd fontset image regexp-opt fringe tabulated-list
replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer
select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple
cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese
eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj
charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget keymap hashtable-print-readable backquote threads dbusbind inotify lcms2 dynamic-setting
system-font-setting font-render-setting cairo gtk x-toolkit xinput2 x multi-tty move-toolbar make-network-process emacs)

Memory information:
((conses 16 622936 1058613) (symbols 48 41168 1163) (strings 32 153221 72149) (string-bytes 1 4879942)
 (vectors 16 97567) (vector-slots 8 956007 322348) (floats 8 372 8499) (intervals 56 2226 1559) (buffers 984 19))




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#80029; Package emacs. (Sat, 20 Dec 2025 13:09:02 GMT) Full text and rfc822 format available.

Message #8 received at 80029 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Philippe Vaucher <philippe.vaucher <at> gmail.com>,
 Theodor Thornhill <theo <at> thornhill.no>,
 Jostein Kjønigsen <jostein <at> kjonigsen.net>
Cc: 80029 <at> debbugs.gnu.org
Subject: Re: bug#80029: 30.2;
 csharp-mode wrong identation for catch...when blocks
Date: Sat, 20 Dec 2025 15:08:04 +0200
> From: Philippe Vaucher <philippe.vaucher <at> gmail.com>
> Date: Thu, 18 Dec 2025 15:34:41 +0100
> 
> 
> If you try to indent the following in `csharp-mode':
> 
>     try
>     {
>     }
>     catch (PipelineStoppedException) when (cancellationToken.IsCancellationRequested)
>     {
>     }
> 
> It displays like this:
> 
>     try
>     {
>     }
>     catch (PipelineStoppedException) when (cancellationToken.IsCancellationRequested)

Thanks.

Theo and Jostein, any ideas or suggestions?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#80029; Package emacs. (Sat, 20 Dec 2025 14:57:01 GMT) Full text and rfc822 format available.

Message #11 received at 80029 <at> debbugs.gnu.org (full text, mbox):

From: Philippe Vaucher <philippe.vaucher <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 80029 <at> debbugs.gnu.org,
 Jostein Kjønigsen <jostein <at> kjonigsen.net>,
 Theodor Thornhill <theo <at> thornhill.no>
Subject: Re: bug#80029: 30.2;
 csharp-mode wrong identation for catch...when blocks
Date: Sat, 20 Dec 2025 15:56:24 +0100
[Message part 1 (text/plain, inline)]
> Theo and Jostein, any ideas or suggestions?


Just to be clear: the position of the curly braces align with the "when"
instead of the "catch".

Kind regards,
Philippe
[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#80029; Package emacs. (Sat, 20 Dec 2025 15:24:02 GMT) Full text and rfc822 format available.

Message #14 received at 80029 <at> debbugs.gnu.org (full text, mbox):

From: Jostein Kjønigsen <jostein <at> secure.kjonigsen.net>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 80029 <at> debbugs.gnu.org,
 Jostein Kjønigsen <jostein <at> kjonigsen.net>,
 Philippe Vaucher <philippe.vaucher <at> gmail.com>,
 Theodor Thornhill <theo <at> thornhill.no>
Subject: Re: bug#80029: 30.2; csharp-mode wrong identation for catch...when
 blocks
Date: Sat, 20 Dec 2025 16:23:35 +0100
[Message part 1 (text/plain, inline)]
> On 20 Dec 2025, at 14:08, Eli Zaretskii <eliz <at> gnu.org> wrote:
> 
>> From: Philippe Vaucher <philippe.vaucher <at> gmail.com>
>> Date: Thu, 18 Dec 2025 15:34:41 +0100
>> 
>> 
>> If you try to indent the following in `csharp-mode':
>> 
>>    try
>>    {
>>    }
>>    catch (PipelineStoppedException) when (cancellationToken.IsCancellationRequested)
>>    {
>>    }
>> 
>> It displays like this:
>> 
>>    try
>>    {
>>    }
>>    catch (PipelineStoppedException) when (cancellationToken.IsCancellationRequested)
> 
> Thanks.
> 
> Theo and Jostein, any ideas or suggestions?

I can reproduce the issue without problems.

It seems to affect both csharp-mode and csharp-ts-mode equally (as in both gets the exact same wrong kind of indentation).

Seeing as this language feature was added waaay back in C# 6.0 (2015), it seems only reasonable Emacs should be able to support it.

I would say the source of this problem is that despite the age/maturity of this feature, we've actually never implemented support for this particular construct in either major-modes (tree-sitter or legacy).

I'm not going to put in effort trying to fix this for csharp-mode, as I really consider it obsolete at this point.

I'll look at csharp-ts-mode though, but i see already from treesit-explore that the grammar here is making things harder to handle than I would have hoped for.

—
Kind Regards
Jostein Kjønigsen

[Message part 2 (text/html, inline)]

This bug report was last modified today.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.