@fredlackey/devutils 0.0.1 → 0.0.3

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.
Files changed (259) hide show
  1. package/README.md +5 -5
  2. package/package.json +1 -1
  3. package/src/commands/install.js +374 -36
  4. package/src/installs/adobe-creative-cloud.js +527 -25
  5. package/src/installs/adobe-creative-cloud.md +605 -0
  6. package/src/installs/appcleaner.js +303 -26
  7. package/src/installs/appcleaner.md +699 -0
  8. package/src/installs/apt-transport-https.js +390 -0
  9. package/src/installs/apt-transport-https.md +678 -0
  10. package/src/installs/atomicparsley.js +624 -26
  11. package/src/installs/atomicparsley.md +795 -0
  12. package/src/installs/aws-cli.js +779 -26
  13. package/src/installs/aws-cli.md +727 -0
  14. package/src/installs/balena-etcher.js +688 -26
  15. package/src/installs/balena-etcher.md +761 -0
  16. package/src/installs/bambu-studio.js +912 -26
  17. package/src/installs/bambu-studio.md +780 -0
  18. package/src/installs/bash-completion.js +554 -23
  19. package/src/installs/bash-completion.md +833 -0
  20. package/src/installs/bash.js +399 -26
  21. package/src/installs/bash.md +993 -0
  22. package/src/installs/beyond-compare.js +585 -26
  23. package/src/installs/beyond-compare.md +813 -0
  24. package/src/installs/build-essential.js +511 -26
  25. package/src/installs/build-essential.md +977 -0
  26. package/src/installs/ca-certificates.js +618 -0
  27. package/src/installs/ca-certificates.md +937 -0
  28. package/src/installs/caffeine.js +490 -26
  29. package/src/installs/caffeine.md +839 -0
  30. package/src/installs/camtasia.js +577 -25
  31. package/src/installs/camtasia.md +762 -0
  32. package/src/installs/chatgpt.js +458 -26
  33. package/src/installs/chatgpt.md +814 -0
  34. package/src/installs/chocolatey.js +447 -0
  35. package/src/installs/chocolatey.md +661 -0
  36. package/src/installs/chrome-canary.js +472 -26
  37. package/src/installs/chrome-canary.md +641 -0
  38. package/src/installs/chromium.js +645 -26
  39. package/src/installs/chromium.md +838 -0
  40. package/src/installs/claude-code.js +558 -26
  41. package/src/installs/claude-code.md +1173 -0
  42. package/src/installs/curl.js +361 -26
  43. package/src/installs/curl.md +714 -0
  44. package/src/installs/cursor.js +561 -26
  45. package/src/installs/cursor.md +970 -0
  46. package/src/installs/dbschema.js +674 -26
  47. package/src/installs/dbschema.md +925 -0
  48. package/src/installs/dependencies.md +435 -0
  49. package/src/installs/development-tools.js +600 -0
  50. package/src/installs/development-tools.md +977 -0
  51. package/src/installs/docker.js +1010 -25
  52. package/src/installs/docker.md +1109 -0
  53. package/src/installs/drawio.js +1001 -26
  54. package/src/installs/drawio.md +795 -0
  55. package/src/installs/elmedia-player.js +328 -25
  56. package/src/installs/elmedia-player.md +556 -0
  57. package/src/installs/ffmpeg.js +870 -25
  58. package/src/installs/ffmpeg.md +852 -0
  59. package/src/installs/file.js +464 -0
  60. package/src/installs/file.md +987 -0
  61. package/src/installs/gemini-cli.js +793 -26
  62. package/src/installs/gemini-cli.md +1153 -0
  63. package/src/installs/git.js +382 -26
  64. package/src/installs/git.md +907 -0
  65. package/src/installs/gitego.js +931 -26
  66. package/src/installs/gitego.md +1172 -0
  67. package/src/installs/go.js +913 -26
  68. package/src/installs/go.md +958 -0
  69. package/src/installs/google-chrome.js +801 -25
  70. package/src/installs/google-chrome.md +862 -0
  71. package/src/installs/gpg.js +412 -73
  72. package/src/installs/gpg.md +1056 -0
  73. package/src/installs/homebrew.js +1015 -26
  74. package/src/installs/homebrew.md +988 -0
  75. package/src/installs/imageoptim.js +950 -26
  76. package/src/installs/imageoptim.md +1119 -0
  77. package/src/installs/installers.json +2297 -0
  78. package/src/installs/jq.js +382 -26
  79. package/src/installs/jq.md +809 -0
  80. package/src/installs/keyboard-maestro.js +701 -26
  81. package/src/installs/keyboard-maestro.md +825 -0
  82. package/src/installs/latex.js +771 -26
  83. package/src/installs/latex.md +1095 -0
  84. package/src/installs/lftp.js +338 -26
  85. package/src/installs/lftp.md +907 -0
  86. package/src/installs/lsb-release.js +346 -0
  87. package/src/installs/lsb-release.md +814 -0
  88. package/src/installs/messenger.js +829 -26
  89. package/src/installs/messenger.md +900 -0
  90. package/src/installs/microsoft-office.js +550 -26
  91. package/src/installs/microsoft-office.md +760 -0
  92. package/src/installs/microsoft-teams.js +782 -25
  93. package/src/installs/microsoft-teams.md +886 -0
  94. package/src/installs/node.js +886 -26
  95. package/src/installs/node.md +1153 -0
  96. package/src/installs/nordpass.js +698 -26
  97. package/src/installs/nordpass.md +921 -0
  98. package/src/installs/nvm.js +977 -26
  99. package/src/installs/nvm.md +1057 -0
  100. package/src/installs/openssh.js +734 -64
  101. package/src/installs/openssh.md +1056 -0
  102. package/src/installs/pandoc.js +644 -26
  103. package/src/installs/pandoc.md +1036 -0
  104. package/src/installs/pinentry.js +492 -26
  105. package/src/installs/pinentry.md +1142 -0
  106. package/src/installs/pngyu.js +851 -26
  107. package/src/installs/pngyu.md +896 -0
  108. package/src/installs/postman.js +781 -26
  109. package/src/installs/postman.md +940 -0
  110. package/src/installs/procps.js +425 -0
  111. package/src/installs/procps.md +851 -0
  112. package/src/installs/safari-tech-preview.js +355 -25
  113. package/src/installs/safari-tech-preview.md +533 -0
  114. package/src/installs/sfnt2woff.js +640 -26
  115. package/src/installs/sfnt2woff.md +795 -0
  116. package/src/installs/shellcheck.js +463 -26
  117. package/src/installs/shellcheck.md +1005 -0
  118. package/src/installs/slack.js +722 -25
  119. package/src/installs/slack.md +865 -0
  120. package/src/installs/snagit.js +566 -25
  121. package/src/installs/snagit.md +844 -0
  122. package/src/installs/software-properties-common.js +372 -0
  123. package/src/installs/software-properties-common.md +805 -0
  124. package/src/installs/spotify.js +858 -25
  125. package/src/installs/spotify.md +901 -0
  126. package/src/installs/studio-3t.js +803 -26
  127. package/src/installs/studio-3t.md +918 -0
  128. package/src/installs/sublime-text.js +780 -25
  129. package/src/installs/sublime-text.md +914 -0
  130. package/src/installs/superwhisper.js +687 -25
  131. package/src/installs/superwhisper.md +630 -0
  132. package/src/installs/tailscale.js +727 -26
  133. package/src/installs/tailscale.md +1100 -0
  134. package/src/installs/tar.js +389 -0
  135. package/src/installs/tar.md +946 -0
  136. package/src/installs/termius.js +780 -26
  137. package/src/installs/termius.md +844 -0
  138. package/src/installs/terraform.js +761 -26
  139. package/src/installs/terraform.md +899 -0
  140. package/src/installs/tidal.js +752 -25
  141. package/src/installs/tidal.md +864 -0
  142. package/src/installs/tmux.js +328 -26
  143. package/src/installs/tmux.md +1030 -0
  144. package/src/installs/tree.js +393 -26
  145. package/src/installs/tree.md +833 -0
  146. package/src/installs/unzip.js +460 -0
  147. package/src/installs/unzip.md +879 -0
  148. package/src/installs/vim.js +403 -26
  149. package/src/installs/vim.md +1040 -0
  150. package/src/installs/vlc.js +803 -26
  151. package/src/installs/vlc.md +927 -0
  152. package/src/installs/vscode.js +825 -26
  153. package/src/installs/vscode.md +1002 -0
  154. package/src/installs/wget.js +415 -0
  155. package/src/installs/wget.md +791 -0
  156. package/src/installs/whatsapp.js +710 -25
  157. package/src/installs/whatsapp.md +854 -0
  158. package/src/installs/winpty.js +352 -0
  159. package/src/installs/winpty.md +620 -0
  160. package/src/installs/woff2.js +535 -26
  161. package/src/installs/woff2.md +977 -0
  162. package/src/installs/wsl.js +572 -0
  163. package/src/installs/wsl.md +699 -0
  164. package/src/installs/xcode-clt.js +520 -0
  165. package/src/installs/xcode-clt.md +351 -0
  166. package/src/installs/xcode.js +542 -26
  167. package/src/installs/xcode.md +573 -0
  168. package/src/installs/yarn.js +806 -26
  169. package/src/installs/yarn.md +1074 -0
  170. package/src/installs/yq.js +636 -26
  171. package/src/installs/yq.md +944 -0
  172. package/src/installs/yt-dlp.js +683 -26
  173. package/src/installs/yt-dlp.md +946 -0
  174. package/src/installs/yum-utils.js +297 -0
  175. package/src/installs/yum-utils.md +648 -0
  176. package/src/installs/zoom.js +740 -25
  177. package/src/installs/zoom.md +884 -0
  178. package/src/scripts/README.md +567 -45
  179. package/src/scripts/STATUS.md +208 -0
  180. package/src/scripts/afk.js +395 -7
  181. package/src/scripts/backup-all.js +731 -9
  182. package/src/scripts/backup-source.js +711 -8
  183. package/src/scripts/brewd.js +373 -7
  184. package/src/scripts/brewi.js +505 -9
  185. package/src/scripts/brewr.js +512 -9
  186. package/src/scripts/brews.js +462 -9
  187. package/src/scripts/brewu.js +488 -7
  188. package/src/scripts/c.js +185 -7
  189. package/src/scripts/ccurl.js +325 -8
  190. package/src/scripts/certbot-crontab-init.js +488 -8
  191. package/src/scripts/certbot-init.js +641 -9
  192. package/src/scripts/ch.js +339 -7
  193. package/src/scripts/claude-danger.js +253 -8
  194. package/src/scripts/clean-dev.js +419 -8
  195. package/src/scripts/clear-dns-cache.js +525 -7
  196. package/src/scripts/clone.js +417 -7
  197. package/src/scripts/code-all.js +420 -7
  198. package/src/scripts/count-files.js +195 -8
  199. package/src/scripts/count-folders.js +195 -8
  200. package/src/scripts/count.js +248 -8
  201. package/src/scripts/d.js +203 -7
  202. package/src/scripts/datauri.js +373 -8
  203. package/src/scripts/delete-files.js +363 -7
  204. package/src/scripts/docker-clean.js +410 -8
  205. package/src/scripts/dp.js +426 -7
  206. package/src/scripts/e.js +375 -9
  207. package/src/scripts/empty-trash.js +497 -7
  208. package/src/scripts/evm.js +428 -9
  209. package/src/scripts/fetch-github-repos.js +441 -10
  210. package/src/scripts/get-channel.js +329 -8
  211. package/src/scripts/get-course.js +384 -11
  212. package/src/scripts/get-dependencies.js +290 -9
  213. package/src/scripts/get-folder.js +783 -10
  214. package/src/scripts/get-tunes.js +411 -10
  215. package/src/scripts/get-video.js +352 -9
  216. package/src/scripts/git-backup.js +561 -9
  217. package/src/scripts/git-clone.js +477 -9
  218. package/src/scripts/git-pup.js +303 -7
  219. package/src/scripts/git-push.js +380 -8
  220. package/src/scripts/h.js +607 -9
  221. package/src/scripts/hide-desktop-icons.js +483 -7
  222. package/src/scripts/hide-hidden-files.js +522 -7
  223. package/src/scripts/install-dependencies-from.js +440 -9
  224. package/src/scripts/ips.js +647 -10
  225. package/src/scripts/iso.js +354 -8
  226. package/src/scripts/killni.js +561 -7
  227. package/src/scripts/ll.js +451 -8
  228. package/src/scripts/local-ip.js +310 -8
  229. package/src/scripts/m.js +508 -8
  230. package/src/scripts/map.js +293 -8
  231. package/src/scripts/mkd.js +287 -7
  232. package/src/scripts/ncu-update-all.js +441 -8
  233. package/src/scripts/nginx-init.js +702 -12
  234. package/src/scripts/npmi.js +366 -7
  235. package/src/scripts/o.js +495 -8
  236. package/src/scripts/org-by-date.js +321 -7
  237. package/src/scripts/p.js +208 -7
  238. package/src/scripts/packages.js +313 -8
  239. package/src/scripts/path.js +209 -7
  240. package/src/scripts/ports.js +582 -8
  241. package/src/scripts/q.js +290 -8
  242. package/src/scripts/refresh-files.js +378 -10
  243. package/src/scripts/remove-smaller-files.js +500 -8
  244. package/src/scripts/rename-files-with-date.js +517 -9
  245. package/src/scripts/resize-image.js +523 -9
  246. package/src/scripts/rm-safe.js +653 -8
  247. package/src/scripts/s.js +525 -9
  248. package/src/scripts/set-git-public.js +349 -7
  249. package/src/scripts/show-desktop-icons.js +459 -7
  250. package/src/scripts/show-hidden-files.js +456 -7
  251. package/src/scripts/tpa.js +265 -8
  252. package/src/scripts/tpo.js +264 -7
  253. package/src/scripts/u.js +489 -7
  254. package/src/scripts/vpush.js +422 -8
  255. package/src/scripts/y.js +267 -7
  256. package/src/utils/common/os.js +94 -2
  257. package/src/utils/ubuntu/apt.js +13 -7
  258. package/src/utils/windows/choco.js +82 -26
  259. package/src/utils/windows/winget.js +89 -27
package/src/scripts/e.js CHANGED
@@ -1,24 +1,390 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * @fileoverview Open a file in vim editor.
4
+ * e - Open files in vim editor
5
+ *
6
+ * Migrated from legacy dotfiles alias.
7
+ * Original: alias e="vim --"
8
+ *
9
+ * This script opens the specified file(s) in the vim editor. The "--" ensures
10
+ * that any arguments starting with "-" are treated as file names rather than
11
+ * vim options. This is a common developer shortcut for quickly editing files.
12
+ *
5
13
  * @module scripts/e
6
14
  */
7
15
 
16
+ const os = require('../utils/common/os');
17
+ const { execSync, spawnSync } = require('child_process');
18
+
19
+ /**
20
+ * Helper function to check if a command exists on the system.
21
+ * Used to detect which editor is available.
22
+ *
23
+ * @param {string} cmd - The command name to check
24
+ * @returns {boolean} True if the command exists, false otherwise
25
+ */
26
+ function isCommandAvailable(cmd) {
27
+ try {
28
+ // Use 'which' on Unix-like systems, 'where' on Windows
29
+ const checkCmd = process.platform === 'win32' ? `where ${cmd}` : `which ${cmd}`;
30
+ execSync(checkCmd, { stdio: 'ignore' });
31
+ return true;
32
+ } catch {
33
+ return false;
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Pure Node.js implementation - NOT APPLICABLE for this script.
39
+ *
40
+ * Launching an interactive terminal editor like vim requires OS-level terminal
41
+ * control and cannot be done in pure Node.js. Each platform must spawn the
42
+ * editor process with proper terminal inheritance.
43
+ *
44
+ * @param {string[]} args - Command line arguments (file paths to open)
45
+ * @returns {Promise<void>}
46
+ * @throws {Error} Always throws - this function should not be called directly
47
+ */
48
+ async function do_e_nodejs(args) {
49
+ // Launching an interactive editor requires terminal integration that cannot
50
+ // be implemented in pure Node.js. Each platform function spawns the editor
51
+ // with inherited stdio to maintain proper terminal control.
52
+ throw new Error(
53
+ 'do_e_nodejs should not be called directly. ' +
54
+ 'Launching an interactive editor requires OS-specific terminal handling.'
55
+ );
56
+ }
57
+
58
+ /**
59
+ * Open files in vim on macOS.
60
+ *
61
+ * macOS comes with vim pre-installed. This function spawns vim with the
62
+ * provided file arguments, using "--" to prevent arguments starting with
63
+ * "-" from being interpreted as vim options.
64
+ *
65
+ * @param {string[]} args - Command line arguments (file paths to open)
66
+ * @returns {Promise<void>}
67
+ */
68
+ async function do_e_macos(args) {
69
+ // Check if vim is available (it should be on macOS, but be safe)
70
+ if (!isCommandAvailable('vim')) {
71
+ console.error('Error: vim is not installed.');
72
+ console.error('vim should be pre-installed on macOS. If missing, install via:');
73
+ console.error(' brew install vim');
74
+ process.exit(1);
75
+ }
76
+
77
+ // Spawn vim with inherited stdio so the terminal stays interactive
78
+ // The "--" separates vim options from file arguments, ensuring files
79
+ // that start with "-" are not treated as options
80
+ const result = spawnSync('vim', ['--', ...args], {
81
+ stdio: 'inherit',
82
+ shell: false
83
+ });
84
+
85
+ if (result.error) {
86
+ console.error('Error: Failed to launch vim.');
87
+ console.error(result.error.message);
88
+ process.exit(1);
89
+ }
90
+
91
+ // Exit with vim's exit code
92
+ process.exit(result.status || 0);
93
+ }
94
+
95
+ /**
96
+ * Open files in vim on Ubuntu.
97
+ *
98
+ * Ubuntu typically has vim or vim-tiny installed. If vim is not available,
99
+ * the function tries vi as a fallback and provides installation instructions.
100
+ *
101
+ * @param {string[]} args - Command line arguments (file paths to open)
102
+ * @returns {Promise<void>}
103
+ */
104
+ async function do_e_ubuntu(args) {
105
+ // Try vim first, then fall back to vi
106
+ let editor = null;
107
+ if (isCommandAvailable('vim')) {
108
+ editor = 'vim';
109
+ } else if (isCommandAvailable('vi')) {
110
+ editor = 'vi';
111
+ }
112
+
113
+ if (!editor) {
114
+ console.error('Error: vim is not installed.');
115
+ console.error('Install vim with:');
116
+ console.error(' sudo apt update && sudo apt install vim');
117
+ process.exit(1);
118
+ }
119
+
120
+ // Spawn the editor with inherited stdio for interactive terminal control
121
+ const result = spawnSync(editor, ['--', ...args], {
122
+ stdio: 'inherit',
123
+ shell: false
124
+ });
125
+
126
+ if (result.error) {
127
+ console.error(`Error: Failed to launch ${editor}.`);
128
+ console.error(result.error.message);
129
+ process.exit(1);
130
+ }
131
+
132
+ process.exit(result.status || 0);
133
+ }
134
+
135
+ /**
136
+ * Open files in vim on Raspberry Pi OS.
137
+ *
138
+ * Raspberry Pi OS (Raspbian) is Debian-based and typically has vim-tiny
139
+ * pre-installed. Falls back to vi if vim is not available.
140
+ *
141
+ * @param {string[]} args - Command line arguments (file paths to open)
142
+ * @returns {Promise<void>}
143
+ */
144
+ async function do_e_raspbian(args) {
145
+ // Try vim first, then fall back to vi
146
+ let editor = null;
147
+ if (isCommandAvailable('vim')) {
148
+ editor = 'vim';
149
+ } else if (isCommandAvailable('vi')) {
150
+ editor = 'vi';
151
+ }
152
+
153
+ if (!editor) {
154
+ console.error('Error: vim is not installed.');
155
+ console.error('Install vim with:');
156
+ console.error(' sudo apt update && sudo apt install vim');
157
+ process.exit(1);
158
+ }
159
+
160
+ const result = spawnSync(editor, ['--', ...args], {
161
+ stdio: 'inherit',
162
+ shell: false
163
+ });
164
+
165
+ if (result.error) {
166
+ console.error(`Error: Failed to launch ${editor}.`);
167
+ console.error(result.error.message);
168
+ process.exit(1);
169
+ }
170
+
171
+ process.exit(result.status || 0);
172
+ }
173
+
174
+ /**
175
+ * Open files in vim on Amazon Linux.
176
+ *
177
+ * Amazon Linux typically has vim-minimal installed. Falls back to vi
178
+ * if the full vim is not available.
179
+ *
180
+ * @param {string[]} args - Command line arguments (file paths to open)
181
+ * @returns {Promise<void>}
182
+ */
183
+ async function do_e_amazon_linux(args) {
184
+ // Try vim first, then fall back to vi
185
+ let editor = null;
186
+ if (isCommandAvailable('vim')) {
187
+ editor = 'vim';
188
+ } else if (isCommandAvailable('vi')) {
189
+ editor = 'vi';
190
+ }
191
+
192
+ if (!editor) {
193
+ console.error('Error: vim is not installed.');
194
+ console.error('Install vim with:');
195
+ console.error(' sudo dnf install vim-enhanced');
196
+ console.error(' or');
197
+ console.error(' sudo yum install vim-enhanced');
198
+ process.exit(1);
199
+ }
200
+
201
+ const result = spawnSync(editor, ['--', ...args], {
202
+ stdio: 'inherit',
203
+ shell: false
204
+ });
205
+
206
+ if (result.error) {
207
+ console.error(`Error: Failed to launch ${editor}.`);
208
+ console.error(result.error.message);
209
+ process.exit(1);
210
+ }
211
+
212
+ process.exit(result.status || 0);
213
+ }
214
+
215
+ /**
216
+ * Open files in vim on Windows Command Prompt.
217
+ *
218
+ * vim is not installed by default on Windows. This function checks for
219
+ * common locations where vim might be installed (Git Bash, Chocolatey,
220
+ * or standalone installation) and provides installation guidance.
221
+ *
222
+ * @param {string[]} args - Command line arguments (file paths to open)
223
+ * @returns {Promise<void>}
224
+ */
225
+ async function do_e_cmd(args) {
226
+ // Check if vim is available
227
+ if (!isCommandAvailable('vim')) {
228
+ console.error('Error: vim is not installed or not in PATH.');
229
+ console.error('');
230
+ console.error('Install vim on Windows using one of these methods:');
231
+ console.error(' choco install vim # Using Chocolatey');
232
+ console.error(' winget install vim.vim # Using winget');
233
+ console.error(' scoop install vim # Using Scoop');
234
+ console.error('');
235
+ console.error('Or download from: https://www.vim.org/download.php');
236
+ process.exit(1);
237
+ }
238
+
239
+ // Spawn vim with inherited stdio
240
+ const result = spawnSync('vim', ['--', ...args], {
241
+ stdio: 'inherit',
242
+ shell: true // Use shell on Windows for proper PATH resolution
243
+ });
244
+
245
+ if (result.error) {
246
+ console.error('Error: Failed to launch vim.');
247
+ console.error(result.error.message);
248
+ process.exit(1);
249
+ }
250
+
251
+ process.exit(result.status || 0);
252
+ }
253
+
8
254
  /**
9
- * Opens the specified file(s) in the vim editor.
10
- * Passes all arguments directly to vim.
255
+ * Open files in vim on Windows PowerShell.
256
+ *
257
+ * Same as CMD - vim is not installed by default. Provides installation
258
+ * instructions for Windows package managers.
11
259
  *
12
- * @param {string[]} args - Command line arguments
13
- * @param {string} args.0 - File path to open in vim
260
+ * @param {string[]} args - Command line arguments (file paths to open)
14
261
  * @returns {Promise<void>}
15
262
  */
16
- async function main(args) {
17
- // TODO: Implement vim launcher
263
+ async function do_e_powershell(args) {
264
+ // Check if vim is available
265
+ if (!isCommandAvailable('vim')) {
266
+ console.error('Error: vim is not installed or not in PATH.');
267
+ console.error('');
268
+ console.error('Install vim on Windows using one of these methods:');
269
+ console.error(' choco install vim # Using Chocolatey');
270
+ console.error(' winget install vim.vim # Using winget');
271
+ console.error(' scoop install vim # Using Scoop');
272
+ console.error('');
273
+ console.error('Or download from: https://www.vim.org/download.php');
274
+ process.exit(1);
275
+ }
276
+
277
+ const result = spawnSync('vim', ['--', ...args], {
278
+ stdio: 'inherit',
279
+ shell: true
280
+ });
281
+
282
+ if (result.error) {
283
+ console.error('Error: Failed to launch vim.');
284
+ console.error(result.error.message);
285
+ process.exit(1);
286
+ }
287
+
288
+ process.exit(result.status || 0);
289
+ }
290
+
291
+ /**
292
+ * Open files in vim on Git Bash.
293
+ *
294
+ * Git Bash on Windows comes with vim included as part of the Git for Windows
295
+ * installation. This is the most reliable way to use vim on Windows.
296
+ *
297
+ * @param {string[]} args - Command line arguments (file paths to open)
298
+ * @returns {Promise<void>}
299
+ */
300
+ async function do_e_gitbash(args) {
301
+ // Git Bash typically includes vim
302
+ if (!isCommandAvailable('vim')) {
303
+ console.error('Error: vim is not found.');
304
+ console.error('Git Bash usually includes vim. If missing, try:');
305
+ console.error(' - Reinstalling Git for Windows with vim option enabled');
306
+ console.error(' - Installing vim separately: choco install vim');
307
+ process.exit(1);
308
+ }
309
+
310
+ const result = spawnSync('vim', ['--', ...args], {
311
+ stdio: 'inherit',
312
+ shell: false
313
+ });
314
+
315
+ if (result.error) {
316
+ console.error('Error: Failed to launch vim.');
317
+ console.error(result.error.message);
318
+ process.exit(1);
319
+ }
320
+
321
+ process.exit(result.status || 0);
322
+ }
323
+
324
+ /**
325
+ * Main entry point - detects environment and executes appropriate implementation.
326
+ *
327
+ * The "e" command opens files in the vim editor. This is a common developer
328
+ * shortcut that provides quick access to vim without typing the full command.
329
+ * The "--" separator ensures that file names starting with "-" are handled
330
+ * correctly and not interpreted as vim options.
331
+ *
332
+ * Usage:
333
+ * e file.txt # Open file.txt in vim
334
+ * e file1.js file2.js # Open multiple files
335
+ * e -strange-name.txt # Open file with "-" prefix (handled correctly)
336
+ *
337
+ * @param {string[]} args - Command line arguments (file paths to open)
338
+ * @returns {Promise<void>}
339
+ */
340
+ async function do_e(args) {
341
+ const platform = os.detect();
342
+
343
+ const handlers = {
344
+ 'macos': do_e_macos,
345
+ 'ubuntu': do_e_ubuntu,
346
+ 'debian': do_e_ubuntu,
347
+ 'raspbian': do_e_raspbian,
348
+ 'amazon_linux': do_e_amazon_linux,
349
+ 'rhel': do_e_amazon_linux,
350
+ 'fedora': do_e_ubuntu,
351
+ 'linux': do_e_ubuntu,
352
+ 'wsl': do_e_ubuntu,
353
+ 'cmd': do_e_cmd,
354
+ 'windows': do_e_cmd,
355
+ 'powershell': do_e_powershell,
356
+ 'gitbash': do_e_gitbash
357
+ };
358
+
359
+ const handler = handlers[platform.type];
360
+ if (!handler) {
361
+ console.error(`Platform '${platform.type}' is not supported for this command.`);
362
+ console.error('');
363
+ console.error('Supported platforms:');
364
+ console.error(' - macOS');
365
+ console.error(' - Ubuntu, Debian, and other Linux distributions');
366
+ console.error(' - Raspberry Pi OS');
367
+ console.error(' - Amazon Linux, RHEL, Fedora');
368
+ console.error(' - Windows (CMD, PowerShell, Git Bash)');
369
+ process.exit(1);
370
+ }
371
+
372
+ await handler(args);
18
373
  }
19
374
 
20
- module.exports = { main };
375
+ module.exports = {
376
+ main: do_e,
377
+ do_e,
378
+ do_e_nodejs,
379
+ do_e_macos,
380
+ do_e_ubuntu,
381
+ do_e_raspbian,
382
+ do_e_amazon_linux,
383
+ do_e_cmd,
384
+ do_e_powershell,
385
+ do_e_gitbash
386
+ };
21
387
 
22
388
  if (require.main === module) {
23
- main(process.argv.slice(2));
389
+ do_e(process.argv.slice(2));
24
390
  }