如何配置Elixir 1.6的.formatter.exs实现函数间空两行?
配置Elixir 1.6代码格式化工具 & 函数间保留两行空行
嘿,我来帮你搞定Elixir 1.6的代码格式化配置问题!
一、基础设置代码格式化工具
Elixir 1.6首次引入了mix format命令,自带代码格式化能力,配置起来很简单:
- 在项目根目录创建(如果还没有)
.formatter.exs文件,这是格式化工具的核心配置文件。 - 基础配置示例如下,你可以根据项目需求调整:
[ # 指定要格式化的文件范围,覆盖项目常见的代码文件 inputs: ["*.{ex,exs}", "priv/*/seeds.exs", "{config,lib,test}/**/*.{ex,exs}"], # 自定义行长度,默认是98 line_length: 120, # 配置不需要加括号的本地函数,让代码更简洁 locals_without_parens: [fetch: 1, update: 2] ]
配置好之后,直接在终端运行mix format就能格式化所有匹配的文件了。
二、让模块内函数间保留两行空行
这里要说明一下:Elixir 1.6的默认格式化工具会自动把函数定义之间的多个空行压缩成一行,而且当时的版本没有内置配置项直接修改这个行为。不过有两个变通方案可以实现你的需求:
方案1:用注释占位符(简单但不优雅)
如果你只是想在特定函数之间保留两行空行,可以在空行位置加一个无内容的注释(#),格式化工具不会移除它:
defmodule UserService do def get_user(id) do # 业务逻辑 end # def update_user(id, params) do # 业务逻辑 end end
这个方法不需要复杂配置,适合快速实现需求,但会留下注释占位符,可能影响代码美观。
方案2:自定义格式化模块(灵活但需要开发)
如果你想要全局统一让函数间保留两行空行,可以自定义一个格式化模块,扩展默认的格式化逻辑:
- 在项目中创建一个自定义格式化模块,比如
MyApp.Formatter,实现format/2函数,先调用默认格式化器处理代码,再修改输出内容,在函数定义之间插入额外的空行:
defmodule MyApp.Formatter do @behaviour Mix.Tasks.Format.Formatter @impl true def format(source, opts) do # 先用默认格式化器处理 formatted = Mix.Tasks.Format.DefaultFormatter.format(source, opts) # 将函数定义之间的单个空行替换成两个空行 String.replace(formatted, "\n\ndef ", "\n\n\ndef ") end @impl true def features, do: [sigils: [], extensions: [".ex", ".exs"]] end
- 在
.formatter.exs中指定使用这个自定义模块:
[ formatter: MyApp.Formatter, # 其他基础配置... ]
这个方案更灵活,能全局统一处理,但需要你有一定的Elixir元编程和字符串处理经验。
额外建议:升级Elixir版本(最优解)
如果你的项目可以升级到Elixir 1.10及以上版本,事情会简单很多——新版本的格式化工具新增了newlines_between_functions配置项,直接在.formatter.exs里加一行就能搞定:
[ # 其他配置... newlines_between_functions: 2 ]
这是最简洁优雅的方案,推荐优先考虑升级(只要项目依赖允许的话)。
希望这些方法能帮到你!
内容的提问来源于stack exchange,提问作者Denys Klymenko
相关产品推荐
相关产品推荐

