SetWorkDirAt, OpenCodeAt, fix bug there, fill more doc strings

This commit is contained in:
Krzosa Karol
2026-01-02 19:57:53 +01:00
parent 215dd4a03f
commit 1767b2767e
5 changed files with 83 additions and 37 deletions

View File

@@ -2,21 +2,18 @@
! From a user (novice) point of view, how does it look like? ! From a user (novice) point of view, how does it look like?
Use session 4 Use session 4
- ":OpenAt C:/Work" - SkipLoadWord
- :OpenCodeAt C:/Work
- :SetWorkDirAt C:/Work or :Set WorkDir "." ? or :Set WorkDir "C:/text_editor"
- Delete file command - Delete file command
- :Close Fuzzy search exact match doesn't match with Close - :Close Fuzzy search exact match doesn't match with Close
- Maybe search everything window should have a special buffer - Maybe search everything window should have a special buffer
- Setting variables maybe should create and modify config, commit these changes immediately? So user can change keybindings in command window and commit immediately - Setting variables maybe should create and modify config, commit these changes immediately? So user can change keybindings in command window and commit immediately
- Make the special view hooks also available for modification and registered but maybe under different name or something
- Make a fuzzy command !> grep and fuzzy over it??? (doesn't seem very useful for grep) - Make a fuzzy command !> grep and fuzzy over it??? (doesn't seem very useful for grep)
- Make the equivalent of SearchProject but for cmds like !@git grep -n "@>" - Make the equivalent of SearchProject but for cmds like !@git grep -n "@>"
- Add Bool variable - Add Bool variable
- Initialize all keybindings at the start and refer using global variables?
- RegisterCommand should_appear_in_listing variable - RegisterCommand should_appear_in_listing variable
- RegisterCommand docs
- Maybe one list for all variables including the commands etc? - Maybe one list for all variables including the commands etc?
Use session 3: Use session 3:

View File

@@ -479,6 +479,22 @@ String16 SkipIdent(String16 *string) {
return begin; return begin;
} }
String16 SkipString(String16 *string) {
String16 saved_string = *string;
char16_t c = At(*string, 0);
String16 q = {&c, 1};
if (c == u'"' || c == u'\'') {
*string = Skip(*string, 1);
String16 quote = SkipUntil(string, q);
if (At(*string, 0) != c) {
*string = saved_string;
return {};
}
return quote;
}
return {};
}
bool MatchIdent(String16 *string, String16 expect) { bool MatchIdent(String16 *string, String16 expect) {
String16 copy = *string; String16 copy = *string;
String16 ident = SkipIdent(&copy); String16 ident = SkipIdent(&copy);

View File

@@ -463,17 +463,17 @@ void CMD_Build() {
#endif #endif
BSet main = GetBSet(BuildWindowID); BSet main = GetBSet(BuildWindowID);
main.window->visible = true; main.window->visible = true;
} RegisterCommand(CMD_Build, "f1"); } RegisterCommand(CMD_Build, "f1", "Run build.sh or build.bat in working directory, output is printed in a popup console and a special build buffer");
void CMD_GotoNextInList() { void CMD_GotoNextInList() {
BSet main = GetBSet(PrimaryWindowID); BSet main = GetBSet(PrimaryWindowID);
GotoNextInList(main.window, 1); GotoNextInList(main.window, 1);
} RegisterCommand(CMD_GotoNextInList, "ctrl-e"); } RegisterCommand(CMD_GotoNextInList, "ctrl-e", "For example: when jumping from build panel to build error, a jump point is setup, user can click this button to go over to the next compiler error");
void CMD_GotoPrevInList() { void CMD_GotoPrevInList() {
BSet main = GetBSet(PrimaryWindowID); BSet main = GetBSet(PrimaryWindowID);
GotoNextInList(main.window, -1); GotoNextInList(main.window, -1);
} RegisterCommand(CMD_GotoPrevInList, "alt-e"); } RegisterCommand(CMD_GotoPrevInList, "alt-e", "For example: when jumping from build panel to build error, a jump point is setup, user can click this button to go over to the previous compiler error");
bool IsOpenBoundary(char c) { bool IsOpenBoundary(char c) {
bool result = c == 0 || IsParen(c) || IsBrace(c) || c == ':' || c == '\t' || c == '\n' || c == '"' || c == '\''; bool result = c == 0 || IsParen(c) || IsBrace(c) || c == ':' || c == '\t' || c == '\n' || c == '"' || c == '\'';
@@ -678,7 +678,7 @@ BSet Open(String16 path, ResolveOpenMeta meta) {
void CMD_Save() { void CMD_Save() {
BSet active = GetBSet(PrimaryWindowID); BSet active = GetBSet(PrimaryWindowID);
SaveBuffer(active.buffer); SaveBuffer(active.buffer);
} RegisterCommand(CMD_Save, "ctrl-s"); } RegisterCommand(CMD_Save, "ctrl-s", "Save buffer currently open in the last primary window");
void CMD_Reopen() { void CMD_Reopen() {
BSet main = GetBSet(PrimaryWindowID); BSet main = GetBSet(PrimaryWindowID);
@@ -689,7 +689,7 @@ void CMD_Reopen() {
void CMD_New() { void CMD_New() {
BSet main = GetBSet(PrimaryWindowID); BSet main = GetBSet(PrimaryWindowID);
New(main.window, ""); New(main.window, "");
} RegisterCommand(CMD_New, "ctrl-n"); } RegisterCommand(CMD_New, "ctrl-n", "Open a new buffer with automatically generated name, use :Rename");
void CMD_ToggleFullscreen() { void CMD_ToggleFullscreen() {
if (IsInFullscreen) { if (IsInFullscreen) {
@@ -708,23 +708,51 @@ void CMD_ToggleFullscreen() {
IsInFullscreen = !IsInFullscreen; IsInFullscreen = !IsInFullscreen;
} RegisterCommand(CMD_ToggleFullscreen, "f11"); } RegisterCommand(CMD_ToggleFullscreen, "f11");
void CMD_SetWorkDir() { String16 FetchStringForCommandParsing() {
BSet set = GetBSet(ActiveWindowID);
Range range = set.view->carets[0].range;
range.max = range.min; // We only scan for :Set
if (GetSize(range) == 0) {
range = EncloseLoadWord(set.buffer, range.min);
}
Int line_end = GetLineEnd(set.buffer, range.min);
String16 string = GetString(set.buffer, {range.min, line_end});
return string;
}
void SetWorkDir(String string) {
Scratch scratch; Scratch scratch;
BSet main = GetBSet(PrimaryWindowID); WorkDir = Intern(&GlobalInternTable, string);
WorkDir = GetDir(main.buffer);
For (Buffers) { For (Buffers) {
if (it->special) { if (it->special) {
String name = SkipToLastSlash(it->name); String name = SkipToLastSlash(it->name);
it->name = Intern(&GlobalInternTable, Format(scratch, "%S/%S", WorkDir, name)); it->name = Intern(&GlobalInternTable, Format(scratch, "%S/%S", WorkDir, name));
} }
} }
} RegisterCommand(CMD_SetWorkDir, ""); }
void CMD_SetWorkDir() {
Scratch scratch;
BSet main = GetBSet(PrimaryWindowID);
SetWorkDir(GetDir(main.buffer));
} RegisterCommand(CMD_SetWorkDir, "", "Sets work directory to the directory of the current buffer, it also renames couple special buffers to make them accomodate the new WorkDir");
void CMD_SetWorkDirAt() {
String16 string = FetchStringForCommandParsing();
string = Skip(string, 1);
SkipIdent(&string);
SkipWhitespace(&string);
Scratch scratch;
String16 arg = SkipString(&string);
String arg8 = ToString(scratch, arg);
SetWorkDir(arg8);
} RegisterCommand(CMD_SetWorkDirAt, "", "Sets work directory using the argument string passed here, it also renames couple special buffers to make them accomodate the new WorkDir");
String Coro_OpenCodeDir;
void Coro_OpenCode(mco_coro *co) { void Coro_OpenCode(mco_coro *co) {
Array<String> patterns = Split(CoCurr->arena, Coro_OpenCodeDir, "|"); Array<String> patterns = Split(CoCurr->arena, NonCodePatterns_EndsWith, "|");
Array<String> dirs = {CoCurr->arena}; Array<String> dirs = {CoCurr->arena};
Add(&dirs, Coro_OpenCodeDir); String *param_dir = (String *)CoCurr->user_ctx;
Add(&dirs, *param_dir);
for (int diri = 0; diri < dirs.len; diri += 1) { for (int diri = 0; diri < dirs.len; diri += 1) {
for (FileIter it = IterateFiles(CoCurr->arena, dirs[diri]); IsValid(it); Advance(&it)) { for (FileIter it = IterateFiles(CoCurr->arena, dirs[diri]); IsValid(it); Advance(&it)) {
bool match = false; bool match = false;
@@ -749,9 +777,11 @@ void Coro_OpenCode(mco_coro *co) {
} }
void OpenCode(String dir) { void OpenCode(String dir) {
Coro_OpenCodeDir = dir;
CoRemove("Coro_OpenCode"); CoRemove("Coro_OpenCode");
CoData *data = CoAdd(Coro_OpenCode); CoData *data = CoAdd(Coro_OpenCode);
String *string_param = AllocType(data->arena, String);
*string_param = Copy(data->arena, dir);
data->user_ctx = string_param;
data->dont_wait_until_resolved = true; data->dont_wait_until_resolved = true;
CoResume(data); CoResume(data);
} }
@@ -760,6 +790,17 @@ void CMD_OpenCode() {
OpenCode(WorkDir); OpenCode(WorkDir);
} RegisterCommand(CMD_OpenCode, "", "Open all code files in current WorkDir, the code files are determined through NonCodePatterns_EndsWith config variable list"); } RegisterCommand(CMD_OpenCode, "", "Open all code files in current WorkDir, the code files are determined through NonCodePatterns_EndsWith config variable list");
void CMD_OpenCodeAt() {
String16 string = FetchStringForCommandParsing();
string = Skip(string, 1);
SkipIdent(&string);
SkipWhitespace(&string);
Scratch scratch;
String16 arg = SkipString(&string);
String arg8 = ToString(scratch, arg);
OpenCode(arg8);
} RegisterCommand(CMD_OpenCodeAt, "", "Open all code files pointed to by string argument following the command");
void CMD_KillProcess() { void CMD_KillProcess() {
BSet main = GetBSet(PrimaryWindowID); BSet main = GetBSet(PrimaryWindowID);
KillProcess(main.view); KillProcess(main.view);
@@ -1300,7 +1341,7 @@ void CMD_ClearCarets() {
it->visible = false; it->visible = false;
} }
} }
} RegisterCommand(CMD_ClearCarets, "escape"); } RegisterCommand(CMD_ClearCarets, "escape", "Clear all carets and reset to 1 caret, also do some windowing stuff that closes things on escape");
void Set(String16 string) { void Set(String16 string) {
Scratch scratch; Scratch scratch;
@@ -1432,17 +1473,9 @@ void Set(String16 string) {
} }
void CMD_Set() { void CMD_Set() {
BSet set = GetBSet(ActiveWindowID); String16 string = FetchStringForCommandParsing();
Range range = set.view->carets[0].range;
range.max = range.min; // We only scan for :Set
if (GetSize(range) == 0) {
range = EncloseLoadWord(set.buffer, range.min);
}
Int line_end = GetLineEnd(set.buffer, range.min);
String16 string = GetString(set.buffer, {range.min, line_end});
Set(string); Set(string);
} RegisterCommand(CMD_Set, ""); } RegisterCommand(CMD_Set, "", "Sets a named editor variable to the text argument following the command, the format is ':Set FormatCode 0'");
void EvalCommandsLineByLine(BSet set) { void EvalCommandsLineByLine(BSet set) {
WindowID save_last = PrimaryWindowID; WindowID save_last = PrimaryWindowID;
@@ -1475,7 +1508,7 @@ void EvalCommandsLineByLine(BSet set) {
void CMD_EvalCommandsLineByLine() { void CMD_EvalCommandsLineByLine() {
BSet set = GetBSet(PrimaryWindowID); BSet set = GetBSet(PrimaryWindowID);
EvalCommandsLineByLine(set); EvalCommandsLineByLine(set);
} RegisterCommand(CMD_EvalCommandsLineByLine, ""); } RegisterCommand(CMD_EvalCommandsLineByLine, "", "Goes line by line over a buffer and evaluates every line as a command, ignores empty or lines starting with '//'");
void GenerateConfig(View *view) { void GenerateConfig(View *view) {
For (Variables) { For (Variables) {

View File

@@ -82,4 +82,4 @@ void DebugWindowUpdate() {
void CMD_ToggleDebug() { void CMD_ToggleDebug() {
Window *window = GetWindow(DebugWindowID); Window *window = GetWindow(DebugWindowID);
window->visible = !window->visible; window->visible = !window->visible;
} RegisterCommand(CMD_ToggleDebug, "ctrl-0"); } RegisterCommand(CMD_ToggleDebug, "ctrl-0", "Open a floating window that might become useful for debugging");

View File

@@ -12,7 +12,7 @@ void CMD_Search() {
Replace(set.view, string); Replace(set.view, string);
SelectEntireBuffer(set.view); SelectEntireBuffer(set.view);
} }
} RegisterCommand(CMD_Search, "ctrl-f"); } RegisterCommand(CMD_Search, "ctrl-f", "Open up a search window");
void SearchWindowFindNext(bool forward = true) { void SearchWindowFindNext(bool forward = true) {
BSet main = GetBSet(PrimaryWindowID); BSet main = GetBSet(PrimaryWindowID);
@@ -33,11 +33,11 @@ void CMD_SearchPrevInSearch() {
void CMD_SearchNext() { void CMD_SearchNext() {
SearchWindowFindNext(true); SearchWindowFindNext(true);
} RegisterCommand(CMD_SearchNext, "f3"); } RegisterCommand(CMD_SearchNext, "f3", "Go to the next occurence of the search window needle");
void CMD_SearchPrev() { void CMD_SearchPrev() {
SearchWindowFindNext(false); SearchWindowFindNext(false);
} RegisterCommand(CMD_SearchPrev, "shift-f3"); } RegisterCommand(CMD_SearchPrev, "shift-f3", "Go to the previous occurence of the search window needle");
void CMD_SearchAll() { void CMD_SearchAll() {
BSet main = GetBSet(PrimaryWindowID); BSet main = GetBSet(PrimaryWindowID);
@@ -45,15 +45,15 @@ void CMD_SearchAll() {
String16 needle = GetString(set.buffer, GetRange(set.buffer)); String16 needle = GetString(set.buffer, GetRange(set.buffer));
SelectAllOccurences(main.view, needle); SelectAllOccurences(main.view, needle);
set.window->visible = false; set.window->visible = false;
} RegisterCommand(CMD_SearchAll, "alt-f3"); } RegisterCommand(CMD_SearchAll, "alt-f3", "Use the search window needle and seek all the possible occurences in current buffer");
void CMD_ToggleCaseSensitiveSearch() { void CMD_ToggleCaseSensitiveSearch() {
SearchCaseSensitive = !SearchCaseSensitive; SearchCaseSensitive = !SearchCaseSensitive;
} RegisterCommand(CMD_ToggleCaseSensitiveSearch, "alt-c"); } RegisterCommand(CMD_ToggleCaseSensitiveSearch, "alt-c", "Text editor wide search toggle, should apply to most search things");
void CMD_ToggleSearchWordBoundary() { void CMD_ToggleSearchWordBoundary() {
SearchWordBoundary = !SearchWordBoundary; SearchWordBoundary = !SearchWordBoundary;
} RegisterCommand(CMD_ToggleSearchWordBoundary, "alt-w"); } RegisterCommand(CMD_ToggleSearchWordBoundary, "alt-w", "Text editor wide search toggle, should apply to most search things");
void SearchWindowUpdate() { void SearchWindowUpdate() {
BSet active = GetBSet(ActiveWindowID); BSet active = GetBSet(ActiveWindowID);