一致的代码格式化工具reformatter

有人提到了一个已有的类似的


purcell发布了一个定义代码格式化工具的。可以通过一些简单的定义,来使这些调用外部工具的格式化工具得到统一的接口。暂时好像只能对整个buffer操作?

简单试用了一下大致可以把:

(use-package json-reformat)
(use-package py-yapf)
(use-package py-isort)

换成了:

  (reformatter-define json-format
    :program "jq"
    :args '("--indent" "4"))

  (reformatter-define yapf-format
    :program "yapf")

  (reformatter-define isort-format
    :program "isort"
    :args '("--apply" "-"))

2 个赞

今天恰好找代码格式化工具,先没看到楼主这帖子,不过找到了楼主第一行提到的那个format-all-buffer包,因为它能支持fortran

该包链接地址:https://github.com/lassik/emacs-format-all-the-code

感觉那个包很好,装了之后不需要改配置文件就能用,试了试,使用也很不错,在fortran,python和c++都能很好的格式化,也不会有一些工具那种格式化之后某些行末插入^M,某些行末又不插的情况。而且这包有个优点,格式化一种语言时,如果工具没安装,就会在下方提示该用什么方法装什么工具,很贴心。

尝试之后,我把各语言各自的格式化工具都去掉了,只在配置文件中添加了一句:

(add-hook 'after-save-hook 'format-all-buffer)

这样保存的时候就能自动格式化了,比较方便。

2 个赞

来列举一下这功能不能代替哪些语言的 format 工具。

rust

由于安装 rust 要么是通过 rustup 来安装的,要么是通过系统包管理来操作,都会带 一下 rustfmt。而写 rust 代码必然会装 rust-mode 这个包。其自带了 format 功能,不过比较可惜的是它也只能 format 整个 buffer.

cpp

在使用 lsp 的情况下,目前 3 大能用的 c++ lsp 有:

  • ccls
  • clangd
  • cquery

由于 lsp 里有约定格式化相关的方法(虽然上面的这 3 个 ls 底下都是用的 clang 那 一套,即跟单独调用 clang-format 效果一样),所以借着 lsp-format-buffer, lsp-format-region 都可以实现 format 功能。

ocaml

对于 ocaml 来说,目前没有使用 lsp 来开发,而采用了 ocp-indent。 这个倒是可 以通过 format-all-buffer 来代替。

bazel

bazel-mode 也自带了一个,底下 调用的是 buildifier

不应该是before-save-hook

随手设的…发现能用,就没管了…

项目组用还是edirotconfig之类的比较好

我发现这个格式化,光标会到处跑