[[https://github.com/emacs-csharp/csharp-mode/actions][file:https://github.com/emacs-csharp/csharp-mode/workflows/Build%20&%20Test/badge.svg?branch=master]]
[[https://melpa.org/#/csharp-mode][file:https://melpa.org/packages/csharp-mode-badge.svg]]
[[https://stable.melpa.org/#/csharp-mode][file:https://stable.melpa.org/packages/csharp-mode-badge.svg]]
file:https://elpa.gnu.org/packages/csharp-mode.svg
* csharp-mode

This is a mode for editing C# in emacs. It's using CC mode or [[https://github.com/ubolonton/emacs-tree-sitter][tree-sitter]] for
highlighting and indentation.

** Main features

- font-lock and indent of C# syntax including:
  - all c# keywords and major syntax
  - attributes that decorate methods, classes, fields, properties
  - enum types
  - #if/#endif #region/#endregion
  - instance initializers
  - anonymous functions and methods
  - verbatim literal strings (those that begin with @)
  - generics 
- intelligent insertion of matched pairs of curly braces.
- compilation-mode support for msbuild, devenv and xbuild.

** tree-sitter support
You can enable experimental tree sitter support for indentation and highlighting using
#+begin_src elisp
  (use-package tree-sitter :ensure t)
  (use-package tree-sitter-langs :ensure t)

  (use-package csharp-mode
    :ensure t
    :config
    (add-to-list 'auto-mode-alist '("\\.cs\\'" . csharp-tree-sitter-mode)))
#+end_src
If you are using this, clearly state so if you find any issues.

Note that we don't depend on tree-sitter yet, so you have to manually install
the packages involved.  The simplest way is to use the provided snippet above.

*** Using and evolving the tree-sitter functionality.
=tree-sitter= introduces a minor mode called =tree-sitter-debug-mode= where you can
look at the actual syntax tree it produces.  If and when you spot missing or
wrong syntax highlighting, look at how the patterns are written in
=csharp-tree-sitter-mode.el=, then submit a pr with a couple new ones added.  When
testing and debugging this, it is actually as simple as =M-x eval-buffer= on
=csharp-tree-sitter-mode.el=, then =M-x revert-buffer= in the file you are testing.
It should update and show the correct syntax highlighting. 


So the development cycle is:
- Spot missing syntax highlighting
- View AST with =tree-sitter-debug-mode=
- Locate offending part
- Add new pattern
- =M-x eval-buffer= in =csharp-tree-sitter-mode.el=
- =M-x revert-buffer= inside your =some-test-file.cs=


** Usage

This package is currently available on both ELPA and MELPA. Install using ~M-x
package-install<RET>csharp-mode~.

Once installed the package should be automatically used for files with a '.cs'-extension.

Note: This package is also available on [[http://stable.melpa.org/][MELPA-stable]] for those who don't want or need
bleeding edge development-versions.

For a better experience you may want to enable electric-pair-mode when editing C#-files.
To do so, add the following to your .emacs-file:

#+BEGIN_SRC emacs-lisp
  (defun my-csharp-mode-hook ()
    ;; enable the stuff you want for C# here
    (electric-pair-mode 1)       ;; Emacs 24
    (electric-pair-local-mode 1) ;; Emacs 25
    )
  (add-hook 'csharp-mode-hook 'my-csharp-mode-hook)
#+END_SRC

For further mode-specific customization, ~M-x customize-group RET csharp RET~ will show available settings with documentation.

For more advanced and IDE-like functionality we recommend using csharp-mode together
with [[https://github.com/emacs-lsp/lsp-mode][lsp-mode]] or [[https://github.com/joaotavora/eglot][eglot]]

* Attribution

This repo was a fork of the code originally developed by Dylan R. E. Moonfire and
further maintained by Dino Chiesa as hosted on [[https://code.google.com/p/csharpmode/][Google code]].

** New focus

The original csharp-mode repo contained lots of different code for lots of different purposes,
some finished, some not, some experimental, some not. Basiaclly things like ASPX-mode, TFS-mode,
code completion backends, etc.

All this original code can still be found in the [[https://github.com/josteink/csharp-mode/tree/extras][extras-branch]], but we have decided to
go for a more focused approach and to throw out all dead or unused code, code we wont
be maintaining.

The goal: That what we package in csharp-mode actually works and works well.

* ELPA
This package aims to stay as close to mainline emacs as it can.  As such,
paperwork with the FSF is needed for contributions of significant size.


* License

The original project was licensed under [[https://www.gnu.org/licenses/gpl-2.0.html][GPL v2+]], but after a rewrite in September
2020, it was relicensed to GPLv3+
