2.8 KiB
2.8 KiB
shim.c
shim.c
is a simple Windows program that, when started:
- Looks for a file with the exact same name as the running program, but with
the extension
shim
(e.g.C:\bin\foo.exe
will read the fileC:\bin\foo.shim
). - Reads and parses the files into a Scoop shim format.
- Executes the target executable with the given arguments.
shim.c
was originally made to replace Scoop's
shim.cs
since it had several important flaws:
- It was made in C#, and thus required an instantiation of a .NET command line app everytime it was started, which can make a command run much slower than if it had been ran directly;
- It did not handle Ctrl+C and other signals correctly, which could be quite infuriating (and essentially killing REPLs and long-running apps).
shim.c
is:
- Faster, because it does not use the .NET Framework, and parses the
.shim
file in a simpler way. - More efficient, because by the time the target of the shim is started, all allocated memory will have been freed.
- And more importantly, it works better:
- Signals originating from pressing
Ctrl+C
are ignored, and therefore handled directly by the spawned child. Your processes and REPLs will no longer close when pressingCtrl+C
. - Children are automatically killed when the shim process is killed. No more orphaned processes and weird behaviors.
- Signals originating from pressing
Note
: This project is not affiliated with Scoop.
Installation for Scoop
- In a Visual Studio command prompt, run
cl /O1 shim.c
. - Replace any
.exe
inscoop\shims
byshim.exe
.
An additional script, repshims.bat
, is provided. It will replace all .exe
s in the user's Scoop directory
by shim.exe
.
Example
Given the following shim gs.shim
:
path = C:\Program Files\Git\git.exe
args = status -u
In this directory, where gs.exe
is the compiled shim.c
:
C:\Bin\
gs.exe
gs.shim
Then calling gs -s
will run the program C:\Program Files\Git\git.exe status -u -s
.
Shim format
Shims follow the same format as Scoop's shims: line-separated key = value
pairs.
path = C:\Program Files\Git\git.exe
args = status -uno
path
is a required value, but args
can be omitted. Also, do note that lines must end with a line feed.
License
SPDX-License-Identifier: MIT OR Unlicense