Compare commits
7 Commits
beaf072740
...
59081eb4bd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
59081eb4bd | ||
|
|
a40797abb2 | ||
|
|
6c0a4d0633 | ||
|
|
edafe05b5b | ||
|
|
b40873d54c | ||
|
|
0921054b6e | ||
|
|
f8f9e33032 |
@@ -21,9 +21,5 @@ set flags=/EHsc- /MD /Zi /FC /nologo /WX /W3 /wd4200 /wd4334 /diagnostics:column
|
||||
set libs=%sdllib%/SDL3-static.lib %sdllib%/SDL_uclibc.lib kernel32.lib gdi32.lib user32.lib Imm32.lib ole32.lib Shell32.lib OleAut32.lib Cfgmgr32.lib Setupapi.lib Advapi32.lib version.lib winmm.lib
|
||||
cl %flags% ../src/text_editor/text_editor.cpp -Fe:te.exe -I%sdl%/include -I../src/external/glad -I../src/ %libs% -link /SUBSYSTEM:WINDOWS /NODEFAULTLIB:LIBCMT /NODEFAULTLIB:MSVCRTD
|
||||
|
||||
copy te.exe ..\data\te.exe
|
||||
copy te.pdb ..\data\te.pdb
|
||||
echo written ..\data\te.exe
|
||||
|
||||
popd
|
||||
rem /fsanitize=address
|
||||
|
||||
1
build.sh
1
build.sh
@@ -9,6 +9,5 @@ FLAGS="-Wall -Wno-missing-braces -Wno-writable-strings -nostdlib++ -fsanitize=ad
|
||||
|
||||
I="-I../src/external/SDL/include -I../src/external/lua/src -I../src/external/glad"
|
||||
clang -o te $FLAGS ../src/text_editor/text_editor.cpp $I -lSDL3 -lm -lbacktrace
|
||||
cp te ../data/te
|
||||
|
||||
# -v -Wl,--verbose
|
||||
@@ -1,42 +0,0 @@
|
||||
<!doctype html>
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/>
|
||||
<title>Emscripten-Generated Code</title>
|
||||
<style>
|
||||
body { margin: 0; background-color: black }
|
||||
.game {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
margin: 0px;
|
||||
border: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
display: block;
|
||||
image-rendering: optimizeSpeed;
|
||||
image-rendering: -moz-crisp-edges;
|
||||
image-rendering: -o-crisp-edges;
|
||||
image-rendering: -webkit-optimize-contrast;
|
||||
image-rendering: optimize-contrast;
|
||||
image-rendering: crisp-edges;
|
||||
image-rendering: pixelated;
|
||||
-ms-interpolation-mode: nearest-neighbor;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<canvas class="game" id="canvas" oncontextmenu="event.preventDefault()"></canvas>
|
||||
<script type='text/javascript'>
|
||||
var Module = {
|
||||
preRun: [],
|
||||
print: (...args) => console.log('[stdout]: ' + args.join(' ')),
|
||||
printErr: (...args) => console.log('[stderr]: ' + args.join(' ')),
|
||||
};
|
||||
window.onerror = (event) => console.log('[onerror]: ' + event.message);
|
||||
</script>
|
||||
{{{ SCRIPT }}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,10 +1,14 @@
|
||||
! What precise workflow do I need for me to be viable to use this?
|
||||
! From a user (novice) point of view, how does it look like?
|
||||
|
||||
- Make all the keybinding / hook parsing initialize at the start to reduce runtime problems
|
||||
- RegisterCommand should_appear_in_listing variable
|
||||
- Maybe one list for all variables including the commands etc?
|
||||
- make variables nicer named
|
||||
- Problem generating configs don't know which quotation marks would be good ....
|
||||
|
||||
Use session 3:
|
||||
- Maybe status view, commit changes (like to buffer name or line) on enter?
|
||||
- Search over buffer directory, close search, quick enter buffer? Not sure if line, more general purpose
|
||||
|
||||
How to go about search/replace, opening code and other considerations
|
||||
- We can use sed + find to search and replace, the automatic reopen should do the job
|
||||
@@ -16,7 +20,6 @@ How to go about search/replace, opening code and other considerations
|
||||
Use session 2
|
||||
- Need configs I can't change browser or vcvarsall currently, maybe syntax like :Set InternetBrowser "firefox"
|
||||
- Tutorial
|
||||
- When jumping should center the view!!!
|
||||
|
||||
Debug session:
|
||||
- Report errorf - use coroutine dialogs
|
||||
@@ -48,9 +51,6 @@ Commands TODO:
|
||||
- Special: non editable, hotkeys don't work etc.
|
||||
|
||||
backlog
|
||||
FEATURE Search whole words, case sensitive etc.
|
||||
FEATURE Select all searched occurences
|
||||
FEATURE commands for scrolling: center, cursor_at_bottom_of_screen, cursor_at_top
|
||||
FEATURE Some decl/function indexing in fuzzy format
|
||||
ISSUE? Fix jump scroll, the query ends up the last line on screen, kind of wacky
|
||||
FEATURE dump text editor state to file, restore state
|
||||
|
||||
@@ -378,7 +378,7 @@ API bool Chop(String *string, String ending) {
|
||||
return false;
|
||||
}
|
||||
|
||||
API String SkipNumberEx(String *string) {
|
||||
API String SkipIntEx(String *string) {
|
||||
String col = {string->data, 0};
|
||||
for (int64_t i = 0; i < string->len; i += 1) {
|
||||
if (IsDigit(string->data[i])) {
|
||||
@@ -391,8 +391,8 @@ API String SkipNumberEx(String *string) {
|
||||
return col;
|
||||
}
|
||||
|
||||
API Int SkipNumber(String *string) {
|
||||
String col = SkipNumberEx(string);
|
||||
API Int SkipInt(String *string) {
|
||||
String col = SkipIntEx(string);
|
||||
if (col.len == 0) return -1;
|
||||
Int result = strtoll(col.data, NULL, 10);
|
||||
return result;
|
||||
|
||||
@@ -38,6 +38,11 @@ API bool IsDigit(char16_t a) {
|
||||
return result;
|
||||
}
|
||||
|
||||
API bool IsHexDigit(char16_t a) {
|
||||
bool result = a >= u'0' && a <= u'9' || a == 'a' || a == 'b' || a == 'c' || a == 'd' || a == 'e' || a == 'f';
|
||||
return result;
|
||||
}
|
||||
|
||||
API bool IsAlphanumeric(char16_t a) {
|
||||
bool result = IsDigit(a) || IsAlphabetic(a);
|
||||
return result;
|
||||
@@ -384,8 +389,12 @@ API Int GetSize(Array<String16> array) {
|
||||
return result;
|
||||
}
|
||||
|
||||
API String16 SkipNumberEx(String16 *string) {
|
||||
API String16 SkipIntEx(String16 *string) {
|
||||
String16 col = {string->data, 0};
|
||||
if (At(*string, 0) == '-') {
|
||||
col.len += 1;
|
||||
*string = Skip(*string, 1);
|
||||
}
|
||||
for (int64_t i = 0; i < string->len; i += 1) {
|
||||
if (IsDigit(string->data[i])) {
|
||||
col.len += 1;
|
||||
@@ -397,15 +406,41 @@ API String16 SkipNumberEx(String16 *string) {
|
||||
return col;
|
||||
}
|
||||
|
||||
API Int SkipNumber(String16 *string) {
|
||||
String16 col = SkipNumberEx(string);
|
||||
if (col.len == 0) return -1;
|
||||
API Int SkipInt(String16 *string) {
|
||||
String16 col = SkipIntEx(string);
|
||||
if (col.len == 0) return 0;
|
||||
Scratch scratch;
|
||||
String num_string = ToString(scratch, col);
|
||||
Int result = strtoll(num_string.data, NULL, 10);
|
||||
return result;
|
||||
}
|
||||
|
||||
API String16 SkipFloatEx(String16 *string) {
|
||||
String16 col = {string->data, 0};
|
||||
if (At(*string, 0) == '-') {
|
||||
col.len += 1;
|
||||
*string = Skip(*string, 1);
|
||||
}
|
||||
for (int64_t i = 0; i < string->len; i += 1) {
|
||||
if (IsDigit(string->data[i]) || string->data[i] == u'.') {
|
||||
col.len += 1;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
*string = Skip(*string, col.len);
|
||||
return col;
|
||||
}
|
||||
|
||||
API Float SkipFloat(String16 *string) {
|
||||
String16 col = SkipFloatEx(string);
|
||||
if (col.len == 0) return 0;
|
||||
Scratch scratch;
|
||||
String num_string = ToString(scratch, col);
|
||||
Float result = strtod(num_string.data, NULL);
|
||||
return result;
|
||||
}
|
||||
|
||||
API String16 SkipUntil(String16 *string, String16 str) {
|
||||
String16 begin = *string;
|
||||
begin.len = 0;
|
||||
@@ -419,14 +454,41 @@ API String16 SkipUntil(String16 *string, String16 str) {
|
||||
|
||||
API String16 SkipWhitespace(String16 *string) {
|
||||
String16 begin = {string->data, 0};
|
||||
for (Int i = 0; i < string->len; i += 1) {
|
||||
if (!IsWhitespace(string->data[i])) break;
|
||||
for (;string->len;) {
|
||||
if (!IsWhitespace(At(*string, 0))) {
|
||||
break;
|
||||
}
|
||||
*string = Skip(*string, 1);
|
||||
begin.len += 1;
|
||||
}
|
||||
return begin;
|
||||
}
|
||||
|
||||
String16 SkipIdent(String16 *string) {
|
||||
String16 begin = {string->data, 0};
|
||||
if (IsIdent(At(*string, 0))) {
|
||||
for (;string->len;) {
|
||||
char16_t c = At(*string, 0);
|
||||
if (!IsIdent(c) && !IsDigit(c)) {
|
||||
break;
|
||||
}
|
||||
*string = Skip(*string, 1);
|
||||
begin.len += 1;
|
||||
}
|
||||
}
|
||||
return begin;
|
||||
}
|
||||
|
||||
bool MatchIdent(String16 *string, String16 expect) {
|
||||
String16 copy = *string;
|
||||
String16 ident = SkipIdent(©);
|
||||
if (ident == expect) {
|
||||
*string = copy;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
API bool Chop(String16 *string, String16 ending) {
|
||||
if (EndsWith(*string, ending)) {
|
||||
*string = Chop(*string, ending.len);
|
||||
|
||||
@@ -81,8 +81,8 @@ API String16 CutPrefix(String16 *string, int64_t len);
|
||||
API String16 CutPostfix(String16 *string, int64_t len);
|
||||
|
||||
// @todo: think about this API, for parsing, maybe redesign or something
|
||||
API String16 SkipNumberEx(String16 *string);
|
||||
API Int SkipNumber(String16 *string);
|
||||
API String16 SkipIntEx(String16 *string);
|
||||
API Int SkipInt(String16 *string);
|
||||
API String16 SkipUntil(String16 *string, String16 str);
|
||||
API String16 SkipWhitespace(String16 *string);
|
||||
API String16 ChopNumberEx(String16 *string);
|
||||
|
||||
@@ -150,7 +150,7 @@ void Test(mco_coro *co) {
|
||||
}
|
||||
|
||||
void InitTests() {
|
||||
ConfigWaitForEvents = false;
|
||||
WaitForEvents = false;
|
||||
TestDir = Format(TestArena, "%S/test_env", GetExeDir(TestArena));
|
||||
CoData *data = CoAdd(Test);
|
||||
data->dont_wait_until_resolved = true;
|
||||
|
||||
@@ -895,7 +895,7 @@ API void RedoEdit(Buffer *buffer, Array<Caret> *carets) {
|
||||
|
||||
if (buffer->redo_stack.len > 0) {
|
||||
HistoryEntry *next = GetLast(buffer->redo_stack);
|
||||
if (next->time - entry.time <= ConfigUndoMergeTimeWindow) {
|
||||
if (next->time - entry.time <= UndoMergeTime) {
|
||||
RedoEdit(buffer, carets);
|
||||
}
|
||||
}
|
||||
@@ -921,7 +921,7 @@ API void UndoEdit(Buffer *buffer, Array<Caret> *carets) {
|
||||
|
||||
if (buffer->undo_stack.len > 0) {
|
||||
HistoryEntry *next = GetLast(buffer->undo_stack);
|
||||
if (entry.time - next->time <= ConfigUndoMergeTimeWindow) {
|
||||
if (entry.time - next->time <= UndoMergeTime) {
|
||||
UndoEdit(buffer, carets);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,8 @@ String GetDir(Buffer *buffer) {
|
||||
if (buffer->is_dir) {
|
||||
return buffer->name;
|
||||
} else {
|
||||
return ChopLastSlash(buffer->name);
|
||||
String result = ChopLastSlash(buffer->name);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,7 +167,7 @@ void UIMessagef(const char *fmt, ...) {
|
||||
NextActiveWindowID = main.window->id;
|
||||
RawAppendf(main.buffer, "\n %S\n :Close\n", string);
|
||||
main.view->carets[0] = FindNext(main.buffer, u":Close", MakeCaret(0));
|
||||
AddHook(&main.view->hooks, "Close", "escape", [](){
|
||||
AddHook(&main.view->hooks, "Close", "escape | enter", [](){
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
Close(active.buffer->id);
|
||||
});
|
||||
@@ -178,7 +179,6 @@ void ReportErrorf(const char *fmt, ...) {
|
||||
View *view = GetView(NullViewID);
|
||||
if (view) {
|
||||
Appendf(view, "%S\n", string);
|
||||
NextActiveWindowID = NullWindowID;
|
||||
}
|
||||
UIMessagef("%S", string);
|
||||
}
|
||||
@@ -203,6 +203,19 @@ void ReportDebugf(const char *fmt, ...) {
|
||||
RawAppendf(TraceBuffer, "%S\n", string);
|
||||
}
|
||||
|
||||
void CMD_CenterView() {
|
||||
BSet set = GetBSet(LastActiveLayoutWindowID);
|
||||
Caret c = set.view->carets[0];
|
||||
Int front = GetFront(c);
|
||||
XY xy = PosToXY(set.buffer, front);
|
||||
Vec2I size = GetSize(set.window->document_rect);
|
||||
Int y = size.y / 2 / set.window->font->line_spacing;
|
||||
set.view->scroll.x = 0;
|
||||
if (xy.line > y) {
|
||||
set.view->scroll.y = (xy.line) * set.window->font->line_spacing - (size.y / 2);
|
||||
}
|
||||
} RegisterCommand(CMD_CenterView, "");
|
||||
|
||||
void MoveCursorByPageSize(Window *window, int direction, bool shift = false) {
|
||||
Assert(direction == DIR_UP || direction == DIR_DOWN);
|
||||
BSet set = GetBSet(window);
|
||||
@@ -408,17 +421,17 @@ BSet ExecBuild(String cmd) {
|
||||
return build;
|
||||
}
|
||||
|
||||
void Command_SaveAll() {
|
||||
void CMD_SaveAll() {
|
||||
For(Buffers) {
|
||||
// NOTE: file_mod_time is only set when buffer got read or written to disk already so should be saved
|
||||
if (it->file_mod_time) {
|
||||
SaveBuffer(it);
|
||||
}
|
||||
}
|
||||
} RegisterCommand(Command_SaveAll, "ctrl-shift-s");
|
||||
} RegisterCommand(CMD_SaveAll, "ctrl-shift-s");
|
||||
|
||||
void Command_Build() {
|
||||
Command_SaveAll();
|
||||
void CMD_Build() {
|
||||
CMD_SaveAll();
|
||||
#if OS_WINDOWS
|
||||
ExecBuild("build.bat");
|
||||
#else
|
||||
@@ -426,24 +439,24 @@ void Command_Build() {
|
||||
#endif
|
||||
BSet main = GetBSet(BuildWindowID);
|
||||
main.window->visible = true;
|
||||
} RegisterCommand(Command_Build, "f1");
|
||||
} RegisterCommand(CMD_Build, "f1");
|
||||
|
||||
void Command_GotoNextInList() {
|
||||
void CMD_GotoNextInList() {
|
||||
BSet main = GetBSet(LastActiveLayoutWindowID);
|
||||
GotoNextInList(main.window, 1);
|
||||
} RegisterCommand(Command_GotoNextInList, "ctrl-e");
|
||||
} RegisterCommand(CMD_GotoNextInList, "ctrl-e");
|
||||
|
||||
void Command_GotoPrevInList() {
|
||||
void CMD_GotoPrevInList() {
|
||||
BSet main = GetBSet(LastActiveLayoutWindowID);
|
||||
GotoNextInList(main.window, -1);
|
||||
} RegisterCommand(Command_GotoPrevInList, "alt-e");
|
||||
} RegisterCommand(CMD_GotoPrevInList, "alt-e");
|
||||
|
||||
bool IsOpenBoundary(char c) {
|
||||
bool result = c == 0 || IsParen(c) || IsBrace(c) || c == ':' || c == '\t' || c == '\n' || c == '"' || c == '\'';
|
||||
return result;
|
||||
}
|
||||
|
||||
ResolvedOpen ResolveOpen(Allocator scratch, String path, String meta) {
|
||||
ResolvedOpen ResolveOpen(Allocator alo, String path, String meta) {
|
||||
ResolvedOpen result = {};
|
||||
path = Trim(path);
|
||||
|
||||
@@ -473,7 +486,7 @@ ResolvedOpen ResolveOpen(Allocator scratch, String path, String meta) {
|
||||
// Web
|
||||
{
|
||||
if (StartsWith(path, "https://") || StartsWith(path, "http://")) {
|
||||
result.path = Format(scratch, "%S %S", ConfigInternetBrowser, path);
|
||||
result.path = Format(alo, "%S %S", InternetBrowser, path);
|
||||
result.kind = OpenKind_BackgroundExec;
|
||||
return result;
|
||||
}
|
||||
@@ -483,14 +496,17 @@ ResolvedOpen ResolveOpen(Allocator scratch, String path, String meta) {
|
||||
{
|
||||
if (StartsWith(path, "commit ")) {
|
||||
path = Skip(path, 7);
|
||||
result.path = Format(scratch, "git --no-pager show %S", path);
|
||||
result.path = Format(alo, "git --no-pager show %S", path);
|
||||
result.kind = OpenKind_Exec;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
String p = NormalizePath(scratch, path);
|
||||
String p = NormalizePath(alo, path);
|
||||
if (p.len == 2 && IsAlphabetic(ToLowerCase(At(p, 0))) && At(p, 1) == ':') {
|
||||
p = Format(alo, "%S/", p);
|
||||
}
|
||||
String pstart = p;
|
||||
|
||||
bool is_absolute = false;
|
||||
@@ -509,18 +525,18 @@ ResolvedOpen ResolveOpen(Allocator scratch, String path, String meta) {
|
||||
|
||||
if (At(p, 0) == ':') {
|
||||
p = Skip(p, 1);
|
||||
result.line = SkipNumber(&p);
|
||||
result.line = SkipInt(&p);
|
||||
if (At(p, 0) == ':') {
|
||||
p = Skip(p, 1);
|
||||
Int b = SkipNumber(&p);
|
||||
Int b = SkipInt(&p);
|
||||
result.col = b;
|
||||
}
|
||||
} else if (At(p, 0) == '(') {
|
||||
p = Skip(p, 1);
|
||||
result.line = SkipNumber(&p);
|
||||
result.line = SkipInt(&p);
|
||||
if (At(p, 0) == ',') {
|
||||
p = Skip(p, 1);
|
||||
Int b = SkipNumber(&p);
|
||||
Int b = SkipInt(&p);
|
||||
result.col = b;
|
||||
}
|
||||
}
|
||||
@@ -538,7 +554,7 @@ ResolvedOpen ResolveOpen(Allocator scratch, String path, String meta) {
|
||||
result.kind = OpenKind_Goto;
|
||||
return result;
|
||||
} else {
|
||||
String workspace_path = Format(scratch, "%S/%S", WorkDir, path);
|
||||
String workspace_path = Format(alo, "%S/%S", WorkDir, path);
|
||||
bool existing_buffer = GetBuffer(workspace_path, NULL);
|
||||
if (existing_buffer || FileExists(workspace_path)) {
|
||||
result.existing_buffer = existing_buffer;
|
||||
@@ -547,7 +563,7 @@ ResolvedOpen ResolveOpen(Allocator scratch, String path, String meta) {
|
||||
return result;
|
||||
}
|
||||
|
||||
String rel_path = Format(scratch, "%S/%S", GetMainDir(), path);
|
||||
String rel_path = Format(alo, "%S/%S", GetMainDir(), path);
|
||||
existing_buffer = GetBuffer(rel_path, NULL);
|
||||
if (existing_buffer || FileExists(rel_path)) {
|
||||
result.existing_buffer = existing_buffer;
|
||||
@@ -578,12 +594,14 @@ BSet Open(Window *window, String path, String meta, bool set_active = true) {
|
||||
}
|
||||
if (IsDir(o.path)) {
|
||||
View *view = WindowOpenBufferView(set.window, o.path);
|
||||
SetFuzzy(view);
|
||||
Buffer *buffer = GetBuffer(view->active_buffer);
|
||||
ResetBuffer(buffer);
|
||||
RawAppendf(buffer, "..\n");
|
||||
RawAppendf(buffer, "\n..\n");
|
||||
for (FileIter it = IterateFiles(scratch, o.path); IsValid(it); Advance(&it)) {
|
||||
RawAppendf(buffer, "%S\n", it.filename);
|
||||
}
|
||||
SelectRange(view, GetBufferBeginAsRange(buffer));
|
||||
} else {
|
||||
View *view = WindowOpenBufferView(set.window, o.path);
|
||||
Buffer *buffer = GetBuffer(view->active_buffer);
|
||||
@@ -593,7 +611,7 @@ BSet Open(Window *window, String path, String meta, bool set_active = true) {
|
||||
view->carets[0] = MakeCaret(pos);
|
||||
}
|
||||
}
|
||||
UpdateScroll(set.window, true);
|
||||
CMD_CenterView();
|
||||
} else if (o.kind == OpenKind_Exec) {
|
||||
if (set_active) {
|
||||
NextActiveWindowID = set.window->id;
|
||||
@@ -626,23 +644,23 @@ BSet Open(String16 path, String meta) {
|
||||
return Open(string, meta);
|
||||
}
|
||||
|
||||
void Command_Save() {
|
||||
void CMD_Save() {
|
||||
BSet active = GetBSet(LastActiveLayoutWindowID);
|
||||
SaveBuffer(active.buffer);
|
||||
} RegisterCommand(Command_Save, "ctrl-s");
|
||||
} RegisterCommand(CMD_Save, "ctrl-s");
|
||||
|
||||
void Command_Reopen() {
|
||||
void CMD_Reopen() {
|
||||
BSet main = GetBSet(LastActiveLayoutWindowID);
|
||||
ReopenBuffer(main.buffer);
|
||||
NextActiveWindowID = main.window->id;
|
||||
} RegisterCommand(Command_Reopen, "");
|
||||
} RegisterCommand(CMD_Reopen, "");
|
||||
|
||||
void Command_New() {
|
||||
void CMD_New() {
|
||||
BSet main = GetBSet(LastActiveLayoutWindowID);
|
||||
New(main.window, "");
|
||||
} RegisterCommand(Command_New, "ctrl-n");
|
||||
} RegisterCommand(CMD_New, "ctrl-n");
|
||||
|
||||
void Command_ToggleFullscreen() {
|
||||
void CMD_ToggleFullscreen() {
|
||||
if (IsInFullscreen) {
|
||||
SDL_SetWindowSize(SDLWindow, FullScreenSizeX, FullScreenSizeY);
|
||||
SDL_SetWindowPosition(SDLWindow, FullScreenPositionX, FullScreenPositionY);
|
||||
@@ -657,12 +675,12 @@ void Command_ToggleFullscreen() {
|
||||
}
|
||||
|
||||
IsInFullscreen = !IsInFullscreen;
|
||||
} RegisterCommand(Command_ToggleFullscreen, "f11");
|
||||
} RegisterCommand(CMD_ToggleFullscreen, "f11");
|
||||
|
||||
void Command_SetWorkDir() {
|
||||
void CMD_SetWorkDir() {
|
||||
BSet main = GetBSet(LastActiveLayoutWindowID);
|
||||
WorkDir = GetDir(main.buffer);
|
||||
} RegisterCommand(Command_SetWorkDir, "");
|
||||
} RegisterCommand(CMD_SetWorkDir, "");
|
||||
|
||||
String CodeSkipPatterns[] = {".git/", ".obj", ".o", ".pdb", ".exe"};
|
||||
String Coro_OpenCodeDir;
|
||||
@@ -700,18 +718,18 @@ void OpenCode(String dir) {
|
||||
data->dont_wait_until_resolved = true;
|
||||
}
|
||||
|
||||
void Command_OpenCode() {
|
||||
void CMD_OpenCode() {
|
||||
OpenCode(WorkDir);
|
||||
} RegisterCommand(Command_OpenCode, "");
|
||||
} RegisterCommand(CMD_OpenCode, "");
|
||||
|
||||
void Command_KillProcess() {
|
||||
void CMD_KillProcess() {
|
||||
BSet main = GetBSet(LastActiveLayoutWindowID);
|
||||
KillProcess(main.view);
|
||||
} RegisterCommand(Command_KillProcess, "");
|
||||
} RegisterCommand(CMD_KillProcess, "");
|
||||
|
||||
void Command_CloseWindow() {
|
||||
void CMD_CloseWindow() {
|
||||
Close(LastActiveLayoutWindowID);
|
||||
} RegisterCommand(Command_CloseWindow, "");
|
||||
} RegisterCommand(CMD_CloseWindow, "");
|
||||
|
||||
void AddHook(Array<CommandData> *arr, String name, String binding, Function *function) {
|
||||
CommandData n = {name, binding, function, ParseKeyCached(binding)};
|
||||
@@ -756,9 +774,9 @@ void Coro_Rename(mco_coro *co) {
|
||||
buffer->name = Intern(&GlobalInternTable, string);
|
||||
}
|
||||
}
|
||||
void Command_Rename() {
|
||||
void CMD_Rename() {
|
||||
CoAdd(Coro_Rename);
|
||||
} RegisterCommand(Command_Rename, "");
|
||||
} RegisterCommand(CMD_Rename, "");
|
||||
|
||||
String Coro_YesNoCancel(mco_coro *co, BSet main, String question) {
|
||||
JumpTempBuffer(&main);
|
||||
@@ -830,9 +848,9 @@ void Coro_Close(mco_coro *co) {
|
||||
} ElseInvalidCodepath();
|
||||
}
|
||||
|
||||
void Command_Close() {
|
||||
void CMD_Close() {
|
||||
CoAdd(Coro_Close);
|
||||
} RegisterCommand(Command_Close, "ctrl-w");
|
||||
} RegisterCommand(CMD_Close, "ctrl-w");
|
||||
|
||||
// Considerations with coroutines:
|
||||
// 1. Does scratch memory leak across Yield boundary? Or interacts badly with Yield stuff in any way?
|
||||
@@ -875,322 +893,322 @@ void Coro_Quit(mco_coro *co) {
|
||||
}
|
||||
}
|
||||
|
||||
void Command_Quit() {
|
||||
void CMD_Quit() {
|
||||
CoAdd(Coro_Quit);
|
||||
} RegisterCommand(Command_Quit, "");
|
||||
} RegisterCommand(CMD_Quit, "");
|
||||
|
||||
void Coro_CloseAll(mco_coro *co) {
|
||||
Coro_CloseAllEx(co);
|
||||
}
|
||||
|
||||
void Command_CloseAll() {
|
||||
void CMD_CloseAll() {
|
||||
CoAdd(Coro_CloseAll);
|
||||
} RegisterCommand(Command_CloseAll, "");
|
||||
} RegisterCommand(CMD_CloseAll, "");
|
||||
|
||||
void Command_JumpPrev() {
|
||||
void CMD_JumpPrev() {
|
||||
BSet main = GetBSet(LastActiveLayoutWindowID);
|
||||
JumpToLastValidView(main.window);
|
||||
NextActiveWindowID = main.window->id;
|
||||
} RegisterCommand(Command_JumpPrev, "ctrl-tab");
|
||||
} RegisterCommand(CMD_JumpPrev, "ctrl-tab");
|
||||
|
||||
void Command_Prev() {
|
||||
void CMD_Prev() {
|
||||
BSet main = GetBSet(LastActiveLayoutWindowID);
|
||||
main.window->skip_checkpoint = true;
|
||||
JumpBack(main.window);
|
||||
NextActiveWindowID = main.window->id;
|
||||
} RegisterCommand(Command_Prev, "alt-q | mousex1");
|
||||
} RegisterCommand(CMD_Prev, "alt-q | mousex1");
|
||||
|
||||
void Command_Next() {
|
||||
void CMD_Next() {
|
||||
BSet main = GetBSet(LastActiveLayoutWindowID);
|
||||
main.window->skip_checkpoint = true;
|
||||
JumpForward(main.window);
|
||||
NextActiveWindowID = main.window->id;
|
||||
} RegisterCommand(Command_Next, "alt-shift-q | mousex2");
|
||||
} RegisterCommand(CMD_Next, "alt-shift-q | mousex2");
|
||||
|
||||
void Command_OpenUpFolder() {
|
||||
void CMD_OpenUpFolder() {
|
||||
BSet main = GetBSet(LastActiveLayoutWindowID);
|
||||
String name = ChopLastSlash(main.buffer->name);
|
||||
Open(name);
|
||||
} RegisterCommand(Command_OpenUpFolder, "ctrl-period");
|
||||
} RegisterCommand(CMD_OpenUpFolder, "ctrl-period");
|
||||
|
||||
void Command_EncloseLine() {
|
||||
void CMD_EncloseLine() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
EncloseLine(active.view);
|
||||
} RegisterCommand(Command_EncloseLine, "ctrl-l");
|
||||
} RegisterCommand(CMD_EncloseLine, "ctrl-l");
|
||||
|
||||
void Command_SelectAll() {
|
||||
void CMD_SelectAll() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
SelectEntireBuffer(active.view);
|
||||
active.view->update_scroll = false;
|
||||
} RegisterCommand(Command_SelectAll, "ctrl-a");
|
||||
} RegisterCommand(CMD_SelectAll, "ctrl-a");
|
||||
|
||||
void Command_Redo() {
|
||||
void CMD_Redo() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
RedoEdit(active.buffer, &active.view->carets);
|
||||
} RegisterCommand(Command_Redo, "ctrl-shift-z");
|
||||
} RegisterCommand(CMD_Redo, "ctrl-shift-z");
|
||||
|
||||
void Command_Undo() {
|
||||
void CMD_Undo() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
UndoEdit(active.buffer, &active.view->carets);
|
||||
} RegisterCommand(Command_Undo, "ctrl-z");
|
||||
} RegisterCommand(CMD_Undo, "ctrl-z");
|
||||
|
||||
void Command_MakeFontLarger() {
|
||||
ConfigFontSize += 1;
|
||||
ReloadFont(ConfigFont, (U32)ConfigFontSize);
|
||||
} RegisterCommand(Command_MakeFontLarger, "ctrl-equals");
|
||||
void CMD_MakeFontLarger() {
|
||||
FontSize += 1;
|
||||
ReloadFont(Font, (U32)FontSize);
|
||||
} RegisterCommand(CMD_MakeFontLarger, "ctrl-equals");
|
||||
|
||||
void Command_MakeFontSmaller() {
|
||||
if (ConfigFontSize > 4) {
|
||||
ConfigFontSize -= 1;
|
||||
ReloadFont(ConfigFont, (U32)ConfigFontSize);
|
||||
void CMD_MakeFontSmaller() {
|
||||
if (FontSize > 4) {
|
||||
FontSize -= 1;
|
||||
ReloadFont(Font, (U32)FontSize);
|
||||
}
|
||||
} RegisterCommand(Command_MakeFontSmaller, "ctrl-minus");
|
||||
} RegisterCommand(CMD_MakeFontSmaller, "ctrl-minus");
|
||||
|
||||
void Command_Open() {
|
||||
void CMD_Open() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
Open(FetchLoadWord(active.view));
|
||||
} RegisterCommand(Command_Open, "ctrl-q");
|
||||
} RegisterCommand(CMD_Open, "ctrl-q");
|
||||
|
||||
void Command_KillSelectedLines() {
|
||||
void CMD_KillSelectedLines() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
KillSelectedLines(active.view);
|
||||
} RegisterCommand(Command_KillSelectedLines, "ctrl-shift-k");
|
||||
} RegisterCommand(CMD_KillSelectedLines, "ctrl-shift-k");
|
||||
|
||||
void Command_IndentSelectedLines() {
|
||||
void CMD_IndentSelectedLines() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
IndentSelectedLines(active.view);
|
||||
} RegisterCommand(Command_IndentSelectedLines, "ctrl-rightbracket | tab");
|
||||
} RegisterCommand(CMD_IndentSelectedLines, "ctrl-rightbracket | tab");
|
||||
|
||||
void Command_DedentSelectedLines() {
|
||||
void CMD_DedentSelectedLines() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
IndentSelectedLines(active.view, true);
|
||||
} RegisterCommand(Command_DedentSelectedLines, "ctrl-leftbracket | shift-tab");
|
||||
} RegisterCommand(CMD_DedentSelectedLines, "ctrl-leftbracket | shift-tab");
|
||||
|
||||
void Command_DuplicateLineDown() {
|
||||
void CMD_DuplicateLineDown() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
DuplicateLine(active.view, DIR_DOWN);
|
||||
} RegisterCommand(Command_DuplicateLineDown, "ctrl-alt-down");
|
||||
} RegisterCommand(CMD_DuplicateLineDown, "ctrl-alt-down");
|
||||
|
||||
void Command_CreateCursorDown() {
|
||||
void CMD_CreateCursorDown() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
CreateCursorVertical(active.view, DIR_DOWN);
|
||||
} RegisterCommand(Command_CreateCursorDown, "alt-shift-down");
|
||||
} RegisterCommand(CMD_CreateCursorDown, "alt-shift-down");
|
||||
|
||||
void Command_SelectDownToEmptyLine() {
|
||||
void CMD_SelectDownToEmptyLine() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_DOWN, CTRL_PRESSED, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_SelectDownToEmptyLine, "ctrl-shift-down");
|
||||
} RegisterCommand(CMD_SelectDownToEmptyLine, "ctrl-shift-down");
|
||||
|
||||
void Command_MoveLineDown() {
|
||||
void CMD_MoveLineDown() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCaretsLine(active.view, DIR_DOWN);
|
||||
} RegisterCommand(Command_MoveLineDown, "alt-down");
|
||||
} RegisterCommand(CMD_MoveLineDown, "alt-down");
|
||||
|
||||
void Command_MoveDownToEmptyLine() {
|
||||
void CMD_MoveDownToEmptyLine() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_DOWN, CTRL_PRESSED);
|
||||
} RegisterCommand(Command_MoveDownToEmptyLine, "ctrl-down");
|
||||
} RegisterCommand(CMD_MoveDownToEmptyLine, "ctrl-down");
|
||||
|
||||
void Command_SelectDown() {
|
||||
void CMD_SelectDown() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_DOWN, false, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_SelectDown, "shift-down");
|
||||
} RegisterCommand(CMD_SelectDown, "shift-down");
|
||||
|
||||
void Command_MoveDown() {
|
||||
void CMD_MoveDown() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_DOWN);
|
||||
} RegisterCommand(Command_MoveDown, "down");
|
||||
} RegisterCommand(CMD_MoveDown, "down");
|
||||
|
||||
void Command_DuplicateLineUp() {
|
||||
void CMD_DuplicateLineUp() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
DuplicateLine(active.view, DIR_UP);
|
||||
} RegisterCommand(Command_DuplicateLineUp, "ctrl-alt-up");
|
||||
} RegisterCommand(CMD_DuplicateLineUp, "ctrl-alt-up");
|
||||
|
||||
void Command_CreateCursorUp() {
|
||||
void CMD_CreateCursorUp() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
CreateCursorVertical(active.view, DIR_UP);
|
||||
} RegisterCommand(Command_CreateCursorUp, "alt-shift-up");
|
||||
} RegisterCommand(CMD_CreateCursorUp, "alt-shift-up");
|
||||
|
||||
void Command_SelectUpToEmptyLine() {
|
||||
void CMD_SelectUpToEmptyLine() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_UP, CTRL_PRESSED, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_SelectUpToEmptyLine, "ctrl-shift-up");
|
||||
} RegisterCommand(CMD_SelectUpToEmptyLine, "ctrl-shift-up");
|
||||
|
||||
void Command_MoveLineUp() {
|
||||
void CMD_MoveLineUp() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCaretsLine(active.view, DIR_UP);
|
||||
} RegisterCommand(Command_MoveLineUp, "alt-up");
|
||||
} RegisterCommand(CMD_MoveLineUp, "alt-up");
|
||||
|
||||
void Command_MoveUpToEmptyLine() {
|
||||
void CMD_MoveUpToEmptyLine() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_UP, CTRL_PRESSED);
|
||||
} RegisterCommand(Command_MoveUpToEmptyLine, "ctrl-up");
|
||||
} RegisterCommand(CMD_MoveUpToEmptyLine, "ctrl-up");
|
||||
|
||||
void Command_SelectUp() {
|
||||
void CMD_SelectUp() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_UP, false, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_SelectUp, "shift-up");
|
||||
} RegisterCommand(CMD_SelectUp, "shift-up");
|
||||
|
||||
void Command_MoveUp() {
|
||||
void CMD_MoveUp() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_UP);
|
||||
} RegisterCommand(Command_MoveUp, "up");
|
||||
} RegisterCommand(CMD_MoveUp, "up");
|
||||
|
||||
void Command_BoundarySelectLeft() {
|
||||
void CMD_BoundarySelectLeft() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_LEFT, CTRL_PRESSED, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_BoundarySelectLeft, "ctrl-shift-left");
|
||||
} RegisterCommand(CMD_BoundarySelectLeft, "ctrl-shift-left");
|
||||
|
||||
void Command_BoundaryMoveLeft() {
|
||||
void CMD_BoundaryMoveLeft() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_LEFT, CTRL_PRESSED);
|
||||
} RegisterCommand(Command_BoundaryMoveLeft, "ctrl-left");
|
||||
} RegisterCommand(CMD_BoundaryMoveLeft, "ctrl-left");
|
||||
|
||||
void Command_SelectLeft() {
|
||||
void CMD_SelectLeft() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_LEFT, false, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_SelectLeft, "shift-left");
|
||||
} RegisterCommand(CMD_SelectLeft, "shift-left");
|
||||
|
||||
void Command_FocusLeftWindow() {
|
||||
void CMD_FocusLeftWindow() {
|
||||
NextActiveWindowID = SwitchWindow(DIR_LEFT)->id;
|
||||
} RegisterCommand(Command_FocusLeftWindow, "alt-left");
|
||||
} RegisterCommand(CMD_FocusLeftWindow, "alt-left");
|
||||
|
||||
void Command_MoveLeft() {
|
||||
void CMD_MoveLeft() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_LEFT);
|
||||
} RegisterCommand(Command_MoveLeft, "left");
|
||||
} RegisterCommand(CMD_MoveLeft, "left");
|
||||
|
||||
void Command_BoundarySelectRight() {
|
||||
void CMD_BoundarySelectRight() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_RIGHT, CTRL_PRESSED, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_BoundarySelectRight, "ctrl-shift-right");
|
||||
} RegisterCommand(CMD_BoundarySelectRight, "ctrl-shift-right");
|
||||
|
||||
void Command_BoundaryMoveRight() {
|
||||
void CMD_BoundaryMoveRight() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_RIGHT, CTRL_PRESSED);
|
||||
} RegisterCommand(Command_BoundaryMoveRight, "ctrl-right");
|
||||
} RegisterCommand(CMD_BoundaryMoveRight, "ctrl-right");
|
||||
|
||||
void Command_SelectRight() {
|
||||
void CMD_SelectRight() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_RIGHT, false, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_SelectRight, "shift-right");
|
||||
} RegisterCommand(CMD_SelectRight, "shift-right");
|
||||
|
||||
void Command_FocusRightWindow() {
|
||||
void CMD_FocusRightWindow() {
|
||||
NextActiveWindowID = SwitchWindow(DIR_RIGHT)->id;
|
||||
} RegisterCommand(Command_FocusRightWindow, "alt-right");
|
||||
} RegisterCommand(CMD_FocusRightWindow, "alt-right");
|
||||
|
||||
void Command_MoveRight() {
|
||||
void CMD_MoveRight() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCarets(active.view, DIR_RIGHT);
|
||||
} RegisterCommand(Command_MoveRight, "right");
|
||||
} RegisterCommand(CMD_MoveRight, "right");
|
||||
|
||||
void Command_MoveUpAPage() {
|
||||
void CMD_MoveUpAPage() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCursorByPageSize(active.window, DIR_UP);
|
||||
} RegisterCommand(Command_MoveUpAPage, "pageup");
|
||||
} RegisterCommand(CMD_MoveUpAPage, "pageup");
|
||||
|
||||
void Command_SelectUpPage() {
|
||||
void CMD_SelectUpPage() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCursorByPageSize(active.window, DIR_UP, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_SelectUpPage, "shift-pageup");
|
||||
} RegisterCommand(CMD_SelectUpPage, "shift-pageup");
|
||||
|
||||
void Command_MoveToStart() {
|
||||
void CMD_MoveToStart() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
SelectRange(active.view, MakeRange(0));
|
||||
} RegisterCommand(Command_MoveToStart, "ctrl-pageup");
|
||||
} RegisterCommand(CMD_MoveToStart, "ctrl-pageup");
|
||||
|
||||
void Command_SelectDownPage() {
|
||||
void CMD_SelectDownPage() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCursorByPageSize(active.window, DIR_DOWN, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_SelectDownPage, "shift-pagedown");
|
||||
} RegisterCommand(CMD_SelectDownPage, "shift-pagedown");
|
||||
|
||||
void Command_MoveToEnd() {
|
||||
void CMD_MoveToEnd() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
SelectRange(active.view, MakeRange(active.buffer->len));
|
||||
} RegisterCommand(Command_MoveToEnd, "ctrl-pagedown");
|
||||
} RegisterCommand(CMD_MoveToEnd, "ctrl-pagedown");
|
||||
|
||||
void Command_MoveDownPage() {
|
||||
void CMD_MoveDownPage() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCursorByPageSize(active.window, DIR_DOWN);
|
||||
} RegisterCommand(Command_MoveDownPage, "pagedown");
|
||||
} RegisterCommand(CMD_MoveDownPage, "pagedown");
|
||||
|
||||
void Command_SelectToLineStart() {
|
||||
void CMD_SelectToLineStart() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCursorToSide(active.view, DIR_LEFT, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_SelectToLineStart, "shift-home");
|
||||
} RegisterCommand(CMD_SelectToLineStart, "shift-home");
|
||||
|
||||
void Command_MoveToLineStart() {
|
||||
void CMD_MoveToLineStart() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCursorToSide(active.view, DIR_LEFT);
|
||||
} RegisterCommand(Command_MoveToLineStart, "home");
|
||||
} RegisterCommand(CMD_MoveToLineStart, "home");
|
||||
|
||||
void Command_MoveToLineEnd() {
|
||||
void CMD_MoveToLineEnd() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCursorToSide(active.view, DIR_RIGHT);
|
||||
} RegisterCommand(Command_MoveToLineEnd, "end");
|
||||
} RegisterCommand(CMD_MoveToLineEnd, "end");
|
||||
|
||||
void Command_SelectToLineEnd() {
|
||||
void CMD_SelectToLineEnd() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCursorToSide(active.view, DIR_RIGHT, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_SelectToLineEnd, "shift-end");
|
||||
} RegisterCommand(CMD_SelectToLineEnd, "shift-end");
|
||||
|
||||
void Command_Delete() {
|
||||
void CMD_Delete() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
Delete(active.view, DIR_LEFT);
|
||||
} RegisterCommand(Command_Delete, "shift-backspace | backspace");
|
||||
} RegisterCommand(CMD_Delete, "shift-backspace | backspace");
|
||||
|
||||
void Command_DeleteBoundary() {
|
||||
void CMD_DeleteBoundary() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
Delete(active.view, DIR_LEFT, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_DeleteBoundary, "ctrl-backspace");
|
||||
} RegisterCommand(CMD_DeleteBoundary, "ctrl-backspace");
|
||||
|
||||
void Command_DeleteForward() {
|
||||
void CMD_DeleteForward() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
Delete(active.view, DIR_RIGHT);
|
||||
} RegisterCommand(Command_DeleteForward, "shift-delete | delete");
|
||||
} RegisterCommand(CMD_DeleteForward, "shift-delete | delete");
|
||||
|
||||
void Command_DeleteForwardBoundary() {
|
||||
void CMD_DeleteForwardBoundary() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
Delete(active.view, DIR_RIGHT, SHIFT_PRESS);
|
||||
} RegisterCommand(Command_DeleteForwardBoundary, "ctrl-delete");
|
||||
} RegisterCommand(CMD_DeleteForwardBoundary, "ctrl-delete");
|
||||
|
||||
void Command_InsertNewLineUp() {
|
||||
void CMD_InsertNewLineUp() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCursorToSide(active.view, DIR_LEFT);
|
||||
IdentedNewLine(active.view);
|
||||
MoveCarets(active.view, DIR_UP);
|
||||
} RegisterCommand(Command_InsertNewLineUp, "ctrl-shift-enter");
|
||||
} RegisterCommand(CMD_InsertNewLineUp, "ctrl-shift-enter");
|
||||
|
||||
void Command_InsertNewLineDown() {
|
||||
void CMD_InsertNewLineDown() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
MoveCursorToSide(active.view, DIR_RIGHT);
|
||||
IdentedNewLine(active.view);
|
||||
} RegisterCommand(Command_InsertNewLineDown, "ctrl-enter");
|
||||
} RegisterCommand(CMD_InsertNewLineDown, "ctrl-enter");
|
||||
|
||||
void Command_NewLine() {
|
||||
void CMD_NewLine() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
IdentedNewLine(active.view);
|
||||
} RegisterCommand(Command_NewLine, "enter | shift-enter");
|
||||
} RegisterCommand(CMD_NewLine, "enter | shift-enter");
|
||||
|
||||
void Command_CreateCaretOnNextFind() {
|
||||
void CMD_CreateCaretOnNextFind() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
String16 string = GetString(active.buffer, active.view->carets[0].range);
|
||||
Caret caret = FindNext(active.buffer, string, active.view->carets[0]);
|
||||
Insert(&active.view->carets, caret, 0);
|
||||
MergeCarets(active.buffer, &active.view->carets);
|
||||
} RegisterCommand(Command_CreateCaretOnNextFind, "ctrl-d");
|
||||
} RegisterCommand(CMD_CreateCaretOnNextFind, "ctrl-d");
|
||||
|
||||
void Command_FocusWindow1() {
|
||||
void CMD_FocusWindow1() {
|
||||
NextActiveWindowID = GetOverlappingWindow({0,0}, GetWindow(ActiveWindowID))->id;
|
||||
} RegisterCommand(Command_FocusWindow1, "ctrl-1");
|
||||
} RegisterCommand(CMD_FocusWindow1, "ctrl-1");
|
||||
|
||||
void Command_FocusWindow2() {
|
||||
void CMD_FocusWindow2() {
|
||||
Window *first = GetOverlappingWindow({0,0}, GetWindow(ActiveWindowID));
|
||||
Vec2I p = GetSideOfWindow(first, DIR_RIGHT);
|
||||
NextActiveWindowID = GetOverlappingWindow(p, GetWindow(ActiveWindowID))->id;
|
||||
} RegisterCommand(Command_FocusWindow2, "ctrl-2");
|
||||
} RegisterCommand(CMD_FocusWindow2, "ctrl-2");
|
||||
|
||||
void Command_FocusWindow3() {
|
||||
void CMD_FocusWindow3() {
|
||||
Window *first = GetOverlappingWindow({0,0});
|
||||
if (first) {
|
||||
Window *second = GetOverlappingWindow(GetSideOfWindow(first, DIR_RIGHT));
|
||||
@@ -1201,13 +1219,13 @@ void Command_FocusWindow3() {
|
||||
}
|
||||
}
|
||||
}
|
||||
} RegisterCommand(Command_FocusWindow3, "ctrl-3");
|
||||
} RegisterCommand(CMD_FocusWindow3, "ctrl-3");
|
||||
|
||||
void Command_NewWindow() {
|
||||
void CMD_NewWindow() {
|
||||
CreateWind();
|
||||
} RegisterCommand(Command_NewWindow, "ctrl-backslash");
|
||||
} RegisterCommand(CMD_NewWindow, "ctrl-backslash");
|
||||
|
||||
void Command_ClearCarets() {
|
||||
void CMD_ClearCarets() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
active.view->carets.len = 1;
|
||||
active.view->carets[0] = MakeCaret(GetFront(active.view->carets[0]));
|
||||
@@ -1225,4 +1243,193 @@ void Command_ClearCarets() {
|
||||
it->visible = false;
|
||||
}
|
||||
}
|
||||
} RegisterCommand(Command_ClearCarets, "escape");
|
||||
} RegisterCommand(CMD_ClearCarets, "escape");
|
||||
|
||||
void Set(String16 string) {
|
||||
Scratch scratch;
|
||||
|
||||
SkipWhitespace(&string);
|
||||
if (At(string, 0) != u':') {
|
||||
ReportErrorf("Expected :Set");
|
||||
return;
|
||||
}
|
||||
string = Skip(string, 1);
|
||||
|
||||
if (!MatchIdent(&string, u"Set")) {
|
||||
ReportErrorf("Expected :Set");
|
||||
return;
|
||||
}
|
||||
|
||||
SkipWhitespace(&string);
|
||||
String16 name = SkipIdent(&string);
|
||||
if (name.len == 0) {
|
||||
ReportErrorf("Set command failed to parse at the variable name");
|
||||
return;
|
||||
}
|
||||
|
||||
String name8 = ToString(scratch, name);
|
||||
Variable *var = NULL;
|
||||
For (Variables) {
|
||||
if (name8 == it.name) {
|
||||
var = ⁢
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (var) {
|
||||
SkipWhitespace(&string);
|
||||
if (var->type == VariableType_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) {
|
||||
ReportErrorf("Failed to parse :Set %S <error here>, unclosed quote", name8);
|
||||
return;
|
||||
}
|
||||
String quote8 = ToString(scratch, quote);
|
||||
ReportConsolef(":Set %S %c%S%c", name8, c, quote8, c);
|
||||
*var->string = Intern(&GlobalInternTable, quote8);
|
||||
} else {
|
||||
ReportErrorf("Failed to parse :Set %S <expected string>", name8);
|
||||
return;
|
||||
}
|
||||
} else if (var->type == VariableType_Int) {
|
||||
if (IsDigit(At(string, 0))) {
|
||||
Int number = SkipInt(&string);
|
||||
ReportConsolef(":Set %S %lld", name8, number);
|
||||
*var->i = number;
|
||||
} else {
|
||||
ReportErrorf("Failed to parse :Set %S <expected integer>", name8);
|
||||
return;
|
||||
}
|
||||
} else if (var->type == VariableType_Float) {
|
||||
if (IsDigit(At(string, 0)) || At(string, 0) == '.') {
|
||||
Float number = SkipFloat(&string);
|
||||
ReportConsolef(":Set %S %f", name8, number);
|
||||
*var->f = number;
|
||||
} else {
|
||||
ReportErrorf("Failed to parse :Set %S <expected float>", name8);
|
||||
return;
|
||||
}
|
||||
} else if (var->type == VariableType_Color) {
|
||||
if (IsHexDigit(At(string, 0))) {
|
||||
String16 begin = {string.data, 0};
|
||||
while (IsHexDigit(At(string, 0))) {
|
||||
string = Skip(string, 1);
|
||||
begin.len += 1;
|
||||
}
|
||||
String p = ToString(scratch, begin);
|
||||
ReportConsolef(":Set %S %S", name8, p);
|
||||
var->color->value = (uint32_t)strtoll(p.data, NULL, 16);
|
||||
} else {
|
||||
ReportErrorf("Failed to parse :Set %S <expected integer>", name8);
|
||||
return;
|
||||
}
|
||||
} ElseInvalidCodepath();
|
||||
|
||||
|
||||
if (name8 == "FontSize" || name8 == "Font") {
|
||||
ReloadFont(Font, (U32)FontSize);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
CommandData *cmd = NULL;
|
||||
For (CommandFunctions) {
|
||||
if (it.name == name8) {
|
||||
cmd = ⁢
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cmd) {
|
||||
SkipWhitespace(&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) {
|
||||
ReportErrorf("Failed to parse :Set %S <error here>, unclosed quote", name8);
|
||||
return;
|
||||
}
|
||||
String quote8 = Intern(&GlobalInternTable, ToString(scratch, quote));
|
||||
ReportConsolef(":Set %S %c%S%c", name8, c, quote8, c);
|
||||
Trigger *trigger = ParseKeyCached(quote8);
|
||||
if (trigger) {
|
||||
cmd->binding = quote8;
|
||||
cmd->trigger = trigger;
|
||||
}
|
||||
} else {
|
||||
ReportErrorf("Failed to parse :Set %S <expected string>", name8);
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
ReportErrorf("Failed to :Set, no such variable found: %S", name8);
|
||||
}
|
||||
|
||||
void CMD_Set() {
|
||||
BSet set = GetBSet(ActiveWindowID);
|
||||
Range range = set.view->carets[0].range;
|
||||
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);
|
||||
} RegisterCommand(CMD_Set, "");
|
||||
|
||||
void EvalCommandsLineByLine(BSet set) {
|
||||
WindowID save_last = LastActiveLayoutWindowID;
|
||||
WindowID save_active = ActiveWindowID;
|
||||
WindowID save_next = NextActiveWindowID;
|
||||
ActiveWindowID = set.window->id;
|
||||
LastActiveLayoutWindowID = set.window->id;
|
||||
NextActiveWindowID = set.window->id;
|
||||
for (Int i = 0; i < set.buffer->line_starts.len; i += 1) {
|
||||
Int pos = GetLineRangeWithoutNL(set.buffer, i).min;
|
||||
SelectRange(set.view, MakeRange(pos));
|
||||
Range range = EncloseLoadWord(set.buffer, pos);
|
||||
String16 string = GetString(set.buffer, range);
|
||||
string = Trim(string);
|
||||
if (string.len == 0) {
|
||||
continue;
|
||||
}
|
||||
if (StartsWith(string, u"//")) {
|
||||
continue;
|
||||
}
|
||||
Open(string);
|
||||
}
|
||||
LastActiveLayoutWindowID = save_last;
|
||||
ActiveWindowID = save_active;
|
||||
NextActiveWindowID = save_next;
|
||||
}
|
||||
|
||||
void CMD_EvalCommandsLineByLine() {
|
||||
BSet set = GetBSet(LastActiveLayoutWindowID);
|
||||
EvalCommandsLineByLine(set);
|
||||
} RegisterCommand(CMD_EvalCommandsLineByLine, "");
|
||||
|
||||
void GenerateConfig(Buffer *buffer) {
|
||||
For (Variables) {
|
||||
if (it.type == VariableType_String) {
|
||||
RawAppendf(buffer, "// :Set %S '%S'\n", it.name, *it.string);
|
||||
} else if (it.type == VariableType_Int) {
|
||||
RawAppendf(buffer, "// :Set %S '%lld'\n", it.name, (long long)*it.i);
|
||||
} else if (it.type == VariableType_Float) {
|
||||
RawAppendf(buffer, "// :Set %S '%f'\n", it.name, *it.f);
|
||||
} else if (it.type == VariableType_Color) {
|
||||
RawAppendf(buffer, "// :Set %S %x\n", it.name, it.color->value);
|
||||
} ElseInvalidCodepath();
|
||||
}
|
||||
For (CommandFunctions) {
|
||||
RawAppendf(buffer, "// :Set %S '%S'\n", it.name, it.binding);
|
||||
}
|
||||
}
|
||||
@@ -87,19 +87,19 @@ void ClipboardPaste(View *view) {
|
||||
EndEdit(buffer, &edits, &view->carets, KILL_SELECTION);
|
||||
}
|
||||
|
||||
void Command_Paste() {
|
||||
void CMD_Paste() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
ClipboardPaste(active.view);
|
||||
} RegisterCommand(Command_Paste, "ctrl-v");
|
||||
} RegisterCommand(CMD_Paste, "ctrl-v");
|
||||
|
||||
void Command_Copy() {
|
||||
void CMD_Copy() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
ClipboardCopy(active.view);
|
||||
} RegisterCommand(Command_Copy, "ctrl-c");
|
||||
} RegisterCommand(CMD_Copy, "ctrl-c");
|
||||
|
||||
void Command_Cut() {
|
||||
void CMD_Cut() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
SaveCaretHistoryBeforeBeginEdit(active.buffer, active.view->carets);
|
||||
ClipboardCopy(active.view);
|
||||
Replace(active.view, u"");
|
||||
} RegisterCommand(Command_Cut, "ctrl-x");
|
||||
} RegisterCommand(CMD_Cut, "ctrl-x");
|
||||
|
||||
@@ -130,7 +130,7 @@ void DrawWindow(Window *window, Event &event) {
|
||||
|
||||
|
||||
Rect2I combined_document_line_number = window->document_rect;
|
||||
if (window->draw_line_numbers) {
|
||||
if (DrawLineNumbers && window->draw_line_numbers) {
|
||||
combined_document_line_number.min.x = window->line_numbers_rect.min.x;
|
||||
}
|
||||
SetScissor(combined_document_line_number);
|
||||
@@ -242,7 +242,7 @@ void DrawWindow(Window *window, Event &event) {
|
||||
}
|
||||
|
||||
// Draw line numbers
|
||||
if (window->draw_line_numbers) {
|
||||
if (DrawLineNumbers && window->draw_line_numbers) {
|
||||
ProfileScope(DrawLineNumbers);
|
||||
Scratch scratch;
|
||||
SetScissor(window->line_numbers_rect);
|
||||
@@ -269,7 +269,7 @@ void DrawWindow(Window *window, Event &event) {
|
||||
}
|
||||
|
||||
// Draw scrollbar
|
||||
if (window->draw_scrollbar) {
|
||||
if (DrawScrollbar && window->draw_scrollbar) {
|
||||
ProfileScope(DrawScrollbar);
|
||||
SetScissor(window->scrollbar_rect);
|
||||
DrawRect(window->scrollbar_rect, ColorScrollbarBackground);
|
||||
|
||||
@@ -473,7 +473,7 @@ Array<Event> GetEventsForFrame(Allocator allocator) {
|
||||
}
|
||||
|
||||
SDL_Event event;
|
||||
if (WaitForEvents) {
|
||||
if (WaitForEventsState) {
|
||||
SDL_WaitEvent(&event);
|
||||
Event ev = TranslateSDLEvent(&event);
|
||||
AddEvent(&result, ev);
|
||||
|
||||
@@ -4,7 +4,7 @@ int FullScreenSizeX, FullScreenSizeY;
|
||||
int FullScreenPositionX, FullScreenPositionY;
|
||||
bool Testing = false;
|
||||
bool AppIsRunning = true;
|
||||
bool WaitForEvents = true;
|
||||
bool WaitForEventsState = true;
|
||||
bool RunGCThisFrame;
|
||||
bool SearchCaseSensitive = false;
|
||||
bool SearchWordBoundary = false;
|
||||
@@ -153,14 +153,13 @@ RegisterVariable(Color, ColorTitleBarLineHighlight, GruvboxLight0Soft);
|
||||
RegisterVariable(Color, ColorTitleBarOutline, GruvboxLight3);
|
||||
RegisterVariable(Color, ColorResizerBackground, GruvboxLight0Hard);
|
||||
RegisterVariable(Color, ColorResizerOutline, GruvboxLight3);
|
||||
RegisterVariable(Int, ConfigWaitForEvents, 1);
|
||||
RegisterVariable(Int, ConfigDrawLineNumbers, 1);
|
||||
RegisterVariable(Int, ConfigDrawScrollbar, 1);
|
||||
RegisterVariable(Int, ConfigIndentSize, 4);
|
||||
RegisterVariable(Int, ConfigFontSize, 15);
|
||||
RegisterVariable(Int, ConfigFontFilter, 0);
|
||||
RegisterVariable(String, ConfigFont, "/home/krz/text_editor/package/CascadiaMono.ttf");
|
||||
RegisterVariable(String, ConfigVCVarsall, "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvars64.bat");
|
||||
RegisterVariable(Float, ConfigUndoMergeTimeWindow, 0.3);
|
||||
RegisterVariable(Float, ConfigJumpHistoryMergeTimeWindow, 0.3);
|
||||
RegisterVariable(String, ConfigInternetBrowser, "firefox");
|
||||
RegisterVariable(Int, WaitForEvents, 1);
|
||||
RegisterVariable(Int, DrawLineNumbers, 1);
|
||||
RegisterVariable(Int, DrawScrollbar, 1);
|
||||
RegisterVariable(Int, IndentSize, 4);
|
||||
RegisterVariable(Int, FontSize, 15);
|
||||
RegisterVariable(String, Font, "");
|
||||
RegisterVariable(String, VCVarsall, "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvars64.bat");
|
||||
RegisterVariable(Float, UndoMergeTime, 0.3);
|
||||
RegisterVariable(Float, JumpHistoryMergeTime, 0.3);
|
||||
RegisterVariable(String, InternetBrowser, "firefox");
|
||||
|
||||
@@ -119,6 +119,7 @@ void SetMouseCursor(Event event) {
|
||||
}
|
||||
SetMouseCursor(SDL_SYSTEM_CURSOR_DEFAULT);
|
||||
}
|
||||
|
||||
void UpdateScroll(Window *window, bool update_caret_scrolling) {
|
||||
ProfileFunction();
|
||||
BSet set = GetBSet(window);
|
||||
@@ -415,7 +416,7 @@ void OnCommand(Event event) {
|
||||
}
|
||||
|
||||
if (event.kind == EVENT_QUIT) {
|
||||
Command_Quit();
|
||||
CMD_Quit();
|
||||
}
|
||||
|
||||
IF_DEBUG(AssertRanges(main.view->carets));
|
||||
@@ -561,7 +562,7 @@ void Update(Event event) {
|
||||
OnCommand(event);
|
||||
StatusWindowUpdate();
|
||||
DebugWindowUpdate();
|
||||
CommandWindowUpdate();
|
||||
FuzzySearchViewUpdate();
|
||||
SearchWindowUpdate();
|
||||
UpdateProcesses();
|
||||
CoUpdate(&event);
|
||||
@@ -647,7 +648,7 @@ void Windows_SetupVCVarsall(mco_coro *co) {
|
||||
Scratch scratch;
|
||||
String working_dir = WorkDir;
|
||||
String buffer_name = GetUniqueBufferName(working_dir, "vcvarsall-");
|
||||
String cmd = Format(scratch, "\"%S\" && set", ConfigVCVarsall);
|
||||
String cmd = Format(scratch, "\"%S\" && set", VCVarsall);
|
||||
view = ExecHidden(buffer_name, cmd, working_dir);
|
||||
}
|
||||
for (;;) {
|
||||
@@ -700,9 +701,9 @@ void MainLoop() {
|
||||
}
|
||||
}
|
||||
|
||||
WaitForEvents = ConfigWaitForEvents;
|
||||
WaitForEventsState = WaitForEvents;
|
||||
if (IsDocumentSelectionValid() || IsScrollbarSelectionValid() || ActiveProcesses.len || dont_wait_until_resolved) {
|
||||
WaitForEvents = false;
|
||||
WaitForEventsState = false;
|
||||
}
|
||||
|
||||
// This shouldn't matter to the state of the program, only appearance for
|
||||
@@ -845,7 +846,7 @@ int main(int argc, char **argv)
|
||||
|
||||
InitBuffers();
|
||||
InitRender();
|
||||
ReloadFont(ConfigFont, (U32)ConfigFontSize);
|
||||
ReloadFont(Font, (U32)FontSize);
|
||||
InitWindows();
|
||||
InitOS(ReportWarningf);
|
||||
|
||||
@@ -872,6 +873,23 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
Scratch scratch;
|
||||
String exe_dir = GetExeDir(scratch);
|
||||
String config_path = Format(scratch, "%S/config.te", exe_dir);
|
||||
Window *window = GetWindow(NullWindowID);
|
||||
View *view = WindowOpenBufferView(window, config_path);
|
||||
Buffer *buffer = GetBuffer(view->active_buffer);
|
||||
bool file_exists = buffer->file_mod_time != 0;
|
||||
if (!file_exists) {
|
||||
GenerateConfig(buffer);
|
||||
} else {
|
||||
EvalCommandsLineByLine({window, view, buffer});
|
||||
}
|
||||
buffer->dirty = false;
|
||||
}
|
||||
|
||||
|
||||
ReportConsolef("WorkDir = %S", WorkDir);
|
||||
if (Testing) InitTests();
|
||||
#if OS_WINDOWS
|
||||
|
||||
@@ -136,7 +136,7 @@ struct Register_Function {
|
||||
};
|
||||
#define RegisterFunction(functions, name) Register_Function RF__##name(functions, #name, name)
|
||||
|
||||
struct Register_Command { Register_Command(Array<CommandData> *fucs, Function *function, String name, String binding) { if (StartsWith(name, "Command_")) name = Skip(name, 8); Add(fucs, {name, binding, function}); } };
|
||||
struct Register_Command { Register_Command(Array<CommandData> *fucs, Function *function, String name, String binding) { if (StartsWith(name, "CMD_")) name = Skip(name, sizeof("CMD_") - 1); Add(fucs, {name, binding, function}); } };
|
||||
#define RegisterCommand(name, binding) Register_Command RC__##name(&CommandFunctions, name, #name, binding)
|
||||
|
||||
const int DIR_RIGHT = 0;
|
||||
|
||||
@@ -443,9 +443,9 @@ void Delete(View *view, int direction, bool ctrl = false) {
|
||||
Range indent_range = GetIndentRangeAtPos(buffer, it.range.min);
|
||||
if (ctrl == false && it.range.min > indent_range.min && it.range.max <= indent_range.max) {
|
||||
Int offset = it.range.min - indent_range.min;
|
||||
Int to_delete = (offset % (ConfigIndentSize));
|
||||
if (to_delete == 0) to_delete = ConfigIndentSize;
|
||||
to_delete = Clamp(to_delete, (Int)1, ConfigIndentSize);
|
||||
Int to_delete = (offset % (IndentSize));
|
||||
if (to_delete == 0) to_delete = IndentSize;
|
||||
to_delete = Clamp(to_delete, (Int)1, IndentSize);
|
||||
for (Int i = 0; i < to_delete; i += 1) {
|
||||
it = MoveCaret(buffer, it, direction, false, SHIFT_PRESS);
|
||||
}
|
||||
@@ -512,12 +512,12 @@ void IndentSelectedLines(View *view, bool shift = false) {
|
||||
Range pos_range_of_line = GetLineRange(buffer, i);
|
||||
|
||||
if (!shift) {
|
||||
String16 whitespace_string = {u" ", ConfigIndentSize};
|
||||
String16 whitespace_string = {u" ", IndentSize};
|
||||
AddEdit(&edits, {pos_range_of_line.min, pos_range_of_line.min}, whitespace_string);
|
||||
} else {
|
||||
String16 string = GetString(buffer, pos_range_of_line);
|
||||
Int whitespace_len = 0;
|
||||
for (Int i = 0; i < ConfigIndentSize && i < string.len && string.data[i] == ' '; i += 1) {
|
||||
for (Int i = 0; i < IndentSize && i < string.len && string.data[i] == ' '; i += 1) {
|
||||
whitespace_len += 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ struct View {
|
||||
struct {
|
||||
unsigned close : 1;
|
||||
unsigned special : 1;
|
||||
unsigned fuzzy : 1;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -8,8 +8,8 @@ Window *CreateWind() {
|
||||
w->font = &PrimaryFont;
|
||||
w->visible = true;
|
||||
w->layout = true;
|
||||
w->draw_scrollbar = ConfigDrawScrollbar;
|
||||
w->draw_line_numbers = ConfigDrawLineNumbers;
|
||||
w->draw_scrollbar = true;
|
||||
w->draw_line_numbers = true;
|
||||
w->draw_line_highlight = true;
|
||||
w->jump_history = true;
|
||||
w->id = AllocWindowID(w);
|
||||
@@ -126,8 +126,8 @@ void InitWindows() {
|
||||
void CalcNiceties(Window *n) {
|
||||
float scrollbar_size = (10.f * DPIScale);
|
||||
float line_numbers_size = (float)n->font->char_spacing * 10.f;
|
||||
if (n->draw_scrollbar) n->scrollbar_rect = CutRight(&n->document_rect, (Int)scrollbar_size);
|
||||
if (n->draw_line_numbers) n->line_numbers_rect = CutLeft(&n->document_rect, (Int)line_numbers_size);
|
||||
if (DrawScrollbar && n->draw_scrollbar) n->scrollbar_rect = CutRight(&n->document_rect, (Int)scrollbar_size);
|
||||
if (DrawLineNumbers && n->draw_line_numbers) n->line_numbers_rect = CutLeft(&n->document_rect, (Int)line_numbers_size);
|
||||
}
|
||||
|
||||
double WindowCalcEvenResizerValue(Int screen_size_x, Int *out_count = NULL) {
|
||||
@@ -278,7 +278,7 @@ void JumpBack(Window *window) {
|
||||
|
||||
if (window->goto_history.len) {
|
||||
GotoCrumb *next = GetLast(window->goto_history);
|
||||
if (c.view_id == next->view_id && c.time - next->time <= ConfigJumpHistoryMergeTimeWindow) {
|
||||
if (c.view_id == next->view_id && c.time - next->time <= JumpHistoryMergeTime) {
|
||||
JumpBack(window);
|
||||
}
|
||||
}
|
||||
@@ -298,7 +298,7 @@ void JumpForward(Window *window) {
|
||||
|
||||
if (window->goto_redo.len) {
|
||||
GotoCrumb *next = GetLast(window->goto_redo);
|
||||
if (c.view_id == next->view_id && next->time - c.time <= ConfigJumpHistoryMergeTimeWindow) {
|
||||
if (c.view_id == next->view_id && next->time - c.time <= JumpHistoryMergeTime) {
|
||||
JumpForward(window);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ void BuildWindowLayout(Rect2I *rect, Int wx, Int wy) {
|
||||
n->document_rect = n->total_rect = CutBottom(rect, barsize);
|
||||
}
|
||||
|
||||
void Command_ShowBuildWindow() {
|
||||
void CMD_ShowBuildWindow() {
|
||||
BSet main = GetBSet(BuildWindowID);
|
||||
if (ActiveWindowID != BuildWindowID) {
|
||||
main.window->visible = true;
|
||||
@@ -35,4 +35,4 @@ void Command_ShowBuildWindow() {
|
||||
} else {
|
||||
main.window->visible = false;
|
||||
}
|
||||
} RegisterCommand(Command_ShowBuildWindow, "ctrl-grave");
|
||||
} RegisterCommand(CMD_ShowBuildWindow, "ctrl-grave");
|
||||
@@ -41,10 +41,10 @@ Array<FuzzyPair> FuzzySearchLines(Allocator allocator, Buffer *buffer, Int line_
|
||||
return ratings;
|
||||
}
|
||||
|
||||
void CommandWindowUpdate() {
|
||||
void FuzzySearchViewUpdate() {
|
||||
ProfileFunction();
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
if (active.window->id == CommandWindowID) {
|
||||
if (active.view->fuzzy) {
|
||||
Scratch scratch;
|
||||
String16 line_string = GetLineStringWithoutNL(active.buffer, 0);
|
||||
if (active.view->prev_search_line != line_string) {
|
||||
@@ -69,8 +69,8 @@ void CommandWindowUpdate() {
|
||||
}
|
||||
}
|
||||
|
||||
void Command_ShowCommands() {
|
||||
if (ActiveWindowID == CommandWindowID && LastExecutedManualCommand == Command_ShowCommands) {
|
||||
void CMD_ShowCommands() {
|
||||
if (ActiveWindowID == CommandWindowID && LastExecutedManualCommand == CMD_ShowCommands) {
|
||||
NextActiveWindowID = LastActiveLayoutWindowID;
|
||||
return;
|
||||
}
|
||||
@@ -88,10 +88,10 @@ void Command_ShowCommands() {
|
||||
}
|
||||
command_bar.view->update_scroll = true;
|
||||
SelectRange(command_bar.view, GetBufferBeginAsRange(command_bar.buffer));
|
||||
} RegisterCommand(Command_ShowCommands, "ctrl-shift-p");
|
||||
} RegisterCommand(CMD_ShowCommands, "ctrl-shift-p");
|
||||
|
||||
void Command_ShowDebugBufferList() {
|
||||
if (ActiveWindowID == CommandWindowID && LastExecutedManualCommand == Command_ShowDebugBufferList) {
|
||||
void CMD_ShowDebugBufferList() {
|
||||
if (ActiveWindowID == CommandWindowID && LastExecutedManualCommand == CMD_ShowDebugBufferList) {
|
||||
NextActiveWindowID = LastActiveLayoutWindowID;
|
||||
return;
|
||||
}
|
||||
@@ -106,10 +106,10 @@ void Command_ShowDebugBufferList() {
|
||||
}
|
||||
command_bar.view->update_scroll = true;
|
||||
SelectRange(command_bar.view, GetBufferBeginAsRange(command_bar.buffer));
|
||||
} RegisterCommand(Command_ShowDebugBufferList, "");
|
||||
} RegisterCommand(CMD_ShowDebugBufferList, "");
|
||||
|
||||
void Command_ShowBufferList() {
|
||||
if (ActiveWindowID == CommandWindowID && LastExecutedManualCommand == Command_ShowBufferList) {
|
||||
void CMD_ShowBufferList() {
|
||||
if (ActiveWindowID == CommandWindowID && LastExecutedManualCommand == CMD_ShowBufferList) {
|
||||
NextActiveWindowID = LastActiveLayoutWindowID;
|
||||
return;
|
||||
}
|
||||
@@ -121,13 +121,13 @@ void Command_ShowBufferList() {
|
||||
ResetBuffer(command_bar.buffer);
|
||||
For (Buffers) {
|
||||
if (it->special || it->temp) {
|
||||
continue;
|
||||
if (it->id != NullBufferID) continue;
|
||||
}
|
||||
RawAppendf(command_bar.buffer, "\n%S", it->name);
|
||||
}
|
||||
command_bar.view->update_scroll = true;
|
||||
SelectRange(command_bar.view, GetBufferBeginAsRange(command_bar.buffer));
|
||||
} RegisterCommand(Command_ShowBufferList, "ctrl-p");
|
||||
} RegisterCommand(CMD_ShowBufferList, "ctrl-p");
|
||||
|
||||
void OpenCommand(BSet active) {
|
||||
ProfileFunction();
|
||||
@@ -144,7 +144,7 @@ void OpenCommand(BSet active) {
|
||||
Open(string);
|
||||
}
|
||||
|
||||
void Command_CommandWindowOpen() {
|
||||
void CMD_CommandWindowOpen() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
BSet main = GetBSet(LastActiveLayoutWindowID);
|
||||
NextActiveWindowID = main.window->id;
|
||||
@@ -161,6 +161,11 @@ void CommandWindowLayout(Rect2I *rect, Int wx, Int wy) {
|
||||
n->document_rect = n->total_rect = CutBottom(rect, barsize);
|
||||
}
|
||||
|
||||
void SetFuzzy(View *view) {
|
||||
view->fuzzy = true;
|
||||
AddHook(&view->hooks, "Open", "ctrl-q | enter", CMD_CommandWindowOpen);
|
||||
}
|
||||
|
||||
void CommandWindowInit() {
|
||||
Window *window = CreateWind();
|
||||
CommandWindowID = window->id;
|
||||
@@ -168,6 +173,7 @@ void CommandWindowInit() {
|
||||
buffer->special = true;
|
||||
View *view = CreateView(buffer->id);
|
||||
view->special = true;
|
||||
SetFuzzy(view);
|
||||
window->active_view = view->id;
|
||||
window->draw_line_numbers = false;
|
||||
window->draw_scrollbar = false;
|
||||
@@ -178,5 +184,4 @@ void CommandWindowInit() {
|
||||
window->sync_visibility_with_focus = true;
|
||||
window->lose_focus_on_escape = true;
|
||||
window->jump_history = false;
|
||||
AddHook(&view->hooks, "Open", "ctrl-q | enter", Command_CommandWindowOpen);
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ void DebugWindowUpdate() {
|
||||
RawAppendf(set.buffer, "int temp = %d\n", main.buffer->temp);
|
||||
}
|
||||
|
||||
void Command_ToggleDebug() {
|
||||
void CMD_ToggleDebug() {
|
||||
Window *window = GetWindow(DebugWindowID);
|
||||
window->visible = !window->visible;
|
||||
} RegisterCommand(Command_ToggleDebug, "ctrl-0");
|
||||
} RegisterCommand(CMD_ToggleDebug, "ctrl-0");
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
void Command_Search() {
|
||||
void CMD_Search() {
|
||||
BSet main = GetBSet(ActiveWindowID);
|
||||
String16 string = {};
|
||||
if (main.view->carets.len == 1 && GetSize(main.view->carets[0]) > 0) {
|
||||
@@ -12,7 +12,7 @@ void Command_Search() {
|
||||
Replace(set.view, string);
|
||||
SelectEntireBuffer(set.view);
|
||||
}
|
||||
} RegisterCommand(Command_Search, "ctrl-f");
|
||||
} RegisterCommand(CMD_Search, "ctrl-f");
|
||||
|
||||
void SearchWindowFindNext(bool forward = true) {
|
||||
BSet main = GetBSet(LastActiveLayoutWindowID);
|
||||
@@ -22,21 +22,21 @@ void SearchWindowFindNext(bool forward = true) {
|
||||
main.window->search_bar_anchor = main.view->carets[0];
|
||||
}
|
||||
|
||||
void Command_SearchNextInSearch() {
|
||||
void CMD_SearchNextInSearch() {
|
||||
SearchWindowFindNext(true);
|
||||
}
|
||||
|
||||
void Command_SearchPrevInSearch() {
|
||||
void CMD_SearchPrevInSearch() {
|
||||
SearchWindowFindNext(false);
|
||||
}
|
||||
|
||||
void Command_SearchNext() {
|
||||
void CMD_SearchNext() {
|
||||
SearchWindowFindNext(true);
|
||||
} RegisterCommand(Command_SearchNext, "f3");
|
||||
} RegisterCommand(CMD_SearchNext, "f3");
|
||||
|
||||
void Command_SearchPrev() {
|
||||
void CMD_SearchPrev() {
|
||||
SearchWindowFindNext(false);
|
||||
} RegisterCommand(Command_SearchPrev, "shift-f3");
|
||||
} RegisterCommand(CMD_SearchPrev, "shift-f3");
|
||||
|
||||
void SearchAll() {
|
||||
Scratch scratch;
|
||||
@@ -53,19 +53,19 @@ void SearchAll() {
|
||||
}
|
||||
}
|
||||
|
||||
void Command_SearchAll() {
|
||||
void CMD_SearchAll() {
|
||||
SearchAll();
|
||||
BSet set = GetBSet(SearchWindowID);
|
||||
set.window->visible = false;
|
||||
} RegisterCommand(Command_SearchAll, "alt-f3");
|
||||
} RegisterCommand(CMD_SearchAll, "alt-f3");
|
||||
|
||||
void Command_ToggleCaseSensitiveSearch() {
|
||||
void CMD_ToggleCaseSensitiveSearch() {
|
||||
SearchCaseSensitive = !SearchCaseSensitive;
|
||||
} RegisterCommand(Command_ToggleCaseSensitiveSearch, "alt-c");
|
||||
} RegisterCommand(CMD_ToggleCaseSensitiveSearch, "alt-c");
|
||||
|
||||
void Command_ToggleSearchWordBoundary() {
|
||||
void CMD_ToggleSearchWordBoundary() {
|
||||
SearchWordBoundary = !SearchWordBoundary;
|
||||
} RegisterCommand(Command_ToggleSearchWordBoundary, "alt-w");
|
||||
} RegisterCommand(CMD_ToggleSearchWordBoundary, "alt-w");
|
||||
|
||||
void SearchWindowUpdate() {
|
||||
BSet active = GetBSet(ActiveWindowID);
|
||||
@@ -107,7 +107,7 @@ void SearchWindowInit() {
|
||||
window->visible = false;
|
||||
window->lose_visibility_on_escape = true;
|
||||
window->jump_history = false;
|
||||
AddHook(&view->hooks, "SearchAll", "alt-enter", Command_SearchAll);
|
||||
AddHook(&view->hooks, "SearchPrevInSearch", "shift-enter", Command_SearchPrevInSearch);
|
||||
AddHook(&view->hooks, "SearchNextInSearch", "enter", Command_SearchNextInSearch);
|
||||
AddHook(&view->hooks, "SearchAll", "alt-enter", CMD_SearchAll);
|
||||
AddHook(&view->hooks, "SearchPrevInSearch", "shift-enter", CMD_SearchPrevInSearch);
|
||||
AddHook(&view->hooks, "SearchNextInSearch", "enter", CMD_SearchNextInSearch);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user