簡體   English   中英

如何使用scalafmt為模式匹配語法中的情況配置alignToken?

[英]How to configure the alignToken for the cases in pattern matching syntax using scalafmt?

在scala中使用scalafmt並在.scalafmt.conf文件中包含以下內容:

style = default
maxColumn = 120
continuationIndent.callSite = 2
continuationIndent.defnSite = 2
align.openParenDefnSite = false
align.openParenCallSite = false
danglingParentheses = true
indentOperator = spray
project.excludeFilters = [".*\\.sbt"]
rewrite.rules = [RedundantBraces, RedundantParens, SortModifiers, prefercurlyfors]
unindentTopLevelOperators = true
importSelectors = singleLine
spaces.afterKeywordBeforeParen = true
lineEndings = unix
newlines.penalizeSingleSelectMultiArgList = false
newlines.alwaysBeforeElseAfterCurlyIf = false
binPack.literalArgumentLists = false
runner.optimizer.forceConfigStyleMinArgCount = 1

它目前與案例箭頭標記對齊:

object Object {
  def f(s: String): Int = s match {
    case "a" => 1
    case "b" | "c" | "d" => 2
    case "e"=> 3
    case _  => 4
  }
}

對此:

object Object {
  def f(s: String): Int = s match {
      case "a"             => 1
      case "b" | "c" | "d" => 2
      case "e"             => 3
      case _               => 4
  }
}

我不希望代碼在箭頭上對齊以便最小化拉取請求中的空白噪聲,尤其是在重命名一行以改變整個塊的縮進級別時。

閱讀scalafmt文檔我只知道默認情況:

align.tokens默認值: [caseArrow]

對齊標記是一對代碼,它是令牌運營商和所有者的字符串文字,它是擁有該令牌的最近樹節點的類型。 如果未提供所有者,則將匹配所有樹種。

 x match { case 1 => 1 -> 2 case 11 => 11 -> 22 } 

配置此示例

 align.tokens = [{code = "=>", owner = "Case"}] 

我想不僅禁用對齊,而且我希望scalafmt確保在=>箭頭之前和之后有一個空格。 (所以它基本上應該與它目前正在做的相反。)

我怎樣才能做到這一點?

它看起來像有沒有一個方便的align.tokens.remove方法去與align.tokens.add方法,但是等效的行為可以通過手動指定來實現align.tokens參數。

如果添加到配置中,以下行將復制除case => token之外的所有內容的默認對齊令牌行為。 它也不會對齊case ⇒令牌,除非你做一些不尋常的事情,否則應該保持與=>相同的對齊行為。

align.tokens = [
    { code = "extends", owner = "Defn.(Class|Trait|Object)" }
    { code = "//", owner = ".*" }
    { code = "{", owner = "Template" }
    { code = "}", owner = "Template" }
    { code = "%", owner = applyInfix }
    { code = "%%",owner =  applyInfix }
    { code = "%%%",owner =  applyInfix }
    { code = "<-", owner = "Enumerator.Generator" }
    { code = "←", owner = "Enumerator.Generator" }
    { code = "->", owner = applyInfix }
    { code = "→", owner = applyInfix }
    { code = "=", owner = "(Enumerator.Val|Defn.(Va(l|r)|Def|Type))" }
]

默認的令牌列表取自源代碼文件AlignToken.scala ,它們包含在default對象中。

如果要刪除其他標記格式實例,只需從地圖中刪除它們的實例即可。

請注意,如果在更新版本的scalafmt中添加了其他默認令牌,則必須手動將它們添加到配置中的此參數中以獲取該功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM