Use windows terminal swtich environments

Use windows terminal swtich environments

之前写了个关于Cmder的相同的文章

Cmder是Windows命令行终端的一个很好代替,不光默认支持Git,甚至集成了一些Linux的工具命令。
最近因为使用GitUI,Cmder在调整窗口大小后基本就会图像错乱不能用了。但是Windows Terminal没有这个问题。
又发现最近Windows Terminal的功能不断增强。也可以很简单配置各个profile的启动时预置脚本,感觉启动还比Cmder快。
所以又写了这篇。唯一缺点就是注册右键菜单不是很方便

Windows Terminal Profile 配置

Windows Terminal本身就支持多配置文件功能可以用于环境切换。如下图

  1. 拷贝现有的命令提示符配置,追加IDEA202233新的配置
  2. 在命令行中设置中,添加启动时的执行脚本,配置环境变量,这里就简单把IntelliJ202233的路径设置一下
  3. 还可以更改图标,方便区分环境。当然还可以选择不同外观。

picture

注册特定配置为资源浏览器右键菜单

关键是这一步让很多人不想用Windows Terminal。没有从软件中直接支持。
其实是很简单的东西。希望马上可以支持。
网上很多文章有介绍原理。都懂,但是拿到自己机器上的时候就要好好看看。一步一步改。
所以就做了下面的添加,删除脚本。Windows 11的用户可以无脑使用。
不过,请注意以下脚本仅在Windows 11中测试。

  1. 添加:指定配置名称,就可以添加到右键菜单。可以指定ico图标文件,默认为cmd图标(因为WT的exe会随版本更新而路径不一样)
  2. 删除:列出已经添加右键菜单的配置名称,输入配置名称即可注销右键菜单。通过匹配菜单名称(以”Open Terminal”开头)来确定,如果自行修改脚本,请注意

picture

picture

抛砖引玉 - 利用Cmder对本地Java运行时环境的切换应用

抛砖引玉 - 利用Cmder对本地Java运行时环境的切换应用

多版本环境

做开发的朋友大多数都会有多个环境的切换困扰。通常一个好的运行时环境能有一个好的版本管理器比较重要。
就譬如NodeJs的nvm - 虽然这也是因为Node的版本升级实在太快,不得不出这么一个(不然就是噩梦)。
但是相对来说向前兼容性比较强的Java环境来说,这种需求不是很突出。所以这类版本管理在Java环境中就不是很常用。

不过相对于比较滞后的企业应用,Oracle对JDK的不断升级迭代,很多旧系统不得不跟随步伐,
很多商业软件也不得不跟随步伐的情况下。JDK的多版本环境的需求很多时候也是刚性的。

Cmder

Cmder是Windows命令行终端的一个很好代替,不光默认支持Git,甚至集成了一些Linux的工具命令。
除了UI,对于Windows系统上下文菜单的集成配置自由度也是相当的高。

思路

在安装多个JDK需要切换的时候,通常就是在指定程序的启动bat里面临时替换JAVA_HOME和PATH。
非常简单但是每次都要写一段,有时候需要改变运行时还需要改动。简单但是繁琐。
由于Cmder本身带有一个初始化script。理论上把JAVA_HOME和PATH的替换命令加进去就可以了。

做法

原理很简单,但是如何在一个工具中实现理论上的配置通常就是比较花时间的地方。
而且工具也可能有多个地方可以更改,如何找到最优的方法也是比较花时间。
下面是我个人认为最优的方法。无需编辑添加任何文件-直接在设置中添加。

  1. 打开Cmder设置,点击进入【启动-任务】设置

  2. 复制一个现有任务(以管理员打开cmder比较好),加上适当后缀,譬如jdk7

  3. 修改命令组内容,如下
    picture

    以下文本用于复制粘贴

    1
    *cmd /k %ConEmuDir%\..\init.bat&SET JAVA_HOME="C:\Java\jdk1.7.0_25"&SET PATH=C:\Java\jdk1.7.0_25\bin;%PATH%
  4. 点击进入【集成】设置

  5. 选取一个菜单项(譬如Cmder Here)后,更改菜单项名称(譬如 Cmder Here w/jdk7),命令(使用新建的jdk7任务),然后点击【注册】
    picture

确认

这样你会发现在Windows系统的上下文菜单(右键菜单)中多了一个【Cmder Here w/jdk7】。
在任意文件夹中右键点击该项,就会启动一个cmder的命令行窗口。
picture
输入java -version 就可以确认到你预先设置好的Java环境了
picture

应用和TODO

上述是利用Cmder最基本的【在文件夹中打终端】功能,实现在特定PATH下指定运行时打开命令终端。

  • 同理可以应用到任何一种基于PATH的运行时环境的切换。
  • Cmder还可以把选中文件作为参数传入。这个我还没尝试成功如何设置。
    理论上应该可以指定Java JDK版本运行选中bat。加上这个功能的话用着就更加舒服了。
    有朋友知道的话,希望分享一下设置方法,命令组内容。
Python PDF自制工具

Python PDF自制工具

方便的快速编程语言和丰富的扩展

 我对于Python的印象就是一个好写, 好除虫, 快速上手的强大的批处理工具语言.当然由于工作上不是经常用到,所以认识比较浅薄.
这阶段由于为了帮孩子有效复习, 买了可以双面扫描的打印机后, 发现家用打印机毕竟不是商用, 一些功能还是比较不方便.
譬如, 扫描下来的页面只能是竖着的, 电脑上查看要横过来还得自己旋转. 有些是书本册子的, 中间的装订线去除后扫描, 页面需要分割, 顺序也需要重新排序. 虽然有PDF编辑软件, 但每次这种单纯操作的工作量还是很大.
而且很狗屁的是很多所谓的免费PDF编辑软件都一些基本功能, 还要安装. 一旦需要高级一点的马上需要升级订阅.
这时我首先想到了Python.

使用PDF库

 pdfrw - 至少对于我的需求这个库非常的好. 一开始使用PyPDF2, 但是在分割的时候发现会造成文件大小翻倍, 也不能压缩,所以途中放弃转用pdfrw. 而且发现该作者还很热心, 在PyPDF2的分割文件大小翻倍的issue thread上给出pdfrw的写法.

自制工具

 所有工具追求易用, 都采用选择PDF, 拖拽带相应的py上后就开始执行.
所有输出统一到同文件夹内新建out的子文件夹中.
出现任何异常console画面会停顿10秒可以查看出错的命令行数, 错误内容.

使用前先安装pdfrw(pip install pdfrw).
最好把Python升级到3.8以上, 我发现有新的python launcher可以自动关联py文件.
双击, 拖拽文件执行都很方便.

  1. mergePdf.py
    把拖拽的多个文件合并成一个文件. 拖拽时鼠标拖动的文件最好是第一个.
    不然可能点中的文件可以跑到头上去.
  2. rotateL90.py
    把拖拽的多个文件都执行向左旋转90度
  3. split&sort.py
    这个比较高级点. 是根据以下的扫描前提进行处理的.
    去装订线扫描时 - 从中间页(为第一页)开始扫描.
    这样譬如中间页是 11,12, 则 Page1(11,12), Page2(13,10), Page3(9,14)…
    所以这个py把拖拽的文件都执行下述操作后分别输出为一个新的pdf.
    原文件可供制册打印, 处理后的文件可用于电脑阅读.
    • 分页: 把每页分成左右两页
    • 排序: 根据上述规则, 把分割的页面按真正的页序排序

2020-05-05追加

  1. split&sort_reverse.py
    上一个脚本的小改动, 以应付竖版装订书的页序(像古文那样从右往左读,翻页的册子)
  2. reverse.py
    单纯倒序排列PDF页面.
  3. delete.py
    删除指定页面, 仅处理单个文件. 删除页面以空格分隔指定.

感觉有了python都懒得打开臃肿的PDF编辑软件了.

分享py以供有同样需求的朋友, 或者当样例参考, 毕竟需求类似的话比自己从0开始考虑要省力很多.

Git - 如何在Windows git环境下提取两次commit的文件增量并打包成zip

Git - 如何在Windows git环境下提取两次commit的文件增量并打包成zip

背景

工作上用了一段时间的 Git, 虽然同事都推荐直接用命令行, 无奈我这个人还是喜欢看 UI. 而且在 SVN 时代, 抽取两次提交的变更文件是非常惯用的操作, 切换到 Git 之后一直为如何实现这个命令耿耿于怀. 虽然看了有各种方式可以实现, 但是始终没到自己惯用的方式.
最近发现新思路, 于是就整理一下, 方便大家 Google.

一些通常能 Google 到的方法

  1. TortoiseGit 内建了一个在 log 画面中选择文件后抽取的功能
    TortoiseGit Export Selection To...
    这个功能对于抽取单次提取的文件很方便, 但是多次累计就用不上了, 在 log 画面选两个 commit 完全和 svn 不一样干脆就看不到文件了. 虽然网上有文章介绍这个小技巧, 但是因为这个原因, 所以…不完美.

  2. Windows batch
    我曾一度使用, 是一个日本人写的. 原理就是用 git diff 出来的结果放入循环, 一个一个拷贝出来.
    可以设置到 SourceTree 的 Custom Actions 中直接使用.
    这个人的 blog 我现在也找不到, 就不贴了. 而且这个方法有个弊病!
    在 Windows 环境下, 文件路径是有长度限制的, 在很多项目中文件夹太多层的话, 就会出现找不到文件的问题.
    当然从 Windows 10 开始通过策略组可以取消这个限制 - 但是也就证明了在环境不通用的情况下不是每个人都能成功配置,所以…不完美.

  3. Shell script
    Git diff $sha1 $sha2 –name-only | xargs tar -zcvf update.tar.gz 这个方法是命令行, linux 中最通用的.
    的确很好使, Windows 环境下安装 Git 自带的 Linux 工具命令后, 使用起来一点问题没有.
    但是就是每次得拷贝 SHA 值比较费神, 另外 tar 的压缩方式在 Windows 下总觉得别扭, 解压得 2 次…不完美

  4. SourceTree 原生的功能就更不用提了, 只能 Archive 真个项目状态, 太费事费力.

几个关键以及解决方式

  1. 如何从 GUI 操作传入选中的 SHA 值
    SourceTree 的 Custom Actions 提供了这点, 可以传递$SHA 给 Script.

  2. 如何让 SourceTree 的 Custom Actions 执行 bash 的 shell scrip
    这个点是最重要的关键, 但是我在找这个解决方案的时候, 没有文章提及这点, 还是瞎猫碰死耗子在一片完全不相关的文章中找到了答案. 配置如下, Git 是大家都会装的东西, bash 自动附带.
    SourceTree Custom Action Run Bash Script

  3. 这样我们就可以在 Windows 下用方便的 shell command 抽取两次提交的变更文件, 同时打包.
    但是还有一个问题就是如何打包成 zip, Windows 自身没有带这方面的命令. 而 Git 的 linux 工具包 unzip, tar 都带了, 唯独 zip 这个东西没带. (我在调查这个的时候有段小插曲, 我两台电脑, 一台有 zip 命令, 一台没有. 一开始我搞不懂我装了什么不一样的东西造成了这个差异, 花了好长时间才发现 Oracle 数据库安装目录的 bin 里面居然带了 zip.exe…好吧)

    关键我在网上除了找得到这个项目(Info-ZIP)的代码, 居然找不到编译好的 zip.exe,拷贝来用. 有需要的朋友可以直接在这里下(zip.exe.zip).
    放到 Git 安装文件夹的那个 linux 工具包路径(Git\usr\bin)里就可以像其他命令一样直接使用.

    下面就是 shell 本身, 其实搞明白就没啥大不了的. 有需要就参考一下.

    $Repo 不是必须的, SourceTree 中执行时当前文件夹自动为项目根目录.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # use parameter -> $REPO $SHA
    repo=""
    sha1=""
    sha2=""
    if [ -n "$1" ] && [ -n "$2" ] && [ -n "$3" ] && [ -z "$4" ]; then
    repo=$1
    sha1=$3
    sha2=$2
    echo "Repository is ${1}."
    echo "Current path is ${PWD}."
    echo $2
    echo $3
    # git diff --diff-filter=ACM $sha1 $sha2 --name-only | xargs tar -czvf update.tar.gz
    git diff --diff-filter=ACM $sha1 $sha2 --name-only | xargs zip -r ./update.zip
    else
    echo "please select two commit"
    fi
    exit

补充: 添加–diff-filter=ACM 把变更限定为添加更改的文件, 因为删除的文件在打包时自然会找不到. 可以看 log 或者添加这个 option 事先除去.

不知道向我这样还是用 Windows 做主要开发环境, 又有上述需求的朋友是否很多, 我找了很久找不到一个完美方案, 这个方法是自我觉得比较完善的, 给有需要的朋友参考.
十多年没码字, 写这么一点就有点累了:-O