February 2, 2023
By: Kevin

Emacs开发c#

  1. Emacs 写 Csharp
  2. 安装和配置步骤
    1. omnisharp的安装
    2. emacs 配置
  3. 遇到的问题

最近用Mac在Emacs上进行c#开发, 体验很良好, 很出乎意料能够用一台Arm处理器的苹果电脑开发c#程序.

Emacs 写 Csharp

Emacs对C#支持很完整, 和vscode一样, 都是omnisharp作为lsp后端, 功能差异不大.

  • 高亮和自动缩排: csharp-mode
  • 片段(代码模板): yasnippet
  • 补全: company + omnisharp
  • 语法检查: flycheck + omnisharp
  • 程式排版美化: omnisharp
  • 显示数据型: omnisharp
  • 跳到函式定义: omnisharp
  • 重新命名函式或变量: omnisharp
  • 程序重构建议: omnisharp

安装和配置步骤

需先安装NET SDK

Emacs安装omnisharp.

omnisharp的安装

  1. 插件提供了 M-x package-install RET omnisharp RET 自动安装omnisharp的功能, 可惜默认版本不够新.
  2. 建议手动去github下载, 注意使用最新的版本. 下载地址
  3. MacOS系统有安全设置, 需要对目录下所有的库文件以及可执行文件统一处理下.
    sudo xattr -r -d com.apple.quarantine /path/to/omnisharp-osx-x64-net6.0/
    
  4. 下载完成后, 解压, 配置下变量, 指定正确的目录 M-x customize-group RET omnisharp RET
    (setq omnisharp-server-executable-path "~/.emacs.d/.cache/omnisharp/server/omnisharp-osx-x64-net6.0/omnisharp")
    
  5. 研究下文档

emacs 配置

(eval-after-load
    'company
  '(add-to-list 'company-backends #'company-omnisharp))

(defun my-csharp-mode-setup ()
  (omnisharp-mode)
  (company-mode)
  (flycheck-mode)

  (setq indent-tabs-mode nil)
  (setq c-syntactic-indentation t)
  (c-set-style "ellemtel")
  (setq c-basic-offset 4)
  (setq truncate-lines t)
  (setq tab-width 4)
  (setq evil-shift-width 4)

  (local-set-key (kbd "C-c r r") 'omnisharp-run-code-action-refactoring)
  (local-set-key (kbd "M-.") 'omnisharp-go-to-definition)
  (local-set-key (kbd "C-c C-t") 'omnisharp-unit-test-buffer)  ;; 增加单元测试快捷键
  (local-set-key (kbd "C-c C-p") 'omnisharp-unit-test-at-point)
  (local-set-key (kbd "C-c C-c") 'recompile))

(defun find-cs-project-name ()
  (let* ((project-name (file-name-directory (buffer-file-name)))
         (paths (file-name-directory (buffer-file-name)))
         (last-path (string-replace "/" "" (car (last (eshell-split-path paths))))))
    last-path))


(add-hook 'csharp-mode-hook 'my-csharp-mode-setup t)

建立一些常用的组合键来启动omnisharp-server, 跳到定义, 跟显示变量/类型的使用情况(查找用法) 补全 Company-backends 设定为 company-omnisharp的子模式(minor mode)

遇到的问题

  1. nuget引入新的库的之后, restore项目以后, 需要手动重启以下ominisharp server.
    • M-x omnisharp-satrt-server
    • M-x omnisharp-stop-server
Tags: c# emacs