72 lines
2.8 KiB
Markdown
72 lines
2.8 KiB
Markdown
|
# `shim.c`
|
||
|
|
||
|
[`shim.c`](./shim.c) is a simple Windows program that, when started:
|
||
|
1. 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 file `C:\bin\foo.shim`).
|
||
|
2. Reads and [parses](#shim-format) the files into a
|
||
|
[Scoop](https://github.com/lukesampson/scoop) shim format.
|
||
|
3. Executes the target executable with the given arguments.
|
||
|
|
||
|
`shim.c` was originally made to replace [Scoop](https://github.com/lukesampson/scoop)'s
|
||
|
[`shim.cs`](https://github.com/lukesampson/scoop/blob/96de9c14bb483f9278e4b0a9e22b1923ee752901/supporting/shimexe/shim.cs)
|
||
|
since it had several important flaws:
|
||
|
1. [It was made in C#](https://github.com/lukesampson/scoop/tree/96de9c14bb483f9278e4b0a9e22b1923ee752901/supporting/shimexe),
|
||
|
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;
|
||
|
2. [It](https://github.com/lukesampson/scoop/issues/2339) [did](https://github.com/lukesampson/scoop/issues/1896)
|
||
|
[not](https://github.com/felixse/FluentTerminal/issues/221) handle Ctrl+C and other
|
||
|
signals correctly, which could be quite infuriating (and essentially killing REPLs and long-running apps).
|
||
|
|
||
|
[`shim.c`](./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 pressing `Ctrl+C`.
|
||
|
- Children are automatically killed when the shim process is killed. No more orphaned processes and weird behaviors.
|
||
|
|
||
|
> **Note**: This project is not affiliated with [Scoop](https://github.com/lukesampson/scoop).
|
||
|
|
||
|
|
||
|
## Installation for Scoop
|
||
|
|
||
|
- In a Visual Studio command prompt, run `cl /O1 shim.c`.
|
||
|
- Replace any `.exe` in `scoop\shims` by `shim.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`
|