186 lines
3.8 KiB
Markdown
186 lines
3.8 KiB
Markdown
# csharpierd
|
|
|
|
A persistent CSharpier formatting daemon with automatic server management and idle timeout.
|
|
|
|
## Features
|
|
|
|
- Starts CSharpier server in background on first use
|
|
- Reuses existing server for subsequent formatting requests
|
|
- Automatically shuts down after 1 hour of inactivity
|
|
- Thread-safe with file locking mechanism
|
|
- Auto-recovery if server crashes
|
|
|
|
## Requirements
|
|
|
|
- [Bun](https://bun.sh) runtime (>= 1.0.0)
|
|
- [CSharpier](https://csharpier.com/) installed globally or locally
|
|
|
|
## Installation
|
|
|
|
### Global Installation
|
|
|
|
```bash
|
|
# Bun
|
|
bun install -g csharpierd
|
|
|
|
# npm
|
|
npm install -g csharpierd
|
|
|
|
# Yarn
|
|
yarn global add csharpierd
|
|
|
|
# pnpm
|
|
pnpm install -g csharpierd
|
|
```
|
|
|
|
### Local Development
|
|
|
|
```bash
|
|
bun install
|
|
```
|
|
|
|
## Usage
|
|
|
|
### Command Line Options
|
|
|
|
```bash
|
|
csharpierd <filename> < input.cs # Format C# code from stdin
|
|
csharpierd --status # Show server status
|
|
csharpierd --stop # Stop the background server
|
|
csharpierd --help # Show help message
|
|
```
|
|
|
|
### As Global Command
|
|
|
|
After global installation:
|
|
|
|
```bash
|
|
# Format a C# file
|
|
csharpierd Program.cs < Program.cs
|
|
|
|
# Or using cat
|
|
cat MyFile.cs | csharpierd MyFile.cs
|
|
|
|
# Output formatted code to a new file
|
|
csharpierd MyFile.cs < MyFile.cs > MyFile.formatted.cs
|
|
|
|
# Check server status
|
|
csharpierd --status
|
|
|
|
# Stop the background server
|
|
csharpierd --stop
|
|
|
|
# Show help
|
|
csharpierd --help
|
|
```
|
|
|
|
### Local Development
|
|
|
|
```bash
|
|
# Format a file
|
|
bun index.ts Program.cs < Program.cs
|
|
|
|
# Check server status
|
|
bun index.ts --status
|
|
|
|
# Stop the server
|
|
bun index.ts --stop
|
|
|
|
# Show help
|
|
bun index.ts --help
|
|
```
|
|
|
|
### Server Management
|
|
|
|
#### Check Server Status
|
|
|
|
The `--status` flag shows detailed information about the server including:
|
|
|
|
- Running state (RUNNING, STARTING, STOPPED, or NOT RUNNING)
|
|
- Process ID and port
|
|
- Last access time
|
|
- Idle time with color-coded warnings (green < 75% timeout, yellow >= 75%, red >= 100%)
|
|
- Configuration details
|
|
|
|
```bash
|
|
csharpierd --status
|
|
```
|
|
|
|
#### Stopping the Server
|
|
|
|
The server will automatically shut down after 1 hour of inactivity, but you can manually stop it:
|
|
|
|
```bash
|
|
csharpierd --stop
|
|
```
|
|
|
|
## Building
|
|
|
|
You can compile the TypeScript code to a standalone binary:
|
|
|
|
```bash
|
|
bun run build
|
|
```
|
|
|
|
This creates a `csharpierd` binary in the current directory that can be distributed without requiring Bun to be installed. The binary is self-contained and includes all dependencies.
|
|
|
|
```bash
|
|
# Run the compiled binary
|
|
./csharpierd Program.cs < Program.cs
|
|
```
|
|
|
|
## Editor Integration
|
|
|
|
### Neovim with conform.nvim
|
|
|
|
[conform.nvim](https://github.com/stevearc/conform.nvim) is a popular formatter plugin for Neovim. Here's how to configure it to use `csharpierd`:
|
|
|
|
#### Basic Configuration
|
|
|
|
```lua
|
|
require("conform").setup({
|
|
formatters_by_ft = {
|
|
cs = { "csharpierd" },
|
|
},
|
|
formatters = {
|
|
csharpierd = {
|
|
command = "csharpierd",
|
|
args = { "$RELATIVE_FILEPATH" },
|
|
stdin = true,
|
|
},
|
|
},
|
|
})
|
|
```
|
|
|
|
### Benefits of using csharpierd with conform.nvim
|
|
|
|
- **Fast formatting**: Reuses the CSharpier server process, avoiding startup overhead
|
|
- **Automatic server management**: Server starts on first use and stops after 1 hour of inactivity
|
|
|
|
## How It Works
|
|
|
|
1. **First Call**: Starts `dotnet csharpier server --server-port 78912` in the background
|
|
2. **Subsequent Calls**: Reuses the existing server process
|
|
3. **Idle Timeout**: Server automatically shuts down after 1 hour of inactivity
|
|
4. **State Management**: Server state (PID, port, last access time) stored in `/tmp/csharpierd-state.json`
|
|
5. **Concurrency**: Lock file prevents race conditions when multiple instances run simultaneously
|
|
|
|
## Server Details
|
|
|
|
- **Port**: 78912 (hardcoded)
|
|
- **State File**: `/tmp/csharpierd-state.json`
|
|
- **Lock File**: `/tmp/csharpierd.lock`
|
|
- **Idle Timeout**: 1 hour (3600000ms)
|
|
|
|
## Publishing
|
|
|
|
To publish this package to npm:
|
|
|
|
```bash
|
|
bun publish
|
|
```
|
|
|
|
## License
|
|
|
|
MIT
|