@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 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
- [Visit the official Fresh website](https://sinelaw.github.io/fresh/)
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 | [Homebrew](#macos-homebrew) |
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
- ### macOS (Homebrew)
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 -i fresh-editor.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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fresh-editor/fresh-editor",
3
- "version": "0.1.55",
3
+ "version": "0.1.57",
4
4
  "description": "A modern terminal-based text editor with plugin support",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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
  }
@@ -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`,
@@ -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: {