February 2, 2023
By: Kevin
Emacs开发c#
最近用Mac在Emacs上进行c#开发, 体验很良好, 很出乎意料能够用一台Arm处理器的苹果电脑开发c#程序.
Emacs 写 Csharp
Emacs对C#支持很完整, 和vscode一样, 都是omnisharp作为lsp后端, 功能差异不大.
- 高亮和自动缩排: csharp-mode
- 片段(代码模板): yasnippet
- 补全: company + omnisharp
- 语法检查: flycheck + omnisharp
- 程式排版美化: omnisharp
- 显示数据型: omnisharp
- 跳到函式定义: omnisharp
- 重新命名函式或变量: omnisharp
- 程序重构建议: omnisharp
安装和配置步骤
Emacs安装omnisharp.
omnisharp的安装
- 插件提供了
M-x package-install RET omnisharp RET自动安装omnisharp的功能, 可惜默认版本不够新. - 建议手动去github下载, 注意使用最新的版本. 下载地址
- MacOS系统有安全设置, 需要对目录下所有的库文件以及可执行文件统一处理下.
sudo xattr -r -d com.apple.quarantine /path/to/omnisharp-osx-x64-net6.0/ - 下载完成后, 解压, 配置下变量, 指定正确的目录
M-x customize-group RET omnisharp RET(setq omnisharp-server-executable-path "~/.emacs.d/.cache/omnisharp/server/omnisharp-osx-x64-net6.0/omnisharp") - 研究下文档
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)
遇到的问题
- nuget引入新的库的之后, restore项目以后, 需要手动重启以下ominisharp server.
M-x omnisharp-satrt-serverM-x omnisharp-stop-server