发布于 2026-01-06 5 阅读
0

我是如何配置 Emacs 以使用 TypeScript + React 的?我的重点到底是什么?让我们开始吧!将 Tide 应用于 rjsx 和 Web 模式;在所有三种模式下使用 rjsx 代码片段;最后但同样重要的是……

我是如何配置 Emacs 以使用 TypeScript 和 React 的

我到底想表达什么?

让我们开始吧

适用tiderjsxweb模式

rjsx在所有三种模式下使用代码片段

最后但并非最不重要的

我到底想表达什么?

我最近接触了 TypeScript,这让我既欣喜又难过。长期以来,我一直在使用 React 和 Emacs 的rjsx-mode模式,而且一直很喜欢它。我觉得这个模式非常好,甚至连普通的 JavaScript 文件我都会用它。

后来我开始接触 TypeScript,它既让我惊艳,又让我感到惋惜。对于普通的 TypeScript 文件来说,.ts它简直太棒了。Spacemacs 的TypeScript 模式甚至比……还要好rjsx-mode,所有类型都完美地显示在底部栏,还有自动补全、自动导入……应有尽有。这都要感谢Tide。可惜的是:它没有…… tsx-mode,要编写 TypeScript.tsx文件,我们只能使用Web 模式。别误会,Web 模式也很棒,但这React + Typescript并非我们当时的目标。

我的观点是,要把这三种模式的优点都融入到所有模式中!

这段文字可能有点长,但我希望它能有所帮助 :)

以下是我的实际配置:

这里要强调一点:我现在用的是Spacemacs,所以这里的一部分代码示例会用到它,但其实没什么神奇之处,Spacemacs 只是在 Emacs 的基础上添加了一些预先写好的 Lisp 代码(哈哈)。你在其他版本的 Emacs 里也能做到。但我真心推荐你从 Spacemacs 入手,特别是如果你是 Emacs 新手。它彻底改变了我的使用体验,不过这又是另一个话题了。

让我们开始吧

您必须安装一些模式。如果您使用的是 Spacemacs ,那么在安装层时,大多数模式都会自动安装。这些软件包包括:,,,,,,如果
rjsx-mode漏掉了一些软件包,请见谅typescript-modeweb-modetidecompanyyasnippetprettier-js

或者更简单地说,在你的.spacemacs文件中添加以下图层dotspacemacs-configuration-layers



(defun dotspacemacs/layers ()
  ;; ... 
  dotspacemacs-configuration-layers
   '(
     html
     (typescript :variables
                 javascript-backend 'tide
                 typescript-fmt-tool 'prettier
                 typescript-linter 'eslint)
     (javascript :variables
                 javascript-backend 'tide
                 javascript-fmt-tool 'prettier
                 node-add-modules-path t)
 ;; ...


Enter fullscreen mode Exit fullscreen mode

参见TypeScript 层JavaScript 层HTML 层

并且dotspacemacs-additional-packages



;; ...
 dotspacemacs-additional-packages
   '(
     rjsx-mode
     yasnippet-snippets
     prettier-js
     ;; ...


Enter fullscreen mode Exit fullscreen mode

其中一些导入需要您安装第三方库:



npm i -g tern prettier


Enter fullscreen mode Exit fullscreen mode

如果您未使用 Spacemacs,则必须在您的.emacs文件中引入每个软件包。所有这些软件包的 GitHub 页面都提供了清晰的安装说明 :)

适用tiderjsxweb模式

基本配置已完成,三种模式都已安装并运行,接下来该做什么?

Tide模式功能强大,能为你带来很多便利,我建议你阅读一下它的 README 文件。它会自动运行,typescript-mode而且非常适合与其他js/ts模式一起使用。

我已将所有配置文件分开,并导入到配置文件中,但如果您不使用 Spacemacs,dotspacemacs/user-config则可以将所有这些额外的配置直接放在此部分或您的文件中。.emacs

首先,我们定义一个潮汐函数配置,然后将其应用于所有这些模式:



(defun dotspacemacs/user-config ()
 ;; ...
 ;; tide def func:
 (defun tide-setup-hook ()
    (tide-setup)
    (eldoc-mode)
    (tide-hl-identifier-mode +1)
    (setq web-mode-enable-auto-quoting nil)
    (setq web-mode-markup-indent-offset 2)
    (setq web-mode-code-indent-offset 2)
    (setq web-mode-attr-indent-offset 2)
    (setq web-mode-attr-value-indent-offset 2)
    (setq lsp-eslint-server-command '("node" (concat (getenv "HOME") "/var/src/vscode-eslint/server/out/eslintServer.js") "--stdio"))
    (set (make-local-variable 'company-backends)
         '((company-tide company-files :with company-yasnippet)
           (company-dabbrev-code company-dabbrev))))

;; hooks
(add-hook 'before-save-hook 'tide-format-before-save)


;; use rjsx-mode for .js* files except json and use tide with rjsx
(add-to-list 'auto-mode-alist '("\\.js.*$" . rjsx-mode))
(add-to-list 'auto-mode-alist '("\\.json$" . json-mode))
(add-hook 'rjsx-mode-hook 'tide-setup-hook)


;; web-mode extra config
(add-hook 'web-mode-hook 'tide-setup-hook
          (lambda () (pcase (file-name-extension buffer-file-name)
                  ("tsx" ('tide-setup-hook))
                  (_ (my-web-mode-hook)))))
(flycheck-add-mode 'typescript-tslint 'web-mode)
(add-hook 'web-mode-hook 'company-mode)
(add-hook 'web-mode-hook 'prettier-js-mode)
(add-hook 'web-mode-hook #'turn-on-smartparens-mode t)
 ;; ...


Enter fullscreen mode Exit fullscreen mode

最后这几行代码为.tsx文件和其他一些子模块添加了我们的 Tide 设置,这些子模块在其他两种模式中已经存在。

此外,我建议全局使用这些模式:



;; yasnippet
(yas-global-mode 1)

;; flycheck
(global-flycheck-mode)
(add-hook 'after-init-hook #'global-flycheck-mode)

;; company-mode 
(global-company-mode)


Enter fullscreen mode Exit fullscreen mode

rjsx在所有三种模式下使用代码片段

rjsx-mode与其他两种模式相比,它最大的优势在于代码片段功能,所以我们应该到处都使用它:)

这里有两种方法,第一种方法可以在你的.emacs.d配置文件中找到,该配置文件是代码片段配置的默认目录(在 Spacemacs 中是 `/etc/snippets/snippets/` .emacs.d/layers/+completion/auto-completion/local/snippets/),第二种方法是定义你自己的配置文件:



(add-to-list 'yas-snippet-dirs "~/path/to/your/dir")
;; notice that this add-to-list must be called before this:
(yas-global-mode 1)


Enter fullscreen mode Exit fullscreen mode

这里的步骤非常简单:在你的代码片段目录下,创建一个名为 `mode` 的目录,例如 `<mode_name>`,web-mode/然后在该目录下创建一个名为 `mode_names` 的文件,.yas-parents并将你想要“窃取”的代码片段的模式名称写入其中。在我们的例子中:

片段目录/

网页模式/

.yas-parents

typescript-mode/

.yas-parents


我自己的配置:
树上的这些方向的图片

将以下几行添加到文件中:

typescript-mode/.yas-parents



rjsx-mode


Enter fullscreen mode Exit fullscreen mode

web-mode/.yas-parents



rjsx-mode
prog-mode
js-mode


Enter fullscreen mode Exit fullscreen mode

最后但并非最不重要的

有了这些配置,你现在可以实现自动导入、保存时格式化/导入、检查类型、检查定义……所有功能都实现了 :)

但我还想向您推荐另一个名为paredit 的软件包:它是一个 Lisp 语言库(如果您使用任何 Lisp 系列语言进行编程,这个软件包应该是必备的!)。一旦您掌握了快捷键,并且希望在所有语言中都能使用它们,那么可以通过以下函数调用来实现:



(sp-use-paredit-bindings)


Enter fullscreen mode Exit fullscreen mode

我也使用neotreeall-the-icons来创建侧边栏。由于这篇文章已经太长了,关于这个具体的配置,我会在另一篇文章中详细介绍 :)

可以美化符号

我真心希望你喜欢它,也希望它对你的 Emacs 使用之旅有所帮助。

是我的 Spacemacs 配置仓库,我的所有 Lisp 程序都在laurisp/(哈哈)目录中。

注意安全,戴口罩,待在家,用
Emacs。xoxo

编辑:今天我发现了一些奇怪的问题,import-js所以把它从教程里删除了。我会尝试用 Tide 在保存时整理导入的文件,如果成功了我会在这里更新 :)

文章来源:https://dev.to/viglioni/how-i-set-up-my-emacs-for-typescript-3eeh