Block concatenation with optional dedupe
The parser splits input on `# List` header lines and collects items per block. With Dedupe off, the op is a simple flatten: every item from every block, in block order, duplicates and all. With Dedupe on (default), a first-occurrence Set is used to drop repeats across the merged stream.
Order is deterministic: list 1 first, then list 2, and so on. Within each block, the original input order is preserved. When Dedupe drops a repeat, the first occurrence (from whichever block it appeared in first) is the one kept.
Case sensitive (off by default) controls the dedupe compare key and only matters when Dedupe is on. Off: `Apple`, `APPLE`, `apple` collapse to one entry. On: each case variant is kept separately.
How to use merge multiple lists into one
- 1Paste two or more lists into the input panel
- 2Separate lists with `# List 1`, `# List 2`, ... headers
- 3Leave Dedupe on (default) to collapse duplicates across blocks
- 4Toggle Case sensitive to treat case variants as distinct during dedupe
- 5Output: every list concatenated in block order
Keyboard shortcuts
Drive ListShift without touching the mouse.
What this tool actually does
Flatten N `# List N` blocks into one, optionally deduped.
Two-or-more-list input
A single block returns empty with a status-bar note. Two or more blocks merge in the order they appear.
Block-order output
List 1 items first, then list 2, and so on. Within each block, original input order is preserved - merge is a concatenate, not a sort.
Dedupe on by default (first-occurrence wins)
With Dedupe on, repeated values are dropped on second encounter; the first occurrence (wherever it was) stays. Turn off to keep every line including duplicates.
Case-insensitive dedupe by default
Only matters when Dedupe is on. Off (default): `Apple` and `apple` collapse. On: kept as two distinct entries.
Whitespace is significant
Trim is not an option. ` apple` and `apple` are distinct under the dedupe compare. Chain trim first if that matters.
Worked example
Three lists merged with Dedupe on: `Apple` in list 2 and `Banana` in list 3 drop as repeats; first occurrence in list 1 wins.
# List 1 Apple Banana # List 2 Orange Apple # List 3 Grape Banana
Apple Banana Orange Grape
Settings reference
How each option shapes the output using the sample above.
| Setting | What it does | Effect on the sample |
|---|---|---|
| Dedupe: on (default) | Drops repeats across the merged stream; first-occurrence wins | 4 items: `Apple`, `Banana`, `Orange`, `Grape` |
| Dedupe: off | Keeps every item from every block, including duplicates | 6 items: `Apple`, `Banana`, `Orange`, `Apple`, `Grape`, `Banana` |
| Case sensitive: off (default) | `Apple` = `apple` during dedupe | No effect on this sample (casing already matches) |
| Case sensitive: on | Case variants count as distinct during dedupe | Would keep `Apple` and `apple` as separate items if present |
| Single list (no `# List` header) | Returns empty output | Status bar: "Paste two or more lists separated by `# List X` headers" |