@fresh-editor/fresh-editor 0.1.55 → 0.1.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +53 -4
- package/README.md +34 -17
- package/package.json +1 -1
- package/plugins/config-schema.json +31 -1
- package/plugins/live_grep.ts +1 -1
- package/plugins/merge_conflict.ts +3 -3
- package/plugins/theme_editor.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,58 @@
|
|
|
1
1
|
# Release Notes
|
|
2
2
|
|
|
3
|
+
## 0.1.57
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
* **External Paste with Prompts**: Fixed paste via terminal (Ctrl+Shift+V / bracketed paste) going to editor instead of open prompt (#406).
|
|
8
|
+
|
|
9
|
+
* **Block Selection Escape**: Fixed Escape key not canceling block selection mode (#405).
|
|
10
|
+
|
|
11
|
+
* **CRLF Line Endings**: Fixed CRLF handling to preserve original line endings. Enter inserts correct line ending, End key positions before \r\n, backspace/delete treat \r\n as single unit (#401).
|
|
12
|
+
|
|
13
|
+
* **RPM Package**: Fixed /usr/bin/fresh entry missing from RPM package manifest.
|
|
14
|
+
|
|
15
|
+
* **Settings Percentage Values**: Fixed percentage settings saving as integers instead of floats.
|
|
16
|
+
|
|
17
|
+
* **Windows Unicode**: Fixed unicode character not supported on Windows (#400).
|
|
18
|
+
|
|
19
|
+
### Packaging
|
|
20
|
+
|
|
21
|
+
* **AUR Source Package**: Fixed sha256sum not being updated when publishing.
|
|
22
|
+
|
|
23
|
+
* **Nix Flake**: Fixed missing sublime-syntax grammar files in source filter.
|
|
24
|
+
|
|
25
|
+
* **Flatpak/AppImage**: Strip binaries before bundling for smaller package sizes.
|
|
26
|
+
|
|
27
|
+
### Internal
|
|
28
|
+
|
|
29
|
+
* **Test Reliability**: Fixed flaky e2e tests on macOS by removing timing sensitivity.
|
|
30
|
+
|
|
31
|
+
* **Release Workflow**: Added package upgrade tests and nix build test.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 0.1.56
|
|
36
|
+
|
|
37
|
+
### Features
|
|
38
|
+
|
|
39
|
+
* **Per-Language Tab Settings**: Added `use_tabs` and `show_whitespace_tabs` config options per language. Go and Makefile default to tabs (#364).
|
|
40
|
+
* **AppImage Packaging**: AppImage bundles now included in GitHub releases (#365).
|
|
41
|
+
* **Terminal Color Detection**: Auto-detection of terminal color capabilities with fallback to 256 colors. Override via `FRESH_COLOR_MODE`.
|
|
42
|
+
* **TOML Syntax Highlighting**: Added embedded TextMate grammar for TOML files.
|
|
43
|
+
* **Language Detection by Filename**: Detect languages by filename (`.bashrc`, `Makefile`, `Dockerfile`, etc.) (#383).
|
|
44
|
+
* **Minimal Config Saves**: Config file only saves non-default fields.
|
|
45
|
+
* **Settings UI**: Mouse click/double-click support, hover effects, improved scrolling.
|
|
46
|
+
|
|
47
|
+
### Bug Fixes
|
|
48
|
+
|
|
49
|
+
* **LSP**: Improved error messages when server not found (#363). Fixed didOpen ordering (#399). Check diagnosticProvider capability before pull diagnostics (#399).
|
|
50
|
+
* **Terminal Mode Reset**: Fixed terminal_mode not being reset when closing a terminal buffer.
|
|
51
|
+
* **cargo-binstall**: Fixed missing binaries warning (#388).
|
|
52
|
+
* **macOS Keybinding Display**: Fixed showing ⌘ instead of Ctrl (#356).
|
|
53
|
+
* **tmux Truecolor**: Fixed detection when `COLORTERM=truecolor` is set.
|
|
54
|
+
* **RPM Upgrade**: Fixed upgrade failing when older version installed (#387).
|
|
55
|
+
|
|
3
56
|
## 0.1.54
|
|
4
57
|
|
|
5
58
|
### Features
|
|
@@ -38,10 +91,6 @@
|
|
|
38
91
|
|
|
39
92
|
* **rust-analyzer Defaults**: Added minimal performance defaults for rust-analyzer LSP.
|
|
40
93
|
|
|
41
|
-
### Packaging
|
|
42
|
-
|
|
43
|
-
* **Ubuntu 20.04**: Added CI coverage for Ubuntu 20.04 (#374).
|
|
44
|
-
|
|
45
94
|
### Internal
|
|
46
95
|
|
|
47
96
|
* **Input Handling Refactor**: New hierarchical `InputHandler` trait system for cleaner modal input routing.
|
package/README.md
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
# Fresh
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A terminal-based text editor. [Official Website →](https://sinelaw.github.io/fresh/)
|
|
4
4
|
|
|
5
5
|
**[📦 Installation Instructions](#installation)**
|
|
6
6
|
|
|
7
|
-
A terminal-based text editor.
|
|
8
|
-
|
|
9
7
|
## Why?
|
|
10
8
|
|
|
11
9
|
Why another text editor? Fresh brings the intuitive, conventional UX of editors like VS Code and Sublime Text to the terminal.
|
|
@@ -45,13 +43,20 @@ Fresh is engineered for speed. It delivers a low-latency experience, with text a
|
|
|
45
43
|
|
|
46
44
|
## Installation
|
|
47
45
|
|
|
46
|
+
Quick install (autodetect best method):
|
|
47
|
+
|
|
48
|
+
`curl https://raw.githubusercontent.com/sinelaw/fresh/refs/heads/master/scripts/install.sh | sh`
|
|
49
|
+
|
|
50
|
+
Or, pick your preferred method:
|
|
51
|
+
|
|
48
52
|
| Platform | Method |
|
|
49
53
|
|----------|--------|
|
|
50
|
-
| macOS | [
|
|
54
|
+
| macOS | [brew](#brew) |
|
|
55
|
+
| Bazzite/Bluefin/Aurora Linux | [brew](#brew) |
|
|
51
56
|
| Arch Linux | [AUR](#arch-linux-aur) |
|
|
52
57
|
| Debian/Ubuntu | [.deb](#debianubuntu-deb) |
|
|
53
58
|
| Fedora/RHEL | [.rpm](#fedorarhelopensuse-rpm) |
|
|
54
|
-
| Linux (any distro) | [Flatpak](#flatpak) |
|
|
59
|
+
| Linux (any distro) | [AppImage](#appimage), [Flatpak](#flatpak) |
|
|
55
60
|
| All platforms | [Pre-built binaries](#pre-built-binaries) |
|
|
56
61
|
| npm | [npm / npx](#npm) |
|
|
57
62
|
| Rust users (Fast) | [cargo-binstall](#using-cargo-binstall) |
|
|
@@ -59,7 +64,9 @@ Fresh is engineered for speed. It delivers a low-latency experience, with text a
|
|
|
59
64
|
| Nix | [Nix flakes](#nix-flakes) |
|
|
60
65
|
| Developers | [From source](#from-source) |
|
|
61
66
|
|
|
62
|
-
###
|
|
67
|
+
### Brew
|
|
68
|
+
|
|
69
|
+
On macOS and some linux distros (Bazzite/Bluefin/Aurora):
|
|
63
70
|
|
|
64
71
|
```bash
|
|
65
72
|
brew tap sinelaw/fresh
|
|
@@ -109,11 +116,31 @@ Or download the `.deb` file manually from the [releases page](https://github.com
|
|
|
109
116
|
Download and install the latest release:
|
|
110
117
|
|
|
111
118
|
```bash
|
|
112
|
-
curl -sL $(curl -s https://api.github.com/repos/sinelaw/fresh/releases/latest | grep "browser_download_url.*\.$(uname -m)\.rpm" | cut -d '"' -f 4) -o fresh-editor.rpm && sudo rpm -
|
|
119
|
+
curl -sL $(curl -s https://api.github.com/repos/sinelaw/fresh/releases/latest | grep "browser_download_url.*\.$(uname -m)\.rpm" | cut -d '"' -f 4) -o fresh-editor.rpm && sudo rpm -U fresh-editor.rpm
|
|
113
120
|
```
|
|
114
121
|
|
|
115
122
|
Or download the `.rpm` file manually from the [releases page](https://github.com/sinelaw/fresh/releases).
|
|
116
123
|
|
|
124
|
+
### AppImage
|
|
125
|
+
|
|
126
|
+
Download the `.AppImage` file from the [releases page](https://github.com/sinelaw/fresh/releases) and run:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
chmod +x fresh-editor-VERSION-x86_64.AppImage
|
|
130
|
+
./fresh-editor-VERSION-x86_64.AppImage
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**For faster startup** (recommended): Extract the AppImage instead of running it directly. This avoids the FUSE mount overhead on each launch (~10x faster):
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
./fresh-editor-VERSION-x86_64.AppImage --appimage-extract
|
|
137
|
+
mkdir -p ~/.local/share/fresh-editor ~/.local/bin
|
|
138
|
+
mv squashfs-root/* ~/.local/share/fresh-editor/
|
|
139
|
+
ln -sf ~/.local/share/fresh-editor/usr/bin/fresh ~/.local/bin/fresh
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Ensure `~/.local/bin` is in your PATH. Available for x86_64 and aarch64 architectures.
|
|
143
|
+
|
|
117
144
|
### Flatpak
|
|
118
145
|
|
|
119
146
|
Download the `.flatpak` bundle from the [releases page](https://github.com/sinelaw/fresh/releases) and install:
|
|
@@ -183,16 +210,6 @@ cd fresh
|
|
|
183
210
|
cargo build --release
|
|
184
211
|
./target/release/fresh [file]
|
|
185
212
|
```
|
|
186
|
-
#### For immutable distros (Bazzite, ublue, aurora, etc.)
|
|
187
|
-
Install Rust via HomeBrew first
|
|
188
|
-
```bash
|
|
189
|
-
brew install rust
|
|
190
|
-
```
|
|
191
|
-
Follow the `From source` instructions above, then copy the binary your home local bin folder.
|
|
192
|
-
```bash
|
|
193
|
-
cp ./target/release/fresh ~/.local/bin
|
|
194
|
-
fresh
|
|
195
|
-
```
|
|
196
213
|
|
|
197
214
|
## Documentation
|
|
198
215
|
|
package/package.json
CHANGED
|
@@ -1049,7 +1049,15 @@
|
|
|
1049
1049
|
"type": "object",
|
|
1050
1050
|
"properties": {
|
|
1051
1051
|
"extensions": {
|
|
1052
|
-
"description": "File extensions for this language",
|
|
1052
|
+
"description": "File extensions for this language (e.g., [\"rs\"] for Rust)",
|
|
1053
|
+
"type": "array",
|
|
1054
|
+
"items": {
|
|
1055
|
+
"type": "string"
|
|
1056
|
+
},
|
|
1057
|
+
"default": []
|
|
1058
|
+
},
|
|
1059
|
+
"filenames": {
|
|
1060
|
+
"description": "Exact filenames for this language (e.g., [\"Makefile\", \"GNUmakefile\"])",
|
|
1053
1061
|
"type": "array",
|
|
1054
1062
|
"items": {
|
|
1055
1063
|
"type": "string"
|
|
@@ -1086,6 +1094,16 @@
|
|
|
1086
1094
|
"null"
|
|
1087
1095
|
],
|
|
1088
1096
|
"default": null
|
|
1097
|
+
},
|
|
1098
|
+
"show_whitespace_tabs": {
|
|
1099
|
+
"description": "Whether to show whitespace tab indicators (→) for this language\nDefaults to true. Set to false for languages like Go that use tabs for indentation.",
|
|
1100
|
+
"type": "boolean",
|
|
1101
|
+
"default": true
|
|
1102
|
+
},
|
|
1103
|
+
"use_tabs": {
|
|
1104
|
+
"description": "Whether pressing Tab should insert a tab character instead of spaces.\nDefaults to false (insert spaces based on tab_size).\nSet to true for languages like Go and Makefile that require tabs.",
|
|
1105
|
+
"type": "boolean",
|
|
1106
|
+
"default": false
|
|
1089
1107
|
}
|
|
1090
1108
|
}
|
|
1091
1109
|
},
|
|
@@ -1288,6 +1306,18 @@
|
|
|
1288
1306
|
"label",
|
|
1289
1307
|
"items"
|
|
1290
1308
|
]
|
|
1309
|
+
},
|
|
1310
|
+
{
|
|
1311
|
+
"description": "A disabled info label (no action)",
|
|
1312
|
+
"type": "object",
|
|
1313
|
+
"properties": {
|
|
1314
|
+
"info": {
|
|
1315
|
+
"type": "string"
|
|
1316
|
+
}
|
|
1317
|
+
},
|
|
1318
|
+
"required": [
|
|
1319
|
+
"info"
|
|
1320
|
+
]
|
|
1291
1321
|
}
|
|
1292
1322
|
]
|
|
1293
1323
|
}
|
package/plugins/live_grep.ts
CHANGED
|
@@ -108,7 +108,7 @@ async function updatePreview(match: GrepMatch): Promise<void> {
|
|
|
108
108
|
const lineNum = i + 1;
|
|
109
109
|
const lineContent = lines[i] || "";
|
|
110
110
|
const isMatchLine = lineNum === match.line;
|
|
111
|
-
const prefix = isMatchLine ? "
|
|
111
|
+
const prefix = isMatchLine ? "> " : " ";
|
|
112
112
|
const lineNumStr = String(lineNum).padStart(4, " ");
|
|
113
113
|
|
|
114
114
|
entries.push({
|
|
@@ -630,7 +630,7 @@ function buildOursEntries(): TextPropertyEntry[] {
|
|
|
630
630
|
// Show each conflict's OURS side
|
|
631
631
|
for (const conflict of mergeState.conflicts) {
|
|
632
632
|
const isSelected = conflict.index === mergeState.selectedIndex;
|
|
633
|
-
const marker = isSelected ? "
|
|
633
|
+
const marker = isSelected ? "> " : " ";
|
|
634
634
|
const status = conflict.resolved ? "[RESOLVED]" : "[PENDING]";
|
|
635
635
|
|
|
636
636
|
entries.push({
|
|
@@ -688,7 +688,7 @@ function buildTheirsEntries(): TextPropertyEntry[] {
|
|
|
688
688
|
// Show each conflict's THEIRS side
|
|
689
689
|
for (const conflict of mergeState.conflicts) {
|
|
690
690
|
const isSelected = conflict.index === mergeState.selectedIndex;
|
|
691
|
-
const marker = isSelected ? "
|
|
691
|
+
const marker = isSelected ? "> " : " ";
|
|
692
692
|
const status = conflict.resolved ? "[RESOLVED]" : "[PENDING]";
|
|
693
693
|
|
|
694
694
|
entries.push({
|
|
@@ -762,7 +762,7 @@ function buildResultEntries(): TextPropertyEntry[] {
|
|
|
762
762
|
// Show resolved content or action buttons for each conflict
|
|
763
763
|
for (const conflict of mergeState.conflicts) {
|
|
764
764
|
const isSelected = conflict.index === mergeState.selectedIndex;
|
|
765
|
-
const marker = isSelected ? "
|
|
765
|
+
const marker = isSelected ? "> " : " ";
|
|
766
766
|
|
|
767
767
|
entries.push({
|
|
768
768
|
text: `${marker}Conflict ${conflict.index + 1}:\n`,
|
package/plugins/theme_editor.ts
CHANGED
|
@@ -574,7 +574,7 @@ function buildDisplayEntries(): TextPropertyEntry[] {
|
|
|
574
574
|
|
|
575
575
|
if (field.isSection) {
|
|
576
576
|
// Section header
|
|
577
|
-
const icon = field.expanded ? "▼" : "
|
|
577
|
+
const icon = field.expanded ? "▼" : ">";
|
|
578
578
|
entries.push({
|
|
579
579
|
text: `${indent}${icon} ${field.def.displayName}\n`,
|
|
580
580
|
properties: {
|