inotifywait 监控文件修改实时格式化文件

我们在学习 laravel 过程中,从文档网页复制代码,会有一些比较麻烦的问题。以 《Laravel 10 中文文档》 | Laravel China 社区 (learnku.com) 为例

 

直接点复制按钮会带后,想测试的代码的话,还有处理 use 语句

选中复制时,网站会向剪贴板追加来源信息,还得手动处理。

 

这些手动处理起来,很浪费时间的,于是想到写个工具吧,专门用来处理这两个问题。

function watch-laravel(){

    cd /www/loc.laravel.com # 先cd 到laravel 项目
    local dir="app routes tests" # 这里是需要监控的文件和目录
    inotifywait --event modify --format "%w%f" -mrq $dir | while read file; do

        if [[ ! -f "$file" ]];then
            continue
        fi

        # 处理复制追加内容
        if [[ -n "$(grep -Po '文链接' $file)" ]];then
            sed -i '/————————————————/,/文链接/d' $file
        fi

        # 处理 use 语句
        if [[ -n "$(sed '/\bnamespace\s/,/\bclass\s/{/namespace/b; /class/b; d}' $file | grep -Po 'use\s+\w+\\.*;')" ]];then

            local appends="$(grep -Po 'use\s+\w+\\.*;' $file | sort | uniq)"; appends="${appends//\\/\\\\}"

            sed -i -r '/use\s+\w+\\.*;/d' $file
            echo "$appends" | while read -r line; do
                sed -i -r "/\bnamespace\s/a$line" $file
            done

        fi
    done

}

 

能自动识别  namespace 和 class 之间内容,正则条件是 \bnamespace\s 和 \bclass\s 即 单词边界+单词+空格,如果文件实在没有 namespace 和 class 那就写两个注释,如下:

//namespace aaa  //加上aaa 是为了防止 ide 自动清理行结尾空格
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\DB;

//class aaa

Route::namespace('\App\Http\Controllers')->group(function(Router $router) {
    
    $router->group(['prefix'=>'demo','namespace'=>'Demo'], function($router) {

        $router->any('/user/index','UserController@index')->name('demo.user.index');

    });
});

 

posted @ 2023-06-28 22:55  心随所遇  阅读(29)  评论(0编辑  收藏  举报