IntelliJ:动态更新文件 header

IntelliJ: Dynamically updated file header

默认情况下,IntelliJ Idea 将插入(类似于)以下内容作为新源文件的 header:

/**
 * Created by JohnDoe on 2016-04-27.
 */

对应的模板为:

/**
 * Created by ${USER} on ${DATE}.
 */

是否可以更新此模板,以便在文件更改时插入最后修改日期?例如:

/**
 * Created by JohnDoe on 2016-03-27.
 * Last modified by JaneDoe on 2016-04-27
 */

PHPStorm 没有 "hook" 用于在检测到文件更改后启动任务(仅用于在服务器中上传是)。代码模板基于文件的创建而不是更改。

你想要的行为(手动更改文件后自动更改文件)对很多事情都很有用,但它会让编辑器循环头痛。因为如果你改变一个文件它必须改变文件(如果一个文件被改变?它改变文件?)。

但是,您也许可以 "enable Live Templates" 当您启动 "reformat code" 时,它能够重写您的开始模板代码,从而重写日期修改。

其他解决方案是使用带有 as grunt 的工具,但我不知道是否管理 php 文件。

不支持开箱即用。我建议您根本不要在文件中包含有关作者和最后 edit/create 时间的信息。

原因是您的版本控制系统(Git、SVN)自动包含相同的信息。因此,手动标记只是对现有信息的复制,但更容易出错,需要手动更新。

这是一个与我正在使用的类似的有效解决方案。在 mac os.

上测试
  1. 创建一个 bash 脚本,仅当文件中不包含确切值时才会替换第一次出现的 Last modified by JaneDoe on $DATE

    #!/bin/bash
    
    FILE=src/java/test/Test.java
    DATE=`date '+%Y-%m-%d'`
    PREFIX="Last modified by JaneDoe on "
    STRING="$PREFIX.*$"
    SUBSTITUTE="$PREFIX$DATE"
    if ! grep -q "$SUBSTITUTE" "$FILE"; then
      sed -i '' "1,/$(echo "$STRING")/ s/$(echo "$STRING")/$(echo "$SUBSTITUTE")/" $FILE
    fi
    
  2. 安装File Watchers插件。

  3. 创建一个具有适当范围的文件观察器(它可以是这个单个文件或任何其他范围,以便项目源代码中的任何更改都会更新修改日期或版本等)并放置一个路径到您的 bash 脚本到 Program 字段。

现在每次文件更改时,日期都会更新。如果要分别更新每个文件的日期,应将参数 $FilePath$ 传递给脚本。

这可能只是对@oleg-mikhailov 绝妙想法的评论,但代码片段不适合。基本上,我只是调整了他的解决方案。

我需要稍微不同的语法,但这不是问题所在。问题是,当脚本 运行 使用 File Watchers 插件自动保存文件时,如果 运行 在不包含 PREFIX 的文件上,它将 运行 一遍又一遍。

我认为问题出在插件本身,因为当 运行 从 shell 时没有发生,但我不确定为什么会发生。

无论如何,我最终 运行 编写了以下脚本(正如我所说,与原始脚本相比只有细微的变化)。如果前缀不存在,新脚本也会引发错误。对我来说,这是一项功能,因为 Pycharm 提示我错误,我可以修复文件。

在 macOS 11.6 上使用 PyCharm 2021.2.3 进行测试。

#!/bin/bash

FILE=
DATE=`date '+%Y-%m-%d'`
PREFIX="last_modified_date: "
STRING="$PREFIX.*$"
SUBSTITUTE="$PREFIX$DATE"
if ! grep -q "$SUBSTITUTE" "$FILE"; then
  if grep -q "$PREFIX" "$FILE"; then
    sed -i '' "s/$(echo "$STRING")/$(echo "$SUBSTITUTE")/" $FILE
  else
    echo "Error!"
    echo "'$PREFIX' doesn't appear in $FILE"
    exit 1
  fi
fi