From 2992e62306c032575087e1f9f22cef1a66450fbe Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 20:11:18 -0800 Subject: [PATCH 01/40] Setup cool new opengl funcs --- custom/generated/command_metadata.h | 2 +- opengl/4ed_opengl_funcs.h | 25 ++++++++++++++++++++----- platform_mac/mac_4ed_opengl_funcs.h | 1 + 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index 33fa492a..19059348 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -479,7 +479,7 @@ static Command_Metadata fcoder_metacmd_table[238] = { { PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 415 }, { PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 445 }, { PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 808 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "W:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1175 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "W:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1176 }, { PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 20 }, { PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 34 }, { PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 }, diff --git a/opengl/4ed_opengl_funcs.h b/opengl/4ed_opengl_funcs.h index 12d2e74e..4c2e65d8 100644 --- a/opengl/4ed_opengl_funcs.h +++ b/opengl/4ed_opengl_funcs.h @@ -13,19 +13,21 @@ #include "4ed_opengl_funcs.h" */ +#if OS_WINDOWS || OS_LINUX GL_FUNC(glDebugMessageControl, void, (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)) GL_FUNC(glDebugMessageCallback, void, (GLDEBUGPROC callback, const void *userParam)) -#ifndef OS_LINUX +GL_FUNC(glGenVertexArrays, void, (GLsizei n, GLuint *arrays)) +GL_FUNC(glBindVertexArray, void, (GLuint array)) + +GL_FUNC(glDeleteVertexArrays, void, (GLsizei n, const GLuint *arrays)) + +#if !OS_LINUX GL_FUNC(glTexImage3D, void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)) GL_FUNC(glTexSubImage3D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)) GL_FUNC(glActiveTexture, void, (GLenum texture)) #endif -GL_FUNC(glGenVertexArrays, void, (GLsizei n, GLuint *arrays)) -GL_FUNC(glBindVertexArray, void, (GLuint array)) -GL_FUNC(glDeleteVertexArrays, void, (GLsizei n, const GLuint *arrays)) - GL_FUNC(glGenBuffers, void, (GLsizei n, GLuint *buffers)) GL_FUNC(glBindBuffer, void, (GLenum target, GLuint buffer)) GL_FUNC(glBufferData, void, (GLenum target, GLsizeiptr size, const void *data, GLenum usage)) @@ -54,6 +56,7 @@ GL_FUNC(glDisableVertexAttribArray, void, (GLuint index)) GL_FUNC(glEnableVertexAttribArray, void, (GLuint index)) GL_FUNC(glVertexAttribPointer, void, (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer)) + GL_FUNC(glVertexAttribIPointer, void, (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)) GL_FUNC(glUniform1f, void, (GLint location, GLfloat v0)) @@ -87,6 +90,18 @@ GL_FUNC(glBlitFramebuffer, void, (GLint srcX0, GLint srcY0, GLint srcX1, GLint s GL_FUNC(glTexImage2DMultisample, void, (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)) +#elif OS_MAC + +GL_FUNC(glDebugMessageControl, void, (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)) +GL_FUNC(glDebugMessageCallback, void, (GLDEBUGPROC callback, const void *userParam)) + +GL_FUNC(glGenVertexArrays, void, (GLsizei n, GLuint *arrays)) +GL_FUNC(glBindVertexArray, void, (GLuint array)) + +GL_FUNC(glVertexAttribIPointer, void, (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)) + +#endif + #undef GL_FUNC // BOTTOM diff --git a/platform_mac/mac_4ed_opengl_funcs.h b/platform_mac/mac_4ed_opengl_funcs.h index 649847f9..3d603e67 100644 --- a/platform_mac/mac_4ed_opengl_funcs.h +++ b/platform_mac/mac_4ed_opengl_funcs.h @@ -6,6 +6,7 @@ #include "4ed_opengl_funcs.h" */ +// TODO(allen): eliminate this GL_FUNC(glDebugMessageControl, void, (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)) GL_FUNC(glDebugMessageCallback, void, (GLDEBUGPROC callback, const void *userParam)) From a093268fc3e04150d09fe64dbc42744c1a0d1793 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 20:24:13 -0800 Subject: [PATCH 02/40] Cleaning up build scripts --- bin/{build.sh => build-linux.sh} | 5 +---- bin/build-mac.sh | 4 ---- 2 files changed, 1 insertion(+), 8 deletions(-) rename bin/{build.sh => build-linux.sh} (83%) mode change 100755 => 100644 diff --git a/bin/build.sh b/bin/build-linux.sh old mode 100755 new mode 100644 similarity index 83% rename from bin/build.sh rename to bin/build-linux.sh index 0d01ab2d..ff944b59 --- a/bin/build.sh +++ b/bin/build-linux.sh @@ -4,6 +4,7 @@ set -e # Set up directories (mirrors build.bat) + ME="$(readlink -f "$0")" LOCATION="$(dirname "$ME")" SRC_ROOT="$(dirname "$LOCATION")" @@ -26,11 +27,7 @@ fi chmod +rx "$BIN_ROOT/detect_os.sh" os=$("$BIN_ROOT/detect_os.sh") -if [[ "$os" == "linux" ]]; then WARNINGS="-Wno-write-strings -Wno-comment" -elif [[ "$os" == "mac" ]]; then -WARNINGS="-Wno-write-strings -Wno-comment -Wno-logical-op-parentheses -Wno-null-dereference -Wno-switch" -fi FLAGS="-D_GNU_SOURCE -fPIC -fpermissive $BUILD_MODE" INCLUDES="-I$SRC_ROOT -I$CUSTOM_ROOT" diff --git a/bin/build-mac.sh b/bin/build-mac.sh index 83062702..01fb3286 100755 --- a/bin/build-mac.sh +++ b/bin/build-mac.sh @@ -27,11 +27,7 @@ fi chmod +rx "$BIN_ROOT/detect_os.sh" os=$("$BIN_ROOT/detect_os.sh") -if [[ "$os" == "linux" ]]; then -WARNINGS="-Wno-write-strings -Wno-comment" -elif [[ "$os" == "mac" ]]; then WARNINGS="-Wno-write-strings -Wno-comment -Wno-null-dereference -Wno-logical-op-parentheses -Wno-switch" -fi FLAGS="-D_GNU_SOURCE -fPIC -fpermissive $BUILD_MODE" INCLUDES="-I$SRC_ROOT -I$CUSTOM_ROOT" From e3de45ce32540d647d490654c4f407deaaa704f9 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 20:32:46 -0800 Subject: [PATCH 03/40] add c++11 to GCC options --- bin/4ed_build.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/4ed_build.cpp b/bin/4ed_build.cpp index 7e054818..a69e49f5 100644 --- a/bin/4ed_build.cpp +++ b/bin/4ed_build.cpp @@ -294,7 +294,8 @@ build(Arena *arena, u32 flags, u32 arch, char *code_path, char **code_files, cha "-Wno-write-strings " \ "-D_GNU_SOURCE -fPIC " \ "-fno-threadsafe-statics -pthread " \ -"-Wno-unused-result" +"-Wno-unused-result" \ +"-std=c++11" #define GCC_LIBS_COMMON \ "-lX11 -lpthread -lm -lrt " \ From 54aa02f0f4b84f4b0fa61e9c3d23a24c13233c41 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 20:41:09 -0800 Subject: [PATCH 04/40] BLah blah blAH --- bin/4ed_build.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/4ed_build.cpp b/bin/4ed_build.cpp index a69e49f5..1a861639 100644 --- a/bin/4ed_build.cpp +++ b/bin/4ed_build.cpp @@ -374,6 +374,7 @@ build(Arena *arena, u32 flags, u32 arch, char *code_path, char **code_files, cha fm_finish_build_line(&line); Temp_Dir temp = fm_pushdir(out_path); + printf("g++ %s -o %s", line.build_options, out_file); systemf("g++ %s -o %s", line.build_options, out_file); fm_popdir(temp); } From 57f7d41ddf9c5d0edfbf9e256609586f0c744479 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 20:47:29 -0800 Subject: [PATCH 05/40] Foo bar blah lbha --- bin/build-linux.sh | 7 ++----- bin/build-mac.sh | 6 +----- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/bin/build-linux.sh b/bin/build-linux.sh index ff944b59..3099577d 100644 --- a/bin/build-linux.sh +++ b/bin/build-linux.sh @@ -3,7 +3,7 @@ # If any command errors, stop the script set -e -# Set up directories (mirrors build.bat) +# Set up directories ME="$(readlink -f "$0")" LOCATION="$(dirname "$ME")" @@ -23,16 +23,13 @@ if [ -z "$BUILD_MODE" ]; then BUILD_MODE="-DDEV_BUILD" fi -# Get the OS specific flags -chmod +rx "$BIN_ROOT/detect_os.sh" -os=$("$BIN_ROOT/detect_os.sh") - WARNINGS="-Wno-write-strings -Wno-comment" FLAGS="-D_GNU_SOURCE -fPIC -fpermissive $BUILD_MODE" INCLUDES="-I$SRC_ROOT -I$CUSTOM_ROOT" # Execute +echo g++ $WARNINGS $FLAGS $INCLUDES "$BIN_ROOT/4ed_build.cpp" -g -o "$BUILD_ROOT/build" g++ $WARNINGS $FLAGS $INCLUDES "$BIN_ROOT/4ed_build.cpp" -g -o "$BUILD_ROOT/build" pushd "$SRC_ROOT" "$BUILD_ROOT/build" diff --git a/bin/build-mac.sh b/bin/build-mac.sh index 01fb3286..adae8015 100755 --- a/bin/build-mac.sh +++ b/bin/build-mac.sh @@ -3,7 +3,7 @@ # If any command errors, stop the script set -e -# Set up directories (mirrors build.bat) +# Set up directories # NOTE(yuval): Replaced readlink with realpath which works for both macOS and Linux ME="$(realpath "$0")" LOCATION="$(dirname "$ME")" @@ -23,10 +23,6 @@ if [ -z "$BUILD_MODE" ]; then BUILD_MODE="-DDEV_BUILD" fi -# Get the OS specific flags -chmod +rx "$BIN_ROOT/detect_os.sh" -os=$("$BIN_ROOT/detect_os.sh") - WARNINGS="-Wno-write-strings -Wno-comment -Wno-null-dereference -Wno-logical-op-parentheses -Wno-switch" FLAGS="-D_GNU_SOURCE -fPIC -fpermissive $BUILD_MODE" From 1f2b9c7541f3ba46c15dbfa13c872a46f17da6a3 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 20:55:01 -0800 Subject: [PATCH 06/40] ETC ETC --- bin/4ed_build.cpp | 3 +-- bin/build-linux.sh | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/bin/4ed_build.cpp b/bin/4ed_build.cpp index 1a861639..55741d53 100644 --- a/bin/4ed_build.cpp +++ b/bin/4ed_build.cpp @@ -294,7 +294,7 @@ build(Arena *arena, u32 flags, u32 arch, char *code_path, char **code_files, cha "-Wno-write-strings " \ "-D_GNU_SOURCE -fPIC " \ "-fno-threadsafe-statics -pthread " \ -"-Wno-unused-result" \ +"-Wno-unused-result " \ "-std=c++11" #define GCC_LIBS_COMMON \ @@ -374,7 +374,6 @@ build(Arena *arena, u32 flags, u32 arch, char *code_path, char **code_files, cha fm_finish_build_line(&line); Temp_Dir temp = fm_pushdir(out_path); - printf("g++ %s -o %s", line.build_options, out_file); systemf("g++ %s -o %s", line.build_options, out_file); fm_popdir(temp); } diff --git a/bin/build-linux.sh b/bin/build-linux.sh index 3099577d..bce5f56f 100644 --- a/bin/build-linux.sh +++ b/bin/build-linux.sh @@ -29,7 +29,6 @@ FLAGS="-D_GNU_SOURCE -fPIC -fpermissive $BUILD_MODE" INCLUDES="-I$SRC_ROOT -I$CUSTOM_ROOT" # Execute -echo g++ $WARNINGS $FLAGS $INCLUDES "$BIN_ROOT/4ed_build.cpp" -g -o "$BUILD_ROOT/build" g++ $WARNINGS $FLAGS $INCLUDES "$BIN_ROOT/4ed_build.cpp" -g -o "$BUILD_ROOT/build" pushd "$SRC_ROOT" "$BUILD_ROOT/build" From 34a968a058678e89bdaa0aa6efacaf08a1b11c28 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 21:04:52 -0800 Subject: [PATCH 07/40] Even more of previous --- platform_linux/linux_4ed_functions.cpp | 186 ++++++++++++------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/platform_linux/linux_4ed_functions.cpp b/platform_linux/linux_4ed_functions.cpp index 2cebb4d0..db0e400d 100644 --- a/platform_linux/linux_4ed_functions.cpp +++ b/platform_linux/linux_4ed_functions.cpp @@ -11,7 +11,7 @@ internal String_Const_u8 system_get_path(Arena* arena, System_Path_Code path_code){ String_Const_u8 result = {}; - + switch (path_code){ case SystemPath_CurrentDirectory: { // glibc extension: getcwd allocates its own memory if passed NULL @@ -19,70 +19,70 @@ system_get_path(Arena* arena, System_Path_Code path_code){ u64 working_dir_len = cstring_length(working_dir); u8 *out = push_array(arena, u8, working_dir_len + 1); block_copy(out, working_dir, working_dir_len); - + // NOTE: 4ed appears to expect a slash on the end. out[working_dir_len] = '/'; - + free(working_dir); result = SCu8(out, working_dir_len + 1); } break; - + case SystemPath_Binary: { // linux-specific: binary path symlinked at /proc/self/exe // PATH_MAX is probably good enough... // read the 'readlink' manpage for some comedy about it being 'broken by design'. - + char* buf = push_array(arena, char, PATH_MAX); ssize_t n = readlink("/proc/self/exe", buf, PATH_MAX); - + if(n == -1) { perror("readlink"); *buf = n = 0; } - + result = string_remove_last_folder(SCu8(buf, n)); } break; } - + return(result); } internal String_Const_u8 system_get_canonical(Arena* arena, String_Const_u8 name){ - + // first remove redundant ../, //, ./ parts - + const u8* input = (u8*) strndupa((char*)name.str, name.size); u8* output = push_array(arena, u8, name.size + 1); - + const u8* p = input; u8* q = output; - + while(*p) { - + // not a slash - copy char if(p[0] != '/') { *q++ = *p++; continue; } - + // two slashes in a row, skip one. if(p[1] == '/') { ++p; } else if(p[1] == '.') { - + // skip "/./" or trailing "/." if(p[2] == '/' || p[2] == '\0') { p += 2; } - + // if we encounter "/../" or trailing "/..", remove last directory instead else if(p[2] == '.' && (p[3] == '/' || p[3] == '\0')) { while(q > output && *--q != '/'){}; p += 3; } - + else { *q++ = *p++; } @@ -91,13 +91,13 @@ system_get_canonical(Arena* arena, String_Const_u8 name){ *q++ = *p++; } } - + #ifdef INSO_DEBUG if(name.size != q - output) { LINUX_FN_DEBUG("[%.*s] -> [%.*s]", (int)name.size, name.str, (int)(q - output), output); } #endif - + // TODO: use realpath at this point to resolve symlinks? return SCu8(output, q - output); } @@ -106,57 +106,57 @@ internal File_List system_get_file_list(Arena* arena, String_Const_u8 directory){ //LINUX_FN_DEBUG("%.*s", (int)directory.size, directory.str); File_List result = {}; - + char* path = strndupa((char*)directory.str, directory.size); int fd = open(path, O_RDONLY | O_DIRECTORY); if(fd == -1) { perror("open"); return result; } - + DIR* dir = fdopendir(fd); struct dirent* d; - + File_Info* head = NULL; File_Info** fip = &head; - + while((d = readdir(dir))) { const char* name = d->d_name; - + // ignore . and .. if(*name == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) { continue; } - + *fip = push_array(arena, File_Info, 1); (*fip)->file_name = push_u8_stringf(arena, "%.*s", d->d_reclen, name); - + struct stat st; if(fstatat(fd, name, &st, 0) == -1){ perror("fstatat"); } - + (*fip)->attributes = linux_file_attributes_from_struct_stat(&st); fip = &(*fip)->next; result.count++; } closedir(dir); - + if(result.count > 0) { result.infos = fip = push_array(arena, File_Info*, result.count); - + for(File_Info* f = head; f; f = f->next) { *fip++ = f; } - + qsort(result.infos, result.count, sizeof(File_Info*), (__compar_fn_t)&linux_compare_file_infos); - + for(u32 i = 0; i < result.count - 1; ++i) { result.infos[i]->next = result.infos[i+1]; } result.infos[result.count-1]->next = NULL; } - + return result; } @@ -209,9 +209,9 @@ internal File_Attributes system_save_file(Arena* scratch, char* file_name, String_Const_u8 data){ LINUX_FN_DEBUG("%s", file_name); File_Attributes result = {}; - + // TODO(inso): should probably put a \n on the end if it's a text file. - + int fd = open(file_name, O_WRONLY, O_CREAT); if (fd != -1) { int bytes_written = write(fd, data.str, data.size); @@ -225,7 +225,7 @@ system_save_file(Arena* scratch, char* file_name, String_Const_u8 data){ } else { perror("open"); } - + return result; } @@ -265,7 +265,7 @@ system_wake_up_timer_create(void){ LINUX_FN_DEBUG(); Linux_Object* object = linux_alloc_object(LinuxObjectKind_Timer); dll_insert(&linuxvars.timer_objects, &object->node); - + // NOTE(inso): timers created on-demand to avoid file-descriptor exhaustion. object->timer.fd = -1; } @@ -287,23 +287,23 @@ internal void system_wake_up_timer_set(Plat_Handle handle, u32 time_milliseconds){ //LINUX_FN_DEBUG("%u", time_milliseconds); Linux_Object* object = handle_to_object(handle); - + if (object->kind == LinuxObjectKind_Timer){ if(object->timer.fd == -1) { object->timer.fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC); - + struct epoll_event ev; ev.events = EPOLLIN | EPOLLET | EPOLLONESHOT; ev.data.ptr = &object->timer.epoll_tag; epoll_ctl(linuxvars.epoll, EPOLL_CTL_ADD, object->timer.fd, &ev); } - + struct itimerspec it = {}; it.it_value.tv_sec = time_milliseconds / 1000; it.it_value.tv_nsec = (time_milliseconds % 1000) * UINT64_C(1000000); timerfd_settime(object->timer.fd, 0, &it, NULL); } - + } internal void @@ -358,28 +358,28 @@ system_cli_call(Arena* scratch, char* path, char* script, CLI_Handles* cli_out){ perror("system_cli_call: pipe"); return 0; } - + pid_t child_pid = vfork(); if (child_pid == -1){ perror("system_cli_call: fork"); return 0; } - + enum { PIPE_FD_READ, PIPE_FD_WRITE }; - + // child if (child_pid == 0){ close(pipe_fds[PIPE_FD_READ]); dup2(pipe_fds[PIPE_FD_WRITE], STDOUT_FILENO); dup2(pipe_fds[PIPE_FD_WRITE], STDERR_FILENO); - + if (chdir(path) == -1){ perror("system_cli_call: chdir"); exit(1); } - + char* argv[] = { "sh", "-c", script, NULL }; - + if (execv("/bin/sh", argv) == -1){ perror("system_cli_call: execv"); } @@ -387,17 +387,17 @@ system_cli_call(Arena* scratch, char* path, char* script, CLI_Handles* cli_out){ } else{ close(pipe_fds[PIPE_FD_WRITE]); - + *(pid_t*)&cli_out->proc = child_pid; *(int*)&cli_out->out_read = pipe_fds[PIPE_FD_READ]; *(int*)&cli_out->out_write = pipe_fds[PIPE_FD_WRITE]; - + struct epoll_event e = {}; e.events = EPOLLIN | EPOLLET; e.data.ptr = &epoll_tag_cli_pipe; epoll_ctl(linuxvars.epoll, EPOLL_CTL_ADD, pipe_fds[PIPE_FD_READ], &e); } - + return(true); } @@ -411,16 +411,16 @@ internal b32 system_cli_update_step(CLI_Handles* cli, char* dest, u32 max, u32* amount){ LINUX_FN_DEBUG(); int pipe_read_fd = *(int*)&cli->out_read; - + fd_set fds; FD_ZERO(&fds); FD_SET(pipe_read_fd, &fds); - + struct timeval tv = {}; - + size_t space_left = max; char* ptr = dest; - + while (space_left > 0 && select(pipe_read_fd + 1, &fds, NULL, NULL, &tv) == 1){ ssize_t num = read(pipe_read_fd, ptr, space_left); if (num == -1){ @@ -433,7 +433,7 @@ system_cli_update_step(CLI_Handles* cli, char* dest, u32 max, u32* amount){ space_left -= num; } } - + *amount = (ptr - dest); return((ptr - dest) > 0); } @@ -443,16 +443,16 @@ system_cli_end_update(CLI_Handles* cli){ LINUX_FN_DEBUG(); pid_t pid = *(pid_t*)&cli->proc; b32 close_me = false; - + int status; if (pid && waitpid(pid, &status, WNOHANG) > 0){ cli->exit = WEXITSTATUS(status); - + close_me = true; close(*(int*)&cli->out_read); close(*(int*)&cli->out_write); } - + return(close_me); } @@ -484,28 +484,28 @@ internal System_Thread system_thread_launch(Thread_Function* proc, void* ptr){ LINUX_FN_DEBUG(); System_Thread result = {}; - + Linux_Object* thread_info = linux_alloc_object(LinuxObjectKind_Thread); thread_info->thread.proc = proc; thread_info->thread.ptr = ptr; - + pthread_attr_t thread_attr; pthread_attr_init(&thread_attr); int create_result = pthread_create( - &thread_info->thread.pthread, - &thread_attr, - linux_thread_proc_start, - thread_info); - + &thread_info->thread.pthread, + &thread_attr, + linux_thread_proc_start, + thread_info); + pthread_attr_destroy(&thread_attr); - + // TODO(andrew): Need to wait for thread to confirm it launched? if (create_result == 0) { - static_assert(sizeof(Linux_Object*) <= sizeof(System_Thread)); + static_assert(sizeof(Linux_Object*) <= sizeof(System_Thread), "Linux_Object doesn't fit inside System_Thread"); *(Linux_Object**)&result = thread_info; return result; } - + return result; } @@ -626,31 +626,31 @@ system_condition_variable_free(System_Condition_Variable cv){ internal void* system_memory_allocate(u64 size, String_Const_u8 location){ - - static_assert(MEMORY_PREFIX_SIZE >= sizeof(Memory_Annotation_Node)); + + static_assert(MEMORY_PREFIX_SIZE >= sizeof(Memory_Annotation_Node), "MEMORY_PREFIX_SIZE is not enough to contain Memory_Annotation_Node"); u64 adjusted_size = size + MEMORY_PREFIX_SIZE; - + Assert(adjusted_size > size); - + const int prot = PROT_READ | PROT_WRITE; const int flags = MAP_PRIVATE | MAP_ANONYMOUS; - + void* result = mmap(NULL, adjusted_size, prot, flags, -1, 0); - + if(result == MAP_FAILED) { perror("mmap"); return NULL; } - + Linux_Memory_Tracker_Node* node = (Linux_Memory_Tracker_Node*)result; node->location = location; node->size = size; - + pthread_mutex_lock(&linuxvars.memory_tracker_mutex); zdll_push_back(linuxvars.memory_tracker_head, linuxvars.memory_tracker_tail, node); linuxvars.memory_tracker_count++; pthread_mutex_unlock(&linuxvars.memory_tracker_mutex); - + return (u8*)result + MEMORY_PREFIX_SIZE; } @@ -669,12 +669,12 @@ internal void system_memory_free(void* ptr, u64 size){ u64 adjusted_size = size + MEMORY_PREFIX_SIZE; Linux_Memory_Tracker_Node* node = (Linux_Memory_Tracker_Node*)((u8*)ptr - MEMORY_PREFIX_SIZE); - + pthread_mutex_lock(&linuxvars.memory_tracker_mutex); zdll_remove(linuxvars.memory_tracker_head, linuxvars.memory_tracker_tail, node); linuxvars.memory_tracker_count--; pthread_mutex_unlock(&linuxvars.memory_tracker_mutex); - + if(munmap(node, adjusted_size) == -1) { perror("munmap"); } @@ -683,12 +683,12 @@ system_memory_free(void* ptr, u64 size){ internal Memory_Annotation system_memory_annotation(Arena* arena){ LINUX_FN_DEBUG(); - + Memory_Annotation result; Memory_Annotation_Node** ptr = &result.first; - + pthread_mutex_lock(&linuxvars.memory_tracker_mutex); - + for(Linux_Memory_Tracker_Node* node = linuxvars.memory_tracker_head; node; node = node->next) { *ptr = push_array(arena, Memory_Annotation_Node, 1); (*ptr)->location = node->location; @@ -697,25 +697,25 @@ system_memory_annotation(Arena* arena){ ptr = &(*ptr)->next; result.count++; } - + pthread_mutex_unlock(&linuxvars.memory_tracker_mutex); - + *ptr = NULL; result.last = CastFromMember(Memory_Annotation_Node, next, ptr); - + return result; } internal void system_show_mouse_cursor(i32 show){ LINUX_FN_DEBUG("%d", show); - + linuxvars.cursor_show = show; - + XDefineCursor( - linuxvars.dpy, - linuxvars.win, - show ? None : linuxvars.hidden_cursor); + linuxvars.dpy, + linuxvars.win, + show ? None : linuxvars.hidden_cursor); } internal b32 @@ -727,11 +727,11 @@ system_set_fullscreen(b32 full_screen){ internal b32 system_is_fullscreen(void){ b32 result = 0; - + // NOTE(inso): This will get the "true" state of fullscreen, // even if it was toggled outside of 4coder. // (e.g. super-F11 on some WMs sets fullscreen for any window/program) - + Atom type, *prop; unsigned long nitems, pad; int fmt; @@ -741,12 +741,12 @@ system_is_fullscreen(void){ 0, 32, False, XA_ATOM, &type, &fmt, &nitems, &pad, (unsigned char**)&prop); - + if(ret == Success && prop){ result = *prop == linuxvars.atom__NET_WM_STATE_FULLSCREEN; XFree((unsigned char*)prop); } - + return result; } From f0421c12b52920fc1470dd56a26d22e6ff51db20 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 21:18:38 -0800 Subject: [PATCH 08/40] AHHHGGG --- custom/bin/buildsuper_x64-linux.sh | 5 +++-- custom/bin/buildsuper_x64-mac.sh | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/custom/bin/buildsuper_x64-linux.sh b/custom/bin/buildsuper_x64-linux.sh index 988b4c43..51a3051b 100644 --- a/custom/bin/buildsuper_x64-linux.sh +++ b/custom/bin/buildsuper_x64-linux.sh @@ -14,12 +14,13 @@ if [ -z "$SOURCE" ]; then SOURCE="$(readlink -f "$CODE_HOME/4coder_default_bindings.cpp")" fi -opts="-Wno-write-strings -Wno-null-dereference -Wno-comment -Wno-switch -Wno-writable-strings -g -DOS_LINUX=1 -DOS_WINDOWS=0 -DOS_MAC=1" + +opts="-Wno-write-strings -Wno-null-dereference -Wno-comment -Wno-switch -Wno-missing-declarations -Wno-logical-op-parentheses -g -DOS_LINUX=1 -DOS_WINDOWS=0 -DOS_MAC=1" arch=-m64 preproc_file=4coder_command_metadata.i meta_macros="-DMETA_PASS" -g++ -I"$CODE_HOME" $meta_macros $arch $opts $debug -std=gnu++0x "$SOURCE" -E -o $preproc_file +g++ -I"$CODE_HOME" $meta_macros $arch $opts $debug -std=c++11 "$SOURCE" -E -o $preproc_file g++ -I"$CODE_HOME" $opts $debug -std=gnu++0x "$CODE_HOME/4coder_metadata_generator.cpp" -o "$CODE_HOME/metadata_generator" "$CODE_HOME/metadata_generator" -R "$CODE_HOME" "$PWD/$preproc_file" diff --git a/custom/bin/buildsuper_x64-mac.sh b/custom/bin/buildsuper_x64-mac.sh index f18a1466..57a1f8cf 100755 --- a/custom/bin/buildsuper_x64-mac.sh +++ b/custom/bin/buildsuper_x64-mac.sh @@ -20,8 +20,8 @@ arch=-m64 preproc_file=4coder_command_metadata.i meta_macros="-DMETA_PASS" -clang++ -I"$CODE_HOME" $meta_macros $arch $opts $debug -std=gnu++0x "$SOURCE" -E -o $preproc_file -clang++ -I"$CODE_HOME" $opts $debug -std=gnu++0x "$CODE_HOME/4coder_metadata_generator.cpp" -o "$CODE_HOME/metadata_generator" +clang++ -I"$CODE_HOME" $meta_macros $arch $opts $debug -std=c++11 "$SOURCE" -E -o $preproc_file +clang++ -I"$CODE_HOME" $opts $debug -std=c++11 "$CODE_HOME/4coder_metadata_generator.cpp" -o "$CODE_HOME/metadata_generator" "$CODE_HOME/metadata_generator" -R "$CODE_HOME" "$PWD/$preproc_file" clang++ -I"$CODE_HOME" $arch $opts $debug -std=c++11 "$SOURCE" -shared -o custom_4coder.so -fPIC From 0422dadbc8832816f626c07ae3e2ea335f3a478c Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 21:32:07 -0800 Subject: [PATCH 09/40] Ohh git --- custom/4coder_custom.cpp | 1 + custom/bin/buildsuper_x64-linux.sh | 2 +- platform_linux/linux_4ed.cpp | 675 +++++++++++++++-------------- 3 files changed, 340 insertions(+), 338 deletions(-) diff --git a/custom/4coder_custom.cpp b/custom/4coder_custom.cpp index 3dda1c74..976c10da 100644 --- a/custom/4coder_custom.cpp +++ b/custom/4coder_custom.cpp @@ -6,6 +6,7 @@ extern "C" b32 get_version(i32 maj, i32 min, i32 patch){ + printf("CUS: %d.%d.%d\n", MAJOR, MINOR, PATCH); return(maj == MAJOR && min == MINOR && patch == PATCH); } diff --git a/custom/bin/buildsuper_x64-linux.sh b/custom/bin/buildsuper_x64-linux.sh index 51a3051b..7b975b16 100644 --- a/custom/bin/buildsuper_x64-linux.sh +++ b/custom/bin/buildsuper_x64-linux.sh @@ -21,7 +21,7 @@ arch=-m64 preproc_file=4coder_command_metadata.i meta_macros="-DMETA_PASS" g++ -I"$CODE_HOME" $meta_macros $arch $opts $debug -std=c++11 "$SOURCE" -E -o $preproc_file -g++ -I"$CODE_HOME" $opts $debug -std=gnu++0x "$CODE_HOME/4coder_metadata_generator.cpp" -o "$CODE_HOME/metadata_generator" +g++ -I"$CODE_HOME" $opts $debug -std=c++11 "$CODE_HOME/4coder_metadata_generator.cpp" -o "$CODE_HOME/metadata_generator" "$CODE_HOME/metadata_generator" -R "$CODE_HOME" "$PWD/$preproc_file" g++ -I"$CODE_HOME" $arch $opts $debug -std=gnu++0x "$SOURCE" -shared -o custom_4coder.so -fPIC diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 66444b7f..e34176d1 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -101,18 +101,18 @@ #include #ifdef INSO_DEBUG - #define LINUX_FN_DEBUG(fmt, ...) do { \ - fprintf(stderr, "%s: " fmt "\n", __func__, ##__VA_ARGS__);\ - } while (0) +#define LINUX_FN_DEBUG(fmt, ...) do { \ +fprintf(stderr, "%s: " fmt "\n", __func__, ##__VA_ARGS__);\ +} while (0) // I want to see a message - #undef AssertBreak - #define AssertBreak(m) ({\ - fprintf(stderr, "\n** ASSERTION FAILURE: %s:%d: %s\n\n", __FILE__, __LINE__, #m);\ +#undef AssertBreak +#define AssertBreak(m) ({\ +fprintf(stderr, "\n** ASSERTION FAILURE: %s:%d: %s\n\n", __FILE__, __LINE__, #m);\ *((volatile u64*)0) = 0xba771e70ad5;\ - }) +}) #else - #define LINUX_FN_DEBUG(...) +#define LINUX_FN_DEBUG(...) #endif //////////////////////////// @@ -150,46 +150,46 @@ struct Linux_Memory_Tracker_Node { struct Linux_Vars { Thread_Context tctx; Arena *frame_arena; - + Display* dpy; Window win; - + b32 has_xfixes; int xfixes_selection_event; XIM xim; XIC xic; FcConfig* fontconfig; XkbDescPtr xkb; - + Linux_Input_Chunk input; int xkb_event; int xkb_group; // active keyboard layout (0-3) - + int epoll; int step_timer_fd; u64 last_step_time; b32 step_pending; - + XCursor xcursors[APP_MOUSE_CURSOR_COUNT]; Application_Mouse_Cursor cursor; XCursor hidden_cursor; i32 cursor_show; i32 prev_cursor_show; - + Node free_linux_objects; Node timer_objects; - + System_Mutex global_frame_mutex; pthread_mutex_t memory_tracker_mutex; Linux_Memory_Tracker_Node* memory_tracker_head; Linux_Memory_Tracker_Node* memory_tracker_tail; int memory_tracker_count; - + Arena* clipboard_arena; String_Const_u8 clipboard_contents; b32 received_new_clipboard; b32 clipboard_catch_all; - + Atom atom_TARGETS; Atom atom_CLIPBOARD; Atom atom_UTF8_STRING; @@ -267,19 +267,19 @@ handle_to_object(Plat_Handle ph){ internal Linux_Object* linux_alloc_object(Linux_Object_Kind kind){ Linux_Object* result = NULL; - + if (linuxvars.free_linux_objects.next != &linuxvars.free_linux_objects) { result = CastFromMember(Linux_Object, node, linuxvars.free_linux_objects.next); } - + if (result == NULL) { i32 count = 512; - + Linux_Object* objects = (Linux_Object*)system_memory_allocate( - sizeof(Linux_Object) * count, - file_name_line_number_lit_u8 - ); - + sizeof(Linux_Object) * count, + file_name_line_number_lit_u8 + ); + objects[0].node.prev = &linuxvars.free_linux_objects; linuxvars.free_linux_objects.next = &objects[0].node; for (i32 i = 1; i < count; ++i) { @@ -288,10 +288,10 @@ linux_alloc_object(Linux_Object_Kind kind){ } objects[count - 1].node.next = &linuxvars.free_linux_objects; linuxvars.free_linux_objects.prev = &objects[count - 1].node; - + result = CastFromMember(Linux_Object, node, linuxvars.free_linux_objects.next); } - + Assert(result != 0); dll_remove(&result->node); block_zero_struct(result); @@ -313,12 +313,12 @@ internal int linux_compare_file_infos(File_Info** a, File_Info** b) { b32 a_hidden = (*a)->file_name.str[0] == '.'; b32 b_hidden = (*b)->file_name.str[0] == '.'; - + // hidden files lower in list if(a_hidden != b_hidden) { return a_hidden - b_hidden; } - + // push_stringf seems to null terminate return strcoll((char*)(*a)->file_name.str, (char*)(*b)->file_name.str); } @@ -361,18 +361,18 @@ linux_schedule_step(){ if(!__sync_bool_compare_and_swap(&linuxvars.step_pending, 0, 1)) { return; } - + u64 now = system_now_time(); u64 diff = (now - linuxvars.last_step_time); - + struct itimerspec its = {}; - + if(diff >= frame_nseconds) { its.it_value.tv_nsec = 1; } else { its.it_value.tv_nsec = frame_nseconds - diff; } - + timerfd_settime(linuxvars.step_timer_fd, 0, &its, NULL); } @@ -385,7 +385,7 @@ enum wm_state_mode { internal void linux_set_wm_state(Atom one, Atom two, enum wm_state_mode mode){ //NOTE(inso): this will only work after the window has been mapped - + XEvent e = {}; e.xany.type = ClientMessage; e.xclient.message_type = linuxvars.atom__NET_WM_STATE; @@ -395,7 +395,7 @@ linux_set_wm_state(Atom one, Atom two, enum wm_state_mode mode){ e.xclient.data.l[1] = one; e.xclient.data.l[2] = two; e.xclient.data.l[3] = 1L; - + XSendEvent(linuxvars.dpy, RootWindow(linuxvars.dpy, 0), 0, SubstructureNotifyMask | SubstructureRedirectMask, &e); @@ -419,71 +419,71 @@ linux_get_xsettings_dpi(Display* dpy, int screen){ u16 name_len; char name[0]; }; - + struct XSettings { u8 byte_order; u8 pad[3]; u32 serial; u32 num_settings; }; - + enum { XSettingsTypeInt, XSettingsTypeString, XSettingsTypeColor }; - + int dpi = -1; unsigned char* prop = NULL; char sel_buffer[64]; struct XSettings* xs; const char* p; - + snprintf(sel_buffer, sizeof(sel_buffer), "_XSETTINGS_S%d", screen); - + Atom XSET_SEL = XInternAtom(dpy, sel_buffer, True); Atom XSET_SET = XInternAtom(dpy, "_XSETTINGS_SETTINGS", True); - + if (XSET_SEL == None || XSET_SET == None){ //LOG("XSETTINGS unavailable.\n"); return(dpi); } - + Window xset_win = XGetSelectionOwner(dpy, XSET_SEL); if (xset_win == None){ // TODO(inso): listen for the ClientMessage about it becoming available? - // there's not much point atm if DPI scaling is only done at startup + // there's not much point atm if DPI scaling is only done at startup goto out; } - + { Atom type; int fmt; unsigned long pad, num; - + if (XGetWindowProperty(dpy, xset_win, XSET_SET, 0, 1024, False, XSET_SET, &type, &fmt, &num, &pad, &prop) != Success){ //LOG("XSETTINGS: GetWindowProperty failed.\n"); goto out; } - + if (fmt != 8){ //LOG("XSETTINGS: Wrong format.\n"); goto out; } } - + xs = (struct XSettings*)prop; p = (char*)(xs + 1); - + if (xs->byte_order != 0){ //LOG("FIXME: XSETTINGS not host byte order?\n"); goto out; } - + for (int i = 0; i < xs->num_settings; ++i){ struct XSettingHeader* h = (struct XSettingHeader*)p; - + p += sizeof(struct XSettingHeader); p += h->name_len; p += ((4 - (h->name_len & 3)) & 3); p += 4; // serial - + switch (h->type){ case XSettingsTypeInt: { if (strncmp(h->name, "Xft/DPI", h->name_len) == 0){ @@ -492,30 +492,30 @@ linux_get_xsettings_dpi(Display* dpy, int screen){ } p += 4; } break; - + case XSettingsTypeString: { u32 len = *(u32*)p; p += 4; p += len; p += ((4 - (len & 3)) & 3); } break; - + case XSettingsTypeColor: { p += 8; } break; - + default: { //LOG("XSETTINGS: Got invalid type...\n"); goto out; } break; } } - + out: - if (prop){ - XFree(prop); - } - + if (prop){ + XFree(prop); + } + return dpi; } @@ -563,15 +563,15 @@ graphics_fill_texture_sig(){ internal Face_Description linux_find_font(Face_Description* desc) { Face_Description result = *desc; - + char* name = strndupa((char*)desc->font.file_name.str, desc->font.file_name.size); - + double size; const char* style; { Face_Load_Parameters* p = &desc->parameters; size = p->pt_size; - + if(p->bold && p->italic) { style = "Bold Italic"; } else if(p->bold) { @@ -582,59 +582,59 @@ linux_find_font(Face_Description* desc) { style = "Regular"; } } - + FcPattern *pattern = FcPatternBuild( - 0, - FC_POSTSCRIPT_NAME, FcTypeString, name, - FC_SIZE, FcTypeDouble, size, - FC_FONTFORMAT, FcTypeString, "TrueType", - FC_STYLE, FcTypeString, (FcChar8*)style, - NULL); - + 0, + FC_POSTSCRIPT_NAME, FcTypeString, name, + FC_SIZE, FcTypeDouble, size, + FC_FONTFORMAT, FcTypeString, "TrueType", + FC_STYLE, FcTypeString, (FcChar8*)style, + NULL); + if(!pattern) { return result; } - + if (FcConfigSubstitute(linuxvars.fontconfig, pattern, FcMatchPattern)){ FcDefaultSubstitute(pattern); - + FcResult res; FcPattern *font = FcFontMatch(linuxvars.fontconfig, pattern, &res); if (!font){ return result; } - + FcChar8 *filename = 0; FcPatternGetString(font, FC_FILE, 0, &filename); if(filename) { LINUX_FN_DEBUG("FONTCONFIG FILENAME = %s\n", filename); result.font.file_name = push_u8_stringf(linuxvars.frame_arena, "%s", filename); } - + FcPatternDestroy(font); } - + FcPatternDestroy(pattern); - + return result; } internal font_make_face_sig() { - + Face* result = ft__font_make_face(arena, description, scale_factor); - + // if it failed to load the font directly, try via fontconfig. if(!result) { Face_Description desc2 = {}; desc2.parameters = description->parameters; desc2.font.file_name = string_front_of_path(description->font.file_name); - + printf("FONT %.*s\n", string_expand(desc2.font.file_name)); desc2 = linux_find_font(&desc2); result = ft__font_make_face(arena, &desc2, scale_factor); } - + if(!result) { // is this fatal? 4ed.cpp:277 (caller) does not check for null. String_Const_u8 s = description->font.file_name; @@ -642,7 +642,7 @@ font_make_face_sig() { snprintf(msg, sizeof(msg), "Unable to load font: %.*s", (int)s.size, s.str); system_error_box(msg); } - + return(result); } @@ -651,17 +651,17 @@ font_make_face_sig() { internal b32 glx_init(void) { int glx_maj, glx_min; - + if(!glXQueryVersion(linuxvars.dpy, &glx_maj, &glx_min)) { return false; } - + return glx_maj > 1 || (glx_maj == 1 && glx_min >= 3); } internal b32 glx_get_config(GLXFBConfig* fb_config, XVisualInfo* vi) { - + static const int attrs[] = { GLX_X_RENDERABLE , True, GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, @@ -676,24 +676,24 @@ glx_get_config(GLXFBConfig* fb_config, XVisualInfo* vi) { GLX_DOUBLEBUFFER , True, None }; - + int conf_count = 0; GLXFBConfig* conf_list = glXChooseFBConfig(linuxvars.dpy, DefaultScreen(linuxvars.dpy), attrs, &conf_count); if(!conf_count || conf_count <= 0) { return false; } - + *fb_config = *conf_list; XFree(conf_list); - + XVisualInfo* xvi = glXGetVisualFromFBConfig(linuxvars.dpy, *fb_config); if(!xvi) { return false; } - + *vi = *xvi; XFree(xvi); - + return true; } @@ -714,19 +714,19 @@ typedef int (glXSwapIntervalSGI_Function) (int interval); internal b32 glx_create_context(GLXFBConfig fb_config){ const char *glx_exts = glXQueryExtensionsString(linuxvars.dpy, DefaultScreen(linuxvars.dpy)); - + glXCreateContextAttribsARB_Function *glXCreateContextAttribsARB = 0; glXSwapIntervalEXT_Function *glXSwapIntervalEXT = 0; glXSwapIntervalMESA_Function *glXSwapIntervalMESA = 0; glXGetSwapIntervalMESA_Function *glXGetSwapIntervalMESA = 0; glXSwapIntervalSGI_Function *glXSwapIntervalSGI = 0; - + #define GLXLOAD(f) f = (f##_Function*) glXGetProcAddressARB((const GLubyte*) #f); GLXLOAD(glXCreateContextAttribsARB); - + GLXContext ctx = NULL; int (*old_handler)(Display*, XErrorEvent*) = XSetErrorHandler(&glx_error_handler); - + if (glXCreateContextAttribsARB == NULL){ //LOG("glXCreateContextAttribsARB() not found, using old-style GLX context\n" ); ctx = glXCreateNewContext(linuxvars.dpy, fb_config, GLX_RGBA_TYPE, 0, True); @@ -740,32 +740,32 @@ glx_create_context(GLXFBConfig fb_config){ #endif None }; - + //LOG("Creating GL 2.1 context... "); ctx = glXCreateContextAttribsARB(linuxvars.dpy, fb_config, 0, True, context_attribs); } - + XSync(linuxvars.dpy, False); if(glx_ctx_error || !ctx) { return false; } - + XSync(linuxvars.dpy, False); XSetErrorHandler(old_handler); - + //b32 direct = glXIsDirect(linuxvars.dpy, ctx); - + //LOG("Making context current\n"); glXMakeCurrent(linuxvars.dpy, linuxvars.win, ctx); - + //glx_enable_vsync(); - + // NOTE(allen): Load gl functions #define GL_FUNC(f,R,P) GLXLOAD(f) #include "opengl/4ed_opengl_funcs.h" - + #undef GLXLOAD - + return true; } @@ -773,17 +773,17 @@ glx_create_context(GLXFBConfig fb_config){ internal void linux_x11_init(int argc, char** argv, Plat_Settings* settings) { - + Display* dpy = XOpenDisplay(0); if (!dpy){ fprintf(stderr, "FATAL: Cannot open X11 Display!\n"); exit(1); } - + linuxvars.dpy = dpy; - + #define LOAD_ATOM(x) linuxvars.atom_##x = XInternAtom(linuxvars.dpy, #x, False); - + LOAD_ATOM(TARGETS); LOAD_ATOM(CLIPBOARD); LOAD_ATOM(UTF8_STRING); @@ -796,140 +796,140 @@ linux_x11_init(int argc, char** argv, Plat_Settings* settings) { LOAD_ATOM(_NET_WM_WINDOW_TYPE_NORMAL); LOAD_ATOM(_NET_WM_PID); LOAD_ATOM(WM_DELETE_WINDOW); - + #undef LOAD_ATOM - + if (!glx_init()){ system_error_box("Your XServer's GLX version is too old. GLX 1.3+ is required."); } - + GLXFBConfig fb_config; XVisualInfo vi; if (!glx_get_config(&fb_config, &vi)){ system_error_box("Could not get a matching GLX FBConfig. Check your OpenGL drivers are installed correctly."); } - + // TODO: window size #define WINDOW_W_DEFAULT 800 #define WINDOW_H_DEFAULT 600 int w = WINDOW_W_DEFAULT; int h = WINDOW_H_DEFAULT; - + // TEMP render_target.width = w; render_target.height = h; - + XSetWindowAttributes swa = {}; swa.backing_store = WhenMapped; swa.event_mask = StructureNotifyMask; swa.bit_gravity = NorthWestGravity; swa.colormap = XCreateColormap(dpy, RootWindow(dpy, vi.screen), vi.visual, AllocNone); - + u32 CWflags = CWBackingStore|CWBitGravity|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask; linuxvars.win = XCreateWindow(dpy, RootWindow(dpy, vi.screen), 0, 0, w, h, 0, vi.depth, InputOutput, vi.visual, CWflags, &swa); - + if (!linuxvars.win){ system_error_box("XCreateWindow failed. Make sure your display is set up correctly."); } - + //NOTE(inso): Set the window's type to normal XChangeProperty(linuxvars.dpy, linuxvars.win, linuxvars.atom__NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char*)&linuxvars.atom__NET_WM_WINDOW_TYPE_NORMAL, 1); - + //NOTE(inso): window managers want the PID as a window property for some reason. pid_t pid = getpid(); XChangeProperty(linuxvars.dpy, linuxvars.win, linuxvars.atom__NET_WM_PID, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)&pid, 1); - + //NOTE(inso): set wm properties XStoreName(linuxvars.dpy, linuxvars.win, WINDOW_NAME); - + XSizeHints *sz_hints = XAllocSizeHints(); XWMHints *wm_hints = XAllocWMHints(); XClassHint *cl_hints = XAllocClassHint(); - + sz_hints->flags = PMinSize | PMaxSize | PWinGravity; - + sz_hints->min_width = 50; sz_hints->min_height = 50; - + sz_hints->max_width = sz_hints->max_height = (1UL << 16UL); sz_hints->win_gravity = NorthWestGravity; - + if (settings->set_window_pos){ sz_hints->flags |= USPosition; sz_hints->x = settings->window_x; sz_hints->y = settings->window_y; } - + wm_hints->flags |= InputHint | StateHint; wm_hints->input = True; wm_hints->initial_state = NormalState; - + cl_hints->res_name = "4coder"; cl_hints->res_class = "4coder"; - + char* win_name_list[] = { WINDOW_NAME }; XTextProperty win_name; XStringListToTextProperty(win_name_list, 1, &win_name); - + XSetWMProperties(linuxvars.dpy, linuxvars.win, &win_name, NULL, argv, argc, sz_hints, wm_hints, cl_hints); - + XFree(win_name.value); XFree(sz_hints); XFree(wm_hints); XFree(cl_hints); - + linux_set_icon(linuxvars.dpy, linuxvars.win); - + // NOTE(inso): make the window visible XMapWindow(linuxvars.dpy, linuxvars.win); - + if(!glx_create_context(fb_config)) { system_error_box("Unable to create GLX context."); } - + XRaiseWindow(linuxvars.dpy, linuxvars.win); - + if (settings->set_window_pos){ XMoveWindow(linuxvars.dpy, linuxvars.win, settings->window_x, settings->window_y); } - + if (settings->maximize_window){ linux_set_wm_state(linuxvars.atom__NET_WM_STATE_MAXIMIZED_HORZ, linuxvars.atom__NET_WM_STATE_MAXIMIZED_VERT, WM_STATE_ADD); } else if (settings->fullscreen_window){ linux_set_wm_state(linuxvars.atom__NET_WM_STATE_FULLSCREEN, 0, WM_STATE_ADD); } - + XSync(linuxvars.dpy, False); - + Atom wm_protos[] = { linuxvars.atom_WM_DELETE_WINDOW, linuxvars.atom__NET_WM_PING }; - + XSetWMProtocols(linuxvars.dpy, linuxvars.win, wm_protos, 2); - + // XFixes extension for clipboard notification. { int xfixes_version_unused, xfixes_err_unused; Bool has_xfixes = XQueryExtension(linuxvars.dpy, "XFIXES", &xfixes_version_unused, &linuxvars.xfixes_selection_event, &xfixes_err_unused); linuxvars.has_xfixes = (has_xfixes == True); - + // request notifications for CLIPBOARD updates. if(has_xfixes) { XFixesSelectSelectionInput(linuxvars.dpy, linuxvars.win, linuxvars.atom_CLIPBOARD, XFixesSetSelectionOwnerNotifyMask); } } - + // Input handling init - + setlocale(LC_ALL, ""); XSetLocaleModifiers(""); b32 locale_supported = XSupportsLocale(); - + if (!locale_supported){ setlocale(LC_ALL, "C"); } - + linuxvars.xim = XOpenIM(dpy, 0, 0, 0); if (!linuxvars.xim){ // NOTE(inso): Try falling back to the internal XIM implementation that @@ -937,16 +937,16 @@ linux_x11_init(int argc, char** argv, Plat_Settings* settings) { XSetLocaleModifiers("@im=none"); linuxvars.xim = XOpenIM(dpy, 0, 0, 0); } - + // If it still isn't there we're screwed. if (!linuxvars.xim){ system_error_box("Could not initialize X Input."); } - + XIMStyles *styles = NULL; const XIMStyle style_want = (XIMPreeditNothing | XIMStatusNothing); b32 found_style = false; - + if (!XGetIMValues(linuxvars.xim, XNQueryInputStyle, &styles, NULL) && styles){ for (i32 i = 0; i < styles->count_styles; ++i){ XIMStyle style = styles->supported_styles[i]; @@ -956,28 +956,28 @@ linux_x11_init(int argc, char** argv, Plat_Settings* settings) { } } } - + if(!found_style) { system_error_box("Could not find supported X Input style."); } - + XFree(styles); - + linuxvars.xic = XCreateIC(linuxvars.xim, XNInputStyle, style_want, XNClientWindow, linuxvars.win, XNFocusWindow, linuxvars.win, NULL); - + if(!linuxvars.xic) { system_error_box("Error creating X Input context."); } - + int xim_event_mask; if (XGetICValues(linuxvars.xic, XNFilterEvents, &xim_event_mask, NULL)){ xim_event_mask = 0; } - + u32 event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask @@ -987,24 +987,24 @@ linux_x11_init(int argc, char** argv, Plat_Settings* settings) { | StructureNotifyMask | ExposureMask | VisibilityChangeMask | xim_event_mask; - + XSelectInput(linuxvars.dpy, linuxvars.win, event_mask); - + // init XKB keyboard extension - + if(!XkbQueryExtension(linuxvars.dpy, 0, &linuxvars.xkb_event, 0, 0, 0)) { system_error_box("XKB Extension not available."); } - + XkbSelectEvents(linuxvars.dpy, XkbUseCoreKbd, XkbAllEventsMask, XkbAllEventsMask); linuxvars.xkb = XkbGetKeyboard(linuxvars.dpy, XkbAllComponentsMask, XkbUseCoreKbd); if(!linuxvars.xkb) { system_error_box("Error getting XKB keyboard details."); } - + // closer to windows behaviour (holding key doesn't generate release events) XkbSetDetectableAutoRepeat(linuxvars.dpy, True, NULL); - + XCursor cursors[APP_MOUSE_CURSOR_COUNT] = { None, None, @@ -1013,15 +1013,15 @@ linux_x11_init(int argc, char** argv, Plat_Settings* settings) { XCreateFontCursor(linuxvars.dpy, XC_sb_v_double_arrow) }; block_copy(linuxvars.xcursors, cursors, sizeof(cursors)); - + // sneaky invisible cursor { char data = 0; XColor c = {}; Pixmap p = XCreateBitmapFromData(linuxvars.dpy, linuxvars.win, &data, 1, 1); - + linuxvars.hidden_cursor = XCreatePixmapCursor(linuxvars.dpy, p, p, &c, &c, 0, 0); - + XFreePixmap(linuxvars.dpy, p); } } @@ -1030,9 +1030,9 @@ global Key_Code keycode_lookup_table[255]; internal void linux_keycode_init(Display* dpy){ - + block_zero_array(keycode_lookup_table); - + // Find these keys by physical position, and map to QWERTY KeyCodes #define K(k) glue(KeyCode_, k) static const u8 positional_keys[] = { @@ -1042,27 +1042,27 @@ linux_keycode_init(Display* dpy){ K(Z), K(X), K(C), K(V), K(B), K(N), K(M), K(Comma), K(Period), K(ForwardSlash), 0, 0 }; #undef K - + // XKB gives the alphanumeric keys names like AE01 -> E is the row (from B-E), 01 is the column (01-12). // to get key names in .ps file: setxkbmap -print | xkbcomp - - | xkbprint -label name - out.ps - + static const int ncols = 12; static const int nrows = 4; - + for(int i = XkbMinLegalKeyCode; i <= XkbMaxLegalKeyCode; ++i) { const char* name = linuxvars.xkb->names->keys[i].name; - + if(name[0] == 'A' && name[1] >= 'B' && name[1] <= 'E') { int row = (nrows - 1) - (name[1] - 'B'); int col = (name[2] - '0') * 10 + (name[3] - '0') - 1; - + if(row >= 0 && row < nrows && col >= 0 && col < ncols) { keycode_lookup_table[i] = positional_keys[row * ncols + col]; } } - + // a few special cases: - + else if(memcmp(name, "TLDE", XkbKeyNameLength) == 0) { keycode_lookup_table[i] = KeyCode_Tick; } else if(memcmp(name, "BKSL", XkbKeyNameLength) == 0) { @@ -1074,12 +1074,12 @@ linux_keycode_init(Display* dpy){ // keycode_lookup_table[i] = } } - + // Find the rest by their key label struct SymCode { KeySym sym; Key_Code code; }; SymCode sym_table[100]; SymCode* p = sym_table; - + *p++ = { XK_space, KeyCode_Space }; *p++ = { XK_Tab, KeyCode_Tab }; *p++ = { XK_Escape, KeyCode_Escape }; @@ -1108,22 +1108,22 @@ linux_keycode_init(Display* dpy){ *p++ = { XK_Alt_R, KeyCode_Alt }; *p++ = { XK_Super_L, KeyCode_Command }; *p++ = { XK_Super_R, KeyCode_Command }; - + for(Key_Code k = KeyCode_F1; k <= KeyCode_F16; ++k) { *p++ = { XK_F1 + (k - KeyCode_F1), k }; } - + const int table_size = p - sym_table; Assert(table_size < ArrayCount(sym_table)); - + for(int i = XkbMinLegalKeyCode; i <= XkbMaxLegalKeyCode; ++i) { KeySym sym = NoSymbol; - + // lookup key in current layout with no modifiers held (0) if(!XkbTranslateKeyCode(linuxvars.xkb, i, XkbBuildCoreState(0, linuxvars.xkb_group), NULL, &sym)) { continue; } - + for(int j = 0; j < table_size; ++j) { if(sym_table[j].sym == sym) { keycode_lookup_table[i] = sym_table[j].code; @@ -1137,20 +1137,20 @@ internal void linux_epoll_init(void) { struct epoll_event e = {}; e.events = EPOLLIN | EPOLLET; - + linuxvars.step_timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); linuxvars.epoll = epoll_create(16); - + e.data.ptr = &epoll_tag_x11; epoll_ctl(linuxvars.epoll, EPOLL_CTL_ADD, ConnectionNumber(linuxvars.dpy), &e); - + e.data.ptr = &epoll_tag_step_timer; epoll_ctl(linuxvars.epoll, EPOLL_CTL_ADD, linuxvars.step_timer_fd, &e); } internal void linux_clipboard_send(XSelectionRequestEvent* req) { - + XSelectionEvent rsp = {}; rsp.type = SelectionNotify; rsp.requestor = req->requestor; @@ -1158,87 +1158,87 @@ linux_clipboard_send(XSelectionRequestEvent* req) { rsp.target = req->target; rsp.time = req->time; rsp.property = None; - + Atom formats[] = { linuxvars.atom_UTF8_STRING, XA_STRING, }; - + if(linuxvars.clipboard_contents.size == 0) { goto done; } - + if(req->selection != linuxvars.atom_CLIPBOARD || req->property == None) { goto done; } - + if (req->target == linuxvars.atom_TARGETS){ - + XChangeProperty( - req->display, - req->requestor, - req->property, - XA_ATOM, - 32, - PropModeReplace, - (u8*)formats, - ArrayCount(formats)); - + req->display, + req->requestor, + req->property, + XA_ATOM, + 32, + PropModeReplace, + (u8*)formats, + ArrayCount(formats)); + rsp.property = req->property; - + } else { - + int i; for(i = 0; i < ArrayCount(formats); ++i){ if (req->target == formats[i]){ break; } } - + if (i != ArrayCount(formats)){ XChangeProperty( - req->display, - req->requestor, - req->property, - req->target, - 8, - PropModeReplace, - linuxvars.clipboard_contents.str, - linuxvars.clipboard_contents.size - ); - + req->display, + req->requestor, + req->property, + req->target, + 8, + PropModeReplace, + linuxvars.clipboard_contents.str, + linuxvars.clipboard_contents.size + ); + rsp.property = req->property; } } - -done: + + done: XSendEvent(req->display, req->requestor, True, 0, (XEvent*)&rsp); } internal void linux_clipboard_recv(XSelectionEvent* ev) { - + if(ev->selection != linuxvars.atom_CLIPBOARD || - ev->target != linuxvars.atom_UTF8_STRING || - ev->property == None) { + ev->target != linuxvars.atom_UTF8_STRING || + ev->property == None) { return; } - + Atom type; int fmt; unsigned long nitems; unsigned long bytes_left; u8 *data; - + int result = XGetWindowProperty( - linuxvars.dpy, - linuxvars.win, - linuxvars.atom_CLIPBOARD, - 0L, 0x20000000L, False, - linuxvars.atom_UTF8_STRING, - &type, &fmt, &nitems, - &bytes_left, &data); - + linuxvars.dpy, + linuxvars.win, + linuxvars.atom_CLIPBOARD, + 0L, 0x20000000L, False, + linuxvars.atom_UTF8_STRING, + &type, &fmt, &nitems, + &bytes_left, &data); + if(result == Success && fmt == 8){ linalloc_clear(linuxvars.clipboard_arena); linuxvars.clipboard_contents = push_u8_stringf(linuxvars.clipboard_arena, "%.*s", nitems, data); @@ -1253,17 +1253,17 @@ internal String_Const_u8 linux_filter_text(Arena* arena, u8* buf, int len) { u8* const result = push_array(arena, u8, len); u8* outp = result; - + for(int i = 0; i < len; ++i) { u8 c = buf[i]; - + if(c == '\r') { *outp++ = '\n'; } else if(c > 127 || (' ' <= c && c <= '~') || c == '\t') { *outp++ = c; } } - + return SCu8(result, outp - result); } @@ -1271,47 +1271,47 @@ internal void linux_handle_x11_events() { static XEvent prev_event = {}; b32 should_step = false; - + while (XPending(linuxvars.dpy)) { XEvent event; XNextEvent(linuxvars.dpy, &event); - + if (XFilterEvent(&event, None) == True){ continue; } - + switch(event.type) { case KeyPress: { should_step = true; - + Input_Modifier_Set_Fixed* mods = &linuxvars.input.pers.modifiers; - + int state = event.xkey.state; set_modifier(mods, KeyCode_Shift, state & ShiftMask); set_modifier(mods, KeyCode_Control, state & ControlMask); set_modifier(mods, KeyCode_CapsLock, state & LockMask); set_modifier(mods, KeyCode_Alt, state & Mod1Mask); - + event.xkey.state &= ~(ControlMask); - + Status status; KeySym keysym = NoSymbol; u8 buf[256] = {}; - + int len = Xutf8LookupString(linuxvars.xic, &event.xkey, (char*)buf, sizeof(buf) - 1, &keysym, &status); - + if (status == XBufferOverflow){ Xutf8ResetIC(linuxvars.xic); XSetICFocus(linuxvars.xic); } - + if (keysym == XK_ISO_Left_Tab){ add_modifier(mods, KeyCode_Shift); } - + Key_Code key = keycode_lookup_table[(u8)event.xkey.keycode]; //printf("key %d = %s\n", event.xkey.keycode, key_code_name[key]); - + Input_Event* key_event = NULL; if(key) { add_modifier(mods, key); @@ -1320,7 +1320,7 @@ linux_handle_x11_events() { key_event->key.code = key; key_event->key.modifiers = copy_modifier_set(linuxvars.frame_arena, mods); } - + Input_Event* text_event = NULL; if(status == XLookupChars || status == XLookupBoth) { String_Const_u8 str = linux_filter_text(linuxvars.frame_arena, buf, len); @@ -1330,26 +1330,26 @@ linux_handle_x11_events() { text_event->text.string = str; } } - + if(key_event && text_event) { key_event->key.first_dependent_text = text_event; } - + } break; - + case KeyRelease: { should_step = true; - + Input_Modifier_Set_Fixed* mods = &linuxvars.input.pers.modifiers; - + int state = event.xkey.state; set_modifier(mods, KeyCode_Shift, state & ShiftMask); set_modifier(mods, KeyCode_Control, state & ControlMask); set_modifier(mods, KeyCode_CapsLock, state & LockMask); set_modifier(mods, KeyCode_Alt, state & Mod1Mask); - + Key_Code key = keycode_lookup_table[(u8)event.xkey.keycode]; - + Input_Event* key_event = NULL; if(key) { remove_modifier(mods, key); @@ -1359,149 +1359,149 @@ linux_handle_x11_events() { key_event->key.modifiers = copy_modifier_set(linuxvars.frame_arena, mods); } } break; - + case MotionNotify: { int x = clamp(0, event.xmotion.x, render_target.width - 1); int y = clamp(0, event.xmotion.y, render_target.height - 1); linuxvars.input.pers.mouse = { x, y }; should_step = true; } break; - + case ButtonPress: { should_step = true; switch(event.xbutton.button) { case Button1: { linuxvars.input.trans.mouse_l_press = true; linuxvars.input.pers.mouse_l = true; - + // NOTE(inso): improves selection dragging (especially in notepad-like mode). // we will still get mouse events when the pointer leaves the window if it's dragging. XGrabPointer( - linuxvars.dpy, - linuxvars.win, - True, PointerMotionMask | ButtonPressMask | ButtonReleaseMask, - GrabModeAsync, GrabModeAsync, - None, None, CurrentTime); - + linuxvars.dpy, + linuxvars.win, + True, PointerMotionMask | ButtonPressMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, + None, None, CurrentTime); + } break; - + case Button3: { linuxvars.input.trans.mouse_r_press = true; linuxvars.input.pers.mouse_r = true; } break; - + case Button4: { linuxvars.input.trans.mouse_wheel = -100; } break; - + case Button5: { linuxvars.input.trans.mouse_wheel = +100; } break; } } break; - + case ButtonRelease: { should_step = true; switch(event.xbutton.button) { case Button1: { linuxvars.input.trans.mouse_l_release = true; linuxvars.input.pers.mouse_l = false; - + XUngrabPointer(linuxvars.dpy, CurrentTime); } break; - + case Button3: { linuxvars.input.trans.mouse_r_release = true; linuxvars.input.pers.mouse_r = false; } break; } } break; - + case FocusIn: case FocusOut: { linuxvars.input.pers.mouse_l = false; linuxvars.input.pers.mouse_r = false; block_zero_struct(&linuxvars.input.pers.modifiers); } break; - + case EnterNotify: { linuxvars.input.pers.mouse_out_of_window = 0; } break; - + case LeaveNotify: { linuxvars.input.pers.mouse_out_of_window = 1; } break; - + case ConfigureNotify: { i32 w = event.xconfigure.width; i32 h = event.xconfigure.height; - + if (w != render_target.width || h != render_target.height){ should_step = true; render_target.width = w; render_target.height = h; } } break; - + case ClientMessage: { Atom atom = event.xclient.data.l[0]; - + // Window X button clicked if(atom == linuxvars.atom_WM_DELETE_WINDOW) { should_step = true; linuxvars.input.trans.trying_to_kill = true; } - + // Notify WM that we're still responding (don't grey our window out). else if(atom == linuxvars.atom__NET_WM_PING) { event.xclient.window = DefaultRootWindow(linuxvars.dpy); XSendEvent( - linuxvars.dpy, - event.xclient.window, - False, - SubstructureRedirectMask | SubstructureNotifyMask, - &event); + linuxvars.dpy, + event.xclient.window, + False, + SubstructureRedirectMask | SubstructureNotifyMask, + &event); } } break; - + case SelectionRequest: { linux_clipboard_send((XSelectionRequestEvent*)&event); } break; - + case SelectionNotify: { linux_clipboard_recv((XSelectionEvent*)&event); } break; - + case SelectionClear: { if(event.xselectionclear.selection == linuxvars.atom_CLIPBOARD) { linalloc_clear(linuxvars.clipboard_arena); block_zero_struct(&linuxvars.clipboard_contents); } } break; - + case Expose: case VisibilityNotify: { should_step = true; } break; - + default: { // clipboard update notification - ask for the new content if (linuxvars.clipboard_catch_all && event.type == linuxvars.xfixes_selection_event) { XFixesSelectionNotifyEvent* sne = (XFixesSelectionNotifyEvent*)&event; if (sne->subtype == XFixesSelectionNotify && sne->owner != linuxvars.win){ XConvertSelection( - linuxvars.dpy, - linuxvars.atom_CLIPBOARD, - linuxvars.atom_UTF8_STRING, - linuxvars.atom_CLIPBOARD, - linuxvars.win, - CurrentTime); + linuxvars.dpy, + linuxvars.atom_CLIPBOARD, + linuxvars.atom_UTF8_STRING, + linuxvars.atom_CLIPBOARD, + linuxvars.win, + CurrentTime); } } - + else if(event.type == linuxvars.xkb_event) { XkbEvent* kb = (XkbEvent*)&event; - + // Keyboard layout changed, refresh lookup table. if(kb->any.xkb_type == XkbStateNotify && kb->state.group != linuxvars.xkb_group) { linuxvars.xkb_group = kb->state.group; @@ -1512,7 +1512,7 @@ linux_handle_x11_events() { } break; } } - + if(should_step) { linux_schedule_step(); } @@ -1521,20 +1521,20 @@ linux_handle_x11_events() { internal b32 linux_epoll_process(struct epoll_event* events, int num_events) { b32 do_step = false; - + for (int i = 0; i < num_events; ++i){ struct epoll_event* ev = events + i; Epoll_Kind* tag = (Epoll_Kind*)ev->data.ptr; - + switch (*tag){ case EPOLL_X11: { linux_handle_x11_events(); } break; - + case EPOLL_X11_INTERNAL: { //XProcessInternalConnection(linuxvars.dpy, fd); } break; - + case EPOLL_STEP_TIMER: { u64 count; int ret; @@ -1543,11 +1543,11 @@ linux_epoll_process(struct epoll_event* events, int num_events) { } while (ret != -1 || errno != EAGAIN); do_step = true; } break; - + case EPOLL_CLI_PIPE: { linux_schedule_step(); } break; - + case EPOLL_USER_TIMER: { Linux_Object* obj = CastFromMember(Linux_Object, timer.epoll_tag, tag); close(obj->timer.fd); @@ -1556,51 +1556,51 @@ linux_epoll_process(struct epoll_event* events, int num_events) { } break; } } - + return do_step; } int main(int argc, char **argv){ - + pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&linuxvars.memory_tracker_mutex, &attr); - + // NOTE(allen): context setup { Base_Allocator* alloc = get_base_allocator_system(); thread_ctx_init(&linuxvars.tctx, ThreadKind_Main, alloc, alloc); } - + API_VTable_system system_vtable = {}; system_api_fill_vtable(&system_vtable); - + API_VTable_graphics graphics_vtable = {}; graphics_api_fill_vtable(&graphics_vtable); - + API_VTable_font font_vtable = {}; font_api_fill_vtable(&font_vtable); - + // NOTE(allen): memory linuxvars.frame_arena = reserve_arena(&linuxvars.tctx); linuxvars.clipboard_arena = reserve_arena(&linuxvars.tctx); render_target.arena = make_arena_system(KB(256)); - + linuxvars.fontconfig = FcInitLoadConfigAndFonts(); - + linuxvars.cursor_show = MouseCursorShow_Always; linuxvars.prev_cursor_show = MouseCursorShow_Always; - + dll_init_sentinel(&linuxvars.free_linux_objects); dll_init_sentinel(&linuxvars.timer_objects); - + //InitializeCriticalSection(&win32vars.thread_launch_mutex); //InitializeConditionVariable(&win32vars.thread_launch_cv); - + linuxvars.clipboard_catch_all = true; - + // NOTE(allen): load core System_Library core_library = {}; App_Functions app = {}; @@ -1609,7 +1609,7 @@ main(int argc, char **argv){ Scratch_Block scratch(&linuxvars.tctx, Scratch_Share); Path_Search_List search_list = {}; search_list_add_system_path(scratch, &search_list, SystemPath_Binary); - + String_Const_u8 core_path = get_full_path(scratch, &search_list, SCu8("4ed_app.so")); if (system_load_library(scratch, core_path, &core_library)){ get_funcs = (App_Get_Functions*)system_get_proc(core_library, "app_get_functions"); @@ -1626,20 +1626,20 @@ main(int argc, char **argv){ system_error_box(msg); } } - + // NOTE(allen): send system vtable to core app.load_vtables(&system_vtable, &font_vtable, &graphics_vtable); // get_logger calls log_init which is needed. app.get_logger(); //linuxvars.log_string = app.get_logger(); - + // NOTE(allen): init & command line parameters Plat_Settings plat_settings = {}; void *base_ptr = 0; { Scratch_Block scratch(&linuxvars.tctx, Scratch_Share); String_Const_u8 curdir = system_get_path(scratch, SystemPath_CurrentDirectory); - + char **files = 0; i32 *file_count = 0; base_ptr = app.read_command_line(&linuxvars.tctx, curdir, &plat_settings, &files, &file_count, argc, argv); @@ -1656,7 +1656,7 @@ main(int argc, char **argv){ *file_count = j; }*/ } - + // NOTE(allen): load custom layer System_Library custom_library = {}; Custom_API custom = {}; @@ -1664,7 +1664,7 @@ main(int argc, char **argv){ char custom_not_found_msg[] = "Did not find a library for the custom layer."; char custom_fail_version_msg[] = "Failed to load custom code due to missing version information or a version mismatch. Try rebuilding with buildsuper."; char custom_fail_init_apis[] = "Failed to load custom code due to missing 'init_apis' symbol. Try rebuilding with buildsuper"; - + Scratch_Block scratch(&linuxvars.tctx, Scratch_Share); String_Const_u8 default_file_name = string_u8_litexpr("custom_4coder.so"); Path_Search_List search_list = {}; @@ -1695,11 +1695,12 @@ main(int argc, char **argv){ has_library = true; } } - + if (!has_library){ system_error_box(custom_not_found_msg); } custom.get_version = (_Get_Version_Type*)system_get_proc(custom_library, "get_version"); + printf("VER: %d.%d.%d\n", MAJOR, MINOR, PATCH); if (custom.get_version == 0 || custom.get_version(MAJOR, MINOR, PATCH) == 0){ system_error_box(custom_fail_version_msg); } @@ -1708,37 +1709,37 @@ main(int argc, char **argv){ system_error_box(custom_fail_init_apis); } } - + linux_x11_init(argc, argv, &plat_settings); linux_keycode_init(linuxvars.dpy); linux_epoll_init(); - + // app init { Scratch_Block scratch(&linuxvars.tctx, Scratch_Share); String_Const_u8 curdir = system_get_path(scratch, SystemPath_CurrentDirectory); app.init(&linuxvars.tctx, &render_target, base_ptr, curdir, custom); } - + linuxvars.global_frame_mutex = system_mutex_make(); system_mutex_acquire(linuxvars.global_frame_mutex); - + linux_schedule_step(); b32 first_step = true; - + for (;;) { - + if (XEventsQueued(linuxvars.dpy, QueuedAlready)){ linux_handle_x11_events(); } - + system_mutex_release(linuxvars.global_frame_mutex); - + struct epoll_event events[16]; int num_events = epoll_wait(linuxvars.epoll, events, ArrayCount(events), -1); - + system_mutex_acquire(linuxvars.global_frame_mutex); - + if (num_events == -1){ if (errno != EINTR){ perror("epoll_wait"); @@ -1746,31 +1747,31 @@ main(int argc, char **argv){ } continue; } - + if(!linux_epoll_process(events, num_events)) { continue; } - + linuxvars.last_step_time = system_now_time(); - + // NOTE(allen): Frame Clipboard Input // Request clipboard contents from X11 on first step, or every step if they don't have XFixes notification ability. if (first_step || (!linuxvars.has_xfixes && linuxvars.clipboard_catch_all)){ XConvertSelection(linuxvars.dpy, linuxvars.atom_CLIPBOARD, linuxvars.atom_UTF8_STRING, linuxvars.atom_CLIPBOARD, linuxvars.win, CurrentTime); } - + Application_Step_Input input = {}; - + if (linuxvars.received_new_clipboard){ input.clipboard = linuxvars.clipboard_contents; linuxvars.received_new_clipboard = false; } - + input.first_step = first_step; input.dt = frame_useconds/1000000.f; // variable? input.events = linuxvars.input.trans.event_list; input.trying_to_kill = linuxvars.input.trans.trying_to_kill; - + input.mouse.out_of_window = linuxvars.input.pers.mouse_out_of_window; input.mouse.p = linuxvars.input.pers.mouse; input.mouse.l = linuxvars.input.pers.mouse_l; @@ -1780,23 +1781,23 @@ main(int argc, char **argv){ input.mouse.press_r = linuxvars.input.trans.mouse_r_press; input.mouse.release_r = linuxvars.input.trans.mouse_r_release; input.mouse.wheel = linuxvars.input.trans.mouse_wheel; - + // NOTE(allen): Application Core Update Application_Step_Result result = {}; if (app.step != 0){ result = app.step(&linuxvars.tctx, &render_target, base_ptr, &input); } - + // NOTE(allen): Finish the Loop if (result.perform_kill){ break; } - + // NOTE(NAME): Switch to New Title if (result.has_new_title){ XStoreName(linuxvars.dpy, linuxvars.win, result.title_string); } - + // NOTE(allen): Switch to New Cursor if (result.mouse_cursor_type != linuxvars.cursor && !linuxvars.input.pers.mouse_l){ XCursor c = linuxvars.xcursors[result.mouse_cursor_type]; @@ -1805,17 +1806,17 @@ main(int argc, char **argv){ } linuxvars.cursor = result.mouse_cursor_type; } - + gl_render(&render_target); glXSwapBuffers(linuxvars.dpy, linuxvars.win); - + first_step = false; - + linalloc_clear(linuxvars.frame_arena); block_zero_struct(&linuxvars.input.trans); linuxvars.step_pending = false; } - + return 0; } From 79438ffd2234bd15698b71855d4334305f6b51fc Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 21:44:44 -0800 Subject: [PATCH 10/40] Wut? --- custom/4coder_custom.cpp | 2 +- platform_linux/linux_4ed.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/custom/4coder_custom.cpp b/custom/4coder_custom.cpp index 976c10da..4acd5551 100644 --- a/custom/4coder_custom.cpp +++ b/custom/4coder_custom.cpp @@ -6,7 +6,7 @@ extern "C" b32 get_version(i32 maj, i32 min, i32 patch){ - printf("CUS: %d.%d.%d\n", MAJOR, MINOR, PATCH); + fprintf(stderr, "CUS: %d.%d.%d\n", MAJOR, MINOR, PATCH); return(maj == MAJOR && min == MINOR && patch == PATCH); } diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index e34176d1..3ffc17d3 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -1700,7 +1700,7 @@ main(int argc, char **argv){ system_error_box(custom_not_found_msg); } custom.get_version = (_Get_Version_Type*)system_get_proc(custom_library, "get_version"); - printf("VER: %d.%d.%d\n", MAJOR, MINOR, PATCH); + fprintf(stderr, "VER: %d.%d.%d\n", MAJOR, MINOR, PATCH); if (custom.get_version == 0 || custom.get_version(MAJOR, MINOR, PATCH) == 0){ system_error_box(custom_fail_version_msg); } From 87ce4dabdb9d2783f9a16b3ee37ebc8d438487d5 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 22:03:48 -0800 Subject: [PATCH 11/40] messages not working......... --- platform_linux/linux_4ed.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 3ffc17d3..4a366605 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -109,7 +109,7 @@ fprintf(stderr, "%s: " fmt "\n", __func__, ##__VA_ARGS__);\ #undef AssertBreak #define AssertBreak(m) ({\ fprintf(stderr, "\n** ASSERTION FAILURE: %s:%d: %s\n\n", __FILE__, __LINE__, #m);\ - *((volatile u64*)0) = 0xba771e70ad5;\ +*((volatile u64*)0) = 0xba771e70ad5;\ }) #else #define LINUX_FN_DEBUG(...) @@ -1662,7 +1662,8 @@ main(int argc, char **argv){ Custom_API custom = {}; { char custom_not_found_msg[] = "Did not find a library for the custom layer."; - char custom_fail_version_msg[] = "Failed to load custom code due to missing version information or a version mismatch. Try rebuilding with buildsuper."; + char custom_fail_load_msg[] = "Failed to load custom code due to missing version information. Try rebuilding with buildsuper."; + char custom_fail_version_msg[] = "Failed to load custom code due to a version mismatch. Try rebuilding with buildsuper."; char custom_fail_init_apis[] = "Failed to load custom code due to missing 'init_apis' symbol. Try rebuilding with buildsuper"; Scratch_Block scratch(&linuxvars.tctx, Scratch_Share); @@ -1701,7 +1702,10 @@ main(int argc, char **argv){ } custom.get_version = (_Get_Version_Type*)system_get_proc(custom_library, "get_version"); fprintf(stderr, "VER: %d.%d.%d\n", MAJOR, MINOR, PATCH); - if (custom.get_version == 0 || custom.get_version(MAJOR, MINOR, PATCH) == 0){ + if (custom.get_version == 0){ + system_error_box(custom_fail_load_msg); + } + else if (custom.get_version(MAJOR, MINOR, PATCH) == 0){ system_error_box(custom_fail_version_msg); } custom.init_apis = (_Init_APIs_Type*)system_get_proc(custom_library, "init_apis"); From cb73e5f5b60bca332e3974370617225b4cef82db Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 22:06:18 -0800 Subject: [PATCH 12/40] PLEASE --- platform_linux/linux_4ed.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 4a366605..610fe75b 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -1697,6 +1697,8 @@ main(int argc, char **argv){ } } +#error FUCKING HELL + if (!has_library){ system_error_box(custom_not_found_msg); } From f7b485f8b104287fb1a8d66bf096495fdd283707 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 22:07:44 -0800 Subject: [PATCH 13/40] OKay --- platform_linux/linux_4ed.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 610fe75b..4a366605 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -1697,8 +1697,6 @@ main(int argc, char **argv){ } } -#error FUCKING HELL - if (!has_library){ system_error_box(custom_not_found_msg); } From 48d80f57ebd3486a80df46ae1f0085fc8855955a Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 22:22:29 -0800 Subject: [PATCH 14/40] Mystery solved; print messages removed --- custom/4coder_custom.cpp | 1 - platform_linux/linux_4ed.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/custom/4coder_custom.cpp b/custom/4coder_custom.cpp index 4acd5551..3dda1c74 100644 --- a/custom/4coder_custom.cpp +++ b/custom/4coder_custom.cpp @@ -6,7 +6,6 @@ extern "C" b32 get_version(i32 maj, i32 min, i32 patch){ - fprintf(stderr, "CUS: %d.%d.%d\n", MAJOR, MINOR, PATCH); return(maj == MAJOR && min == MINOR && patch == PATCH); } diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 4a366605..180c5bd7 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -1701,7 +1701,6 @@ main(int argc, char **argv){ system_error_box(custom_not_found_msg); } custom.get_version = (_Get_Version_Type*)system_get_proc(custom_library, "get_version"); - fprintf(stderr, "VER: %d.%d.%d\n", MAJOR, MINOR, PATCH); if (custom.get_version == 0){ system_error_box(custom_fail_load_msg); } From ac0bd78485b602aa78f5b1d4d91f22bb1591ff12 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 22:38:18 -0800 Subject: [PATCH 15/40] tryin' ta fix the linux thingy --- platform_linux/linux_4ed.cpp | 6 +++--- platform_win32/win32_4ed.cpp | 16 +++------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 180c5bd7..fea3b1f7 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -732,10 +732,10 @@ glx_create_context(GLXFBConfig fb_config){ ctx = glXCreateNewContext(linuxvars.dpy, fb_config, GLX_RGBA_TYPE, 0, True); } else { static const int context_attribs[] = { - GLX_CONTEXT_MAJOR_VERSION_ARB, 2, - GLX_CONTEXT_MINOR_VERSION_ARB, 1, + GLX_CONTEXT_MAJOR_VERSION_ARB, 3, + GLX_CONTEXT_MINOR_VERSION_ARB, 2, GLX_CONTEXT_PROFILE_MASK_ARB , GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, -#if defined(FRED_INTERNAL) +#if GL_DEBUG_MODE GLX_CONTEXT_FLAGS_ARB , GLX_CONTEXT_DEBUG_BIT_ARB, #endif None diff --git a/platform_win32/win32_4ed.cpp b/platform_win32/win32_4ed.cpp index cccda51a..423de917 100644 --- a/platform_win32/win32_4ed.cpp +++ b/platform_win32/win32_4ed.cpp @@ -1343,9 +1343,9 @@ win32_gl_create_window(HWND *wnd_out, HGLRC *context_out, DWORD style, RECT rect // NOTE(allen): Load wgl extensions #define LoadWGL(f,l) Stmnt((f) = (f##_Function*)wglGetProcAddress(#f); \ -(l) = (l) && win32_wgl_good((Void_Func*)(f));) - - b32 load_success = true; + (l) = (l) && win32_wgl_good((Void_Func*)(f));) + + b32 load_success = true; LoadWGL(wglCreateContextAttribsARB, load_success); LoadWGL(wglChoosePixelFormatARB, load_success); LoadWGL(wglGetExtensionsStringEXT, load_success); @@ -1443,7 +1443,6 @@ win32_gl_create_window(HWND *wnd_out, HGLRC *context_out, DWORD style, RECT rect goto fail_window_init; } -#if 1 i32 context_attrib_list[] = { /*0*/WGL_CONTEXT_MAJOR_VERSION_ARB, 3, /*2*/WGL_CONTEXT_MINOR_VERSION_ARB, 2, @@ -1455,15 +1454,6 @@ win32_gl_create_window(HWND *wnd_out, HGLRC *context_out, DWORD style, RECT rect /*6*/WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, /*8*/0 }; -#else - i32 context_attrib_list[] = { - WGL_CONTEXT_MAJOR_VERSION_ARB, 2, - WGL_CONTEXT_MINOR_VERSION_ARB, 1, - WGL_CONTEXT_FLAGS_ARB, 0, - WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, - 0 - }; -#endif HGLRC context = wglCreateContextAttribsARB(dc, 0, context_attrib_list); if (context == 0){ From 99dc2fc5700ab29ff5a9adfd4942b6bef858cb61 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 22:41:11 -0800 Subject: [PATCH 16/40] Trying something crazy --- maybe --- opengl/4ed_opengl_render.cpp | 537 ++++++++++++++++++----------------- 1 file changed, 269 insertions(+), 268 deletions(-) diff --git a/opengl/4ed_opengl_render.cpp b/opengl/4ed_opengl_render.cpp index fd05dfcb..c68a0eb2 100644 --- a/opengl/4ed_opengl_render.cpp +++ b/opengl/4ed_opengl_render.cpp @@ -57,304 +57,305 @@ internal void #ifdef OS_LINUX gl__error_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char *message, const void *userParam){ #else -gl__error_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, char *message, void *userParam){ + gl__error_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, char *message, void *userParam){ #endif - switch (id){ - case 131218: - { - // NOTE(allen): performance warning, do nothing. - }break; - - default: - { - InvalidPath; - }break; + switch (id){ + case 131218: + { + // NOTE(allen): performance warning, do nothing. + }break; + + default: + { + InvalidPath; + }break; + } } -} - -char *gl__header = R"foo(#version 150 -)foo"; - -char *gl__vertex = R"foo( -uniform vec2 view_t; -uniform mat2x2 view_m; -in vec2 vertex_p; -in vec3 vertex_t; -in uint vertex_c; -in float vertex_ht; -smooth out vec4 fragment_color; -smooth out vec3 uvw; -smooth out vec2 xy; -smooth out vec2 adjusted_half_dim; -smooth out float half_thickness; -void main(void) -{ -gl_Position = vec4(view_m*(vertex_p - view_t), 0.0, 1.0); - fragment_color.b = (float((vertex_c )&0xFFu))/255.0; -fragment_color.g = (float((vertex_c>> 8u)&0xFFu))/255.0; -fragment_color.r = (float((vertex_c>>16u)&0xFFu))/255.0; -fragment_color.a = (float((vertex_c>>24u)&0xFFu))/255.0; -uvw = vertex_t; -vec2 center = vertex_t.xy; -vec2 half_dim = abs(vertex_p - center); -adjusted_half_dim = half_dim - vertex_t.zz + vec2(0.5, 0.5); -half_thickness = vertex_ht; -xy = vertex_p; -} -)foo"; - -char *gl__fragment = R"foo( -smooth in vec4 fragment_color; -smooth in vec3 uvw; -smooth in vec2 xy; -smooth in vec2 adjusted_half_dim; -smooth in float half_thickness; -uniform sampler2DArray sampler; -out vec4 out_color; - -float rectangle_sd(vec2 p, vec2 b){ -vec2 d = abs(p) - b; -return(length(max(d, vec2(0.0, 0.0))) + min(max(d.x, d.y), 0.0)); -} - -void main(void) -{ -float has_thickness = (step(0.49, half_thickness)); -float does_not_have_thickness = 1.0 - has_thickness; - -float sample_value = texture(sampler, uvw).r; -sample_value *= does_not_have_thickness; - -vec2 center = uvw.xy; -float roundness = uvw.z; -float sd = rectangle_sd(xy - center, adjusted_half_dim); -sd = sd - roundness; -sd = abs(sd + half_thickness) - half_thickness; -float shape_value = 1.0 - smoothstep(-1.0, 0.0, sd); -shape_value *= has_thickness; - -out_color = vec4(fragment_color.xyz, fragment_color.a*(sample_value + shape_value)); -} -)foo"; - + + char *gl__header = R"foo(#version 130 + )foo"; + + char *gl__vertex = R"foo( + uniform vec2 view_t; + uniform mat2x2 view_m; + in vec2 vertex_p; + in vec3 vertex_t; + in uint vertex_c; + in float vertex_ht; + smooth out vec4 fragment_color; + smooth out vec3 uvw; + smooth out vec2 xy; + smooth out vec2 adjusted_half_dim; + smooth out float half_thickness; + void main(void) + { + gl_Position = vec4(view_m*(vertex_p - view_t), 0.0, 1.0); + fragment_color.b = (float((vertex_c )&0xFFu))/255.0; + fragment_color.g = (float((vertex_c>> 8u)&0xFFu))/255.0; + fragment_color.r = (float((vertex_c>>16u)&0xFFu))/255.0; + fragment_color.a = (float((vertex_c>>24u)&0xFFu))/255.0; + uvw = vertex_t; + vec2 center = vertex_t.xy; + vec2 half_dim = abs(vertex_p - center); + adjusted_half_dim = half_dim - vertex_t.zz + vec2(0.5, 0.5); + half_thickness = vertex_ht; + xy = vertex_p; + } + )foo"; + + char *gl__fragment = R"foo( + smooth in vec4 fragment_color; + smooth in vec3 uvw; + smooth in vec2 xy; + smooth in vec2 adjusted_half_dim; + smooth in float half_thickness; + uniform sampler2DArray sampler; + out vec4 out_color; + + float rectangle_sd(vec2 p, vec2 b){ + vec2 d = abs(p) - b; + return(length(max(d, vec2(0.0, 0.0))) + min(max(d.x, d.y), 0.0)); + } + + void main(void) + { + float has_thickness = (step(0.49, half_thickness)); + float does_not_have_thickness = 1.0 - has_thickness; + + float sample_value = texture(sampler, uvw).r; + sample_value *= does_not_have_thickness; + + vec2 center = uvw.xy; + float roundness = uvw.z; + float sd = rectangle_sd(xy - center, adjusted_half_dim); + sd = sd - roundness; + sd = abs(sd + half_thickness) - half_thickness; + float shape_value = 1.0 - smoothstep(-1.0, 0.0, sd); + shape_value *= has_thickness; + + out_color = vec4(fragment_color.xyz, fragment_color.a*(sample_value + shape_value)); + } + )foo"; + #define AttributeList(X) \ -X(vertex_p) \ -X(vertex_t) \ -X(vertex_c) \ -X(vertex_ht) - + X(vertex_p) \ + X(vertex_t) \ + X(vertex_c) \ + X(vertex_ht) + #define UniformList(X) \ -X(view_t) \ -X(view_m) \ -X(sampler) - -struct GL_Program{ - u32 program; + X(view_t) \ + X(view_m) \ + X(sampler) + + struct GL_Program{ + u32 program; #define GetAttributeLocation(N) i32 N; - AttributeList(GetAttributeLocation) + AttributeList(GetAttributeLocation) #undef GetAttributeLocation #define GetUniformLocation(N) i32 N; UniformList(GetUniformLocation) #undef GetUniformLocation -}; - -internal GL_Program -gl__make_program(char *header, char *vertex, char *fragment){ - if (header == 0){ - header = ""; - } + }; - GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); - GLchar *vertex_source_array[] = { header, vertex }; - glShaderSource(vertex_shader, ArrayCount(vertex_source_array), vertex_source_array, 0); - glCompileShader(vertex_shader); - - GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); - GLchar *fragment_source_array[] = { header, fragment }; - glShaderSource(fragment_shader, ArrayCount(fragment_source_array), fragment_source_array, 0); - glCompileShader(fragment_shader); - - GLuint program = glCreateProgram(); - glAttachShader(program, vertex_shader); - glAttachShader(program, fragment_shader); - glLinkProgram(program); - glValidateProgram(program); - - GLint success = false; - glGetProgramiv(program, GL_LINK_STATUS, &success); - if (!success){ - GLsizei ignore = 0; - char vertex_errors[KB(4)]; - char fragment_errors[KB(4)]; - char program_errors[KB(4)]; - glGetShaderInfoLog(vertex_shader, sizeof(vertex_errors), &ignore, vertex_errors); - glGetShaderInfoLog(fragment_shader, sizeof(fragment_errors), &ignore, fragment_errors); - glGetProgramInfoLog(program, sizeof(program_errors), &ignore, program_errors); + internal GL_Program + gl__make_program(char *header, char *vertex, char *fragment){ + if (header == 0){ + header = ""; + } + + GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); + GLchar *vertex_source_array[] = { header, vertex }; + glShaderSource(vertex_shader, ArrayCount(vertex_source_array), vertex_source_array, 0); + glCompileShader(vertex_shader); + + GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); + GLchar *fragment_source_array[] = { header, fragment }; + glShaderSource(fragment_shader, ArrayCount(fragment_source_array), fragment_source_array, 0); + glCompileShader(fragment_shader); + + GLuint program = glCreateProgram(); + glAttachShader(program, vertex_shader); + glAttachShader(program, fragment_shader); + glLinkProgram(program); + glValidateProgram(program); + + GLint success = false; + glGetProgramiv(program, GL_LINK_STATUS, &success); + if (!success){ + GLsizei ignore = 0; + char vertex_errors[KB(4)]; + char fragment_errors[KB(4)]; + char program_errors[KB(4)]; + glGetShaderInfoLog(vertex_shader, sizeof(vertex_errors), &ignore, vertex_errors); + glGetShaderInfoLog(fragment_shader, sizeof(fragment_errors), &ignore, fragment_errors); + glGetProgramInfoLog(program, sizeof(program_errors), &ignore, program_errors); #if SHIP_MODE - os_popup_error("Error", "Shader compilation failed."); + os_popup_error("Error", "Shader compilation failed."); #endif - InvalidPath; - } - - glDeleteShader(vertex_shader); - glDeleteShader(fragment_shader); - - GL_Program result = {}; - result.program = program; + InvalidPath; + } + + glDeleteShader(vertex_shader); + glDeleteShader(fragment_shader); + + GL_Program result = {}; + result.program = program; #define GetAttributeLocation(N) result.N = glGetAttribLocation(program, #N); - AttributeList(GetAttributeLocation) + AttributeList(GetAttributeLocation) #undef GetAttributeLocation #define GetUniformLocation(N) result.N = glGetUniformLocation(program, #N); UniformList(GetUniformLocation) #undef GetUniformLocation return(result); -} - + } + #define GLOffsetStruct(p,m) ((void*)(OffsetOfMemberStruct(p,m))) #define GLOffset(S,m) ((void*)(OffsetOfMember(S,m))) - -internal void -gl_render(Render_Target *t){ - Font_Set *font_set = (Font_Set*)t->font_set; - local_persist b32 first_opengl_call = true; - local_persist u32 attribute_buffer = 0; - local_persist GL_Program gpu_program = {}; - - if (first_opengl_call){ - first_opengl_call = false; + internal void + gl_render(Render_Target *t){ + Font_Set *font_set = (Font_Set*)t->font_set; + local_persist b32 first_opengl_call = true; + local_persist u32 attribute_buffer = 0; + local_persist GL_Program gpu_program = {}; + + if (first_opengl_call){ + first_opengl_call = false; + #if !SHIP_MODE - glEnable(GL_DEBUG_OUTPUT); - glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); - if (glDebugMessageControl){ - glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, 0, false); - glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, 0, false); - glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, 0, true); - glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, 0, true); - } - - if (glDebugMessageCallback){ - glDebugMessageCallback(gl__error_callback, 0); - } + glEnable(GL_DEBUG_OUTPUT); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + if (glDebugMessageControl){ + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, 0, false); + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, 0, false); + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, 0, true); + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, 0, true); + } + + if (glDebugMessageCallback){ + glDebugMessageCallback(gl__error_callback, 0); + } #endif - - //////////////////////////////// - - GLuint dummy_vao = 0; - glGenVertexArrays(1, &dummy_vao); - glBindVertexArray(dummy_vao); - - //////////////////////////////// - - glGenBuffers(1, &attribute_buffer); - glBindBuffer(GL_ARRAY_BUFFER, attribute_buffer); - - //////////////////////////////// - - glEnable(GL_SCISSOR_TEST); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - //////////////////////////////// - - gpu_program = gl__make_program(gl__header, gl__vertex, gl__fragment); - glUseProgram(gpu_program.program); - - //////////////////////////////// - - { - t->fallback_texture_id = gl__get_texture(V3i32(2, 2, 1), TextureKind_Mono); - u8 white_block[] = { 0xFF, 0xFF, 0xFF, 0xFF, }; - gl__fill_texture(TextureKind_Mono, 0, V3i32(0, 0, 0), V3i32(2, 2, 1), white_block); + + //////////////////////////////// + + GLuint dummy_vao = 0; + glGenVertexArrays(1, &dummy_vao); + glBindVertexArray(dummy_vao); + + //////////////////////////////// + + glGenBuffers(1, &attribute_buffer); + glBindBuffer(GL_ARRAY_BUFFER, attribute_buffer); + + //////////////////////////////// + + glEnable(GL_SCISSOR_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + //////////////////////////////// + + gpu_program = gl__make_program(gl__header, gl__vertex, gl__fragment); + glUseProgram(gpu_program.program); + + //////////////////////////////// + + { + t->fallback_texture_id = gl__get_texture(V3i32(2, 2, 1), TextureKind_Mono); + u8 white_block[] = { 0xFF, 0xFF, 0xFF, 0xFF, }; + gl__fill_texture(TextureKind_Mono, 0, V3i32(0, 0, 0), V3i32(2, 2, 1), white_block); + } } - } - - i32 width = t->width; - i32 height = t->height; - - glViewport(0, 0, width, height); - glScissor(0, 0, width, height); - glClearColor(1.f, 0.f, 1.f, 1.f); - glClear(GL_COLOR_BUFFER_BIT); - - glBindTexture(GL_TEXTURE_2D, 0); - t->bound_texture = 0; - - for (Render_Free_Texture *free_texture = t->free_texture_first; - free_texture != 0; - free_texture = free_texture->next){ - glDeleteTextures(1, &free_texture->tex_id); - } - t->free_texture_first = 0; - t->free_texture_last = 0; - - for (Render_Group *group = t->group_first; - group != 0; - group = group->next){ - Rect_i32 box = Ri32(group->clip_box); - Rect_i32 scissor_box = { - box.x0, height - box.y1, box.x1 - box.x0, box.y1 - box.y0, - }; - scissor_box.x0 = clamp_bot(0, scissor_box.x0); - scissor_box.y0 = clamp_bot(0, scissor_box.y0); - scissor_box.x1 = clamp_bot(0, scissor_box.x1); - scissor_box.y1 = clamp_bot(0, scissor_box.y1); - glScissor(scissor_box.x0, scissor_box.y0, scissor_box.x1, scissor_box.y1); + i32 width = t->width; + i32 height = t->height; - i32 vertex_count = group->vertex_list.vertex_count; - if (vertex_count > 0){ - Face *face = font_set_face_from_id(font_set, group->face_id); - if (face != 0){ - gl__bind_texture(t, face->texture); - } - else{ - gl__bind_any_texture(t); - } + glViewport(0, 0, width, height); + glScissor(0, 0, width, height); + glClearColor(1.f, 0.f, 1.f, 1.f); + glClear(GL_COLOR_BUFFER_BIT); + + glBindTexture(GL_TEXTURE_2D, 0); + t->bound_texture = 0; + + for (Render_Free_Texture *free_texture = t->free_texture_first; + free_texture != 0; + free_texture = free_texture->next){ + glDeleteTextures(1, &free_texture->tex_id); + } + t->free_texture_first = 0; + t->free_texture_last = 0; + + for (Render_Group *group = t->group_first; + group != 0; + group = group->next){ + Rect_i32 box = Ri32(group->clip_box); - glBufferData(GL_ARRAY_BUFFER, vertex_count*sizeof(Render_Vertex), 0, GL_STREAM_DRAW); - i32 cursor = 0; - for (Render_Vertex_Array_Node *node = group->vertex_list.first; - node != 0; - node = node->next){ - i32 size = node->vertex_count*sizeof(*node->vertices); - glBufferSubData(GL_ARRAY_BUFFER, cursor, size, node->vertices); - cursor += size; - } - - glEnableVertexAttribArray(gpu_program.vertex_p); - glEnableVertexAttribArray(gpu_program.vertex_t); - glEnableVertexAttribArray(gpu_program.vertex_c); - glEnableVertexAttribArray(gpu_program.vertex_ht); - - glVertexAttribPointer(gpu_program.vertex_p, 2, GL_FLOAT, true, sizeof(Render_Vertex), - GLOffset(Render_Vertex, xy)); - glVertexAttribPointer(gpu_program.vertex_t, 3, GL_FLOAT, true, sizeof(Render_Vertex), - GLOffset(Render_Vertex, uvw)); - glVertexAttribIPointer(gpu_program.vertex_c, 1, GL_UNSIGNED_INT, sizeof(Render_Vertex), - GLOffset(Render_Vertex, color)); - glVertexAttribPointer(gpu_program.vertex_ht, 1, GL_FLOAT, true, sizeof(Render_Vertex), - GLOffset(Render_Vertex, half_thickness)); - - glUniform2f(gpu_program.view_t, width/2.f, height/2.f); - f32 m[4] = { - 2.f/width, 0.f, - 0.f, -2.f/height, + Rect_i32 scissor_box = { + box.x0, height - box.y1, box.x1 - box.x0, box.y1 - box.y0, }; - glUniformMatrix2fv(gpu_program.view_m, 1, GL_FALSE, m); - glUniform1i(gpu_program.sampler, 0); + scissor_box.x0 = clamp_bot(0, scissor_box.x0); + scissor_box.y0 = clamp_bot(0, scissor_box.y0); + scissor_box.x1 = clamp_bot(0, scissor_box.x1); + scissor_box.y1 = clamp_bot(0, scissor_box.y1); + glScissor(scissor_box.x0, scissor_box.y0, scissor_box.x1, scissor_box.y1); - glDrawArrays(GL_TRIANGLES, 0, vertex_count); - glDisableVertexAttribArray(gpu_program.vertex_p); - glDisableVertexAttribArray(gpu_program.vertex_t); - glDisableVertexAttribArray(gpu_program.vertex_c); - glDisableVertexAttribArray(gpu_program.vertex_ht); + i32 vertex_count = group->vertex_list.vertex_count; + if (vertex_count > 0){ + Face *face = font_set_face_from_id(font_set, group->face_id); + if (face != 0){ + gl__bind_texture(t, face->texture); + } + else{ + gl__bind_any_texture(t); + } + + glBufferData(GL_ARRAY_BUFFER, vertex_count*sizeof(Render_Vertex), 0, GL_STREAM_DRAW); + i32 cursor = 0; + for (Render_Vertex_Array_Node *node = group->vertex_list.first; + node != 0; + node = node->next){ + i32 size = node->vertex_count*sizeof(*node->vertices); + glBufferSubData(GL_ARRAY_BUFFER, cursor, size, node->vertices); + cursor += size; + } + + glEnableVertexAttribArray(gpu_program.vertex_p); + glEnableVertexAttribArray(gpu_program.vertex_t); + glEnableVertexAttribArray(gpu_program.vertex_c); + glEnableVertexAttribArray(gpu_program.vertex_ht); + + glVertexAttribPointer(gpu_program.vertex_p, 2, GL_FLOAT, true, sizeof(Render_Vertex), + GLOffset(Render_Vertex, xy)); + glVertexAttribPointer(gpu_program.vertex_t, 3, GL_FLOAT, true, sizeof(Render_Vertex), + GLOffset(Render_Vertex, uvw)); + glVertexAttribIPointer(gpu_program.vertex_c, 1, GL_UNSIGNED_INT, sizeof(Render_Vertex), + GLOffset(Render_Vertex, color)); + glVertexAttribPointer(gpu_program.vertex_ht, 1, GL_FLOAT, true, sizeof(Render_Vertex), + GLOffset(Render_Vertex, half_thickness)); + + glUniform2f(gpu_program.view_t, width/2.f, height/2.f); + f32 m[4] = { + 2.f/width, 0.f, + 0.f, -2.f/height, + }; + glUniformMatrix2fv(gpu_program.view_m, 1, GL_FALSE, m); + glUniform1i(gpu_program.sampler, 0); + + glDrawArrays(GL_TRIANGLES, 0, vertex_count); + glDisableVertexAttribArray(gpu_program.vertex_p); + glDisableVertexAttribArray(gpu_program.vertex_t); + glDisableVertexAttribArray(gpu_program.vertex_c); + glDisableVertexAttribArray(gpu_program.vertex_ht); + } } + + glFlush(); } - glFlush(); -} - -// BOTTOM - + // BOTTOM + + \ No newline at end of file From e91e76f3880b4f855e3cd2b23d6823698e248b73 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 19 Feb 2020 22:45:46 -0800 Subject: [PATCH 17/40] 2.1 --- platform_linux/linux_4ed.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index fea3b1f7..838f5c6c 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -732,8 +732,8 @@ glx_create_context(GLXFBConfig fb_config){ ctx = glXCreateNewContext(linuxvars.dpy, fb_config, GLX_RGBA_TYPE, 0, True); } else { static const int context_attribs[] = { - GLX_CONTEXT_MAJOR_VERSION_ARB, 3, - GLX_CONTEXT_MINOR_VERSION_ARB, 2, + GLX_CONTEXT_MAJOR_VERSION_ARB, 2, + GLX_CONTEXT_MINOR_VERSION_ARB, 1, GLX_CONTEXT_PROFILE_MASK_ARB , GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, #if GL_DEBUG_MODE GLX_CONTEXT_FLAGS_ARB , GLX_CONTEXT_DEBUG_BIT_ARB, From e9b1791a84de4774437deaf1a374d5e1c04d9d14 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 27 Feb 2020 18:26:37 -0800 Subject: [PATCH 18/40] Update linux project commands; fix new file saving on linux --- custom/generated/command_metadata.h | 476 ++++++++++++------------- platform_linux/linux_4ed_functions.cpp | 2 +- project.4coder | 8 +- 3 files changed, 243 insertions(+), 243 deletions(-) diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index 19059348..c43f5fef 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -260,244 +260,244 @@ i32 source_name_len; i32 line_number; }; static Command_Metadata fcoder_metacmd_table[238] = { -{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 409 }, -{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 413 }, -{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 423 }, -{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 404 }, -{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 165 }, -{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 96 }, -{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 658 }, -{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 68 }, -{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 159 }, -{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 122 }, -{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 208 }, -{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 284 }, -{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 290 }, -{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 180 }, -{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 647 }, -{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 480 }, -{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 216 }, -{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 244 }, -{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 234 }, -{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 254 }, -{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 266 }, -{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 7 }, -{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 843 }, -{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 174 }, -{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 666 }, -{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "W:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 190 }, -{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 761 }, -{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 125 }, -{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 149 }, -{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 107 }, -{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 135 }, -{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "W:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 175 }, -{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 116 }, -{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 749 }, -{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1891 }, -{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 7 }, -{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 23 }, -{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 51 }, -{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 173 }, -{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 79 }, -{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 112 }, -{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1317 }, -{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1489 }, -{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 145 }, -{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1475 }, -{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "W:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 22 }, -{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "W:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 7 }, -{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 836 }, -{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2201 }, -{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2209 }, -{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 525 }, -{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 542 }, -{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 348 }, -{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 375 }, -{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 844 }, -{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 464 }, -{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 494 }, -{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 481 }, -{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 511 }, -{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 696 }, -{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 682 }, -{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 869 }, -{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 70 }, -{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 564 }, -{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 581 }, -{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 738 }, -{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 520 }, -{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 661 }, -{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 715 }, -{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 612 }, -{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 510 }, -{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "W:\\4ed\\code\\custom\\4coder_code_index_listers.cpp", 48, 12 }, -{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 54 }, -{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 77 }, -{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 41 }, -{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1635 }, -{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 9 }, -{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 222 }, -{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 295 }, -{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 301 }, -{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 267 }, -{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 277 }, -{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 165 }, -{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 177 }, -{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 189 }, -{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 195 }, -{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 201 }, -{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 207 }, -{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 213 }, -{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 221 }, -{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 171 }, -{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 183 }, -{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 863 }, -{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "W:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1627 }, -{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 457 }, -{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 469 }, -{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1429 }, -{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 44 }, -{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 237 }, -{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 249 }, -{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 29 }, -{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 231 }, -{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 243 }, -{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 791 }, -{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 276 }, -{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 347 }, -{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 359 }, -{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 365 }, -{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 418 }, -{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 442 }, -{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 430 }, -{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 448 }, -{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 525 }, -{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 539 }, -{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 497 }, -{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 482 }, -{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 511 }, -{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1469 }, -{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1463 }, -{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 456 }, -{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 518 }, -{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 532 }, -{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 490 }, -{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 474 }, -{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 504 }, -{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 341 }, -{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 353 }, -{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 412 }, -{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 436 }, -{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 424 }, -{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 364 }, -{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 373 }, -{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 849 }, -{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 855 }, -{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1554 }, -{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1885 }, -{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 46 }, -{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 62 }, -{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 54 }, -{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1586 }, -{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 310 }, -{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 300 }, -{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 383 }, -{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 375 }, -{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 127 }, -{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 202 }, -{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 161 }, -{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 209 }, -{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 106 }, -{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 226 }, -{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 219 }, -{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 212 }, -{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "W:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 886 }, -{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1290 }, -{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 871 }, -{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 897 }, -{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1245 }, -{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1266 }, -{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1282 }, -{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1724 }, -{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1809 }, -{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1394 }, -{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1653 }, -{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1155 }, -{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1146 }, -{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1137 }, -{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1078 }, -{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1090 }, -{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1643 }, -{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 382 }, -{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1361 }, -{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1072 }, -{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1084 }, -{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2189 }, -{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2177 }, -{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2195 }, -{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2183 }, -{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 548 }, -{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 57 }, -{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 66 }, -{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 82 }, -{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 99 }, -{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 27 }, -{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 39 }, -{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 125 }, -{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 112 }, -{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 86 }, -{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 99 }, -{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 718 }, -{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 760 }, -{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 126 }, -{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 427 }, -{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 421 }, -{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1238 }, -{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1250 }, -{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1244 }, -{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1231 }, -{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 689 }, -{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 675 }, -{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "W:\\4ed\\code\\custom\\4coder_log_parser.cpp", 40, 994 }, -{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 190 }, -{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 198 }, -{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 237 }, -{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 403 }, -{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1611 }, -{ PROC_LINKS(test_double_backspace, 0), false, "test_double_backspace", 21, "Made for testing purposes (I should have deleted this if you are reading it let me know)", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 115 }, -{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 785 }, -{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 574 }, -{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 561 }, -{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 703 }, -{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 712 }, -{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 451 }, -{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 439 }, -{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 433 }, -{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 817 }, -{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 823 }, -{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 415 }, -{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 445 }, -{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 808 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "W:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1176 }, -{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 20 }, -{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 34 }, -{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 }, -{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1711 }, -{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1738 }, -{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1599 }, -{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "W:\\4ed\\code\\custom\\4coder_jump_lister.cpp", 41, 59 }, -{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 395 }, -{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 642 }, -{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 94 }, -{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 82 }, -{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 88 }, -{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 67 }, -{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 433 }, -{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 59 }, -{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 76 }, -{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 73 }, -{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 100 }, +{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "../code/custom/4coder_default_framework.cpp", 43, 409 }, +{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "../code/custom/4coder_auto_indent.cpp", 37, 413 }, +{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "../code/custom/4coder_auto_indent.cpp", 37, 423 }, +{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "../code/custom/4coder_auto_indent.cpp", 37, 404 }, +{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "../code/custom/4coder_base_commands.cpp", 39, 165 }, +{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "../code/custom/4coder_base_commands.cpp", 39, 96 }, +{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "../code/custom/4coder_base_commands.cpp", 39, 658 }, +{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "../code/custom/4coder_clipboard.cpp", 35, 68 }, +{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "../code/custom/4coder_build_commands.cpp", 40, 159 }, +{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "../code/custom/4coder_build_commands.cpp", 40, 122 }, +{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "../code/custom/4coder_base_commands.cpp", 39, 208 }, +{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "../code/custom/4coder_default_framework.cpp", 43, 284 }, +{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "../code/custom/4coder_default_framework.cpp", 43, 290 }, +{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "../code/custom/4coder_build_commands.cpp", 40, 180 }, +{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 647 }, +{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "../code/custom/4coder_default_framework.cpp", 43, 480 }, +{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "../code/custom/4coder_clipboard.cpp", 35, 216 }, +{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "../code/custom/4coder_base_commands.cpp", 39, 244 }, +{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "../code/custom/4coder_base_commands.cpp", 39, 234 }, +{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "../code/custom/4coder_base_commands.cpp", 39, 254 }, +{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "../code/custom/4coder_base_commands.cpp", 39, 266 }, +{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "../code/custom/4coder_clipboard.cpp", 35, 7 }, +{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "../code/custom/4coder_project_commands.cpp", 42, 843 }, +{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "../code/custom/4coder_build_commands.cpp", 40, 174 }, +{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "../code/custom/4coder_base_commands.cpp", 39, 666 }, +{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "../code/custom/4coder_docs.cpp", 30, 190 }, +{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "../code/custom/4coder_lists.cpp", 31, 761 }, +{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "../code/custom/4coder_combined_write_commands.cpp", 49, 125 }, +{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "../code/custom/4coder_combined_write_commands.cpp", 49, 149 }, +{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "../code/custom/4coder_clipboard.cpp", 35, 107 }, +{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "../code/custom/4coder_base_commands.cpp", 39, 135 }, +{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "../code/custom/4coder_docs.cpp", 30, 175 }, +{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "../code/custom/4coder_clipboard.cpp", 35, 116 }, +{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 749 }, +{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "../code/custom/4coder_base_commands.cpp", 39, 1891 }, +{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "../code/custom/4coder_default_hooks.cpp", 39, 7 }, +{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "../code/custom/4coder_default_hooks.cpp", 39, 23 }, +{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "../code/custom/4coder_default_hooks.cpp", 39, 51 }, +{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "../code/custom/4coder_base_commands.cpp", 39, 173 }, +{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "../code/custom/4coder_base_commands.cpp", 39, 79 }, +{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "../code/custom/4coder_scope_commands.cpp", 40, 112 }, +{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "../code/custom/4coder_base_commands.cpp", 39, 1317 }, +{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "../code/custom/4coder_base_commands.cpp", 39, 1489 }, +{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "../code/custom/4coder_base_commands.cpp", 39, 145 }, +{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "../code/custom/4coder_base_commands.cpp", 39, 1475 }, +{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "../code/custom/4coder_cli_command.cpp", 37, 22 }, +{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "../code/custom/4coder_cli_command.cpp", 37, 7 }, +{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "../code/custom/4coder_base_commands.cpp", 39, 836 }, +{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "../code/custom/4coder_helper.cpp", 32, 2201 }, +{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "../code/custom/4coder_helper.cpp", 32, 2209 }, +{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "../code/custom/4coder_jump_sticky.cpp", 37, 525 }, +{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "../code/custom/4coder_jump_sticky.cpp", 37, 542 }, +{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "../code/custom/4coder_jump_sticky.cpp", 37, 348 }, +{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "../code/custom/4coder_jump_sticky.cpp", 37, 375 }, +{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "../code/custom/4coder_base_commands.cpp", 39, 844 }, +{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "../code/custom/4coder_jump_sticky.cpp", 37, 464 }, +{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "../code/custom/4coder_jump_sticky.cpp", 37, 494 }, +{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "../code/custom/4coder_jump_sticky.cpp", 37, 481 }, +{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "../code/custom/4coder_jump_sticky.cpp", 37, 511 }, +{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 696 }, +{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 682 }, +{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "../code/custom/4coder_tutorial.cpp", 34, 869 }, +{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 70 }, +{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "../code/custom/4coder_jump_sticky.cpp", 37, 564 }, +{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "../code/custom/4coder_jump_sticky.cpp", 37, 581 }, +{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 738 }, +{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "../code/custom/4coder_lists.cpp", 31, 520 }, +{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "../code/custom/4coder_lists.cpp", 31, 661 }, +{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "../code/custom/4coder_lists.cpp", 31, 715 }, +{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "../code/custom/4coder_lists.cpp", 31, 612 }, +{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "../code/custom/4coder_lists.cpp", 31, 510 }, +{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "../code/custom/4coder_code_index_listers.cpp", 44, 12 }, +{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "../code/custom/4coder_keyboard_macro.cpp", 40, 54 }, +{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "../code/custom/4coder_keyboard_macro.cpp", 40, 77 }, +{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "../code/custom/4coder_keyboard_macro.cpp", 40, 41 }, +{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1635 }, +{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "../code/custom/4coder_tutorial.cpp", 34, 9 }, +{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "../code/custom/4coder_base_commands.cpp", 39, 222 }, +{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "../code/custom/4coder_function_list.cpp", 39, 295 }, +{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "../code/custom/4coder_function_list.cpp", 39, 301 }, +{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "../code/custom/4coder_function_list.cpp", 39, 267 }, +{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "../code/custom/4coder_function_list.cpp", 39, 277 }, +{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "../code/custom/4coder_search.cpp", 32, 165 }, +{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "../code/custom/4coder_search.cpp", 32, 177 }, +{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 189 }, +{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 195 }, +{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 201 }, +{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 207 }, +{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "../code/custom/4coder_search.cpp", 32, 213 }, +{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "../code/custom/4coder_search.cpp", 32, 221 }, +{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "../code/custom/4coder_search.cpp", 32, 171 }, +{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "../code/custom/4coder_search.cpp", 32, 183 }, +{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "../code/custom/4coder_project_commands.cpp", 42, 863 }, +{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "../code/custom/4coder_config.cpp", 32, 1627 }, +{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "../code/custom/4coder_default_framework.cpp", 43, 457 }, +{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "../code/custom/4coder_default_framework.cpp", 43, 469 }, +{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "../code/custom/4coder_base_commands.cpp", 39, 1429 }, +{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 44 }, +{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 237 }, +{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 249 }, +{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 29 }, +{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 231 }, +{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 243 }, +{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "../code/custom/4coder_base_commands.cpp", 39, 791 }, +{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "../code/custom/4coder_base_commands.cpp", 39, 276 }, +{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "../code/custom/4coder_base_commands.cpp", 39, 347 }, +{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "../code/custom/4coder_base_commands.cpp", 39, 359 }, +{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "../code/custom/4coder_base_commands.cpp", 39, 365 }, +{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "../code/custom/4coder_base_commands.cpp", 39, 418 }, +{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 442 }, +{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 430 }, +{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "../code/custom/4coder_base_commands.cpp", 39, 448 }, +{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "../code/custom/4coder_base_commands.cpp", 39, 525 }, +{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "../code/custom/4coder_base_commands.cpp", 39, 539 }, +{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "../code/custom/4coder_base_commands.cpp", 39, 497 }, +{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "../code/custom/4coder_base_commands.cpp", 39, 482 }, +{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "../code/custom/4coder_base_commands.cpp", 39, 511 }, +{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "../code/custom/4coder_base_commands.cpp", 39, 1469 }, +{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "../code/custom/4coder_base_commands.cpp", 39, 1463 }, +{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "../code/custom/4coder_base_commands.cpp", 39, 456 }, +{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "../code/custom/4coder_base_commands.cpp", 39, 518 }, +{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "../code/custom/4coder_base_commands.cpp", 39, 532 }, +{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "../code/custom/4coder_base_commands.cpp", 39, 490 }, +{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "../code/custom/4coder_base_commands.cpp", 39, 474 }, +{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "../code/custom/4coder_base_commands.cpp", 39, 504 }, +{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "../code/custom/4coder_base_commands.cpp", 39, 341 }, +{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "../code/custom/4coder_base_commands.cpp", 39, 353 }, +{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "../code/custom/4coder_base_commands.cpp", 39, 412 }, +{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 436 }, +{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 424 }, +{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "../code/custom/4coder_clipboard.cpp", 35, 364 }, +{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "../code/custom/4coder_clipboard.cpp", 35, 373 }, +{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "../code/custom/4coder_project_commands.cpp", 42, 849 }, +{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "../code/custom/4coder_project_commands.cpp", 42, 855 }, +{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "../code/custom/4coder_base_commands.cpp", 39, 1554 }, +{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1885 }, +{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "../code/custom/4coder_combined_write_commands.cpp", 49, 46 }, +{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "../code/custom/4coder_combined_write_commands.cpp", 49, 62 }, +{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "../code/custom/4coder_combined_write_commands.cpp", 49, 54 }, +{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1586 }, +{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "../code/custom/4coder_default_framework.cpp", 43, 310 }, +{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "../code/custom/4coder_default_framework.cpp", 43, 300 }, +{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "../code/custom/4coder_base_commands.cpp", 39, 383 }, +{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "../code/custom/4coder_base_commands.cpp", 39, 375 }, +{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "../code/custom/4coder_clipboard.cpp", 35, 127 }, +{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "../code/custom/4coder_clipboard.cpp", 35, 202 }, +{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "../code/custom/4coder_clipboard.cpp", 35, 161 }, +{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "../code/custom/4coder_clipboard.cpp", 35, 209 }, +{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "../code/custom/4coder_scope_commands.cpp", 40, 106 }, +{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "../code/custom/4coder_profile.cpp", 33, 226 }, +{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "../code/custom/4coder_profile.cpp", 33, 219 }, +{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "../code/custom/4coder_profile.cpp", 33, 212 }, +{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "../code/custom/4coder_profile_inspect.cpp", 41, 886 }, +{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "../code/custom/4coder_project_commands.cpp", 42, 1290 }, +{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "../code/custom/4coder_project_commands.cpp", 42, 871 }, +{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "../code/custom/4coder_project_commands.cpp", 42, 897 }, +{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "../code/custom/4coder_base_commands.cpp", 39, 1245 }, +{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "../code/custom/4coder_base_commands.cpp", 39, 1266 }, +{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "../code/custom/4coder_base_commands.cpp", 39, 1282 }, +{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 1724 }, +{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "../code/custom/4coder_base_commands.cpp", 39, 1809 }, +{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "../code/custom/4coder_base_commands.cpp", 39, 1394 }, +{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1653 }, +{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "../code/custom/4coder_base_commands.cpp", 39, 1155 }, +{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "../code/custom/4coder_base_commands.cpp", 39, 1146 }, +{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "../code/custom/4coder_base_commands.cpp", 39, 1137 }, +{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "../code/custom/4coder_base_commands.cpp", 39, 1078 }, +{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "../code/custom/4coder_base_commands.cpp", 39, 1090 }, +{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1643 }, +{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "../code/custom/4coder_default_framework.cpp", 43, 382 }, +{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1361 }, +{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "../code/custom/4coder_base_commands.cpp", 39, 1072 }, +{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "../code/custom/4coder_base_commands.cpp", 39, 1084 }, +{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "../code/custom/4coder_helper.cpp", 32, 2189 }, +{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "../code/custom/4coder_helper.cpp", 32, 2177 }, +{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "../code/custom/4coder_helper.cpp", 32, 2195 }, +{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "../code/custom/4coder_helper.cpp", 32, 2183 }, +{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "../code/custom/4coder_base_commands.cpp", 39, 548 }, +{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "../code/custom/4coder_scope_commands.cpp", 40, 57 }, +{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "../code/custom/4coder_scope_commands.cpp", 40, 66 }, +{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "../code/custom/4coder_scope_commands.cpp", 40, 82 }, +{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "../code/custom/4coder_scope_commands.cpp", 40, 99 }, +{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "../code/custom/4coder_scope_commands.cpp", 40, 27 }, +{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "../code/custom/4coder_scope_commands.cpp", 40, 39 }, +{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "../code/custom/4coder_eol.cpp", 29, 125 }, +{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "../code/custom/4coder_eol.cpp", 29, 112 }, +{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "../code/custom/4coder_eol.cpp", 29, 86 }, +{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "../code/custom/4coder_eol.cpp", 29, 99 }, +{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "../code/custom/4coder_base_commands.cpp", 39, 718 }, +{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "../code/custom/4coder_base_commands.cpp", 39, 760 }, +{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "../code/custom/4coder_base_commands.cpp", 39, 126 }, +{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "../code/custom/4coder_default_framework.cpp", 43, 427 }, +{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "../code/custom/4coder_default_framework.cpp", 43, 421 }, +{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1238 }, +{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1250 }, +{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1244 }, +{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "../code/custom/4coder_project_commands.cpp", 42, 1231 }, +{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 689 }, +{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 675 }, +{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "../code/custom/4coder_log_parser.cpp", 36, 994 }, +{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "../code/custom/4coder_base_commands.cpp", 39, 190 }, +{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "../code/custom/4coder_base_commands.cpp", 39, 198 }, +{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "../code/custom/4coder_combined_write_commands.cpp", 49, 237 }, +{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "../code/custom/4coder_default_framework.cpp", 43, 403 }, +{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "../code/custom/4coder_base_commands.cpp", 39, 1611 }, +{ PROC_LINKS(test_double_backspace, 0), false, "test_double_backspace", 21, "Made for testing purposes (I should have deleted this if you are reading it let me know)", 88, "../code/custom/4coder_base_commands.cpp", 39, 115 }, +{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "../code/custom/4coder_lists.cpp", 31, 785 }, +{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 574 }, +{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 561 }, +{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "../code/custom/4coder_base_commands.cpp", 39, 703 }, +{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "../code/custom/4coder_base_commands.cpp", 39, 712 }, +{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "../code/custom/4coder_default_framework.cpp", 43, 451 }, +{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "../code/custom/4coder_default_framework.cpp", 43, 439 }, +{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "../code/custom/4coder_default_framework.cpp", 43, 433 }, +{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "../code/custom/4coder_base_commands.cpp", 39, 817 }, +{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "../code/custom/4coder_base_commands.cpp", 39, 823 }, +{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "../code/custom/4coder_default_framework.cpp", 43, 415 }, +{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "../code/custom/4coder_default_framework.cpp", 43, 445 }, +{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "../code/custom/4coder_base_commands.cpp", 39, 808 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "../code/custom/4coder_code_index.cpp", 36, 1176 }, +{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 20 }, +{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 34 }, +{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 137 }, +{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "../code/custom/4coder_base_commands.cpp", 39, 1711 }, +{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "../code/custom/4coder_base_commands.cpp", 39, 1738 }, +{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "../code/custom/4coder_base_commands.cpp", 39, 1599 }, +{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "../code/custom/4coder_jump_lister.cpp", 37, 59 }, +{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "../code/custom/4coder_search.cpp", 32, 395 }, +{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "../code/custom/4coder_search.cpp", 32, 642 }, +{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "../code/custom/4coder_combined_write_commands.cpp", 49, 94 }, +{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 82 }, +{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 88 }, +{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "../code/custom/4coder_base_commands.cpp", 39, 67 }, +{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "../code/custom/4coder_auto_indent.cpp", 37, 433 }, +{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "../code/custom/4coder_base_commands.cpp", 39, 59 }, +{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 76 }, +{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "../code/custom/4coder_base_commands.cpp", 39, 73 }, +{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "../code/custom/4coder_combined_write_commands.cpp", 49, 100 }, }; static i32 fcoder_metacmd_ID_allow_mouse = 0; static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 1; diff --git a/platform_linux/linux_4ed_functions.cpp b/platform_linux/linux_4ed_functions.cpp index db0e400d..1d250e6e 100644 --- a/platform_linux/linux_4ed_functions.cpp +++ b/platform_linux/linux_4ed_functions.cpp @@ -212,7 +212,7 @@ system_save_file(Arena* scratch, char* file_name, String_Const_u8 data){ // TODO(inso): should probably put a \n on the end if it's a text file. - int fd = open(file_name, O_WRONLY, O_CREAT); + int fd = open(file_name, O_WRONLY|O_CREAT, 0666); if (fd != -1) { int bytes_written = write(fd, data.str, data.size); if (bytes_written == -1) { diff --git a/project.4coder b/project.4coder index c5484349..d3c1ec54 100644 --- a/project.4coder +++ b/project.4coder @@ -26,8 +26,8 @@ load_paths = { build_x64_win32 = "echo build: x64 & bin\\build.bat"; build_x86_win32 = "echo build: x86 & bin\\build.bat /DDEV_BUILD_X86"; -build_x64_linux = "echo build: x64 & bin/build.sh"; -build_x86_linux = "echo build: x86 & bin/build.sh -DDEV_BUILD_X86"; +build_x64_linux = "echo build: x64 & bin/build-linux.sh"; +build_x86_linux = "echo build: x86 & bin/build-linux.sh -DDEV_BUILD_X86"; build_x64_mac = "echo build: x64 & bin/build-mac.sh"; build_x86_mac = "echo build: x86 & bin/build-mac.sh -DDEV_BUILD_X86"; @@ -46,8 +46,8 @@ command_list = { { .name = "package", .out = "*compilation*", .footer_panel = false, .save_dirty_files = true, - .cmd = { {"echo package & bin\\package.bat", .os = "win" }, - {"echo package & bin/package.sh" , .os = "linux"}, + .cmd = { {"echo package & bin\\package.bat", .os = "win" }, + {"echo package & bin/package.sh" , .os = "linux"}, {"echo package & bin/package.sh" , .os = "mac" }, }, }, { .name = "run one time", From cf961d4b3a68f828924edc05ab830fb494ba17c6 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 27 Feb 2020 18:29:16 -0800 Subject: [PATCH 19/40] More updating project.4coder for linux commands --- project.4coder | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/project.4coder b/project.4coder index d3c1ec54..24fc991f 100644 --- a/project.4coder +++ b/project.4coder @@ -53,11 +53,13 @@ command_list = { { .name = "run one time", .out = "*run*", .footer_panel = false, .save_dirty_files = false, .cmd = { { "pushd ..\\build & one_time", .os = "win" }, - { "pushd ../build & one_time", .os = "mac" }, }, }, + { "pushd ../build & one_time", .os = "linux" }, + { "pushd ../build & one_time", .os = "mac" }, }, }, { .name = "build custom api docs", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cmd = { { "custom\\bin\\build_one_time docs\\4ed_doc_custom_api_main.cpp ..\\build", .os = "win" }, + { "custom/bin/build_one_time.sh docs/4ed_doc_custom_api_main.cpp ../build", .os = "linux" }, { "custom/bin/build_one_time.sh docs/4ed_doc_custom_api_main.cpp ../build", .os = "mac" }, }, }, { .name = "build C++ lexer generator", From a510ae5dcec44d757c444dd32288c2615c7e36bb Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 27 Feb 2020 18:38:00 -0800 Subject: [PATCH 20/40] Fix linux mutexes to be recursive; tombstone the old unix code --- platform_linux/linux_4ed_functions.cpp | 5 ++++- platform_unix/unix_4ed_functions.cpp | 2 ++ platform_unix/unix_4ed_headers.h | 2 ++ platform_unix/unix_library_wrapper.h | 2 ++ platform_unix/unix_threading_wrapper.h | 2 ++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/platform_linux/linux_4ed_functions.cpp b/platform_linux/linux_4ed_functions.cpp index 1d250e6e..9d005377 100644 --- a/platform_linux/linux_4ed_functions.cpp +++ b/platform_linux/linux_4ed_functions.cpp @@ -554,7 +554,10 @@ internal System_Mutex system_mutex_make(void){ System_Mutex result = {}; Linux_Object* object = linux_alloc_object(LinuxObjectKind_Mutex); - pthread_mutex_init(&object->mutex, NULL); + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&object->mutex, &attr); *(Linux_Object**)&result = object; //LINUX_FN_DEBUG("%p", object); return result; diff --git a/platform_unix/unix_4ed_functions.cpp b/platform_unix/unix_4ed_functions.cpp index d6fe65b7..693d6e15 100644 --- a/platform_unix/unix_4ed_functions.cpp +++ b/platform_unix/unix_4ed_functions.cpp @@ -9,6 +9,8 @@ // TOP +#error IS THIS STILL REAL? (February 27th 2020) + #if !defined(FD_CHECK) #define FD_CHECK() #endif diff --git a/platform_unix/unix_4ed_headers.h b/platform_unix/unix_4ed_headers.h index 7548359b..2a48e541 100644 --- a/platform_unix/unix_4ed_headers.h +++ b/platform_unix/unix_4ed_headers.h @@ -9,6 +9,8 @@ // TOP +#error IS THIS STILL REAL? (February 27th 2020) + #include #include #include diff --git a/platform_unix/unix_library_wrapper.h b/platform_unix/unix_library_wrapper.h index 0af75f92..b358ce34 100644 --- a/platform_unix/unix_library_wrapper.h +++ b/platform_unix/unix_library_wrapper.h @@ -9,6 +9,8 @@ // TOP +#error IS THIS STILL REAL? (February 27th 2020) + union Library{ void *lib; FixSize(LIBRARY_TYPE_SIZE); diff --git a/platform_unix/unix_threading_wrapper.h b/platform_unix/unix_threading_wrapper.h index a8d1afd9..15af8bd2 100644 --- a/platform_unix/unix_threading_wrapper.h +++ b/platform_unix/unix_threading_wrapper.h @@ -9,6 +9,8 @@ // TOP +#error IS THIS STILL REAL? (February 27th 2020) + #if !defined(MAC_THREADING_WRAPPER) #define MAC_THREADING_WRAPPER From 0ae7987ceccca9068d13022dd39cdce36180c606 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 27 Feb 2020 18:54:30 -0800 Subject: [PATCH 21/40] Printf debugging the .so search; fixed file truncation bug --- 4ed_search_list.cpp | 2 ++ platform_linux/linux_4ed.cpp | 2 +- platform_linux/linux_4ed_functions.cpp | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/4ed_search_list.cpp b/4ed_search_list.cpp index 9eecc551..976872c4 100644 --- a/4ed_search_list.cpp +++ b/4ed_search_list.cpp @@ -42,9 +42,11 @@ get_full_path(Arena *arena, Path_Search_List *search_list, String_Const_u8 relat u8 *path_base = relative_base - node_size; block_copy(path_base, node->string.str, node_size); String_Const_u8 name = SCu8(path_base, opl); + printf("get_full_path: trying %.*s\n", string_expand(name)); File_Attributes attribs = system_quick_file_attributes(arena, name); if (attribs.size > 0){ result = name; + printf("hit\n"); break; } } diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 838f5c6c..1a481880 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -1666,7 +1666,7 @@ main(int argc, char **argv){ char custom_fail_version_msg[] = "Failed to load custom code due to a version mismatch. Try rebuilding with buildsuper."; char custom_fail_init_apis[] = "Failed to load custom code due to missing 'init_apis' symbol. Try rebuilding with buildsuper"; - Scratch_Block scratch(&linuxvars.tctx, Scratch_Share); + Scratch_Block scratch(&linuxvars.tctx); String_Const_u8 default_file_name = string_u8_litexpr("custom_4coder.so"); Path_Search_List search_list = {}; search_list_add_system_path(scratch, &search_list, SystemPath_CurrentDirectory); diff --git a/platform_linux/linux_4ed_functions.cpp b/platform_linux/linux_4ed_functions.cpp index 9d005377..689d9c89 100644 --- a/platform_linux/linux_4ed_functions.cpp +++ b/platform_linux/linux_4ed_functions.cpp @@ -212,7 +212,7 @@ system_save_file(Arena* scratch, char* file_name, String_Const_u8 data){ // TODO(inso): should probably put a \n on the end if it's a text file. - int fd = open(file_name, O_WRONLY|O_CREAT, 0666); + int fd = open(file_name, O_TRUNC|O_WRONLY|O_CREAT, 0666); if (fd != -1) { int bytes_written = write(fd, data.str, data.size); if (bytes_written == -1) { From d9341614476bfa002511be778085b26ebc95ffca Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 27 Feb 2020 19:04:05 -0800 Subject: [PATCH 22/40] Check for stat errors when getting file attributes on linux --- 4ed_search_list.cpp | 2 -- platform_linux/linux_4ed.cpp | 2 +- platform_linux/linux_4ed_functions.cpp | 29 ++++++++++++++++++-------- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/4ed_search_list.cpp b/4ed_search_list.cpp index 976872c4..9eecc551 100644 --- a/4ed_search_list.cpp +++ b/4ed_search_list.cpp @@ -42,11 +42,9 @@ get_full_path(Arena *arena, Path_Search_List *search_list, String_Const_u8 relat u8 *path_base = relative_base - node_size; block_copy(path_base, node->string.str, node_size); String_Const_u8 name = SCu8(path_base, opl); - printf("get_full_path: trying %.*s\n", string_expand(name)); File_Attributes attribs = system_quick_file_attributes(arena, name); if (attribs.size > 0){ result = name; - printf("hit\n"); break; } } diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 1a481880..c24a6a2a 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -353,7 +353,7 @@ linux_file_attributes_from_struct_stat(struct stat* file_stat) { result.size = file_stat->st_size; result.last_write_time = linux_ns_from_timespec(file_stat->st_mtim); result.flags = linux_convert_file_attribute_flags(file_stat->st_mode); - return result; + return(result); } internal void diff --git a/platform_linux/linux_4ed_functions.cpp b/platform_linux/linux_4ed_functions.cpp index 689d9c89..6f4145e1 100644 --- a/platform_linux/linux_4ed_functions.cpp +++ b/platform_linux/linux_4ed_functions.cpp @@ -132,11 +132,13 @@ system_get_file_list(Arena* arena, String_Const_u8 directory){ (*fip)->file_name = push_u8_stringf(arena, "%.*s", d->d_reclen, name); struct stat st; - if(fstatat(fd, name, &st, 0) == -1){ + if (fstatat(fd, name, &st, 0) == -1){ perror("fstatat"); } + else{ + (*fip)->attributes = linux_file_attributes_from_struct_stat(&st); + } - (*fip)->attributes = linux_file_attributes_from_struct_stat(&st); fip = &(*fip)->next; result.count++; } @@ -163,9 +165,14 @@ system_get_file_list(Arena* arena, String_Const_u8 directory){ internal File_Attributes system_quick_file_attributes(Arena* scratch, String_Const_u8 file_name){ //LINUX_FN_DEBUG("%.*s", (int)file_name.size, file_name.str); + Temp_Memory_Block temp(scratch); + file_name = push_string_copy(scratch, file_name); + File_Attributes result = {}; struct stat file_stat; - stat((const char*)file_name.str, &file_stat); - return linux_file_attributes_from_struct_stat(&file_stat); + if (stat((const char*)file_name.str, &file_stat) == 0){ + result = linux_file_attributes_from_struct_stat(&file_stat); + } + return(result); } internal b32 @@ -182,9 +189,12 @@ system_load_handle(Arena* scratch, char* file_name, Plat_Handle* out){ internal File_Attributes system_load_attributes(Plat_Handle handle){ LINUX_FN_DEBUG(); + File_Attributes result = {}; struct stat file_stat; - fstat(*(int*)&handle, &file_stat); - return linux_file_attributes_from_struct_stat(&file_stat); + if (fstat(*(int*)&handle, &file_stat) == 0){ + result = linux_file_attributes_from_struct_stat(&file_stat); + } + return(result); } internal b32 @@ -217,10 +227,11 @@ system_save_file(Arena* scratch, char* file_name, String_Const_u8 data){ int bytes_written = write(fd, data.str, data.size); if (bytes_written == -1) { perror("write"); - } else if(bytes_written == data.size) { + } else if (bytes_written == data.size) { struct stat file_stat; - fstat(fd, &file_stat); - return linux_file_attributes_from_struct_stat(&file_stat); + if (fstat(fd, &file_stat) == 0){ + result = linux_file_attributes_from_struct_stat(&file_stat); + } } } else { perror("open"); From e300b209c10c35aa0bbc0634ef591d80854fcb1f Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 27 Feb 2020 20:04:46 -0800 Subject: [PATCH 23/40] Put linux now time on microseconds so dt is computed correctly; fix a bug in linux_schedule_step --- 4ed.cpp | 2 +- custom/4coder_delta_rule.cpp | 10 +-- platform_linux/linux_4ed.cpp | 43 +++++----- platform_linux/linux_4ed_functions.cpp | 4 +- platform_linux/linux_4ed_old.cpp | 108 ++++++++++++------------- platform_win32/win32_4ed.cpp | 6 +- 6 files changed, 88 insertions(+), 85 deletions(-) diff --git a/4ed.cpp b/4ed.cpp index c0db72c4..a4efdd4f 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -252,7 +252,7 @@ App_Init_Sig(app_init){ working_set_init(models, &models->working_set); Mutex_Lock file_order_lock(models->working_set.mutex); - // NOTE(allen): + // NOTE(allen): global_history_init(&models->global_history); text_layout_init(tctx, &models->text_layouts); diff --git a/custom/4coder_delta_rule.cpp b/custom/4coder_delta_rule.cpp index 83a7b1b5..9774dd19 100644 --- a/custom/4coder_delta_rule.cpp +++ b/custom/4coder_delta_rule.cpp @@ -53,7 +53,7 @@ delta_apply(Application_Links *app, View_ID view, } function Buffer_Point_Delta_Result -delta_apply(Application_Links *app, View_ID view, +delta_apply(Application_Links *app, View_ID view, Delta_Rule_Function *func, Data delta_ctx, f32 dt, Buffer_Scroll scroll){ return(delta_apply(app, view, func, delta_ctx, @@ -61,7 +61,7 @@ delta_apply(Application_Links *app, View_ID view, } function Buffer_Point_Delta_Result -delta_apply(Application_Links *app, View_ID view, +delta_apply(Application_Links *app, View_ID view, f32 dt, Buffer_Point position, Buffer_Point target){ View_Context ctx = view_current_context(app, view); Data delta_ctx = view_current_context_hook_memory(app, view, HookID_DeltaRule); @@ -70,7 +70,7 @@ delta_apply(Application_Links *app, View_ID view, } function Buffer_Point_Delta_Result -delta_apply(Application_Links *app, View_ID view, +delta_apply(Application_Links *app, View_ID view, f32 dt, Buffer_Scroll scroll){ View_Context ctx = view_current_context(app, view); Data delta_ctx = view_current_context_hook_memory(app, view, HookID_DeltaRule); @@ -119,7 +119,7 @@ delta_apply(Application_Links *app, View_ID view, } function Vec2_f32_Delta_Result -delta_apply(Application_Links *app, View_ID view, +delta_apply(Application_Links *app, View_ID view, f32 dt, Vec2_f32 position, Vec2_f32 target){ View_Context ctx = view_current_context(app, view); Data delta_ctx = view_current_context_hook_memory(app, view, HookID_DeltaRule); @@ -128,7 +128,7 @@ delta_apply(Application_Links *app, View_ID view, } function Vec2_f32_Delta_Result -delta_apply(Application_Links *app, View_ID view, +delta_apply(Application_Links *app, View_ID view, f32 dt, Basic_Scroll scroll){ View_Context ctx = view_current_context(app, view); Data delta_ctx = view_current_context_hook_memory(app, view, HookID_DeltaRule); diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index c24a6a2a..c114b406 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -11,8 +11,8 @@ // TOP #define FPS 60 -#define frame_useconds (1000000 / FPS) -#define frame_nseconds (UINT64_C(1000000000) / FPS) +#define frame_useconds (Million(1) / FPS) +#define frame_nseconds (Billion(1) / FPS) #define SLASH '/' #define DLL "so" @@ -168,7 +168,6 @@ struct Linux_Vars { int epoll; int step_timer_fd; u64 last_step_time; - b32 step_pending; XCursor xcursors[APP_MOUSE_CURSOR_COUNT]; Application_Mouse_Cursor cursor; @@ -336,8 +335,8 @@ linux_system_get_file_list_filter(const struct dirent *dirent) { } internal u64 -linux_ns_from_timespec(const struct timespec timespec) { - return timespec.tv_nsec + UINT64_C(1000000000) * timespec.tv_sec; +linux_us_from_timespec(const struct timespec timespec) { + return timespec.tv_nsec/Thousand(1) + Million(1) * timespec.tv_sec; } internal File_Attribute_Flag @@ -351,29 +350,28 @@ internal File_Attributes linux_file_attributes_from_struct_stat(struct stat* file_stat) { File_Attributes result = {}; result.size = file_stat->st_size; - result.last_write_time = linux_ns_from_timespec(file_stat->st_mtim); + result.last_write_time = linux_us_from_timespec(file_stat->st_mtim); result.flags = linux_convert_file_attribute_flags(file_stat->st_mode); return(result); } internal void linux_schedule_step(){ - if(!__sync_bool_compare_and_swap(&linuxvars.step_pending, 0, 1)) { - return; - } - u64 now = system_now_time(); u64 diff = (now - linuxvars.last_step_time); struct itimerspec its = {}; + timerfd_gettime(linuxvars.step_timer_fd, &its); - if(diff >= frame_nseconds) { + if (diff > frame_useconds) { its.it_value.tv_nsec = 1; + timerfd_settime(linuxvars.step_timer_fd, 0, &its, NULL); } else { - its.it_value.tv_nsec = frame_nseconds - diff; + if (its.it_value.tv_sec == 0 && its.it_value.tv_nsec == 0){ + its.it_value.tv_nsec = (frame_useconds - diff) * 1000UL; + timerfd_settime(linuxvars.step_timer_fd, 0, &its, NULL); + } } - - timerfd_settime(linuxvars.step_timer_fd, 0, &its, NULL); } enum wm_state_mode { @@ -583,8 +581,7 @@ linux_find_font(Face_Description* desc) { } } - FcPattern *pattern = FcPatternBuild( - 0, + FcPattern *pattern = FcPatternBuild(0, FC_POSTSCRIPT_NAME, FcTypeString, name, FC_SIZE, FcTypeDouble, size, FC_FONTFORMAT, FcTypeString, "TrueType", @@ -1455,8 +1452,7 @@ linux_handle_x11_events() { // Notify WM that we're still responding (don't grey our window out). else if(atom == linuxvars.atom__NET_WM_PING) { event.xclient.window = DefaultRootWindow(linuxvars.dpy); - XSendEvent( - linuxvars.dpy, + XSendEvent(linuxvars.dpy, event.xclient.window, False, SubstructureRedirectMask | SubstructureNotifyMask, @@ -1599,7 +1595,7 @@ main(int argc, char **argv){ //InitializeCriticalSection(&win32vars.thread_launch_mutex); //InitializeConditionVariable(&win32vars.thread_launch_cv); - linuxvars.clipboard_catch_all = true; + linuxvars.clipboard_catch_all = false; // NOTE(allen): load core System_Library core_library = {}; @@ -1729,6 +1725,7 @@ main(int argc, char **argv){ linux_schedule_step(); b32 first_step = true; + u64 timer_start = system_now_time(); for (;;) { @@ -1813,11 +1810,17 @@ main(int argc, char **argv){ gl_render(&render_target); glXSwapBuffers(linuxvars.dpy, linuxvars.win); + // TODO(allen): don't let the screen size change until HERE after the render + + // NOTE(allen): Schedule a step if necessary + if (result.animating){ + linux_schedule_step(); + } + first_step = false; linalloc_clear(linuxvars.frame_arena); block_zero_struct(&linuxvars.input.trans); - linuxvars.step_pending = false; } return 0; diff --git a/platform_linux/linux_4ed_functions.cpp b/platform_linux/linux_4ed_functions.cpp index 6f4145e1..0be85ad0 100644 --- a/platform_linux/linux_4ed_functions.cpp +++ b/platform_linux/linux_4ed_functions.cpp @@ -267,8 +267,8 @@ internal u64 system_now_time(void){ //LINUX_FN_DEBUG(); struct timespec time; - clock_gettime(CLOCK_MONOTONIC_RAW, &time); - return linux_ns_from_timespec(time); + clock_gettime(CLOCK_MONOTONIC, &time); + return linux_us_from_timespec(time); } internal Plat_Handle diff --git a/platform_linux/linux_4ed_old.cpp b/platform_linux/linux_4ed_old.cpp index 6a050baf..d0cd237d 100644 --- a/platform_linux/linux_4ed_old.cpp +++ b/platform_linux/linux_4ed_old.cpp @@ -86,7 +86,7 @@ #define frame_useconds (1000000UL / FPS) #define LINUX_FN_DEBUG(fmt, ...) do { \ - /*LOGF("%s: " fmt "\n", __func__, ##__VA_ARGS__);*/ \ +/*LOGF("%s: " fmt "\n", __func__, ##__VA_ARGS__);*/ \ } while (0) // TODO(allen): Make an intrinsics header that uses the cracked OS to define a single set of intrinsic names. @@ -547,41 +547,41 @@ Sys_Font_Path(name, parameters){ Font_Path path = {}; FcPattern *pattern_regular = FcPatternBuild( - 0, - FC_POSTSCRIPT_NAME, FcTypeString, name, - FC_SIZE, FcTypeDouble, (double)parameters->pt_size, - FC_FONTFORMAT, FcTypeString, "TrueType", - FC_STYLE, FcTypeString, (FcChar8*)"Regular", - (void*)0); + 0, + FC_POSTSCRIPT_NAME, FcTypeString, name, + FC_SIZE, FcTypeDouble, (double)parameters->pt_size, + FC_FONTFORMAT, FcTypeString, "TrueType", + FC_STYLE, FcTypeString, (FcChar8*)"Regular", + (void*)0); FcPattern *pattern_styled = 0; if (parameters->italics || parameters->bold){ if (parameters->italics && !parameters->bold){ pattern_styled = FcPatternBuild( - 0, - FC_POSTSCRIPT_NAME, FcTypeString, name, - FC_SIZE, FcTypeDouble, (double)parameters->pt_size, - FC_FONTFORMAT, FcTypeString, "TrueType", - FC_STYLE, FcTypeString, (FcChar8*)"Italic", - (void*)0); + 0, + FC_POSTSCRIPT_NAME, FcTypeString, name, + FC_SIZE, FcTypeDouble, (double)parameters->pt_size, + FC_FONTFORMAT, FcTypeString, "TrueType", + FC_STYLE, FcTypeString, (FcChar8*)"Italic", + (void*)0); } else if (!parameters->italics && parameters->bold){ pattern_styled = FcPatternBuild( - 0, - FC_POSTSCRIPT_NAME, FcTypeString, name, - FC_SIZE, FcTypeDouble, (double)parameters->pt_size, - FC_FONTFORMAT, FcTypeString, "TrueType", - FC_STYLE, FcTypeString, (FcChar8*)"Bold", - (void*)0); + 0, + FC_POSTSCRIPT_NAME, FcTypeString, name, + FC_SIZE, FcTypeDouble, (double)parameters->pt_size, + FC_FONTFORMAT, FcTypeString, "TrueType", + FC_STYLE, FcTypeString, (FcChar8*)"Bold", + (void*)0); } else{ pattern_styled = FcPatternBuild( - 0, - FC_POSTSCRIPT_NAME, FcTypeString, name, - FC_SIZE, FcTypeDouble, (double)parameters->pt_size, - FC_FONTFORMAT, FcTypeString, "TrueType", - FC_STYLE, FcTypeString, (FcChar8*)"Bold Italic", - (void*)0); + 0, + FC_POSTSCRIPT_NAME, FcTypeString, name, + FC_SIZE, FcTypeDouble, (double)parameters->pt_size, + FC_FONTFORMAT, FcTypeString, "TrueType", + FC_STYLE, FcTypeString, (FcChar8*)"Bold Italic", + (void*)0); } } @@ -672,9 +672,9 @@ linux_get_loadable_fonts(Partition *part, Font_Setup_List *list){ } FcPattern* pat = FcPatternBuild( - 0, - FC_STYLE, FcTypeString, (FcChar8*)"Regular", - (void*)0); + 0, + FC_STYLE, FcTypeString, (FcChar8*)"Regular", + (void*)0); FcObjectSet* os = FcObjectSetBuild(FC_FAMILY, FC_FILE, (char*)0); FcFontSet* fs = FcFontList(fc_config, pat, os); if (fs != 0){ @@ -778,7 +778,7 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig *best_con if (glXCreateContextAttribsARB == 0){ //LOG("glXCreateContextAttribsARB() not found, using old-style GLX context\n" ); ctx = glXCreateNewContext( XDisplay, *best_config, GLX_RGBA_TYPE, 0, True ); - } + } else{ int context_attribs[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, 2, @@ -926,7 +926,7 @@ ChooseGLXConfig(Display *XDisplay, int XScreenIndex) GLX_STENCIL_SIZE , 8, GLX_DOUBLEBUFFER , True, None - }; + }; int ConfigCount = 0; GLXFBConfig *Configs = glXChooseFBConfig(XDisplay, XScreenIndex, DesiredAttributes, &ConfigCount); @@ -1196,7 +1196,7 @@ LinuxGetXSettingsDPI(Display* dpy, int screen) Window xset_win = XGetSelectionOwner(dpy, XSET_SEL); if (xset_win == None){ // TODO(inso): listen for the ClientMessage about it becoming available? - // there's not much point atm if DPI scaling is only done at startup + // there's not much point atm if DPI scaling is only done at startup goto out; } @@ -1760,11 +1760,11 @@ linux_handle_x11_events(void) else if ((Atom)event.xclient.data.l[0] == linuxvars.atom__NET_WM_PING){ event.xclient.window = DefaultRootWindow(linuxvars.XDisplay); XSendEvent( - linuxvars.XDisplay, - event.xclient.window, - False, - SubstructureRedirectMask | SubstructureNotifyMask, - &event); + linuxvars.XDisplay, + event.xclient.window, + False, + SubstructureRedirectMask | SubstructureNotifyMask, + &event); } }break; @@ -1792,14 +1792,14 @@ linux_handle_x11_events(void) if (request.target == linuxvars.atom_TARGETS){ XChangeProperty( - request.display, - request.requestor, - request.property, - XA_ATOM, - 32, - PropModeReplace, - (u8*)atoms, - ArrayCount(atoms)); + request.display, + request.requestor, + request.property, + XA_ATOM, + 32, + PropModeReplace, + (u8*)atoms, + ArrayCount(atoms)); response.property = request.property; @@ -1814,15 +1814,15 @@ linux_handle_x11_events(void) if (found){ XChangeProperty( - request.display, - request.requestor, - request.property, - request.target, - 8, - PropModeReplace, - (u8*)linuxvars.clipboard_outgoing.str, - linuxvars.clipboard_outgoing.size - ); + request.display, + request.requestor, + request.property, + request.target, + 8, + PropModeReplace, + (u8*)linuxvars.clipboard_outgoing.str, + linuxvars.clipboard_outgoing.size + ); response.property = request.property; } @@ -1915,7 +1915,7 @@ main(int argc, char **argv){ memory_init(); // - // HACK(allen): + // HACK(allen): // Previously zipped stuff is here, it should be zipped in the new pattern now. // diff --git a/platform_win32/win32_4ed.cpp b/platform_win32/win32_4ed.cpp index 423de917..5631f44c 100644 --- a/platform_win32/win32_4ed.cpp +++ b/platform_win32/win32_4ed.cpp @@ -1343,9 +1343,9 @@ win32_gl_create_window(HWND *wnd_out, HGLRC *context_out, DWORD style, RECT rect // NOTE(allen): Load wgl extensions #define LoadWGL(f,l) Stmnt((f) = (f##_Function*)wglGetProcAddress(#f); \ - (l) = (l) && win32_wgl_good((Void_Func*)(f));) - - b32 load_success = true; +(l) = (l) && win32_wgl_good((Void_Func*)(f));) + + b32 load_success = true; LoadWGL(wglCreateContextAttribsARB, load_success); LoadWGL(wglChoosePixelFormatARB, load_success); LoadWGL(wglGetExtensionsStringEXT, load_success); From f74365392c3e4157ef532295f3b20f949688a997 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Fri, 28 Feb 2020 13:53:10 -0800 Subject: [PATCH 24/40] Update mac clipboard immplementation --- 4ed.cpp | 2 +- custom/generated/command_metadata.h | 476 +++++----- platform_mac/mac_4ed.mm | 134 +-- platform_mac/mac_4ed_functions.mm | 21 - platform_mac/mac_4ed_old.cpp | 874 ----------------- platform_mac/mac_4ed_old.m | 895 ------------------ .../osx_objective_c_to_cpp_links_old.h | 160 ---- 7 files changed, 306 insertions(+), 2256 deletions(-) delete mode 100644 platform_mac/mac_4ed_old.cpp delete mode 100644 platform_mac/mac_4ed_old.m delete mode 100644 platform_mac/osx_objective_c_to_cpp_links_old.h diff --git a/4ed.cpp b/4ed.cpp index c0db72c4..a4efdd4f 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -252,7 +252,7 @@ App_Init_Sig(app_init){ working_set_init(models, &models->working_set); Mutex_Lock file_order_lock(models->working_set.mutex); - // NOTE(allen): + // NOTE(allen): global_history_init(&models->global_history); text_layout_init(tctx, &models->text_layouts); diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index 19059348..e7633a86 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -260,244 +260,244 @@ i32 source_name_len; i32 line_number; }; static Command_Metadata fcoder_metacmd_table[238] = { -{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 409 }, -{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 413 }, -{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 423 }, -{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 404 }, -{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 165 }, -{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 96 }, -{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 658 }, -{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 68 }, -{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 159 }, -{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 122 }, -{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 208 }, -{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 284 }, -{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 290 }, -{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 180 }, -{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 647 }, -{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 480 }, -{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 216 }, -{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 244 }, -{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 234 }, -{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 254 }, -{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 266 }, -{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 7 }, -{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 843 }, -{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 174 }, -{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 666 }, -{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "W:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 190 }, -{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 761 }, -{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 125 }, -{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 149 }, -{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 107 }, -{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 135 }, -{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "W:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 175 }, -{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 116 }, -{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 749 }, -{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1891 }, -{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 7 }, -{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 23 }, -{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 51 }, -{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 173 }, -{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 79 }, -{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 112 }, -{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1317 }, -{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1489 }, -{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 145 }, -{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1475 }, -{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "W:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 22 }, -{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "W:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 7 }, -{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 836 }, -{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2201 }, -{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2209 }, -{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 525 }, -{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 542 }, -{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 348 }, -{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 375 }, -{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 844 }, -{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 464 }, -{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 494 }, -{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 481 }, -{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 511 }, -{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 696 }, -{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 682 }, -{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 869 }, -{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 70 }, -{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 564 }, -{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 581 }, -{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 738 }, -{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 520 }, -{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 661 }, -{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 715 }, -{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 612 }, -{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 510 }, -{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "W:\\4ed\\code\\custom\\4coder_code_index_listers.cpp", 48, 12 }, -{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 54 }, -{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 77 }, -{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 41 }, -{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1635 }, -{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 9 }, -{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 222 }, -{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 295 }, -{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 301 }, -{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 267 }, -{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 277 }, -{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 165 }, -{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 177 }, -{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 189 }, -{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 195 }, -{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 201 }, -{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 207 }, -{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 213 }, -{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 221 }, -{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 171 }, -{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 183 }, -{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 863 }, -{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "W:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1627 }, -{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 457 }, -{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 469 }, -{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1429 }, -{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 44 }, -{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 237 }, -{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 249 }, -{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 29 }, -{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 231 }, -{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 243 }, -{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 791 }, -{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 276 }, -{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 347 }, -{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 359 }, -{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 365 }, -{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 418 }, -{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 442 }, -{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 430 }, -{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 448 }, -{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 525 }, -{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 539 }, -{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 497 }, -{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 482 }, -{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 511 }, -{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1469 }, -{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1463 }, -{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 456 }, -{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 518 }, -{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 532 }, -{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 490 }, -{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 474 }, -{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 504 }, -{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 341 }, -{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 353 }, -{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 412 }, -{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 436 }, -{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 424 }, -{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 364 }, -{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 373 }, -{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 849 }, -{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 855 }, -{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1554 }, -{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1885 }, -{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 46 }, -{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 62 }, -{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 54 }, -{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1586 }, -{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 310 }, -{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 300 }, -{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 383 }, -{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 375 }, -{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 127 }, -{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 202 }, -{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 161 }, -{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 209 }, -{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 106 }, -{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 226 }, -{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 219 }, -{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 212 }, -{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "W:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 886 }, -{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1290 }, -{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 871 }, -{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 897 }, -{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1245 }, -{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1266 }, -{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1282 }, -{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1724 }, -{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1809 }, -{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1394 }, -{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1653 }, -{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1155 }, -{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1146 }, -{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1137 }, -{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1078 }, -{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1090 }, -{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1643 }, -{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 382 }, -{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1361 }, -{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1072 }, -{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1084 }, -{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2189 }, -{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2177 }, -{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2195 }, -{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2183 }, -{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 548 }, -{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 57 }, -{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 66 }, -{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 82 }, -{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 99 }, -{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 27 }, -{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 39 }, -{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 125 }, -{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 112 }, -{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 86 }, -{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 99 }, -{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 718 }, -{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 760 }, -{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 126 }, -{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 427 }, -{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 421 }, -{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1238 }, -{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1250 }, -{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1244 }, -{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1231 }, -{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 689 }, -{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 675 }, -{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "W:\\4ed\\code\\custom\\4coder_log_parser.cpp", 40, 994 }, -{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 190 }, -{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 198 }, -{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 237 }, -{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 403 }, -{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1611 }, -{ PROC_LINKS(test_double_backspace, 0), false, "test_double_backspace", 21, "Made for testing purposes (I should have deleted this if you are reading it let me know)", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 115 }, -{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 785 }, -{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 574 }, -{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 561 }, -{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 703 }, -{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 712 }, -{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 451 }, -{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 439 }, -{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 433 }, -{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 817 }, -{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 823 }, -{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 415 }, -{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 445 }, -{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 808 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "W:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1176 }, -{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 20 }, -{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 34 }, -{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 }, -{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1711 }, -{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1738 }, -{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1599 }, -{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "W:\\4ed\\code\\custom\\4coder_jump_lister.cpp", 41, 59 }, -{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 395 }, -{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 642 }, -{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 94 }, -{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 82 }, -{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 88 }, -{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 67 }, -{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 433 }, -{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 59 }, -{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 76 }, -{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 73 }, -{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 100 }, +{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 409 }, +{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 413 }, +{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 423 }, +{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 404 }, +{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 165 }, +{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 96 }, +{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 658 }, +{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 68 }, +{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 159 }, +{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 122 }, +{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 208 }, +{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 284 }, +{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 290 }, +{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 180 }, +{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 647 }, +{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 480 }, +{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 216 }, +{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 244 }, +{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 234 }, +{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 254 }, +{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 266 }, +{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 7 }, +{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 843 }, +{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 174 }, +{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 666 }, +{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "/Users/allenwebster/4ed/code/custom/4coder_docs.cpp", 51, 190 }, +{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 761 }, +{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 125 }, +{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 149 }, +{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 107 }, +{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 135 }, +{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "/Users/allenwebster/4ed/code/custom/4coder_docs.cpp", 51, 175 }, +{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 116 }, +{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 749 }, +{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1891 }, +{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "/Users/allenwebster/4ed/code/custom/4coder_default_hooks.cpp", 60, 7 }, +{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "/Users/allenwebster/4ed/code/custom/4coder_default_hooks.cpp", 60, 23 }, +{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "/Users/allenwebster/4ed/code/custom/4coder_default_hooks.cpp", 60, 51 }, +{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 173 }, +{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 79 }, +{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 112 }, +{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1317 }, +{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1489 }, +{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 145 }, +{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1475 }, +{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "/Users/allenwebster/4ed/code/custom/4coder_cli_command.cpp", 58, 22 }, +{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "/Users/allenwebster/4ed/code/custom/4coder_cli_command.cpp", 58, 7 }, +{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 836 }, +{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2201 }, +{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2209 }, +{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 525 }, +{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 542 }, +{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 348 }, +{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 375 }, +{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 844 }, +{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 464 }, +{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 494 }, +{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 481 }, +{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 511 }, +{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 696 }, +{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 682 }, +{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 869 }, +{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 70 }, +{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 564 }, +{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 581 }, +{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 738 }, +{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 520 }, +{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 661 }, +{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 715 }, +{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 612 }, +{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 510 }, +{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "/Users/allenwebster/4ed/code/custom/4coder_code_index_listers.cpp", 65, 12 }, +{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "/Users/allenwebster/4ed/code/custom/4coder_keyboard_macro.cpp", 61, 54 }, +{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "/Users/allenwebster/4ed/code/custom/4coder_keyboard_macro.cpp", 61, 77 }, +{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "/Users/allenwebster/4ed/code/custom/4coder_keyboard_macro.cpp", 61, 41 }, +{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1635 }, +{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 9 }, +{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 222 }, +{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 295 }, +{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 301 }, +{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 267 }, +{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 277 }, +{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 165 }, +{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 177 }, +{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 189 }, +{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 195 }, +{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 201 }, +{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 207 }, +{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 213 }, +{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 221 }, +{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 171 }, +{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 183 }, +{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 863 }, +{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "/Users/allenwebster/4ed/code/custom/4coder_config.cpp", 53, 1627 }, +{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 457 }, +{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 469 }, +{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1429 }, +{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 44 }, +{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 237 }, +{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 249 }, +{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 29 }, +{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 231 }, +{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 243 }, +{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 791 }, +{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 276 }, +{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 347 }, +{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 359 }, +{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 365 }, +{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 418 }, +{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 442 }, +{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 430 }, +{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 448 }, +{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 525 }, +{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 539 }, +{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 497 }, +{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 482 }, +{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 511 }, +{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1469 }, +{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1463 }, +{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 456 }, +{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 518 }, +{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 532 }, +{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 490 }, +{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 474 }, +{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 504 }, +{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 341 }, +{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 353 }, +{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 412 }, +{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 436 }, +{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 424 }, +{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 364 }, +{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 373 }, +{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 849 }, +{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 855 }, +{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1554 }, +{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1885 }, +{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 46 }, +{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 62 }, +{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 54 }, +{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1586 }, +{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 310 }, +{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 300 }, +{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 383 }, +{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 375 }, +{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 127 }, +{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 202 }, +{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 161 }, +{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 209 }, +{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 106 }, +{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "/Users/allenwebster/4ed/code/custom/4coder_profile.cpp", 54, 226 }, +{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "/Users/allenwebster/4ed/code/custom/4coder_profile.cpp", 54, 219 }, +{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "/Users/allenwebster/4ed/code/custom/4coder_profile.cpp", 54, 212 }, +{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "/Users/allenwebster/4ed/code/custom/4coder_profile_inspect.cpp", 62, 886 }, +{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1290 }, +{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 871 }, +{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 897 }, +{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1245 }, +{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1266 }, +{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1282 }, +{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1724 }, +{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1809 }, +{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1394 }, +{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1653 }, +{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1155 }, +{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1146 }, +{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1137 }, +{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1078 }, +{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1090 }, +{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1643 }, +{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 382 }, +{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1361 }, +{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1072 }, +{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1084 }, +{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2189 }, +{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2177 }, +{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2195 }, +{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2183 }, +{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 548 }, +{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 57 }, +{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 66 }, +{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 82 }, +{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 99 }, +{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 27 }, +{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 39 }, +{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 125 }, +{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 112 }, +{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 86 }, +{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 99 }, +{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 718 }, +{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 760 }, +{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 126 }, +{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 427 }, +{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 421 }, +{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1238 }, +{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1250 }, +{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1244 }, +{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1231 }, +{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 689 }, +{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 675 }, +{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "/Users/allenwebster/4ed/code/custom/4coder_log_parser.cpp", 57, 994 }, +{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 190 }, +{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 198 }, +{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 237 }, +{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 403 }, +{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1611 }, +{ PROC_LINKS(test_double_backspace, 0), false, "test_double_backspace", 21, "Made for testing purposes (I should have deleted this if you are reading it let me know)", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 115 }, +{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 785 }, +{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 574 }, +{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 561 }, +{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 703 }, +{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 712 }, +{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 451 }, +{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 439 }, +{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 433 }, +{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 817 }, +{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 823 }, +{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 415 }, +{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 445 }, +{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 808 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "/Users/allenwebster/4ed/code/custom/4coder_code_index.cpp", 57, 1176 }, +{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 20 }, +{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 34 }, +{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 137 }, +{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1711 }, +{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1738 }, +{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1599 }, +{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "/Users/allenwebster/4ed/code/custom/4coder_jump_lister.cpp", 58, 59 }, +{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 395 }, +{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 642 }, +{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 94 }, +{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 82 }, +{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 88 }, +{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 67 }, +{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 433 }, +{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 59 }, +{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 76 }, +{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 73 }, +{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 100 }, }; static i32 fcoder_metacmd_ID_allow_mouse = 0; static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 1; diff --git a/platform_mac/mac_4ed.mm b/platform_mac/mac_4ed.mm index 46997aff..f6ca20a3 100644 --- a/platform_mac/mac_4ed.mm +++ b/platform_mac/mac_4ed.mm @@ -193,10 +193,9 @@ struct Mac_Vars { String_Const_u8 binary_path; - Arena *clipboard_arena; - String_Const_u8 clipboard_contents; u32 clipboard_change_count; b32 next_clipboard_is_self; + b32 clip_catch_all; Arena clip_post_arena; String_Const_u8 clip_post; @@ -530,39 +529,7 @@ mac_get_clipboard_change_count(void){ return(result); } -function b32 -mac_read_clipboard_contents(Arena *scratch){ - b32 result = false; - - Temp_Memory temp = begin_temp(scratch); - { - NSPasteboard *board = [NSPasteboard generalPasteboard]; - NSString *utf8_type = @"public.utf8-plain-text"; - NSArray *types_array = [NSArray arrayWithObjects:utf8_type, nil]; - NSString *has_string = [board availableTypeFromArray:types_array]; - if (has_string != nil){ - NSData *data = [board dataForType:utf8_type]; - if (data != nil){ - u32 copy_length = data.length; - if (copy_length > 0){ - Arena *clip_arena = mac_vars.clipboard_arena; - linalloc_clear(clip_arena); - - mac_vars.clipboard_contents = string_const_u8_push(clip_arena, copy_length); - [data getBytes:mac_vars.clipboard_contents.str - length:mac_vars.clipboard_contents.size]; - - result = true; - } - } - } - } - end_temp(temp); - - return(result); -} - -function void +internal void mac_post_clipboard(Arena *scratch, char *text, i32 len){ NSPasteboard *board = [NSPasteboard generalPasteboard]; @@ -583,6 +550,65 @@ mac_post_clipboard(Arena *scratch, char *text, i32 len){ //////////////////////////////// +internal +system_get_clipboard_sig(){ + String_Const_u8 result = {}; + u32 change_count = mac_get_clipboard_change_count(); + if (change_count != mac_vars.clipboard_change_count){ + if (mac_vars.next_clipboard_is_self){ + mac_vars.next_clipboard_is_self = false; + } else { + NSPasteboard *board = [NSPasteboard generalPasteboard]; + NSString *utf8_type = @"public.utf8-plain-text"; + NSArray *types_array = [NSArray arrayWithObjects:utf8_type, nil]; + NSString *has_string = [board availableTypeFromArray:types_array]; + if (has_string != nil){ + NSData *data = [board dataForType:utf8_type]; + if (data != nil){ + u32 copy_length = data.length; + if (copy_length > 0){ + result = string_const_u8_push(arena, copy_length); + [data getBytes:result.str length:result.size]; + } + } + } + } + mac_vars.clipboard_change_count = change_count; + } + return(result); +} + +internal +system_post_clipboard_sig(){ + Arena *arena = &mac_vars.clip_post_arena; + if (arena->base_allocator == 0){ + *arena = make_arena_system(); + } else{ + linalloc_clear(arena); + } + + mac_vars.clip_post.str = push_array(arena, u8, str.size + 1); + if (mac_vars.clip_post.str != 0){ + block_copy(mac_vars.clip_post.str, str.str, str.size); + mac_vars.clip_post.str[str.size] = 0; + mac_vars.clip_post.size = str.size; + } else{ + // NOTE(yuval): Failed to allocate buffer for clipboard post + } +} + +internal +system_set_clipboard_catch_all_sig(){ + mac_vars.clip_catch_all = enabled?true:false; +} + +internal +system_get_clipboard_catch_all_sig(){ + return(mac_vars.clip_catch_all); +} + +//////////////////////////////// + function void mac_toggle_fullscreen(void){ [mac_vars.window toggleFullScreen:nil]; @@ -712,31 +738,11 @@ mac_toggle_fullscreen(void){ } // NOTE(yuval): Frame clipboard input + Scratch_Block scratch(mac_vars.tctx); MacProfileScope("Frame Clipboard Input"){ - block_zero_struct(&mac_vars.clipboard_contents); - input.clipboard_changed = false; - - if (mac_vars.clipboard_change_count != 0){ - u32 change_count = mac_get_clipboard_change_count(); - if (change_count != mac_vars.clipboard_change_count){ - if (mac_vars.next_clipboard_is_self){ - mac_vars.next_clipboard_is_self = false; - } else{ - for (i32 r = 0; r < 4; ++r){ - Scratch_Block scratch(mac_vars.tctx, Scratch_Share); - - if (mac_read_clipboard_contents(scratch)){ - input.clipboard_changed = true; - break; - } - } - } - - mac_vars.clipboard_change_count = change_count; - } + if (mac_vars.clipboard_change_count != 0 && mac_vars.clip_catch_all){ + input.clipboard = system_get_clipboard(scratch, 0); } - - input.clipboard = mac_vars.clipboard_contents; } mac_vars.clip_post.size = 0; @@ -759,7 +765,6 @@ mac_toggle_fullscreen(void){ // NOTE(yuval): Post new clipboard content MacProfileScope("Post Clipboard"){ if (mac_vars.clip_post.size > 0){ - Scratch_Block scratch(mac_vars.tctx, Scratch_Share); mac_post_clipboard(scratch, (char*)mac_vars.clip_post.str, (i32)mac_vars.clip_post.size); } } @@ -1326,16 +1331,11 @@ main(int arg_count, char **args){ // NOTE(yuval): Initialize clipboard { - mac_vars.clipboard_arena = reserve_arena(mac_vars.tctx); + Scratch_Block scratch(mac_vars.tctx); + mac_post_clipboard(scratch, "", 0); mac_vars.clipboard_change_count = mac_get_clipboard_change_count(); mac_vars.next_clipboard_is_self = false; - // NOTE(yuval): Read the current clipboard - { - Scratch_Block scratch(mac_vars.tctx, Scratch_Share); - mac_read_clipboard_contents(scratch); - } - // NOTE(yuval): Start the clipboard polling timer [NSTimer scheduledTimerWithTimeInterval: 0.5 target:mac_vars.view @@ -1368,7 +1368,7 @@ main(int arg_count, char **args){ Scratch_Block scratch(mac_vars.tctx, Scratch_Share); String_Const_u8 curdir = system_get_path(scratch, SystemPath_CurrentDirectory); curdir = string_mod_replace_character(curdir, '\\', '/'); - app.init(mac_vars.tctx, &target, mac_vars.base_ptr, mac_vars.clipboard_contents, curdir, custom); + app.init(mac_vars.tctx, &target, mac_vars.base_ptr, curdir, custom); } // diff --git a/platform_mac/mac_4ed_functions.mm b/platform_mac/mac_4ed_functions.mm index 135a8f10..3478dede 100644 --- a/platform_mac/mac_4ed_functions.mm +++ b/platform_mac/mac_4ed_functions.mm @@ -440,27 +440,6 @@ system_sleep_sig(){ //////////////////////////////// -function -system_post_clipboard_sig(){ - Arena *arena = &mac_vars.clip_post_arena; - if (arena->base_allocator == 0){ - *arena = make_arena_system(); - } else{ - linalloc_clear(arena); - } - - mac_vars.clip_post.str = push_array(arena, u8, str.size + 1); - if (mac_vars.clip_post.str != 0){ - block_copy(mac_vars.clip_post.str, str.str, str.size); - mac_vars.clip_post.str[str.size] = 0; - mac_vars.clip_post.size = str.size; - } else{ - // NOTE(yuval): Failed to allocate buffer for clipboard post - } -} - -//////////////////////////////// - function system_cli_call_sig(){ b32 result = false; diff --git a/platform_mac/mac_4ed_old.cpp b/platform_mac/mac_4ed_old.cpp deleted file mode 100644 index 81e7ffc3..00000000 --- a/platform_mac/mac_4ed_old.cpp +++ /dev/null @@ -1,874 +0,0 @@ -/* - * Mr. 4th Dimention - Allen Webster - * - * 28.06.2017 - * - * Mac C++ layer for 4coder - * - */ - -// TOP - -#define IS_PLAT_LAYER - -#include "4coder_base_types.h" -#include "4coder_API/4coder_version.h" - -#include "4coder_lib/4coder_utf8.h" - -#if defined(FRED_SUPER) -# include "4coder_lib/4coder_arena.h" -# include "4coder_lib/4coder_arena.cpp" -# define FSTRING_IMPLEMENTATION -# include "4coder_lib/4coder_string.h" - -#include "4coder_keycode_extension.h" -# include "4coder_API/4coder_style.h" -# include "4coder_API/4coder_types.h" - -#else -# include "4coder_default_bindings.cpp" -#endif - -#include "osx_objective_c_to_cpp_links.h" - -#include "4ed_math.h" - -#include - -#include "4ed_font.h" -#include "4ed_system.h" -#include "4ed_render_target.h" -#include "4ed_render_format.h" -#include "4ed.h" -#include "4ed_linked_node_macros.h" - -#include "4ed_file_track.h" -#include "4ed_system_shared.h" - -#include "unix_4ed_headers.h" -#include - -#undef external -#undef internal -#include -#define external extern "C" -#define internal static -#include - -#include - -//////////////////////////////// - -#include "4ed_shared_thread_constants.h" -#include "unix_threading_wrapper.h" -#include "mac_semaphore_wrapper.h" - -// TODO(allen): Make an intrinsics header that uses the cracked OS to define a single set of intrinsic names. -#define InterlockedCompareExchange(dest, ex, comp) \ -__sync_val_compare_and_swap((dest), (comp), (ex)) - -//////////////////////////////// - -#define SLASH '/' -#define DLL "so" - -global System_Functions sysfunc; -#include "4ed_shared_library_constants.h" -#include "unix_library_wrapper.h" - -#include "4ed_standard_libraries.cpp" -#include "4ed_coroutine.cpp" -#include "4ed_font.cpp" - -//////////////////////////////// - -struct OSX_Vars{ - Application_Step_Input input; - String clipboard_contents; - b32 keep_running; - - b32 has_prev_time; - u64 prev_time_u; - - File_Track_System track; - void *track_table; - u32 track_table_size; - u32 track_node_size; -}; - -//////////////////////////////// - -OSX_Objective_C_Vars osx_objc; -OSX_Vars osxvars; -global Render_Target target; -global Application_Memory memory_vars; -global Plat_Settings plat_settings; - -global Libraries libraries; -global App_Functions app; -global Custom_API custom_api; - -global Coroutine_System_Auto_Alloc coroutines; - -//////////////////////////////// - -#include "mac_error_box.cpp" - -//////////////////////////////// - -internal -Sys_Get_4ed_Path_Sig(system_get_4ed_path){ - Partition *scratch = &shared_vars.scratch; - Temp_Memory temp = begin_temp_memory(scratch); - char *temp_buffer = push_array(scratch, char, capacity); - i32 size = 0; - u32 buf_size = capacity; - i32 status = _NSGetExecutablePath(temp_buffer, &buf_size); - buf_size = str_size(temp_buffer); - if (status == 0){ - ssize_t ln_len = readlink(temp_buffer, out, capacity); - if (ln_len != -1){ - out[ln_len] = 0; - String str = make_string_cap(out, ln_len, capacity); - remove_last_folder(&str); - terminate_with_null(&str); - size = str.size; - } - else{ - memcpy(out, temp_buffer, buf_size); - String str = make_string_cap(out, buf_size, capacity); - remove_last_folder(&str); - terminate_with_null(&str); - size = str.size; - } - } - end_temp_memory(temp); - return(size); -} - -//#include "mac_fd_check.cpp" -#include "unix_4ed_functions.cpp" - -internal -Sys_Now_Time_Sig(system_now_time){ - f64 t = osx_timer_seconds(); - u64 result = (u64)(t*1000000.f); - return(result); -} - -//////////////////////////////// - -void -osx_log(char *m, i32 l){ - system_log(m, l); -} - -//////////////////////////////// - -internal void -system_schedule_step(void){ - osx_schedule_step(); -} - -//////////////////////////////// - -#include "4ed_work_queues.cpp" - -//////////////////////////////// - -internal -Sys_Show_Mouse_Cursor_Sig(system_show_mouse_cursor){ - switch (show){ - case MouseCursorShow_Never: - { - osx_show_cursor(-1, 0); - }break; - - case MouseCursorShow_Always: - { - osx_show_cursor(1, 0); - }break; - } -} - -internal -Sys_Set_Fullscreen_Sig(system_set_fullscreen){ - osx_objc.do_toggle = (osx_objc.full_screen != full_screen); - return(true); -} - -internal -Sys_Is_Fullscreen_Sig(system_is_fullscreen){ - b32 result = (osx_objc.full_screen != osx_objc.do_toggle); - return(result); -} - -#include "4ed_coroutine_functions.cpp" - -#include "4ed_system_shared.cpp" - -// File Change Listeners - -internal b32 -handle_track_out_of_memory(i32 val){ - b32 result = false; - - switch (val){ - case FileTrack_OutOfTableMemory: - { - u32 new_table_size = osxvars.track_table_size*2; - void *new_table = system_memory_allocate(new_table_size); - move_track_system(&osxvars.track, &shared_vars.scratch, new_table, new_table_size); - system_memory_free(osxvars.track_table, osxvars.track_table_size); - osxvars.track_table_size = new_table_size; - osxvars.track_table = new_table; - }break; - - case FileTrack_OutOfListenerMemory: - { - osxvars.track_node_size *= 2; - void *node_expansion = system_memory_allocate(osxvars.track_node_size); - expand_track_system_listeners(&osxvars.track, &shared_vars.scratch, node_expansion, osxvars.track_node_size); - }break; - - default: result = true; break; - } - - return(result); -} - -internal -Sys_Add_Listener_Sig(system_add_listener){ - b32 result = false; - for (;;){ - i32 track_result = add_listener(&osxvars.track, &shared_vars.scratch, (u8*)filename); - if (handle_track_out_of_memory(track_result)){ - if (track_result == FileTrack_Good){ - result = true; - } - break; - } - } - return(result); -} - -internal -Sys_Remove_Listener_Sig(system_remove_listener){ - b32 result = false; - i32 track_result = remove_listener(&osxvars.track, &shared_vars.scratch, (u8*)filename); - if (track_result == FileTrack_Good){ - result = true; - } - return(result); -} - -internal -Sys_Get_File_Change_Sig(system_get_file_change){ - b32 result = false; - - i32 size = 0; - i32 get_result = get_change_event(&osxvars.track, &shared_vars.scratch, (u8*)buffer, max, &size); - - *required_size = size; - *mem_too_small = false; - if (get_result == FileTrack_Good){ - result = true; - } - else if (get_result == FileTrack_MemoryTooSmall){ - *mem_too_small = true; - result = true; - } - - return(result); -} - - -// -// Clipboard -// - -internal -Sys_Post_Clipboard_Sig(system_post_clipboard){ - char *string = str.str; - if (!terminate_with_null(&str)){ - if (osx_objc.clipboard_space_max <= str.size + 1){ - if (osx_objc.clipboard_space != 0){ - system_memory_free(osx_objc.clipboard_space, osx_objc.clipboard_space_max); - } - osx_objc.clipboard_space_max = l_round_up_u32(str.size*2 + 1, KB(4096)); - osx_objc.clipboard_space = (char*)system_memory_allocate(osx_objc.clipboard_space_max); - } - memcpy(osx_objc.clipboard_space, str.str, str.size); - osx_objc.clipboard_space[str.size] = 0; - string = osx_objc.clipboard_space; - } - osx_post_to_clipboard(string); -} - -// -// CLI -// - -// HACK(allen): ALMOST an exact duplicate from the Linux version. Just epoll doesn't port. deduplicate or switch to NSTask. -global i32 cli_count = 0; - -internal -Sys_CLI_Call_Sig(system_cli_call, path, script_name, cli_out){ - i32 pipe_fds[2]; - if (pipe(pipe_fds) == -1){ - - return 0; - } - - i32 child_pid = fork(); - if (child_pid == -1){ - - return 0; - } - - enum { PIPE_FD_READ, PIPE_FD_WRITE }; - - // child - if (child_pid == 0){ - close(pipe_fds[PIPE_FD_READ]); - dup2(pipe_fds[PIPE_FD_WRITE], STDOUT_FILENO); - dup2(pipe_fds[PIPE_FD_WRITE], STDERR_FILENO); - - if (chdir(path) == -1){ - - exit(1); - } - - char* argv[] = { - "sh", - "-c", - script_name, - 0 - }; - - if (execv("/bin/sh", argv) == -1){ - - } - exit(1); - } - else{ - close(pipe_fds[PIPE_FD_WRITE]); - - *(pid_t*)&cli_out->proc = child_pid; - *(int*)&cli_out->out_read = pipe_fds[PIPE_FD_READ]; - *(int*)&cli_out->out_write = pipe_fds[PIPE_FD_WRITE]; - - ++cli_count; - } - - return(true); -} - -internal -Sys_CLI_Begin_Update_Sig(system_cli_begin_update){ - // NOTE(inso): I don't think anything needs to be done here. -} - -internal -Sys_CLI_Update_Step_Sig(system_cli_update_step){ - i32 pipe_read_fd = *(i32*)&cli->out_read; - - fd_set fds; - FD_ZERO(&fds); - FD_SET(pipe_read_fd, &fds); - - struct timeval tv = {}; - - size_t space_left = max; - char* ptr = dest; - - while (space_left > 0 && select(pipe_read_fd + 1, &fds, NULL, NULL, &tv) == 1){ - ssize_t num = read(pipe_read_fd, ptr, space_left); - if (num == -1){ - - } else if (num == 0){ - // NOTE(inso): EOF - break; - } else { - ptr += num; - space_left -= num; - } - } - - *amount = (ptr - dest); - return((ptr - dest) > 0); -} - -internal -Sys_CLI_End_Update_Sig(system_cli_end_update){ - pid_t pid = *(pid_t*)&cli->proc; - b32 close_me = false; - - int status; - if (pid && waitpid(pid, &status, WNOHANG) > 0){ - close_me = true; - - cli->exit = WEXITSTATUS(status); - - close(*(int*)&cli->out_read); - close(*(int*)&cli->out_write); - - --cli_count; - } - - return(close_me); -} - -#include "4ed_font_provider_freetype.h" -global u32 system_font_method = SystemFontMethod_FilePath; -#include "4ed_font_provider_freetype.cpp" - -internal -Sys_Font_Path(name, parameters){ - b32 italic = (parameters != 0 && parameters->italics); - b32 bold = (parameters != 0 && parameters->bold); - i32 pt_size = 12; - if (parameters != 0){ - pt_size = parameters->pt_size; - } - - OSX_Font_Match match = osx_get_font_match(name, pt_size, italic, bold); - - Font_Path path = {}; - Partition *part = &shared_vars.font_scratch; - path.temp = begin_temp_memory(part); - - if (match.path != 0){ - i32 len = str_size(match.path); - char *buffer = push_array(part, char, len + 1); - if (buffer == 0){ - sysshared_partition_grow(part, l_round_up_i32(len + 1, KB(4))); - buffer = push_array(part, char, len + 1); - } - - if (buffer != 0){ - push_align(part, 8); - memcpy(buffer, match.path, len + 1); - path.len = len; - path.name = buffer; - } - } - - return(path); -} - -Sys_Font_Data_Not_Used; - -internal void -osx_get_loadable_fonts(Partition *part, Font_Setup_List *list){ - OSX_Loadable_Fonts fonts = osx_list_loadable_fonts(); - for (i32 i = 0; i < fonts.count; ++i){ - char *name = fonts.names[i]; - char *path = fonts.paths[i]; - - if (name == 0 || path == 0){ - continue; - } - - Temp_Memory reset= begin_temp_memory(part); - Font_Setup *setup = push_array(part, Font_Setup, 1); - - if (setup != 0){ - memset(setup, 0, sizeof(*setup)); - - i32 len = str_size(path); - if (len < sizeof(setup->stub.name)){ - i32 name_len = str_size(name); - if (name_len < sizeof(setup->name)){ - setup->stub.load_from_path = true; - memcpy(setup->stub.name, path, len + 1); - setup->stub.len = len; - setup->has_display_name = true; - setup->len = name_len; - memcpy(setup->name, name, name_len + 1); - sll_push(list->first, list->last, setup); - } - else{ - end_temp_memory(reset); - } - } - else{ - end_temp_memory(reset); - } - } - } - - free(fonts.names); -} - -#include -#include -#include "opengl/4ed_opengl_render.cpp" - -//////////////////////////////// - -#include "4ed_link_system_functions.cpp" -#include "4ed_shared_init_logic.cpp" - -external void* -osx_allocate(u64 size){ - void *result = system_memory_allocate(size); - return(result); -} - -external void -osx_free(void *ptr, u64 size){ - system_memory_free(ptr, size); -} - -external void -osx_resize(int width, int height){ - if (width > 0 && height > 0){ - osx_objc.width = width; - osx_objc.height = height; - - target.width = width; - target.height = height; - - osx_schedule_step(); - } -} - -internal void -osx_push_key(Key_Code code, Key_Code chr, Key_Code chr_nocaps, b8 *mods){ - i32 count = osxvars.input.keys.count; - - if (count < KEY_INPUT_BUFFER_SIZE){ - Key_Event_Data *data = osxvars.input.keys.keys; - - data[count].keycode = code; - data[count].character = chr; - data[count].character_no_caps_lock = chr_nocaps; - - memcpy(data[count].modifiers, mods, sizeof(*mods)*MDFR_INDEX_COUNT); - - osxvars.input.keys.count = count + 1; - } -} - -internal void -osx_mods_struct_to_array(OSX_Keyboard_Modifiers flags, b8 *mods){ - mods[MDFR_SHIFT_INDEX] = ((flags.shift) != 0); - mods[MDFR_CONTROL_INDEX] = ((flags.control) != 0); - mods[MDFR_ALT_INDEX] = ((flags.option) != 0); - mods[MDFR_COMMAND_INDEX] = ((flags.command) != 0); - mods[MDFR_CAPS_INDEX] = ((flags.caps) != 0); -} - -external void -osx_character_input(u32 code, OSX_Keyboard_Modifiers modifier_flags){ - Key_Code c = 0; - switch (code){ - // TODO(allen): Find the canonical list of these things. - case 0x007F: c = key_back; break; - case 0xF700: c = key_up; break; - case 0xF701: c = key_down; break; - case 0xF702: c = key_left; break; - case 0xF703: c = key_right; break; - case 0xF728: c = key_del; break; - case 0xF729: c = key_home; break; - case 0xF72B: c = key_end; break; - case 0xF72C: c = key_page_up; break; - case 0xF72D: c = key_page_down; break; - case 0x001B: c = key_esc; break; - - case 0xF704: c = key_f1; break; - case 0xF705: c = key_f2; break; - case 0xF706: c = key_f3; break; - case 0xF707: c = key_f4; break; - - case 0xF708: c = key_f5; break; - case 0xF709: c = key_f6; break; - case 0xF70A: c = key_f7; break; - case 0xF70B: c = key_f8; break; - - case 0xF70C: c = key_f9; break; - case 0xF70D: c = key_f10; break; - case 0xF70E: c = key_f11; break; - case 0xF70F: c = key_f12; break; - - case 0xF710: c = key_f13; break; - case 0xF711: c = key_f14; break; - case 0xF712: c = key_f15; break; - case 0xF713: c = key_f16; break; - } - - b8 mods[MDFR_INDEX_COUNT] = {}; - osx_mods_struct_to_array(modifier_flags, mods); - - if (c != 0){ - osx_push_key(c, 0, 0, mods); - } - else if (code != 0){ - if (code < 0xE000 || code > 0xF8FF){ - if (code == '\r'){ - code = '\n'; - } - Key_Code chr = code; - Key_Code nocaps = code; - if (modifier_flags.caps){ - if ('a' <= nocaps && nocaps <= 'z'){ - chr += 'A' - 'a'; - } - else if ('A' <= nocaps && nocaps <= 'Z'){ - chr += 'a' - 'A'; - } - } - osx_push_key(code, chr, nocaps, mods); - } - else{ - fprintf(stdout, "unhandled private code %x\n", code); - } - } - else{ - osx_push_key(0, 0, 0, mods); - } - - osx_schedule_step(); -} - -external void -osx_mouse(i32 mx, i32 my, u32 type){ - i32 new_x = mx; - i32 new_y = osx_objc.height - my; - if (new_x != osxvars.input.mouse.x || new_y != osxvars.input.mouse.y){ - osxvars.input.mouse.x = new_x; - osxvars.input.mouse.y = new_y; - osx_schedule_step(); - } - - if (type == MouseType_Press){ - osxvars.input.mouse.press_l = true; - osxvars.input.mouse.l = true; - osx_schedule_step(); - } - if (type == MouseType_Release){ - osxvars.input.mouse.release_l = true; - osxvars.input.mouse.l = false; - osx_schedule_step(); - } -} - -external void -osx_mouse_wheel(float dx, float dy){ - osxvars.input.mouse.wheel = - (int32_t)(dy); - osx_schedule_step(); -} - -external void -osx_try_to_close(void){ - osxvars.keep_running = false; - osx_schedule_step(); -} - -external void -osx_step(void){ - - Application_Step_Result result = {}; - - // NOTE(allen): Prepare the Frame Input - osxvars.input.dt = 1.f/60.f; - if (osxvars.has_prev_time){ - u64 time_u = system_now_time(); - u64 time_elapsed_u = time_u - osxvars.prev_time_u; - osxvars.input.dt = time_elapsed_u/1000000.f; - osxvars.prev_time_u = time_u; - } - else{ - osxvars.has_prev_time = true; - osxvars.prev_time_u = system_now_time(); - } - - // TODO(allen): CROSS REFERENCE WITH WINDOWS SPECIAL CODE "TIC898989" - Application_Step_Input frame_input = osxvars.input; - frame_input.trying_to_kill = !osxvars.keep_running; - OSX_Keyboard_Modifiers mods = osx_get_modifiers(); - osx_mods_struct_to_array(mods, frame_input.keys.modifiers); - - osxvars.input.first_step = false; - memset(&osxvars.input.keys, 0, sizeof(osxvars.input.keys)); - osxvars.input.mouse.press_l = false; - osxvars.input.mouse.release_l = false; - osxvars.input.mouse.press_r = false; - osxvars.input.mouse.release_r = false; - osxvars.input.mouse.wheel = 0; - - - // NOTE(allen): Frame Clipboard Input - if (osx_objc.has_clipboard_item){ - frame_input.clipboard = make_string(osx_objc.clipboard_data, (i32)osx_objc.clipboard_size); - } - else{ - frame_input.clipboard = null_string; - } - - // HACK(allen): Got this all messed up with respect to how everyone else (other OS layers) work - osx_objc.do_toggle = false; - osx_objc.full_screen = osx_is_fullscreen(); - - // HACK(allen): THIS SHIT IS FUCKED (happens on linux too) - b32 keep_running = osxvars.keep_running; - - // NOTE(allen): Application Core Update - target.buffer.pos = 0; - if (app.step != 0){ - result = app.step(&sysfunc, &target, &memory_vars, &frame_input); - } - else{ - //LOG("app.step == 0 -- skipping\n"); - } - - // NOTE(allen): Finish the Loop - if (result.perform_kill){ - osx_close_app(); - } - else if (!keep_running && !osxvars.keep_running){ - osxvars.keep_running = true; - } - - // NOTE(allen): Switch to New Title - if (result.has_new_title){ - osx_change_title(result.title_string); - } - - // NOTE(allen): Switch to New Cursor - osx_show_cursor(0, result.mouse_cursor_type); - - // NOTE(allen): Render - osx_begin_render(); - gl_render(&target, &shared_vars.pixel_scratch); - osx_end_render(); - - // NOTE(allen): Toggle Full Screen - if (osx_objc.do_toggle){ - osx_toggle_fullscreen(); - } - - // NOTE(allen): Schedule Another Step if Needed - if (result.animating || cli_count > 0){ - osx_schedule_step(); - } -} - -external void -osx_init(){ - // - // System Linkage - // - - link_system_code(); - - // - // Memory init - // - - memset(&target, 0, sizeof(target)); - memset(&memory_vars, 0, sizeof(memory_vars)); - memset(&plat_settings, 0, sizeof(plat_settings)); - - memset(&libraries, 0, sizeof(libraries)); - memset(&app, 0, sizeof(app)); - memset(&custom_api, 0, sizeof(custom_api)); - - memory_init(); - - osxvars.keep_running = true; - osxvars.input.first_step = true; - - // - // HACK(allen): - // Previously zipped stuff is here, it should be zipped in the new pattern now. - // - - init_shared_vars(); - - osxvars.track_table_size = KB(16); - osxvars.track_table = system_memory_allocate(osxvars.track_table_size); - - osxvars.track_node_size = KB(16); - void *track_nodes = system_memory_allocate(osxvars.track_node_size); - - i32 track_result = init_track_system(&osxvars.track, &shared_vars.scratch, - osxvars.track_table, osxvars.track_table_size, - track_nodes, osxvars.track_node_size); - - if (track_result != FileTrack_Good){ - exit(1); - } - - // - // Load Core Code - // - load_app_code(); - - // - // Read command line - // - read_command_line(osx_objc.argc, osx_objc.argv); - - // - // Load Custom Code - // -#if defined(FRED_SUPER) - load_custom_code(); -#else - DontCompile; -#endif - - // - // Threads - // - - work_system_init(); - - // - // Coroutines - // - - coroutines_init(); - - // - // Font System Init - // - - Partition *scratch = &shared_vars.scratch; - Temp_Memory temp = begin_temp_memory(scratch); - Font_Setup_List font_setup = system_font_get_local_stubs(scratch); - osx_get_loadable_fonts(scratch, &font_setup); - system_font_init(&sysfunc.font, plat_settings.font_size, plat_settings.use_hinting, font_setup); - end_temp_memory(temp); - - // - // App Init - // - - char cwd[4096]; - u32 size = sysfunc.get_current_path(cwd, sizeof(cwd)); - if (size == 0 || size >= sizeof(cwd)){ - system_error_box("Could not get current directory at launch."); - } - String curdir = make_string(cwd, size); - terminate_with_null(&curdir); - replace_char(&curdir, '\\', '/'); - - - - String clipboard_string = {}; - if (osx_objc.has_clipboard_item){ - clipboard_string = make_string(osx_objc.clipboard_data, osx_objc.clipboard_size); - } - - //LOG("Initializing application variables\n"); - app.init(&sysfunc, &target, &memory_vars, clipboard_string, curdir, custom_api); -} - -#include "mac_4ed_file_track.cpp" - -// BOTTOM - diff --git a/platform_mac/mac_4ed_old.m b/platform_mac/mac_4ed_old.m deleted file mode 100644 index fad0565e..00000000 --- a/platform_mac/mac_4ed_old.m +++ /dev/null @@ -1,895 +0,0 @@ -/* - * Mr. 4th Dimention - Allen Webster - * - * 28.06.2017 - * - * Mac Objective C layer for 4coder - * - */ - -// TOP - -#define IS_OBJC_LAYER - -#include "4coder_base_types.h" - -#include "4coder_API/4coder_version.h" - -#include "4ed_cursor_codes.h" -#include "4ed_linked_node_macros.h" - -#undef global -#undef external -#define external - -#include "osx_objective_c_to_cpp_links.h" - -#include -#import -#import -#import -#import -#import - -#include -#include -#include -#include - -#include - -void -osx_post_to_clipboard(char *str){ - NSPasteboard *board = [NSPasteboard generalPasteboard]; - NSString *utf8_type = @"public.utf8-plain-text"; - NSArray *typesArray = [NSArray arrayWithObjects: utf8_type, nil]; - [board declareTypes:typesArray owner:nil]; - NSString *paste_string = [NSString stringWithUTF8String:str]; - [board setString:paste_string forType:utf8_type]; - osx_objc.just_posted_to_clipboard = true; -} - - -void -osx_error_dialogue(char *str){ - NSAlert *alert = [[NSAlert alloc] init]; - [alert addButtonWithTitle:@"OK"]; - NSString *text = [NSString stringWithUTF8String:str]; - [alert setMessageText:text]; - [alert setAlertStyle:NSCriticalAlertStyle]; - [alert runModal]; -} - -// -// Entry point, OpenGL window setup. -// - -@interface AppDelegate : NSObject -@end - -@interface My4coderView : NSOpenGLView{ - @public - //CVDisplayLinkRef displayLink; -} - -- (void)requestDisplay; -- (void)checkClipboard; -- (CVReturn)getFrame; -- (void)drawRect:(NSRect)bounds; -@end - -#define DISPLINK_SIG(n) CVReturn n(CVDisplayLinkRef link, const CVTimeStamp *now, const CVTimeStamp *output, CVOptionFlags flags_in, CVOptionFlags *flags_out, void *context) -static DISPLINK_SIG(osx_display_link); - -static OSX_Keyboard_Modifiers -osx_mods_nsevent_to_struct(NSEventModifierFlags flags){ - OSX_Keyboard_Modifiers mods = {}; - mods.shift = ((flags & NSEventModifierFlagShift) != 0); - mods.command = ((flags & NSEventModifierFlagCommand) != 0); - mods.control = ((flags & NSEventModifierFlagControl) != 0); - mods.option = ((flags & NSEventModifierFlagOption) != 0); - mods.caps = ((flags & NSEventModifierFlagCapsLock) != 0); - return(mods); -} - -@implementation My4coderView - -- (void)keyDown:(NSEvent *)event{ - NSString *real = [event charactersIgnoringModifiers]; - NSString *with_mods = [event characters]; - - b32 is_dead_key = false; - if (real && !with_mods){ - is_dead_key = true; - } - - OSX_Keyboard_Modifiers mods = osx_get_modifiers(); - - // TODO(allen): Not ideal solution, look for realer text - // input on Mac. This just makes sure we're getting good - // results for unmodified keys when cmnd and ctrl aren't down. - NSString *which = with_mods; - if (mods.command || mods.control){ - which = real; - } - - u32 length = which.length; - for (u32 i = 0; i < length; ++i){ - unichar c = [which characterAtIndex:i]; - osx_character_input(c, mods); - } -} - -- (void)mouseDown:(NSEvent*)event{ - NSPoint m = [event locationInWindow]; - osx_mouse(m.x, m.y, MouseType_Press); -} - -- (void)mouseDragged:(NSEvent*)event{ - NSPoint m = [event locationInWindow]; - osx_mouse(m.x, m.y, MouseType_Move); -} - -- (void)mouseMoved:(NSEvent*)event{ - NSPoint m = [event locationInWindow]; - osx_mouse(m.x, m.y, MouseType_Move); -} - -- (void)mouseUp:(NSEvent*)event{ - NSPoint m = [event locationInWindow]; - osx_mouse(m.x, m.y, MouseType_Release); -} - -- (void)scrollWheel:(NSEvent*)event{ - float dx = event.scrollingDeltaX; - float dy = event.scrollingDeltaY; - osx_mouse_wheel(dx, dy); -} - -- (BOOL)windowShouldClose:(NSWindow*)sender{ - osx_try_to_close(); - return(NO); -} - -- (void)requestDisplay{ - CGRect cg_rect = CGRectMake(0, 0, osx_objc.width, osx_objc.height); - NSRect rect = NSRectFromCGRect(cg_rect); - [self setNeedsDisplayInRect:rect]; -} - -static i32 did_update_for_clipboard = true; -- (void)checkClipboard{ - NSPasteboard *board = [NSPasteboard generalPasteboard]; - if (board.changeCount != osx_objc.prev_clipboard_change_count && did_update_for_clipboard){ - [self requestDisplay]; - did_update_for_clipboard = false; - } -} - -- (CVReturn)getFrame{ - did_update_for_clipboard = true; - - @autoreleasepool - { - if (osx_objc.running){ - osx_objc.has_clipboard_item = false; - NSPasteboard *board = [NSPasteboard generalPasteboard]; - if (board.changeCount != osx_objc.prev_clipboard_change_count){ - if (!osx_objc.just_posted_to_clipboard){ - NSString *utf8_type = @"public.utf8-plain-text"; - NSArray *array = [NSArray arrayWithObjects: utf8_type, nil]; - NSString *has_string = [board availableTypeFromArray:array]; - if (has_string != nil){ - NSData *data = [board dataForType: utf8_type]; - if (data != nil){ - u32 copy_length = data.length; - if (copy_length > 0){ - if (copy_length + 1 > osx_objc.clipboard_max){ - osx_free(osx_objc.clipboard_data, osx_objc.clipboard_max); - osx_objc.clipboard_max = l_round_up_u32(copy_length + 1, KB(4)); - osx_objc.clipboard_data = osx_allocate(osx_objc.clipboard_max); - } - - if (copy_length + 1 < osx_objc.clipboard_max){ - osx_objc.clipboard_size = copy_length; - [data - getBytes: osx_objc.clipboard_data - length: copy_length]; - ((char*)osx_objc.clipboard_data)[copy_length] = 0; - osx_objc.has_clipboard_item = true; - } - } - } - } - } - else{ - osx_objc.just_posted_to_clipboard = false; - } - osx_objc.prev_clipboard_change_count = board.changeCount; - } - - osx_step(); - } - } - return kCVReturnSuccess; -} - -- (void)reshape -{ - [super reshape]; - - NSRect rect = [self bounds]; - osx_resize(rect.size.width, rect.size.height); -} - -- (void)init_gl -{ - if (osx_objc.gl_is_initialized){ - return; - } - - [self setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; - - NSOpenGLPixelFormatAttribute attrs[] = { - NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersionLegacy, - NSOpenGLPFAColorSize, 24, - NSOpenGLPFAAlphaSize, 8, - NSOpenGLPFAAccelerated, - NSOpenGLPFADoubleBuffer, - 0 - }; - - NSOpenGLPixelFormat* format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; - if(format == nil){ - fprintf(stderr, "Error creating OpenGLPixelFormat\n"); - exit(1); - } - - NSOpenGLContext* context = [[NSOpenGLContext alloc] initWithFormat:format shareContext:nil]; - - [self setPixelFormat:format]; - [self setOpenGLContext:context]; - - [context makeCurrentContext]; - - osx_objc.gl_is_initialized = true; -} - -- (id)init -{ - self = [super init]; - if(self == nil) - { - return nil; - } - - [self init_gl]; - return self; -} - -- (void)drawRect: (NSRect) bounds{ - [self getFrame]; -} - -- (void)awakeFromNib -{ - [self init_gl]; -} - -- (void)prepareOpenGL -{ - [super prepareOpenGL]; - - [[self openGLContext] makeCurrentContext]; - - GLint swapInt = 1; - [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval]; -} - -- (void)dealloc -{ - [super dealloc]; -} - -- (BOOL)acceptsFirstResponder -{ - return YES; -} - -- (BOOL)becomeFirstResponder -{ - return YES; -} - -- (BOOL)resignFirstResponder -{ - return YES; -} -@end - -@implementation AppDelegate -- (void)applicationDidFinishLaunching:(id)sender -{ -} -- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)sender -{ - return YES; -} -- (void)applicationWillTerminate:(NSApplication*)sender -{ -} -@end - -////////////////// - -typedef struct File_Change_Node File_Change_Node; -struct File_Change_Node{ - File_Change_Node *next; - char *name; - i32 len; -}; - -typedef struct{ - File_Change_Node *first; - File_Change_Node *last; - volatile i64 lock; -} File_Change_Queue; - -static File_Change_Queue file_queue = {}; - -File_Change_Node* -file_change_node(char *name){ - i32 len = strlen(name); - void *block = malloc(len + 1 + sizeof(File_Change_Node)); - File_Change_Node *node = (File_Change_Node*)block; - memset(node, 0, sizeof(*node)); - node->name = (char*)(node + 1); - node->len = len; - memcpy(node->name, name, len + 1); - return(node); -} - -void -file_change_node_free(File_Change_Node *node){ - free(node); -} - -#define file_queue_lock() for(;;){i64 v=__sync_val_compare_and_swap(&file_queue.lock,0,1);if(v==0){break;}} - -#define file_queue_unlock() __sync_lock_test_and_set(&file_queue.lock, 0) - -void -file_watch_callback(ConstFSEventStreamRef stream, void *callbackInfo, size_t numEvents, void *evPaths, const FSEventStreamEventFlags *evFlags, const FSEventStreamEventId *evIds){ - char **paths = (char**)evPaths; - for (int i = 0; i < numEvents; ++i){ - File_Change_Node *node = file_change_node(paths[i]); - file_queue_lock(); - sll_push(file_queue.first, file_queue.last, node); - file_queue_unlock(); - } -} - -////////////////// - -typedef struct{ - FSEventStreamRef stream; -} File_Watching_Handle; - -File_Watching_Handle -schedule_file_watching(char *f){ - File_Watching_Handle handle = {}; - - CFStringRef arg = CFStringCreateWithCString(0, f, kCFStringEncodingUTF8); - - CFArrayRef paths = CFArrayCreate(0, (const void**)&arg, 1, 0); - - void *callbackInfo = 0; - CFAbsoluteTime latency = 2.0; - - handle.stream = FSEventStreamCreate(0, &file_watch_callback, 0, paths, kFSEventStreamEventIdSinceNow, latency, kFSEventStreamCreateFlagFileEvents); - - FSEventStreamScheduleWithRunLoop(handle.stream, CFRunLoopGetMain(), kCFRunLoopDefaultMode); - - if (!FSEventStreamStart(handle.stream)){ - fprintf(stdout, "BAD SCHED: %s\n", f); - } - - return(handle); -} - -void -unschedule_file_watching(File_Watching_Handle handle){ - FSEventStreamStop(handle.stream); - FSEventStreamInvalidate(handle.stream); - FSEventStreamRelease(handle.stream); -} - -typedef struct File_Table_Entry{ - u64 hash; - void *name; - i32 counter; - File_Watching_Handle handle; -} File_Table_Entry; - -typedef struct File_Change_Table{ - File_Table_Entry *table; - i32 count; - i32 size; -} File_Change_Table; - -static File_Change_Table file_change_table = {}; - -void* -osx_file_name_prefixed_length(char *name){ - i32 len = 0; - for (; name[len] != 0; ++len); - char *name_stored = (char*)malloc(4 + l_round_up_u32(len + 1, 4)); - *(i32*)name_stored = len; - memcpy(name_stored + 4, name, len); - name_stored[4 + len] = 0; - return(name_stored); -} - -b32 -osx_name_prefixed_match(void *a, void *b){ - b32 result = false; - i32 *len_a = (i32*)a; - i32 *len_b = (i32*)b; - if (*len_a == *len_b){ - char *str_a = (char*)(len_a + 1); - char *str_b = (char*)(len_b + 1); - if (strncmp(str_a, str_b, *len_a) == 0){ - result = true; - } - } - return(result); -} - -File_Table_Entry* -osx_file_listener_lookup_and_return_pointer(u64 hash, void *name){ - File_Table_Entry *result = 0; - i32 index = (i32)(hash % file_change_table.size); - i32 first_index = index; - - for (;;){ - File_Table_Entry *entry = &file_change_table.table[index]; - if (entry->hash == hash){ - if (osx_name_prefixed_match(name, entry->name)){ - result = entry; - break; - } - } - if (entry->name == 0){ - break; - } - - index = (index + 1)%file_change_table.size; - if (index == first_index){ - break; - } - } - - return(result); -} - -void -osx_file_listener_table_entry_erase(File_Table_Entry *entry){ - free(entry->name); - unschedule_file_watching(entry->handle); - memset(entry, 0, sizeof(*entry)); - entry->name = (void*)1; -} - -b32 -osx_file_listener_lookup_and_decrement(u64 hash, void *name){ - b32 found = false; - File_Table_Entry *entry = osx_file_listener_lookup_and_return_pointer(hash, name); - if (entry != 0){ - found = true; - --entry->counter; - if (entry->counter <= 0){ - osx_file_listener_table_entry_erase(entry); - } - } - return(found); -} - -b32 -osx_file_listener_hash(u64 hash, void *name, i32 counter, File_Watching_Handle **handle_address_out){ - b32 result = 0; - if (file_change_table.count*6 < file_change_table.size*5){ - i32 index = (i32)(hash % file_change_table.size); - i32 first_index = index; - - for (;;){ - File_Table_Entry *entry = &file_change_table.table[index]; - if (entry->name == 0 || entry->name == (void*)1){ - entry->hash = hash; - entry->name = name; - entry->counter = counter; - *handle_address_out = &entry->handle; - result = true; - ++file_change_table.count; - break; - } - - index = (index + 1)%file_change_table.size; - if (index == first_index){ - break; - } - } - - if (!result){ - //LOG("file change listener table error: could not find a free slot in the table\n"); - } - } - - return(result); -} - -void -osx_file_listener_grow_table(i32 size){ - if (file_change_table.size < size){ - File_Table_Entry *old_table = file_change_table.table; - i32 old_size = file_change_table.size; - - file_change_table.table = (File_Table_Entry*)osx_allocate(size*sizeof(File_Table_Entry)); - memset(file_change_table.table, 0, size*sizeof(File_Table_Entry)); - file_change_table.size = size; - - for (i32 i = 0; i < old_size; ++i){ - void *name = file_change_table.table[i].name; - if (name != 0 && name != (void*)1){ - File_Table_Entry *e = &file_change_table.table[i]; - File_Watching_Handle *handle_address = 0; - osx_file_listener_hash(e->hash, e->name, e->counter, &handle_address); - *handle_address = e->handle; - } - } - - if (old_table != 0){ - osx_free(old_table, old_size*sizeof(File_Table_Entry)); - } - } -} - -void -osx_file_listener_double_table(){ - osx_file_listener_grow_table(file_change_table.size*2); -} - -b32 -osx_file_listener_insert_or_increment_always(u64 hash, void *name, File_Watching_Handle **handle_address_out){ - b32 was_already_in_table = false; - File_Table_Entry *entry = osx_file_listener_lookup_and_return_pointer(hash, name); - if (entry != 0){ - ++entry->counter; - was_already_in_table = true; - } - else{ - b32 result = osx_file_listener_hash(hash, name, 1, handle_address_out); - if (!result){ - osx_file_listener_double_table(); - osx_file_listener_hash(hash, name, 1, handle_address_out); - } - } - return(was_already_in_table); -} - -u64 -osx_get_file_hash(void *name){ - u32 count = *(u32*)(name); - char *str = (char*)name + 4; - u64 hash = 0; - u64 state = count; - u64 inc = 1 + 2*count; - for (u32 i = 0; i <= count; ++i){ - u64 old_state = state; - state = state*6364136223846783005ULL + inc; - u32 xorshifted = ((old_state >> 18u) ^ old_state) >> 27u; - u32 rot = old_state >> 59u; - hash = (hash << 3) + (hash & 1) + ((xorshifted >> rot) | (xorshifted << ((-rot) & 31))); - if (i < count){ - inc = 1 + 2*(((inc - 1) << 7) | (u8)str[i]); - } - } - return(hash); -} - -void -osx_file_listener_init(void){ - osx_file_listener_grow_table(4096); -} - -void -osx_add_file_listener(char *dir_name){ - // TODO(allen): Decide what to do about these darn string mallocs. - void *name_stored = osx_file_name_prefixed_length(dir_name); - File_Watching_Handle *handle_address = 0; - b32 was_already_in_table = osx_file_listener_insert_or_increment_always(osx_get_file_hash(name_stored), name_stored, &handle_address); - if (was_already_in_table){ - free(name_stored); - } - else{ - *handle_address = schedule_file_watching(dir_name); - } -} - -void -osx_remove_file_listener(char *dir_name){ - void *name_stored = osx_file_name_prefixed_length(dir_name); - osx_file_listener_lookup_and_decrement(osx_get_file_hash(name_stored), name_stored); - free(name_stored); -} - -i32 -osx_get_file_change_event(char *buffer, i32 max, i32 *size){ - file_queue_lock(); - File_Change_Node *node = file_queue.first; - sll_pop(file_queue.first, file_queue.last); - file_queue_unlock(); - - i32 result = 0; - if (node != 0){ - if (node->len < max){ - result = 1; - memcpy(buffer, node->name, node->len); - *size = node->len; - } - else{ - result = -1; - // TODO(allen): Somehow save the node? - } - file_change_node_free(node); - } - - return(result); -} - -void -osx_show_cursor(i32 show, i32 cursor_type){ - local_persist b32 cursor_is_shown = 1; - if (show == 1){ - if (!cursor_is_shown){ - [NSCursor unhide]; - cursor_is_shown = true; - } - } - else if (show == -1){ - if (cursor_is_shown){ - [NSCursor hide]; - cursor_is_shown = false; - } - } - - if (cursor_type > 0){ - switch (cursor_type){ - case APP_MOUSE_CURSOR_ARROW: - { - [[NSCursor arrowCursor] set]; - }break; - - case APP_MOUSE_CURSOR_IBEAM: - { - [[NSCursor IBeamCursor] set]; - }break; - - case APP_MOUSE_CURSOR_LEFTRIGHT: - { - [[NSCursor resizeLeftRightCursor] set]; - }break; - - case APP_MOUSE_CURSOR_UPDOWN: - { - [[NSCursor resizeUpDownCursor] set]; - }break; - } - } -} - -My4coderView* view = 0; -NSWindow* window = 0; - -void -osx_begin_render(){ - CGLLockContext([[view openGLContext] CGLContextObj]); - [[view openGLContext] makeCurrentContext]; -} - -void -osx_end_render(){ - [[view openGLContext] flushBuffer]; - CGLUnlockContext([[view openGLContext] CGLContextObj]); -} - -void -osx_schedule_step(void){ - [NSTimer scheduledTimerWithTimeInterval: 0.0 - target: view - selector: @selector(requestDisplay) - userInfo: nil repeats:NO]; -} - -void -osx_toggle_fullscreen(void){ - [window toggleFullScreen:nil]; -} - -b32 -osx_is_fullscreen(void){ - b32 result = (([window styleMask] & NSFullScreenWindowMask) != 0); - return(result); -} - -void -osx_close_app(void){ - [NSApp terminate: nil]; -} - -f32 -osx_timer_seconds(void){ - f32 result = CACurrentMediaTime(); - return(result); -} - -NSFontManager *font_manager = 0; - -NSString *get_font_path(NSFont *font){ - CFStringRef name = (CFStringRef)[font fontName]; - CGFloat size = [font pointSize]; - CTFontDescriptorRef ref = CTFontDescriptorCreateWithNameAndSize(name, size); - CFURLRef url = CTFontDescriptorCopyAttribute(ref, kCTFontURLAttribute); - NSString *path = [(NSURL *)CFBridgingRelease(url) path]; - return(path); -} - -OSX_Font_Match -osx_get_font_match(char *name, i32 pt_size, b32 italic, b32 bold){ - if (font_manager == 0){ - font_manager = [NSFontManager sharedFontManager]; - } - - NSString *name_string = [NSString stringWithUTF8String:name]; - NSFontTraitMask trait_mask = 0; - if (italic){ - trait_mask = (trait_mask | NSItalicFontMask); - } - NSInteger weight = 5; - if (bold){ - weight = 9; - } - - b32 used_base_file = false; - NSFont *font = [font_manager - fontWithFamily: name_string - traits: trait_mask - weight: weight - size:(float)pt_size]; - - if (font == nil){ - font = [font_manager - fontWithFamily: name_string - traits: 0 - weight: 5 - size:(float)pt_size]; - used_base_file = true; - } - - OSX_Font_Match match = {}; - if (font != nil){ - NSString *path = get_font_path(font); - char *path_c = 0; - if (path != nil){ - path_c = (char*)[path UTF8String]; - } - if (path_c != 0){ - match.path = path_c; - match.used_base_file = used_base_file; - } - } - - return(match); -} - -OSX_Loadable_Fonts -osx_list_loadable_fonts(void){ - if (font_manager == 0){ - font_manager = [NSFontManager sharedFontManager]; - } - - NSArray *fonts = [font_manager availableFontFamilies]; - - OSX_Loadable_Fonts result = {}; - NSUInteger count_u = [fonts count]; - int count = (int)count_u; - - result.count = count; - - size_t memsize = count*2*sizeof(char*); - void *mem = malloc(memsize); - result.names = (char**)mem; - result.paths = result.names + count; - - for (int i = 0; i < count; ++i){ - NSString *font_n = fonts[i]; - char *font_n_c = (char*)[font_n UTF8String]; - NSFont *font = [font_manager - fontWithFamily:font_n - traits:NSUnboldFontMask|NSUnitalicFontMask - weight:5 - size:12]; - NSString *path = get_font_path(font); - char *path_c = 0; - if (path != nil){ - path_c = (char*)[path UTF8String]; - } - result.names[i] = font_n_c; - result.paths[i] = path_c; - } - - return(result); -} - -void -osx_change_title(char *str_c){ - NSString *str = [NSString stringWithUTF8String:str_c]; - [window setTitle:str]; -} - -OSX_Keyboard_Modifiers -osx_get_modifiers(void){ - return(osx_mods_nsevent_to_struct([NSEvent modifierFlags])); -} - -int -main(int argc, char **argv){ - memset(&osx_objc, 0, sizeof(osx_objc)); - - u32 clipboard_size = KB(16); - osx_objc.clipboard_data = osx_allocate(clipboard_size); - osx_objc.clipboard_max = clipboard_size; - osx_objc.argc = argc; - osx_objc.argv = argv; - - osx_file_listener_init(); - - @autoreleasepool{ - NSApplication *app = [NSApplication sharedApplication]; - [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; - - [app setDelegate:[[AppDelegate alloc] init]]; - NSRect screenRect = [[NSScreen mainScreen] frame]; - float w = 800.f; - float h = 600.f; - NSRect frame = NSMakeRect((screenRect.size.width - w) * 0.5, (screenRect.size.height - h) * 0.5, w, h); - - u32 flags = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask; - window = [[NSWindow alloc] initWithContentRect:frame styleMask:flags backing:NSBackingStoreBuffered defer:NO]; - - [window setAcceptsMouseMovedEvents:YES]; - - view = [[My4coderView alloc] init]; - [view setFrame:[[window contentView] bounds]]; - [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; - - [[window contentView] addSubview:view]; - [window setMinSize:NSMakeSize(100, 100)]; - [window setTitle:@WINDOW_NAME]; - [window makeKeyAndOrderFront:nil]; - - [NSTimer scheduledTimerWithTimeInterval: 0.5 - target: view - selector: @selector(checkClipboard) - userInfo: nil repeats:YES]; - - osx_init(); - osx_objc.running = true; - - [NSApp run]; - } - - return(0); -} - -// BOTTOM - diff --git a/platform_mac/osx_objective_c_to_cpp_links_old.h b/platform_mac/osx_objective_c_to_cpp_links_old.h deleted file mode 100644 index cdc74099..00000000 --- a/platform_mac/osx_objective_c_to_cpp_links_old.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Mr. 4th Dimention - Allen Webster - * - * 06.29.2017 - * - * Types and functions for communication between C++ and Objective-C layers. - * - */ - -// TOP - -#if !defined(OSX_OBJECTIVE_C_TO_CPP_LINKS_H) -#define OSX_OBJECTIVE_C_TO_CPP_LINKS_H - -#include - -#if 0 -#define DBG_POINT() fprintf(stdout, "%s\n", __FILE__ ":" LINE_STR ":") -#else -#define DBG_POINT() -#endif - -typedef enum OSX_Mouse_Event_Type{ - MouseType_Move, - MouseType_Press, - MouseType_Release, -} OSX_Mouse_Event_Type; - -typedef struct OSX_Keyboard_Modifiers{ - b32 shift; - b32 command; - b32 control; - b32 option; - b32 caps; -} OSX_Keyboard_Modifiers; - -typedef struct OSX_Objective_C_Vars{ - i32 width, height; - b32 gl_is_initialized; - b32 running; - u32 key_count; - u32 keys[8]; - - u32 prev_clipboard_change_count; - b32 has_clipboard_item; - void *clipboard_data; - u32 clipboard_size; - u32 clipboard_max; - b32 just_posted_to_clipboard; - - char *clipboard_space; - u64 clipboard_space_max; - - b32 full_screen; - b32 do_toggle; - - i32 argc; - char **argv; -} OSX_Objective_C_Vars; - -typedef struct OSX_Loadable_Fonts{ - char **names; - char **paths; - i32 count; -} OSX_Loadable_Fonts; - -typedef struct OSX_Font_Match{ - char *path; - b32 used_base_file; -} OSX_Font_Match; - -// In C++ layer. -extern OSX_Objective_C_Vars osx_objc; - -external void* -osx_allocate(u64 size); - -external void -osx_free(void *ptr, u64 size); - -external void -osx_resize(int width, int height); - -external void -osx_character_input(u32 code, OSX_Keyboard_Modifiers modifier_flags); - -external void -osx_mouse(i32 mx, i32 my, u32 type); - -external void -osx_mouse_wheel(float dx, float dy); - -external void -osx_try_to_close(void); - -external void -osx_step(); - -external void -osx_init(); - -external void -osx_log(char *m, i32 l); - -// In Objective-C layer. -external void -osx_post_to_clipboard(char *str); - -external void -osx_error_dialogue(char *str); - -external void -osx_add_file_listener(char *file_name); - -external void -osx_remove_file_listener(char *file_name); - -external i32 -osx_get_file_change_event(char *buffer, i32 max, i32 *size); - -external void -osx_show_cursor(i32 show_inc, i32 cursor_type); - -external void -osx_begin_render(void); - -external void -osx_end_render(void); - -external void -osx_schedule_step(void); - -external void -osx_toggle_fullscreen(void); - -external b32 -osx_is_fullscreen(void); - -external void -osx_close_app(void); - -external f32 -osx_timer_seconds(void); - -external OSX_Font_Match -osx_get_font_match(char *name, i32 pt_size, b32 italic, b32 bold); - -external OSX_Loadable_Fonts -osx_list_loadable_fonts(void); - -external void -osx_change_title(char *str); - -external OSX_Keyboard_Modifiers -osx_get_modifiers(void); - -#endif - -// BOTTOM - From 69d18fd8987b0f71f85f913e80a6cd247033b848 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Fri, 28 Feb 2020 17:36:36 -0800 Subject: [PATCH 25/40] Setup 4coder_examples.cpp; got rid of test_double_backspace --- bin/build-linux.sh | 0 custom/4coder_base_commands.cpp | 11 - custom/4coder_examples.cpp | 23 ++ custom/bin/buildsuper_x64-linux.sh | 0 custom/generated/command_metadata.h | 476 ++++++++++++++-------------- 5 files changed, 261 insertions(+), 249 deletions(-) mode change 100644 => 100755 bin/build-linux.sh create mode 100644 custom/4coder_examples.cpp mode change 100644 => 100755 custom/bin/buildsuper_x64-linux.sh diff --git a/bin/build-linux.sh b/bin/build-linux.sh old mode 100644 new mode 100755 diff --git a/custom/4coder_base_commands.cpp b/custom/4coder_base_commands.cpp index 2ac0deb8..57438b2e 100644 --- a/custom/4coder_base_commands.cpp +++ b/custom/4coder_base_commands.cpp @@ -112,17 +112,6 @@ CUSTOM_DOC("Deletes the character to the left of the cursor.") } } -CUSTOM_COMMAND_SIG(test_double_backspace) -CUSTOM_DOC("Made for testing purposes (I should have deleted this if you are reading it let me know)") -{ - View_ID view = get_active_view(app, Access_ReadWriteVisible); - Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible); - History_Group group = history_group_begin(app, buffer); - backspace_char(app); - backspace_char(app); - history_group_end(group); -} - CUSTOM_COMMAND_SIG(set_mark) CUSTOM_DOC("Sets the mark to the current position of the cursor.") { diff --git a/custom/4coder_examples.cpp b/custom/4coder_examples.cpp new file mode 100644 index 00000000..ba95e458 --- /dev/null +++ b/custom/4coder_examples.cpp @@ -0,0 +1,23 @@ +/* +4coder_examples.cpp - Commands that are included mainly to serve as example code for +customization writers. +*/ + +// TOP + +// example: History_Group +// example: history_group_begin +// example: history_group_end +CUSTOM_COMMAND_SIG(double_backspace) +CUSTOM_DOC("Example of history group helpers") +{ + View_ID view = get_active_view(app, Access_ReadWriteVisible); + Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible); + History_Group group = history_group_begin(app, buffer); + backspace_char(app); + backspace_char(app); + history_group_end(group); +} + +// BOTTOM + diff --git a/custom/bin/buildsuper_x64-linux.sh b/custom/bin/buildsuper_x64-linux.sh old mode 100644 new mode 100755 diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index e7633a86..c43f5fef 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -260,244 +260,244 @@ i32 source_name_len; i32 line_number; }; static Command_Metadata fcoder_metacmd_table[238] = { -{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 409 }, -{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 413 }, -{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 423 }, -{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 404 }, -{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 165 }, -{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 96 }, -{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 658 }, -{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 68 }, -{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 159 }, -{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 122 }, -{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 208 }, -{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 284 }, -{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 290 }, -{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 180 }, -{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 647 }, -{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 480 }, -{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 216 }, -{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 244 }, -{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 234 }, -{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 254 }, -{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 266 }, -{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 7 }, -{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 843 }, -{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 174 }, -{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 666 }, -{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "/Users/allenwebster/4ed/code/custom/4coder_docs.cpp", 51, 190 }, -{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 761 }, -{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 125 }, -{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 149 }, -{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 107 }, -{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 135 }, -{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "/Users/allenwebster/4ed/code/custom/4coder_docs.cpp", 51, 175 }, -{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 116 }, -{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 749 }, -{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1891 }, -{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "/Users/allenwebster/4ed/code/custom/4coder_default_hooks.cpp", 60, 7 }, -{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "/Users/allenwebster/4ed/code/custom/4coder_default_hooks.cpp", 60, 23 }, -{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "/Users/allenwebster/4ed/code/custom/4coder_default_hooks.cpp", 60, 51 }, -{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 173 }, -{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 79 }, -{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 112 }, -{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1317 }, -{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1489 }, -{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 145 }, -{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1475 }, -{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "/Users/allenwebster/4ed/code/custom/4coder_cli_command.cpp", 58, 22 }, -{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "/Users/allenwebster/4ed/code/custom/4coder_cli_command.cpp", 58, 7 }, -{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 836 }, -{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2201 }, -{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2209 }, -{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 525 }, -{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 542 }, -{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 348 }, -{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 375 }, -{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 844 }, -{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 464 }, -{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 494 }, -{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 481 }, -{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 511 }, -{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 696 }, -{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 682 }, -{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 869 }, -{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 70 }, -{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 564 }, -{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 581 }, -{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 738 }, -{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 520 }, -{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 661 }, -{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 715 }, -{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 612 }, -{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 510 }, -{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "/Users/allenwebster/4ed/code/custom/4coder_code_index_listers.cpp", 65, 12 }, -{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "/Users/allenwebster/4ed/code/custom/4coder_keyboard_macro.cpp", 61, 54 }, -{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "/Users/allenwebster/4ed/code/custom/4coder_keyboard_macro.cpp", 61, 77 }, -{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "/Users/allenwebster/4ed/code/custom/4coder_keyboard_macro.cpp", 61, 41 }, -{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1635 }, -{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 9 }, -{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 222 }, -{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 295 }, -{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 301 }, -{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 267 }, -{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 277 }, -{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 165 }, -{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 177 }, -{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 189 }, -{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 195 }, -{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 201 }, -{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 207 }, -{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 213 }, -{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 221 }, -{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 171 }, -{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 183 }, -{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 863 }, -{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "/Users/allenwebster/4ed/code/custom/4coder_config.cpp", 53, 1627 }, -{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 457 }, -{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 469 }, -{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1429 }, -{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 44 }, -{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 237 }, -{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 249 }, -{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 29 }, -{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 231 }, -{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 243 }, -{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 791 }, -{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 276 }, -{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 347 }, -{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 359 }, -{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 365 }, -{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 418 }, -{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 442 }, -{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 430 }, -{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 448 }, -{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 525 }, -{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 539 }, -{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 497 }, -{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 482 }, -{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 511 }, -{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1469 }, -{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1463 }, -{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 456 }, -{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 518 }, -{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 532 }, -{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 490 }, -{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 474 }, -{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 504 }, -{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 341 }, -{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 353 }, -{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 412 }, -{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 436 }, -{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 424 }, -{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 364 }, -{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 373 }, -{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 849 }, -{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 855 }, -{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1554 }, -{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1885 }, -{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 46 }, -{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 62 }, -{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 54 }, -{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1586 }, -{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 310 }, -{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 300 }, -{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 383 }, -{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 375 }, -{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 127 }, -{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 202 }, -{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 161 }, -{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 209 }, -{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 106 }, -{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "/Users/allenwebster/4ed/code/custom/4coder_profile.cpp", 54, 226 }, -{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "/Users/allenwebster/4ed/code/custom/4coder_profile.cpp", 54, 219 }, -{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "/Users/allenwebster/4ed/code/custom/4coder_profile.cpp", 54, 212 }, -{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "/Users/allenwebster/4ed/code/custom/4coder_profile_inspect.cpp", 62, 886 }, -{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1290 }, -{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 871 }, -{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 897 }, -{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1245 }, -{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1266 }, -{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1282 }, -{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1724 }, -{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1809 }, -{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1394 }, -{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1653 }, -{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1155 }, -{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1146 }, -{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1137 }, -{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1078 }, -{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1090 }, -{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1643 }, -{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 382 }, -{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1361 }, -{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1072 }, -{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1084 }, -{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2189 }, -{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2177 }, -{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2195 }, -{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2183 }, -{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 548 }, -{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 57 }, -{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 66 }, -{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 82 }, -{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 99 }, -{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 27 }, -{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 39 }, -{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 125 }, -{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 112 }, -{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 86 }, -{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 99 }, -{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 718 }, -{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 760 }, -{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 126 }, -{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 427 }, -{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 421 }, -{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1238 }, -{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1250 }, -{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1244 }, -{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1231 }, -{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 689 }, -{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 675 }, -{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "/Users/allenwebster/4ed/code/custom/4coder_log_parser.cpp", 57, 994 }, -{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 190 }, -{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 198 }, -{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 237 }, -{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 403 }, -{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1611 }, -{ PROC_LINKS(test_double_backspace, 0), false, "test_double_backspace", 21, "Made for testing purposes (I should have deleted this if you are reading it let me know)", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 115 }, -{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 785 }, -{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 574 }, -{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 561 }, -{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 703 }, -{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 712 }, -{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 451 }, -{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 439 }, -{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 433 }, -{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 817 }, -{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 823 }, -{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 415 }, -{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 445 }, -{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 808 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "/Users/allenwebster/4ed/code/custom/4coder_code_index.cpp", 57, 1176 }, -{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 20 }, -{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 34 }, -{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 137 }, -{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1711 }, -{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1738 }, -{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1599 }, -{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "/Users/allenwebster/4ed/code/custom/4coder_jump_lister.cpp", 58, 59 }, -{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 395 }, -{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 642 }, -{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 94 }, -{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 82 }, -{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 88 }, -{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 67 }, -{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 433 }, -{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 59 }, -{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 76 }, -{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 73 }, -{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 100 }, +{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "../code/custom/4coder_default_framework.cpp", 43, 409 }, +{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "../code/custom/4coder_auto_indent.cpp", 37, 413 }, +{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "../code/custom/4coder_auto_indent.cpp", 37, 423 }, +{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "../code/custom/4coder_auto_indent.cpp", 37, 404 }, +{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "../code/custom/4coder_base_commands.cpp", 39, 165 }, +{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "../code/custom/4coder_base_commands.cpp", 39, 96 }, +{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "../code/custom/4coder_base_commands.cpp", 39, 658 }, +{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "../code/custom/4coder_clipboard.cpp", 35, 68 }, +{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "../code/custom/4coder_build_commands.cpp", 40, 159 }, +{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "../code/custom/4coder_build_commands.cpp", 40, 122 }, +{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "../code/custom/4coder_base_commands.cpp", 39, 208 }, +{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "../code/custom/4coder_default_framework.cpp", 43, 284 }, +{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "../code/custom/4coder_default_framework.cpp", 43, 290 }, +{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "../code/custom/4coder_build_commands.cpp", 40, 180 }, +{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 647 }, +{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "../code/custom/4coder_default_framework.cpp", 43, 480 }, +{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "../code/custom/4coder_clipboard.cpp", 35, 216 }, +{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "../code/custom/4coder_base_commands.cpp", 39, 244 }, +{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "../code/custom/4coder_base_commands.cpp", 39, 234 }, +{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "../code/custom/4coder_base_commands.cpp", 39, 254 }, +{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "../code/custom/4coder_base_commands.cpp", 39, 266 }, +{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "../code/custom/4coder_clipboard.cpp", 35, 7 }, +{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "../code/custom/4coder_project_commands.cpp", 42, 843 }, +{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "../code/custom/4coder_build_commands.cpp", 40, 174 }, +{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "../code/custom/4coder_base_commands.cpp", 39, 666 }, +{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "../code/custom/4coder_docs.cpp", 30, 190 }, +{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "../code/custom/4coder_lists.cpp", 31, 761 }, +{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "../code/custom/4coder_combined_write_commands.cpp", 49, 125 }, +{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "../code/custom/4coder_combined_write_commands.cpp", 49, 149 }, +{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "../code/custom/4coder_clipboard.cpp", 35, 107 }, +{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "../code/custom/4coder_base_commands.cpp", 39, 135 }, +{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "../code/custom/4coder_docs.cpp", 30, 175 }, +{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "../code/custom/4coder_clipboard.cpp", 35, 116 }, +{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 749 }, +{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "../code/custom/4coder_base_commands.cpp", 39, 1891 }, +{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "../code/custom/4coder_default_hooks.cpp", 39, 7 }, +{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "../code/custom/4coder_default_hooks.cpp", 39, 23 }, +{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "../code/custom/4coder_default_hooks.cpp", 39, 51 }, +{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "../code/custom/4coder_base_commands.cpp", 39, 173 }, +{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "../code/custom/4coder_base_commands.cpp", 39, 79 }, +{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "../code/custom/4coder_scope_commands.cpp", 40, 112 }, +{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "../code/custom/4coder_base_commands.cpp", 39, 1317 }, +{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "../code/custom/4coder_base_commands.cpp", 39, 1489 }, +{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "../code/custom/4coder_base_commands.cpp", 39, 145 }, +{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "../code/custom/4coder_base_commands.cpp", 39, 1475 }, +{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "../code/custom/4coder_cli_command.cpp", 37, 22 }, +{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "../code/custom/4coder_cli_command.cpp", 37, 7 }, +{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "../code/custom/4coder_base_commands.cpp", 39, 836 }, +{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "../code/custom/4coder_helper.cpp", 32, 2201 }, +{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "../code/custom/4coder_helper.cpp", 32, 2209 }, +{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "../code/custom/4coder_jump_sticky.cpp", 37, 525 }, +{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "../code/custom/4coder_jump_sticky.cpp", 37, 542 }, +{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "../code/custom/4coder_jump_sticky.cpp", 37, 348 }, +{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "../code/custom/4coder_jump_sticky.cpp", 37, 375 }, +{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "../code/custom/4coder_base_commands.cpp", 39, 844 }, +{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "../code/custom/4coder_jump_sticky.cpp", 37, 464 }, +{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "../code/custom/4coder_jump_sticky.cpp", 37, 494 }, +{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "../code/custom/4coder_jump_sticky.cpp", 37, 481 }, +{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "../code/custom/4coder_jump_sticky.cpp", 37, 511 }, +{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 696 }, +{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 682 }, +{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "../code/custom/4coder_tutorial.cpp", 34, 869 }, +{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 70 }, +{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "../code/custom/4coder_jump_sticky.cpp", 37, 564 }, +{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "../code/custom/4coder_jump_sticky.cpp", 37, 581 }, +{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 738 }, +{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "../code/custom/4coder_lists.cpp", 31, 520 }, +{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "../code/custom/4coder_lists.cpp", 31, 661 }, +{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "../code/custom/4coder_lists.cpp", 31, 715 }, +{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "../code/custom/4coder_lists.cpp", 31, 612 }, +{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "../code/custom/4coder_lists.cpp", 31, 510 }, +{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "../code/custom/4coder_code_index_listers.cpp", 44, 12 }, +{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "../code/custom/4coder_keyboard_macro.cpp", 40, 54 }, +{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "../code/custom/4coder_keyboard_macro.cpp", 40, 77 }, +{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "../code/custom/4coder_keyboard_macro.cpp", 40, 41 }, +{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1635 }, +{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "../code/custom/4coder_tutorial.cpp", 34, 9 }, +{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "../code/custom/4coder_base_commands.cpp", 39, 222 }, +{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "../code/custom/4coder_function_list.cpp", 39, 295 }, +{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "../code/custom/4coder_function_list.cpp", 39, 301 }, +{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "../code/custom/4coder_function_list.cpp", 39, 267 }, +{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "../code/custom/4coder_function_list.cpp", 39, 277 }, +{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "../code/custom/4coder_search.cpp", 32, 165 }, +{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "../code/custom/4coder_search.cpp", 32, 177 }, +{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 189 }, +{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 195 }, +{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 201 }, +{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 207 }, +{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "../code/custom/4coder_search.cpp", 32, 213 }, +{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "../code/custom/4coder_search.cpp", 32, 221 }, +{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "../code/custom/4coder_search.cpp", 32, 171 }, +{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "../code/custom/4coder_search.cpp", 32, 183 }, +{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "../code/custom/4coder_project_commands.cpp", 42, 863 }, +{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "../code/custom/4coder_config.cpp", 32, 1627 }, +{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "../code/custom/4coder_default_framework.cpp", 43, 457 }, +{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "../code/custom/4coder_default_framework.cpp", 43, 469 }, +{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "../code/custom/4coder_base_commands.cpp", 39, 1429 }, +{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 44 }, +{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 237 }, +{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 249 }, +{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 29 }, +{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 231 }, +{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 243 }, +{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "../code/custom/4coder_base_commands.cpp", 39, 791 }, +{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "../code/custom/4coder_base_commands.cpp", 39, 276 }, +{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "../code/custom/4coder_base_commands.cpp", 39, 347 }, +{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "../code/custom/4coder_base_commands.cpp", 39, 359 }, +{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "../code/custom/4coder_base_commands.cpp", 39, 365 }, +{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "../code/custom/4coder_base_commands.cpp", 39, 418 }, +{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 442 }, +{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 430 }, +{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "../code/custom/4coder_base_commands.cpp", 39, 448 }, +{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "../code/custom/4coder_base_commands.cpp", 39, 525 }, +{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "../code/custom/4coder_base_commands.cpp", 39, 539 }, +{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "../code/custom/4coder_base_commands.cpp", 39, 497 }, +{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "../code/custom/4coder_base_commands.cpp", 39, 482 }, +{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "../code/custom/4coder_base_commands.cpp", 39, 511 }, +{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "../code/custom/4coder_base_commands.cpp", 39, 1469 }, +{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "../code/custom/4coder_base_commands.cpp", 39, 1463 }, +{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "../code/custom/4coder_base_commands.cpp", 39, 456 }, +{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "../code/custom/4coder_base_commands.cpp", 39, 518 }, +{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "../code/custom/4coder_base_commands.cpp", 39, 532 }, +{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "../code/custom/4coder_base_commands.cpp", 39, 490 }, +{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "../code/custom/4coder_base_commands.cpp", 39, 474 }, +{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "../code/custom/4coder_base_commands.cpp", 39, 504 }, +{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "../code/custom/4coder_base_commands.cpp", 39, 341 }, +{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "../code/custom/4coder_base_commands.cpp", 39, 353 }, +{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "../code/custom/4coder_base_commands.cpp", 39, 412 }, +{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 436 }, +{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 424 }, +{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "../code/custom/4coder_clipboard.cpp", 35, 364 }, +{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "../code/custom/4coder_clipboard.cpp", 35, 373 }, +{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "../code/custom/4coder_project_commands.cpp", 42, 849 }, +{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "../code/custom/4coder_project_commands.cpp", 42, 855 }, +{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "../code/custom/4coder_base_commands.cpp", 39, 1554 }, +{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1885 }, +{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "../code/custom/4coder_combined_write_commands.cpp", 49, 46 }, +{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "../code/custom/4coder_combined_write_commands.cpp", 49, 62 }, +{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "../code/custom/4coder_combined_write_commands.cpp", 49, 54 }, +{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1586 }, +{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "../code/custom/4coder_default_framework.cpp", 43, 310 }, +{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "../code/custom/4coder_default_framework.cpp", 43, 300 }, +{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "../code/custom/4coder_base_commands.cpp", 39, 383 }, +{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "../code/custom/4coder_base_commands.cpp", 39, 375 }, +{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "../code/custom/4coder_clipboard.cpp", 35, 127 }, +{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "../code/custom/4coder_clipboard.cpp", 35, 202 }, +{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "../code/custom/4coder_clipboard.cpp", 35, 161 }, +{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "../code/custom/4coder_clipboard.cpp", 35, 209 }, +{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "../code/custom/4coder_scope_commands.cpp", 40, 106 }, +{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "../code/custom/4coder_profile.cpp", 33, 226 }, +{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "../code/custom/4coder_profile.cpp", 33, 219 }, +{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "../code/custom/4coder_profile.cpp", 33, 212 }, +{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "../code/custom/4coder_profile_inspect.cpp", 41, 886 }, +{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "../code/custom/4coder_project_commands.cpp", 42, 1290 }, +{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "../code/custom/4coder_project_commands.cpp", 42, 871 }, +{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "../code/custom/4coder_project_commands.cpp", 42, 897 }, +{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "../code/custom/4coder_base_commands.cpp", 39, 1245 }, +{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "../code/custom/4coder_base_commands.cpp", 39, 1266 }, +{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "../code/custom/4coder_base_commands.cpp", 39, 1282 }, +{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 1724 }, +{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "../code/custom/4coder_base_commands.cpp", 39, 1809 }, +{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "../code/custom/4coder_base_commands.cpp", 39, 1394 }, +{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1653 }, +{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "../code/custom/4coder_base_commands.cpp", 39, 1155 }, +{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "../code/custom/4coder_base_commands.cpp", 39, 1146 }, +{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "../code/custom/4coder_base_commands.cpp", 39, 1137 }, +{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "../code/custom/4coder_base_commands.cpp", 39, 1078 }, +{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "../code/custom/4coder_base_commands.cpp", 39, 1090 }, +{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1643 }, +{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "../code/custom/4coder_default_framework.cpp", 43, 382 }, +{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1361 }, +{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "../code/custom/4coder_base_commands.cpp", 39, 1072 }, +{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "../code/custom/4coder_base_commands.cpp", 39, 1084 }, +{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "../code/custom/4coder_helper.cpp", 32, 2189 }, +{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "../code/custom/4coder_helper.cpp", 32, 2177 }, +{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "../code/custom/4coder_helper.cpp", 32, 2195 }, +{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "../code/custom/4coder_helper.cpp", 32, 2183 }, +{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "../code/custom/4coder_base_commands.cpp", 39, 548 }, +{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "../code/custom/4coder_scope_commands.cpp", 40, 57 }, +{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "../code/custom/4coder_scope_commands.cpp", 40, 66 }, +{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "../code/custom/4coder_scope_commands.cpp", 40, 82 }, +{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "../code/custom/4coder_scope_commands.cpp", 40, 99 }, +{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "../code/custom/4coder_scope_commands.cpp", 40, 27 }, +{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "../code/custom/4coder_scope_commands.cpp", 40, 39 }, +{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "../code/custom/4coder_eol.cpp", 29, 125 }, +{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "../code/custom/4coder_eol.cpp", 29, 112 }, +{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "../code/custom/4coder_eol.cpp", 29, 86 }, +{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "../code/custom/4coder_eol.cpp", 29, 99 }, +{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "../code/custom/4coder_base_commands.cpp", 39, 718 }, +{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "../code/custom/4coder_base_commands.cpp", 39, 760 }, +{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "../code/custom/4coder_base_commands.cpp", 39, 126 }, +{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "../code/custom/4coder_default_framework.cpp", 43, 427 }, +{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "../code/custom/4coder_default_framework.cpp", 43, 421 }, +{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1238 }, +{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1250 }, +{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1244 }, +{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "../code/custom/4coder_project_commands.cpp", 42, 1231 }, +{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 689 }, +{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 675 }, +{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "../code/custom/4coder_log_parser.cpp", 36, 994 }, +{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "../code/custom/4coder_base_commands.cpp", 39, 190 }, +{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "../code/custom/4coder_base_commands.cpp", 39, 198 }, +{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "../code/custom/4coder_combined_write_commands.cpp", 49, 237 }, +{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "../code/custom/4coder_default_framework.cpp", 43, 403 }, +{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "../code/custom/4coder_base_commands.cpp", 39, 1611 }, +{ PROC_LINKS(test_double_backspace, 0), false, "test_double_backspace", 21, "Made for testing purposes (I should have deleted this if you are reading it let me know)", 88, "../code/custom/4coder_base_commands.cpp", 39, 115 }, +{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "../code/custom/4coder_lists.cpp", 31, 785 }, +{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 574 }, +{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 561 }, +{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "../code/custom/4coder_base_commands.cpp", 39, 703 }, +{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "../code/custom/4coder_base_commands.cpp", 39, 712 }, +{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "../code/custom/4coder_default_framework.cpp", 43, 451 }, +{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "../code/custom/4coder_default_framework.cpp", 43, 439 }, +{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "../code/custom/4coder_default_framework.cpp", 43, 433 }, +{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "../code/custom/4coder_base_commands.cpp", 39, 817 }, +{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "../code/custom/4coder_base_commands.cpp", 39, 823 }, +{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "../code/custom/4coder_default_framework.cpp", 43, 415 }, +{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "../code/custom/4coder_default_framework.cpp", 43, 445 }, +{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "../code/custom/4coder_base_commands.cpp", 39, 808 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "../code/custom/4coder_code_index.cpp", 36, 1176 }, +{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 20 }, +{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 34 }, +{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 137 }, +{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "../code/custom/4coder_base_commands.cpp", 39, 1711 }, +{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "../code/custom/4coder_base_commands.cpp", 39, 1738 }, +{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "../code/custom/4coder_base_commands.cpp", 39, 1599 }, +{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "../code/custom/4coder_jump_lister.cpp", 37, 59 }, +{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "../code/custom/4coder_search.cpp", 32, 395 }, +{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "../code/custom/4coder_search.cpp", 32, 642 }, +{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "../code/custom/4coder_combined_write_commands.cpp", 49, 94 }, +{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 82 }, +{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 88 }, +{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "../code/custom/4coder_base_commands.cpp", 39, 67 }, +{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "../code/custom/4coder_auto_indent.cpp", 37, 433 }, +{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "../code/custom/4coder_base_commands.cpp", 39, 59 }, +{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 76 }, +{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "../code/custom/4coder_base_commands.cpp", 39, 73 }, +{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "../code/custom/4coder_combined_write_commands.cpp", 49, 100 }, }; static i32 fcoder_metacmd_ID_allow_mouse = 0; static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 1; From 6d24fa6f29aa51b914fff721b5292fb8770a5ebc Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 29 Feb 2020 13:35:52 -0800 Subject: [PATCH 26/40] Use mac smooth scroll values --- custom/generated/command_metadata.h | 545 ++++++++++++++-------------- platform_mac/mac_4ed.mm | 16 +- 2 files changed, 275 insertions(+), 286 deletions(-) diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index c43f5fef..7dbea956 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -2,7 +2,7 @@ #define command_id(c) (fcoder_metacmd_ID_##c) #define command_metadata(c) (&fcoder_metacmd_table[command_id(c)]) #define command_metadata_by_id(id) (&fcoder_metacmd_table[id]) -#define command_one_past_last_id 238 +#define command_one_past_last_id 237 #if defined(CUSTOM_COMMAND_SIG) #define PROC_LINKS(x,y) x #else @@ -214,7 +214,6 @@ CUSTOM_COMMAND_SIG(snipe_forward_whitespace_or_token_boundary); CUSTOM_COMMAND_SIG(snippet_lister); CUSTOM_COMMAND_SIG(suppress_mouse); CUSTOM_COMMAND_SIG(swap_panels); -CUSTOM_COMMAND_SIG(test_double_backspace); CUSTOM_COMMAND_SIG(theme_lister); CUSTOM_COMMAND_SIG(to_lowercase); CUSTOM_COMMAND_SIG(to_uppercase); @@ -259,245 +258,244 @@ char *source_name; i32 source_name_len; i32 line_number; }; -static Command_Metadata fcoder_metacmd_table[238] = { -{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "../code/custom/4coder_default_framework.cpp", 43, 409 }, -{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "../code/custom/4coder_auto_indent.cpp", 37, 413 }, -{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "../code/custom/4coder_auto_indent.cpp", 37, 423 }, -{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "../code/custom/4coder_auto_indent.cpp", 37, 404 }, -{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "../code/custom/4coder_base_commands.cpp", 39, 165 }, -{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "../code/custom/4coder_base_commands.cpp", 39, 96 }, -{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "../code/custom/4coder_base_commands.cpp", 39, 658 }, -{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "../code/custom/4coder_clipboard.cpp", 35, 68 }, -{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "../code/custom/4coder_build_commands.cpp", 40, 159 }, -{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "../code/custom/4coder_build_commands.cpp", 40, 122 }, -{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "../code/custom/4coder_base_commands.cpp", 39, 208 }, -{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "../code/custom/4coder_default_framework.cpp", 43, 284 }, -{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "../code/custom/4coder_default_framework.cpp", 43, 290 }, -{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "../code/custom/4coder_build_commands.cpp", 40, 180 }, -{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 647 }, -{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "../code/custom/4coder_default_framework.cpp", 43, 480 }, -{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "../code/custom/4coder_clipboard.cpp", 35, 216 }, -{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "../code/custom/4coder_base_commands.cpp", 39, 244 }, -{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "../code/custom/4coder_base_commands.cpp", 39, 234 }, -{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "../code/custom/4coder_base_commands.cpp", 39, 254 }, -{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "../code/custom/4coder_base_commands.cpp", 39, 266 }, -{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "../code/custom/4coder_clipboard.cpp", 35, 7 }, -{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "../code/custom/4coder_project_commands.cpp", 42, 843 }, -{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "../code/custom/4coder_build_commands.cpp", 40, 174 }, -{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "../code/custom/4coder_base_commands.cpp", 39, 666 }, -{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "../code/custom/4coder_docs.cpp", 30, 190 }, -{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "../code/custom/4coder_lists.cpp", 31, 761 }, -{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "../code/custom/4coder_combined_write_commands.cpp", 49, 125 }, -{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "../code/custom/4coder_combined_write_commands.cpp", 49, 149 }, -{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "../code/custom/4coder_clipboard.cpp", 35, 107 }, -{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "../code/custom/4coder_base_commands.cpp", 39, 135 }, -{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "../code/custom/4coder_docs.cpp", 30, 175 }, -{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "../code/custom/4coder_clipboard.cpp", 35, 116 }, -{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 749 }, -{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "../code/custom/4coder_base_commands.cpp", 39, 1891 }, -{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "../code/custom/4coder_default_hooks.cpp", 39, 7 }, -{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "../code/custom/4coder_default_hooks.cpp", 39, 23 }, -{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "../code/custom/4coder_default_hooks.cpp", 39, 51 }, -{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "../code/custom/4coder_base_commands.cpp", 39, 173 }, -{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "../code/custom/4coder_base_commands.cpp", 39, 79 }, -{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "../code/custom/4coder_scope_commands.cpp", 40, 112 }, -{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "../code/custom/4coder_base_commands.cpp", 39, 1317 }, -{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "../code/custom/4coder_base_commands.cpp", 39, 1489 }, -{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "../code/custom/4coder_base_commands.cpp", 39, 145 }, -{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "../code/custom/4coder_base_commands.cpp", 39, 1475 }, -{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "../code/custom/4coder_cli_command.cpp", 37, 22 }, -{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "../code/custom/4coder_cli_command.cpp", 37, 7 }, -{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "../code/custom/4coder_base_commands.cpp", 39, 836 }, -{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "../code/custom/4coder_helper.cpp", 32, 2201 }, -{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "../code/custom/4coder_helper.cpp", 32, 2209 }, -{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "../code/custom/4coder_jump_sticky.cpp", 37, 525 }, -{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "../code/custom/4coder_jump_sticky.cpp", 37, 542 }, -{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "../code/custom/4coder_jump_sticky.cpp", 37, 348 }, -{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "../code/custom/4coder_jump_sticky.cpp", 37, 375 }, -{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "../code/custom/4coder_base_commands.cpp", 39, 844 }, -{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "../code/custom/4coder_jump_sticky.cpp", 37, 464 }, -{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "../code/custom/4coder_jump_sticky.cpp", 37, 494 }, -{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "../code/custom/4coder_jump_sticky.cpp", 37, 481 }, -{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "../code/custom/4coder_jump_sticky.cpp", 37, 511 }, -{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 696 }, -{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 682 }, -{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "../code/custom/4coder_tutorial.cpp", 34, 869 }, -{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 70 }, -{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "../code/custom/4coder_jump_sticky.cpp", 37, 564 }, -{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "../code/custom/4coder_jump_sticky.cpp", 37, 581 }, -{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 738 }, -{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "../code/custom/4coder_lists.cpp", 31, 520 }, -{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "../code/custom/4coder_lists.cpp", 31, 661 }, -{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "../code/custom/4coder_lists.cpp", 31, 715 }, -{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "../code/custom/4coder_lists.cpp", 31, 612 }, -{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "../code/custom/4coder_lists.cpp", 31, 510 }, -{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "../code/custom/4coder_code_index_listers.cpp", 44, 12 }, -{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "../code/custom/4coder_keyboard_macro.cpp", 40, 54 }, -{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "../code/custom/4coder_keyboard_macro.cpp", 40, 77 }, -{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "../code/custom/4coder_keyboard_macro.cpp", 40, 41 }, -{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1635 }, -{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "../code/custom/4coder_tutorial.cpp", 34, 9 }, -{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "../code/custom/4coder_base_commands.cpp", 39, 222 }, -{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "../code/custom/4coder_function_list.cpp", 39, 295 }, -{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "../code/custom/4coder_function_list.cpp", 39, 301 }, -{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "../code/custom/4coder_function_list.cpp", 39, 267 }, -{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "../code/custom/4coder_function_list.cpp", 39, 277 }, -{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "../code/custom/4coder_search.cpp", 32, 165 }, -{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "../code/custom/4coder_search.cpp", 32, 177 }, -{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 189 }, -{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 195 }, -{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 201 }, -{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 207 }, -{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "../code/custom/4coder_search.cpp", 32, 213 }, -{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "../code/custom/4coder_search.cpp", 32, 221 }, -{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "../code/custom/4coder_search.cpp", 32, 171 }, -{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "../code/custom/4coder_search.cpp", 32, 183 }, -{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "../code/custom/4coder_project_commands.cpp", 42, 863 }, -{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "../code/custom/4coder_config.cpp", 32, 1627 }, -{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "../code/custom/4coder_default_framework.cpp", 43, 457 }, -{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "../code/custom/4coder_default_framework.cpp", 43, 469 }, -{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "../code/custom/4coder_base_commands.cpp", 39, 1429 }, -{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 44 }, -{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 237 }, -{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 249 }, -{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 29 }, -{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 231 }, -{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 243 }, -{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "../code/custom/4coder_base_commands.cpp", 39, 791 }, -{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "../code/custom/4coder_base_commands.cpp", 39, 276 }, -{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "../code/custom/4coder_base_commands.cpp", 39, 347 }, -{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "../code/custom/4coder_base_commands.cpp", 39, 359 }, -{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "../code/custom/4coder_base_commands.cpp", 39, 365 }, -{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "../code/custom/4coder_base_commands.cpp", 39, 418 }, -{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 442 }, -{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 430 }, -{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "../code/custom/4coder_base_commands.cpp", 39, 448 }, -{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "../code/custom/4coder_base_commands.cpp", 39, 525 }, -{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "../code/custom/4coder_base_commands.cpp", 39, 539 }, -{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "../code/custom/4coder_base_commands.cpp", 39, 497 }, -{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "../code/custom/4coder_base_commands.cpp", 39, 482 }, -{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "../code/custom/4coder_base_commands.cpp", 39, 511 }, -{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "../code/custom/4coder_base_commands.cpp", 39, 1469 }, -{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "../code/custom/4coder_base_commands.cpp", 39, 1463 }, -{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "../code/custom/4coder_base_commands.cpp", 39, 456 }, -{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "../code/custom/4coder_base_commands.cpp", 39, 518 }, -{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "../code/custom/4coder_base_commands.cpp", 39, 532 }, -{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "../code/custom/4coder_base_commands.cpp", 39, 490 }, -{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "../code/custom/4coder_base_commands.cpp", 39, 474 }, -{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "../code/custom/4coder_base_commands.cpp", 39, 504 }, -{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "../code/custom/4coder_base_commands.cpp", 39, 341 }, -{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "../code/custom/4coder_base_commands.cpp", 39, 353 }, -{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "../code/custom/4coder_base_commands.cpp", 39, 412 }, -{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 436 }, -{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 424 }, -{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "../code/custom/4coder_clipboard.cpp", 35, 364 }, -{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "../code/custom/4coder_clipboard.cpp", 35, 373 }, -{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "../code/custom/4coder_project_commands.cpp", 42, 849 }, -{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "../code/custom/4coder_project_commands.cpp", 42, 855 }, -{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "../code/custom/4coder_base_commands.cpp", 39, 1554 }, -{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1885 }, -{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "../code/custom/4coder_combined_write_commands.cpp", 49, 46 }, -{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "../code/custom/4coder_combined_write_commands.cpp", 49, 62 }, -{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "../code/custom/4coder_combined_write_commands.cpp", 49, 54 }, -{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1586 }, -{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "../code/custom/4coder_default_framework.cpp", 43, 310 }, -{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "../code/custom/4coder_default_framework.cpp", 43, 300 }, -{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "../code/custom/4coder_base_commands.cpp", 39, 383 }, -{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "../code/custom/4coder_base_commands.cpp", 39, 375 }, -{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "../code/custom/4coder_clipboard.cpp", 35, 127 }, -{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "../code/custom/4coder_clipboard.cpp", 35, 202 }, -{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "../code/custom/4coder_clipboard.cpp", 35, 161 }, -{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "../code/custom/4coder_clipboard.cpp", 35, 209 }, -{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "../code/custom/4coder_scope_commands.cpp", 40, 106 }, -{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "../code/custom/4coder_profile.cpp", 33, 226 }, -{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "../code/custom/4coder_profile.cpp", 33, 219 }, -{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "../code/custom/4coder_profile.cpp", 33, 212 }, -{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "../code/custom/4coder_profile_inspect.cpp", 41, 886 }, -{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "../code/custom/4coder_project_commands.cpp", 42, 1290 }, -{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "../code/custom/4coder_project_commands.cpp", 42, 871 }, -{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "../code/custom/4coder_project_commands.cpp", 42, 897 }, -{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "../code/custom/4coder_base_commands.cpp", 39, 1245 }, -{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "../code/custom/4coder_base_commands.cpp", 39, 1266 }, -{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "../code/custom/4coder_base_commands.cpp", 39, 1282 }, -{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 1724 }, -{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "../code/custom/4coder_base_commands.cpp", 39, 1809 }, -{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "../code/custom/4coder_base_commands.cpp", 39, 1394 }, -{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1653 }, -{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "../code/custom/4coder_base_commands.cpp", 39, 1155 }, -{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "../code/custom/4coder_base_commands.cpp", 39, 1146 }, -{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "../code/custom/4coder_base_commands.cpp", 39, 1137 }, -{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "../code/custom/4coder_base_commands.cpp", 39, 1078 }, -{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "../code/custom/4coder_base_commands.cpp", 39, 1090 }, -{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1643 }, -{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "../code/custom/4coder_default_framework.cpp", 43, 382 }, -{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1361 }, -{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "../code/custom/4coder_base_commands.cpp", 39, 1072 }, -{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "../code/custom/4coder_base_commands.cpp", 39, 1084 }, -{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "../code/custom/4coder_helper.cpp", 32, 2189 }, -{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "../code/custom/4coder_helper.cpp", 32, 2177 }, -{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "../code/custom/4coder_helper.cpp", 32, 2195 }, -{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "../code/custom/4coder_helper.cpp", 32, 2183 }, -{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "../code/custom/4coder_base_commands.cpp", 39, 548 }, -{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "../code/custom/4coder_scope_commands.cpp", 40, 57 }, -{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "../code/custom/4coder_scope_commands.cpp", 40, 66 }, -{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "../code/custom/4coder_scope_commands.cpp", 40, 82 }, -{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "../code/custom/4coder_scope_commands.cpp", 40, 99 }, -{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "../code/custom/4coder_scope_commands.cpp", 40, 27 }, -{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "../code/custom/4coder_scope_commands.cpp", 40, 39 }, -{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "../code/custom/4coder_eol.cpp", 29, 125 }, -{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "../code/custom/4coder_eol.cpp", 29, 112 }, -{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "../code/custom/4coder_eol.cpp", 29, 86 }, -{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "../code/custom/4coder_eol.cpp", 29, 99 }, -{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "../code/custom/4coder_base_commands.cpp", 39, 718 }, -{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "../code/custom/4coder_base_commands.cpp", 39, 760 }, -{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "../code/custom/4coder_base_commands.cpp", 39, 126 }, -{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "../code/custom/4coder_default_framework.cpp", 43, 427 }, -{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "../code/custom/4coder_default_framework.cpp", 43, 421 }, -{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1238 }, -{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1250 }, -{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1244 }, -{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "../code/custom/4coder_project_commands.cpp", 42, 1231 }, -{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 689 }, -{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 675 }, -{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "../code/custom/4coder_log_parser.cpp", 36, 994 }, -{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "../code/custom/4coder_base_commands.cpp", 39, 190 }, -{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "../code/custom/4coder_base_commands.cpp", 39, 198 }, -{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "../code/custom/4coder_combined_write_commands.cpp", 49, 237 }, -{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "../code/custom/4coder_default_framework.cpp", 43, 403 }, -{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "../code/custom/4coder_base_commands.cpp", 39, 1611 }, -{ PROC_LINKS(test_double_backspace, 0), false, "test_double_backspace", 21, "Made for testing purposes (I should have deleted this if you are reading it let me know)", 88, "../code/custom/4coder_base_commands.cpp", 39, 115 }, -{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "../code/custom/4coder_lists.cpp", 31, 785 }, -{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 574 }, -{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 561 }, -{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "../code/custom/4coder_base_commands.cpp", 39, 703 }, -{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "../code/custom/4coder_base_commands.cpp", 39, 712 }, -{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "../code/custom/4coder_default_framework.cpp", 43, 451 }, -{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "../code/custom/4coder_default_framework.cpp", 43, 439 }, -{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "../code/custom/4coder_default_framework.cpp", 43, 433 }, -{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "../code/custom/4coder_base_commands.cpp", 39, 817 }, -{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "../code/custom/4coder_base_commands.cpp", 39, 823 }, -{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "../code/custom/4coder_default_framework.cpp", 43, 415 }, -{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "../code/custom/4coder_default_framework.cpp", 43, 445 }, -{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "../code/custom/4coder_base_commands.cpp", 39, 808 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "../code/custom/4coder_code_index.cpp", 36, 1176 }, -{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 20 }, -{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 34 }, -{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 137 }, -{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "../code/custom/4coder_base_commands.cpp", 39, 1711 }, -{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "../code/custom/4coder_base_commands.cpp", 39, 1738 }, -{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "../code/custom/4coder_base_commands.cpp", 39, 1599 }, -{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "../code/custom/4coder_jump_lister.cpp", 37, 59 }, -{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "../code/custom/4coder_search.cpp", 32, 395 }, -{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "../code/custom/4coder_search.cpp", 32, 642 }, -{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "../code/custom/4coder_combined_write_commands.cpp", 49, 94 }, -{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 82 }, -{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 88 }, -{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "../code/custom/4coder_base_commands.cpp", 39, 67 }, -{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "../code/custom/4coder_auto_indent.cpp", 37, 433 }, -{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "../code/custom/4coder_base_commands.cpp", 39, 59 }, -{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 76 }, -{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "../code/custom/4coder_base_commands.cpp", 39, 73 }, -{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "../code/custom/4coder_combined_write_commands.cpp", 49, 100 }, +static Command_Metadata fcoder_metacmd_table[237] = { +{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 409 }, +{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 413 }, +{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 423 }, +{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 404 }, +{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 154 }, +{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 96 }, +{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 647 }, +{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 68 }, +{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 159 }, +{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 122 }, +{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 197 }, +{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 284 }, +{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 290 }, +{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 180 }, +{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 636 }, +{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 480 }, +{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 216 }, +{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 233 }, +{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 223 }, +{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 243 }, +{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 255 }, +{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 7 }, +{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 843 }, +{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 174 }, +{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 655 }, +{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "/Users/allenwebster/4ed/code/custom/4coder_docs.cpp", 51, 190 }, +{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 761 }, +{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 125 }, +{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 149 }, +{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 107 }, +{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 124 }, +{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "/Users/allenwebster/4ed/code/custom/4coder_docs.cpp", 51, 175 }, +{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 116 }, +{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 738 }, +{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1880 }, +{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "/Users/allenwebster/4ed/code/custom/4coder_default_hooks.cpp", 60, 7 }, +{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "/Users/allenwebster/4ed/code/custom/4coder_default_hooks.cpp", 60, 23 }, +{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "/Users/allenwebster/4ed/code/custom/4coder_default_hooks.cpp", 60, 51 }, +{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 162 }, +{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 79 }, +{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 112 }, +{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1306 }, +{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1478 }, +{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 134 }, +{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1464 }, +{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "/Users/allenwebster/4ed/code/custom/4coder_cli_command.cpp", 58, 22 }, +{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "/Users/allenwebster/4ed/code/custom/4coder_cli_command.cpp", 58, 7 }, +{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 825 }, +{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2201 }, +{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2209 }, +{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 525 }, +{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 542 }, +{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 348 }, +{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 375 }, +{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 833 }, +{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 464 }, +{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 494 }, +{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 481 }, +{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 511 }, +{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 685 }, +{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 671 }, +{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 869 }, +{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 70 }, +{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 564 }, +{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 581 }, +{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 727 }, +{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 520 }, +{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 661 }, +{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 715 }, +{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 612 }, +{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 510 }, +{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "/Users/allenwebster/4ed/code/custom/4coder_code_index_listers.cpp", 65, 12 }, +{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "/Users/allenwebster/4ed/code/custom/4coder_keyboard_macro.cpp", 61, 54 }, +{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "/Users/allenwebster/4ed/code/custom/4coder_keyboard_macro.cpp", 61, 77 }, +{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "/Users/allenwebster/4ed/code/custom/4coder_keyboard_macro.cpp", 61, 41 }, +{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1624 }, +{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 9 }, +{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 211 }, +{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 295 }, +{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 301 }, +{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 267 }, +{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 277 }, +{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 165 }, +{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 177 }, +{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 189 }, +{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 195 }, +{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 201 }, +{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 207 }, +{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 213 }, +{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 221 }, +{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 171 }, +{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 183 }, +{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 863 }, +{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "/Users/allenwebster/4ed/code/custom/4coder_config.cpp", 53, 1627 }, +{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 457 }, +{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 469 }, +{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1418 }, +{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 44 }, +{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 237 }, +{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 249 }, +{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 29 }, +{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 231 }, +{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 243 }, +{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 780 }, +{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 265 }, +{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 336 }, +{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 348 }, +{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 354 }, +{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 407 }, +{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 431 }, +{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 419 }, +{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 437 }, +{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 514 }, +{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 528 }, +{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 486 }, +{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 471 }, +{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 500 }, +{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1458 }, +{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1452 }, +{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 445 }, +{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 507 }, +{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 521 }, +{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 479 }, +{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 463 }, +{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 493 }, +{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 330 }, +{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 342 }, +{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 401 }, +{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 425 }, +{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 413 }, +{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 364 }, +{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 373 }, +{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 849 }, +{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 855 }, +{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1543 }, +{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1874 }, +{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 46 }, +{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 62 }, +{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 54 }, +{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1575 }, +{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 310 }, +{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 300 }, +{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 372 }, +{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 364 }, +{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 127 }, +{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 202 }, +{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 161 }, +{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 209 }, +{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 106 }, +{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "/Users/allenwebster/4ed/code/custom/4coder_profile.cpp", 54, 226 }, +{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "/Users/allenwebster/4ed/code/custom/4coder_profile.cpp", 54, 219 }, +{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "/Users/allenwebster/4ed/code/custom/4coder_profile.cpp", 54, 212 }, +{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "/Users/allenwebster/4ed/code/custom/4coder_profile_inspect.cpp", 62, 886 }, +{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1290 }, +{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 871 }, +{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 897 }, +{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1234 }, +{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1255 }, +{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1271 }, +{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1713 }, +{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1798 }, +{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1383 }, +{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1642 }, +{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1144 }, +{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1135 }, +{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1126 }, +{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1067 }, +{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1079 }, +{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1632 }, +{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 382 }, +{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1350 }, +{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1061 }, +{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1073 }, +{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2189 }, +{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2177 }, +{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2195 }, +{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2183 }, +{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 537 }, +{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 57 }, +{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 66 }, +{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 82 }, +{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 99 }, +{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 27 }, +{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 39 }, +{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 125 }, +{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 112 }, +{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 86 }, +{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 99 }, +{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 707 }, +{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 749 }, +{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 115 }, +{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 427 }, +{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 421 }, +{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1238 }, +{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1250 }, +{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1244 }, +{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1231 }, +{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 678 }, +{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 664 }, +{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "/Users/allenwebster/4ed/code/custom/4coder_log_parser.cpp", 57, 994 }, +{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 179 }, +{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 187 }, +{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 237 }, +{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 403 }, +{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1600 }, +{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 785 }, +{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 563 }, +{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 550 }, +{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 692 }, +{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 701 }, +{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 451 }, +{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 439 }, +{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 433 }, +{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 806 }, +{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 812 }, +{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 415 }, +{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 445 }, +{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 797 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "/Users/allenwebster/4ed/code/custom/4coder_code_index.cpp", 57, 1176 }, +{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 20 }, +{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 34 }, +{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 137 }, +{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1700 }, +{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1727 }, +{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1588 }, +{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "/Users/allenwebster/4ed/code/custom/4coder_jump_lister.cpp", 58, 59 }, +{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 395 }, +{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 642 }, +{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 94 }, +{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 82 }, +{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 88 }, +{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 67 }, +{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 433 }, +{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 59 }, +{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 76 }, +{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 73 }, +{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 100 }, }; static i32 fcoder_metacmd_ID_allow_mouse = 0; static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 1; @@ -704,37 +702,36 @@ static i32 fcoder_metacmd_ID_snipe_forward_whitespace_or_token_boundary = 201; static i32 fcoder_metacmd_ID_snippet_lister = 202; static i32 fcoder_metacmd_ID_suppress_mouse = 203; static i32 fcoder_metacmd_ID_swap_panels = 204; -static i32 fcoder_metacmd_ID_test_double_backspace = 205; -static i32 fcoder_metacmd_ID_theme_lister = 206; -static i32 fcoder_metacmd_ID_to_lowercase = 207; -static i32 fcoder_metacmd_ID_to_uppercase = 208; -static i32 fcoder_metacmd_ID_toggle_filebar = 209; -static i32 fcoder_metacmd_ID_toggle_fps_meter = 210; -static i32 fcoder_metacmd_ID_toggle_fullscreen = 211; -static i32 fcoder_metacmd_ID_toggle_highlight_enclosing_scopes = 212; -static i32 fcoder_metacmd_ID_toggle_highlight_line_at_cursor = 213; -static i32 fcoder_metacmd_ID_toggle_line_numbers = 214; -static i32 fcoder_metacmd_ID_toggle_line_wrap = 215; -static i32 fcoder_metacmd_ID_toggle_mouse = 216; -static i32 fcoder_metacmd_ID_toggle_paren_matching_helper = 217; -static i32 fcoder_metacmd_ID_toggle_show_whitespace = 218; -static i32 fcoder_metacmd_ID_toggle_virtual_whitespace = 219; -static i32 fcoder_metacmd_ID_tutorial_maximize = 220; -static i32 fcoder_metacmd_ID_tutorial_minimize = 221; -static i32 fcoder_metacmd_ID_uncomment_line = 222; -static i32 fcoder_metacmd_ID_undo = 223; -static i32 fcoder_metacmd_ID_undo_all_buffers = 224; -static i32 fcoder_metacmd_ID_view_buffer_other_panel = 225; -static i32 fcoder_metacmd_ID_view_jump_list_with_lister = 226; -static i32 fcoder_metacmd_ID_word_complete = 227; -static i32 fcoder_metacmd_ID_word_complete_drop_down = 228; -static i32 fcoder_metacmd_ID_write_block = 229; -static i32 fcoder_metacmd_ID_write_hack = 230; -static i32 fcoder_metacmd_ID_write_note = 231; -static i32 fcoder_metacmd_ID_write_space = 232; -static i32 fcoder_metacmd_ID_write_text_and_auto_indent = 233; -static i32 fcoder_metacmd_ID_write_text_input = 234; -static i32 fcoder_metacmd_ID_write_todo = 235; -static i32 fcoder_metacmd_ID_write_underscore = 236; -static i32 fcoder_metacmd_ID_write_zero_struct = 237; +static i32 fcoder_metacmd_ID_theme_lister = 205; +static i32 fcoder_metacmd_ID_to_lowercase = 206; +static i32 fcoder_metacmd_ID_to_uppercase = 207; +static i32 fcoder_metacmd_ID_toggle_filebar = 208; +static i32 fcoder_metacmd_ID_toggle_fps_meter = 209; +static i32 fcoder_metacmd_ID_toggle_fullscreen = 210; +static i32 fcoder_metacmd_ID_toggle_highlight_enclosing_scopes = 211; +static i32 fcoder_metacmd_ID_toggle_highlight_line_at_cursor = 212; +static i32 fcoder_metacmd_ID_toggle_line_numbers = 213; +static i32 fcoder_metacmd_ID_toggle_line_wrap = 214; +static i32 fcoder_metacmd_ID_toggle_mouse = 215; +static i32 fcoder_metacmd_ID_toggle_paren_matching_helper = 216; +static i32 fcoder_metacmd_ID_toggle_show_whitespace = 217; +static i32 fcoder_metacmd_ID_toggle_virtual_whitespace = 218; +static i32 fcoder_metacmd_ID_tutorial_maximize = 219; +static i32 fcoder_metacmd_ID_tutorial_minimize = 220; +static i32 fcoder_metacmd_ID_uncomment_line = 221; +static i32 fcoder_metacmd_ID_undo = 222; +static i32 fcoder_metacmd_ID_undo_all_buffers = 223; +static i32 fcoder_metacmd_ID_view_buffer_other_panel = 224; +static i32 fcoder_metacmd_ID_view_jump_list_with_lister = 225; +static i32 fcoder_metacmd_ID_word_complete = 226; +static i32 fcoder_metacmd_ID_word_complete_drop_down = 227; +static i32 fcoder_metacmd_ID_write_block = 228; +static i32 fcoder_metacmd_ID_write_hack = 229; +static i32 fcoder_metacmd_ID_write_note = 230; +static i32 fcoder_metacmd_ID_write_space = 231; +static i32 fcoder_metacmd_ID_write_text_and_auto_indent = 232; +static i32 fcoder_metacmd_ID_write_text_input = 233; +static i32 fcoder_metacmd_ID_write_todo = 234; +static i32 fcoder_metacmd_ID_write_underscore = 235; +static i32 fcoder_metacmd_ID_write_zero_struct = 236; #endif diff --git a/platform_mac/mac_4ed.mm b/platform_mac/mac_4ed.mm index f6ca20a3..97b45eff 100644 --- a/platform_mac/mac_4ed.mm +++ b/platform_mac/mac_4ed.mm @@ -94,8 +94,8 @@ struct Mac_Input_Chunk_Transient{ b8 mouse_r_press; b8 mouse_r_release; b8 out_of_window; - i8 mouse_wheel; b8 trying_to_kill; + i32 mouse_wheel; }; struct Mac_Input_Chunk_Persistent{ @@ -984,17 +984,9 @@ mac_toggle_fullscreen(void){ } - (void)scrollWheel:(NSEvent *)event{ - float dx = event.scrollingDeltaX; - float dy = event.scrollingDeltaY; - - i8 wheel_delta = 0; - if (dy > 0){ - wheel_delta = -100; - } else if (dy < 0){ - wheel_delta = 100; - } - mac_vars.input_chunk.trans.mouse_wheel = wheel_delta; - + f32 dx = event.scrollingDeltaX; + f32 dy = event.scrollingDeltaY; + mac_vars.input_chunk.trans.mouse_wheel = (i32)(-dy); system_signal_step(0); } From b0bbd3e2e35346ae940d1e1f8c1f3a2f40dcdd84 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 29 Feb 2020 15:38:38 -0800 Subject: [PATCH 27/40] Fix lister state overwriting problem with call-stack managed lister stack --- custom/4coder_code_index_listers.cpp | 4 +- custom/4coder_combined_write_commands.cpp | 4 +- custom/4coder_default_framework_variables.cpp | 1 + custom/4coder_docs.cpp | 6 +- custom/4coder_jump_lister.cpp | 4 +- custom/4coder_lister_base.cpp | 73 ++- custom/4coder_lister_base.h | 13 + custom/4coder_lists.cpp | 12 +- custom/4coder_project_commands.cpp | 4 +- custom/generated/command_metadata.h | 474 +++++++++--------- custom/generated/managed_id_metadata.cpp | 1 + 11 files changed, 327 insertions(+), 269 deletions(-) diff --git a/custom/4coder_code_index_listers.cpp b/custom/4coder_code_index_listers.cpp index fdc24c24..53f0ed29 100644 --- a/custom/4coder_code_index_listers.cpp +++ b/custom/4coder_code_index_listers.cpp @@ -15,9 +15,9 @@ CUSTOM_DOC("List all definitions in the code index and jump to one chosen by the char *query = "Definition:"; Scratch_Block scratch(app); - Lister *lister = begin_lister(app, scratch); + Lister_Block lister(app, scratch); lister_set_query(lister, query); - lister->handlers = lister_get_default_handlers(); + lister_set_default_handlers(lister); code_index_lock(); for (Buffer_ID buffer = get_buffer_next(app, 0, Access_Always); diff --git a/custom/4coder_combined_write_commands.cpp b/custom/4coder_combined_write_commands.cpp index a9a03747..9652d2c4 100644 --- a/custom/4coder_combined_write_commands.cpp +++ b/custom/4coder_combined_write_commands.cpp @@ -211,9 +211,9 @@ function Snippet* get_snippet_from_user(Application_Links *app, Snippet *snippets, i32 snippet_count, String_Const_u8 query){ Scratch_Block scratch(app, Scratch_Share); - Lister *lister = begin_lister(app, scratch); + Lister_Block lister(app, scratch); lister_set_query(lister, query); - lister->handlers = lister_get_default_handlers(); + lister_set_default_handlers(lister); Snippet *snippet = snippets; for (i32 i = 0; i < snippet_count; i += 1, snippet += 1){ diff --git a/custom/4coder_default_framework_variables.cpp b/custom/4coder_default_framework_variables.cpp index 3ba58805..c26dcbf7 100644 --- a/custom/4coder_default_framework_variables.cpp +++ b/custom/4coder_default_framework_variables.cpp @@ -15,6 +15,7 @@ CUSTOM_ID(attachment, view_highlight_range); CUSTOM_ID(attachment, view_highlight_buffer); CUSTOM_ID(attachment, view_render_hook); CUSTOM_ID(attachment, view_word_complete_menu); +CUSTOM_ID(attachment, view_lister_loc); CUSTOM_ID(attachment, buffer_map_id); CUSTOM_ID(attachment, buffer_eol_setting); diff --git a/custom/4coder_docs.cpp b/custom/4coder_docs.cpp index c3262b8e..1951bac1 100644 --- a/custom/4coder_docs.cpp +++ b/custom/4coder_docs.cpp @@ -7,9 +7,9 @@ function Doc_Page* get_doc_page_from_user(Application_Links *app, Doc_Cluster *doc, String_Const_u8 query){ Scratch_Block scratch(app, Scratch_Share); - Lister *lister = begin_lister(app, scratch); + Lister_Block lister(app, scratch); lister_set_query(lister, query); - lister->handlers = lister_get_default_handlers(); + lister_set_default_handlers(lister); for (Doc_Page *page = doc->first_page; page != 0; @@ -125,7 +125,7 @@ render_doc_page(Application_Links *app, Doc_Page *page){ } Buffer_Insertion insert = begin_buffer_insertion_at_buffered(app, buffer, 0, scratch, KB(16)); - char dashes[] = + char dashes[] = "----------------------------------------------------------------" "----------------------------------------------------------------" "----------------------------------------------------------------" diff --git a/custom/4coder_jump_lister.cpp b/custom/4coder_jump_lister.cpp index 5803d00c..06f72d11 100644 --- a/custom/4coder_jump_lister.cpp +++ b/custom/4coder_jump_lister.cpp @@ -10,9 +10,9 @@ get_jump_index_from_user(Application_Links *app, Marker_List *list, Jump_Lister_Result result = {}; if (list != 0){ Scratch_Block scratch(app); - Lister *lister = begin_lister(app, scratch); + Lister_Block lister(app, scratch); lister_set_query(lister, query); - lister->handlers = lister_get_default_handlers(); + lister_set_default_handlers(lister); Buffer_ID list_buffer = list->buffer_id; diff --git a/custom/4coder_lister_base.cpp b/custom/4coder_lister_base.cpp index 4d398875..f2344e2a 100644 --- a/custom/4coder_lister_base.cpp +++ b/custom/4coder_lister_base.cpp @@ -38,11 +38,27 @@ lister_get_top_level_layout(Rect_f32 rect, f32 text_field_height){ //////////////////////////////// -Lister *global_lister_state[16] = {}; +function Lister* +view_get_lister(Application_Links *app, View_ID view){ + Managed_Scope scope = view_get_managed_scope(app, view); + Lister **ptr = scope_attachment(app, scope, view_lister_loc, Lister*); + Lister *result = 0; + if (ptr != 0){ + result = *ptr; + } + return(result); +} function Lister* -view_get_lister(View_ID view){ - return(global_lister_state[view - 1]); +view_set_lister(Application_Links *app, View_ID view, Lister *lister){ + Managed_Scope scope = view_get_managed_scope(app, view); + Lister **ptr = scope_attachment(app, scope, view_lister_loc, Lister*); + Lister *result = 0; + if (ptr != 0){ + result = *ptr; + *ptr = lister; + } + return(result); } function void @@ -57,19 +73,36 @@ lister_set_map(Lister *lister, Mapping *mapping, Command_Map_ID map){ lister->map = mapping_get_map(mapping, map); } -function Lister* +function Lister_Prev_Current begin_lister(Application_Links *app, Arena *arena){ + Lister_Prev_Current result = {}; Lister *lister = push_array_zero(arena, Lister, 1); lister->arena = arena; lister->query = Su8(lister->query_space, 0, sizeof(lister->query_space)); lister->text_field = Su8(lister->text_field_space, 0, sizeof(lister->text_field_space)); lister->key_string = Su8(lister->key_string_space, 0, sizeof(lister->key_string_space)); View_ID view = get_this_ctx_view(app, Access_Always); - global_lister_state[view - 1] = lister; + result.prev = view_set_lister(app, view, lister); + result.current = lister; lister->restore_all_point = begin_temp(lister->arena); View_Context ctx = view_current_context(app, view); lister_set_map(lister, ctx.mapping, ctx.map_id); - return(lister); + return(result); +} + +Lister_Block::Lister_Block(Application_Links *a, Arena *arena){ + Lister_Prev_Current new_lister = begin_lister(a, arena); + this->app = a; + this->lister = new_lister; +} + +Lister_Block::~Lister_Block(){ + View_ID view = get_this_ctx_view(app, Access_Always); + view_set_lister(this->app, view, this->lister.prev); +} + +Lister_Block::operator Lister *(){ + return(this->lister.current); } function void @@ -132,6 +165,11 @@ lister_append_key(Lister *lister, char *string){ lister_append_string(SCu8(string), &lister->key_string); } +function void +lister_set_handlers(Lister *lister, Lister_Handlers *handlers){ + block_copy_struct(&lister->handlers, handlers); +} + function void lister_zero_scroll(Lister *lister){ block_zero_struct(&lister->scroll); @@ -141,7 +179,7 @@ function void lister_render(Application_Links *app, Frame_Info frame_info, View_ID view){ Scratch_Block scratch(app); - Lister *lister = view_get_lister(view); + Lister *lister = view_get_lister(app, view); if (lister == 0){ return; } @@ -721,7 +759,7 @@ function Lister_Activation_Code lister__write_string__default(Application_Links *app){ Lister_Activation_Code result = ListerActivation_Continue; View_ID view = get_active_view(app, Access_Always); - Lister *lister = view_get_lister(view); + Lister *lister = view_get_lister(app, view); if (lister != 0){ User_Input in = get_current_input(app); String_Const_u8 string = to_writable(&in); @@ -739,7 +777,7 @@ lister__write_string__default(Application_Links *app){ function void lister__backspace_text_field__default(Application_Links *app){ View_ID view = get_active_view(app, Access_Always); - Lister *lister = view_get_lister(view); + Lister *lister = view_get_lister(app, view); if (lister != 0){ lister->text_field.string = backspace_utf8(lister->text_field.string); lister->key_string.string = backspace_utf8(lister->key_string.string); @@ -775,15 +813,21 @@ lister_get_default_handlers(void){ return(handlers); } +function void +lister_set_default_handlers(Lister *lister){ + Lister_Handlers handlers = lister_get_default_handlers(); + lister_set_handlers(lister, &handlers); +} + //////////////////////////////// function Lister_Result run_lister_with_refresh_handler(Application_Links *app, Arena *arena, String_Const_u8 query, Lister_Handlers handlers){ Lister_Result result = {}; if (handlers.refresh != 0){ - Lister *lister = begin_lister(app, arena); + Lister_Block lister(app, arena); lister_set_query(lister, query); - lister->handlers = handlers; + lister_set_handlers(lister, &handlers); handlers.refresh(app, lister); result = run_lister(app, lister); } @@ -865,7 +909,7 @@ function Lister_Activation_Code lister__key_stroke__choice_list(Application_Links *app){ Lister_Activation_Code result = ListerActivation_Continue; View_ID view = get_active_view(app, Access_Always); - Lister *lister = view_get_lister(view); + Lister *lister = view_get_lister(app, view); if (lister != 0){ User_Input in = get_current_input(app); if (in.event.kind == InputEventKind_KeyStroke){ @@ -894,7 +938,7 @@ function Lister_Choice* get_choice_from_user(Application_Links *app, String_Const_u8 query, Lister_Choice_List list){ Scratch_Block scratch(app); - Lister *lister = begin_lister(app, scratch); + Lister_Block lister(app, scratch); for (Lister_Choice *choice = list.first; choice != 0; choice = choice->next){ @@ -907,8 +951,7 @@ get_choice_from_user(Application_Links *app, String_Const_u8 query, Lister_Handlers handlers = {}; handlers.navigate = lister__navigate__default; handlers.key_stroke = lister__key_stroke__choice_list; - lister->handlers = handlers; - lister->handlers.refresh = 0; + lister_set_handlers(lister, &handlers); Lister_Result l_result = run_lister(app, lister); Lister_Choice *result = 0; diff --git a/custom/4coder_lister_base.h b/custom/4coder_lister_base.h index aa6fae80..52300483 100644 --- a/custom/4coder_lister_base.h +++ b/custom/4coder_lister_base.h @@ -92,6 +92,19 @@ struct Lister{ Lister_Result out; }; +struct Lister_Prev_Current{ + Lister *prev; + Lister *current; +}; + +struct Lister_Block{ + Application_Links *app; + Lister_Prev_Current lister; + Lister_Block(Application_Links *app, Arena *arena); + ~Lister_Block(); + operator Lister *(); +}; + struct Lister_Prealloced_String{ String_Const_u8 string; }; diff --git a/custom/4coder_lists.cpp b/custom/4coder_lists.cpp index 26595d4b..c88e2451 100644 --- a/custom/4coder_lists.cpp +++ b/custom/4coder_lists.cpp @@ -132,9 +132,9 @@ get_command_from_user(Application_Links *app, String_Const_u8 query, i32 *comman } Scratch_Block scratch(app, Scratch_Share); - Lister *lister = begin_lister(app, scratch); + Lister_Block lister(app, scratch); lister_set_query(lister, query); - lister->handlers = lister_get_default_handlers(); + lister_set_default_handlers(lister); for (i32 i = 0; i < command_id_count; i += 1){ i32 j = i; @@ -206,9 +206,9 @@ get_color_table_from_user(Application_Links *app, String_Const_u8 query, Color_T } Scratch_Block scratch(app, Scratch_Share); - Lister *lister = begin_lister(app, scratch); + Lister_Block lister(app, scratch); lister_set_query(lister, query); - lister->handlers = lister_get_default_handlers(); + lister_set_default_handlers(lister); lister_add_item(lister, string_u8_litexpr("4coder"), string_u8_litexpr(""), (void*)&default_color_table, 0); @@ -240,7 +240,7 @@ function Lister_Activation_Code lister__write_character__file_path(Application_Links *app){ Lister_Activation_Code result = ListerActivation_Continue; View_ID view = get_this_ctx_view(app, Access_Always); - Lister *lister = view_get_lister(view); + Lister *lister = view_get_lister(app, view); if (lister != 0){ User_Input in = get_current_input(app); String_Const_u8 string = to_writable(&in); @@ -265,7 +265,7 @@ lister__write_character__file_path(Application_Links *app){ function void lister__backspace_text_field__file_path(Application_Links *app){ View_ID view = get_this_ctx_view(app, Access_Always); - Lister *lister = view_get_lister(view); + Lister *lister = view_get_lister(app, view); if (lister != 0){ if (lister->text_field.size > 0){ char last_char = lister->text_field.str[lister->text_field.size - 1]; diff --git a/custom/4coder_project_commands.cpp b/custom/4coder_project_commands.cpp index bb1f5460..3a54cbe0 100644 --- a/custom/4coder_project_commands.cpp +++ b/custom/4coder_project_commands.cpp @@ -1261,9 +1261,9 @@ get_project_command_from_user(Application_Links *app, Project *project, Project_Command_Lister_Result result = {}; if (project != 0){ Scratch_Block scratch(app); - Lister *lister = begin_lister(app, scratch); + Lister_Block lister(app, scratch); lister_set_query(lister, query); - lister->handlers = lister_get_default_handlers(); + lister_set_default_handlers(lister); Project_Command *proj_cmd = project->command_array.commands; i32 count = project->command_array.count; diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index 7dbea956..b3e93833 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -259,243 +259,243 @@ i32 source_name_len; i32 line_number; }; static Command_Metadata fcoder_metacmd_table[237] = { -{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 409 }, -{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 413 }, -{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 423 }, -{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 404 }, -{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 154 }, -{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 96 }, -{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 647 }, -{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 68 }, -{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 159 }, -{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 122 }, -{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 197 }, -{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 284 }, -{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 290 }, -{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 180 }, -{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 636 }, -{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 480 }, -{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 216 }, -{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 233 }, -{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 223 }, -{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 243 }, -{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 255 }, -{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 7 }, -{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 843 }, -{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "/Users/allenwebster/4ed/code/custom/4coder_build_commands.cpp", 61, 174 }, -{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 655 }, -{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "/Users/allenwebster/4ed/code/custom/4coder_docs.cpp", 51, 190 }, -{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 761 }, -{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 125 }, -{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 149 }, -{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 107 }, -{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 124 }, -{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "/Users/allenwebster/4ed/code/custom/4coder_docs.cpp", 51, 175 }, -{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 116 }, -{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 738 }, -{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1880 }, -{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "/Users/allenwebster/4ed/code/custom/4coder_default_hooks.cpp", 60, 7 }, -{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "/Users/allenwebster/4ed/code/custom/4coder_default_hooks.cpp", 60, 23 }, -{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "/Users/allenwebster/4ed/code/custom/4coder_default_hooks.cpp", 60, 51 }, -{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 162 }, -{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 79 }, -{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 112 }, -{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1306 }, -{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1478 }, -{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 134 }, -{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1464 }, -{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "/Users/allenwebster/4ed/code/custom/4coder_cli_command.cpp", 58, 22 }, -{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "/Users/allenwebster/4ed/code/custom/4coder_cli_command.cpp", 58, 7 }, -{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 825 }, -{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2201 }, -{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2209 }, -{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 525 }, -{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 542 }, -{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 348 }, -{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 375 }, -{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 833 }, -{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 464 }, -{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 494 }, -{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 481 }, -{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 511 }, -{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 685 }, -{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 671 }, -{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 869 }, -{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 70 }, -{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 564 }, -{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "/Users/allenwebster/4ed/code/custom/4coder_jump_sticky.cpp", 58, 581 }, -{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 727 }, -{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 520 }, -{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 661 }, -{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 715 }, -{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 612 }, -{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 510 }, -{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "/Users/allenwebster/4ed/code/custom/4coder_code_index_listers.cpp", 65, 12 }, -{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "/Users/allenwebster/4ed/code/custom/4coder_keyboard_macro.cpp", 61, 54 }, -{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "/Users/allenwebster/4ed/code/custom/4coder_keyboard_macro.cpp", 61, 77 }, -{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "/Users/allenwebster/4ed/code/custom/4coder_keyboard_macro.cpp", 61, 41 }, -{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1624 }, -{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 9 }, -{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 211 }, -{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 295 }, -{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 301 }, -{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 267 }, -{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "/Users/allenwebster/4ed/code/custom/4coder_function_list.cpp", 60, 277 }, -{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 165 }, -{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 177 }, -{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 189 }, -{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 195 }, -{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 201 }, -{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 207 }, -{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 213 }, -{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 221 }, -{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 171 }, -{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 183 }, -{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 863 }, -{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "/Users/allenwebster/4ed/code/custom/4coder_config.cpp", 53, 1627 }, -{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 457 }, -{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 469 }, -{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1418 }, -{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 44 }, -{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 237 }, -{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 249 }, -{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 29 }, -{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 231 }, -{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "/Users/allenwebster/4ed/code/custom/4coder_miblo_numbers.cpp", 60, 243 }, -{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 780 }, -{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 265 }, -{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 336 }, -{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 348 }, -{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 354 }, -{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 407 }, -{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 431 }, -{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 419 }, -{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 437 }, -{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 514 }, -{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 528 }, -{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 486 }, -{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 471 }, -{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 500 }, -{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1458 }, -{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1452 }, -{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 445 }, -{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 507 }, -{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 521 }, -{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 479 }, -{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 463 }, -{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 493 }, -{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 330 }, -{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 342 }, -{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 401 }, -{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 425 }, -{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 413 }, -{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 364 }, -{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 373 }, -{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 849 }, -{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 855 }, -{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1543 }, -{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1874 }, -{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 46 }, -{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 62 }, -{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 54 }, -{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1575 }, -{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 310 }, -{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 300 }, -{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 372 }, -{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 364 }, -{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 127 }, -{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 202 }, -{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 161 }, -{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "/Users/allenwebster/4ed/code/custom/4coder_clipboard.cpp", 56, 209 }, -{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 106 }, -{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "/Users/allenwebster/4ed/code/custom/4coder_profile.cpp", 54, 226 }, -{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "/Users/allenwebster/4ed/code/custom/4coder_profile.cpp", 54, 219 }, -{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "/Users/allenwebster/4ed/code/custom/4coder_profile.cpp", 54, 212 }, -{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "/Users/allenwebster/4ed/code/custom/4coder_profile_inspect.cpp", 62, 886 }, -{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1290 }, -{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 871 }, -{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 897 }, -{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1234 }, -{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1255 }, -{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1271 }, -{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1713 }, -{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1798 }, -{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1383 }, -{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1642 }, -{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1144 }, -{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1135 }, -{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1126 }, -{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1067 }, -{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1079 }, -{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1632 }, -{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 382 }, -{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1350 }, -{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1061 }, -{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1073 }, -{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2189 }, -{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2177 }, -{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2195 }, -{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "/Users/allenwebster/4ed/code/custom/4coder_helper.cpp", 53, 2183 }, -{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 537 }, -{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 57 }, -{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 66 }, -{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 82 }, -{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 99 }, -{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 27 }, -{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "/Users/allenwebster/4ed/code/custom/4coder_scope_commands.cpp", 61, 39 }, -{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 125 }, -{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 112 }, -{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 86 }, -{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "/Users/allenwebster/4ed/code/custom/4coder_eol.cpp", 50, 99 }, -{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 707 }, -{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 749 }, -{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 115 }, -{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 427 }, -{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 421 }, -{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1238 }, -{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1250 }, -{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1244 }, -{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "/Users/allenwebster/4ed/code/custom/4coder_project_commands.cpp", 63, 1231 }, -{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 678 }, -{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 664 }, -{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "/Users/allenwebster/4ed/code/custom/4coder_log_parser.cpp", 57, 994 }, -{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 179 }, -{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 187 }, -{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 237 }, -{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 403 }, -{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1600 }, -{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "/Users/allenwebster/4ed/code/custom/4coder_lists.cpp", 52, 785 }, -{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 563 }, -{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 550 }, -{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 692 }, -{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 701 }, -{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 451 }, -{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 439 }, -{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 433 }, -{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 806 }, -{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 812 }, -{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 415 }, -{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "/Users/allenwebster/4ed/code/custom/4coder_default_framework.cpp", 64, 445 }, -{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 797 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "/Users/allenwebster/4ed/code/custom/4coder_code_index.cpp", 57, 1176 }, -{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 20 }, -{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "/Users/allenwebster/4ed/code/custom/4coder_tutorial.cpp", 55, 34 }, -{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 137 }, -{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1700 }, -{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1727 }, -{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 1588 }, -{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "/Users/allenwebster/4ed/code/custom/4coder_jump_lister.cpp", 58, 59 }, -{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 395 }, -{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "/Users/allenwebster/4ed/code/custom/4coder_search.cpp", 53, 642 }, -{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 94 }, -{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 82 }, -{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 88 }, -{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 67 }, -{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "/Users/allenwebster/4ed/code/custom/4coder_auto_indent.cpp", 58, 433 }, -{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 59 }, -{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 76 }, -{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "/Users/allenwebster/4ed/code/custom/4coder_base_commands.cpp", 60, 73 }, -{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "/Users/allenwebster/4ed/code/custom/4coder_combined_write_commands.cpp", 70, 100 }, +{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 409 }, +{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 413 }, +{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 423 }, +{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 404 }, +{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 154 }, +{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 96 }, +{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 647 }, +{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 68 }, +{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 159 }, +{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 122 }, +{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 197 }, +{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 284 }, +{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 290 }, +{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 180 }, +{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 636 }, +{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 480 }, +{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 216 }, +{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 233 }, +{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 223 }, +{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 243 }, +{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 255 }, +{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 7 }, +{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 843 }, +{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 174 }, +{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 655 }, +{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "W:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 190 }, +{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 761 }, +{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 125 }, +{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 149 }, +{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 107 }, +{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 124 }, +{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "W:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 175 }, +{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 116 }, +{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 738 }, +{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1880 }, +{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 7 }, +{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 23 }, +{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 51 }, +{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 162 }, +{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 79 }, +{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 112 }, +{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1306 }, +{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1478 }, +{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 134 }, +{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1464 }, +{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "W:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 22 }, +{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "W:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 7 }, +{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 825 }, +{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2201 }, +{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2209 }, +{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 525 }, +{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 542 }, +{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 348 }, +{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 375 }, +{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 833 }, +{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 464 }, +{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 494 }, +{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 481 }, +{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 511 }, +{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 685 }, +{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 671 }, +{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 869 }, +{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 70 }, +{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 564 }, +{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 581 }, +{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 727 }, +{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 520 }, +{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 661 }, +{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 715 }, +{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 612 }, +{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 510 }, +{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "W:\\4ed\\code\\custom\\4coder_code_index_listers.cpp", 48, 12 }, +{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 54 }, +{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 77 }, +{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 41 }, +{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1624 }, +{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 9 }, +{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 211 }, +{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 295 }, +{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 301 }, +{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 267 }, +{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 277 }, +{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 165 }, +{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 177 }, +{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 189 }, +{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 195 }, +{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 201 }, +{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 207 }, +{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 213 }, +{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 221 }, +{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 171 }, +{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 183 }, +{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 863 }, +{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "W:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1627 }, +{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 457 }, +{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 469 }, +{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1418 }, +{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 44 }, +{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 237 }, +{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 249 }, +{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 29 }, +{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 231 }, +{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 243 }, +{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 780 }, +{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 265 }, +{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 336 }, +{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 348 }, +{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 354 }, +{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 407 }, +{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 431 }, +{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 419 }, +{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 437 }, +{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 514 }, +{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 528 }, +{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 486 }, +{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 471 }, +{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 500 }, +{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1458 }, +{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1452 }, +{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 445 }, +{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 507 }, +{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 521 }, +{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 479 }, +{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 463 }, +{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 493 }, +{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 330 }, +{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 342 }, +{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 401 }, +{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 425 }, +{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 413 }, +{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 364 }, +{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 373 }, +{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 849 }, +{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 855 }, +{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1543 }, +{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1874 }, +{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 46 }, +{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 62 }, +{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 54 }, +{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1575 }, +{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 310 }, +{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 300 }, +{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 372 }, +{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 364 }, +{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 127 }, +{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 202 }, +{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 161 }, +{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 209 }, +{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 106 }, +{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 226 }, +{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 219 }, +{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 212 }, +{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "W:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 886 }, +{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1290 }, +{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 871 }, +{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 897 }, +{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1234 }, +{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1255 }, +{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1271 }, +{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1713 }, +{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1798 }, +{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1383 }, +{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1642 }, +{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1144 }, +{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1135 }, +{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1126 }, +{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1067 }, +{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1079 }, +{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1632 }, +{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 382 }, +{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1350 }, +{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1061 }, +{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1073 }, +{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2189 }, +{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2177 }, +{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2195 }, +{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2183 }, +{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 537 }, +{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 57 }, +{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 66 }, +{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 82 }, +{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 99 }, +{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 27 }, +{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 39 }, +{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 125 }, +{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 112 }, +{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 86 }, +{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 99 }, +{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 707 }, +{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 749 }, +{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 115 }, +{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 427 }, +{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 421 }, +{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1238 }, +{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1250 }, +{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1244 }, +{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1231 }, +{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 678 }, +{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 664 }, +{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "W:\\4ed\\code\\custom\\4coder_log_parser.cpp", 40, 994 }, +{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 179 }, +{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 187 }, +{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 237 }, +{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 403 }, +{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1600 }, +{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 785 }, +{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 563 }, +{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 550 }, +{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 692 }, +{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 701 }, +{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 451 }, +{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 439 }, +{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 433 }, +{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 806 }, +{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 812 }, +{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 415 }, +{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 445 }, +{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 797 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "W:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1176 }, +{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 20 }, +{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 34 }, +{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 }, +{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1700 }, +{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1727 }, +{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1588 }, +{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "W:\\4ed\\code\\custom\\4coder_jump_lister.cpp", 41, 59 }, +{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 395 }, +{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 642 }, +{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 94 }, +{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 82 }, +{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 88 }, +{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 67 }, +{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 433 }, +{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 59 }, +{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 76 }, +{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 73 }, +{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 100 }, }; static i32 fcoder_metacmd_ID_allow_mouse = 0; static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 1; diff --git a/custom/generated/managed_id_metadata.cpp b/custom/generated/managed_id_metadata.cpp index c0df4ce7..aa675593 100644 --- a/custom/generated/managed_id_metadata.cpp +++ b/custom/generated/managed_id_metadata.cpp @@ -48,6 +48,7 @@ view_highlight_range = managed_id_declare(app, string_u8_litexpr("attachment"), view_highlight_buffer = managed_id_declare(app, string_u8_litexpr("attachment"), string_u8_litexpr("view_highlight_buffer")); view_render_hook = managed_id_declare(app, string_u8_litexpr("attachment"), string_u8_litexpr("view_render_hook")); view_word_complete_menu = managed_id_declare(app, string_u8_litexpr("attachment"), string_u8_litexpr("view_word_complete_menu")); +view_lister_loc = managed_id_declare(app, string_u8_litexpr("attachment"), string_u8_litexpr("view_lister_loc")); buffer_map_id = managed_id_declare(app, string_u8_litexpr("attachment"), string_u8_litexpr("buffer_map_id")); buffer_eol_setting = managed_id_declare(app, string_u8_litexpr("attachment"), string_u8_litexpr("buffer_eol_setting")); buffer_lex_task = managed_id_declare(app, string_u8_litexpr("attachment"), string_u8_litexpr("buffer_lex_task")); From e231293acfff41e91da2885c8ab49c304ae66367 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 29 Feb 2020 17:21:37 -0800 Subject: [PATCH 28/40] Checking global map in isearch and query_user_general so that basic global commands still work in that context --- custom/4coder_base_commands.cpp | 47 +- custom/4coder_events.h | 7 +- custom/4coder_helper.cpp | 3287 ++++++++++++++------------- custom/generated/command_metadata.h | 74 +- 4 files changed, 1719 insertions(+), 1696 deletions(-) diff --git a/custom/4coder_base_commands.cpp b/custom/4coder_base_commands.cpp index 57438b2e..445baf33 100644 --- a/custom/4coder_base_commands.cpp +++ b/custom/4coder_base_commands.cpp @@ -898,7 +898,8 @@ isearch(Application_Links *app, Scan_Direction start_scan, i64 first_pos, } isearch__update_highlight(app, view, Ii64_size(pos, match_size)); - in = get_next_input(app, EventPropertyGroup_AnyKeyboardEvent, + in = get_next_input(app, + EventPropertyGroup_Any, EventProperty_Escape|EventProperty_ViewActivation); if (in.abort){ break; @@ -942,9 +943,6 @@ isearch(Application_Links *app, Scan_Direction start_scan, i64 first_pos, } } - // TODO(allen): how to detect if the input corresponds to - // a search or rsearch command, a scroll wheel command? - b32 do_scan_action = false; b32 do_scroll_wheel = false; Scan_Direction change_scan = scan; @@ -954,17 +952,41 @@ isearch(Application_Links *app, Scan_Direction start_scan, i64 first_pos, change_scan = Scan_Forward; do_scan_action = true; } - if (match_key_code(&in, KeyCode_PageUp) || - match_key_code(&in, KeyCode_Up)){ + else if (match_key_code(&in, KeyCode_PageUp) || + match_key_code(&in, KeyCode_Up)){ change_scan = Scan_Backward; do_scan_action = true; } - -#if 0 - if (in.command == mouse_wheel_scroll){ - do_scroll_wheel = true; + else{ + // NOTE(allen): is the user trying to execute another command? + View_Context ctx = view_current_context(app, view); + Mapping *mapping = ctx.mapping; + Command_Map *map = mapping_get_map(mapping, ctx.map_id); + Command_Binding binding = map_get_binding_recursive(mapping, map, &in.event); + if (binding.custom != 0){ + if (binding.custom == search){ + change_scan = Scan_Forward; + do_scan_action = true; + } + else if (binding.custom == reverse_search){ + change_scan = Scan_Backward; + do_scan_action = true; + } + else{ + Command_Metadata *metadata = get_command_metadata(binding.custom); + if (metadata != 0){ + if (metadata->is_ui){ + view_enqueue_command_function(app, view, binding.custom); + break; + } + } + binding.custom(app); + } + } + else{ + leave_current_input_unhandled(app); + } } -#endif } if (string_change){ @@ -1017,9 +1039,6 @@ isearch(Application_Links *app, Scan_Direction start_scan, i64 first_pos, else if (do_scroll_wheel){ mouse_wheel_scroll(app); } - else{ - leave_current_input_unhandled(app); - } } view_disable_highlight_range(app, view); diff --git a/custom/4coder_events.h b/custom/4coder_events.h index 90086bd9..72562eac 100644 --- a/custom/4coder_events.h +++ b/custom/4coder_events.h @@ -132,14 +132,17 @@ enum{ EventPropertyGroup_AnyUserInput = EventPropertyGroup_AnyKeyboardEvent| EventPropertyGroup_AnyMouseEvent, - EventPropertyGroup_Any = - EventPropertyGroup_AnyUserInput| + EventPropertyGroup_AnyCore = EventProperty_Animate| EventProperty_ViewActivation| EventProperty_AnyFile| EventProperty_Startup| EventProperty_Exit| EventProperty_Clipboard| + EventProperty_Animate, + EventPropertyGroup_Any = + EventPropertyGroup_AnyUserInput| + EventPropertyGroup_AnyCore| EventProperty_CustomFunction, }; diff --git a/custom/4coder_helper.cpp b/custom/4coder_helper.cpp index 986397e2..e079780b 100644 --- a/custom/4coder_helper.cpp +++ b/custom/4coder_helper.cpp @@ -9,6 +9,30 @@ //////////////////////////////// +function i32 +get_command_id(Custom_Command_Function *func){ + i32 result = -1; + for (i32 i = 0; i < ArrayCount(fcoder_metacmd_table); i += 1){ + if (func == fcoder_metacmd_table[i].proc){ + result = i; + break; + } + } + return(result); +} + +function Command_Metadata* +get_command_metadata(Custom_Command_Function *func){ + Command_Metadata *result = 0; + i32 id = get_command_id(func); + if (id >= 0){ + result = &fcoder_metacmd_table[id]; + } + return(result); +} + +//////////////////////////////// + internal Token_Array get_token_array_from_buffer(Application_Links *app, Buffer_ID buffer){ Token_Array result = {}; @@ -612,318 +636,318 @@ boundary_token(Application_Links *app, Buffer_ID buffer, Side side, Scan_Directi }break; case Scan_Backward: - { - result = 0; + { + result = 0; if (tokens.count > 0){ - Token_Iterator_Array it = token_iterator_pos(0, &tokens, pos); - Token *token = token_it_read(&it); -if (token->kind == TokenBaseKind_Whitespace){ - token_it_dec_non_whitespace(&it); -token = token_it_read(&it); - } + Token_Iterator_Array it = token_iterator_pos(0, &tokens, pos); + Token *token = token_it_read(&it); + if (token->kind == TokenBaseKind_Whitespace){ + token_it_dec_non_whitespace(&it); + token = token_it_read(&it); + } if (token != 0){ - if (side == Side_Min){ - if (token->pos >= pos){ - token_it_dec_non_whitespace(&it); -token = token_it_read(&it); - } + if (side == Side_Min){ + if (token->pos >= pos){ + token_it_dec_non_whitespace(&it); + token = token_it_read(&it); + } result = token->pos; - } + } else{ - if (token->pos + token->size >= pos){ - token_it_dec_non_whitespace(&it); -token = token_it_read(&it); - } + if (token->pos + token->size >= pos){ + token_it_dec_non_whitespace(&it); + token = token_it_read(&it); + } result = token->pos + token->size; - } } } - }break; - } - } - return(result); + } + }break; + } + } + return(result); } - internal i64 +internal i64 boundary_line(Application_Links *app, Buffer_ID buffer, Side side, Scan_Direction direction, i64 pos){ - i64 line_number = get_line_number_from_pos(app, buffer, pos); - i64 new_pos = get_line_side_pos(app, buffer, line_number, side); - if (direction == Scan_Backward && new_pos >= pos){ - if (line_number > 1){ - new_pos = get_line_side_pos(app, buffer, line_number - 1, side); - } - else{ - new_pos = 0; - } - } - else if (direction == Scan_Forward && new_pos <= pos){ - new_pos = get_line_side_pos(app, buffer, line_number + 1, side); - if (new_pos <= pos){ - new_pos = (i32)buffer_get_size(app, buffer); - } + i64 line_number = get_line_number_from_pos(app, buffer, pos); + i64 new_pos = get_line_side_pos(app, buffer, line_number, side); + if (direction == Scan_Backward && new_pos >= pos){ + if (line_number > 1){ + new_pos = get_line_side_pos(app, buffer, line_number - 1, side); } + else{ + new_pos = 0; + } + } + else if (direction == Scan_Forward && new_pos <= pos){ + new_pos = get_line_side_pos(app, buffer, line_number + 1, side); + if (new_pos <= pos){ + new_pos = (i32)buffer_get_size(app, buffer); + } + } return(new_pos); } - - //////////////////////////////// + +//////////////////////////////// // TODO(allen): these need a little more rewrite internal void seek_string_forward(Application_Links *app, Buffer_ID buffer, i64 pos, i64 end, String_Const_u8 needle, i64 *result){ - if (end == 0){ - end = (i32)buffer_get_size(app, buffer); - } + if (end == 0){ + end = (i32)buffer_get_size(app, buffer); + } String_Match match = {}; -match.range.first = pos; - for (;;){ - match = buffer_seek_string(app, buffer, needle, Scan_Forward, (i32)match.range.first); - if (HasFlag(match.flags, StringMatch_CaseSensitive) || - match.buffer != buffer || match.range.first >= end) break; - } - if (match.range.first < end && match.buffer == buffer){ - *result = match.range.first; -} - else{ - *result = buffer_get_size(app, buffer); - } - } - - internal void -seek_string_backward(Application_Links *app, Buffer_ID buffer, i64 pos, i64 min, String_Const_u8 needle, i64 *result){ - String_Match match = {}; match.range.first = pos; - for (;;){ - match = buffer_seek_string(app, buffer, needle, Scan_Backward, match.range.first); - if (HasFlag(match.flags, StringMatch_CaseSensitive) || - match.buffer != buffer || match.range.first < min) break; - } - if (match.range.first >= min && match.buffer == buffer){ - *result = match.range.first; + for (;;){ + match = buffer_seek_string(app, buffer, needle, Scan_Forward, (i32)match.range.first); + if (HasFlag(match.flags, StringMatch_CaseSensitive) || + match.buffer != buffer || match.range.first >= end) break; + } + if (match.range.first < end && match.buffer == buffer){ + *result = match.range.first; + } + else{ + *result = buffer_get_size(app, buffer); + } } - else{ - *result = -1; - } - } - - internal void -seek_string_insensitive_forward(Application_Links *app, Buffer_ID buffer, i64 pos, i64 end, String_Const_u8 needle, i64 *result){ - if (end == 0){ - end = (i32)buffer_get_size(app, buffer); - } - String_Match match = buffer_seek_string(app, buffer, needle, Scan_Forward, pos); - if (match.range.first < end && match.buffer == buffer){ - *result = match.range.first; - } - else{ - *result = buffer_get_size(app, buffer); - } - } - internal void +internal void +seek_string_backward(Application_Links *app, Buffer_ID buffer, i64 pos, i64 min, String_Const_u8 needle, i64 *result){ + String_Match match = {}; + match.range.first = pos; + for (;;){ + match = buffer_seek_string(app, buffer, needle, Scan_Backward, match.range.first); + if (HasFlag(match.flags, StringMatch_CaseSensitive) || + match.buffer != buffer || match.range.first < min) break; + } + if (match.range.first >= min && match.buffer == buffer){ + *result = match.range.first; + } + else{ + *result = -1; + } +} + +internal void +seek_string_insensitive_forward(Application_Links *app, Buffer_ID buffer, i64 pos, i64 end, String_Const_u8 needle, i64 *result){ + if (end == 0){ + end = (i32)buffer_get_size(app, buffer); + } + String_Match match = buffer_seek_string(app, buffer, needle, Scan_Forward, pos); + if (match.range.first < end && match.buffer == buffer){ + *result = match.range.first; + } + else{ + *result = buffer_get_size(app, buffer); + } +} + +internal void seek_string_insensitive_backward(Application_Links *app, Buffer_ID buffer, i64 pos, i64 min, String_Const_u8 needle, i64 *result){ - String_Match match = buffer_seek_string(app, buffer, needle, Scan_Backward, pos); - if (match.range.first >= min && match.buffer == buffer){ - *result = match.range.first; - } - else{ - *result = -1; + String_Match match = buffer_seek_string(app, buffer, needle, Scan_Backward, pos); + if (match.range.first >= min && match.buffer == buffer){ + *result = match.range.first; } + else{ + *result = -1; } - - internal void - seek_string(Application_Links *app, Buffer_ID buffer_id, i64 pos, i64 end, i64 min, String_Const_u8 str, i64 *result, Buffer_Seek_String_Flags flags){ - switch (flags & 3){ - case 0: - { - seek_string_forward(app, buffer_id, pos, end, str, result); - }break; +} + +internal void +seek_string(Application_Links *app, Buffer_ID buffer_id, i64 pos, i64 end, i64 min, String_Const_u8 str, i64 *result, Buffer_Seek_String_Flags flags){ + switch (flags & 3){ + case 0: + { + seek_string_forward(app, buffer_id, pos, end, str, result); + }break; case BufferSeekString_Backward: - { - seek_string_backward(app, buffer_id, pos, min, str, result); -}break; - - case BufferSeekString_CaseInsensitive: { - seek_string_insensitive_forward(app, buffer_id, pos, end, str, result); - }break; - - case BufferSeekString_Backward|BufferSeekString_CaseInsensitive: + seek_string_backward(app, buffer_id, pos, min, str, result); + }break; + + case BufferSeekString_CaseInsensitive: { - seek_string_insensitive_backward(app, buffer_id, pos, min, str, result); - }break; - } - } - - //////////////////////////////// - + seek_string_insensitive_forward(app, buffer_id, pos, end, str, result); + }break; + + case BufferSeekString_Backward|BufferSeekString_CaseInsensitive: + { + seek_string_insensitive_backward(app, buffer_id, pos, min, str, result); + }break; + } +} + +//////////////////////////////// + internal Range_i64 get_line_range_from_pos_range(Application_Links *app, Buffer_ID buffer, Range_i64 pos_range){ - Range_i64 line_range = {}; - line_range.first = get_line_number_from_pos(app, buffer, pos_range.first); - if (line_range.first != 0){ - line_range.end = get_line_number_from_pos(app, buffer, pos_range.one_past_last); -if (line_range.end == 0){ - line_range.first = 0; - } - } - return(line_range); - } - - // NOTE(allen): The end of the returned range does not include the terminating newline character of + Range_i64 line_range = {}; + line_range.first = get_line_number_from_pos(app, buffer, pos_range.first); + if (line_range.first != 0){ + line_range.end = get_line_number_from_pos(app, buffer, pos_range.one_past_last); + if (line_range.end == 0){ + line_range.first = 0; + } + } + return(line_range); +} + +// NOTE(allen): The end of the returned range does not include the terminating newline character of // the last line. internal Range_i64 get_pos_range_from_line_range(Application_Links *app, Buffer_ID buffer, Range_i64 line_range){ - Range_i64 pos_range = {}; - if (is_valid_line_range(app, buffer, line_range)){ - pos_range.first = get_line_start_pos(app, buffer, line_range.first); -pos_range.one_past_last = get_line_end_pos(app, buffer, line_range.end); - } + Range_i64 pos_range = {}; + if (is_valid_line_range(app, buffer, line_range)){ + pos_range.first = get_line_start_pos(app, buffer, line_range.first); + pos_range.one_past_last = get_line_end_pos(app, buffer, line_range.end); + } return(pos_range); +} + +internal Range_i64 +enclose_boundary(Application_Links *app, Buffer_ID buffer, Range_i64 range, + Boundary_Function *func){ + i64 new_min = func(app, buffer, Side_Min, Scan_Backward, range.min + 1); + i64 new_min_check = func(app, buffer, Side_Max, Scan_Backward, range.min + 1); + if (new_min_check <= new_min && new_min < range.min){ + range.min = new_min; } - - internal Range_i64 - enclose_boundary(Application_Links *app, Buffer_ID buffer, Range_i64 range, -Boundary_Function *func){ - i64 new_min = func(app, buffer, Side_Min, Scan_Backward, range.min + 1); - i64 new_min_check = func(app, buffer, Side_Max, Scan_Backward, range.min + 1); - if (new_min_check <= new_min && new_min < range.min){ - range.min = new_min; - } - i64 new_max = func(app, buffer, Side_Max, Scan_Forward, range.max - 1); - i64 new_max_check = func(app, buffer, Side_Min, Scan_Forward, range.max); - if (new_max_check >= new_max && new_max > range.max){ - range.max = new_max; - } - return(range); - } - - internal Range_i64 - left_enclose_boundary(Application_Links *app, Buffer_ID buffer, Range_i64 range, -Boundary_Function *func){ - i64 new_min = func(app, buffer, Side_Min, Scan_Backward, range.min + 1); - i64 new_min_check = func(app, buffer, Side_Max, Scan_Backward, range.min + 1); - if (new_min_check <= new_min && new_min < range.min){ - range.min = new_min; - } - return(range); - } - - internal Range_i64 - right_enclose_boundary(Application_Links *app, Buffer_ID buffer, Range_i64 range, -Boundary_Function *func){ - i64 new_max = func(app, buffer, Side_Max, Scan_Forward, range.max - 1); - i64 new_max_check = func(app, buffer, Side_Min, Scan_Forward, range.max - 1); -if (new_max_check >= new_max && new_max > range.max){ - range.max = new_max; - } - return(range); - } - - internal Range_i64 - enclose_non_whitespace(Application_Links *app, Buffer_ID buffer, Range_i64 range){ -return(enclose_boundary(app, buffer, range, boundary_non_whitespace)); - } - internal Range_i64 + i64 new_max = func(app, buffer, Side_Max, Scan_Forward, range.max - 1); + i64 new_max_check = func(app, buffer, Side_Min, Scan_Forward, range.max); + if (new_max_check >= new_max && new_max > range.max){ + range.max = new_max; + } + return(range); +} + +internal Range_i64 +left_enclose_boundary(Application_Links *app, Buffer_ID buffer, Range_i64 range, + Boundary_Function *func){ + i64 new_min = func(app, buffer, Side_Min, Scan_Backward, range.min + 1); + i64 new_min_check = func(app, buffer, Side_Max, Scan_Backward, range.min + 1); + if (new_min_check <= new_min && new_min < range.min){ + range.min = new_min; + } + return(range); +} + +internal Range_i64 +right_enclose_boundary(Application_Links *app, Buffer_ID buffer, Range_i64 range, + Boundary_Function *func){ + i64 new_max = func(app, buffer, Side_Max, Scan_Forward, range.max - 1); + i64 new_max_check = func(app, buffer, Side_Min, Scan_Forward, range.max - 1); + if (new_max_check >= new_max && new_max > range.max){ + range.max = new_max; + } + return(range); +} + +internal Range_i64 +enclose_non_whitespace(Application_Links *app, Buffer_ID buffer, Range_i64 range){ + return(enclose_boundary(app, buffer, range, boundary_non_whitespace)); +} +internal Range_i64 enclose_pos_non_whitespace(Application_Links *app, Buffer_ID buffer, i64 pos){ - return(enclose_boundary(app, buffer, Ii64(pos), boundary_non_whitespace)); + return(enclose_boundary(app, buffer, Ii64(pos), boundary_non_whitespace)); } internal Range_i64 - enclose_tokens(Application_Links *app, Buffer_ID buffer, Range_i64 range){ - return(enclose_boundary(app, buffer, range, boundary_token)); - } - internal Range_i64 - enclose_pos_tokens(Application_Links *app, Buffer_ID buffer, i64 pos){ -return(enclose_boundary(app, buffer, Ii64(pos), boundary_token)); - } - - internal Range_i64 - enclose_base10(Application_Links *app, Buffer_ID buffer, Range_i64 range){ - return(enclose_boundary(app, buffer, range, boundary_base10)); - } - internal Range_i64 - enclose_pos_base10(Application_Links *app, Buffer_ID buffer, i64 pos){ -return(enclose_boundary(app, buffer, Ii64(pos), boundary_base10)); - } - - internal Range_i64 - enclose_base16(Application_Links *app, Buffer_ID buffer, Range_i64 range){ - return(enclose_boundary(app, buffer, range, boundary_base16)); - } - internal Range_i64 - enclose_pos_base16(Application_Links *app, Buffer_ID buffer, i64 pos){ -return(enclose_boundary(app, buffer, Ii64(pos), boundary_base16)); - } - - internal Range_i64 - enclose_base10_colon(Application_Links *app, Buffer_ID buffer, Range_i64 range){ - return(enclose_boundary(app, buffer, range, boundary_base10_colon)); - } - internal Range_i64 - enclose_pos_base10_colon(Application_Links *app, Buffer_ID buffer, i64 pos){ - return(enclose_boundary(app, buffer, Ii64(pos), boundary_base10_colon)); +enclose_tokens(Application_Links *app, Buffer_ID buffer, Range_i64 range){ + return(enclose_boundary(app, buffer, range, boundary_token)); +} +internal Range_i64 +enclose_pos_tokens(Application_Links *app, Buffer_ID buffer, i64 pos){ + return(enclose_boundary(app, buffer, Ii64(pos), boundary_token)); } internal Range_i64 - enclose_alpha_numeric(Application_Links *app, Buffer_ID buffer, Range_i64 range){ - return(enclose_boundary(app, buffer, range, boundary_alpha_numeric)); - } - internal Range_i64 - enclose_pos_alpha_numeric(Application_Links *app, Buffer_ID buffer, i64 pos){ - return(enclose_boundary(app, buffer, Ii64(pos), boundary_alpha_numeric)); +enclose_base10(Application_Links *app, Buffer_ID buffer, Range_i64 range){ + return(enclose_boundary(app, buffer, range, boundary_base10)); +} +internal Range_i64 +enclose_pos_base10(Application_Links *app, Buffer_ID buffer, i64 pos){ + return(enclose_boundary(app, buffer, Ii64(pos), boundary_base10)); } internal Range_i64 - enclose_alpha_numeric_unicode(Application_Links *app, Buffer_ID buffer, Range_i64 range){ - return(enclose_boundary(app, buffer, range, boundary_alpha_numeric_unicode)); +enclose_base16(Application_Links *app, Buffer_ID buffer, Range_i64 range){ + return(enclose_boundary(app, buffer, range, boundary_base16)); } - internal Range_i64 - enclose_pos_alpha_numeric_unicode(Application_Links *app, Buffer_ID buffer, i64 pos){ - return(enclose_boundary(app, buffer, Ii64(pos), boundary_alpha_numeric_unicode)); - } - - internal Range_i64 - enclose_alpha_numeric_underscore(Application_Links *app, Buffer_ID buffer, Range_i64 range){ - return(enclose_boundary(app, buffer, range, boundary_alpha_numeric_underscore)); - } - internal Range_i64 - enclose_pos_alpha_numeric_underscore(Application_Links *app, Buffer_ID buffer, i64 pos){ - return(enclose_boundary(app, buffer, Ii64(pos), boundary_alpha_numeric_underscore)); - } - internal Range_i64 - right_enclose_alpha_numeric_underscore(Application_Links *app, Buffer_ID buffer, - Range_i64 range){ - return(right_enclose_boundary(app, buffer, range, boundary_alpha_numeric_underscore)); - } - +internal Range_i64 +enclose_pos_base16(Application_Links *app, Buffer_ID buffer, i64 pos){ + return(enclose_boundary(app, buffer, Ii64(pos), boundary_base16)); +} + +internal Range_i64 +enclose_base10_colon(Application_Links *app, Buffer_ID buffer, Range_i64 range){ + return(enclose_boundary(app, buffer, range, boundary_base10_colon)); +} +internal Range_i64 +enclose_pos_base10_colon(Application_Links *app, Buffer_ID buffer, i64 pos){ + return(enclose_boundary(app, buffer, Ii64(pos), boundary_base10_colon)); +} + +internal Range_i64 +enclose_alpha_numeric(Application_Links *app, Buffer_ID buffer, Range_i64 range){ + return(enclose_boundary(app, buffer, range, boundary_alpha_numeric)); +} +internal Range_i64 +enclose_pos_alpha_numeric(Application_Links *app, Buffer_ID buffer, i64 pos){ + return(enclose_boundary(app, buffer, Ii64(pos), boundary_alpha_numeric)); +} + +internal Range_i64 +enclose_alpha_numeric_unicode(Application_Links *app, Buffer_ID buffer, Range_i64 range){ + return(enclose_boundary(app, buffer, range, boundary_alpha_numeric_unicode)); +} +internal Range_i64 +enclose_pos_alpha_numeric_unicode(Application_Links *app, Buffer_ID buffer, i64 pos){ + return(enclose_boundary(app, buffer, Ii64(pos), boundary_alpha_numeric_unicode)); +} + +internal Range_i64 +enclose_alpha_numeric_underscore(Application_Links *app, Buffer_ID buffer, Range_i64 range){ + return(enclose_boundary(app, buffer, range, boundary_alpha_numeric_underscore)); +} +internal Range_i64 +enclose_pos_alpha_numeric_underscore(Application_Links *app, Buffer_ID buffer, i64 pos){ + return(enclose_boundary(app, buffer, Ii64(pos), boundary_alpha_numeric_underscore)); +} +internal Range_i64 +right_enclose_alpha_numeric_underscore(Application_Links *app, Buffer_ID buffer, + Range_i64 range){ + return(right_enclose_boundary(app, buffer, range, boundary_alpha_numeric_underscore)); +} + internal Range_i64 enclose_alpha_numeric_underscore_utf8(Application_Links *app, Buffer_ID buffer, Range_i64 range){ -return(enclose_boundary(app, buffer, range, boundary_alpha_numeric_underscore_utf8)); + return(enclose_boundary(app, buffer, range, boundary_alpha_numeric_underscore_utf8)); } internal Range_i64 - enclose_pos_alpha_numeric_underscore_utf8(Application_Links *app, Buffer_ID buffer, i64 pos){ -return(enclose_boundary(app, buffer, Ii64(pos), boundary_alpha_numeric_underscore_utf8)); - } - internal Range_i64 - right_enclose_alpha_numeric_underscore_utf8(Application_Links *app, Buffer_ID buffer, - Range_i64 range){ -return(right_enclose_boundary(app, buffer, range, boundary_alpha_numeric_underscore_utf8)); - } +enclose_pos_alpha_numeric_underscore_utf8(Application_Links *app, Buffer_ID buffer, i64 pos){ + return(enclose_boundary(app, buffer, Ii64(pos), boundary_alpha_numeric_underscore_utf8)); +} +internal Range_i64 +right_enclose_alpha_numeric_underscore_utf8(Application_Links *app, Buffer_ID buffer, + Range_i64 range){ + return(right_enclose_boundary(app, buffer, range, boundary_alpha_numeric_underscore_utf8)); +} - internal Range_i64 +internal Range_i64 enclose_alpha_numeric_camel(Application_Links *app, Buffer_ID buffer, Range_i64 range){ -return(enclose_boundary(app, buffer, range, boundary_alpha_numeric_camel)); + return(enclose_boundary(app, buffer, range, boundary_alpha_numeric_camel)); } internal Range_i64 enclose_pos_alpha_numeric_camel(Application_Links *app, Buffer_ID buffer, i64 pos){ -return(enclose_boundary(app, buffer, Ii64(pos), boundary_alpha_numeric_camel)); + return(enclose_boundary(app, buffer, Ii64(pos), boundary_alpha_numeric_camel)); } internal Range_i64 enclose_pos_inside_quotes(Application_Links *app, Buffer_ID buffer, i64 pos){ - return(enclose_boundary(app, buffer, Ii64(pos), boundary_inside_quotes)); + return(enclose_boundary(app, buffer, Ii64(pos), boundary_inside_quotes)); } internal Range_i64 @@ -932,1544 +956,1521 @@ enclose_whole_lines(Application_Links *app, Buffer_ID buffer, Range_i64 range){ } internal Range_i64 enclose_pos_whole_lines(Application_Links *app, Buffer_ID buffer, i64 pos){ - return(enclose_boundary(app, buffer, Ii64(pos), boundary_line)); - } - - //////////////////////////////// - - internal Range_i64 - get_snipe_range(Application_Links *app, Boundary_Function_List funcs, Buffer_ID buffer, i64 pos, Scan_Direction direction){ - Range_i64 result = {}; - i64 buffer_size = buffer_get_size(app, buffer); + return(enclose_boundary(app, buffer, Ii64(pos), boundary_line)); +} + +//////////////////////////////// + +internal Range_i64 +get_snipe_range(Application_Links *app, Boundary_Function_List funcs, Buffer_ID buffer, i64 pos, Scan_Direction direction){ + Range_i64 result = {}; + i64 buffer_size = buffer_get_size(app, buffer); i64 pos0 = pos; i64 pos1 = scan(app, funcs, buffer, direction, pos0); -if (0 <= pos1 && pos1 <= buffer_size){ -i64 pos2 = scan(app, funcs, buffer, flip_direction(direction), pos1); - if (0 <= pos2 && pos2 <= buffer_size){ -if (direction == Scan_Backward){ - pos2 = clamp_bot(pos2, pos0); - } -else{ - pos2 = clamp_top(pos2, pos0); - } - result = Ii64(pos1, pos2); - } - } - return(result); - } - - internal Range_i64 - get_snipe_range(Application_Links *app, Boundary_Function *func, Buffer_ID buffer, i64 pos, Scan_Direction direction){ - Scratch_Block scratch(app); - return(get_snipe_range(app, push_boundary_list(scratch, func), buffer, pos, direction)); + if (0 <= pos1 && pos1 <= buffer_size){ + i64 pos2 = scan(app, funcs, buffer, flip_direction(direction), pos1); + if (0 <= pos2 && pos2 <= buffer_size){ + if (direction == Scan_Backward){ + pos2 = clamp_bot(pos2, pos0); + } + else{ + pos2 = clamp_top(pos2, pos0); + } + result = Ii64(pos1, pos2); } - - //////////////////////////////// + } + return(result); +} + +internal Range_i64 +get_snipe_range(Application_Links *app, Boundary_Function *func, Buffer_ID buffer, i64 pos, Scan_Direction direction){ + Scratch_Block scratch(app); + return(get_snipe_range(app, push_boundary_list(scratch, func), buffer, pos, direction)); +} + +//////////////////////////////// internal String_Const_u8 push_buffer_range(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range){ - String_Const_u8 result = {}; - i64 length = range_size(range); + String_Const_u8 result = {}; + i64 length = range_size(range); if (length > 0){ - Temp_Memory restore_point = begin_temp(arena); - u8 *memory = push_array(arena, u8, length); - if (buffer_read_range(app, buffer, range, memory)){ - result = SCu8(memory, length); - } - else{ - end_temp(restore_point); -} -} -return(result); + Temp_Memory restore_point = begin_temp(arena); + u8 *memory = push_array(arena, u8, length); + if (buffer_read_range(app, buffer, range, memory)){ + result = SCu8(memory, length); + } + else{ + end_temp(restore_point); + } + } + return(result); } internal String_Const_u8 - push_token_lexeme(Application_Links *app, Arena *arena, Buffer_ID buffer, Token *token){ - return(push_buffer_range(app, arena, buffer, Ii64(token))); - } - - internal String_Const_u8 - push_buffer_line(Application_Links *app, Arena *arena, Buffer_ID buffer, i64 line_number){ - return(push_buffer_range(app, arena, buffer, get_line_pos_range(app, buffer, line_number))); +push_token_lexeme(Application_Links *app, Arena *arena, Buffer_ID buffer, Token *token){ + return(push_buffer_range(app, arena, buffer, Ii64(token))); } internal String_Const_u8 - push_whole_buffer(Application_Links *app, Arena *arena, Buffer_ID buffer){ +push_buffer_line(Application_Links *app, Arena *arena, Buffer_ID buffer, i64 line_number){ + return(push_buffer_range(app, arena, buffer, get_line_pos_range(app, buffer, line_number))); +} + +internal String_Const_u8 +push_whole_buffer(Application_Links *app, Arena *arena, Buffer_ID buffer){ return(push_buffer_range(app, arena, buffer, buffer_range(app, buffer))); - } - - internal String_Const_u8 - push_view_range_string(Application_Links *app, Arena *arena, View_ID view){ - Buffer_ID buffer = view_get_buffer(app, view, Access_ReadVisible); - return(push_buffer_range(app, arena, buffer, get_view_range(app, view))); - } +} - internal String_Const_u8 - push_view_range_string(Application_Links *app, Arena *arena){ - View_ID view = get_active_view(app, Access_Always); -return(push_view_range_string(app, arena, view)); +internal String_Const_u8 +push_view_range_string(Application_Links *app, Arena *arena, View_ID view){ + Buffer_ID buffer = view_get_buffer(app, view, Access_ReadVisible); + return(push_buffer_range(app, arena, buffer, get_view_range(app, view))); +} + +internal String_Const_u8 +push_view_range_string(Application_Links *app, Arena *arena){ + View_ID view = get_active_view(app, Access_Always); + return(push_view_range_string(app, arena, view)); } internal String_Const_u8 push_enclose_range_at_pos(Application_Links *app, Arena *arena, Buffer_ID buffer, i64 pos, Enclose_Function *enclose){ - Range_i64 range = enclose(app, buffer, Ii64(pos)); + Range_i64 range = enclose(app, buffer, Ii64(pos)); return(push_buffer_range(app, arena, buffer, range)); - } +} //////////////////////////////// - - internal String_Const_u8 - token_it_lexeme(Application_Links *app, Arena *arena, Token_Iterator_Array *it){ - String_Const_u8 result = {}; - Token *token = token_it_read(it); -if (token != 0){ + +internal String_Const_u8 +token_it_lexeme(Application_Links *app, Arena *arena, Token_Iterator_Array *it){ + String_Const_u8 result = {}; + Token *token = token_it_read(it); + if (token != 0){ result = push_token_lexeme(app, arena, (Buffer_ID)it->user_id, token); - } -return(result); + } + return(result); } internal b32 token_it_check_and_get_lexeme(Application_Links *app, Arena *arena, Token_Iterator_Array *it, Token_Base_Kind kind, String_Const_u8 *lexeme_out){ - Token *token = token_it_read(it); + Token *token = token_it_read(it); b32 result = {}; if (token != 0 && token->kind == kind){ - result = true; - *lexeme_out = push_token_lexeme(app, arena, (Buffer_ID)it->user_id, token); + result = true; + *lexeme_out = push_token_lexeme(app, arena, (Buffer_ID)it->user_id, token); } -return(result); - } + return(result); +} - internal String_Const_u8 - token_it_lexeme(Application_Links *app, Arena *arena, Token_Iterator_List *it){ +internal String_Const_u8 +token_it_lexeme(Application_Links *app, Arena *arena, Token_Iterator_List *it){ String_Const_u8 result = {}; Token *token = token_it_read(it); -if (token != 0){ -result = push_token_lexeme(app, arena, (Buffer_ID)it->user_id, token); -} -return(result); + if (token != 0){ + result = push_token_lexeme(app, arena, (Buffer_ID)it->user_id, token); } - - internal b32 - token_it_check_and_get_lexeme(Application_Links *app, Arena *arena, Token_Iterator_List *it, Token_Base_Kind kind, String_Const_u8 *lexeme_out){ + return(result); +} + +internal b32 +token_it_check_and_get_lexeme(Application_Links *app, Arena *arena, Token_Iterator_List *it, Token_Base_Kind kind, String_Const_u8 *lexeme_out){ Token *token = token_it_read(it); b32 result = {}; if (token != 0 && token->kind == kind){ - result = true; - *lexeme_out = push_token_lexeme(app, arena, (Buffer_ID)it->user_id, token); - } - return(result); - } - - //////////////////////////////// - - internal b32 -buffer_has_name_with_star(Application_Links *app, Buffer_ID buffer){ - Scratch_Block scratch(app); -String_Const_u8 str = push_buffer_unique_name(app, scratch, buffer); - return(str.size > 0 && str.str[0] == '*'); + result = true; + *lexeme_out = push_token_lexeme(app, arena, (Buffer_ID)it->user_id, token); } - - internal u8 - buffer_get_char(Application_Links *app, Buffer_ID buffer_id, i64 pos){ - i64 buffer_size = buffer_get_size(app, buffer_id); - u8 result = ' '; - if (0 <= pos && pos < buffer_size){ + return(result); +} + +//////////////////////////////// + +internal b32 +buffer_has_name_with_star(Application_Links *app, Buffer_ID buffer){ + Scratch_Block scratch(app); + String_Const_u8 str = push_buffer_unique_name(app, scratch, buffer); + return(str.size > 0 && str.str[0] == '*'); +} + +internal u8 +buffer_get_char(Application_Links *app, Buffer_ID buffer_id, i64 pos){ + i64 buffer_size = buffer_get_size(app, buffer_id); + u8 result = ' '; + if (0 <= pos && pos < buffer_size){ buffer_read_range(app, buffer_id, Ii64(pos, pos + 1), &result); - } - return(result); + } + return(result); } internal b32 - line_is_valid_and_blank(Application_Links *app, Buffer_ID buffer, i64 line_number){ -b32 result = false; -if (is_valid_line(app, buffer, line_number)){ -Scratch_Block scratch(app); - String_Const_u8 line = push_buffer_line(app, scratch, buffer, line_number); - result = true; - for (u64 i = 0; i < line.size; i += 1){ - if (!character_is_whitespace(line.str[i])){ - result = false; - break; -} +line_is_valid_and_blank(Application_Links *app, Buffer_ID buffer, i64 line_number){ + b32 result = false; + if (is_valid_line(app, buffer, line_number)){ + Scratch_Block scratch(app); + String_Const_u8 line = push_buffer_line(app, scratch, buffer, line_number); + result = true; + for (u64 i = 0; i < line.size; i += 1){ + if (!character_is_whitespace(line.str[i])){ + result = false; + break; + } + } } - } - return(result); - } + return(result); +} - //////////////////////////////// - - internal i64 - get_pos_past_lead_whitespace_from_line_number(Application_Links *app, Buffer_ID buffer, i64 line_number){ +//////////////////////////////// + +internal i64 +get_pos_past_lead_whitespace_from_line_number(Application_Links *app, Buffer_ID buffer, i64 line_number){ Scratch_Block scratch(app); Range_i64 line_range = get_line_pos_range(app, buffer, line_number); -String_Const_u8 line = push_buffer_range(app, scratch, buffer, line_range); - i64 result = line_range.end; - for (u64 i = 0; i < line.size; i += 1){ - if (!character_is_whitespace(line.str[i])){ - result = line_range.start + i; -break; + String_Const_u8 line = push_buffer_range(app, scratch, buffer, line_range); + i64 result = line_range.end; + for (u64 i = 0; i < line.size; i += 1){ + if (!character_is_whitespace(line.str[i])){ + result = line_range.start + i; + break; } - } - return(result); - } - - internal i64 - get_pos_past_lead_whitespace(Application_Links *app, Buffer_ID buffer, i64 pos){ - i64 line_number = get_line_number_from_pos(app, buffer, pos); -i64 result = get_pos_past_lead_whitespace_from_line_number(app, buffer, line_number); -result = clamp_bot(pos, result); - return(result); - } - - internal void - move_past_lead_whitespace(Application_Links *app, View_ID view, Buffer_ID buffer){ - i64 pos = view_get_cursor_pos(app, view); - i64 new_pos = get_pos_past_lead_whitespace(app, buffer, pos); -view_set_cursor_and_preferred_x(app, view, seek_pos(new_pos)); - } - - internal void - move_past_lead_whitespace(Application_Links *app, View_ID view){ -Buffer_ID buffer = view_get_buffer(app, view, Access_ReadVisible); - move_past_lead_whitespace(app, view, buffer); } - -internal b32 -line_is_blank(Application_Links *app, Buffer_ID buffer, i64 line_number){ - Scratch_Block scratch(app); - String_Const_u8 line = push_buffer_line(app, scratch, buffer, line_number); - b32 is_blank = true; -for (u64 i = 0; i < line.size; i += 1){ - if (!character_is_whitespace(line.str[i])){ - is_blank = false; - break; - } - } - return(is_blank); - } - - internal i64 -get_line_number_of__whitespace_status_line(Application_Links *app, Buffer_ID buffer, Scan_Direction direction, i64 line_number_start, b32 get_blank_line){ -i64 line_count = buffer_get_line_count(app, buffer); - i64 line_number = line_number_start + direction; - for (;1 <= line_number && line_number <= line_count; line_number += direction){ -b32 is_blank = line_is_blank(app, buffer, line_number); -if (is_blank == get_blank_line){ - break; - } - } - line_number = clamp(1, line_number, line_count); - return(line_number); - } - - internal i64 - get_line_number_of_non_blank_line(Application_Links *app, Buffer_ID buffer, Scan_Direction direction, i64 line_number_start){ - return(get_line_number_of__whitespace_status_line(app, buffer, direction, line_number_start, false)); + return(result); } internal i64 - get_line_number_of_blank_line(Application_Links *app, Buffer_ID buffer, Scan_Direction direction, i64 line_number_start){ - return(get_line_number_of__whitespace_status_line(app, buffer, direction, line_number_start, true)); - } - - internal i64 - get_pos_of_blank_line(Application_Links *app, Buffer_ID buffer, Scan_Direction direction, i64 pos_start){ - i64 line_number_start = get_line_number_from_pos(app, buffer, pos_start); - i64 blank_line = get_line_number_of_blank_line(app, buffer, direction, line_number_start); - i64 pos = get_line_start_pos(app, buffer, blank_line); +get_pos_past_lead_whitespace(Application_Links *app, Buffer_ID buffer, i64 pos){ + i64 line_number = get_line_number_from_pos(app, buffer, pos); + i64 result = get_pos_past_lead_whitespace_from_line_number(app, buffer, line_number); + result = clamp_bot(pos, result); + return(result); +} + +internal void +move_past_lead_whitespace(Application_Links *app, View_ID view, Buffer_ID buffer){ + i64 pos = view_get_cursor_pos(app, view); + i64 new_pos = get_pos_past_lead_whitespace(app, buffer, pos); + view_set_cursor_and_preferred_x(app, view, seek_pos(new_pos)); +} + +internal void +move_past_lead_whitespace(Application_Links *app, View_ID view){ + Buffer_ID buffer = view_get_buffer(app, view, Access_ReadVisible); + move_past_lead_whitespace(app, view, buffer); +} + +internal b32 +line_is_blank(Application_Links *app, Buffer_ID buffer, i64 line_number){ + Scratch_Block scratch(app); + String_Const_u8 line = push_buffer_line(app, scratch, buffer, line_number); + b32 is_blank = true; + for (u64 i = 0; i < line.size; i += 1){ + if (!character_is_whitespace(line.str[i])){ + is_blank = false; + break; + } + } + return(is_blank); +} + +internal i64 +get_line_number_of__whitespace_status_line(Application_Links *app, Buffer_ID buffer, Scan_Direction direction, i64 line_number_start, b32 get_blank_line){ + i64 line_count = buffer_get_line_count(app, buffer); + i64 line_number = line_number_start + direction; + for (;1 <= line_number && line_number <= line_count; line_number += direction){ + b32 is_blank = line_is_blank(app, buffer, line_number); + if (is_blank == get_blank_line){ + break; + } + } + line_number = clamp(1, line_number, line_count); + return(line_number); +} + +internal i64 +get_line_number_of_non_blank_line(Application_Links *app, Buffer_ID buffer, Scan_Direction direction, i64 line_number_start){ + return(get_line_number_of__whitespace_status_line(app, buffer, direction, line_number_start, false)); +} + +internal i64 +get_line_number_of_blank_line(Application_Links *app, Buffer_ID buffer, Scan_Direction direction, i64 line_number_start){ + return(get_line_number_of__whitespace_status_line(app, buffer, direction, line_number_start, true)); +} + +internal i64 +get_pos_of_blank_line(Application_Links *app, Buffer_ID buffer, Scan_Direction direction, i64 pos_start){ + i64 line_number_start = get_line_number_from_pos(app, buffer, pos_start); + i64 blank_line = get_line_number_of_blank_line(app, buffer, direction, line_number_start); + i64 pos = get_line_start_pos(app, buffer, blank_line); return(pos); } - internal i64 - get_line_number_of_blank_line_grouped(Application_Links *app, Buffer_ID buffer, Scan_Direction direction, i64 line_number_start){ - i64 line_number = line_number_start; +internal i64 +get_line_number_of_blank_line_grouped(Application_Links *app, Buffer_ID buffer, Scan_Direction direction, i64 line_number_start){ + i64 line_number = line_number_start; if (line_is_blank(app, buffer, line_number)){ - line_number = get_line_number_of_non_blank_line(app, buffer, direction, line_number); - } + line_number = get_line_number_of_non_blank_line(app, buffer, direction, line_number); + } line_number = get_line_number_of_blank_line(app, buffer, direction, line_number); return(line_number); - } - - internal i64 - get_pos_of_blank_line_grouped(Application_Links *app, Buffer_ID buffer, Scan_Direction direction, i64 pos_start){ -i64 line_number_start = get_line_number_from_pos(app, buffer, pos_start); - i64 blank_line = get_line_number_of_blank_line_grouped(app, buffer, direction, line_number_start); - i64 pos = get_line_start_pos(app, buffer, blank_line); - return(pos); - } - - internal Indent_Info - get_indent_info_range(Application_Links *app, Buffer_ID buffer, Range_i64 range, i32 tab_width){ - Scratch_Block scratch(app); - String_Const_u8 s = push_buffer_range(app, scratch, buffer, range); +} - Indent_Info info = {}; -info.first_char_pos = range.end; +internal i64 +get_pos_of_blank_line_grouped(Application_Links *app, Buffer_ID buffer, Scan_Direction direction, i64 pos_start){ + i64 line_number_start = get_line_number_from_pos(app, buffer, pos_start); + i64 blank_line = get_line_number_of_blank_line_grouped(app, buffer, direction, line_number_start); + i64 pos = get_line_start_pos(app, buffer, blank_line); + return(pos); +} + +internal Indent_Info +get_indent_info_range(Application_Links *app, Buffer_ID buffer, Range_i64 range, i32 tab_width){ + Scratch_Block scratch(app); + String_Const_u8 s = push_buffer_range(app, scratch, buffer, range); + + Indent_Info info = {}; + info.first_char_pos = range.end; info.is_blank = true; info.all_space = true; - - for (u64 i = 0; i < s.size; i += 1){ - u8 c = s.str[i]; - if (!character_is_whitespace(c)){ - info.is_blank = false; - info.all_space = false; -info.first_char_pos = range.start + (i64)i; - break; + + for (u64 i = 0; i < s.size; i += 1){ + u8 c = s.str[i]; + if (!character_is_whitespace(c)){ + info.is_blank = false; + info.all_space = false; + info.first_char_pos = range.start + (i64)i; + break; + } + if (c == ' '){ + info.indent_pos += 1; + } + else{ + info.all_space = false; + } + if (c == '\t'){ + info.indent_pos += tab_width; + } } - if (c == ' '){ - info.indent_pos += 1; - } - else{ -info.all_space = false; -} -if (c == '\t'){ - info.indent_pos += tab_width; - } - } return(info); - } - - internal Indent_Info - get_indent_info_line_number_and_start(Application_Links *app, Buffer_ID buffer, i64 line_number, i64 line_start, i32 tab_width){ - i64 end = get_line_side_pos(app, buffer, line_number, Side_Max); -return(get_indent_info_range(app, buffer, Ii64(line_start, end), tab_width)); - } - - //////////////////////////////// - - internal History_Group - history_group_begin(Application_Links *app, Buffer_ID buffer){ - History_Group group = {}; - group.app = app; - group.buffer = buffer; - group.first = buffer_history_get_current_state_index(app, buffer); - group.first += 1; - return(group); - } - - internal void - history_group_end(History_Group group){ - History_Record_Index last = buffer_history_get_current_state_index(group.app, group.buffer); - if (group.first < last){ - buffer_history_merge_record_range(group.app, group.buffer, group.first, last, RecordMergeFlag_StateInRange_MoveStateForward); } + +internal Indent_Info +get_indent_info_line_number_and_start(Application_Links *app, Buffer_ID buffer, i64 line_number, i64 line_start, i32 tab_width){ + i64 end = get_line_side_pos(app, buffer, line_number, Side_Max); + return(get_indent_info_range(app, buffer, Ii64(line_start, end), tab_width)); +} + +//////////////////////////////// + +internal History_Group +history_group_begin(Application_Links *app, Buffer_ID buffer){ + History_Group group = {}; + group.app = app; + group.buffer = buffer; + group.first = buffer_history_get_current_state_index(app, buffer); + group.first += 1; + return(group); +} + +internal void +history_group_end(History_Group group){ + History_Record_Index last = buffer_history_get_current_state_index(group.app, group.buffer); + if (group.first < last){ + buffer_history_merge_record_range(group.app, group.buffer, group.first, last, RecordMergeFlag_StateInRange_MoveStateForward); + } } //////////////////////////////// internal void - replace_in_range(Application_Links *app, Buffer_ID buffer, Range_i64 range, String_Const_u8 needle, String_Const_u8 string){ +replace_in_range(Application_Links *app, Buffer_ID buffer, Range_i64 range, String_Const_u8 needle, String_Const_u8 string){ // TODO(allen): rewrite History_Group group = history_group_begin(app, buffer); i64 pos = range.min - 1; i64 new_pos = 0; - seek_string_forward(app, buffer, pos, range.end, needle, &new_pos); - i64 shift = replace_range_shift(needle.size, string.size); - for (; new_pos + (i64)needle.size <= range.end;){ - Range_i64 needle_range = Ii64(new_pos, new_pos + (i32)needle.size); - buffer_replace_range(app, buffer, needle_range, string); - range.end += shift; -pos = new_pos + (i32)string.size - 1; - seek_string_forward(app, buffer, pos, range.end, needle, &new_pos); - } - history_group_end(group); + seek_string_forward(app, buffer, pos, range.end, needle, &new_pos); + i64 shift = replace_range_shift(needle.size, string.size); + for (; new_pos + (i64)needle.size <= range.end;){ + Range_i64 needle_range = Ii64(new_pos, new_pos + (i32)needle.size); + buffer_replace_range(app, buffer, needle_range, string); + range.end += shift; + pos = new_pos + (i32)string.size - 1; + seek_string_forward(app, buffer, pos, range.end, needle, &new_pos); + } + history_group_end(group); } - - internal Range_i64 - swap_lines(Application_Links *app, Buffer_ID buffer, i64 line_1, i64 line_2){ -Range_i64 result = {}; -i64 line_count = buffer_get_line_count(app, buffer); - if (1 <= line_1 && line_2 <= line_count){ - Range_i64 range_1 = get_line_pos_range(app, buffer, line_1); - Range_i64 range_2 = get_line_pos_range(app, buffer, line_2); - - Scratch_Block scratch(app); - - String_Const_u8 text_1 = push_buffer_range(app, scratch, buffer, range_1); + +internal Range_i64 +swap_lines(Application_Links *app, Buffer_ID buffer, i64 line_1, i64 line_2){ + Range_i64 result = {}; + i64 line_count = buffer_get_line_count(app, buffer); + if (1 <= line_1 && line_2 <= line_count){ + Range_i64 range_1 = get_line_pos_range(app, buffer, line_1); + Range_i64 range_2 = get_line_pos_range(app, buffer, line_2); + + Scratch_Block scratch(app); + + String_Const_u8 text_1 = push_buffer_range(app, scratch, buffer, range_1); String_Const_u8 text_2 = push_buffer_range(app, scratch, buffer, range_2); History_Group group = history_group_begin(app, buffer); - buffer_replace_range(app, buffer, range_2, text_1); -buffer_replace_range(app, buffer, range_1, text_2); - history_group_end(group); - -i64 shift = replace_range_shift(range_1, text_2.size); - result.min = range_1.min; -result.max = range_2.min + shift; - } - return(result); -} - - internal i64 - move_line(Application_Links *app, Buffer_ID buffer, i64 line_number, Scan_Direction direction){ - i64 line_1 = 0; - i64 line_2 = 0; - if (direction == Scan_Forward){ - line_1 = line_number; -line_2 = line_number + 1; - } - else{ - line_1 = line_number - 1; - line_2 = line_number; - } - Range_i64 line_starts = swap_lines(app, buffer, line_1, line_2); - i64 result = 0; - if (line_starts.min < line_starts.max){ - if (direction == Scan_Forward){ - result = line_starts.max; - } - else{ - result = line_starts.min; - } - } - else{ - result = get_line_side_pos(app, buffer, line_number, Side_Min); - } - return(result); - } + buffer_replace_range(app, buffer, range_2, text_1); + buffer_replace_range(app, buffer, range_1, text_2); + history_group_end(group); - internal void - clear_buffer(Application_Links *app, Buffer_ID buffer){ - buffer_replace_range(app, buffer, buffer_range(app, buffer), string_u8_litexpr("")); - } - - //////////////////////////////// - - internal String_Match_List - find_all_matches_all_buffers(Application_Links *app, Arena *arena, String_Const_u8_Array match_patterns, String_Match_Flag must_have_flags, String_Match_Flag must_not_have_flags){ - String_Match_List all_matches = {}; -for (Buffer_ID buffer = get_buffer_next(app, 0, Access_Always); - buffer != 0; - buffer = get_buffer_next(app, buffer, Access_Always)){ -String_Match_List buffer_matches = {}; - for (i32 i = 0; i < match_patterns.count; i += 1){ - Range_i64 range = buffer_range(app, buffer); - String_Match_List pattern_matches = buffer_find_all_matches(app, arena, buffer, i, range, match_patterns.vals[i], - &character_predicate_alpha_numeric_underscore_utf8, Scan_Forward); - string_match_list_filter_flags(&pattern_matches, must_have_flags, must_not_have_flags); -if (pattern_matches.count > 0){ -if (buffer_matches.count == 0){ - buffer_matches = pattern_matches; - } - else{ -buffer_matches = string_match_list_merge_front_to_back(&buffer_matches, &pattern_matches); -} -} -} -all_matches = string_match_list_join(&all_matches, &buffer_matches); - } - return(all_matches); + i64 shift = replace_range_shift(range_1, text_2.size); + result.min = range_1.min; + result.max = range_2.min + shift; } - - internal String_Match_List - find_all_matches_all_buffers(Application_Links *app, Arena *arena, String_Const_u8 pattern, String_Match_Flag must_have_flags, String_Match_Flag must_not_have_flags){ - String_Const_u8_Array array = {&pattern, 1}; - return(find_all_matches_all_buffers(app, arena, array, must_have_flags, must_not_have_flags)); - } + return(result); +} + +internal i64 +move_line(Application_Links *app, Buffer_ID buffer, i64 line_number, Scan_Direction direction){ + i64 line_1 = 0; + i64 line_2 = 0; + if (direction == Scan_Forward){ + line_1 = line_number; + line_2 = line_number + 1; + } + else{ + line_1 = line_number - 1; + line_2 = line_number; + } + Range_i64 line_starts = swap_lines(app, buffer, line_1, line_2); + i64 result = 0; + if (line_starts.min < line_starts.max){ + if (direction == Scan_Forward){ + result = line_starts.max; + } + else{ + result = line_starts.min; + } + } + else{ + result = get_line_side_pos(app, buffer, line_number, Side_Min); + } + return(result); +} + +internal void +clear_buffer(Application_Links *app, Buffer_ID buffer){ + buffer_replace_range(app, buffer, buffer_range(app, buffer), string_u8_litexpr("")); +} //////////////////////////////// - - internal b32 - is_modified(User_Input *input){ - return(is_modified(&input->event)); - } - - internal String_Const_u8 - to_writable(User_Input *in){ - return(to_writable(&in->event)); - } - - internal b32 - has_modifier(User_Input *in, Key_Code key_code){ - b32 result = false; - Input_Modifier_Set *mods = get_modifiers(&in->event); - if (mods != 0){ - result = has_modifier(mods, key_code); + +internal String_Match_List +find_all_matches_all_buffers(Application_Links *app, Arena *arena, String_Const_u8_Array match_patterns, String_Match_Flag must_have_flags, String_Match_Flag must_not_have_flags){ + String_Match_List all_matches = {}; + for (Buffer_ID buffer = get_buffer_next(app, 0, Access_Always); + buffer != 0; + buffer = get_buffer_next(app, buffer, Access_Always)){ + String_Match_List buffer_matches = {}; + for (i32 i = 0; i < match_patterns.count; i += 1){ + Range_i64 range = buffer_range(app, buffer); + String_Match_List pattern_matches = buffer_find_all_matches(app, arena, buffer, i, range, match_patterns.vals[i], + &character_predicate_alpha_numeric_underscore_utf8, Scan_Forward); + string_match_list_filter_flags(&pattern_matches, must_have_flags, must_not_have_flags); + if (pattern_matches.count > 0){ + if (buffer_matches.count == 0){ + buffer_matches = pattern_matches; + } + else{ + buffer_matches = string_match_list_merge_front_to_back(&buffer_matches, &pattern_matches); + } + } } - return(result); - } - - internal b32 - match_key_code(User_Input *in, Key_Code key_code){ - return(match_key_code(&in->event, key_code)); + all_matches = string_match_list_join(&all_matches, &buffer_matches); } - + return(all_matches); +} + +internal String_Match_List +find_all_matches_all_buffers(Application_Links *app, Arena *arena, String_Const_u8 pattern, String_Match_Flag must_have_flags, String_Match_Flag must_not_have_flags){ + String_Const_u8_Array array = {&pattern, 1}; + return(find_all_matches_all_buffers(app, arena, array, must_have_flags, must_not_have_flags)); +} + +//////////////////////////////// + +internal b32 +is_modified(User_Input *input){ + return(is_modified(&input->event)); +} + +internal String_Const_u8 +to_writable(User_Input *in){ + return(to_writable(&in->event)); +} + +internal b32 +has_modifier(User_Input *in, Key_Code key_code){ + b32 result = false; + Input_Modifier_Set *mods = get_modifiers(&in->event); + if (mods != 0){ + result = has_modifier(mods, key_code); + } + return(result); +} + +internal b32 +match_key_code(User_Input *in, Key_Code key_code){ + return(match_key_code(&in->event, key_code)); +} + internal b32 match_core_code(User_Input *in, Key_Code core_code){ -return(match_core_code(&in->event, core_code)); + return(match_core_code(&in->event, core_code)); } internal String_Const_u8 backspace_utf8(String_Const_u8 string){ - if (string.size > 0){ -u64 i = string.size - 1; - for (; i > 0; --i){ - if (string.str[i] <= 0x7F || string.str[i] >= 0xC0){ - break; - } - } - string.size = i; + if (string.size > 0){ + u64 i = string.size - 1; + for (; i > 0; --i){ + if (string.str[i] <= 0x7F || string.str[i] >= 0xC0){ + break; + } + } + string.size = i; } return(string); - } - - //////////////////////////////// - -Query_Bar_Group::Query_Bar_Group(Application_Links *app){ - this->app = app; - this->view = get_active_view(app, Access_Always); -} - -Query_Bar_Group::Query_Bar_Group(Application_Links *app, View_ID view){ - this->app = app; - this->view = view; -} - -Query_Bar_Group::~Query_Bar_Group(){ -clear_all_query_bars(this->app, this->view); - } - - internal b32 - query_user_general(Application_Links *app, Query_Bar *bar, b32 force_number, String_Const_u8 init_string){ -// NOTE(allen|a3.4.4): It will not cause an *error* if we continue on after failing to. -// start a query bar, but it will be unusual behavior from the point of view of the - // user, if this command starts intercepting input even though no prompt is shown. -// This will only happen if you have a lot of bars open already or if the current view - // doesn't support query bars. - if (start_query_bar(app, bar, 0) == 0){ - return(false); - } - - if (init_string.size > 0){ - String_u8 string = Su8(bar->string.str, bar->string.size, bar->string_capacity); - string_append(&string, init_string); - bar->string.size = string.string.size; - } - - b32 success = true; - - for (;;){ - // NOTE(allen|a3.4.4): This call will block until the user does one of the input -// types specified in the flags. The first set of flags are inputs you'd like to - // intercept that you don't want to abort on. The second set are inputs that - // you'd like to cause the command to abort. If an event satisfies both flags, it -// is treated as an abort. - User_Input in = get_next_input(app, EventPropertyGroup_AnyKeyboardEvent, - EventProperty_Escape|EventProperty_MouseButton); - - // NOTE(allen|a3.4.4): The responsible thing to do on abort is to end the command - // without waiting on get_next_input again. -if (in.abort){ -success = false; - break; - } - - Scratch_Block scratch(app); - b32 good_insert = false; -String_Const_u8 insert_string = to_writable(&in); - if (insert_string.str != 0 && insert_string.size > 0){ - insert_string = string_replace(scratch, insert_string, - string_u8_litexpr("\n"), - string_u8_litexpr("")); - insert_string = string_replace(scratch, insert_string, - string_u8_litexpr("\t"), - string_u8_litexpr("")); - if (force_number){ -if (string_is_integer(insert_string, 10)){ - good_insert = true; - } - } - else{ - good_insert = true; - } -} - -// NOTE(allen|a3.4.4): All we have to do to update the query bar is edit our - // local Query_Bar struct! This is handy because it means our Query_Bar - // is always correct for typical use without extra work updating the bar. - if (in.event.kind == InputEventKind_KeyStroke && - (in.event.key.code == KeyCode_Return || in.event.key.code == KeyCode_Tab)){ - break; - } - else if (in.event.kind == InputEventKind_KeyStroke && - in.event.key.code == KeyCode_Backspace){ - bar->string = backspace_utf8(bar->string); - } - else if (good_insert){ - String_u8 string = Su8(bar->string.str, bar->string.size, bar->string_capacity); - string_append(&string, insert_string); - bar->string.size = string.string.size; - } - else{ - leave_current_input_unhandled(app); - } - } - - return(success); - } - - internal b32 - query_user_string(Application_Links *app, Query_Bar *bar){ - return(query_user_general(app, bar, false, string_u8_empty)); - } - - internal b32 - query_user_number(Application_Links *app, Query_Bar *bar){ -return(query_user_general(app, bar, true, string_u8_empty)); - } - - internal b32 - query_user_number(Application_Links *app, Query_Bar *bar, i32 x){ - Scratch_Block scratch(app); - String_Const_u8 string = push_u8_stringf(scratch, "%d", x); - return(query_user_general(app, bar, true, string)); - } - - //////////////////////////////// - - internal Buffer_Identifier - buffer_identifier(char *str, i32 len){ - Buffer_Identifier identifier; - identifier.name = str; - identifier.name_len = len; - identifier.id = 0; - return(identifier); - } - - internal Buffer_Identifier - buffer_identifier(String_Const_u8 str){ - return(buffer_identifier((char*)str.str, (i32)str.size)); - } - - internal Buffer_Identifier - buffer_identifier(Buffer_ID id){ - Buffer_Identifier identifier; - identifier.name = 0; -identifier.name_len = 0; -identifier.id = id; -return(identifier); - } - - internal Buffer_ID - buffer_identifier_to_id(Application_Links *app, Buffer_Identifier identifier){ -Buffer_ID id = 0; - if (identifier.id != 0){ -id = identifier.id; - } - else{ - String_Const_u8 name = SCu8(identifier.name, identifier.name_len); - id = get_buffer_by_name(app, name, Access_Always); - if (id == 0){ - id = get_buffer_by_file_name(app, name, Access_Always); - } - } - return(id); - } - - internal Buffer_ID - buffer_identifier_to_id_create_out_buffer(Application_Links *app, Buffer_Identifier buffer_id){ - Buffer_ID result = 0; - if (buffer_id.name != 0 && buffer_id.name_len > 0){ - String_Const_u8 buffer_name = SCu8(buffer_id.name, buffer_id.name_len); - Buffer_ID buffer_attach_id = get_buffer_by_name(app, buffer_name, Access_Always); - if (buffer_attach_id != 0){ - result = buffer_attach_id; - } -else{ -buffer_attach_id = create_buffer(app, buffer_name, BufferCreate_AlwaysNew|BufferCreate_NeverAttachToFile); -if (buffer_attach_id != 0){ -buffer_set_setting(app, buffer_attach_id, BufferSetting_ReadOnly, true); - buffer_set_setting(app, buffer_attach_id, BufferSetting_Unimportant, true); - result = buffer_attach_id; -} -} -} -else{ -result = buffer_id.id; - } - return(result); - } - - //////////////////////////////// - - function void -place_begin_and_end_on_own_lines(Application_Links *app, char *begin, char *end){ - View_ID view = get_active_view(app, Access_ReadWriteVisible); - Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible); - - Range_i64 range = get_view_range(app, view); - Range_i64 lines = get_line_range_from_pos_range(app, buffer, range); - range = get_pos_range_from_line_range(app, buffer, lines); - -Scratch_Block scratch(app); - - b32 min_line_blank = line_is_valid_and_blank(app, buffer, lines.min); - b32 max_line_blank = line_is_valid_and_blank(app, buffer, lines.max); - - if ((lines.min < lines.max) || (!min_line_blank)){ - String_Const_u8 begin_str = {}; - String_Const_u8 end_str = {}; - - i64 min_adjustment = 0; - i64 max_adjustment = 0; - - if (min_line_blank){ - begin_str = push_u8_stringf(scratch, "\n%s", begin); - min_adjustment += 1; - } - else{ - begin_str = push_u8_stringf(scratch, "%s\n", begin); - } - if (max_line_blank){ -end_str = push_u8_stringf(scratch, "%s\n", end); - } - else{ - end_str = push_u8_stringf(scratch, "\n%s", end); - max_adjustment += 1; -} - -max_adjustment += begin_str.size; -Range_i64 new_pos = Ii64(range.min + min_adjustment, range.max + max_adjustment); - - History_Group group = history_group_begin(app, buffer); - buffer_replace_range(app, buffer, Ii64(range.min), begin_str); - buffer_replace_range(app, buffer, Ii64(range.max + begin_str.size), end_str); - history_group_end(group); - - set_view_range(app, view, new_pos); - } - else{ - String_Const_u8 str = push_u8_stringf(scratch, "%s\n\n%s", begin, end); - buffer_replace_range(app, buffer, range, str); - i64 center_pos = range.min + cstring_length(begin) + 1; - view_set_cursor_and_preferred_x(app, view, seek_pos(center_pos)); - view_set_mark(app, view, seek_pos(center_pos)); - } - } - - //////////////////////////////// - - function Face_ID - get_view_face_id(Application_Links *app, View_ID view){ - Buffer_ID buffer = view_get_buffer(app, view, Access_Always); - return(get_face_id(app, buffer)); - } - - function Face_Metrics - get_view_face_metrics(Application_Links *app, View_ID view){ - Face_ID face = get_view_face_id(app, view); - return(get_face_metrics(app, face)); - } - - function f32 - get_view_line_height(Application_Links *app, View_ID view){ - Face_Metrics metrics = get_view_face_metrics(app, view); - return(metrics.line_height); - } - -internal View_ID - open_view(Application_Links *app, View_ID view_location, View_Split_Position position){ - View_ID result = 0; - if (view_location != 0 && view_exists(app, view_location)){ - Panel_ID panel_id = view_get_panel(app, view_location); - if (panel_id != 0){ - Dimension split = (position == ViewSplit_Left || - position == ViewSplit_Right)?Dimension_X:Dimension_Y; - Side side = (position == ViewSplit_Left || - position == ViewSplit_Top)?Side_Min:Side_Max; - if (panel_split(app, panel_id, split)){ - Panel_ID new_panel_id = panel_get_child(app, panel_id, side); - if (new_panel_id != 0){ -View_ID new_view_id = panel_get_view(app, new_panel_id, - Access_Always); - if (new_view_id != 0){ - result = new_view_id; - } - } -} -} -} -return(result); -} - -internal View_ID -get_first_view_with_buffer(Application_Links *app, Buffer_ID buffer_id){ - View_ID result = {}; - if (buffer_id != 0){ -for (View_ID test = get_view_next(app, 0, Access_Always); -test != 0; - test = get_view_next(app, test, Access_Always)){ - Buffer_ID test_buffer = view_get_buffer(app, test, Access_Always); - if (test_buffer == buffer_id){ - result = test; - break; - } - } - } - return(result); - } - - internal b32 -open_file(Application_Links *app, Buffer_ID *buffer_out, String_Const_u8 file_name, b32 background, b32 never_new){ - b32 result = false; -Buffer_ID buffer = get_buffer_by_name(app, file_name, Access_ReadVisible); - b32 exists = buffer_exists(app, buffer); - if (!exists){ - Buffer_Create_Flag flags = 0; - if (background){ - flags |= BufferCreate_Background; - } - if (never_new){ - flags |= BufferCreate_NeverNew; - } - buffer = create_buffer(app, file_name, flags); - exists = buffer_exists(app, buffer); - } - if (exists){ - if (buffer_out != 0){ - *buffer_out = buffer; - } - result = true; - } - return(result); - } - -internal b32 -view_open_file(Application_Links *app, View_ID view, String_Const_u8 file_name, b32 never_new){ - b32 result = false; - if (view != 0){ - Buffer_ID buffer = 0; - if (open_file(app, &buffer, file_name, false, never_new)){ - view_set_buffer(app, view, buffer, 0); - result = true; - } -} - return(result); -} - -internal void -view_disable_highlight_range(Application_Links *app, View_ID view){ - Managed_Scope scope = view_get_managed_scope(app, view); - Managed_Object *highlight = scope_attachment(app, scope, view_highlight_range, Managed_Object); - if (*highlight != 0){ - managed_object_free(app, *highlight); - } - managed_scope_attachment_erase(app, scope, view_highlight_range); -managed_scope_attachment_erase(app, scope, view_highlight_buffer); - } - - internal void - view_set_highlight_range(Application_Links *app, View_ID view, Range_i64 range){ - view_disable_highlight_range(app, view); - - Buffer_ID buffer = view_get_buffer(app, view, Access_Always); - Managed_Scope scope = view_get_managed_scope(app, view); - Managed_Object *highlight = scope_attachment(app, scope, view_highlight_range, Managed_Object); - *highlight = alloc_buffer_markers_on_buffer(app, buffer, 2, &scope); -Marker markers[2] = {}; -markers[0].pos = range.min; - markers[1].pos = range.max; - managed_object_store_data(app, *highlight, 0, 2, markers); - Buffer_ID *highlight_buffer = scope_attachment(app, scope, view_highlight_buffer, Buffer_ID); - *highlight_buffer = buffer; -} - - function void - view_look_at_region(Application_Links *app, View_ID view, i64 major_pos, i64 minor_pos){ - Range_i64 range = Ii64(major_pos, minor_pos); - b32 bottom_major = false; - if (major_pos == range.max){ - bottom_major = true; -} - -Buffer_Cursor top = view_compute_cursor(app, view, seek_pos(range.min)); - if (top.line > 0){ - Buffer_Cursor bottom = view_compute_cursor(app, view, seek_pos(range.max)); - if (bottom.line > 0){ - Rect_f32 region = view_get_buffer_region(app, view); - f32 view_height = rect_height(region); -f32 skirt_height = view_height*.1f; - Range_f32 acceptable_y = If32(skirt_height, view_height*.9f); - - f32 target_height = view_line_y_difference(app, view, bottom.line + 1, top.line); - -f32 line_height = get_view_line_height(app, view); - if (target_height + 2*line_height > view_height){ - i64 major_line = bottom.line; - if (range.min == major_pos){ - major_line = top.line; - } - - Buffer_Scroll scroll = view_get_buffer_scroll(app, view); - scroll.target.line_number = major_line; - scroll.target.pixel_shift.y = -skirt_height; - view_set_buffer_scroll(app, view, scroll, SetBufferScroll_SnapCursorIntoView); - } -else{ - Buffer_Scroll scroll = view_get_buffer_scroll(app, view); - Vec2_f32 top_p = view_relative_xy_of_pos(app, view, scroll.position.line_number, range.min); - top_p -= scroll.position.pixel_shift; -if (top_p.y < acceptable_y.min){ - scroll.target.line_number = top.line; - scroll.target.pixel_shift.y = -skirt_height; - view_set_buffer_scroll(app, view, scroll, SetBufferScroll_NoCursorChange); - } - else{ - Vec2_f32 bot_p = view_relative_xy_of_pos(app, view, scroll.position.line_number, range.max); - bot_p -= scroll.position.pixel_shift; - if (bot_p.y > acceptable_y.max){ - scroll.target.line_number = bottom.line; - scroll.target.pixel_shift.y = skirt_height - view_height; - view_set_buffer_scroll(app, view, scroll, SetBufferScroll_NoCursorChange); - } - } - } -} - } - } - - function void - view_look_at_region(Application_Links *app, View_ID view, Range_i64 range){ - view_look_at_region(app, view, range.min, range.max); - } - - //////////////////////////////// - - function Buffer_ID - get_buffer_next_looped(Application_Links *app, Buffer_ID buffer, Access_Flag access){ - buffer = get_buffer_next(app, buffer, access); - if (buffer == 0){ -buffer = get_buffer_next(app, 0, access); - } - return(buffer); - } - - //////////////////////////////// - - internal View_ID - get_next_view_looped_all_panels(Application_Links *app, View_ID view_id, Access_Flag access){ -view_id = get_view_next(app, view_id, access); - if (view_id == 0){ - view_id = get_view_next(app, 0, access); -} - return(view_id); - } - - internal View_ID - get_prev_view_looped_all_panels(Application_Links *app, View_ID view_id, Access_Flag access){ - view_id = get_view_prev(app, view_id, access); - if (view_id == 0){ - view_id = get_view_prev(app, 0, access); - } - return(view_id); - } - - //////////////////////////////// - - internal Buffer_Kill_Result - try_buffer_kill(Application_Links *app, Buffer_ID buffer, View_ID gui_view_id, Buffer_Kill_Flag flags){ - Buffer_Kill_Result result = buffer_kill(app, buffer, flags); - if (result == BufferKillResult_Dirty){ - if (do_buffer_kill_user_check(app, buffer, gui_view_id)){ - result = buffer_kill(app, buffer, BufferKill_AlwaysKill); -} - } - return(result); - } - - //////////////////////////////// - - internal String_Const_u8 -get_query_string(Application_Links *app, char *query_str, u8 *string_space, i32 space_size){ - Query_Bar_Group group(app); -Query_Bar bar = {}; -bar.prompt = SCu8((u8*)query_str); -bar.string = SCu8(string_space, (u64)0); -bar.string_capacity = space_size; -if (!query_user_string(app, &bar)){ - bar.string.size = 0; - } - return(bar.string); - } - -internal Token* - get_token_from_pos(Application_Links *app, Token_Array *array, u64 pos){ - Token *result = 0; - if (array->count > 0){ - i64 index = token_index_from_pos(array, pos); -result = array->tokens + index; -} -return(result); -} - -internal Token* -get_token_from_pos(Application_Links *app, Buffer_ID buffer, u64 pos){ - Token_Array array = get_token_array_from_buffer(app, buffer); -return(get_token_from_pos(app, &array, pos)); -} - -internal String_Const_u8 - push_token_or_word_under_pos(Application_Links *app, Arena *arena, Buffer_ID buffer, u64 pos){ - String_Const_u8 result = {}; -Token *token = get_token_from_pos(app, buffer, pos); -if (token != 0 && token->size > 0 && token->kind != TokenBaseKind_Whitespace){ - Range_i64 range = Ii64(token); - result = push_buffer_range(app, arena, buffer, range); - } - return(result); -} - - internal String_Const_u8 - push_token_or_word_under_active_cursor(Application_Links *app, Arena *arena){ - View_ID view = get_active_view(app, Access_Always); - Buffer_ID buffer = view_get_buffer(app, view, Access_Always); - i64 pos = view_get_cursor_pos(app, view); -return(push_token_or_word_under_pos(app, arena, buffer, pos)); - } - - //////////////////////////////// - - internal b32 -file_exists(Application_Links *app, String_Const_u8 file_name){ - Scratch_Block scratch(app); - File_Attributes attributes = system_quick_file_attributes(scratch, file_name); -return(attributes.last_write_time > 0); - } - - internal b32 - file_exists_and_is_file(Application_Links *app, String_Const_u8 file_name){ - Scratch_Block scratch(app); -File_Attributes attributes = system_quick_file_attributes(scratch, file_name); - return(attributes.last_write_time > 0 && !HasFlag(attributes.flags, FileAttribute_IsDirectory)); - } - - internal b32 - file_exists_and_is_folder(Application_Links *app, String_Const_u8 file_name){ - Scratch_Block scratch(app); -File_Attributes attributes = system_quick_file_attributes(scratch, file_name); - return(attributes.last_write_time > 0 && HasFlag(attributes.flags, FileAttribute_IsDirectory)); - } - -internal Data - dump_file_handle(Arena *arena, FILE *file){ -Data result = {}; - if (file != 0){ - fseek(file, 0, SEEK_END); - u64 size = ftell(file); - char *mem = push_array(arena, char, size); - if (mem != 0){ - fseek(file, 0, SEEK_SET); - fread(mem, 1, (size_t)size, file); - result = make_data(mem, size); - } - } - return(result); - } - -internal String_Const_u8 -push_file_search_up_path(Application_Links *app, Arena *arena, String_Const_u8 start_path, String_Const_u8 file_name){ -String_Const_u8 result = {}; -String_Const_u8 path = start_path; -for (;path.size > 0;){ - Temp_Memory temp = begin_temp(arena); - if (character_is_slash(string_get_character(path, path.size - 1))){ - path = string_chop(path, 1); - } - String_Const_u8 full_path = push_u8_stringf(arena, "%.*s/%.*s", - string_expand(path), -string_expand(file_name)); - if (file_exists(app, full_path)){ - result = full_path; - break; - } - path = string_remove_last_folder(path); - end_temp(temp); - } - return(result); - } - - internal FILE* - open_file_try_current_path_then_binary_path(Application_Links *app, char *file_name){ - FILE *file = fopen(file_name, "rb"); - if (file == 0){ -Scratch_Block scratch(app); - List_String_Const_u8 list = {}; - string_list_push(scratch, &list, system_get_path(scratch, SystemPath_Binary)); - string_list_push_overlap(scratch, &list, '/', SCu8(file_name)); - String_Const_u8 str = string_list_flatten(scratch, list, StringFill_NullTerminate); -file = fopen((char*)str.str, "rb"); -} -return(file); -} - -internal FILE* -open_file(Arena *scratch, String_Const_u8 name){ -Temp_Memory temp = begin_temp(scratch); - String_Const_u8 name_copy = push_string_copy(scratch, name); - FILE *file = fopen((char*)name_copy.str, "rb"); - end_temp(temp); - return(file); - } - - internal File_Name_Data - dump_file(Arena *arena, String_Const_u8 file_name){ -File_Name_Data result = {}; - FILE *file = open_file(arena, file_name); -if (file != 0){ - result.file_name = file_name; - result.data = dump_file_handle(arena, file); -fclose(file); - } -return(result); - } - - internal File_Name_Data - dump_file_search_up_path(Application_Links *app, Arena *arena, String_Const_u8 path, String_Const_u8 file_name){ - File_Name_Data result = {}; - String_Const_u8 full_path = push_file_search_up_path(app, arena, path, file_name); - if (full_path.size > 0){ - result = dump_file(arena, full_path); -} -return(result); -} - -internal void -sort_pairs_by_key__quick(Sort_Pair_i32 *pairs, i32 first, i32 one_past_last){ - i32 dif = one_past_last - first; - if (dif >= 2){ - i32 pivot = one_past_last - 1; - Sort_Pair_i32 pivot_pair = pairs[pivot]; - i32 j = first; - b32 interleave = false; - for (i32 i = first; i < pivot; i += 1){ - Sort_Pair_i32 pair = pairs[i]; - if (pair.key < pivot_pair.key){ - pairs[i] = pairs[j]; - pairs[j] = pair; - j += 1; -} - else if (pair.key == pivot_pair.key){ - if (interleave){ - pairs[i] = pairs[j]; - pairs[j] = pair; - j += 1; - } - interleave = !interleave; - } - } - pairs[pivot] = pairs[j]; - pairs[j] = pivot_pair; - sort_pairs_by_key__quick(pairs, first, j); - sort_pairs_by_key__quick(pairs, j + 1, one_past_last); - } - } - - internal void - sort_pairs_by_key(Sort_Pair_i32 *pairs, i32 count){ - sort_pairs_by_key__quick(pairs, 0, count); - } - - internal Range_i32_Array - get_ranges_of_duplicate_keys(Arena *arena, i32 *keys, i32 stride, i32 count){ - Range_i32_Array result = {}; - result.ranges = push_array(arena, Range_i32, count); -u8 *ptr = (u8*)keys; - i32 start_i = 0; - for (i32 i = 1; i <= count; i += 1){ - b32 is_end = false; - if (i == count){ - is_end = true; - } - else if (*(i32*)(ptr + i*stride) != *(i32*)(ptr + start_i*stride)){ - is_end = true; - } - if (is_end){ - Range_i32 *new_range = &result.ranges[result.count++]; - new_range->first = start_i; -new_range->one_past_last = i; - start_i = i; - } - } - pop_array(arena, Range_i32, count - result.count); - return(result); - } - - internal void - no_mark_snap_to_cursor(Application_Links *app, Managed_Scope view_scope){ - b32 *snap_to_cursor = scope_attachment(app, view_scope, view_snap_mark_to_cursor, b32); - *snap_to_cursor = false; - } - - internal void - no_mark_snap_to_cursor(Application_Links *app, View_ID view_id){ - Managed_Scope scope = view_get_managed_scope(app, view_id); - no_mark_snap_to_cursor(app, scope); - } - - internal void - no_mark_snap_to_cursor_if_shift(Application_Links *app, View_ID view_id){ - Scratch_Block scratch(app); - Input_Modifier_Set mods = system_get_keyboard_modifiers(scratch); - if (has_modifier(&mods, KeyCode_Shift)){ -no_mark_snap_to_cursor(app, view_id); - } - } - - internal b32 - view_has_highlighted_range(Application_Links *app, View_ID view){ -b32 result = false; - if (fcoder_mode == FCoderMode_NotepadLike){ - i64 pos = view_get_cursor_pos(app, view); -i64 mark = view_get_mark_pos(app, view); -result = (pos != mark); -} -return(result); -} - -internal b32 - if_view_has_highlighted_range_delete_range(Application_Links *app, View_ID view_id){ - b32 result = false; - if (view_has_highlighted_range(app, view_id)){ - Range_i64 range = get_view_range(app, view_id); - Buffer_ID buffer = view_get_buffer(app, view_id, Access_ReadWriteVisible); - buffer_replace_range(app, buffer, range, string_u8_litexpr("")); - result = true; - } - return(result); - } - - internal void - begin_notepad_mode(Application_Links *app){ - fcoder_mode = FCoderMode_NotepadLike; -for (View_ID view = get_view_next(app, 0, Access_Always); - view != 0; -view = get_view_next(app, view, Access_Always)){ - i64 pos = view_get_cursor_pos(app, view); - view_set_mark(app, view, seek_pos(pos)); -} } //////////////////////////////// - internal void +Query_Bar_Group::Query_Bar_Group(Application_Links *app){ + this->app = app; + this->view = get_active_view(app, Access_Always); +} + +Query_Bar_Group::Query_Bar_Group(Application_Links *app, View_ID view){ + this->app = app; + this->view = view; +} + +Query_Bar_Group::~Query_Bar_Group(){ + clear_all_query_bars(this->app, this->view); +} + +internal b32 +query_user_general(Application_Links *app, Query_Bar *bar, b32 force_number, String_Const_u8 init_string){ + if (start_query_bar(app, bar, 0) == 0){ + return(false); + } + + if (init_string.size > 0){ + String_u8 string = Su8(bar->string.str, bar->string.size, bar->string_capacity); + string_append(&string, init_string); + bar->string.size = string.string.size; + } + + b32 success = true; + for (;;){ + User_Input in = get_next_input(app, EventPropertyGroup_Any, + EventProperty_Escape|EventProperty_MouseButton); + if (in.abort){ + success = false; + break; + } + + Scratch_Block scratch(app); + b32 good_insert = false; + String_Const_u8 insert_string = to_writable(&in); + if (insert_string.str != 0 && insert_string.size > 0){ + insert_string = string_replace(scratch, insert_string, + string_u8_litexpr("\n"), + string_u8_litexpr("")); + insert_string = string_replace(scratch, insert_string, + string_u8_litexpr("\t"), + string_u8_litexpr("")); + if (force_number){ + if (string_is_integer(insert_string, 10)){ + good_insert = true; + } + } + else{ + good_insert = true; + } + } + + if (in.event.kind == InputEventKind_KeyStroke && + (in.event.key.code == KeyCode_Return || in.event.key.code == KeyCode_Tab)){ + break; + } + else if (in.event.kind == InputEventKind_KeyStroke && + in.event.key.code == KeyCode_Backspace){ + bar->string = backspace_utf8(bar->string); + } + else if (good_insert){ + String_u8 string = Su8(bar->string.str, bar->string.size, bar->string_capacity); + string_append(&string, insert_string); + bar->string.size = string.string.size; + } + else{ + // NOTE(allen): is the user trying to execute another command? + View_ID view = get_this_ctx_view(app, Access_Always); + View_Context ctx = view_current_context(app, view); + Mapping *mapping = ctx.mapping; + Command_Map *map = mapping_get_map(mapping, ctx.map_id); + Command_Binding binding = map_get_binding_recursive(mapping, map, &in.event); + if (binding.custom != 0){ + Command_Metadata *metadata = get_command_metadata(binding.custom); + if (metadata != 0){ + if (metadata->is_ui){ + view_enqueue_command_function(app, view, binding.custom); + break; + } + } + binding.custom(app); + } + else{ + leave_current_input_unhandled(app); + } + } + } + + return(success); +} + +internal b32 +query_user_string(Application_Links *app, Query_Bar *bar){ + return(query_user_general(app, bar, false, string_u8_empty)); +} + +internal b32 +query_user_number(Application_Links *app, Query_Bar *bar){ + return(query_user_general(app, bar, true, string_u8_empty)); +} + +internal b32 +query_user_number(Application_Links *app, Query_Bar *bar, i32 x){ + Scratch_Block scratch(app); + String_Const_u8 string = push_u8_stringf(scratch, "%d", x); + return(query_user_general(app, bar, true, string)); +} + +//////////////////////////////// + +internal Buffer_Identifier +buffer_identifier(char *str, i32 len){ + Buffer_Identifier identifier; + identifier.name = str; + identifier.name_len = len; + identifier.id = 0; + return(identifier); +} + +internal Buffer_Identifier +buffer_identifier(String_Const_u8 str){ + return(buffer_identifier((char*)str.str, (i32)str.size)); +} + +internal Buffer_Identifier +buffer_identifier(Buffer_ID id){ + Buffer_Identifier identifier; + identifier.name = 0; + identifier.name_len = 0; + identifier.id = id; + return(identifier); +} + +internal Buffer_ID +buffer_identifier_to_id(Application_Links *app, Buffer_Identifier identifier){ + Buffer_ID id = 0; + if (identifier.id != 0){ + id = identifier.id; + } + else{ + String_Const_u8 name = SCu8(identifier.name, identifier.name_len); + id = get_buffer_by_name(app, name, Access_Always); + if (id == 0){ + id = get_buffer_by_file_name(app, name, Access_Always); + } + } + return(id); +} + +internal Buffer_ID +buffer_identifier_to_id_create_out_buffer(Application_Links *app, Buffer_Identifier buffer_id){ + Buffer_ID result = 0; + if (buffer_id.name != 0 && buffer_id.name_len > 0){ + String_Const_u8 buffer_name = SCu8(buffer_id.name, buffer_id.name_len); + Buffer_ID buffer_attach_id = get_buffer_by_name(app, buffer_name, Access_Always); + if (buffer_attach_id != 0){ + result = buffer_attach_id; + } + else{ + buffer_attach_id = create_buffer(app, buffer_name, BufferCreate_AlwaysNew|BufferCreate_NeverAttachToFile); + if (buffer_attach_id != 0){ + buffer_set_setting(app, buffer_attach_id, BufferSetting_ReadOnly, true); + buffer_set_setting(app, buffer_attach_id, BufferSetting_Unimportant, true); + result = buffer_attach_id; + } + } + } + else{ + result = buffer_id.id; + } + return(result); +} + +//////////////////////////////// + +function void +place_begin_and_end_on_own_lines(Application_Links *app, char *begin, char *end){ + View_ID view = get_active_view(app, Access_ReadWriteVisible); + Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible); + + Range_i64 range = get_view_range(app, view); + Range_i64 lines = get_line_range_from_pos_range(app, buffer, range); + range = get_pos_range_from_line_range(app, buffer, lines); + + Scratch_Block scratch(app); + + b32 min_line_blank = line_is_valid_and_blank(app, buffer, lines.min); + b32 max_line_blank = line_is_valid_and_blank(app, buffer, lines.max); + + if ((lines.min < lines.max) || (!min_line_blank)){ + String_Const_u8 begin_str = {}; + String_Const_u8 end_str = {}; + + i64 min_adjustment = 0; + i64 max_adjustment = 0; + + if (min_line_blank){ + begin_str = push_u8_stringf(scratch, "\n%s", begin); + min_adjustment += 1; + } + else{ + begin_str = push_u8_stringf(scratch, "%s\n", begin); + } + if (max_line_blank){ + end_str = push_u8_stringf(scratch, "%s\n", end); + } + else{ + end_str = push_u8_stringf(scratch, "\n%s", end); + max_adjustment += 1; + } + + max_adjustment += begin_str.size; + Range_i64 new_pos = Ii64(range.min + min_adjustment, range.max + max_adjustment); + + History_Group group = history_group_begin(app, buffer); + buffer_replace_range(app, buffer, Ii64(range.min), begin_str); + buffer_replace_range(app, buffer, Ii64(range.max + begin_str.size), end_str); + history_group_end(group); + + set_view_range(app, view, new_pos); + } + else{ + String_Const_u8 str = push_u8_stringf(scratch, "%s\n\n%s", begin, end); + buffer_replace_range(app, buffer, range, str); + i64 center_pos = range.min + cstring_length(begin) + 1; + view_set_cursor_and_preferred_x(app, view, seek_pos(center_pos)); + view_set_mark(app, view, seek_pos(center_pos)); + } +} + +//////////////////////////////// + +function Face_ID +get_view_face_id(Application_Links *app, View_ID view){ + Buffer_ID buffer = view_get_buffer(app, view, Access_Always); + return(get_face_id(app, buffer)); +} + +function Face_Metrics +get_view_face_metrics(Application_Links *app, View_ID view){ + Face_ID face = get_view_face_id(app, view); + return(get_face_metrics(app, face)); +} + +function f32 +get_view_line_height(Application_Links *app, View_ID view){ + Face_Metrics metrics = get_view_face_metrics(app, view); + return(metrics.line_height); +} + +internal View_ID +open_view(Application_Links *app, View_ID view_location, View_Split_Position position){ + View_ID result = 0; + if (view_location != 0 && view_exists(app, view_location)){ + Panel_ID panel_id = view_get_panel(app, view_location); + if (panel_id != 0){ + Dimension split = (position == ViewSplit_Left || + position == ViewSplit_Right)?Dimension_X:Dimension_Y; + Side side = (position == ViewSplit_Left || + position == ViewSplit_Top)?Side_Min:Side_Max; + if (panel_split(app, panel_id, split)){ + Panel_ID new_panel_id = panel_get_child(app, panel_id, side); + if (new_panel_id != 0){ + View_ID new_view_id = panel_get_view(app, new_panel_id, + Access_Always); + if (new_view_id != 0){ + result = new_view_id; + } + } + } + } + } + return(result); +} + +internal View_ID +get_first_view_with_buffer(Application_Links *app, Buffer_ID buffer_id){ + View_ID result = {}; + if (buffer_id != 0){ + for (View_ID test = get_view_next(app, 0, Access_Always); + test != 0; + test = get_view_next(app, test, Access_Always)){ + Buffer_ID test_buffer = view_get_buffer(app, test, Access_Always); + if (test_buffer == buffer_id){ + result = test; + break; + } + } + } + return(result); +} + +internal b32 +open_file(Application_Links *app, Buffer_ID *buffer_out, String_Const_u8 file_name, b32 background, b32 never_new){ + b32 result = false; + Buffer_ID buffer = get_buffer_by_name(app, file_name, Access_ReadVisible); + b32 exists = buffer_exists(app, buffer); + if (!exists){ + Buffer_Create_Flag flags = 0; + if (background){ + flags |= BufferCreate_Background; + } + if (never_new){ + flags |= BufferCreate_NeverNew; + } + buffer = create_buffer(app, file_name, flags); + exists = buffer_exists(app, buffer); + } + if (exists){ + if (buffer_out != 0){ + *buffer_out = buffer; + } + result = true; + } + return(result); +} + +internal b32 +view_open_file(Application_Links *app, View_ID view, String_Const_u8 file_name, b32 never_new){ + b32 result = false; + if (view != 0){ + Buffer_ID buffer = 0; + if (open_file(app, &buffer, file_name, false, never_new)){ + view_set_buffer(app, view, buffer, 0); + result = true; + } + } + return(result); +} + +internal void +view_disable_highlight_range(Application_Links *app, View_ID view){ + Managed_Scope scope = view_get_managed_scope(app, view); + Managed_Object *highlight = scope_attachment(app, scope, view_highlight_range, Managed_Object); + if (*highlight != 0){ + managed_object_free(app, *highlight); + } + managed_scope_attachment_erase(app, scope, view_highlight_range); + managed_scope_attachment_erase(app, scope, view_highlight_buffer); +} + +internal void +view_set_highlight_range(Application_Links *app, View_ID view, Range_i64 range){ + view_disable_highlight_range(app, view); + + Buffer_ID buffer = view_get_buffer(app, view, Access_Always); + Managed_Scope scope = view_get_managed_scope(app, view); + Managed_Object *highlight = scope_attachment(app, scope, view_highlight_range, Managed_Object); + *highlight = alloc_buffer_markers_on_buffer(app, buffer, 2, &scope); + Marker markers[2] = {}; + markers[0].pos = range.min; + markers[1].pos = range.max; + managed_object_store_data(app, *highlight, 0, 2, markers); + Buffer_ID *highlight_buffer = scope_attachment(app, scope, view_highlight_buffer, Buffer_ID); + *highlight_buffer = buffer; +} + +function void +view_look_at_region(Application_Links *app, View_ID view, i64 major_pos, i64 minor_pos){ + Range_i64 range = Ii64(major_pos, minor_pos); + b32 bottom_major = false; + if (major_pos == range.max){ + bottom_major = true; + } + + Buffer_Cursor top = view_compute_cursor(app, view, seek_pos(range.min)); + if (top.line > 0){ + Buffer_Cursor bottom = view_compute_cursor(app, view, seek_pos(range.max)); + if (bottom.line > 0){ + Rect_f32 region = view_get_buffer_region(app, view); + f32 view_height = rect_height(region); + f32 skirt_height = view_height*.1f; + Range_f32 acceptable_y = If32(skirt_height, view_height*.9f); + + f32 target_height = view_line_y_difference(app, view, bottom.line + 1, top.line); + + f32 line_height = get_view_line_height(app, view); + if (target_height + 2*line_height > view_height){ + i64 major_line = bottom.line; + if (range.min == major_pos){ + major_line = top.line; + } + + Buffer_Scroll scroll = view_get_buffer_scroll(app, view); + scroll.target.line_number = major_line; + scroll.target.pixel_shift.y = -skirt_height; + view_set_buffer_scroll(app, view, scroll, SetBufferScroll_SnapCursorIntoView); + } + else{ + Buffer_Scroll scroll = view_get_buffer_scroll(app, view); + Vec2_f32 top_p = view_relative_xy_of_pos(app, view, scroll.position.line_number, range.min); + top_p -= scroll.position.pixel_shift; + if (top_p.y < acceptable_y.min){ + scroll.target.line_number = top.line; + scroll.target.pixel_shift.y = -skirt_height; + view_set_buffer_scroll(app, view, scroll, SetBufferScroll_NoCursorChange); + } + else{ + Vec2_f32 bot_p = view_relative_xy_of_pos(app, view, scroll.position.line_number, range.max); + bot_p -= scroll.position.pixel_shift; + if (bot_p.y > acceptable_y.max){ + scroll.target.line_number = bottom.line; + scroll.target.pixel_shift.y = skirt_height - view_height; + view_set_buffer_scroll(app, view, scroll, SetBufferScroll_NoCursorChange); + } + } + } + } + } +} + +function void +view_look_at_region(Application_Links *app, View_ID view, Range_i64 range){ + view_look_at_region(app, view, range.min, range.max); +} + +//////////////////////////////// + +function Buffer_ID +get_buffer_next_looped(Application_Links *app, Buffer_ID buffer, Access_Flag access){ + buffer = get_buffer_next(app, buffer, access); + if (buffer == 0){ + buffer = get_buffer_next(app, 0, access); + } + return(buffer); +} + +//////////////////////////////// + +internal View_ID +get_next_view_looped_all_panels(Application_Links *app, View_ID view_id, Access_Flag access){ + view_id = get_view_next(app, view_id, access); + if (view_id == 0){ + view_id = get_view_next(app, 0, access); + } + return(view_id); +} + +internal View_ID +get_prev_view_looped_all_panels(Application_Links *app, View_ID view_id, Access_Flag access){ + view_id = get_view_prev(app, view_id, access); + if (view_id == 0){ + view_id = get_view_prev(app, 0, access); + } + return(view_id); +} + +//////////////////////////////// + +internal Buffer_Kill_Result +try_buffer_kill(Application_Links *app, Buffer_ID buffer, View_ID gui_view_id, Buffer_Kill_Flag flags){ + Buffer_Kill_Result result = buffer_kill(app, buffer, flags); + if (result == BufferKillResult_Dirty){ + if (do_buffer_kill_user_check(app, buffer, gui_view_id)){ + result = buffer_kill(app, buffer, BufferKill_AlwaysKill); + } + } + return(result); +} + +//////////////////////////////// + +internal String_Const_u8 +get_query_string(Application_Links *app, char *query_str, u8 *string_space, i32 space_size){ + Query_Bar_Group group(app); + Query_Bar bar = {}; + bar.prompt = SCu8((u8*)query_str); + bar.string = SCu8(string_space, (u64)0); + bar.string_capacity = space_size; + if (!query_user_string(app, &bar)){ + bar.string.size = 0; + } + return(bar.string); +} + +internal Token* +get_token_from_pos(Application_Links *app, Token_Array *array, u64 pos){ + Token *result = 0; + if (array->count > 0){ + i64 index = token_index_from_pos(array, pos); + result = array->tokens + index; + } + return(result); +} + +internal Token* +get_token_from_pos(Application_Links *app, Buffer_ID buffer, u64 pos){ + Token_Array array = get_token_array_from_buffer(app, buffer); + return(get_token_from_pos(app, &array, pos)); +} + +internal String_Const_u8 +push_token_or_word_under_pos(Application_Links *app, Arena *arena, Buffer_ID buffer, u64 pos){ + String_Const_u8 result = {}; + Token *token = get_token_from_pos(app, buffer, pos); + if (token != 0 && token->size > 0 && token->kind != TokenBaseKind_Whitespace){ + Range_i64 range = Ii64(token); + result = push_buffer_range(app, arena, buffer, range); + } + return(result); +} + +internal String_Const_u8 +push_token_or_word_under_active_cursor(Application_Links *app, Arena *arena){ + View_ID view = get_active_view(app, Access_Always); + Buffer_ID buffer = view_get_buffer(app, view, Access_Always); + i64 pos = view_get_cursor_pos(app, view); + return(push_token_or_word_under_pos(app, arena, buffer, pos)); +} + +//////////////////////////////// + +internal b32 +file_exists(Application_Links *app, String_Const_u8 file_name){ + Scratch_Block scratch(app); + File_Attributes attributes = system_quick_file_attributes(scratch, file_name); + return(attributes.last_write_time > 0); +} + +internal b32 +file_exists_and_is_file(Application_Links *app, String_Const_u8 file_name){ + Scratch_Block scratch(app); + File_Attributes attributes = system_quick_file_attributes(scratch, file_name); + return(attributes.last_write_time > 0 && !HasFlag(attributes.flags, FileAttribute_IsDirectory)); +} + +internal b32 +file_exists_and_is_folder(Application_Links *app, String_Const_u8 file_name){ + Scratch_Block scratch(app); + File_Attributes attributes = system_quick_file_attributes(scratch, file_name); + return(attributes.last_write_time > 0 && HasFlag(attributes.flags, FileAttribute_IsDirectory)); +} + +internal Data +dump_file_handle(Arena *arena, FILE *file){ + Data result = {}; + if (file != 0){ + fseek(file, 0, SEEK_END); + u64 size = ftell(file); + char *mem = push_array(arena, char, size); + if (mem != 0){ + fseek(file, 0, SEEK_SET); + fread(mem, 1, (size_t)size, file); + result = make_data(mem, size); + } + } + return(result); +} + +internal String_Const_u8 +push_file_search_up_path(Application_Links *app, Arena *arena, String_Const_u8 start_path, String_Const_u8 file_name){ + String_Const_u8 result = {}; + String_Const_u8 path = start_path; + for (;path.size > 0;){ + Temp_Memory temp = begin_temp(arena); + if (character_is_slash(string_get_character(path, path.size - 1))){ + path = string_chop(path, 1); + } + String_Const_u8 full_path = push_u8_stringf(arena, "%.*s/%.*s", + string_expand(path), + string_expand(file_name)); + if (file_exists(app, full_path)){ + result = full_path; + break; + } + path = string_remove_last_folder(path); + end_temp(temp); + } + return(result); +} + +internal FILE* +open_file_try_current_path_then_binary_path(Application_Links *app, char *file_name){ + FILE *file = fopen(file_name, "rb"); + if (file == 0){ + Scratch_Block scratch(app); + List_String_Const_u8 list = {}; + string_list_push(scratch, &list, system_get_path(scratch, SystemPath_Binary)); + string_list_push_overlap(scratch, &list, '/', SCu8(file_name)); + String_Const_u8 str = string_list_flatten(scratch, list, StringFill_NullTerminate); + file = fopen((char*)str.str, "rb"); + } + return(file); +} + +internal FILE* +open_file(Arena *scratch, String_Const_u8 name){ + Temp_Memory temp = begin_temp(scratch); + String_Const_u8 name_copy = push_string_copy(scratch, name); + FILE *file = fopen((char*)name_copy.str, "rb"); + end_temp(temp); + return(file); +} + +internal File_Name_Data +dump_file(Arena *arena, String_Const_u8 file_name){ + File_Name_Data result = {}; + FILE *file = open_file(arena, file_name); + if (file != 0){ + result.file_name = file_name; + result.data = dump_file_handle(arena, file); + fclose(file); + } + return(result); +} + +internal File_Name_Data +dump_file_search_up_path(Application_Links *app, Arena *arena, String_Const_u8 path, String_Const_u8 file_name){ + File_Name_Data result = {}; + String_Const_u8 full_path = push_file_search_up_path(app, arena, path, file_name); + if (full_path.size > 0){ + result = dump_file(arena, full_path); + } + return(result); +} + +internal void +sort_pairs_by_key__quick(Sort_Pair_i32 *pairs, i32 first, i32 one_past_last){ + i32 dif = one_past_last - first; + if (dif >= 2){ + i32 pivot = one_past_last - 1; + Sort_Pair_i32 pivot_pair = pairs[pivot]; + i32 j = first; + b32 interleave = false; + for (i32 i = first; i < pivot; i += 1){ + Sort_Pair_i32 pair = pairs[i]; + if (pair.key < pivot_pair.key){ + pairs[i] = pairs[j]; + pairs[j] = pair; + j += 1; + } + else if (pair.key == pivot_pair.key){ + if (interleave){ + pairs[i] = pairs[j]; + pairs[j] = pair; + j += 1; + } + interleave = !interleave; + } + } + pairs[pivot] = pairs[j]; + pairs[j] = pivot_pair; + sort_pairs_by_key__quick(pairs, first, j); + sort_pairs_by_key__quick(pairs, j + 1, one_past_last); + } +} + +internal void +sort_pairs_by_key(Sort_Pair_i32 *pairs, i32 count){ + sort_pairs_by_key__quick(pairs, 0, count); +} + +internal Range_i32_Array +get_ranges_of_duplicate_keys(Arena *arena, i32 *keys, i32 stride, i32 count){ + Range_i32_Array result = {}; + result.ranges = push_array(arena, Range_i32, count); + u8 *ptr = (u8*)keys; + i32 start_i = 0; + for (i32 i = 1; i <= count; i += 1){ + b32 is_end = false; + if (i == count){ + is_end = true; + } + else if (*(i32*)(ptr + i*stride) != *(i32*)(ptr + start_i*stride)){ + is_end = true; + } + if (is_end){ + Range_i32 *new_range = &result.ranges[result.count++]; + new_range->first = start_i; + new_range->one_past_last = i; + start_i = i; + } + } + pop_array(arena, Range_i32, count - result.count); + return(result); +} + +internal void +no_mark_snap_to_cursor(Application_Links *app, Managed_Scope view_scope){ + b32 *snap_to_cursor = scope_attachment(app, view_scope, view_snap_mark_to_cursor, b32); + *snap_to_cursor = false; +} + +internal void +no_mark_snap_to_cursor(Application_Links *app, View_ID view_id){ + Managed_Scope scope = view_get_managed_scope(app, view_id); + no_mark_snap_to_cursor(app, scope); +} + +internal void +no_mark_snap_to_cursor_if_shift(Application_Links *app, View_ID view_id){ + Scratch_Block scratch(app); + Input_Modifier_Set mods = system_get_keyboard_modifiers(scratch); + if (has_modifier(&mods, KeyCode_Shift)){ + no_mark_snap_to_cursor(app, view_id); + } +} + +internal b32 +view_has_highlighted_range(Application_Links *app, View_ID view){ + b32 result = false; + if (fcoder_mode == FCoderMode_NotepadLike){ + i64 pos = view_get_cursor_pos(app, view); + i64 mark = view_get_mark_pos(app, view); + result = (pos != mark); + } + return(result); +} + +internal b32 +if_view_has_highlighted_range_delete_range(Application_Links *app, View_ID view_id){ + b32 result = false; + if (view_has_highlighted_range(app, view_id)){ + Range_i64 range = get_view_range(app, view_id); + Buffer_ID buffer = view_get_buffer(app, view_id, Access_ReadWriteVisible); + buffer_replace_range(app, buffer, range, string_u8_litexpr("")); + result = true; + } + return(result); +} + +internal void +begin_notepad_mode(Application_Links *app){ + fcoder_mode = FCoderMode_NotepadLike; + for (View_ID view = get_view_next(app, 0, Access_Always); + view != 0; + view = get_view_next(app, view, Access_Always)){ + i64 pos = view_get_cursor_pos(app, view); + view_set_mark(app, view, seek_pos(pos)); + } +} + +//////////////////////////////// + +internal void seek_pos_of_textual_line(Application_Links *app, Side side){ - View_ID view = get_active_view(app, Access_ReadVisible); + View_ID view = get_active_view(app, Access_ReadVisible); Buffer_ID buffer = view_get_buffer(app, view, Access_ReadVisible); i64 pos = view_get_cursor_pos(app, view); -i64 new_pos = get_line_side_pos_from_pos(app, buffer, pos, side); + i64 new_pos = get_line_side_pos_from_pos(app, buffer, pos, side); view_set_cursor_and_preferred_x(app, view, seek_pos(new_pos)); - no_mark_snap_to_cursor_if_shift(app, view); - } + no_mark_snap_to_cursor_if_shift(app, view); +} internal void seek_pos_of_visual_line(Application_Links *app, Side side){ - View_ID view = get_active_view(app, Access_ReadVisible); + View_ID view = get_active_view(app, Access_ReadVisible); i64 pos = view_get_cursor_pos(app, view); Buffer_Cursor cursor = view_compute_cursor(app, view, seek_pos(pos)); - Vec2_f32 p = view_relative_xy_of_pos(app, view, cursor.line, pos); - p.x = (side == Side_Min)?(0.f):(max_f32); -i64 new_pos = view_pos_at_relative_xy(app, view, cursor.line, p); - view_set_cursor_and_preferred_x(app, view, seek_pos(new_pos)); - no_mark_snap_to_cursor_if_shift(app, view); - } - - CUSTOM_COMMAND_SIG(seek_beginning_of_textual_line) - CUSTOM_DOC("Seeks the cursor to the beginning of the line across all text.") + Vec2_f32 p = view_relative_xy_of_pos(app, view, cursor.line, pos); + p.x = (side == Side_Min)?(0.f):(max_f32); + i64 new_pos = view_pos_at_relative_xy(app, view, cursor.line, p); + view_set_cursor_and_preferred_x(app, view, seek_pos(new_pos)); + no_mark_snap_to_cursor_if_shift(app, view); +} + +CUSTOM_COMMAND_SIG(seek_beginning_of_textual_line) +CUSTOM_DOC("Seeks the cursor to the beginning of the line across all text.") { seek_pos_of_textual_line(app, Side_Min); - } +} - CUSTOM_COMMAND_SIG(seek_end_of_textual_line) +CUSTOM_COMMAND_SIG(seek_end_of_textual_line) CUSTOM_DOC("Seeks the cursor to the end of the line across all text.") - { - seek_pos_of_textual_line(app, Side_Max); - } - - CUSTOM_COMMAND_SIG(seek_beginning_of_line) - CUSTOM_DOC("Seeks the cursor to the beginning of the visual line.") +{ + seek_pos_of_textual_line(app, Side_Max); +} + +CUSTOM_COMMAND_SIG(seek_beginning_of_line) +CUSTOM_DOC("Seeks the cursor to the beginning of the visual line.") { seek_pos_of_visual_line(app, Side_Min); - } - - CUSTOM_COMMAND_SIG(seek_end_of_line) - CUSTOM_DOC("Seeks the cursor to the end of the visual line.") - { - seek_pos_of_visual_line(app, Side_Max); - } - - CUSTOM_COMMAND_SIG(goto_beginning_of_file) - CUSTOM_DOC("Sets the cursor to the beginning of the file.") +} + +CUSTOM_COMMAND_SIG(seek_end_of_line) +CUSTOM_DOC("Seeks the cursor to the end of the visual line.") { -View_ID view = get_active_view(app, Access_ReadVisible); -view_set_cursor_and_preferred_x(app, view, seek_pos(0)); + seek_pos_of_visual_line(app, Side_Max); +} + +CUSTOM_COMMAND_SIG(goto_beginning_of_file) +CUSTOM_DOC("Sets the cursor to the beginning of the file.") +{ + View_ID view = get_active_view(app, Access_ReadVisible); + view_set_cursor_and_preferred_x(app, view, seek_pos(0)); no_mark_snap_to_cursor_if_shift(app, view); - } - - CUSTOM_COMMAND_SIG(goto_end_of_file) - CUSTOM_DOC("Sets the cursor to the end of the file.") - { - View_ID view = get_active_view(app, Access_ReadVisible); - Buffer_ID buffer_id = view_get_buffer(app, view, Access_ReadVisible); - i32 size = (i32)buffer_get_size(app, buffer_id); - view_set_cursor_and_preferred_x(app, view, seek_pos(size)); -no_mark_snap_to_cursor_if_shift(app, view); - } - - //////////////////////////////// - - internal b32 -view_set_split(Application_Links *app, View_ID view, View_Split_Kind kind, f32 t){ - b32 result = false; - if (view != 0){ - Panel_ID panel_id = view_get_panel(app, view); - if (panel_id != 0){ - Panel_ID parent_panel_id = panel_get_parent(app, panel_id); -if (parent_panel_id != 0){ - Panel_ID min_child_id = panel_get_child(app, parent_panel_id, Side_Min); - if (min_child_id != 0){ - b32 panel_is_min = (min_child_id == panel_id); -Panel_Split_Kind panel_kind = ((kind == ViewSplitKind_Ratio)? - (panel_is_min?PanelSplitKind_Ratio_Min:PanelSplitKind_Ratio_Max): -(panel_is_min?PanelSplitKind_FixedPixels_Min:PanelSplitKind_FixedPixels_Max)); - result = panel_set_split(app, parent_panel_id, panel_kind, t); - } } + +CUSTOM_COMMAND_SIG(goto_end_of_file) +CUSTOM_DOC("Sets the cursor to the end of the file.") +{ + View_ID view = get_active_view(app, Access_ReadVisible); + Buffer_ID buffer_id = view_get_buffer(app, view, Access_ReadVisible); + i32 size = (i32)buffer_get_size(app, buffer_id); + view_set_cursor_and_preferred_x(app, view, seek_pos(size)); + no_mark_snap_to_cursor_if_shift(app, view); } -} -return(result); - } + +//////////////////////////////// internal b32 - view_set_split_proportion(Application_Links *app, View_ID view, f32 t){ -return(view_set_split(app, view, ViewSplitKind_Ratio, t)); +view_set_split(Application_Links *app, View_ID view, View_Split_Kind kind, f32 t){ + b32 result = false; + if (view != 0){ + Panel_ID panel_id = view_get_panel(app, view); + if (panel_id != 0){ + Panel_ID parent_panel_id = panel_get_parent(app, panel_id); + if (parent_panel_id != 0){ + Panel_ID min_child_id = panel_get_child(app, parent_panel_id, Side_Min); + if (min_child_id != 0){ + b32 panel_is_min = (min_child_id == panel_id); + Panel_Split_Kind panel_kind = ((kind == ViewSplitKind_Ratio)? + (panel_is_min?PanelSplitKind_Ratio_Min:PanelSplitKind_Ratio_Max): + (panel_is_min?PanelSplitKind_FixedPixels_Min:PanelSplitKind_FixedPixels_Max)); + result = panel_set_split(app, parent_panel_id, panel_kind, t); + } + } + } } - - internal b32 + return(result); +} + +internal b32 +view_set_split_proportion(Application_Links *app, View_ID view, f32 t){ + return(view_set_split(app, view, ViewSplitKind_Ratio, t)); +} + +internal b32 view_set_split_pixel_size(Application_Links *app, View_ID view, i32 t){ return(view_set_split(app, view, ViewSplitKind_FixedPixels, (f32)t)); - } - - //////////////////////////////// +} + +//////////////////////////////// internal Record_Info get_single_record(Application_Links *app, Buffer_ID buffer_id, History_Record_Index index){ -Record_Info record = buffer_history_get_record_info(app, buffer_id, index); - if (record.error == RecordError_NoError && record.kind == RecordKind_Group){ - record = buffer_history_get_group_sub_record(app, buffer_id, index, record.group_count - 1); + Record_Info record = buffer_history_get_record_info(app, buffer_id, index); + if (record.error == RecordError_NoError && record.kind == RecordKind_Group){ + record = buffer_history_get_group_sub_record(app, buffer_id, index, record.group_count - 1); } return(record); - } - - //////////////////////////////// - - function Nest_Delimiter_Kind - get_nest_delimiter_kind(Token_Base_Kind kind, Find_Nest_Flag flags){ +} + +//////////////////////////////// + +function Nest_Delimiter_Kind +get_nest_delimiter_kind(Token_Base_Kind kind, Find_Nest_Flag flags){ Nest_Delimiter_Kind result = NestDelim_None; switch (kind){ - case TokenBaseKind_ScopeOpen: - { - if (HasFlag(flags, FindNest_Scope)){ - result = NestDelim_Open; + case TokenBaseKind_ScopeOpen: + { + if (HasFlag(flags, FindNest_Scope)){ + result = NestDelim_Open; + } + }break; + case TokenBaseKind_ScopeClose: + { + if (HasFlag(flags, FindNest_Scope)){ + result = NestDelim_Close; + } + }break; + case TokenBaseKind_ParentheticalOpen: + { + if (HasFlag(flags, FindNest_Paren)){ + result = NestDelim_Open; + } + }break; + case TokenBaseKind_ParentheticalClose: + { + if (HasFlag(flags, FindNest_Paren)){ + result = NestDelim_Close; + } + }break; } - }break; -case TokenBaseKind_ScopeClose: -{ -if (HasFlag(flags, FindNest_Scope)){ -result = NestDelim_Close; -} -}break; -case TokenBaseKind_ParentheticalOpen: -{ -if (HasFlag(flags, FindNest_Paren)){ -result = NestDelim_Open; -} -}break; -case TokenBaseKind_ParentheticalClose: -{ -if (HasFlag(flags, FindNest_Paren)){ -result = NestDelim_Close; -} -}break; -} -return(result); + return(result); } function b32 find_nest_side(Application_Links *app, Buffer_ID buffer, i64 pos, -Find_Nest_Flag flags, Scan_Direction scan, Nest_Delimiter_Kind delim, -Range_i64 *out){ -b32 result = false; - - b32 balanced = HasFlag(flags, FindNest_Balanced); + Find_Nest_Flag flags, Scan_Direction scan, Nest_Delimiter_Kind delim, + Range_i64 *out){ + b32 result = false; + + b32 balanced = HasFlag(flags, FindNest_Balanced); if (balanced){ - if ((delim == NestDelim_Open && scan == Scan_Forward) || - (delim == NestDelim_Close && scan == Scan_Backward)){ - balanced = false; + if ((delim == NestDelim_Open && scan == Scan_Forward) || + (delim == NestDelim_Close && scan == Scan_Backward)){ + balanced = false; + } } -} Managed_Scope scope = buffer_get_managed_scope(app, buffer); Token_Array *tokens = scope_attachment(app, scope, attachment_tokens, Token_Array); -if (tokens != 0 && tokens->count > 0){ -Token_Iterator_Array it = token_iterator_pos(0, tokens, pos); -i32 level = 0; -for (;;){ -Token *token = token_it_read(&it); -Nest_Delimiter_Kind token_delim = get_nest_delimiter_kind(token->kind, flags); - -if (level == 0 && token_delim == delim){ -*out = Ii64_size(token->pos, token->size); -result = true; -break; -} - -if (balanced && token_delim != NestDelim_None){ -level += (token_delim == delim)?-1:1; -} - -b32 good = false; -if (scan == Scan_Forward){ -good = token_it_inc(&it); - } -else{ -good = token_it_dec(&it); - } -if (!good){ - break; - } - } - } - - return(result); -} - - function b32 -find_nest_side(Application_Links *app, Buffer_ID buffer, i64 pos, -Find_Nest_Flag flags, Scan_Direction scan, Nest_Delimiter_Kind delim, - i64 *out){ -Range_i64 range = {}; - b32 result = find_nest_side(app, buffer, pos, flags, scan, delim, &range); -if (result){ - if (HasFlag(flags, FindNest_EndOfToken)){ - *out = range.end; - } - else{ - *out = range.start; - } - } - return(result); - } - - function b32 - find_surrounding_nest(Application_Links *app, Buffer_ID buffer, i64 pos, - Find_Nest_Flag flags, Range_i64 *out){ -b32 result = false; - Range_i64 range = {}; - if (find_nest_side(app, buffer, pos - 1, flags|FindNest_Balanced, -Scan_Backward, NestDelim_Open, &range.start) && - find_nest_side(app, buffer, pos, flags|FindNest_Balanced|FindNest_EndOfToken, - Scan_Forward, NestDelim_Close, &range.end)){ - *out = range; - result = true; - } - return(result); - } - - function void - select_scope(Application_Links *app, View_ID view, Range_i64 range){ - view_set_cursor_and_preferred_x(app, view, seek_pos(range.first)); - view_set_mark(app, view, seek_pos(range.end)); - view_look_at_region(app, view, range.first, range.end); - no_mark_snap_to_cursor(app, view); - } - - //////////////////////////////// - - function Line_Ending_Kind -guess_line_ending_kind_from_buffer(Application_Links *app, Buffer_ID buffer){ - u64 size = buffer_get_size(app, buffer); - size = clamp_top(size, KB(8)); - Scratch_Block scratch(app); - String_Const_u8 string = push_buffer_range(app, scratch, buffer, Ii64(0, size)); - return(string_guess_line_ending_kind(string)); - } - - //////////////////////////////// - - function i32 - get_command_id(Custom_Command_Function *func){ - i32 result = -1; - for (i32 i = 0; i < ArrayCount(fcoder_metacmd_table); i += 1){ - if (func == fcoder_metacmd_table[i].proc){ -result = i; - break; - } - } - return(result); + if (tokens != 0 && tokens->count > 0){ + Token_Iterator_Array it = token_iterator_pos(0, tokens, pos); + i32 level = 0; + for (;;){ + Token *token = token_it_read(&it); + Nest_Delimiter_Kind token_delim = get_nest_delimiter_kind(token->kind, flags); + + if (level == 0 && token_delim == delim){ + *out = Ii64_size(token->pos, token->size); + result = true; + break; } - function Command_Metadata* - get_command_metadata(Custom_Command_Function *func){ -Command_Metadata *result = 0; - i32 id = get_command_id(func); - if (id >= 0){ - result = &fcoder_metacmd_table[id]; - } - return(result); - } - - //////////////////////////////// - - // TODO(allen): REWRITE THIS EXACTLY HOW YOU WANT IT --- start --- - - internal Child_Process_Set_Target_Flags - flags_system_command(Command_Line_Interface_Flag flags){ - Child_Process_Set_Target_Flags set_buffer_flags = 0; - if (!HasFlag(flags, CLI_OverlapWithConflict)){ - set_buffer_flags |= ChildProcessSet_FailIfBufferAlreadyAttachedToAProcess; - } -if (HasFlag(flags, CLI_CursorAtEnd)){ - set_buffer_flags |= ChildProcessSet_CursorAtEnd; -} -return(set_buffer_flags); + if (balanced && token_delim != NestDelim_None){ + level += (token_delim == delim)?-1:1; + } + + b32 good = false; + if (scan == Scan_Forward){ + good = token_it_inc(&it); + } + else{ + good = token_it_dec(&it); + } + if (!good){ + break; + } + } } - internal b32 - set_buffer_system_command(Application_Links *app, Child_Process_ID process, Buffer_ID buffer, Command_Line_Interface_Flag flags){ - b32 result = false; -Child_Process_Set_Target_Flags set_buffer_flags = flags_system_command(flags); - if (child_process_set_target_buffer(app, process, buffer, set_buffer_flags)){ - clear_buffer(app, buffer); - if (HasFlag(flags, CLI_SendEndSignal)){ - buffer_send_end_signal(app, buffer); - } -result = true; + return(result); } -return(result); + +function b32 +find_nest_side(Application_Links *app, Buffer_ID buffer, i64 pos, + Find_Nest_Flag flags, Scan_Direction scan, Nest_Delimiter_Kind delim, + i64 *out){ + Range_i64 range = {}; + b32 result = find_nest_side(app, buffer, pos, flags, scan, delim, &range); + if (result){ + if (HasFlag(flags, FindNest_EndOfToken)){ + *out = range.end; + } + else{ + *out = range.start; + } + } + return(result); +} + +function b32 +find_surrounding_nest(Application_Links *app, Buffer_ID buffer, i64 pos, + Find_Nest_Flag flags, Range_i64 *out){ + b32 result = false; + Range_i64 range = {}; + if (find_nest_side(app, buffer, pos - 1, flags|FindNest_Balanced, + Scan_Backward, NestDelim_Open, &range.start) && + find_nest_side(app, buffer, pos, flags|FindNest_Balanced|FindNest_EndOfToken, + Scan_Forward, NestDelim_Close, &range.end)){ + *out = range; + result = true; + } + return(result); +} + +function void +select_scope(Application_Links *app, View_ID view, Range_i64 range){ + view_set_cursor_and_preferred_x(app, view, seek_pos(range.first)); + view_set_mark(app, view, seek_pos(range.end)); + view_look_at_region(app, view, range.first, range.end); + no_mark_snap_to_cursor(app, view); +} + +//////////////////////////////// + +function Line_Ending_Kind +guess_line_ending_kind_from_buffer(Application_Links *app, Buffer_ID buffer){ + u64 size = buffer_get_size(app, buffer); + size = clamp_top(size, KB(8)); + Scratch_Block scratch(app); + String_Const_u8 string = push_buffer_range(app, scratch, buffer, Ii64(0, size)); + return(string_guess_line_ending_kind(string)); +} + +//////////////////////////////// + +// TODO(allen): REWRITE THIS EXACTLY HOW YOU WANT IT --- start --- + +internal Child_Process_Set_Target_Flags +flags_system_command(Command_Line_Interface_Flag flags){ + Child_Process_Set_Target_Flags set_buffer_flags = 0; + if (!HasFlag(flags, CLI_OverlapWithConflict)){ + set_buffer_flags |= ChildProcessSet_FailIfBufferAlreadyAttachedToAProcess; + } + if (HasFlag(flags, CLI_CursorAtEnd)){ + set_buffer_flags |= ChildProcessSet_CursorAtEnd; + } + return(set_buffer_flags); +} + +internal b32 +set_buffer_system_command(Application_Links *app, Child_Process_ID process, Buffer_ID buffer, Command_Line_Interface_Flag flags){ + b32 result = false; + Child_Process_Set_Target_Flags set_buffer_flags = flags_system_command(flags); + if (child_process_set_target_buffer(app, process, buffer, set_buffer_flags)){ + clear_buffer(app, buffer); + if (HasFlag(flags, CLI_SendEndSignal)){ + buffer_send_end_signal(app, buffer); + } + result = true; + } + return(result); } internal b32 exec_system_command(Application_Links *app, View_ID view, Buffer_Identifier buffer_id, - String_Const_u8 path, String_Const_u8 command, Command_Line_Interface_Flag flags){ + String_Const_u8 path, String_Const_u8 command, Command_Line_Interface_Flag flags){ b32 result = false; -Child_Process_ID child_process_id = create_child_process(app, path, command); - if (child_process_id != 0){ -result = true; -Buffer_ID buffer_attach_id = buffer_identifier_to_id_create_out_buffer(app, buffer_id); - if (buffer_attach_id != 0){ - if (set_buffer_system_command(app, child_process_id, buffer_attach_id, flags)){ - if (view != 0){ - view_set_buffer(app, view, buffer_attach_id, 0); - view_set_cursor(app, view, seek_pos(0)); - } - } - } - } - return(result); - } + Child_Process_ID child_process_id = create_child_process(app, path, command); + if (child_process_id != 0){ + result = true; + Buffer_ID buffer_attach_id = buffer_identifier_to_id_create_out_buffer(app, buffer_id); + if (buffer_attach_id != 0){ + if (set_buffer_system_command(app, child_process_id, buffer_attach_id, flags)){ + if (view != 0){ + view_set_buffer(app, view, buffer_attach_id, 0); + view_set_cursor(app, view, seek_pos(0)); + } + } + } + } + return(result); +} - // TODO(allen): --- end --- +// TODO(allen): --- end --- // BOTTOM diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index b3e93833..8ef9e353 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -293,22 +293,22 @@ static Command_Metadata fcoder_metacmd_table[237] = { { PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "W:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 175 }, { PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 116 }, { PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 738 }, -{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1880 }, +{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1899 }, { PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 7 }, { PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 23 }, { PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 51 }, { PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 162 }, { PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 79 }, { PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 112 }, -{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1306 }, -{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1478 }, +{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1325 }, +{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1497 }, { PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 134 }, -{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1464 }, +{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1483 }, { PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "W:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 22 }, { PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "W:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 7 }, { PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 825 }, -{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2201 }, -{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2209 }, +{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2226 }, +{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2234 }, { PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 525 }, { PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 542 }, { PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 348 }, @@ -334,7 +334,7 @@ static Command_Metadata fcoder_metacmd_table[237] = { { PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 54 }, { PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 77 }, { PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 41 }, -{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1624 }, +{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1643 }, { PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 9 }, { PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 211 }, { PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 295 }, @@ -355,7 +355,7 @@ static Command_Metadata fcoder_metacmd_table[237] = { { PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "W:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1627 }, { PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 457 }, { PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 469 }, -{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1418 }, +{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1437 }, { PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 44 }, { PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 237 }, { PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 249 }, @@ -376,8 +376,8 @@ static Command_Metadata fcoder_metacmd_table[237] = { { PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 486 }, { PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 471 }, { PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 500 }, -{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1458 }, -{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1452 }, +{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1477 }, +{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1471 }, { PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 445 }, { PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 507 }, { PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 521 }, @@ -393,12 +393,12 @@ static Command_Metadata fcoder_metacmd_table[237] = { { PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 373 }, { PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 849 }, { PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 855 }, -{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1543 }, -{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1874 }, +{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1562 }, +{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1893 }, { PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 46 }, { PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 62 }, { PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 54 }, -{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1575 }, +{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1594 }, { PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 310 }, { PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 300 }, { PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 372 }, @@ -415,27 +415,27 @@ static Command_Metadata fcoder_metacmd_table[237] = { { PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1290 }, { PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 871 }, { PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 897 }, -{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1234 }, -{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1255 }, -{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1271 }, -{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1713 }, -{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1798 }, -{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1383 }, -{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1642 }, -{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1144 }, -{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1135 }, -{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1126 }, -{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1067 }, -{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1079 }, -{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1632 }, +{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1253 }, +{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1274 }, +{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1290 }, +{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1732 }, +{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1817 }, +{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1402 }, +{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1661 }, +{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1163 }, +{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1154 }, +{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1145 }, +{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1086 }, +{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1098 }, +{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1651 }, { PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 382 }, -{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1350 }, -{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1061 }, -{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1073 }, -{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2189 }, -{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2177 }, -{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2195 }, -{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2183 }, +{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1369 }, +{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1080 }, +{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1092 }, +{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2214 }, +{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2202 }, +{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2220 }, +{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2208 }, { PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 537 }, { PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 57 }, { PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 66 }, @@ -463,7 +463,7 @@ static Command_Metadata fcoder_metacmd_table[237] = { { PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 187 }, { PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 237 }, { PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 403 }, -{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1600 }, +{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1619 }, { PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 785 }, { PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 563 }, { PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 550 }, @@ -481,9 +481,9 @@ static Command_Metadata fcoder_metacmd_table[237] = { { PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 20 }, { PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 34 }, { PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 }, -{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1700 }, -{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1727 }, -{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1588 }, +{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1719 }, +{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1746 }, +{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1607 }, { PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "W:\\4ed\\code\\custom\\4coder_jump_lister.cpp", 41, 59 }, { PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 395 }, { PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 642 }, From 2ee9d05bd2a9d84a17a73547278c0716152ece53 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 29 Feb 2020 22:34:38 -0800 Subject: [PATCH 29/40] New examples code --- custom/4coder_base_commands.cpp | 4 +- custom/4coder_default_include.cpp | 2 + custom/4coder_examples.cpp | 192 +++++- custom/4coder_helper.cpp | 6 +- custom/generated/command_metadata.h | 879 ++++++++++++++-------------- 5 files changed, 641 insertions(+), 442 deletions(-) diff --git a/custom/4coder_base_commands.cpp b/custom/4coder_base_commands.cpp index 445baf33..7d7dc5f4 100644 --- a/custom/4coder_base_commands.cpp +++ b/custom/4coder_base_commands.cpp @@ -898,9 +898,7 @@ isearch(Application_Links *app, Scan_Direction start_scan, i64 first_pos, } isearch__update_highlight(app, view, Ii64_size(pos, match_size)); - in = get_next_input(app, - EventPropertyGroup_Any, - EventProperty_Escape|EventProperty_ViewActivation); + in = get_next_input(app, EventPropertyGroup_Any, EventProperty_Escape); if (in.abort){ break; } diff --git a/custom/4coder_default_include.cpp b/custom/4coder_default_include.cpp index 0e13797d..bf453a46 100644 --- a/custom/4coder_default_include.cpp +++ b/custom/4coder_default_include.cpp @@ -125,6 +125,8 @@ #include "4coder_doc_commands.cpp" #include "4coder_docs.cpp" +#include "4coder_examples.cpp" + #include "4coder_default_hooks.cpp" #endif diff --git a/custom/4coder_examples.cpp b/custom/4coder_examples.cpp index ba95e458..59de7980 100644 --- a/custom/4coder_examples.cpp +++ b/custom/4coder_examples.cpp @@ -5,12 +5,17 @@ customization writers. // TOP -// example: History_Group -// example: history_group_begin -// example: history_group_end +// tags: history; group +// example-of: History_Group; history_group_begin; history_group_end CUSTOM_COMMAND_SIG(double_backspace) CUSTOM_DOC("Example of history group helpers") { + /* History_Group is a wrapper around the history API that makes it easy to +group any series of edits into a single undo/redo record in the buffer's history. +Before any edits call history_group_begin and afterwards call history_group_end. +After history_group_end all of the edits to the buffer supplied in history_group_begin +will be merged, including all edits from function and command calls. */ + View_ID view = get_active_view(app, Access_ReadWriteVisible); Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible); History_Group group = history_group_begin(app, buffer); @@ -19,5 +24,186 @@ CUSTOM_DOC("Example of history group helpers") history_group_end(group); } +// tags: query; bar +// example-of: Query_Bar +CUSTOM_COMMAND_SIG(play_with_a_counter) +CUSTOM_DOC("Example of query bar") +{ + /* Query bars make a quick lightweight display of a single line of text for interactive + commands, while still showing the buffer. Query bars are convenient because they don't +require any complex UI setup, or extra rendering work inside your command. + +First, constructing a Query_Bar_Group is a convenient way to make sure the query bar +states are fully cleaned up when the command ends. + +Second, we make our query bar and start showing it with start_query_bar. Until we +call end_query_bar on the same bar, or the group's destructor runs, the bar struct +needs to remain in memory. The easy way to accomplish this is to just let the bar be +on the commands stack frame. */ + + i32 counter = 0; + + Query_Bar_Group group(app); + Query_Bar dumb_bar = {}; + dumb_bar.prompt = SCu8("Goes away at >= 10"); + if (!start_query_bar(app, &dumb_bar, 0)){ + return; + } + + Query_Bar bar = {}; + bar.prompt = SCu8("Counter = "); + bar.string = SCu8(""); + if (!start_query_bar(app, &bar, 0)){ + return; + } + + for (;;){ + /* Notice here, we set the string of the query bar BEFORE we call get_next_input. + get_next_input blocks this command until the next input is sent from the core. Whatever +string we put in the bar now will be shown and remain in the bar until an event wakes +up this command and we get a chance to modify the bar again. */ + Scratch_Block scratch(app); + bar.string = push_stringf(scratch, "%d", counter); + if (counter >= 10){ + end_query_bar(app, &dumb_bar, 0); + } + + User_Input in = get_next_input(app, EventPropertyGroup_Any, EventProperty_Escape); + if (in.abort){ + break; + } + + if (match_key_code(&in.event, KeyCode_Up)){ + counter += 1; + } + else if (match_key_code(&in.event, KeyCode_Down)){ + counter -= 1; + } + else{ + leave_current_input_unhandled(app); + } + } +} + +// tags: input; loop +// example-of: get_next_input; leave_current_input_unhandled +CUSTOM_COMMAND_SIG(display_key_codes) +CUSTOM_DOC("Example of input handling loop") +{ + /* In the 4coder custom layer, inputs are handled by a view context. A view context is a +thread that hands off control with the main thread of the 4coder core. When a command is +running in a view context thread, it can wait for inputs from the core by calling +get_next_input. If your command gets inputs from the core, then default input handling +isn't happening, so command bindings don't trigger unless you trigger them yourself. */ + + Query_Bar_Group group(app); + Query_Bar bar = {}; + bar.prompt = SCu8("KeyCode = "); + if (!start_query_bar(app, &bar, 0)){ + return; + } + + Key_Code code = 0; + + for (;;){ + Scratch_Block scratch(app); + if (code == 0){ + bar.string = SCu8("..."); + } + else{ + bar.string = push_stringf(scratch, "KeyCode_%s (%d)", key_code_name[code], code); + } + User_Input in = get_next_input(app, EventPropertyGroup_Any, EventProperty_Escape); + if (in.abort){ + break; + } + if (in.event.kind == InputEventKind_KeyStroke){ + code = in.event.key.code; + } + else{ + /* Marking inputs as handled lets the core determine if certain inputs should + be passed to additional handlers. This is especially important for text input, + which is explained more in the example display_text_input. */ + leave_current_input_unhandled(app); + } + } +} + +// tags: text; input +// example-of: get_next_input; leave_current_input_unhandled; to_writable +CUSTOM_COMMAND_SIG(display_text_input) +CUSTOM_DOC("Example of to_writable and leave_current_input_unhandled") +{ + /* In the 4coder custom layer, inputs are handled by a view context. A view context is a +thread that hands off control with the main thread of the 4coder core. When a command is +running in a view context thread, it can wait for inputs from the core by calling +get_next_input. If your command gets inputs from the core, then default input handling +isn't happening, so command bindings don't trigger unless you trigger them yourself. */ + + Query_Bar_Group group(app); + Query_Bar bar = {}; + bar.prompt = SCu8("Weird String: "); + if (!start_query_bar(app, &bar, 0)){ + return; + } + + u8 buffer[256]; + u32 size = 0; + + for (;;){ + User_Input in = get_next_input(app, EventPropertyGroup_Any, EventProperty_Escape); + if (in.abort){ + break; + } + + String_Const_u8 in_string = to_writable(&in); + if (in_string.size > 0){ + size = clamp_top(in_string.size, sizeof(buffer)); + block_copy(buffer, in_string.str, size); + bar.string = SCu8(buffer, size); + } + else if (in.event.kind == InputEventKind_KeyStroke){ + /* If we handle a key stroke then the core marks any text input generated from that +key stroke as handled too, and the text input is never passed. By marking key strokes +as unhandled, we ensure we get text input events. */ + leave_current_input_unhandled(app); + } + } +} + +// tags: string; number; query; user +// example-of: query_user_string; query_user_number +CUSTOM_COMMAND_SIG(string_repeat) +CUSTOM_DOC("Example of query_user_string and query_user_number") +{ + Query_Bar_Group group(app); + Query_Bar string_bar = {}; + string_bar.prompt = SCu8("String: "); + u8 string_buffer[KB(1)]; + string_bar.string.str = string_buffer; + string_bar.string_capacity = sizeof(string_buffer); + Query_Bar number_bar = {}; + number_bar.prompt = SCu8("Repeat Count: "); + u8 number_buffer[KB(1)]; + number_bar.string.str = number_buffer; + number_bar.string_capacity = sizeof(number_buffer); + + if (query_user_string(app, &string_bar)){ + if (string_bar.string.size > 0){ + if (query_user_number(app, &number_bar)){ + if (number_bar.string.size > 0){ + i32 repeats = (i32)string_to_integer(number_bar.string, 10); + repeats = clamp_top(repeats, 1000); + Scratch_Block scratch(app); + String_Const_u8 msg = push_stringf(scratch, "%.*s\n", string_expand(string_bar.string)); + for (i32 i = 0; i < repeats; i += 1){ + print_message(app, msg); + } + } + } + } + } +} + // BOTTOM diff --git a/custom/4coder_helper.cpp b/custom/4coder_helper.cpp index e079780b..203dccff 100644 --- a/custom/4coder_helper.cpp +++ b/custom/4coder_helper.cpp @@ -94,16 +94,14 @@ character_predicate_from_function(Character_Predicate_Function *func){ for (i32 bit_index = 0; bit_index < 8; i += 1, bit_index += 1){ v[bit_index] = func((u8)i); } - predicate.b[byte_index] = ( - (v[0] << 0) | + predicate.b[byte_index] = ((v[0] << 0) | (v[1] << 1) | (v[2] << 2) | (v[3] << 3) | (v[4] << 4) | (v[5] << 5) | (v[6] << 6) | - (v[7] << 7) - ); + (v[7] << 7)); byte_index += 1; } return(predicate); diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index 8ef9e353..e424f1d4 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -2,7 +2,7 @@ #define command_id(c) (fcoder_metacmd_ID_##c) #define command_metadata(c) (&fcoder_metacmd_table[command_id(c)]) #define command_metadata_by_id(id) (&fcoder_metacmd_table[id]) -#define command_one_past_last_id 237 +#define command_one_past_last_id 242 #if defined(CUSTOM_COMMAND_SIG) #define PROC_LINKS(x,y) x #else @@ -53,6 +53,9 @@ CUSTOM_COMMAND_SIG(delete_current_scope); CUSTOM_COMMAND_SIG(delete_file_query); CUSTOM_COMMAND_SIG(delete_line); CUSTOM_COMMAND_SIG(delete_range); +CUSTOM_COMMAND_SIG(display_key_codes); +CUSTOM_COMMAND_SIG(display_text_input); +CUSTOM_COMMAND_SIG(double_backspace); CUSTOM_COMMAND_SIG(duplicate_line); CUSTOM_COMMAND_SIG(execute_any_cli); CUSTOM_COMMAND_SIG(execute_previous_cli); @@ -158,6 +161,7 @@ CUSTOM_COMMAND_SIG(paste_and_indent); CUSTOM_COMMAND_SIG(paste_next); CUSTOM_COMMAND_SIG(paste_next_and_indent); CUSTOM_COMMAND_SIG(place_in_scope); +CUSTOM_COMMAND_SIG(play_with_a_counter); CUSTOM_COMMAND_SIG(profile_clear); CUSTOM_COMMAND_SIG(profile_disable); CUSTOM_COMMAND_SIG(profile_enable); @@ -212,6 +216,7 @@ CUSTOM_COMMAND_SIG(show_the_log_graph); CUSTOM_COMMAND_SIG(snipe_backward_whitespace_or_token_boundary); CUSTOM_COMMAND_SIG(snipe_forward_whitespace_or_token_boundary); CUSTOM_COMMAND_SIG(snippet_lister); +CUSTOM_COMMAND_SIG(string_repeat); CUSTOM_COMMAND_SIG(suppress_mouse); CUSTOM_COMMAND_SIG(swap_panels); CUSTOM_COMMAND_SIG(theme_lister); @@ -258,244 +263,249 @@ char *source_name; i32 source_name_len; i32 line_number; }; -static Command_Metadata fcoder_metacmd_table[237] = { -{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 409 }, -{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 413 }, -{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 423 }, -{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 404 }, -{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 154 }, -{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 96 }, -{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 647 }, -{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 68 }, -{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 159 }, -{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 122 }, -{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 197 }, -{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 284 }, -{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 290 }, -{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 180 }, -{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 636 }, -{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 480 }, -{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 216 }, -{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 233 }, -{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 223 }, -{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 243 }, -{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 255 }, -{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 7 }, -{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 843 }, -{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 174 }, -{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 655 }, -{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "W:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 190 }, -{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 761 }, -{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 125 }, -{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 149 }, -{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 107 }, -{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 124 }, -{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "W:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 175 }, -{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 116 }, -{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 738 }, -{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1899 }, -{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 7 }, -{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 23 }, -{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 51 }, -{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 162 }, -{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 79 }, -{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 112 }, -{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1325 }, -{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1497 }, -{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 134 }, -{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1483 }, -{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "W:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 22 }, -{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "W:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 7 }, -{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 825 }, -{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2226 }, -{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2234 }, -{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 525 }, -{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 542 }, -{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 348 }, -{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 375 }, -{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 833 }, -{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 464 }, -{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 494 }, -{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 481 }, -{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 511 }, -{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 685 }, -{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 671 }, -{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 869 }, -{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 70 }, -{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 564 }, -{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 581 }, -{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 727 }, -{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 520 }, -{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 661 }, -{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 715 }, -{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 612 }, -{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 510 }, -{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "W:\\4ed\\code\\custom\\4coder_code_index_listers.cpp", 48, 12 }, -{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 54 }, -{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 77 }, -{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 41 }, -{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1643 }, -{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 9 }, -{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 211 }, -{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 295 }, -{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 301 }, -{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 267 }, -{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 277 }, -{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 165 }, -{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 177 }, -{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 189 }, -{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 195 }, -{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 201 }, -{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 207 }, -{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 213 }, -{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 221 }, -{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 171 }, -{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 183 }, -{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 863 }, -{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "W:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1627 }, -{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 457 }, -{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 469 }, -{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1437 }, -{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 44 }, -{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 237 }, -{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 249 }, -{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 29 }, -{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 231 }, -{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 243 }, -{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 780 }, -{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 265 }, -{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 336 }, -{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 348 }, -{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 354 }, -{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 407 }, -{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 431 }, -{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 419 }, -{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 437 }, -{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 514 }, -{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 528 }, -{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 486 }, -{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 471 }, -{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 500 }, -{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1477 }, -{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1471 }, -{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 445 }, -{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 507 }, -{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 521 }, -{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 479 }, -{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 463 }, -{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 493 }, -{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 330 }, -{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 342 }, -{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 401 }, -{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 425 }, -{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 413 }, -{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 364 }, -{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 373 }, -{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 849 }, -{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 855 }, -{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1562 }, -{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1893 }, -{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 46 }, -{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 62 }, -{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 54 }, -{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1594 }, -{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 310 }, -{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 300 }, -{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 372 }, -{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 364 }, -{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 127 }, -{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 202 }, -{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 161 }, -{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 209 }, -{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 106 }, -{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 226 }, -{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 219 }, -{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 212 }, -{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "W:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 886 }, -{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1290 }, -{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 871 }, -{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 897 }, -{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1253 }, -{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1274 }, -{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1290 }, -{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1732 }, -{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1817 }, -{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1402 }, -{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1661 }, -{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1163 }, -{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1154 }, -{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1145 }, -{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1086 }, -{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1098 }, -{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1651 }, -{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 382 }, -{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1369 }, -{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1080 }, -{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1092 }, -{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2214 }, -{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2202 }, -{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2220 }, -{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2208 }, -{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 537 }, -{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 57 }, -{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 66 }, -{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 82 }, -{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 99 }, -{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 27 }, -{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 39 }, -{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 125 }, -{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 112 }, -{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 86 }, -{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 99 }, -{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 707 }, -{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 749 }, -{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 115 }, -{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 427 }, -{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 421 }, -{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1238 }, -{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1250 }, -{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1244 }, -{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1231 }, -{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 678 }, -{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 664 }, -{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "W:\\4ed\\code\\custom\\4coder_log_parser.cpp", 40, 994 }, -{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 179 }, -{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 187 }, -{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 237 }, -{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 403 }, -{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1619 }, -{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 785 }, -{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 563 }, -{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 550 }, -{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 692 }, -{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 701 }, -{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 451 }, -{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 439 }, -{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 433 }, -{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 806 }, -{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 812 }, -{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 415 }, -{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 445 }, -{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 797 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "W:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1176 }, -{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 20 }, -{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 34 }, -{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 }, -{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1719 }, -{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1746 }, -{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1607 }, -{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "W:\\4ed\\code\\custom\\4coder_jump_lister.cpp", 41, 59 }, -{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 395 }, -{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 642 }, -{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 94 }, -{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 82 }, -{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 88 }, -{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 67 }, -{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 433 }, -{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 59 }, -{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 76 }, -{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 73 }, -{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 100 }, +static Command_Metadata fcoder_metacmd_table[242] = { +{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "../code/custom/4coder_default_framework.cpp", 43, 409 }, +{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "../code/custom/4coder_auto_indent.cpp", 37, 413 }, +{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "../code/custom/4coder_auto_indent.cpp", 37, 423 }, +{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "../code/custom/4coder_auto_indent.cpp", 37, 404 }, +{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "../code/custom/4coder_base_commands.cpp", 39, 154 }, +{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "../code/custom/4coder_base_commands.cpp", 39, 96 }, +{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "../code/custom/4coder_base_commands.cpp", 39, 647 }, +{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "../code/custom/4coder_clipboard.cpp", 35, 68 }, +{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "../code/custom/4coder_build_commands.cpp", 40, 159 }, +{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "../code/custom/4coder_build_commands.cpp", 40, 122 }, +{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "../code/custom/4coder_base_commands.cpp", 39, 197 }, +{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "../code/custom/4coder_default_framework.cpp", 43, 284 }, +{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "../code/custom/4coder_default_framework.cpp", 43, 290 }, +{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "../code/custom/4coder_build_commands.cpp", 40, 180 }, +{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 636 }, +{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "../code/custom/4coder_default_framework.cpp", 43, 480 }, +{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "../code/custom/4coder_clipboard.cpp", 35, 216 }, +{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "../code/custom/4coder_base_commands.cpp", 39, 233 }, +{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "../code/custom/4coder_base_commands.cpp", 39, 223 }, +{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "../code/custom/4coder_base_commands.cpp", 39, 243 }, +{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "../code/custom/4coder_base_commands.cpp", 39, 255 }, +{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "../code/custom/4coder_clipboard.cpp", 35, 7 }, +{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "../code/custom/4coder_project_commands.cpp", 42, 843 }, +{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "../code/custom/4coder_build_commands.cpp", 40, 174 }, +{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "../code/custom/4coder_base_commands.cpp", 39, 655 }, +{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "../code/custom/4coder_docs.cpp", 30, 190 }, +{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "../code/custom/4coder_lists.cpp", 31, 761 }, +{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "../code/custom/4coder_combined_write_commands.cpp", 49, 125 }, +{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "../code/custom/4coder_combined_write_commands.cpp", 49, 149 }, +{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "../code/custom/4coder_clipboard.cpp", 35, 107 }, +{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "../code/custom/4coder_base_commands.cpp", 39, 124 }, +{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "../code/custom/4coder_docs.cpp", 30, 175 }, +{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "../code/custom/4coder_clipboard.cpp", 35, 116 }, +{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 738 }, +{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "../code/custom/4coder_base_commands.cpp", 39, 1897 }, +{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "../code/custom/4coder_default_hooks.cpp", 39, 7 }, +{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "../code/custom/4coder_default_hooks.cpp", 39, 23 }, +{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "../code/custom/4coder_default_hooks.cpp", 39, 51 }, +{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "../code/custom/4coder_base_commands.cpp", 39, 162 }, +{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "../code/custom/4coder_base_commands.cpp", 39, 79 }, +{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "../code/custom/4coder_scope_commands.cpp", 40, 112 }, +{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "../code/custom/4coder_base_commands.cpp", 39, 1323 }, +{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "../code/custom/4coder_base_commands.cpp", 39, 1495 }, +{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "../code/custom/4coder_base_commands.cpp", 39, 134 }, +{ PROC_LINKS(display_key_codes, 0), false, "display_key_codes", 17, "Example of input handling loop", 30, "../code/custom/4coder_examples.cpp", 34, 90 }, +{ PROC_LINKS(display_text_input, 0), false, "display_text_input", 18, "Example of to_writable and leave_current_input_unhandled", 56, "../code/custom/4coder_examples.cpp", 34, 134 }, +{ PROC_LINKS(double_backspace, 0), false, "double_backspace", 16, "Example of history group helpers", 32, "../code/custom/4coder_examples.cpp", 34, 10 }, +{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "../code/custom/4coder_base_commands.cpp", 39, 1481 }, +{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "../code/custom/4coder_cli_command.cpp", 37, 22 }, +{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "../code/custom/4coder_cli_command.cpp", 37, 7 }, +{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "../code/custom/4coder_base_commands.cpp", 39, 825 }, +{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "../code/custom/4coder_helper.cpp", 32, 2224 }, +{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "../code/custom/4coder_helper.cpp", 32, 2232 }, +{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "../code/custom/4coder_jump_sticky.cpp", 37, 525 }, +{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "../code/custom/4coder_jump_sticky.cpp", 37, 542 }, +{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "../code/custom/4coder_jump_sticky.cpp", 37, 348 }, +{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "../code/custom/4coder_jump_sticky.cpp", 37, 375 }, +{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "../code/custom/4coder_base_commands.cpp", 39, 833 }, +{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "../code/custom/4coder_jump_sticky.cpp", 37, 464 }, +{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "../code/custom/4coder_jump_sticky.cpp", 37, 494 }, +{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "../code/custom/4coder_jump_sticky.cpp", 37, 481 }, +{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "../code/custom/4coder_jump_sticky.cpp", 37, 511 }, +{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 685 }, +{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 671 }, +{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "../code/custom/4coder_tutorial.cpp", 34, 869 }, +{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 70 }, +{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "../code/custom/4coder_jump_sticky.cpp", 37, 564 }, +{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "../code/custom/4coder_jump_sticky.cpp", 37, 581 }, +{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 727 }, +{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "../code/custom/4coder_lists.cpp", 31, 520 }, +{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "../code/custom/4coder_lists.cpp", 31, 661 }, +{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "../code/custom/4coder_lists.cpp", 31, 715 }, +{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "../code/custom/4coder_lists.cpp", 31, 612 }, +{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "../code/custom/4coder_lists.cpp", 31, 510 }, +{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "../code/custom/4coder_code_index_listers.cpp", 44, 12 }, +{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "../code/custom/4coder_keyboard_macro.cpp", 40, 54 }, +{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "../code/custom/4coder_keyboard_macro.cpp", 40, 77 }, +{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "../code/custom/4coder_keyboard_macro.cpp", 40, 41 }, +{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1641 }, +{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "../code/custom/4coder_tutorial.cpp", 34, 9 }, +{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "../code/custom/4coder_base_commands.cpp", 39, 211 }, +{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "../code/custom/4coder_function_list.cpp", 39, 295 }, +{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "../code/custom/4coder_function_list.cpp", 39, 301 }, +{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "../code/custom/4coder_function_list.cpp", 39, 267 }, +{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "../code/custom/4coder_function_list.cpp", 39, 277 }, +{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "../code/custom/4coder_search.cpp", 32, 165 }, +{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "../code/custom/4coder_search.cpp", 32, 177 }, +{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 189 }, +{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 195 }, +{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 201 }, +{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 207 }, +{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "../code/custom/4coder_search.cpp", 32, 213 }, +{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "../code/custom/4coder_search.cpp", 32, 221 }, +{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "../code/custom/4coder_search.cpp", 32, 171 }, +{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "../code/custom/4coder_search.cpp", 32, 183 }, +{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "../code/custom/4coder_project_commands.cpp", 42, 863 }, +{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "../code/custom/4coder_config.cpp", 32, 1627 }, +{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "../code/custom/4coder_default_framework.cpp", 43, 457 }, +{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "../code/custom/4coder_default_framework.cpp", 43, 469 }, +{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "../code/custom/4coder_base_commands.cpp", 39, 1435 }, +{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 44 }, +{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 237 }, +{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 249 }, +{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 29 }, +{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 231 }, +{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 243 }, +{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "../code/custom/4coder_base_commands.cpp", 39, 780 }, +{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "../code/custom/4coder_base_commands.cpp", 39, 265 }, +{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "../code/custom/4coder_base_commands.cpp", 39, 336 }, +{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "../code/custom/4coder_base_commands.cpp", 39, 348 }, +{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "../code/custom/4coder_base_commands.cpp", 39, 354 }, +{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "../code/custom/4coder_base_commands.cpp", 39, 407 }, +{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 431 }, +{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 419 }, +{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "../code/custom/4coder_base_commands.cpp", 39, 437 }, +{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "../code/custom/4coder_base_commands.cpp", 39, 514 }, +{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "../code/custom/4coder_base_commands.cpp", 39, 528 }, +{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "../code/custom/4coder_base_commands.cpp", 39, 486 }, +{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "../code/custom/4coder_base_commands.cpp", 39, 471 }, +{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "../code/custom/4coder_base_commands.cpp", 39, 500 }, +{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "../code/custom/4coder_base_commands.cpp", 39, 1475 }, +{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "../code/custom/4coder_base_commands.cpp", 39, 1469 }, +{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "../code/custom/4coder_base_commands.cpp", 39, 445 }, +{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "../code/custom/4coder_base_commands.cpp", 39, 507 }, +{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "../code/custom/4coder_base_commands.cpp", 39, 521 }, +{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "../code/custom/4coder_base_commands.cpp", 39, 479 }, +{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "../code/custom/4coder_base_commands.cpp", 39, 463 }, +{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "../code/custom/4coder_base_commands.cpp", 39, 493 }, +{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "../code/custom/4coder_base_commands.cpp", 39, 330 }, +{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "../code/custom/4coder_base_commands.cpp", 39, 342 }, +{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "../code/custom/4coder_base_commands.cpp", 39, 401 }, +{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 425 }, +{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 413 }, +{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "../code/custom/4coder_clipboard.cpp", 35, 364 }, +{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "../code/custom/4coder_clipboard.cpp", 35, 373 }, +{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "../code/custom/4coder_project_commands.cpp", 42, 849 }, +{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "../code/custom/4coder_project_commands.cpp", 42, 855 }, +{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "../code/custom/4coder_base_commands.cpp", 39, 1560 }, +{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1891 }, +{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "../code/custom/4coder_combined_write_commands.cpp", 49, 46 }, +{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "../code/custom/4coder_combined_write_commands.cpp", 49, 62 }, +{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "../code/custom/4coder_combined_write_commands.cpp", 49, 54 }, +{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1592 }, +{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "../code/custom/4coder_default_framework.cpp", 43, 310 }, +{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "../code/custom/4coder_default_framework.cpp", 43, 300 }, +{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "../code/custom/4coder_base_commands.cpp", 39, 372 }, +{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "../code/custom/4coder_base_commands.cpp", 39, 364 }, +{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "../code/custom/4coder_clipboard.cpp", 35, 127 }, +{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "../code/custom/4coder_clipboard.cpp", 35, 202 }, +{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "../code/custom/4coder_clipboard.cpp", 35, 161 }, +{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "../code/custom/4coder_clipboard.cpp", 35, 209 }, +{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "../code/custom/4coder_scope_commands.cpp", 40, 106 }, +{ PROC_LINKS(play_with_a_counter, 0), false, "play_with_a_counter", 19, "Example of query bar", 20, "../code/custom/4coder_examples.cpp", 34, 29 }, +{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "../code/custom/4coder_profile.cpp", 33, 226 }, +{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "../code/custom/4coder_profile.cpp", 33, 219 }, +{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "../code/custom/4coder_profile.cpp", 33, 212 }, +{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "../code/custom/4coder_profile_inspect.cpp", 41, 886 }, +{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "../code/custom/4coder_project_commands.cpp", 42, 1290 }, +{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "../code/custom/4coder_project_commands.cpp", 42, 871 }, +{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "../code/custom/4coder_project_commands.cpp", 42, 897 }, +{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "../code/custom/4coder_base_commands.cpp", 39, 1251 }, +{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "../code/custom/4coder_base_commands.cpp", 39, 1272 }, +{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "../code/custom/4coder_base_commands.cpp", 39, 1288 }, +{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 1730 }, +{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "../code/custom/4coder_base_commands.cpp", 39, 1815 }, +{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "../code/custom/4coder_base_commands.cpp", 39, 1400 }, +{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1659 }, +{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "../code/custom/4coder_base_commands.cpp", 39, 1161 }, +{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "../code/custom/4coder_base_commands.cpp", 39, 1152 }, +{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "../code/custom/4coder_base_commands.cpp", 39, 1143 }, +{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "../code/custom/4coder_base_commands.cpp", 39, 1084 }, +{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "../code/custom/4coder_base_commands.cpp", 39, 1096 }, +{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1649 }, +{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "../code/custom/4coder_default_framework.cpp", 43, 382 }, +{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1367 }, +{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "../code/custom/4coder_base_commands.cpp", 39, 1078 }, +{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "../code/custom/4coder_base_commands.cpp", 39, 1090 }, +{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "../code/custom/4coder_helper.cpp", 32, 2212 }, +{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "../code/custom/4coder_helper.cpp", 32, 2200 }, +{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "../code/custom/4coder_helper.cpp", 32, 2218 }, +{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "../code/custom/4coder_helper.cpp", 32, 2206 }, +{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "../code/custom/4coder_base_commands.cpp", 39, 537 }, +{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "../code/custom/4coder_scope_commands.cpp", 40, 57 }, +{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "../code/custom/4coder_scope_commands.cpp", 40, 66 }, +{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "../code/custom/4coder_scope_commands.cpp", 40, 82 }, +{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "../code/custom/4coder_scope_commands.cpp", 40, 99 }, +{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "../code/custom/4coder_scope_commands.cpp", 40, 27 }, +{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "../code/custom/4coder_scope_commands.cpp", 40, 39 }, +{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "../code/custom/4coder_eol.cpp", 29, 125 }, +{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "../code/custom/4coder_eol.cpp", 29, 112 }, +{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "../code/custom/4coder_eol.cpp", 29, 86 }, +{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "../code/custom/4coder_eol.cpp", 29, 99 }, +{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "../code/custom/4coder_base_commands.cpp", 39, 707 }, +{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "../code/custom/4coder_base_commands.cpp", 39, 749 }, +{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "../code/custom/4coder_base_commands.cpp", 39, 115 }, +{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "../code/custom/4coder_default_framework.cpp", 43, 427 }, +{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "../code/custom/4coder_default_framework.cpp", 43, 421 }, +{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1238 }, +{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1250 }, +{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1244 }, +{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "../code/custom/4coder_project_commands.cpp", 42, 1231 }, +{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 678 }, +{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 664 }, +{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "../code/custom/4coder_log_parser.cpp", 36, 994 }, +{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "../code/custom/4coder_base_commands.cpp", 39, 179 }, +{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "../code/custom/4coder_base_commands.cpp", 39, 187 }, +{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "../code/custom/4coder_combined_write_commands.cpp", 49, 237 }, +{ PROC_LINKS(string_repeat, 0), false, "string_repeat", 13, "Example of query_user_string and query_user_number", 50, "../code/custom/4coder_examples.cpp", 34, 176 }, +{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "../code/custom/4coder_default_framework.cpp", 43, 403 }, +{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "../code/custom/4coder_base_commands.cpp", 39, 1617 }, +{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "../code/custom/4coder_lists.cpp", 31, 785 }, +{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 563 }, +{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 550 }, +{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "../code/custom/4coder_base_commands.cpp", 39, 692 }, +{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "../code/custom/4coder_base_commands.cpp", 39, 701 }, +{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "../code/custom/4coder_default_framework.cpp", 43, 451 }, +{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "../code/custom/4coder_default_framework.cpp", 43, 439 }, +{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "../code/custom/4coder_default_framework.cpp", 43, 433 }, +{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "../code/custom/4coder_base_commands.cpp", 39, 806 }, +{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "../code/custom/4coder_base_commands.cpp", 39, 812 }, +{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "../code/custom/4coder_default_framework.cpp", 43, 415 }, +{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "../code/custom/4coder_default_framework.cpp", 43, 445 }, +{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "../code/custom/4coder_base_commands.cpp", 39, 797 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "../code/custom/4coder_code_index.cpp", 36, 1176 }, +{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 20 }, +{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 34 }, +{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 137 }, +{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "../code/custom/4coder_base_commands.cpp", 39, 1717 }, +{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "../code/custom/4coder_base_commands.cpp", 39, 1744 }, +{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "../code/custom/4coder_base_commands.cpp", 39, 1605 }, +{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "../code/custom/4coder_jump_lister.cpp", 37, 59 }, +{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "../code/custom/4coder_search.cpp", 32, 395 }, +{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "../code/custom/4coder_search.cpp", 32, 642 }, +{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "../code/custom/4coder_combined_write_commands.cpp", 49, 94 }, +{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 82 }, +{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 88 }, +{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "../code/custom/4coder_base_commands.cpp", 39, 67 }, +{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "../code/custom/4coder_auto_indent.cpp", 37, 433 }, +{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "../code/custom/4coder_base_commands.cpp", 39, 59 }, +{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 76 }, +{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "../code/custom/4coder_base_commands.cpp", 39, 73 }, +{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "../code/custom/4coder_combined_write_commands.cpp", 49, 100 }, }; static i32 fcoder_metacmd_ID_allow_mouse = 0; static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 1; @@ -541,197 +551,202 @@ static i32 fcoder_metacmd_ID_delete_current_scope = 40; static i32 fcoder_metacmd_ID_delete_file_query = 41; static i32 fcoder_metacmd_ID_delete_line = 42; static i32 fcoder_metacmd_ID_delete_range = 43; -static i32 fcoder_metacmd_ID_duplicate_line = 44; -static i32 fcoder_metacmd_ID_execute_any_cli = 45; -static i32 fcoder_metacmd_ID_execute_previous_cli = 46; -static i32 fcoder_metacmd_ID_exit_4coder = 47; -static i32 fcoder_metacmd_ID_goto_beginning_of_file = 48; -static i32 fcoder_metacmd_ID_goto_end_of_file = 49; -static i32 fcoder_metacmd_ID_goto_first_jump = 50; -static i32 fcoder_metacmd_ID_goto_first_jump_same_panel_sticky = 51; -static i32 fcoder_metacmd_ID_goto_jump_at_cursor = 52; -static i32 fcoder_metacmd_ID_goto_jump_at_cursor_same_panel = 53; -static i32 fcoder_metacmd_ID_goto_line = 54; -static i32 fcoder_metacmd_ID_goto_next_jump = 55; -static i32 fcoder_metacmd_ID_goto_next_jump_no_skips = 56; -static i32 fcoder_metacmd_ID_goto_prev_jump = 57; -static i32 fcoder_metacmd_ID_goto_prev_jump_no_skips = 58; -static i32 fcoder_metacmd_ID_hide_filebar = 59; -static i32 fcoder_metacmd_ID_hide_scrollbar = 60; -static i32 fcoder_metacmd_ID_hms_demo_tutorial = 61; -static i32 fcoder_metacmd_ID_if0_off = 62; -static i32 fcoder_metacmd_ID_if_read_only_goto_position = 63; -static i32 fcoder_metacmd_ID_if_read_only_goto_position_same_panel = 64; -static i32 fcoder_metacmd_ID_increase_face_size = 65; -static i32 fcoder_metacmd_ID_interactive_kill_buffer = 66; -static i32 fcoder_metacmd_ID_interactive_new = 67; -static i32 fcoder_metacmd_ID_interactive_open = 68; -static i32 fcoder_metacmd_ID_interactive_open_or_new = 69; -static i32 fcoder_metacmd_ID_interactive_switch_buffer = 70; -static i32 fcoder_metacmd_ID_jump_to_definition = 71; -static i32 fcoder_metacmd_ID_keyboard_macro_finish_recording = 72; -static i32 fcoder_metacmd_ID_keyboard_macro_replay = 73; -static i32 fcoder_metacmd_ID_keyboard_macro_start_recording = 74; -static i32 fcoder_metacmd_ID_kill_buffer = 75; -static i32 fcoder_metacmd_ID_kill_tutorial = 76; -static i32 fcoder_metacmd_ID_left_adjust_view = 77; -static i32 fcoder_metacmd_ID_list_all_functions_all_buffers = 78; -static i32 fcoder_metacmd_ID_list_all_functions_all_buffers_lister = 79; -static i32 fcoder_metacmd_ID_list_all_functions_current_buffer = 80; -static i32 fcoder_metacmd_ID_list_all_functions_current_buffer_lister = 81; -static i32 fcoder_metacmd_ID_list_all_locations = 82; -static i32 fcoder_metacmd_ID_list_all_locations_case_insensitive = 83; -static i32 fcoder_metacmd_ID_list_all_locations_of_identifier = 84; -static i32 fcoder_metacmd_ID_list_all_locations_of_identifier_case_insensitive = 85; -static i32 fcoder_metacmd_ID_list_all_locations_of_selection = 86; -static i32 fcoder_metacmd_ID_list_all_locations_of_selection_case_insensitive = 87; -static i32 fcoder_metacmd_ID_list_all_locations_of_type_definition = 88; -static i32 fcoder_metacmd_ID_list_all_locations_of_type_definition_of_identifier = 89; -static i32 fcoder_metacmd_ID_list_all_substring_locations = 90; -static i32 fcoder_metacmd_ID_list_all_substring_locations_case_insensitive = 91; -static i32 fcoder_metacmd_ID_load_project = 92; -static i32 fcoder_metacmd_ID_load_theme_current_buffer = 93; -static i32 fcoder_metacmd_ID_load_themes_default_folder = 94; -static i32 fcoder_metacmd_ID_load_themes_hot_directory = 95; -static i32 fcoder_metacmd_ID_make_directory_query = 96; -static i32 fcoder_metacmd_ID_miblo_decrement_basic = 97; -static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp = 98; -static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp_minute = 99; -static i32 fcoder_metacmd_ID_miblo_increment_basic = 100; -static i32 fcoder_metacmd_ID_miblo_increment_time_stamp = 101; -static i32 fcoder_metacmd_ID_miblo_increment_time_stamp_minute = 102; -static i32 fcoder_metacmd_ID_mouse_wheel_change_face_size = 103; -static i32 fcoder_metacmd_ID_mouse_wheel_scroll = 104; -static i32 fcoder_metacmd_ID_move_down = 105; -static i32 fcoder_metacmd_ID_move_down_10 = 106; -static i32 fcoder_metacmd_ID_move_down_textual = 107; -static i32 fcoder_metacmd_ID_move_down_to_blank_line = 108; -static i32 fcoder_metacmd_ID_move_down_to_blank_line_end = 109; -static i32 fcoder_metacmd_ID_move_down_to_blank_line_skip_whitespace = 110; -static i32 fcoder_metacmd_ID_move_left = 111; -static i32 fcoder_metacmd_ID_move_left_alpha_numeric_boundary = 112; -static i32 fcoder_metacmd_ID_move_left_alpha_numeric_or_camel_boundary = 113; -static i32 fcoder_metacmd_ID_move_left_token_boundary = 114; -static i32 fcoder_metacmd_ID_move_left_whitespace_boundary = 115; -static i32 fcoder_metacmd_ID_move_left_whitespace_or_token_boundary = 116; -static i32 fcoder_metacmd_ID_move_line_down = 117; -static i32 fcoder_metacmd_ID_move_line_up = 118; -static i32 fcoder_metacmd_ID_move_right = 119; -static i32 fcoder_metacmd_ID_move_right_alpha_numeric_boundary = 120; -static i32 fcoder_metacmd_ID_move_right_alpha_numeric_or_camel_boundary = 121; -static i32 fcoder_metacmd_ID_move_right_token_boundary = 122; -static i32 fcoder_metacmd_ID_move_right_whitespace_boundary = 123; -static i32 fcoder_metacmd_ID_move_right_whitespace_or_token_boundary = 124; -static i32 fcoder_metacmd_ID_move_up = 125; -static i32 fcoder_metacmd_ID_move_up_10 = 126; -static i32 fcoder_metacmd_ID_move_up_to_blank_line = 127; -static i32 fcoder_metacmd_ID_move_up_to_blank_line_end = 128; -static i32 fcoder_metacmd_ID_move_up_to_blank_line_skip_whitespace = 129; -static i32 fcoder_metacmd_ID_multi_paste_interactive = 130; -static i32 fcoder_metacmd_ID_multi_paste_interactive_quick = 131; -static i32 fcoder_metacmd_ID_open_all_code = 132; -static i32 fcoder_metacmd_ID_open_all_code_recursive = 133; -static i32 fcoder_metacmd_ID_open_file_in_quotes = 134; -static i32 fcoder_metacmd_ID_open_in_other = 135; -static i32 fcoder_metacmd_ID_open_long_braces = 136; -static i32 fcoder_metacmd_ID_open_long_braces_break = 137; -static i32 fcoder_metacmd_ID_open_long_braces_semicolon = 138; -static i32 fcoder_metacmd_ID_open_matching_file_cpp = 139; -static i32 fcoder_metacmd_ID_open_panel_hsplit = 140; -static i32 fcoder_metacmd_ID_open_panel_vsplit = 141; -static i32 fcoder_metacmd_ID_page_down = 142; -static i32 fcoder_metacmd_ID_page_up = 143; -static i32 fcoder_metacmd_ID_paste = 144; -static i32 fcoder_metacmd_ID_paste_and_indent = 145; -static i32 fcoder_metacmd_ID_paste_next = 146; -static i32 fcoder_metacmd_ID_paste_next_and_indent = 147; -static i32 fcoder_metacmd_ID_place_in_scope = 148; -static i32 fcoder_metacmd_ID_profile_clear = 149; -static i32 fcoder_metacmd_ID_profile_disable = 150; -static i32 fcoder_metacmd_ID_profile_enable = 151; -static i32 fcoder_metacmd_ID_profile_inspect = 152; -static i32 fcoder_metacmd_ID_project_command_lister = 153; -static i32 fcoder_metacmd_ID_project_fkey_command = 154; -static i32 fcoder_metacmd_ID_project_go_to_root_directory = 155; -static i32 fcoder_metacmd_ID_query_replace = 156; -static i32 fcoder_metacmd_ID_query_replace_identifier = 157; -static i32 fcoder_metacmd_ID_query_replace_selection = 158; -static i32 fcoder_metacmd_ID_redo = 159; -static i32 fcoder_metacmd_ID_redo_all_buffers = 160; -static i32 fcoder_metacmd_ID_rename_file_query = 161; -static i32 fcoder_metacmd_ID_reopen = 162; -static i32 fcoder_metacmd_ID_replace_in_all_buffers = 163; -static i32 fcoder_metacmd_ID_replace_in_buffer = 164; -static i32 fcoder_metacmd_ID_replace_in_range = 165; -static i32 fcoder_metacmd_ID_reverse_search = 166; -static i32 fcoder_metacmd_ID_reverse_search_identifier = 167; -static i32 fcoder_metacmd_ID_save = 168; -static i32 fcoder_metacmd_ID_save_all_dirty_buffers = 169; -static i32 fcoder_metacmd_ID_save_to_query = 170; -static i32 fcoder_metacmd_ID_search = 171; -static i32 fcoder_metacmd_ID_search_identifier = 172; -static i32 fcoder_metacmd_ID_seek_beginning_of_line = 173; -static i32 fcoder_metacmd_ID_seek_beginning_of_textual_line = 174; -static i32 fcoder_metacmd_ID_seek_end_of_line = 175; -static i32 fcoder_metacmd_ID_seek_end_of_textual_line = 176; -static i32 fcoder_metacmd_ID_select_all = 177; -static i32 fcoder_metacmd_ID_select_next_scope_absolute = 178; -static i32 fcoder_metacmd_ID_select_next_scope_after_current = 179; -static i32 fcoder_metacmd_ID_select_prev_scope_absolute = 180; -static i32 fcoder_metacmd_ID_select_prev_top_most_scope = 181; -static i32 fcoder_metacmd_ID_select_surrounding_scope = 182; -static i32 fcoder_metacmd_ID_select_surrounding_scope_maximal = 183; -static i32 fcoder_metacmd_ID_set_eol_mode_from_contents = 184; -static i32 fcoder_metacmd_ID_set_eol_mode_to_binary = 185; -static i32 fcoder_metacmd_ID_set_eol_mode_to_crlf = 186; -static i32 fcoder_metacmd_ID_set_eol_mode_to_lf = 187; -static i32 fcoder_metacmd_ID_set_face_size = 188; -static i32 fcoder_metacmd_ID_set_face_size_this_buffer = 189; -static i32 fcoder_metacmd_ID_set_mark = 190; -static i32 fcoder_metacmd_ID_set_mode_to_notepad_like = 191; -static i32 fcoder_metacmd_ID_set_mode_to_original = 192; -static i32 fcoder_metacmd_ID_setup_build_bat = 193; -static i32 fcoder_metacmd_ID_setup_build_bat_and_sh = 194; -static i32 fcoder_metacmd_ID_setup_build_sh = 195; -static i32 fcoder_metacmd_ID_setup_new_project = 196; -static i32 fcoder_metacmd_ID_show_filebar = 197; -static i32 fcoder_metacmd_ID_show_scrollbar = 198; -static i32 fcoder_metacmd_ID_show_the_log_graph = 199; -static i32 fcoder_metacmd_ID_snipe_backward_whitespace_or_token_boundary = 200; -static i32 fcoder_metacmd_ID_snipe_forward_whitespace_or_token_boundary = 201; -static i32 fcoder_metacmd_ID_snippet_lister = 202; -static i32 fcoder_metacmd_ID_suppress_mouse = 203; -static i32 fcoder_metacmd_ID_swap_panels = 204; -static i32 fcoder_metacmd_ID_theme_lister = 205; -static i32 fcoder_metacmd_ID_to_lowercase = 206; -static i32 fcoder_metacmd_ID_to_uppercase = 207; -static i32 fcoder_metacmd_ID_toggle_filebar = 208; -static i32 fcoder_metacmd_ID_toggle_fps_meter = 209; -static i32 fcoder_metacmd_ID_toggle_fullscreen = 210; -static i32 fcoder_metacmd_ID_toggle_highlight_enclosing_scopes = 211; -static i32 fcoder_metacmd_ID_toggle_highlight_line_at_cursor = 212; -static i32 fcoder_metacmd_ID_toggle_line_numbers = 213; -static i32 fcoder_metacmd_ID_toggle_line_wrap = 214; -static i32 fcoder_metacmd_ID_toggle_mouse = 215; -static i32 fcoder_metacmd_ID_toggle_paren_matching_helper = 216; -static i32 fcoder_metacmd_ID_toggle_show_whitespace = 217; -static i32 fcoder_metacmd_ID_toggle_virtual_whitespace = 218; -static i32 fcoder_metacmd_ID_tutorial_maximize = 219; -static i32 fcoder_metacmd_ID_tutorial_minimize = 220; -static i32 fcoder_metacmd_ID_uncomment_line = 221; -static i32 fcoder_metacmd_ID_undo = 222; -static i32 fcoder_metacmd_ID_undo_all_buffers = 223; -static i32 fcoder_metacmd_ID_view_buffer_other_panel = 224; -static i32 fcoder_metacmd_ID_view_jump_list_with_lister = 225; -static i32 fcoder_metacmd_ID_word_complete = 226; -static i32 fcoder_metacmd_ID_word_complete_drop_down = 227; -static i32 fcoder_metacmd_ID_write_block = 228; -static i32 fcoder_metacmd_ID_write_hack = 229; -static i32 fcoder_metacmd_ID_write_note = 230; -static i32 fcoder_metacmd_ID_write_space = 231; -static i32 fcoder_metacmd_ID_write_text_and_auto_indent = 232; -static i32 fcoder_metacmd_ID_write_text_input = 233; -static i32 fcoder_metacmd_ID_write_todo = 234; -static i32 fcoder_metacmd_ID_write_underscore = 235; -static i32 fcoder_metacmd_ID_write_zero_struct = 236; +static i32 fcoder_metacmd_ID_display_key_codes = 44; +static i32 fcoder_metacmd_ID_display_text_input = 45; +static i32 fcoder_metacmd_ID_double_backspace = 46; +static i32 fcoder_metacmd_ID_duplicate_line = 47; +static i32 fcoder_metacmd_ID_execute_any_cli = 48; +static i32 fcoder_metacmd_ID_execute_previous_cli = 49; +static i32 fcoder_metacmd_ID_exit_4coder = 50; +static i32 fcoder_metacmd_ID_goto_beginning_of_file = 51; +static i32 fcoder_metacmd_ID_goto_end_of_file = 52; +static i32 fcoder_metacmd_ID_goto_first_jump = 53; +static i32 fcoder_metacmd_ID_goto_first_jump_same_panel_sticky = 54; +static i32 fcoder_metacmd_ID_goto_jump_at_cursor = 55; +static i32 fcoder_metacmd_ID_goto_jump_at_cursor_same_panel = 56; +static i32 fcoder_metacmd_ID_goto_line = 57; +static i32 fcoder_metacmd_ID_goto_next_jump = 58; +static i32 fcoder_metacmd_ID_goto_next_jump_no_skips = 59; +static i32 fcoder_metacmd_ID_goto_prev_jump = 60; +static i32 fcoder_metacmd_ID_goto_prev_jump_no_skips = 61; +static i32 fcoder_metacmd_ID_hide_filebar = 62; +static i32 fcoder_metacmd_ID_hide_scrollbar = 63; +static i32 fcoder_metacmd_ID_hms_demo_tutorial = 64; +static i32 fcoder_metacmd_ID_if0_off = 65; +static i32 fcoder_metacmd_ID_if_read_only_goto_position = 66; +static i32 fcoder_metacmd_ID_if_read_only_goto_position_same_panel = 67; +static i32 fcoder_metacmd_ID_increase_face_size = 68; +static i32 fcoder_metacmd_ID_interactive_kill_buffer = 69; +static i32 fcoder_metacmd_ID_interactive_new = 70; +static i32 fcoder_metacmd_ID_interactive_open = 71; +static i32 fcoder_metacmd_ID_interactive_open_or_new = 72; +static i32 fcoder_metacmd_ID_interactive_switch_buffer = 73; +static i32 fcoder_metacmd_ID_jump_to_definition = 74; +static i32 fcoder_metacmd_ID_keyboard_macro_finish_recording = 75; +static i32 fcoder_metacmd_ID_keyboard_macro_replay = 76; +static i32 fcoder_metacmd_ID_keyboard_macro_start_recording = 77; +static i32 fcoder_metacmd_ID_kill_buffer = 78; +static i32 fcoder_metacmd_ID_kill_tutorial = 79; +static i32 fcoder_metacmd_ID_left_adjust_view = 80; +static i32 fcoder_metacmd_ID_list_all_functions_all_buffers = 81; +static i32 fcoder_metacmd_ID_list_all_functions_all_buffers_lister = 82; +static i32 fcoder_metacmd_ID_list_all_functions_current_buffer = 83; +static i32 fcoder_metacmd_ID_list_all_functions_current_buffer_lister = 84; +static i32 fcoder_metacmd_ID_list_all_locations = 85; +static i32 fcoder_metacmd_ID_list_all_locations_case_insensitive = 86; +static i32 fcoder_metacmd_ID_list_all_locations_of_identifier = 87; +static i32 fcoder_metacmd_ID_list_all_locations_of_identifier_case_insensitive = 88; +static i32 fcoder_metacmd_ID_list_all_locations_of_selection = 89; +static i32 fcoder_metacmd_ID_list_all_locations_of_selection_case_insensitive = 90; +static i32 fcoder_metacmd_ID_list_all_locations_of_type_definition = 91; +static i32 fcoder_metacmd_ID_list_all_locations_of_type_definition_of_identifier = 92; +static i32 fcoder_metacmd_ID_list_all_substring_locations = 93; +static i32 fcoder_metacmd_ID_list_all_substring_locations_case_insensitive = 94; +static i32 fcoder_metacmd_ID_load_project = 95; +static i32 fcoder_metacmd_ID_load_theme_current_buffer = 96; +static i32 fcoder_metacmd_ID_load_themes_default_folder = 97; +static i32 fcoder_metacmd_ID_load_themes_hot_directory = 98; +static i32 fcoder_metacmd_ID_make_directory_query = 99; +static i32 fcoder_metacmd_ID_miblo_decrement_basic = 100; +static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp = 101; +static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp_minute = 102; +static i32 fcoder_metacmd_ID_miblo_increment_basic = 103; +static i32 fcoder_metacmd_ID_miblo_increment_time_stamp = 104; +static i32 fcoder_metacmd_ID_miblo_increment_time_stamp_minute = 105; +static i32 fcoder_metacmd_ID_mouse_wheel_change_face_size = 106; +static i32 fcoder_metacmd_ID_mouse_wheel_scroll = 107; +static i32 fcoder_metacmd_ID_move_down = 108; +static i32 fcoder_metacmd_ID_move_down_10 = 109; +static i32 fcoder_metacmd_ID_move_down_textual = 110; +static i32 fcoder_metacmd_ID_move_down_to_blank_line = 111; +static i32 fcoder_metacmd_ID_move_down_to_blank_line_end = 112; +static i32 fcoder_metacmd_ID_move_down_to_blank_line_skip_whitespace = 113; +static i32 fcoder_metacmd_ID_move_left = 114; +static i32 fcoder_metacmd_ID_move_left_alpha_numeric_boundary = 115; +static i32 fcoder_metacmd_ID_move_left_alpha_numeric_or_camel_boundary = 116; +static i32 fcoder_metacmd_ID_move_left_token_boundary = 117; +static i32 fcoder_metacmd_ID_move_left_whitespace_boundary = 118; +static i32 fcoder_metacmd_ID_move_left_whitespace_or_token_boundary = 119; +static i32 fcoder_metacmd_ID_move_line_down = 120; +static i32 fcoder_metacmd_ID_move_line_up = 121; +static i32 fcoder_metacmd_ID_move_right = 122; +static i32 fcoder_metacmd_ID_move_right_alpha_numeric_boundary = 123; +static i32 fcoder_metacmd_ID_move_right_alpha_numeric_or_camel_boundary = 124; +static i32 fcoder_metacmd_ID_move_right_token_boundary = 125; +static i32 fcoder_metacmd_ID_move_right_whitespace_boundary = 126; +static i32 fcoder_metacmd_ID_move_right_whitespace_or_token_boundary = 127; +static i32 fcoder_metacmd_ID_move_up = 128; +static i32 fcoder_metacmd_ID_move_up_10 = 129; +static i32 fcoder_metacmd_ID_move_up_to_blank_line = 130; +static i32 fcoder_metacmd_ID_move_up_to_blank_line_end = 131; +static i32 fcoder_metacmd_ID_move_up_to_blank_line_skip_whitespace = 132; +static i32 fcoder_metacmd_ID_multi_paste_interactive = 133; +static i32 fcoder_metacmd_ID_multi_paste_interactive_quick = 134; +static i32 fcoder_metacmd_ID_open_all_code = 135; +static i32 fcoder_metacmd_ID_open_all_code_recursive = 136; +static i32 fcoder_metacmd_ID_open_file_in_quotes = 137; +static i32 fcoder_metacmd_ID_open_in_other = 138; +static i32 fcoder_metacmd_ID_open_long_braces = 139; +static i32 fcoder_metacmd_ID_open_long_braces_break = 140; +static i32 fcoder_metacmd_ID_open_long_braces_semicolon = 141; +static i32 fcoder_metacmd_ID_open_matching_file_cpp = 142; +static i32 fcoder_metacmd_ID_open_panel_hsplit = 143; +static i32 fcoder_metacmd_ID_open_panel_vsplit = 144; +static i32 fcoder_metacmd_ID_page_down = 145; +static i32 fcoder_metacmd_ID_page_up = 146; +static i32 fcoder_metacmd_ID_paste = 147; +static i32 fcoder_metacmd_ID_paste_and_indent = 148; +static i32 fcoder_metacmd_ID_paste_next = 149; +static i32 fcoder_metacmd_ID_paste_next_and_indent = 150; +static i32 fcoder_metacmd_ID_place_in_scope = 151; +static i32 fcoder_metacmd_ID_play_with_a_counter = 152; +static i32 fcoder_metacmd_ID_profile_clear = 153; +static i32 fcoder_metacmd_ID_profile_disable = 154; +static i32 fcoder_metacmd_ID_profile_enable = 155; +static i32 fcoder_metacmd_ID_profile_inspect = 156; +static i32 fcoder_metacmd_ID_project_command_lister = 157; +static i32 fcoder_metacmd_ID_project_fkey_command = 158; +static i32 fcoder_metacmd_ID_project_go_to_root_directory = 159; +static i32 fcoder_metacmd_ID_query_replace = 160; +static i32 fcoder_metacmd_ID_query_replace_identifier = 161; +static i32 fcoder_metacmd_ID_query_replace_selection = 162; +static i32 fcoder_metacmd_ID_redo = 163; +static i32 fcoder_metacmd_ID_redo_all_buffers = 164; +static i32 fcoder_metacmd_ID_rename_file_query = 165; +static i32 fcoder_metacmd_ID_reopen = 166; +static i32 fcoder_metacmd_ID_replace_in_all_buffers = 167; +static i32 fcoder_metacmd_ID_replace_in_buffer = 168; +static i32 fcoder_metacmd_ID_replace_in_range = 169; +static i32 fcoder_metacmd_ID_reverse_search = 170; +static i32 fcoder_metacmd_ID_reverse_search_identifier = 171; +static i32 fcoder_metacmd_ID_save = 172; +static i32 fcoder_metacmd_ID_save_all_dirty_buffers = 173; +static i32 fcoder_metacmd_ID_save_to_query = 174; +static i32 fcoder_metacmd_ID_search = 175; +static i32 fcoder_metacmd_ID_search_identifier = 176; +static i32 fcoder_metacmd_ID_seek_beginning_of_line = 177; +static i32 fcoder_metacmd_ID_seek_beginning_of_textual_line = 178; +static i32 fcoder_metacmd_ID_seek_end_of_line = 179; +static i32 fcoder_metacmd_ID_seek_end_of_textual_line = 180; +static i32 fcoder_metacmd_ID_select_all = 181; +static i32 fcoder_metacmd_ID_select_next_scope_absolute = 182; +static i32 fcoder_metacmd_ID_select_next_scope_after_current = 183; +static i32 fcoder_metacmd_ID_select_prev_scope_absolute = 184; +static i32 fcoder_metacmd_ID_select_prev_top_most_scope = 185; +static i32 fcoder_metacmd_ID_select_surrounding_scope = 186; +static i32 fcoder_metacmd_ID_select_surrounding_scope_maximal = 187; +static i32 fcoder_metacmd_ID_set_eol_mode_from_contents = 188; +static i32 fcoder_metacmd_ID_set_eol_mode_to_binary = 189; +static i32 fcoder_metacmd_ID_set_eol_mode_to_crlf = 190; +static i32 fcoder_metacmd_ID_set_eol_mode_to_lf = 191; +static i32 fcoder_metacmd_ID_set_face_size = 192; +static i32 fcoder_metacmd_ID_set_face_size_this_buffer = 193; +static i32 fcoder_metacmd_ID_set_mark = 194; +static i32 fcoder_metacmd_ID_set_mode_to_notepad_like = 195; +static i32 fcoder_metacmd_ID_set_mode_to_original = 196; +static i32 fcoder_metacmd_ID_setup_build_bat = 197; +static i32 fcoder_metacmd_ID_setup_build_bat_and_sh = 198; +static i32 fcoder_metacmd_ID_setup_build_sh = 199; +static i32 fcoder_metacmd_ID_setup_new_project = 200; +static i32 fcoder_metacmd_ID_show_filebar = 201; +static i32 fcoder_metacmd_ID_show_scrollbar = 202; +static i32 fcoder_metacmd_ID_show_the_log_graph = 203; +static i32 fcoder_metacmd_ID_snipe_backward_whitespace_or_token_boundary = 204; +static i32 fcoder_metacmd_ID_snipe_forward_whitespace_or_token_boundary = 205; +static i32 fcoder_metacmd_ID_snippet_lister = 206; +static i32 fcoder_metacmd_ID_string_repeat = 207; +static i32 fcoder_metacmd_ID_suppress_mouse = 208; +static i32 fcoder_metacmd_ID_swap_panels = 209; +static i32 fcoder_metacmd_ID_theme_lister = 210; +static i32 fcoder_metacmd_ID_to_lowercase = 211; +static i32 fcoder_metacmd_ID_to_uppercase = 212; +static i32 fcoder_metacmd_ID_toggle_filebar = 213; +static i32 fcoder_metacmd_ID_toggle_fps_meter = 214; +static i32 fcoder_metacmd_ID_toggle_fullscreen = 215; +static i32 fcoder_metacmd_ID_toggle_highlight_enclosing_scopes = 216; +static i32 fcoder_metacmd_ID_toggle_highlight_line_at_cursor = 217; +static i32 fcoder_metacmd_ID_toggle_line_numbers = 218; +static i32 fcoder_metacmd_ID_toggle_line_wrap = 219; +static i32 fcoder_metacmd_ID_toggle_mouse = 220; +static i32 fcoder_metacmd_ID_toggle_paren_matching_helper = 221; +static i32 fcoder_metacmd_ID_toggle_show_whitespace = 222; +static i32 fcoder_metacmd_ID_toggle_virtual_whitespace = 223; +static i32 fcoder_metacmd_ID_tutorial_maximize = 224; +static i32 fcoder_metacmd_ID_tutorial_minimize = 225; +static i32 fcoder_metacmd_ID_uncomment_line = 226; +static i32 fcoder_metacmd_ID_undo = 227; +static i32 fcoder_metacmd_ID_undo_all_buffers = 228; +static i32 fcoder_metacmd_ID_view_buffer_other_panel = 229; +static i32 fcoder_metacmd_ID_view_jump_list_with_lister = 230; +static i32 fcoder_metacmd_ID_word_complete = 231; +static i32 fcoder_metacmd_ID_word_complete_drop_down = 232; +static i32 fcoder_metacmd_ID_write_block = 233; +static i32 fcoder_metacmd_ID_write_hack = 234; +static i32 fcoder_metacmd_ID_write_note = 235; +static i32 fcoder_metacmd_ID_write_space = 236; +static i32 fcoder_metacmd_ID_write_text_and_auto_indent = 237; +static i32 fcoder_metacmd_ID_write_text_input = 238; +static i32 fcoder_metacmd_ID_write_todo = 239; +static i32 fcoder_metacmd_ID_write_underscore = 240; +static i32 fcoder_metacmd_ID_write_zero_struct = 241; #endif From 3a27541ceb4601655e282d5d28df694a6e50f69a Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sun, 1 Mar 2020 13:29:32 -0800 Subject: [PATCH 30/40] Cleaning up package script output --- bin/4ed_build.cpp | 30 +++------- bin/itchio_push_linux.sh | 24 ++++++++ bin/itchio_push_mac.sh | 2 +- bin/package-linux.sh | 4 ++ bin/package.sh | 4 -- custom/4coder_base_types.h | 18 +++--- custom/4coder_file_moving.h | 89 +++++++++++++++++++++++------- custom/bin/build_metadata.sh | 0 custom/bin/buildsuper_x86-linux.sh | 49 +++++----------- custom/bin/detect_os.sh | 0 opengl/4ed_opengl_defines.h | 16 ++++-- platform_linux/linux_4ed.cpp | 6 ++ platform_linux/linux_error_box.cpp | 78 +++++++++++++------------- project.4coder | 6 +- 14 files changed, 187 insertions(+), 139 deletions(-) create mode 100644 bin/itchio_push_linux.sh create mode 100755 bin/package-linux.sh delete mode 100644 bin/package.sh mode change 100644 => 100755 custom/bin/build_metadata.sh mode change 100644 => 100755 custom/bin/buildsuper_x86-linux.sh mode change 100644 => 100755 custom/bin/detect_os.sh diff --git a/bin/4ed_build.cpp b/bin/4ed_build.cpp index 55741d53..be489814 100644 --- a/bin/4ed_build.cpp +++ b/bin/4ed_build.cpp @@ -492,24 +492,20 @@ build_and_run(Arena *arena, char *cdir, char *filename, char *name, u32 flags){ { char *file = fm_str(arena, filename); - BEGIN_TIME_SECTION(); build(arena, flags, Arch_X64, cdir, file, dir, name, get_defines_from_flags(arena, flags), 0, includes); - END_TIME_SECTION(fm_str(arena, "build ", name)); } if (prev_error == 0){ char *cmd = fm_str(arena, dir, "/", name); - BEGIN_TIME_SECTION(); fm_execute_in_dir(cdir, cmd, 0); - END_TIME_SECTION(fm_str(arena, "run ", name)); } } internal void buildsuper(Arena *arena, char *cdir, char *file, u32 arch){ - printf("BUILDSUPER: cdir: %s; file: %s; arch: %u\n", cdir, file, arch); + printf("BUILDSUPER:\n cdir = %s;\n file = %s;\n arch = %s;\n", cdir, file, arch_names[arch]); + fflush(stdout); - BEGIN_TIME_SECTION(); Temp_Dir temp = fm_pushdir(fm_str(arena, BUILD_DIR)); char *build_script_postfix = ""; @@ -536,7 +532,6 @@ buildsuper(Arena *arena, char *cdir, char *file, u32 arch){ systemf("%s", build_command); fm_popdir(temp); - END_TIME_SECTION("build custom"); fflush(stdout); } @@ -550,26 +545,20 @@ build_main(Arena *arena, char *cdir, b32 update_local_theme, u32 flags, u32 arch char **build_includes = includes; - BEGIN_TIME_SECTION(); build(arena, OPTS | SHARED_CODE | flags, arch, cdir, file, dir, "4ed_app" DLL, get_defines_from_flags(arena, flags), exports, build_includes); - END_TIME_SECTION("build 4ed_app"); } { - BEGIN_TIME_SECTION(); char **inc = (char**)fm_list(arena, includes, platform_includes[This_OS][This_Compiler]); build(arena, OPTS | LIBS | ICON | flags, arch, cdir, platform_layers[This_OS], dir, "4ed", get_defines_from_flags(arena, flags), 0, inc); - END_TIME_SECTION("build 4ed"); } if (update_local_theme){ - BEGIN_TIME_SECTION(); char *themes_folder = fm_str(arena, "../build/themes"); char *source_themes_folder = fm_str(arena, "ship_files/themes"); fm_clear_folder(themes_folder); fm_make_folder_if_missing(arena, themes_folder); fm_copy_all(source_themes_folder, themes_folder); - END_TIME_SECTION("move files"); } fflush(stdout); @@ -606,10 +595,10 @@ package_for_arch(Arena *arena, u32 arch, char *cdir, char *build_dir, char *pack char *dir = fm_str(arena, parent_dir, SLASH "4coder"); char *zip_dir = fm_str(arena, pack_dir, SLASH, tier_name, "_", arch_name); - printf("\nbuild: %s_%s\n", tier_name, arch_name); - printf("parent_dir: %s\n", parent_dir); - printf("dir: %s\n", dir); - printf("zip_dir: %s\n", zip_dir); + printf("\nBUILD: %s_%s\n", tier_name, arch_name); + printf(" parent_dir = %s;\n", parent_dir); + printf(" dir = %s;\n", dir); + printf(" zip_dir = %s;\n", zip_dir); fflush(stdout); buildsuper(arena, cdir, fm_str(arena, default_custom_target), arch); @@ -634,10 +623,7 @@ package_for_arch(Arena *arena, u32 arch, char *cdir, char *build_dir, char *pack if (tier == Tier_Super){ char *custom_src_dir = fm_str(arena, cdir, SLASH, "custom"); char *custom_dst_dir = fm_str(arena, dir, SLASH, "custom"); - // HACK(yuval): make_folder_if_missing seems to cause a second custom folder to be created inside the custom folder on macOS. - //if (This_OS != Platform_Mac){ fm_make_folder_if_missing(arena, custom_dst_dir); - //} fm_copy_all(custom_src_dir, custom_dst_dir); } @@ -693,13 +679,11 @@ package(Arena *arena, char *cdir){ } int main(int argc, char **argv){ - Arena arena = fm_init_system(); + Arena arena = fm_init_system(DetailLevel_FileOperations); char cdir[256]; - BEGIN_TIME_SECTION(); i32 n = fm_get_current_directory(cdir, sizeof(cdir)); Assert(n < sizeof(cdir)); - END_TIME_SECTION("current directory"); u32 flags = SUPER; u32 arch = Arch_X64; diff --git a/bin/itchio_push_linux.sh b/bin/itchio_push_linux.sh new file mode 100644 index 00000000..8c612a2c --- /dev/null +++ b/bin/itchio_push_linux.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +if [ "$#" -lt "3" ] +then +echo need 3 parameters +exit +else + +fake=$1 +maj=$2 +min=$3 + +vr=$fake.$maj.$min +fv=$fake-$maj-$min + +flags="--fix-permissions --userversion=$vr" +dir=../current_dist_all_os + +butler push $flags $dir/demo_x64/4coder-$fv-demo-linux-x64.zip 4coder/4coder:linux-x64-demo +butler push $flags $dir/demo_x64/4coder-$fv-demo-linux-x86.zip 4coder/4coder:linux-x86-demo +butler push $flags $dir/super_x64/4coder-$fv-super-linux-x64.zip 4coder/4coder:linux-x64 +butler push $flags $dir/super_x64/4coder-$fv-super-linux-x86.zip 4coder/4coder:linux-x86 + +fi diff --git a/bin/itchio_push_mac.sh b/bin/itchio_push_mac.sh index cf5a7d5b..ba8a0f03 100755 --- a/bin/itchio_push_mac.sh +++ b/bin/itchio_push_mac.sh @@ -17,6 +17,6 @@ flags="--fix-permissions --userversion=$vr" dir=../distributions butler push $flags $dir/demo_x64/4coder-$fv-demo-mac-x64.zip 4coder/4coder:mac-x64-demo -butler push $flags $dir/super_x64/4coder-$fv-super-mac-x64.zip 4coder/4coder:mac-x64 +butler push $flags $dir/super_x64/4coder-$fv-super-mac-x64.zip 4coder/4coder:mac-x64 fi diff --git a/bin/package-linux.sh b/bin/package-linux.sh new file mode 100755 index 00000000..847b8816 --- /dev/null +++ b/bin/package-linux.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +chmod 777 bin/build-linux.sh +bin/build-linux.sh "-DPACKAGE" diff --git a/bin/package.sh b/bin/package.sh deleted file mode 100644 index cd5f161f..00000000 --- a/bin/package.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -chmod 777 build.sh -./build.sh "-DPACKAGE" diff --git a/custom/4coder_base_types.h b/custom/4coder_base_types.h index 78ee4ea7..f8e550c8 100644 --- a/custom/4coder_base_types.h +++ b/custom/4coder_base_types.h @@ -135,17 +135,17 @@ //////////////////////////////// #if COMPILER_CL -#if _MSC_VER <= 1800 -# define snprintf _snprintf -#endif +# if _MSC_VER <= 1800 +# define snprintf _snprintf +# endif -#if (_MSC_VER <= 1500) -#define JUST_GUESS_INTS -#endif +# if (_MSC_VER <= 1500) +# define JUST_GUESS_INTS +# endif #endif // NOTE(yuval): Changed this so that CALL_CONVENTION will be defined for all platforms -#if ARCH_32BIT +#if ARCH_32BIT && OS_WINDOWS # define CALL_CONVENTION __stdcall #else # define CALL_CONVENTION @@ -527,8 +527,8 @@ union SNode{ #define zdll_remove_back_NP_(f,l,next,prev) ((f==l)?(f=l=0):(l->prev->next=0,l=l->prev)) #define zdll_remove_NP_(f,l,n,next,prev) \ ((l==n)?(zdll_remove_back_NP_(f,l,next,prev)) \ - :(f==n)?(zdll_remove_back_NP_(l,f,prev,next)) \ - : (dll_remove_NP_(n,n,next,prev))) +:(f==n)?(zdll_remove_back_NP_(l,f,prev,next)) \ +: (dll_remove_NP_(n,n,next,prev))) #define zdll_push_back(f,l,n) zdll_push_back_NP_((f),(l),(n),next,prev) #define zdll_push_front(f,l,n) zdll_push_back_NP_((l),(f),(n),prev,next) diff --git a/custom/4coder_file_moving.h b/custom/4coder_file_moving.h index 9e5ea59f..e05fa4e0 100644 --- a/custom/4coder_file_moving.h +++ b/custom/4coder_file_moving.h @@ -17,10 +17,6 @@ #include #include -// -// API -// - // System commands static char SF_CMD[4096]; static i32 error_state = 0; @@ -43,15 +39,18 @@ if (prev_error != 0) error_state = 1; \ internal void fm_execute_in_dir(char *dir, char *str, char *args); // Init -internal Arena fm_init_system(); +enum{ + DetailLevel_Basics = 0, + DetailLevel_FileOperations = 1, + DetailLevel_Everything = 2, +}; +global i32 detail_level = 0; + +internal Arena fm_init_system(i32 detail_level); // Timing internal u64 fm_get_time(); -#define LLU_CAST(n) (long long unsigned int)(n) -#define BEGIN_TIME_SECTION() u64 start = fm_get_time() -#define END_TIME_SECTION(n) u64 total = fm_get_time() - start; printf("%-20s: %.2llu.%.6llu\n", (n), LLU_CAST(total/1000000), LLU_CAST(total%1000000)); - // Files and Folders Manipulation internal void fm_make_folder_if_missing(Arena *arena, char *dir); internal void fm_clear_folder(char *folder); @@ -183,6 +182,16 @@ fm__init_memory(void){ return(make_arena_malloc(MB(512), 8)); } +function b32 +fm__show_details_for_file_operations(void){ + return(detail_level >= DetailLevel_FileOperations); +} + +function b32 +fm__show_details_for_zip_output(void){ + return(detail_level >= DetailLevel_Everything); +} + // // Windows implementation // @@ -266,7 +275,8 @@ extern "C"{ global u64 perf_frequency; internal Arena -fm_init_system(void){ +fm_init_system(i32 det){ + detail_level = det; LARGE_INTEGER lint; if (QueryPerformanceFrequency(&lint)){ perf_frequency = lint.QuadPart; @@ -351,7 +361,9 @@ fm_make_folder_if_missing(Arena *arena, char *dir){ internal void fm_clear_folder(char *folder){ - fprintf(stdout, "clearing folder %s\n", folder); + if (fm__show_details_for_file_operations()){ + fprintf(stdout, "clearing folder %s\n", folder); + } fflush(stdout); systemf("del /S /Q /F %s\\* > nul & rmdir /S /Q %s > nul & mkdir %s > nul", folder, folder, folder); } @@ -363,14 +375,18 @@ fm_delete_file(char *file){ internal void fm_copy_file(char *file, char *newname){ - printf("copy %s to %s\n", file, newname); + if (fm__show_details_for_file_operations()){ + printf("copy %s to %s\n", file, newname); + } fflush(stdout); CopyFileA(file, newname, 0); } internal void fm_copy_all(char *source, char *folder){ - fprintf(stdout, "copy %s to %s\n", source, folder); + if (fm__show_details_for_file_operations()){ + fprintf(stdout, "copy %s to %s\n", source, folder); + } fflush(stdout); systemf("xcopy /s /e /y /q %s %s > nul", source, folder); } @@ -394,17 +410,27 @@ fm_write_file(char *file_name, char *data, u32 size){ internal void fm_zip(char *parent, char *folder, char *dest){ - printf("zipping %s\\%s to %s\n", parent, folder, dest); + if (fm__show_details_for_file_operations()){ + printf("zipping %s\\%s to %s\n", parent, folder, dest); + } fflush(stdout); char cdir[512]; fm_get_current_directory(cdir, sizeof(cdir)); + char *hide_output = " > nul >> nul"; + char *show_output = ""; + char *output_rule = hide_output; + if (fm__show_details_for_zip_output()){ + output_rule = show_output; + } + Temp_Dir temp = fm_pushdir(parent); - systemf("%s\\bin\\zip %s\\4ed_gobble.zip > nul", cdir, cdir); + systemf("%s\\bin\\zip %s\\4ed_gobble.zip%s", cdir, cdir, output_rule); fm_popdir(temp); - systemf("copy %s\\4ed_gobble.zip %s > nul & del %s\\4ed_gobble.zip > nul", cdir, dest, cdir); + systemf("copy %s\\4ed_gobble.zip %s%s & del %s\\4ed_gobble.zip%s", + cdir, dest, output_rule, cdir, output_rule); } // @@ -435,7 +461,8 @@ fm_popdir(Temp_Dir temp){ } internal Arena -fm_init_system(){ +fm_init_system(i32 det){ + detail_level = det; return(fm__init_memory()); } @@ -492,7 +519,9 @@ fm_make_folder_if_missing(Arena *arena, char *dir){ internal void fm_clear_folder(char *folder){ - fprintf(stdout, "clearing folder %s\n", folder); + if (fm__show_details_for_file_operations()){ + fprintf(stdout, "clearing folder %s\n", folder); + } fflush(stdout); systemf("rm -rf %s* > /dev/null", folder); } @@ -504,12 +533,19 @@ fm_delete_file(char *file){ internal void fm_copy_file(char *file, char *newname){ + if (fm__show_details_for_file_operations()){ + printf("copy %s to %s\n", file, newname); + } + fflush(stdout); systemf("cp %s %s", file, newname); } internal void fm_copy_all(char *source, char *folder){ - fprintf(stdout, "copy %s to %s\n", source, folder); + if (fm__show_details_for_file_operations()){ + fprintf(stdout, "copy %s to %s\n", source, folder); + } + fflush(stdout); systemf("cp -rf %s/* %s > /dev/null", source, folder); } @@ -525,9 +561,20 @@ fm_write_file(char *file_name, char *data, u32 size){ internal void fm_zip(char *parent, char *folder, char *file){ + if (fm__show_details_for_file_operations()){ + printf("zipping %s/%s to %s\n", parent, folder, file); + } + fflush(stdout); + + char *hide_output = " > nul 2> nul"; + char *show_output = ""; + char *output_rule = hide_output; + if (fm__show_details_for_zip_output()){ + output_rule = show_output; + } + Temp_Dir temp = fm_pushdir(parent); - printf("PARENT DIR: %s\n", parent); - systemf("zip -r %s %s", file, folder); + systemf("zip -r %s %s%s", file, folder, output_rule); fm_popdir(temp); } diff --git a/custom/bin/build_metadata.sh b/custom/bin/build_metadata.sh old mode 100644 new mode 100755 diff --git a/custom/bin/buildsuper_x86-linux.sh b/custom/bin/buildsuper_x86-linux.sh old mode 100644 new mode 100755 index 18d247aa..becc4c47 --- a/custom/bin/buildsuper_x86-linux.sh +++ b/custom/bin/buildsuper_x86-linux.sh @@ -1,52 +1,31 @@ #!/bin/bash -# Store the real CWD -REAL_PWD="$PWD" +# If any command errors, stop the script +set -e -# Find the code home folder -TARGET_FILE="$0" -cd `dirname $TARGET_FILE` -TARGET_FILE=`basename $TARGET_FILE` -while [ -L "$TARGET_FILE" ] -do - TARGET_FILE=`readlink $TARGET_FILE` - cd `dirname $TARGET_FILE` - TARGET_FILE=`basename $TARGET_FILE` -done -PHYS_DIR=`pwd -P` -SCRIPT_FILE=$PHYS_DIR/$TARGET_FILE -code_home=$(dirname "$SCRIPT_FILE") +# Store the real CWD +ME="$(readlink -f "$0")" +LOCATION="$(dirname "$ME")" +CODE_HOME="$(dirname "$LOCATION")" # Find the most reasonable candidate build file SOURCE="$1" if [ -z "$SOURCE" ]; then - SOURCE="$code_home/4coder_default_bindings.cpp" + SOURCE="$(readlink -f "$CODE_HOME/4coder_default_bindings.cpp")" fi -TARGET_FILE="$SOURCE" -cd `dirname $TARGET_FILE` -TARGET_FILE=`basename $TARGET_FILE` -while [ -L "$TARGET_FILE" ] -do - TARGET_FILE=`readlink $TARGET_FILE` - cd `dirname $TARGET_FILE` - TARGET_FILE=`basename $TARGET_FILE` -done -PHYS_DIR=`pwd -P` -SOURCE=$PHYS_DIR/$TARGET_FILE - -opts="-Wno-write-strings -Wno-null-dereference -Wno-comment -Wno-switch -Wno-writable-strings -g -DOS_LINUX=1 -DOS_WINDOWS=0 -DOS_MAC=1" +opts="-Wno-write-strings -Wno-null-dereference -Wno-comment -Wno-switch -Wno-missing-declarations -Wno-logical-op-parentheses -g -DOS_LINUX=1 -DOS_WINDOWS=0 -DOS_MAC=1" arch=-m32 -cd "$REAL_PWD" preproc_file=4coder_command_metadata.i meta_macros="-DMETA_PASS" -g++ -I"$code_home" $meta_macros $arch $opts $debug -std=gnu++0x "$SOURCE" -E -o $preproc_file -g++ -I"$code_home" $opts $debug -std=gnu++0x "$code_home/4coder_metadata_generator.cpp" -o metadata_generator -./metadata_generator -R "$code_home" "$PWD/$preproc_file" +g++ -I"$CODE_HOME" $meta_macros $arch $opts $debug -std=c++11 "$SOURCE" -E -o $preproc_file +g++ -I"$CODE_HOME" $opts $debug -std=c++11 "$CODE_HOME/4coder_metadata_generator.cpp" -o "$CODE_HOME/metadata_generator" +"$CODE_HOME/metadata_generator" -R "$CODE_HOME" "$PWD/$preproc_file" -g++ -I"$code_home" $arch $opts $debug -std=gnu++0x "$SOURCE" -shared -o custom_4coder.so -fPIC +g++ -I"$CODE_HOME" $arch $opts $debug -std=gnu++0x "$SOURCE" -shared -o custom_4coder.so -fPIC -rm metadata_generator +rm "$CODE_HOME/metadata_generator" rm $preproc_file + diff --git a/custom/bin/detect_os.sh b/custom/bin/detect_os.sh old mode 100644 new mode 100755 diff --git a/opengl/4ed_opengl_defines.h b/opengl/4ed_opengl_defines.h index 2fec0704..b3ba33ef 100644 --- a/opengl/4ed_opengl_defines.h +++ b/opengl/4ed_opengl_defines.h @@ -210,22 +210,30 @@ typedef char GLchar; typedef short GLshort; typedef signed char GLbyte; typedef unsigned short GLushort; + +#if !OS_LINUX typedef ptrdiff_t GLsizeiptr; typedef ptrdiff_t GLintptr; +#endif +#if OS_LINUX typedef void GL_Debug_Function(GLenum src, GLenum type, GLuint id, GLenum severity, GLsizei length, -#ifdef OS_LINUX const GLchar* message, - const void *user_data + const void *user_data); #else +typedef void GL_Debug_Function(GLenum src, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, GLchar *message, - void *user_data + void *user_data); #endif - ); + typedef GL_Debug_Function *GLDEBUGPROC; #endif diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index c114b406..6f1fb3b4 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -534,6 +534,12 @@ linux_set_icon(Display* d, Window w){ #include "linux_error_box.cpp" +function void +os_popup_error(char *title, char *message){ + system_error_box(message); + exit(1); +} + //////////////////////////// #include "linux_4ed_functions.cpp" diff --git a/platform_linux/linux_error_box.cpp b/platform_linux/linux_error_box.cpp index f61aa3d6..531efebe 100644 --- a/platform_linux/linux_error_box.cpp +++ b/platform_linux/linux_error_box.cpp @@ -15,16 +15,16 @@ internal void system_error_box(char *msg, b32 shutdown = true){ fprintf(stderr, "Fatal Error: %s\n", msg); //LOGF("Fatal Error: %s\n", msg); - + Display *dpy = XOpenDisplay(0); if (!dpy){ exit(1); } - + const int num_cols = 50; int win_w = (num_cols + 10) * 9; int win_h = 140; - + { const char *start_p = msg, *space_p = NULL; for(const char* p = msg; *p; ++p){ @@ -36,86 +36,86 @@ system_error_box(char *msg, b32 shutdown = true){ } } } - + Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, win_w, win_h, 0, 0, 0x227A3B); XStoreName(dpy, w, "4coder Error"); - + XSizeHints* sh = XAllocSizeHints(); sh->flags = PMinSize; sh->min_width = win_w; sh->min_height = win_h; XSetWMNormalHints(dpy, w, sh); - + Atom type = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - + XChangeProperty(dpy, w, XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False), XA_ATOM, 32, PropModeReplace, (unsigned char*) &type, 1); - + Atom WM_DELETE_WINDOW = XInternAtom(dpy, "WM_DELETE_WINDOW", False); XSetWMProtocols(dpy, w, &WM_DELETE_WINDOW, 1); - + linux_set_icon(dpy, w); - + XMapRaised(dpy, w); XSync(dpy, False); - + XSelectInput(dpy, w, ExposureMask | StructureNotifyMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask); - + XFontStruct* font = XLoadQueryFont(dpy, "-*-fixed-bold-*-*-*-*-140-*-*-*-*-iso8859-1"); if (!font){ exit(1); } - + XGCValues gcv; gcv.foreground = WhitePixel(dpy, 0); gcv.line_width = 2; gcv.font = font->fid; - + GC gc1 = XCreateGC(dpy, w, GCForeground | GCFont | GCLineWidth, &gcv); gcv.foreground = BlackPixel(dpy, 0); GC gc2 = XCreateGC(dpy, w, GCForeground | GCFont | GCLineWidth, &gcv); - + int button_trigger = 0; int button_hi = 0; int redraw = 1; - + XEvent ev; while (1){ XNextEvent(dpy, &ev); - + if (ev.type == Expose) redraw = 1; - + if (ev.type == ConfigureNotify){ redraw = 1; win_w = ev.xconfigure.width; win_h = ev.xconfigure.height; } - + XRectangle button_rect = { (short)(win_w/2-40), (short)(win_h*0.8f), 80, 20 }; - + if (ev.type == MotionNotify){ int new_hi = (ev.xmotion.x > button_rect.x && ev.xmotion.y > button_rect.y && ev.xmotion.x < button_rect.x + button_rect.width && ev.xmotion.y < button_rect.y + button_rect.height); - + if (new_hi != button_hi){ button_hi = new_hi; redraw = 1; } } - + if (ev.type == KeyPress){ KeySym sym = XLookupKeysym(&ev.xkey, 0); if (sym == XK_Escape || sym == XK_Return){ exit(1); } } - + if (ev.type == ButtonPress && ev.xbutton.button == Button1){ if (button_hi) button_trigger = 1; redraw = 1; } - + if (ev.type == ButtonRelease && ev.xbutton.button == Button1){ if (button_trigger){ if (button_hi){ @@ -126,61 +126,61 @@ system_error_box(char *msg, b32 shutdown = true){ } redraw = 1; } - + if (ev.type == ClientMessage && ev.xclient.window == w && (Atom)ev.xclient.data.l[0] == WM_DELETE_WINDOW){ exit(1); } - + #define DRAW_STR(x, y, str, len) \ - XDrawString(dpy, w, gc2, (x)+1, (y)+1, (str), (len)); \ - XDrawString(dpy, w, gc1, (x) , (y) , (str), (len)) - +XDrawString(dpy, w, gc2, (x)+1, (y)+1, (str), (len)); \ +XDrawString(dpy, w, gc1, (x) , (y) , (str), (len)) + if (redraw){ redraw = 0; XClearWindow(dpy, w); - + const char* line_start = msg; const char* last_space = NULL; int y = 30; - + { const char title[] = "4coder - Fatal Error"; int width = XTextWidth(font, title, sizeof(title)-1); int x = (win_w/2) - (width/2); DRAW_STR(x, y, title, sizeof(title)-1); } - + y += 36; int width = XTextWidth(font, "x", 1) * num_cols; int x = (win_w/2) - (width/2); - + for(const char* p = line_start; *p; ++p){ if (*p == ' ') last_space = p; if (p - line_start > num_cols || *p == '\n' || !p[1]){ - + const char* new_line_start = last_space + 1; if (!last_space || *p == '\n' || !p[1]){ new_line_start = last_space = (p + !p[1]); } - + DRAW_STR(x, y, line_start, last_space - line_start); - + line_start = new_line_start; last_space = NULL; y += 18; } } - + XDrawRectangles(dpy, w, gc1, &button_rect, 1); if (button_hi || button_trigger){ XDrawRectangle(dpy, w, gc2, button_rect.x+1, button_rect.y+1, button_rect.width-2, button_rect.height-2); } - + DRAW_STR(button_rect.x + 20, button_rect.y + 15, "Drat!", 5); } } #undef DRAW_STR - + if (shutdown){ exit(1); } diff --git a/project.4coder b/project.4coder index 24fc991f..e24d066f 100644 --- a/project.4coder +++ b/project.4coder @@ -46,9 +46,9 @@ command_list = { { .name = "package", .out = "*compilation*", .footer_panel = false, .save_dirty_files = true, - .cmd = { {"echo package & bin\\package.bat", .os = "win" }, - {"echo package & bin/package.sh" , .os = "linux"}, - {"echo package & bin/package.sh" , .os = "mac" }, }, }, + .cmd = { {"echo package & bin\\package.bat" , .os = "win" }, + {"echo package & bin/package-linux.sh", .os = "linux"}, + {"echo package & bin/package-max.sh" , .os = "mac" }, }, }, { .name = "run one time", .out = "*run*", .footer_panel = false, .save_dirty_files = false, From 45a10bf1243047060fa1a80b47741a4f105e0e04 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sun, 1 Mar 2020 15:42:55 -0800 Subject: [PATCH 31/40] Working on 32-bit linux setup --- bin/build-x86-linux.sh | 5 +++++ bin/build-x86.bat | 3 +++ bin/build_x86-mac.sh | 5 ----- bin/build_x86.sh | 5 ----- 4 files changed, 8 insertions(+), 10 deletions(-) create mode 100644 bin/build-x86-linux.sh create mode 100644 bin/build-x86.bat delete mode 100644 bin/build_x86-mac.sh delete mode 100644 bin/build_x86.sh diff --git a/bin/build-x86-linux.sh b/bin/build-x86-linux.sh new file mode 100644 index 00000000..0d7a3f0b --- /dev/null +++ b/bin/build-x86-linux.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +./build-linux.sh -DDEV_BUILD_X86 + + diff --git a/bin/build-x86.bat b/bin/build-x86.bat new file mode 100644 index 00000000..1c761add --- /dev/null +++ b/bin/build-x86.bat @@ -0,0 +1,3 @@ +@echo off + +build.bat /DDEV_BUILD_X86 diff --git a/bin/build_x86-mac.sh b/bin/build_x86-mac.sh deleted file mode 100644 index 3642eddf..00000000 --- a/bin/build_x86-mac.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -./build.sh -DDEV_BUILD_X86 - - diff --git a/bin/build_x86.sh b/bin/build_x86.sh deleted file mode 100644 index 3642eddf..00000000 --- a/bin/build_x86.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -./build.sh -DDEV_BUILD_X86 - - From f2de0c71c395c98c6ee93c34e16c7e55be6961e7 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sun, 1 Mar 2020 15:46:44 -0800 Subject: [PATCH 32/40] Buckle up. --- bin/build-x86-linux.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) mode change 100644 => 100755 bin/build-x86-linux.sh diff --git a/bin/build-x86-linux.sh b/bin/build-x86-linux.sh old mode 100644 new mode 100755 index 0d7a3f0b..13a97843 --- a/bin/build-x86-linux.sh +++ b/bin/build-x86-linux.sh @@ -1,5 +1,7 @@ #!/bin/bash -./build-linux.sh -DDEV_BUILD_X86 +ME="$(readlink -f "$0")" +LOCATION="$(dirname "$ME")" +$LOCATION/build-linux.sh -DDEV_BUILD_X86 From 344ed6c913d95a4c025c912b9109d76cbea8fb82 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sun, 1 Mar 2020 17:37:13 -0800 Subject: [PATCH 33/40] Explicit package control - easier to manage 32-bit linux this way --- bin/4ed_build.cpp | 108 +++++++++++++++++++++------------------ bin/package-linux.sh | 5 +- bin/package-mac.sh | 5 +- bin/package-x86-linux.sh | 5 ++ bin/package.bat | 5 +- 5 files changed, 74 insertions(+), 54 deletions(-) create mode 100644 bin/package-x86-linux.sh diff --git a/bin/4ed_build.cpp b/bin/4ed_build.cpp index be489814..180dc493 100644 --- a/bin/4ed_build.cpp +++ b/bin/4ed_build.cpp @@ -25,6 +25,19 @@ // OS and compiler index // +typedef u32 Tier_Code; +enum{ + Tier_Demo, + Tier_Super, + Tier_COUNT, +}; + +char *tier_names[] = { + "demo", + "super", +}; + +typedef u32 Platform_Code; enum{ Platform_Windows, Platform_Linux, @@ -40,6 +53,7 @@ char *platform_names[] = { "mac", }; +typedef u32 Compiler_Code; enum{ Compiler_CL, Compiler_GCC, @@ -55,6 +69,21 @@ char *compiler_names[] = { "clang", }; +typedef u32 Arch_Code; +enum{ + Arch_X64, + Arch_X86, + + // + Arch_COUNT, + Arch_None = Arch_COUNT, +}; + +char *arch_names[] = { + "x64", + "x86", +}; + #if OS_WINDOWS # define This_OS Platform_Windows #elif OS_LINUX @@ -115,22 +144,6 @@ char **platform_includes[Platform_COUNT][Compiler_COUNT] = { char *default_custom_target = "../code/custom/4coder_default_bindings.cpp"; -// NOTE(allen): Architectures - -enum{ - Arch_X64, - Arch_X86, - - // - Arch_COUNT, - Arch_None = Arch_COUNT, -}; - -char *arch_names[] = { - "x64", - "x86", -}; - // NOTE(allen): Build flags enum{ @@ -582,12 +595,6 @@ get_4coder_dist_name(Arena *arena, u32 platform, char *tier, u32 arch){ return(name); } -enum{ - Tier_Demo, - Tier_Super, - Tier_COUNT, -}; - function void package_for_arch(Arena *arena, u32 arch, char *cdir, char *build_dir, char *pack_dir, i32 tier, char *tier_name, char *current_dist_tier, u32 flags, char** dist_files, i32 dist_file_count){ char *arch_name = arch_names[arch]; @@ -633,8 +640,20 @@ package_for_arch(Arena *arena, u32 arch, char *cdir, char *build_dir, char *pack fm_zip(parent_dir, "4coder", zip_name); } +internal u32 +tier_flags(Tier_Code code){ + u32 result = 0; + switch (code){ + case Tier_Super: + { + result = SUPER; + }break; + } + return(result); +} + internal void -package(Arena *arena, char *cdir){ +package(Arena *arena, char *cdir, Tier_Code tier, Arch_Code arch){ // NOTE(allen): meta char *build_dir = fm_str(arena, BUILD_DIR); char *pack_dir = fm_str(arena, PACK_DIR); @@ -648,34 +667,16 @@ package(Arena *arena, char *cdir){ printf("dist files: %s, %s, %s\n", dist_files[0], dist_files[1], dist_files[2]); fflush(stdout); - char *tier_names[] = { "demo", "super", }; u32 base_flags = SHIP | DEBUG_INFO | OPTIMIZATION; - u32 tier_flags[] = { 0, SUPER, }; fm_make_folder_if_missing(arena, pack_dir); - for (u32 i = 0; i < Tier_COUNT; i += 1){ - char *tier_name = tier_names[i]; - u32 flags = base_flags | tier_flags[i]; - - Temp_Memory temp = begin_temp(arena); - char *current_dist_tier = fm_str(arena, ".." SLASH "current_dist_", tier_name); - - u32 arch_count = Arch_COUNT; - u32 arch_array[2] = { - Arch_X64, - Arch_X86, - }; - if (This_OS == Platform_Mac){ - arch_count = 1; - } - for (u32 arch_ind = 0; arch_ind < arch_count; arch_ind += 1){ - u32 arch = arch_array[arch_ind]; - package_for_arch(arena, arch, cdir, build_dir, pack_dir, i, tier_name, current_dist_tier, flags, dist_files, ArrayCount(dist_files)); - } - - end_temp(temp); - } + char *tier_name = tier_names[tier]; + u32 flags = base_flags | tier_flags(tier); + Temp_Memory temp = begin_temp(arena); + char *current_dist_tier = fm_str(arena, ".." SLASH "current_dist_", tier_name); + package_for_arch(arena, arch, cdir, build_dir, pack_dir, tier, tier_name, current_dist_tier, flags, dist_files, ArrayCount(dist_files)); + end_temp(temp); } int main(int argc, char **argv){ @@ -700,8 +701,17 @@ int main(int argc, char **argv){ #if defined(DEV_BUILD) || defined(OPT_BUILD) || defined(DEV_BUILD_X86) || defined(OPT_BUILD_X86) standard_build(&arena, cdir, flags, arch); -#elif defined(PACKAGE) - package(&arena, cdir); +#elif defined(PACKAGE_DEMO_X64) + package(&arena, cdir, Tier_Demo, Arch_X64); + +#elif defined(PACKAGE_DEMO_X86) + package(&arena, cdir, Tier_Demo, Arch_X86); + +#elif defined(PACKAGE_SUPER_X64) + package(&arena, cdir, Tier_Super, Arch_X64); + +#elif defined(PACKAGE_SUPER_X86) + package(&arena, cdir, Tier_Super, Arch_X86); #else # error No build type specified. diff --git a/bin/package-linux.sh b/bin/package-linux.sh index 847b8816..7c627903 100755 --- a/bin/package-linux.sh +++ b/bin/package-linux.sh @@ -1,4 +1,5 @@ #!/bin/bash -chmod 777 bin/build-linux.sh -bin/build-linux.sh "-DPACKAGE" +chmod +x bin/build-linux.sh +bin/build-linux.sh "-DPACKAGE_DEMO_X64" +bin/build-linux.sh "-DPACKAGE_SUPER_X64" diff --git a/bin/package-mac.sh b/bin/package-mac.sh index 92eb8a24..eacab020 100755 --- a/bin/package-mac.sh +++ b/bin/package-mac.sh @@ -1,4 +1,5 @@ #!/bin/bash -chmod 777 bin/build-mac.sh -bin/build-mac.sh "-DPACKAGE" +chmod +x bin/build-mac.sh +bin/build-mac.sh "-DPACKAGE_DEMO_X64" +bin/build-mac.sh "-DPACKAGE_SUPER_X64" diff --git a/bin/package-x86-linux.sh b/bin/package-x86-linux.sh new file mode 100644 index 00000000..96bddb19 --- /dev/null +++ b/bin/package-x86-linux.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +chmod +x bin/build-linux.sh +bin/build-linux.sh "-DPACKAGE_DEMO_X86" +bin/build-linux.sh "-DPACKAGE_SUPER_X86" diff --git a/bin/package.bat b/bin/package.bat index e9f0923d..236104d1 100644 --- a/bin/package.bat +++ b/bin/package.bat @@ -1,3 +1,6 @@ @echo off -bin\build.bat /DPACKAGE +bin\build.bat /DPACKAGE_DEMO_X64 +bin\build.bat /DPACKAGE_DEMO_X86 +bin\build.bat /DPACKAGE_SUPER_X64 +bin\build.bat /DPACKAGE_SUPER_X86 From 956b70c0970709c86b644bb2ca2aa964ab49eeb2 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sun, 1 Mar 2020 17:47:58 -0800 Subject: [PATCH 34/40] Split itchio push script for 32-bit --- bin/itchio_push_linux-x86.sh | 22 ++++++++++++++++++++++ bin/itchio_push_linux.sh | 2 -- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 bin/itchio_push_linux-x86.sh diff --git a/bin/itchio_push_linux-x86.sh b/bin/itchio_push_linux-x86.sh new file mode 100644 index 00000000..d98b1b19 --- /dev/null +++ b/bin/itchio_push_linux-x86.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +if [ "$#" -lt "3" ] +then +echo need 3 parameters +exit +else + +fake=$1 +maj=$2 +min=$3 + +vr=$fake.$maj.$min +fv=$fake-$maj-$min + +flags="--fix-permissions --userversion=$vr" +dir=../current_dist_all_os + +butler push $flags $dir/demo_x86/4coder-$fv-demo-linux-x86.zip 4coder/4coder:linux-x86-demo +butler push $flags $dir/super_x86/4coder-$fv-super-linux-x86.zip 4coder/4coder:linux-x86 + +fi diff --git a/bin/itchio_push_linux.sh b/bin/itchio_push_linux.sh index 8c612a2c..8a829168 100644 --- a/bin/itchio_push_linux.sh +++ b/bin/itchio_push_linux.sh @@ -17,8 +17,6 @@ flags="--fix-permissions --userversion=$vr" dir=../current_dist_all_os butler push $flags $dir/demo_x64/4coder-$fv-demo-linux-x64.zip 4coder/4coder:linux-x64-demo -butler push $flags $dir/demo_x64/4coder-$fv-demo-linux-x86.zip 4coder/4coder:linux-x86-demo butler push $flags $dir/super_x64/4coder-$fv-super-linux-x64.zip 4coder/4coder:linux-x64 -butler push $flags $dir/super_x64/4coder-$fv-super-linux-x86.zip 4coder/4coder:linux-x86 fi From e1698bd28aeb46d855be0551785e855cec3121f0 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Tue, 3 Mar 2020 12:25:04 -0800 Subject: [PATCH 35/40] Fix compilation on windows --- custom/4coder_examples.cpp | 2 +- custom/generated/command_metadata.h | 484 ++++++++++++++-------------- opengl/4ed_opengl_defines.h | 10 - opengl/4ed_opengl_render.cpp | 437 +++++++++++++------------ 4 files changed, 459 insertions(+), 474 deletions(-) diff --git a/custom/4coder_examples.cpp b/custom/4coder_examples.cpp index 59de7980..5ab80a51 100644 --- a/custom/4coder_examples.cpp +++ b/custom/4coder_examples.cpp @@ -148,7 +148,7 @@ isn't happening, so command bindings don't trigger unless you trigger them yours } u8 buffer[256]; - u32 size = 0; + u64 size = 0; for (;;){ User_Input in = get_next_input(app, EventPropertyGroup_Any, EventProperty_Escape); diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index e424f1d4..01209b1f 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -264,248 +264,248 @@ i32 source_name_len; i32 line_number; }; static Command_Metadata fcoder_metacmd_table[242] = { -{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "../code/custom/4coder_default_framework.cpp", 43, 409 }, -{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "../code/custom/4coder_auto_indent.cpp", 37, 413 }, -{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "../code/custom/4coder_auto_indent.cpp", 37, 423 }, -{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "../code/custom/4coder_auto_indent.cpp", 37, 404 }, -{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "../code/custom/4coder_base_commands.cpp", 39, 154 }, -{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "../code/custom/4coder_base_commands.cpp", 39, 96 }, -{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "../code/custom/4coder_base_commands.cpp", 39, 647 }, -{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "../code/custom/4coder_clipboard.cpp", 35, 68 }, -{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "../code/custom/4coder_build_commands.cpp", 40, 159 }, -{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "../code/custom/4coder_build_commands.cpp", 40, 122 }, -{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "../code/custom/4coder_base_commands.cpp", 39, 197 }, -{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "../code/custom/4coder_default_framework.cpp", 43, 284 }, -{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "../code/custom/4coder_default_framework.cpp", 43, 290 }, -{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "../code/custom/4coder_build_commands.cpp", 40, 180 }, -{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 636 }, -{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "../code/custom/4coder_default_framework.cpp", 43, 480 }, -{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "../code/custom/4coder_clipboard.cpp", 35, 216 }, -{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "../code/custom/4coder_base_commands.cpp", 39, 233 }, -{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "../code/custom/4coder_base_commands.cpp", 39, 223 }, -{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "../code/custom/4coder_base_commands.cpp", 39, 243 }, -{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "../code/custom/4coder_base_commands.cpp", 39, 255 }, -{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "../code/custom/4coder_clipboard.cpp", 35, 7 }, -{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "../code/custom/4coder_project_commands.cpp", 42, 843 }, -{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "../code/custom/4coder_build_commands.cpp", 40, 174 }, -{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "../code/custom/4coder_base_commands.cpp", 39, 655 }, -{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "../code/custom/4coder_docs.cpp", 30, 190 }, -{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "../code/custom/4coder_lists.cpp", 31, 761 }, -{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "../code/custom/4coder_combined_write_commands.cpp", 49, 125 }, -{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "../code/custom/4coder_combined_write_commands.cpp", 49, 149 }, -{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "../code/custom/4coder_clipboard.cpp", 35, 107 }, -{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "../code/custom/4coder_base_commands.cpp", 39, 124 }, -{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "../code/custom/4coder_docs.cpp", 30, 175 }, -{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "../code/custom/4coder_clipboard.cpp", 35, 116 }, -{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 738 }, -{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "../code/custom/4coder_base_commands.cpp", 39, 1897 }, -{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "../code/custom/4coder_default_hooks.cpp", 39, 7 }, -{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "../code/custom/4coder_default_hooks.cpp", 39, 23 }, -{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "../code/custom/4coder_default_hooks.cpp", 39, 51 }, -{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "../code/custom/4coder_base_commands.cpp", 39, 162 }, -{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "../code/custom/4coder_base_commands.cpp", 39, 79 }, -{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "../code/custom/4coder_scope_commands.cpp", 40, 112 }, -{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "../code/custom/4coder_base_commands.cpp", 39, 1323 }, -{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "../code/custom/4coder_base_commands.cpp", 39, 1495 }, -{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "../code/custom/4coder_base_commands.cpp", 39, 134 }, -{ PROC_LINKS(display_key_codes, 0), false, "display_key_codes", 17, "Example of input handling loop", 30, "../code/custom/4coder_examples.cpp", 34, 90 }, -{ PROC_LINKS(display_text_input, 0), false, "display_text_input", 18, "Example of to_writable and leave_current_input_unhandled", 56, "../code/custom/4coder_examples.cpp", 34, 134 }, -{ PROC_LINKS(double_backspace, 0), false, "double_backspace", 16, "Example of history group helpers", 32, "../code/custom/4coder_examples.cpp", 34, 10 }, -{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "../code/custom/4coder_base_commands.cpp", 39, 1481 }, -{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "../code/custom/4coder_cli_command.cpp", 37, 22 }, -{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "../code/custom/4coder_cli_command.cpp", 37, 7 }, -{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "../code/custom/4coder_base_commands.cpp", 39, 825 }, -{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "../code/custom/4coder_helper.cpp", 32, 2224 }, -{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "../code/custom/4coder_helper.cpp", 32, 2232 }, -{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "../code/custom/4coder_jump_sticky.cpp", 37, 525 }, -{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "../code/custom/4coder_jump_sticky.cpp", 37, 542 }, -{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "../code/custom/4coder_jump_sticky.cpp", 37, 348 }, -{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "../code/custom/4coder_jump_sticky.cpp", 37, 375 }, -{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "../code/custom/4coder_base_commands.cpp", 39, 833 }, -{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "../code/custom/4coder_jump_sticky.cpp", 37, 464 }, -{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "../code/custom/4coder_jump_sticky.cpp", 37, 494 }, -{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "../code/custom/4coder_jump_sticky.cpp", 37, 481 }, -{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "../code/custom/4coder_jump_sticky.cpp", 37, 511 }, -{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 685 }, -{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 671 }, -{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "../code/custom/4coder_tutorial.cpp", 34, 869 }, -{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 70 }, -{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "../code/custom/4coder_jump_sticky.cpp", 37, 564 }, -{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "../code/custom/4coder_jump_sticky.cpp", 37, 581 }, -{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 727 }, -{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "../code/custom/4coder_lists.cpp", 31, 520 }, -{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "../code/custom/4coder_lists.cpp", 31, 661 }, -{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "../code/custom/4coder_lists.cpp", 31, 715 }, -{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "../code/custom/4coder_lists.cpp", 31, 612 }, -{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "../code/custom/4coder_lists.cpp", 31, 510 }, -{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "../code/custom/4coder_code_index_listers.cpp", 44, 12 }, -{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "../code/custom/4coder_keyboard_macro.cpp", 40, 54 }, -{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "../code/custom/4coder_keyboard_macro.cpp", 40, 77 }, -{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "../code/custom/4coder_keyboard_macro.cpp", 40, 41 }, -{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1641 }, -{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "../code/custom/4coder_tutorial.cpp", 34, 9 }, -{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "../code/custom/4coder_base_commands.cpp", 39, 211 }, -{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "../code/custom/4coder_function_list.cpp", 39, 295 }, -{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "../code/custom/4coder_function_list.cpp", 39, 301 }, -{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "../code/custom/4coder_function_list.cpp", 39, 267 }, -{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "../code/custom/4coder_function_list.cpp", 39, 277 }, -{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "../code/custom/4coder_search.cpp", 32, 165 }, -{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "../code/custom/4coder_search.cpp", 32, 177 }, -{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 189 }, -{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 195 }, -{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 201 }, -{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 207 }, -{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "../code/custom/4coder_search.cpp", 32, 213 }, -{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "../code/custom/4coder_search.cpp", 32, 221 }, -{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "../code/custom/4coder_search.cpp", 32, 171 }, -{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "../code/custom/4coder_search.cpp", 32, 183 }, -{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "../code/custom/4coder_project_commands.cpp", 42, 863 }, -{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "../code/custom/4coder_config.cpp", 32, 1627 }, -{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "../code/custom/4coder_default_framework.cpp", 43, 457 }, -{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "../code/custom/4coder_default_framework.cpp", 43, 469 }, -{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "../code/custom/4coder_base_commands.cpp", 39, 1435 }, -{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 44 }, -{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 237 }, -{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 249 }, -{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 29 }, -{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 231 }, -{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 243 }, -{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "../code/custom/4coder_base_commands.cpp", 39, 780 }, -{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "../code/custom/4coder_base_commands.cpp", 39, 265 }, -{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "../code/custom/4coder_base_commands.cpp", 39, 336 }, -{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "../code/custom/4coder_base_commands.cpp", 39, 348 }, -{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "../code/custom/4coder_base_commands.cpp", 39, 354 }, -{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "../code/custom/4coder_base_commands.cpp", 39, 407 }, -{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 431 }, -{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 419 }, -{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "../code/custom/4coder_base_commands.cpp", 39, 437 }, -{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "../code/custom/4coder_base_commands.cpp", 39, 514 }, -{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "../code/custom/4coder_base_commands.cpp", 39, 528 }, -{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "../code/custom/4coder_base_commands.cpp", 39, 486 }, -{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "../code/custom/4coder_base_commands.cpp", 39, 471 }, -{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "../code/custom/4coder_base_commands.cpp", 39, 500 }, -{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "../code/custom/4coder_base_commands.cpp", 39, 1475 }, -{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "../code/custom/4coder_base_commands.cpp", 39, 1469 }, -{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "../code/custom/4coder_base_commands.cpp", 39, 445 }, -{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "../code/custom/4coder_base_commands.cpp", 39, 507 }, -{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "../code/custom/4coder_base_commands.cpp", 39, 521 }, -{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "../code/custom/4coder_base_commands.cpp", 39, 479 }, -{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "../code/custom/4coder_base_commands.cpp", 39, 463 }, -{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "../code/custom/4coder_base_commands.cpp", 39, 493 }, -{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "../code/custom/4coder_base_commands.cpp", 39, 330 }, -{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "../code/custom/4coder_base_commands.cpp", 39, 342 }, -{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "../code/custom/4coder_base_commands.cpp", 39, 401 }, -{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 425 }, -{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 413 }, -{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "../code/custom/4coder_clipboard.cpp", 35, 364 }, -{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "../code/custom/4coder_clipboard.cpp", 35, 373 }, -{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "../code/custom/4coder_project_commands.cpp", 42, 849 }, -{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "../code/custom/4coder_project_commands.cpp", 42, 855 }, -{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "../code/custom/4coder_base_commands.cpp", 39, 1560 }, -{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1891 }, -{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "../code/custom/4coder_combined_write_commands.cpp", 49, 46 }, -{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "../code/custom/4coder_combined_write_commands.cpp", 49, 62 }, -{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "../code/custom/4coder_combined_write_commands.cpp", 49, 54 }, -{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1592 }, -{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "../code/custom/4coder_default_framework.cpp", 43, 310 }, -{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "../code/custom/4coder_default_framework.cpp", 43, 300 }, -{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "../code/custom/4coder_base_commands.cpp", 39, 372 }, -{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "../code/custom/4coder_base_commands.cpp", 39, 364 }, -{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "../code/custom/4coder_clipboard.cpp", 35, 127 }, -{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "../code/custom/4coder_clipboard.cpp", 35, 202 }, -{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "../code/custom/4coder_clipboard.cpp", 35, 161 }, -{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "../code/custom/4coder_clipboard.cpp", 35, 209 }, -{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "../code/custom/4coder_scope_commands.cpp", 40, 106 }, -{ PROC_LINKS(play_with_a_counter, 0), false, "play_with_a_counter", 19, "Example of query bar", 20, "../code/custom/4coder_examples.cpp", 34, 29 }, -{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "../code/custom/4coder_profile.cpp", 33, 226 }, -{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "../code/custom/4coder_profile.cpp", 33, 219 }, -{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "../code/custom/4coder_profile.cpp", 33, 212 }, -{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "../code/custom/4coder_profile_inspect.cpp", 41, 886 }, -{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "../code/custom/4coder_project_commands.cpp", 42, 1290 }, -{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "../code/custom/4coder_project_commands.cpp", 42, 871 }, -{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "../code/custom/4coder_project_commands.cpp", 42, 897 }, -{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "../code/custom/4coder_base_commands.cpp", 39, 1251 }, -{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "../code/custom/4coder_base_commands.cpp", 39, 1272 }, -{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "../code/custom/4coder_base_commands.cpp", 39, 1288 }, -{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 1730 }, -{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "../code/custom/4coder_base_commands.cpp", 39, 1815 }, -{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "../code/custom/4coder_base_commands.cpp", 39, 1400 }, -{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1659 }, -{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "../code/custom/4coder_base_commands.cpp", 39, 1161 }, -{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "../code/custom/4coder_base_commands.cpp", 39, 1152 }, -{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "../code/custom/4coder_base_commands.cpp", 39, 1143 }, -{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "../code/custom/4coder_base_commands.cpp", 39, 1084 }, -{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "../code/custom/4coder_base_commands.cpp", 39, 1096 }, -{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1649 }, -{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "../code/custom/4coder_default_framework.cpp", 43, 382 }, -{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1367 }, -{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "../code/custom/4coder_base_commands.cpp", 39, 1078 }, -{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "../code/custom/4coder_base_commands.cpp", 39, 1090 }, -{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "../code/custom/4coder_helper.cpp", 32, 2212 }, -{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "../code/custom/4coder_helper.cpp", 32, 2200 }, -{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "../code/custom/4coder_helper.cpp", 32, 2218 }, -{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "../code/custom/4coder_helper.cpp", 32, 2206 }, -{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "../code/custom/4coder_base_commands.cpp", 39, 537 }, -{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "../code/custom/4coder_scope_commands.cpp", 40, 57 }, -{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "../code/custom/4coder_scope_commands.cpp", 40, 66 }, -{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "../code/custom/4coder_scope_commands.cpp", 40, 82 }, -{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "../code/custom/4coder_scope_commands.cpp", 40, 99 }, -{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "../code/custom/4coder_scope_commands.cpp", 40, 27 }, -{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "../code/custom/4coder_scope_commands.cpp", 40, 39 }, -{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "../code/custom/4coder_eol.cpp", 29, 125 }, -{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "../code/custom/4coder_eol.cpp", 29, 112 }, -{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "../code/custom/4coder_eol.cpp", 29, 86 }, -{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "../code/custom/4coder_eol.cpp", 29, 99 }, -{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "../code/custom/4coder_base_commands.cpp", 39, 707 }, -{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "../code/custom/4coder_base_commands.cpp", 39, 749 }, -{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "../code/custom/4coder_base_commands.cpp", 39, 115 }, -{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "../code/custom/4coder_default_framework.cpp", 43, 427 }, -{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "../code/custom/4coder_default_framework.cpp", 43, 421 }, -{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1238 }, -{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1250 }, -{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1244 }, -{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "../code/custom/4coder_project_commands.cpp", 42, 1231 }, -{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 678 }, -{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 664 }, -{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "../code/custom/4coder_log_parser.cpp", 36, 994 }, -{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "../code/custom/4coder_base_commands.cpp", 39, 179 }, -{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "../code/custom/4coder_base_commands.cpp", 39, 187 }, -{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "../code/custom/4coder_combined_write_commands.cpp", 49, 237 }, -{ PROC_LINKS(string_repeat, 0), false, "string_repeat", 13, "Example of query_user_string and query_user_number", 50, "../code/custom/4coder_examples.cpp", 34, 176 }, -{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "../code/custom/4coder_default_framework.cpp", 43, 403 }, -{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "../code/custom/4coder_base_commands.cpp", 39, 1617 }, -{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "../code/custom/4coder_lists.cpp", 31, 785 }, -{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 563 }, -{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 550 }, -{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "../code/custom/4coder_base_commands.cpp", 39, 692 }, -{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "../code/custom/4coder_base_commands.cpp", 39, 701 }, -{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "../code/custom/4coder_default_framework.cpp", 43, 451 }, -{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "../code/custom/4coder_default_framework.cpp", 43, 439 }, -{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "../code/custom/4coder_default_framework.cpp", 43, 433 }, -{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "../code/custom/4coder_base_commands.cpp", 39, 806 }, -{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "../code/custom/4coder_base_commands.cpp", 39, 812 }, -{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "../code/custom/4coder_default_framework.cpp", 43, 415 }, -{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "../code/custom/4coder_default_framework.cpp", 43, 445 }, -{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "../code/custom/4coder_base_commands.cpp", 39, 797 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "../code/custom/4coder_code_index.cpp", 36, 1176 }, -{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 20 }, -{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 34 }, -{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 137 }, -{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "../code/custom/4coder_base_commands.cpp", 39, 1717 }, -{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "../code/custom/4coder_base_commands.cpp", 39, 1744 }, -{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "../code/custom/4coder_base_commands.cpp", 39, 1605 }, -{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "../code/custom/4coder_jump_lister.cpp", 37, 59 }, -{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "../code/custom/4coder_search.cpp", 32, 395 }, -{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "../code/custom/4coder_search.cpp", 32, 642 }, -{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "../code/custom/4coder_combined_write_commands.cpp", 49, 94 }, -{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 82 }, -{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 88 }, -{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "../code/custom/4coder_base_commands.cpp", 39, 67 }, -{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "../code/custom/4coder_auto_indent.cpp", 37, 433 }, -{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "../code/custom/4coder_base_commands.cpp", 39, 59 }, -{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 76 }, -{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "../code/custom/4coder_base_commands.cpp", 39, 73 }, -{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "../code/custom/4coder_combined_write_commands.cpp", 49, 100 }, +{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 409 }, +{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "c:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 413 }, +{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "c:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 423 }, +{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "c:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 404 }, +{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 154 }, +{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 96 }, +{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 647 }, +{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 68 }, +{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "c:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 159 }, +{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "c:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 122 }, +{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 197 }, +{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 284 }, +{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 290 }, +{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "c:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 180 }, +{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 636 }, +{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 480 }, +{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 216 }, +{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 233 }, +{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 223 }, +{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 243 }, +{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 255 }, +{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 7 }, +{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 843 }, +{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "c:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 174 }, +{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 655 }, +{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "c:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 190 }, +{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 761 }, +{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 125 }, +{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 149 }, +{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 107 }, +{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 124 }, +{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "c:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 175 }, +{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 116 }, +{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 738 }, +{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1897 }, +{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "c:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 7 }, +{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "c:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 23 }, +{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "c:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 51 }, +{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 162 }, +{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 79 }, +{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 112 }, +{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1323 }, +{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1495 }, +{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 134 }, +{ PROC_LINKS(display_key_codes, 0), false, "display_key_codes", 17, "Example of input handling loop", 30, "c:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 90 }, +{ PROC_LINKS(display_text_input, 0), false, "display_text_input", 18, "Example of to_writable and leave_current_input_unhandled", 56, "c:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 134 }, +{ PROC_LINKS(double_backspace, 0), false, "double_backspace", 16, "Example of history group helpers", 32, "c:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 10 }, +{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1481 }, +{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "c:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 22 }, +{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "c:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 7 }, +{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 825 }, +{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "c:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2224 }, +{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "c:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2232 }, +{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 525 }, +{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 542 }, +{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 348 }, +{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 375 }, +{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 833 }, +{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 464 }, +{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 494 }, +{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 481 }, +{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 511 }, +{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 685 }, +{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 671 }, +{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "c:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 869 }, +{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 70 }, +{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 564 }, +{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 581 }, +{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 727 }, +{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 520 }, +{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 661 }, +{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 715 }, +{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 612 }, +{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 510 }, +{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "c:\\4ed\\code\\custom\\4coder_code_index_listers.cpp", 48, 12 }, +{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "c:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 54 }, +{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "c:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 77 }, +{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "c:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 41 }, +{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1641 }, +{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "c:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 9 }, +{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 211 }, +{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "c:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 295 }, +{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "c:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 301 }, +{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "c:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 267 }, +{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "c:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 277 }, +{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 165 }, +{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 177 }, +{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 189 }, +{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 195 }, +{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 201 }, +{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 207 }, +{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 213 }, +{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 221 }, +{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 171 }, +{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 183 }, +{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 863 }, +{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "c:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1627 }, +{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 457 }, +{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 469 }, +{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1435 }, +{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "c:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 44 }, +{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "c:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 237 }, +{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "c:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 249 }, +{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "c:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 29 }, +{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "c:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 231 }, +{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "c:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 243 }, +{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 780 }, +{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 265 }, +{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 336 }, +{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 348 }, +{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 354 }, +{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 407 }, +{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 431 }, +{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 419 }, +{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 437 }, +{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 514 }, +{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 528 }, +{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 486 }, +{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 471 }, +{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 500 }, +{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1475 }, +{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1469 }, +{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 445 }, +{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 507 }, +{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 521 }, +{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 479 }, +{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 463 }, +{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 493 }, +{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 330 }, +{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 342 }, +{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 401 }, +{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 425 }, +{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 413 }, +{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 364 }, +{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 373 }, +{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 849 }, +{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 855 }, +{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1560 }, +{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1891 }, +{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 46 }, +{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 62 }, +{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 54 }, +{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1592 }, +{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 310 }, +{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 300 }, +{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 372 }, +{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 364 }, +{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 127 }, +{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 202 }, +{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 161 }, +{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 209 }, +{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 106 }, +{ PROC_LINKS(play_with_a_counter, 0), false, "play_with_a_counter", 19, "Example of query bar", 20, "c:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 29 }, +{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "c:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 226 }, +{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "c:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 219 }, +{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "c:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 212 }, +{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "c:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 886 }, +{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1290 }, +{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 871 }, +{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 897 }, +{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1251 }, +{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1272 }, +{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1288 }, +{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1730 }, +{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1815 }, +{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1400 }, +{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1659 }, +{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1161 }, +{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1152 }, +{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1143 }, +{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1084 }, +{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1096 }, +{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1649 }, +{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 382 }, +{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1367 }, +{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1078 }, +{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1090 }, +{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "c:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2212 }, +{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "c:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2200 }, +{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "c:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2218 }, +{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "c:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2206 }, +{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 537 }, +{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 57 }, +{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 66 }, +{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 82 }, +{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 99 }, +{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 27 }, +{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 39 }, +{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "c:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 125 }, +{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "c:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 112 }, +{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "c:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 86 }, +{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "c:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 99 }, +{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 707 }, +{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 749 }, +{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 115 }, +{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 427 }, +{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 421 }, +{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1238 }, +{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1250 }, +{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1244 }, +{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1231 }, +{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 678 }, +{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 664 }, +{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "c:\\4ed\\code\\custom\\4coder_log_parser.cpp", 40, 994 }, +{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 179 }, +{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 187 }, +{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 237 }, +{ PROC_LINKS(string_repeat, 0), false, "string_repeat", 13, "Example of query_user_string and query_user_number", 50, "c:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 176 }, +{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 403 }, +{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1617 }, +{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 785 }, +{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 563 }, +{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 550 }, +{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 692 }, +{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 701 }, +{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 451 }, +{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 439 }, +{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 433 }, +{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 806 }, +{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 812 }, +{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 415 }, +{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 445 }, +{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 797 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "c:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1176 }, +{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "c:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 20 }, +{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "c:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 34 }, +{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 }, +{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1717 }, +{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1744 }, +{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1605 }, +{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "c:\\4ed\\code\\custom\\4coder_jump_lister.cpp", 41, 59 }, +{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 395 }, +{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 642 }, +{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 94 }, +{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 82 }, +{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 88 }, +{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 67 }, +{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "c:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 433 }, +{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 59 }, +{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 76 }, +{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 73 }, +{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 100 }, }; static i32 fcoder_metacmd_ID_allow_mouse = 0; static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 1; diff --git a/opengl/4ed_opengl_defines.h b/opengl/4ed_opengl_defines.h index b3ba33ef..03de2224 100644 --- a/opengl/4ed_opengl_defines.h +++ b/opengl/4ed_opengl_defines.h @@ -216,7 +216,6 @@ typedef ptrdiff_t GLsizeiptr; typedef ptrdiff_t GLintptr; #endif -#if OS_LINUX typedef void GL_Debug_Function(GLenum src, GLenum type, GLuint id, @@ -224,15 +223,6 @@ typedef void GL_Debug_Function(GLenum src, GLsizei length, const GLchar* message, const void *user_data); -#else -typedef void GL_Debug_Function(GLenum src, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - GLchar *message, - void *user_data); -#endif typedef GL_Debug_Function *GLDEBUGPROC; diff --git a/opengl/4ed_opengl_render.cpp b/opengl/4ed_opengl_render.cpp index c68a0eb2..0713539d 100644 --- a/opengl/4ed_opengl_render.cpp +++ b/opengl/4ed_opengl_render.cpp @@ -54,28 +54,24 @@ gl__fill_texture(Texture_Kind texture_kind, u32 texture, Vec3_i32 p, Vec3_i32 di } internal void -#ifdef OS_LINUX gl__error_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char *message, const void *userParam){ -#else - gl__error_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, char *message, void *userParam){ -#endif - switch (id){ - case 131218: - { - // NOTE(allen): performance warning, do nothing. - }break; - - default: - { - InvalidPath; - }break; - } + switch (id){ + case 131218: + { + // NOTE(allen): performance warning, do nothing. + }break; + + default: + { + InvalidPath; + }break; } - - char *gl__header = R"foo(#version 130 +} + +char *gl__header = R"foo(#version 130 )foo"; - - char *gl__vertex = R"foo( + +char *gl__vertex = R"foo( uniform vec2 view_t; uniform mat2x2 view_m; in vec2 vertex_p; @@ -102,8 +98,8 @@ gl__error_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsiz xy = vertex_p; } )foo"; - - char *gl__fragment = R"foo( + +char *gl__fragment = R"foo( smooth in vec4 fragment_color; smooth in vec3 uvw; smooth in vec2 xy; @@ -136,226 +132,225 @@ gl__error_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsiz out_color = vec4(fragment_color.xyz, fragment_color.a*(sample_value + shape_value)); } )foo"; - + #define AttributeList(X) \ - X(vertex_p) \ - X(vertex_t) \ - X(vertex_c) \ - X(vertex_ht) - +X(vertex_p) \ +X(vertex_t) \ +X(vertex_c) \ +X(vertex_ht) + #define UniformList(X) \ - X(view_t) \ - X(view_m) \ - X(sampler) - - struct GL_Program{ - u32 program; +X(view_t) \ +X(view_m) \ +X(sampler) + +struct GL_Program{ + u32 program; #define GetAttributeLocation(N) i32 N; - AttributeList(GetAttributeLocation) + AttributeList(GetAttributeLocation) #undef GetAttributeLocation #define GetUniformLocation(N) i32 N; - UniformList(GetUniformLocation) + UniformList(GetUniformLocation) #undef GetUniformLocation - }; +}; + +internal GL_Program +gl__make_program(char *header, char *vertex, char *fragment){ + if (header == 0){ + header = ""; + } - internal GL_Program - gl__make_program(char *header, char *vertex, char *fragment){ - if (header == 0){ - header = ""; - } - - GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); - GLchar *vertex_source_array[] = { header, vertex }; - glShaderSource(vertex_shader, ArrayCount(vertex_source_array), vertex_source_array, 0); - glCompileShader(vertex_shader); - - GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); - GLchar *fragment_source_array[] = { header, fragment }; - glShaderSource(fragment_shader, ArrayCount(fragment_source_array), fragment_source_array, 0); - glCompileShader(fragment_shader); - - GLuint program = glCreateProgram(); - glAttachShader(program, vertex_shader); - glAttachShader(program, fragment_shader); - glLinkProgram(program); - glValidateProgram(program); - - GLint success = false; - glGetProgramiv(program, GL_LINK_STATUS, &success); - if (!success){ - GLsizei ignore = 0; - char vertex_errors[KB(4)]; - char fragment_errors[KB(4)]; - char program_errors[KB(4)]; - glGetShaderInfoLog(vertex_shader, sizeof(vertex_errors), &ignore, vertex_errors); - glGetShaderInfoLog(fragment_shader, sizeof(fragment_errors), &ignore, fragment_errors); - glGetProgramInfoLog(program, sizeof(program_errors), &ignore, program_errors); + GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); + GLchar *vertex_source_array[] = { header, vertex }; + glShaderSource(vertex_shader, ArrayCount(vertex_source_array), vertex_source_array, 0); + glCompileShader(vertex_shader); + + GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); + GLchar *fragment_source_array[] = { header, fragment }; + glShaderSource(fragment_shader, ArrayCount(fragment_source_array), fragment_source_array, 0); + glCompileShader(fragment_shader); + + GLuint program = glCreateProgram(); + glAttachShader(program, vertex_shader); + glAttachShader(program, fragment_shader); + glLinkProgram(program); + glValidateProgram(program); + + GLint success = false; + glGetProgramiv(program, GL_LINK_STATUS, &success); + if (!success){ + GLsizei ignore = 0; + char vertex_errors[KB(4)]; + char fragment_errors[KB(4)]; + char program_errors[KB(4)]; + glGetShaderInfoLog(vertex_shader, sizeof(vertex_errors), &ignore, vertex_errors); + glGetShaderInfoLog(fragment_shader, sizeof(fragment_errors), &ignore, fragment_errors); + glGetProgramInfoLog(program, sizeof(program_errors), &ignore, program_errors); #if SHIP_MODE - os_popup_error("Error", "Shader compilation failed."); + os_popup_error("Error", "Shader compilation failed."); #endif - InvalidPath; - } - - glDeleteShader(vertex_shader); - glDeleteShader(fragment_shader); - - GL_Program result = {}; - result.program = program; + InvalidPath; + } + + glDeleteShader(vertex_shader); + glDeleteShader(fragment_shader); + + GL_Program result = {}; + result.program = program; #define GetAttributeLocation(N) result.N = glGetAttribLocation(program, #N); - AttributeList(GetAttributeLocation) + AttributeList(GetAttributeLocation) #undef GetAttributeLocation #define GetUniformLocation(N) result.N = glGetUniformLocation(program, #N); - UniformList(GetUniformLocation) + UniformList(GetUniformLocation) #undef GetUniformLocation - return(result); - } - + return(result); +} + #define GLOffsetStruct(p,m) ((void*)(OffsetOfMemberStruct(p,m))) #define GLOffset(S,m) ((void*)(OffsetOfMember(S,m))) + +internal void +gl_render(Render_Target *t){ + Font_Set *font_set = (Font_Set*)t->font_set; - internal void - gl_render(Render_Target *t){ - Font_Set *font_set = (Font_Set*)t->font_set; + local_persist b32 first_opengl_call = true; + local_persist u32 attribute_buffer = 0; + local_persist GL_Program gpu_program = {}; + + if (first_opengl_call){ + first_opengl_call = false; - local_persist b32 first_opengl_call = true; - local_persist u32 attribute_buffer = 0; - local_persist GL_Program gpu_program = {}; - - if (first_opengl_call){ - first_opengl_call = false; - #if !SHIP_MODE - glEnable(GL_DEBUG_OUTPUT); - glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); - if (glDebugMessageControl){ - glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, 0, false); - glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, 0, false); - glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, 0, true); - glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, 0, true); - } - - if (glDebugMessageCallback){ - glDebugMessageCallback(gl__error_callback, 0); - } + glEnable(GL_DEBUG_OUTPUT); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + if (glDebugMessageControl){ + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, 0, false); + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, 0, false); + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, 0, true); + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, 0, true); + } + + if (glDebugMessageCallback){ + glDebugMessageCallback(gl__error_callback, 0); + } #endif - - //////////////////////////////// - - GLuint dummy_vao = 0; - glGenVertexArrays(1, &dummy_vao); - glBindVertexArray(dummy_vao); - - //////////////////////////////// - - glGenBuffers(1, &attribute_buffer); - glBindBuffer(GL_ARRAY_BUFFER, attribute_buffer); - - //////////////////////////////// - - glEnable(GL_SCISSOR_TEST); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - //////////////////////////////// - - gpu_program = gl__make_program(gl__header, gl__vertex, gl__fragment); - glUseProgram(gpu_program.program); - - //////////////////////////////// - - { - t->fallback_texture_id = gl__get_texture(V3i32(2, 2, 1), TextureKind_Mono); - u8 white_block[] = { 0xFF, 0xFF, 0xFF, 0xFF, }; - gl__fill_texture(TextureKind_Mono, 0, V3i32(0, 0, 0), V3i32(2, 2, 1), white_block); - } + + //////////////////////////////// + + GLuint dummy_vao = 0; + glGenVertexArrays(1, &dummy_vao); + glBindVertexArray(dummy_vao); + + //////////////////////////////// + + glGenBuffers(1, &attribute_buffer); + glBindBuffer(GL_ARRAY_BUFFER, attribute_buffer); + + //////////////////////////////// + + glEnable(GL_SCISSOR_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + //////////////////////////////// + + gpu_program = gl__make_program(gl__header, gl__vertex, gl__fragment); + glUseProgram(gpu_program.program); + + //////////////////////////////// + + { + t->fallback_texture_id = gl__get_texture(V3i32(2, 2, 1), TextureKind_Mono); + u8 white_block[] = { 0xFF, 0xFF, 0xFF, 0xFF, }; + gl__fill_texture(TextureKind_Mono, 0, V3i32(0, 0, 0), V3i32(2, 2, 1), white_block); } - - i32 width = t->width; - i32 height = t->height; - - glViewport(0, 0, width, height); - glScissor(0, 0, width, height); - glClearColor(1.f, 0.f, 1.f, 1.f); - glClear(GL_COLOR_BUFFER_BIT); - - glBindTexture(GL_TEXTURE_2D, 0); - t->bound_texture = 0; - - for (Render_Free_Texture *free_texture = t->free_texture_first; - free_texture != 0; - free_texture = free_texture->next){ - glDeleteTextures(1, &free_texture->tex_id); - } - t->free_texture_first = 0; - t->free_texture_last = 0; - - for (Render_Group *group = t->group_first; - group != 0; - group = group->next){ - Rect_i32 box = Ri32(group->clip_box); - - Rect_i32 scissor_box = { - box.x0, height - box.y1, box.x1 - box.x0, box.y1 - box.y0, - }; - scissor_box.x0 = clamp_bot(0, scissor_box.x0); - scissor_box.y0 = clamp_bot(0, scissor_box.y0); - scissor_box.x1 = clamp_bot(0, scissor_box.x1); - scissor_box.y1 = clamp_bot(0, scissor_box.y1); - glScissor(scissor_box.x0, scissor_box.y0, scissor_box.x1, scissor_box.y1); - - i32 vertex_count = group->vertex_list.vertex_count; - if (vertex_count > 0){ - Face *face = font_set_face_from_id(font_set, group->face_id); - if (face != 0){ - gl__bind_texture(t, face->texture); - } - else{ - gl__bind_any_texture(t); - } - - glBufferData(GL_ARRAY_BUFFER, vertex_count*sizeof(Render_Vertex), 0, GL_STREAM_DRAW); - i32 cursor = 0; - for (Render_Vertex_Array_Node *node = group->vertex_list.first; - node != 0; - node = node->next){ - i32 size = node->vertex_count*sizeof(*node->vertices); - glBufferSubData(GL_ARRAY_BUFFER, cursor, size, node->vertices); - cursor += size; - } - - glEnableVertexAttribArray(gpu_program.vertex_p); - glEnableVertexAttribArray(gpu_program.vertex_t); - glEnableVertexAttribArray(gpu_program.vertex_c); - glEnableVertexAttribArray(gpu_program.vertex_ht); - - glVertexAttribPointer(gpu_program.vertex_p, 2, GL_FLOAT, true, sizeof(Render_Vertex), - GLOffset(Render_Vertex, xy)); - glVertexAttribPointer(gpu_program.vertex_t, 3, GL_FLOAT, true, sizeof(Render_Vertex), - GLOffset(Render_Vertex, uvw)); - glVertexAttribIPointer(gpu_program.vertex_c, 1, GL_UNSIGNED_INT, sizeof(Render_Vertex), - GLOffset(Render_Vertex, color)); - glVertexAttribPointer(gpu_program.vertex_ht, 1, GL_FLOAT, true, sizeof(Render_Vertex), - GLOffset(Render_Vertex, half_thickness)); - - glUniform2f(gpu_program.view_t, width/2.f, height/2.f); - f32 m[4] = { - 2.f/width, 0.f, - 0.f, -2.f/height, - }; - glUniformMatrix2fv(gpu_program.view_m, 1, GL_FALSE, m); - glUniform1i(gpu_program.sampler, 0); - - glDrawArrays(GL_TRIANGLES, 0, vertex_count); - glDisableVertexAttribArray(gpu_program.vertex_p); - glDisableVertexAttribArray(gpu_program.vertex_t); - glDisableVertexAttribArray(gpu_program.vertex_c); - glDisableVertexAttribArray(gpu_program.vertex_ht); - } - } - - glFlush(); } - // BOTTOM + i32 width = t->width; + i32 height = t->height; - \ No newline at end of file + glViewport(0, 0, width, height); + glScissor(0, 0, width, height); + glClearColor(1.f, 0.f, 1.f, 1.f); + glClear(GL_COLOR_BUFFER_BIT); + + glBindTexture(GL_TEXTURE_2D, 0); + t->bound_texture = 0; + + for (Render_Free_Texture *free_texture = t->free_texture_first; + free_texture != 0; + free_texture = free_texture->next){ + glDeleteTextures(1, &free_texture->tex_id); + } + t->free_texture_first = 0; + t->free_texture_last = 0; + + for (Render_Group *group = t->group_first; + group != 0; + group = group->next){ + Rect_i32 box = Ri32(group->clip_box); + + Rect_i32 scissor_box = { + box.x0, height - box.y1, box.x1 - box.x0, box.y1 - box.y0, + }; + scissor_box.x0 = clamp_bot(0, scissor_box.x0); + scissor_box.y0 = clamp_bot(0, scissor_box.y0); + scissor_box.x1 = clamp_bot(0, scissor_box.x1); + scissor_box.y1 = clamp_bot(0, scissor_box.y1); + glScissor(scissor_box.x0, scissor_box.y0, scissor_box.x1, scissor_box.y1); + + i32 vertex_count = group->vertex_list.vertex_count; + if (vertex_count > 0){ + Face *face = font_set_face_from_id(font_set, group->face_id); + if (face != 0){ + gl__bind_texture(t, face->texture); + } + else{ + gl__bind_any_texture(t); + } + + glBufferData(GL_ARRAY_BUFFER, vertex_count*sizeof(Render_Vertex), 0, GL_STREAM_DRAW); + i32 cursor = 0; + for (Render_Vertex_Array_Node *node = group->vertex_list.first; + node != 0; + node = node->next){ + i32 size = node->vertex_count*sizeof(*node->vertices); + glBufferSubData(GL_ARRAY_BUFFER, cursor, size, node->vertices); + cursor += size; + } + + glEnableVertexAttribArray(gpu_program.vertex_p); + glEnableVertexAttribArray(gpu_program.vertex_t); + glEnableVertexAttribArray(gpu_program.vertex_c); + glEnableVertexAttribArray(gpu_program.vertex_ht); + + glVertexAttribPointer(gpu_program.vertex_p, 2, GL_FLOAT, true, sizeof(Render_Vertex), + GLOffset(Render_Vertex, xy)); + glVertexAttribPointer(gpu_program.vertex_t, 3, GL_FLOAT, true, sizeof(Render_Vertex), + GLOffset(Render_Vertex, uvw)); + glVertexAttribIPointer(gpu_program.vertex_c, 1, GL_UNSIGNED_INT, sizeof(Render_Vertex), + GLOffset(Render_Vertex, color)); + glVertexAttribPointer(gpu_program.vertex_ht, 1, GL_FLOAT, true, sizeof(Render_Vertex), + GLOffset(Render_Vertex, half_thickness)); + + glUniform2f(gpu_program.view_t, width/2.f, height/2.f); + f32 m[4] = { + 2.f/width, 0.f, + 0.f, -2.f/height, + }; + glUniformMatrix2fv(gpu_program.view_m, 1, GL_FALSE, m); + glUniform1i(gpu_program.sampler, 0); + + glDrawArrays(GL_TRIANGLES, 0, vertex_count); + glDisableVertexAttribArray(gpu_program.vertex_p); + glDisableVertexAttribArray(gpu_program.vertex_t); + glDisableVertexAttribArray(gpu_program.vertex_c); + glDisableVertexAttribArray(gpu_program.vertex_ht); + } + } + + glFlush(); +} + +// BOTTOM + From 0a29e6df6a5ff50d0f9e53c26c96d9f59a8fd0e9 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Tue, 3 Mar 2020 16:57:40 -0800 Subject: [PATCH 36/40] More robust footer panel manipulator functions --- custom/4coder_default_framework.cpp | 30 +- custom/generated/command_metadata.h | 484 ++++++++++++++-------------- custom/metadata_generator | Bin 0 -> 490048 bytes 3 files changed, 257 insertions(+), 257 deletions(-) create mode 100755 custom/metadata_generator diff --git a/custom/4coder_default_framework.cpp b/custom/4coder_default_framework.cpp index dc5daa24..cd494599 100644 --- a/custom/4coder_default_framework.cpp +++ b/custom/4coder_default_framework.cpp @@ -103,15 +103,15 @@ open_footer_panel(Application_Links *app, View_ID view){ function void close_build_footer_panel(Application_Links *app){ - if (build_footer_panel_view_id != 0){ + if (view_exists(app, build_footer_panel_view_id)){ view_close(app, build_footer_panel_view_id); - build_footer_panel_view_id = 0; } + build_footer_panel_view_id = 0; } function View_ID open_build_footer_panel(Application_Links *app){ - if (build_footer_panel_view_id == 0){ + if (!view_exists(app, build_footer_panel_view_id)){ View_ID view = get_active_view(app, Access_Always); build_footer_panel_view_id = open_footer_panel(app, view); view_set_active(app, view); @@ -497,18 +497,18 @@ function void default_4coder_initialize(Application_Links *app, String_Const_u8_Array file_names, i32 override_font_size, b32 override_hinting){ #define M \ - "Welcome to " VERSION "\n" \ - "If you're new to 4coder there is a built in tutorial\n" \ - "Use the key combination [ X Alt ] (on mac [ X Control ])\n" \ - "Type in 'hms_demo_tutorial' and press enter\n" \ - "\n" \ - "Direct bug reports and feature requests to https://github.com/4coder-editor/4coder/issues\n" \ - "\n" \ - "Other questions and discussion can be directed to editor@4coder.net or 4coder.handmade.network\n" \ - "\n" \ - "The change log can be found in CHANGES.txt\n" \ - "\n" - print_message(app, string_u8_litexpr(M)); +"Welcome to " VERSION "\n" \ +"If you're new to 4coder there is a built in tutorial\n" \ +"Use the key combination [ X Alt ] (on mac [ X Control ])\n" \ +"Type in 'hms_demo_tutorial' and press enter\n" \ +"\n" \ +"Direct bug reports and feature requests to https://github.com/4coder-editor/4coder/issues\n" \ +"\n" \ +"Other questions and discussion can be directed to editor@4coder.net or 4coder.handmade.network\n" \ +"\n" \ +"The change log can be found in CHANGES.txt\n" \ +"\n" + print_message(app, string_u8_litexpr(M)); #undef M load_config_and_apply(app, global_config_arena, &global_config, override_font_size, override_hinting); diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index 01209b1f..e424f1d4 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -264,248 +264,248 @@ i32 source_name_len; i32 line_number; }; static Command_Metadata fcoder_metacmd_table[242] = { -{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 409 }, -{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "c:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 413 }, -{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "c:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 423 }, -{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "c:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 404 }, -{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 154 }, -{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 96 }, -{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 647 }, -{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 68 }, -{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "c:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 159 }, -{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "c:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 122 }, -{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 197 }, -{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 284 }, -{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 290 }, -{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "c:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 180 }, -{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 636 }, -{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 480 }, -{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 216 }, -{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 233 }, -{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 223 }, -{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 243 }, -{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 255 }, -{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 7 }, -{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 843 }, -{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "c:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 174 }, -{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 655 }, -{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "c:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 190 }, -{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 761 }, -{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 125 }, -{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 149 }, -{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 107 }, -{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 124 }, -{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "c:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 175 }, -{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 116 }, -{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 738 }, -{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1897 }, -{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "c:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 7 }, -{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "c:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 23 }, -{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "c:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 51 }, -{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 162 }, -{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 79 }, -{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 112 }, -{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1323 }, -{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1495 }, -{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 134 }, -{ PROC_LINKS(display_key_codes, 0), false, "display_key_codes", 17, "Example of input handling loop", 30, "c:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 90 }, -{ PROC_LINKS(display_text_input, 0), false, "display_text_input", 18, "Example of to_writable and leave_current_input_unhandled", 56, "c:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 134 }, -{ PROC_LINKS(double_backspace, 0), false, "double_backspace", 16, "Example of history group helpers", 32, "c:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 10 }, -{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1481 }, -{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "c:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 22 }, -{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "c:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 7 }, -{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 825 }, -{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "c:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2224 }, -{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "c:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2232 }, -{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 525 }, -{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 542 }, -{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 348 }, -{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 375 }, -{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 833 }, -{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 464 }, -{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 494 }, -{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 481 }, -{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 511 }, -{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 685 }, -{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 671 }, -{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "c:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 869 }, -{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 70 }, -{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 564 }, -{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "c:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 581 }, -{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 727 }, -{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 520 }, -{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 661 }, -{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 715 }, -{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 612 }, -{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 510 }, -{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "c:\\4ed\\code\\custom\\4coder_code_index_listers.cpp", 48, 12 }, -{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "c:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 54 }, -{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "c:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 77 }, -{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "c:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 41 }, -{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1641 }, -{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "c:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 9 }, -{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 211 }, -{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "c:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 295 }, -{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "c:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 301 }, -{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "c:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 267 }, -{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "c:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 277 }, -{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 165 }, -{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 177 }, -{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 189 }, -{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 195 }, -{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 201 }, -{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 207 }, -{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 213 }, -{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 221 }, -{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 171 }, -{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 183 }, -{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 863 }, -{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "c:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1627 }, -{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 457 }, -{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 469 }, -{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1435 }, -{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "c:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 44 }, -{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "c:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 237 }, -{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "c:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 249 }, -{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "c:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 29 }, -{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "c:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 231 }, -{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "c:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 243 }, -{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 780 }, -{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 265 }, -{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 336 }, -{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 348 }, -{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 354 }, -{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 407 }, -{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 431 }, -{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 419 }, -{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 437 }, -{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 514 }, -{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 528 }, -{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 486 }, -{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 471 }, -{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 500 }, -{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1475 }, -{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1469 }, -{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 445 }, -{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 507 }, -{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 521 }, -{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 479 }, -{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 463 }, -{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 493 }, -{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 330 }, -{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 342 }, -{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 401 }, -{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 425 }, -{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 413 }, -{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 364 }, -{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 373 }, -{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 849 }, -{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 855 }, -{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1560 }, -{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1891 }, -{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 46 }, -{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 62 }, -{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 54 }, -{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1592 }, -{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 310 }, -{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 300 }, -{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 372 }, -{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 364 }, -{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 127 }, -{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 202 }, -{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 161 }, -{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "c:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 209 }, -{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 106 }, -{ PROC_LINKS(play_with_a_counter, 0), false, "play_with_a_counter", 19, "Example of query bar", 20, "c:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 29 }, -{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "c:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 226 }, -{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "c:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 219 }, -{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "c:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 212 }, -{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "c:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 886 }, -{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1290 }, -{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 871 }, -{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 897 }, -{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1251 }, -{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1272 }, -{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1288 }, -{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1730 }, -{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1815 }, -{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1400 }, -{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1659 }, -{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1161 }, -{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1152 }, -{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1143 }, -{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1084 }, -{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1096 }, -{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1649 }, -{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 382 }, -{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1367 }, -{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1078 }, -{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1090 }, -{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "c:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2212 }, -{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "c:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2200 }, -{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "c:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2218 }, -{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "c:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2206 }, -{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 537 }, -{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 57 }, -{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 66 }, -{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 82 }, -{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 99 }, -{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 27 }, -{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "c:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 39 }, -{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "c:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 125 }, -{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "c:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 112 }, -{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "c:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 86 }, -{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "c:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 99 }, -{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 707 }, -{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 749 }, -{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 115 }, -{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 427 }, -{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 421 }, -{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1238 }, -{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1250 }, -{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1244 }, -{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "c:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1231 }, -{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 678 }, -{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 664 }, -{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "c:\\4ed\\code\\custom\\4coder_log_parser.cpp", 40, 994 }, -{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 179 }, -{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 187 }, -{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 237 }, -{ PROC_LINKS(string_repeat, 0), false, "string_repeat", 13, "Example of query_user_string and query_user_number", 50, "c:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 176 }, -{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 403 }, -{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1617 }, -{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "c:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 785 }, -{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 563 }, -{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 550 }, -{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 692 }, -{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 701 }, -{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 451 }, -{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 439 }, -{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 433 }, -{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 806 }, -{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 812 }, -{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 415 }, -{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "c:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 445 }, -{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 797 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "c:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1176 }, -{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "c:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 20 }, -{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "c:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 34 }, -{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 }, -{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1717 }, -{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1744 }, -{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1605 }, -{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "c:\\4ed\\code\\custom\\4coder_jump_lister.cpp", 41, 59 }, -{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 395 }, -{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "c:\\4ed\\code\\custom\\4coder_search.cpp", 36, 642 }, -{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 94 }, -{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 82 }, -{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 88 }, -{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 67 }, -{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "c:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 433 }, -{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 59 }, -{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 76 }, -{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "c:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 73 }, -{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "c:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 100 }, +{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "../code/custom/4coder_default_framework.cpp", 43, 409 }, +{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "../code/custom/4coder_auto_indent.cpp", 37, 413 }, +{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "../code/custom/4coder_auto_indent.cpp", 37, 423 }, +{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "../code/custom/4coder_auto_indent.cpp", 37, 404 }, +{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "../code/custom/4coder_base_commands.cpp", 39, 154 }, +{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "../code/custom/4coder_base_commands.cpp", 39, 96 }, +{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "../code/custom/4coder_base_commands.cpp", 39, 647 }, +{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "../code/custom/4coder_clipboard.cpp", 35, 68 }, +{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "../code/custom/4coder_build_commands.cpp", 40, 159 }, +{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "../code/custom/4coder_build_commands.cpp", 40, 122 }, +{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "../code/custom/4coder_base_commands.cpp", 39, 197 }, +{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "../code/custom/4coder_default_framework.cpp", 43, 284 }, +{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "../code/custom/4coder_default_framework.cpp", 43, 290 }, +{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "../code/custom/4coder_build_commands.cpp", 40, 180 }, +{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 636 }, +{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "../code/custom/4coder_default_framework.cpp", 43, 480 }, +{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "../code/custom/4coder_clipboard.cpp", 35, 216 }, +{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "../code/custom/4coder_base_commands.cpp", 39, 233 }, +{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "../code/custom/4coder_base_commands.cpp", 39, 223 }, +{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "../code/custom/4coder_base_commands.cpp", 39, 243 }, +{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "../code/custom/4coder_base_commands.cpp", 39, 255 }, +{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "../code/custom/4coder_clipboard.cpp", 35, 7 }, +{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "../code/custom/4coder_project_commands.cpp", 42, 843 }, +{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "../code/custom/4coder_build_commands.cpp", 40, 174 }, +{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "../code/custom/4coder_base_commands.cpp", 39, 655 }, +{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "../code/custom/4coder_docs.cpp", 30, 190 }, +{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "../code/custom/4coder_lists.cpp", 31, 761 }, +{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "../code/custom/4coder_combined_write_commands.cpp", 49, 125 }, +{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "../code/custom/4coder_combined_write_commands.cpp", 49, 149 }, +{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "../code/custom/4coder_clipboard.cpp", 35, 107 }, +{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "../code/custom/4coder_base_commands.cpp", 39, 124 }, +{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "../code/custom/4coder_docs.cpp", 30, 175 }, +{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "../code/custom/4coder_clipboard.cpp", 35, 116 }, +{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 738 }, +{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "../code/custom/4coder_base_commands.cpp", 39, 1897 }, +{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "../code/custom/4coder_default_hooks.cpp", 39, 7 }, +{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "../code/custom/4coder_default_hooks.cpp", 39, 23 }, +{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "../code/custom/4coder_default_hooks.cpp", 39, 51 }, +{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "../code/custom/4coder_base_commands.cpp", 39, 162 }, +{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "../code/custom/4coder_base_commands.cpp", 39, 79 }, +{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "../code/custom/4coder_scope_commands.cpp", 40, 112 }, +{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "../code/custom/4coder_base_commands.cpp", 39, 1323 }, +{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "../code/custom/4coder_base_commands.cpp", 39, 1495 }, +{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "../code/custom/4coder_base_commands.cpp", 39, 134 }, +{ PROC_LINKS(display_key_codes, 0), false, "display_key_codes", 17, "Example of input handling loop", 30, "../code/custom/4coder_examples.cpp", 34, 90 }, +{ PROC_LINKS(display_text_input, 0), false, "display_text_input", 18, "Example of to_writable and leave_current_input_unhandled", 56, "../code/custom/4coder_examples.cpp", 34, 134 }, +{ PROC_LINKS(double_backspace, 0), false, "double_backspace", 16, "Example of history group helpers", 32, "../code/custom/4coder_examples.cpp", 34, 10 }, +{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "../code/custom/4coder_base_commands.cpp", 39, 1481 }, +{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "../code/custom/4coder_cli_command.cpp", 37, 22 }, +{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "../code/custom/4coder_cli_command.cpp", 37, 7 }, +{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "../code/custom/4coder_base_commands.cpp", 39, 825 }, +{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "../code/custom/4coder_helper.cpp", 32, 2224 }, +{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "../code/custom/4coder_helper.cpp", 32, 2232 }, +{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "../code/custom/4coder_jump_sticky.cpp", 37, 525 }, +{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "../code/custom/4coder_jump_sticky.cpp", 37, 542 }, +{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "../code/custom/4coder_jump_sticky.cpp", 37, 348 }, +{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "../code/custom/4coder_jump_sticky.cpp", 37, 375 }, +{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "../code/custom/4coder_base_commands.cpp", 39, 833 }, +{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "../code/custom/4coder_jump_sticky.cpp", 37, 464 }, +{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "../code/custom/4coder_jump_sticky.cpp", 37, 494 }, +{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "../code/custom/4coder_jump_sticky.cpp", 37, 481 }, +{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "../code/custom/4coder_jump_sticky.cpp", 37, 511 }, +{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 685 }, +{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 671 }, +{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "../code/custom/4coder_tutorial.cpp", 34, 869 }, +{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 70 }, +{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "../code/custom/4coder_jump_sticky.cpp", 37, 564 }, +{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "../code/custom/4coder_jump_sticky.cpp", 37, 581 }, +{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 727 }, +{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "../code/custom/4coder_lists.cpp", 31, 520 }, +{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "../code/custom/4coder_lists.cpp", 31, 661 }, +{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "../code/custom/4coder_lists.cpp", 31, 715 }, +{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "../code/custom/4coder_lists.cpp", 31, 612 }, +{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "../code/custom/4coder_lists.cpp", 31, 510 }, +{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "../code/custom/4coder_code_index_listers.cpp", 44, 12 }, +{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "../code/custom/4coder_keyboard_macro.cpp", 40, 54 }, +{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "../code/custom/4coder_keyboard_macro.cpp", 40, 77 }, +{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "../code/custom/4coder_keyboard_macro.cpp", 40, 41 }, +{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1641 }, +{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "../code/custom/4coder_tutorial.cpp", 34, 9 }, +{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "../code/custom/4coder_base_commands.cpp", 39, 211 }, +{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "../code/custom/4coder_function_list.cpp", 39, 295 }, +{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "../code/custom/4coder_function_list.cpp", 39, 301 }, +{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "../code/custom/4coder_function_list.cpp", 39, 267 }, +{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "../code/custom/4coder_function_list.cpp", 39, 277 }, +{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "../code/custom/4coder_search.cpp", 32, 165 }, +{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "../code/custom/4coder_search.cpp", 32, 177 }, +{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 189 }, +{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 195 }, +{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 201 }, +{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 207 }, +{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "../code/custom/4coder_search.cpp", 32, 213 }, +{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "../code/custom/4coder_search.cpp", 32, 221 }, +{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "../code/custom/4coder_search.cpp", 32, 171 }, +{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "../code/custom/4coder_search.cpp", 32, 183 }, +{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "../code/custom/4coder_project_commands.cpp", 42, 863 }, +{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "../code/custom/4coder_config.cpp", 32, 1627 }, +{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "../code/custom/4coder_default_framework.cpp", 43, 457 }, +{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "../code/custom/4coder_default_framework.cpp", 43, 469 }, +{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "../code/custom/4coder_base_commands.cpp", 39, 1435 }, +{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 44 }, +{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 237 }, +{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 249 }, +{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 29 }, +{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 231 }, +{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 243 }, +{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "../code/custom/4coder_base_commands.cpp", 39, 780 }, +{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "../code/custom/4coder_base_commands.cpp", 39, 265 }, +{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "../code/custom/4coder_base_commands.cpp", 39, 336 }, +{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "../code/custom/4coder_base_commands.cpp", 39, 348 }, +{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "../code/custom/4coder_base_commands.cpp", 39, 354 }, +{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "../code/custom/4coder_base_commands.cpp", 39, 407 }, +{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 431 }, +{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 419 }, +{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "../code/custom/4coder_base_commands.cpp", 39, 437 }, +{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "../code/custom/4coder_base_commands.cpp", 39, 514 }, +{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "../code/custom/4coder_base_commands.cpp", 39, 528 }, +{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "../code/custom/4coder_base_commands.cpp", 39, 486 }, +{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "../code/custom/4coder_base_commands.cpp", 39, 471 }, +{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "../code/custom/4coder_base_commands.cpp", 39, 500 }, +{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "../code/custom/4coder_base_commands.cpp", 39, 1475 }, +{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "../code/custom/4coder_base_commands.cpp", 39, 1469 }, +{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "../code/custom/4coder_base_commands.cpp", 39, 445 }, +{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "../code/custom/4coder_base_commands.cpp", 39, 507 }, +{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "../code/custom/4coder_base_commands.cpp", 39, 521 }, +{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "../code/custom/4coder_base_commands.cpp", 39, 479 }, +{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "../code/custom/4coder_base_commands.cpp", 39, 463 }, +{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "../code/custom/4coder_base_commands.cpp", 39, 493 }, +{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "../code/custom/4coder_base_commands.cpp", 39, 330 }, +{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "../code/custom/4coder_base_commands.cpp", 39, 342 }, +{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "../code/custom/4coder_base_commands.cpp", 39, 401 }, +{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 425 }, +{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 413 }, +{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "../code/custom/4coder_clipboard.cpp", 35, 364 }, +{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "../code/custom/4coder_clipboard.cpp", 35, 373 }, +{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "../code/custom/4coder_project_commands.cpp", 42, 849 }, +{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "../code/custom/4coder_project_commands.cpp", 42, 855 }, +{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "../code/custom/4coder_base_commands.cpp", 39, 1560 }, +{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1891 }, +{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "../code/custom/4coder_combined_write_commands.cpp", 49, 46 }, +{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "../code/custom/4coder_combined_write_commands.cpp", 49, 62 }, +{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "../code/custom/4coder_combined_write_commands.cpp", 49, 54 }, +{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1592 }, +{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "../code/custom/4coder_default_framework.cpp", 43, 310 }, +{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "../code/custom/4coder_default_framework.cpp", 43, 300 }, +{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "../code/custom/4coder_base_commands.cpp", 39, 372 }, +{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "../code/custom/4coder_base_commands.cpp", 39, 364 }, +{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "../code/custom/4coder_clipboard.cpp", 35, 127 }, +{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "../code/custom/4coder_clipboard.cpp", 35, 202 }, +{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "../code/custom/4coder_clipboard.cpp", 35, 161 }, +{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "../code/custom/4coder_clipboard.cpp", 35, 209 }, +{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "../code/custom/4coder_scope_commands.cpp", 40, 106 }, +{ PROC_LINKS(play_with_a_counter, 0), false, "play_with_a_counter", 19, "Example of query bar", 20, "../code/custom/4coder_examples.cpp", 34, 29 }, +{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "../code/custom/4coder_profile.cpp", 33, 226 }, +{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "../code/custom/4coder_profile.cpp", 33, 219 }, +{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "../code/custom/4coder_profile.cpp", 33, 212 }, +{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "../code/custom/4coder_profile_inspect.cpp", 41, 886 }, +{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "../code/custom/4coder_project_commands.cpp", 42, 1290 }, +{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "../code/custom/4coder_project_commands.cpp", 42, 871 }, +{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "../code/custom/4coder_project_commands.cpp", 42, 897 }, +{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "../code/custom/4coder_base_commands.cpp", 39, 1251 }, +{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "../code/custom/4coder_base_commands.cpp", 39, 1272 }, +{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "../code/custom/4coder_base_commands.cpp", 39, 1288 }, +{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 1730 }, +{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "../code/custom/4coder_base_commands.cpp", 39, 1815 }, +{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "../code/custom/4coder_base_commands.cpp", 39, 1400 }, +{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1659 }, +{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "../code/custom/4coder_base_commands.cpp", 39, 1161 }, +{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "../code/custom/4coder_base_commands.cpp", 39, 1152 }, +{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "../code/custom/4coder_base_commands.cpp", 39, 1143 }, +{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "../code/custom/4coder_base_commands.cpp", 39, 1084 }, +{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "../code/custom/4coder_base_commands.cpp", 39, 1096 }, +{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1649 }, +{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "../code/custom/4coder_default_framework.cpp", 43, 382 }, +{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1367 }, +{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "../code/custom/4coder_base_commands.cpp", 39, 1078 }, +{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "../code/custom/4coder_base_commands.cpp", 39, 1090 }, +{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "../code/custom/4coder_helper.cpp", 32, 2212 }, +{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "../code/custom/4coder_helper.cpp", 32, 2200 }, +{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "../code/custom/4coder_helper.cpp", 32, 2218 }, +{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "../code/custom/4coder_helper.cpp", 32, 2206 }, +{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "../code/custom/4coder_base_commands.cpp", 39, 537 }, +{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "../code/custom/4coder_scope_commands.cpp", 40, 57 }, +{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "../code/custom/4coder_scope_commands.cpp", 40, 66 }, +{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "../code/custom/4coder_scope_commands.cpp", 40, 82 }, +{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "../code/custom/4coder_scope_commands.cpp", 40, 99 }, +{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "../code/custom/4coder_scope_commands.cpp", 40, 27 }, +{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "../code/custom/4coder_scope_commands.cpp", 40, 39 }, +{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "../code/custom/4coder_eol.cpp", 29, 125 }, +{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "../code/custom/4coder_eol.cpp", 29, 112 }, +{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "../code/custom/4coder_eol.cpp", 29, 86 }, +{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "../code/custom/4coder_eol.cpp", 29, 99 }, +{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "../code/custom/4coder_base_commands.cpp", 39, 707 }, +{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "../code/custom/4coder_base_commands.cpp", 39, 749 }, +{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "../code/custom/4coder_base_commands.cpp", 39, 115 }, +{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "../code/custom/4coder_default_framework.cpp", 43, 427 }, +{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "../code/custom/4coder_default_framework.cpp", 43, 421 }, +{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1238 }, +{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1250 }, +{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1244 }, +{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "../code/custom/4coder_project_commands.cpp", 42, 1231 }, +{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 678 }, +{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 664 }, +{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "../code/custom/4coder_log_parser.cpp", 36, 994 }, +{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "../code/custom/4coder_base_commands.cpp", 39, 179 }, +{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "../code/custom/4coder_base_commands.cpp", 39, 187 }, +{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "../code/custom/4coder_combined_write_commands.cpp", 49, 237 }, +{ PROC_LINKS(string_repeat, 0), false, "string_repeat", 13, "Example of query_user_string and query_user_number", 50, "../code/custom/4coder_examples.cpp", 34, 176 }, +{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "../code/custom/4coder_default_framework.cpp", 43, 403 }, +{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "../code/custom/4coder_base_commands.cpp", 39, 1617 }, +{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "../code/custom/4coder_lists.cpp", 31, 785 }, +{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 563 }, +{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 550 }, +{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "../code/custom/4coder_base_commands.cpp", 39, 692 }, +{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "../code/custom/4coder_base_commands.cpp", 39, 701 }, +{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "../code/custom/4coder_default_framework.cpp", 43, 451 }, +{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "../code/custom/4coder_default_framework.cpp", 43, 439 }, +{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "../code/custom/4coder_default_framework.cpp", 43, 433 }, +{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "../code/custom/4coder_base_commands.cpp", 39, 806 }, +{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "../code/custom/4coder_base_commands.cpp", 39, 812 }, +{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "../code/custom/4coder_default_framework.cpp", 43, 415 }, +{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "../code/custom/4coder_default_framework.cpp", 43, 445 }, +{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "../code/custom/4coder_base_commands.cpp", 39, 797 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "../code/custom/4coder_code_index.cpp", 36, 1176 }, +{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 20 }, +{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 34 }, +{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 137 }, +{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "../code/custom/4coder_base_commands.cpp", 39, 1717 }, +{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "../code/custom/4coder_base_commands.cpp", 39, 1744 }, +{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "../code/custom/4coder_base_commands.cpp", 39, 1605 }, +{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "../code/custom/4coder_jump_lister.cpp", 37, 59 }, +{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "../code/custom/4coder_search.cpp", 32, 395 }, +{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "../code/custom/4coder_search.cpp", 32, 642 }, +{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "../code/custom/4coder_combined_write_commands.cpp", 49, 94 }, +{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 82 }, +{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 88 }, +{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "../code/custom/4coder_base_commands.cpp", 39, 67 }, +{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "../code/custom/4coder_auto_indent.cpp", 37, 433 }, +{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "../code/custom/4coder_base_commands.cpp", 39, 59 }, +{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 76 }, +{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "../code/custom/4coder_base_commands.cpp", 39, 73 }, +{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "../code/custom/4coder_combined_write_commands.cpp", 49, 100 }, }; static i32 fcoder_metacmd_ID_allow_mouse = 0; static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 1; diff --git a/custom/metadata_generator b/custom/metadata_generator new file mode 100755 index 0000000000000000000000000000000000000000..3722d42ed473b5c9893b6d299d6e33fad24e266c GIT binary patch literal 490048 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�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 N2EyNt2%=)|{{yq@rLh12 literal 0 HcmV?d00001 From bc2b834f3bda0b3d844683d3547a4f503359db68 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Tue, 3 Mar 2020 17:37:55 -0800 Subject: [PATCH 37/40] Whole screen render hook --- 4ed.cpp | 4 ++++ 4ed_api_implementation.cpp | 4 ++++ 4ed_app_models.h | 1 + custom/4coder_config.cpp | 2 +- custom/4coder_default_hooks.cpp | 15 +++++++++++++++ custom/4coder_types.h | 4 ++++ custom/bin/buildsuper_x64-linux.sh | 2 +- custom/metadata_generator | Bin 490048 -> 0 bytes ship_files/changes.txt | 3 ++- 9 files changed, 32 insertions(+), 3 deletions(-) delete mode 100755 custom/metadata_generator diff --git a/4ed.cpp b/4ed.cpp index a4efdd4f..17f37875 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -748,6 +748,10 @@ App_Step_Sig(app_step){ } } + if (models->whole_screen_render_caller != 0){ + models->whole_screen_render_caller(&app, frame); + } + models->in_render_mode = false; end_render_section(target); } diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index 10539c10..aa5efd9f 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -2234,6 +2234,10 @@ set_custom_hook(Application_Links *app, Hook_ID hook_id, Void_Func *func_ptr){ { models->render_caller = (Render_Caller_Function*)func_ptr; }break; + case HookID_WholeScreenRenderCaller: + { + models->whole_screen_render_caller = (Whole_Screen_Render_Caller_Function*)func_ptr; + }break; case HookID_BufferNameResolver: { models->buffer_name_resolver = (Buffer_Name_Resolver_Function*)func_ptr; diff --git a/4ed_app_models.h b/4ed_app_models.h index 71ea3254..daf24b34 100644 --- a/4ed_app_models.h +++ b/4ed_app_models.h @@ -62,6 +62,7 @@ struct Models{ Tick_Function *tick; Render_Caller_Function *render_caller; + Whole_Screen_Render_Caller_Function *whole_screen_render_caller; Delta_Rule_Function *delta_rule; u64 delta_rule_memory_size; diff --git a/custom/4coder_config.cpp b/custom/4coder_config.cpp index aef8a748..d2134b86 100644 --- a/custom/4coder_config.cpp +++ b/custom/4coder_config.cpp @@ -1367,7 +1367,7 @@ config_parse__file_name(Application_Links *app, Arena *arena, char *file_name, C if (data.data != 0){ parsed = config_parse__data(app, arena, SCu8(file_name), SCu8(data), config); - success = true; + success = true; } } if (!success){ diff --git a/custom/4coder_default_hooks.cpp b/custom/4coder_default_hooks.cpp index 16d8f335..4756c8e2 100644 --- a/custom/4coder_default_hooks.cpp +++ b/custom/4coder_default_hooks.cpp @@ -474,6 +474,20 @@ default_render_caller(Application_Links *app, Frame_Info frame_info, View_ID vie draw_set_clip(app, prev_clip); } +function void +default_whole_screen_render_caller(Application_Links *app, Frame_Info frame_info){ +#if 0 + Rect_f32 region = global_get_screen_rectangle(app); + Vec2_f32 center = rect_center(region); + + Face_ID face_id = get_face_id(app, 0); + Scratch_Block scratch(app); + draw_string_oriented(app, face_id, finalize_color(defcolor_text_default, 0), + SCu8("Hello, World!"), center, + GlyphFlag_Rotate90, V2f32(0.f, 1.f)); +#endif +} + HOOK_SIG(default_view_adjust){ // NOTE(allen): Called whenever the view layout/sizes have been modified, // including by full window resize. @@ -1022,6 +1036,7 @@ set_all_default_hooks(Application_Links *app){ set_custom_hook(app, HookID_ViewEventHandler, default_view_input_handler); set_custom_hook(app, HookID_Tick, default_tick); set_custom_hook(app, HookID_RenderCaller, default_render_caller); + set_custom_hook(app, HookID_WholeScreenRenderCaller, default_whole_screen_render_caller); #if 0 set_custom_hook(app, HookID_DeltaRule, original_delta); set_custom_hook_memory_size(app, HookID_DeltaRule, diff --git a/custom/4coder_types.h b/custom/4coder_types.h index e979bd8c..0898ad28 100644 --- a/custom/4coder_types.h +++ b/custom/4coder_types.h @@ -638,6 +638,7 @@ typedef i32 Hook_ID; enum{ HookID_Tick, HookID_RenderCaller, + HookID_WholeScreenRenderCaller, HookID_DeltaRule, HookID_BufferViewerUpdate, HookID_ViewEventHandler, @@ -695,6 +696,9 @@ typedef void Tick_Function(Application_Links *app, Frame_Info frame_info); api(custom) typedef void Render_Caller_Function(Application_Links *app, Frame_Info frame_info, View_ID view); +api(custom) +typedef void Whole_Screen_Render_Caller_Function(Application_Links *app, Frame_Info frame_info); + api(custom) typedef u32 Layout_Item_Flag; enum{ diff --git a/custom/bin/buildsuper_x64-linux.sh b/custom/bin/buildsuper_x64-linux.sh index 7b975b16..d6f0a00e 100755 --- a/custom/bin/buildsuper_x64-linux.sh +++ b/custom/bin/buildsuper_x64-linux.sh @@ -13,7 +13,7 @@ SOURCE="$1" if [ -z "$SOURCE" ]; then SOURCE="$(readlink -f "$CODE_HOME/4coder_default_bindings.cpp")" fi - +echo SOURCE = $SOURCE opts="-Wno-write-strings -Wno-null-dereference -Wno-comment -Wno-switch -Wno-missing-declarations -Wno-logical-op-parentheses -g -DOS_LINUX=1 -DOS_WINDOWS=0 -DOS_MAC=1" arch=-m64 diff --git a/custom/metadata_generator b/custom/metadata_generator deleted file mode 100755 index 3722d42ed473b5c9893b6d299d6e33fad24e266c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490048 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�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
tFqMcD1o#MEIRZ=+A?FAfEM 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 N2EyNt2%=)|{{yq@rLh12 diff --git a/ship_files/changes.txt b/ship_files/changes.txt index 18c6edad..2c75b6d6 100644 --- a/ship_files/changes.txt +++ b/ship_files/changes.txt @@ -12,6 +12,7 @@ + Fix: never miss the most recent post to the clipboard on windows + Fix: command `load_theme_current_buffer` gaurds against destroying the active color palette when bad files are loaded + Fix: project deep copy routine copies strings in the whitelist and blacklist pattern arrays + + Fix: footer panel manipulation functions check if the view exists 4.1.3 + Unkillable buffer setting @@ -85,7 +86,7 @@ New in alpha 4.0.29: -Highlighting and marking API, supporting customizable line higlights, range highlights, cursors and marks -In config.4coder "use_line_highlight" enables the highlight at the cursor in the active view -In config.4coder "use_scope_highlight" enables background highlighting to distinguish scopes in code files --In config.4coder "use_paren_helper" enalbes distinct coloring for matching parentheses +-In config.4coder "use_paren_helper" enalbes distinct coloring for matching parentheses -In config.4coder "use_comment_keyword" enables special coloring for the strings 'TODO' and 'NOTE' anywhere they occur, in code or text -In config.4coder "mode" sets the editing mode "4coder" the default 4coder mode From 7933ec6bc90fc6ebae1c7defd190f42f75154b3e Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Tue, 3 Mar 2020 18:44:25 -0800 Subject: [PATCH 38/40] New keycodes; linux one time code execution; close file handle in save function --- 4ed_generate_keycodes.cpp | 13 +- bin/itchio_push_all.sh | 0 bin/itchio_push_linux-x86.sh | 0 bin/itchio_push_linux.sh | 0 bin/package-x86-linux.sh | 0 custom/bin/build_one_time.sh | 42 ++ custom/bin/buildsuper_x64-linux.sh | 4 +- custom/bin/buildsuper_x64-mac.sh | 2 + custom/bin/buildsuper_x86-linux.sh | 4 +- custom/generated/4coder_event_codes.h | 506 +++++++++++++++---------- platform_linux/linux_4ed.cpp | 4 +- platform_linux/linux_4ed_functions.cpp | 1 + project.4coder | 7 +- ship_files/changes.txt | 2 + 14 files changed, 377 insertions(+), 208 deletions(-) mode change 100644 => 100755 bin/itchio_push_all.sh mode change 100644 => 100755 bin/itchio_push_linux-x86.sh mode change 100644 => 100755 bin/itchio_push_linux.sh mode change 100644 => 100755 bin/package-x86-linux.sh create mode 100755 custom/bin/build_one_time.sh diff --git a/4ed_generate_keycodes.cpp b/4ed_generate_keycodes.cpp index 622da54b..b03a7583 100644 --- a/4ed_generate_keycodes.cpp +++ b/4ed_generate_keycodes.cpp @@ -123,9 +123,20 @@ make_key_list(Arena *arena){ add_code(arena, &list, string_u8_litexpr("Control")); add_code(arena, &list, string_u8_litexpr("Alt")); add_code(arena, &list, string_u8_litexpr("Command")); - for (u32 i = 1; i <= 16; i += 1){ + for (u32 i = 1; i <= 24; i += 1){ add_code(arena, &list, push_u8_stringf(arena, "F%d", i)); } + for (u32 i = '0'; i <= '9'; i += 1){ + add_code(arena, &list, push_u8_stringf(arena, "NumPad%c", i)); + } + add_code(arena, &list, string_u8_litexpr("NumPadStar")); + add_code(arena, &list, string_u8_litexpr("NumPadPlus")); + add_code(arena, &list, string_u8_litexpr("NumPadMinus")); + add_code(arena, &list, string_u8_litexpr("NumPadDot")); + add_code(arena, &list, string_u8_litexpr("NumPadSlash")); + for (i32 i = 0; i < 30; i += 1){ + add_code(arena, &list, push_u8_stringf(arena, "Ex%d", i)); + } return(list); } diff --git a/bin/itchio_push_all.sh b/bin/itchio_push_all.sh old mode 100644 new mode 100755 diff --git a/bin/itchio_push_linux-x86.sh b/bin/itchio_push_linux-x86.sh old mode 100644 new mode 100755 diff --git a/bin/itchio_push_linux.sh b/bin/itchio_push_linux.sh old mode 100644 new mode 100755 diff --git a/bin/package-x86-linux.sh b/bin/package-x86-linux.sh old mode 100644 new mode 100755 diff --git a/custom/bin/build_one_time.sh b/custom/bin/build_one_time.sh new file mode 100755 index 00000000..724c34f0 --- /dev/null +++ b/custom/bin/build_one_time.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# If any command errors, stop the script +set -e + +# Set up directories +ORIGINAL=$PWD +ME="$(readlink -f "$0")" +LOCATION="$(dirname "$ME")" +cd $LOCATION +cd .. +CUSTOM_ROOT=$PWD +cd $ORIGINAL + +target=$1 +if [ -z "$target" ] +then + echo error: no input file + exit 1 +fi + +full_target=$target +if [[ ${target:0:1} != "/" ]]; +then +full_target="$PWD/$target" +fi + +dst=$2 +if [[ $dst == "" ]]; +then +dst=. +fi + +debug=-g + +opts="-Wno-write-strings -Wno-null-dereference -Wno-comment -Wno-switch -Wno-missing-declarations -Wno-logical-op-parentheses -g -DOS_LINUX=1 -DOS_WINDOWS=0 -DOS_MAC=0" + +pushd $dst +g++ -I"$CUSTOM_ROOT" $opts $full_target -o one_time +popd + + diff --git a/custom/bin/buildsuper_x64-linux.sh b/custom/bin/buildsuper_x64-linux.sh index d6f0a00e..d175b40a 100755 --- a/custom/bin/buildsuper_x64-linux.sh +++ b/custom/bin/buildsuper_x64-linux.sh @@ -15,9 +15,11 @@ if [ -z "$SOURCE" ]; then fi echo SOURCE = $SOURCE -opts="-Wno-write-strings -Wno-null-dereference -Wno-comment -Wno-switch -Wno-missing-declarations -Wno-logical-op-parentheses -g -DOS_LINUX=1 -DOS_WINDOWS=0 -DOS_MAC=1" +opts="-Wno-write-strings -Wno-null-dereference -Wno-comment -Wno-switch -Wno-missing-declarations -Wno-logical-op-parentheses -g -DOS_LINUX=1 -DOS_WINDOWS=0 -DOS_MAC=0" arch=-m64 +debug=-g + preproc_file=4coder_command_metadata.i meta_macros="-DMETA_PASS" g++ -I"$CODE_HOME" $meta_macros $arch $opts $debug -std=c++11 "$SOURCE" -E -o $preproc_file diff --git a/custom/bin/buildsuper_x64-mac.sh b/custom/bin/buildsuper_x64-mac.sh index 57a1f8cf..02aefcb2 100755 --- a/custom/bin/buildsuper_x64-mac.sh +++ b/custom/bin/buildsuper_x64-mac.sh @@ -18,6 +18,8 @@ fi opts="-Wno-write-strings -Wno-null-dereference -Wno-comment -Wno-switch -Wno-missing-declarations -Wno-logical-op-parentheses -g -DOS_MAC=1 -DOS_WINDOWS=0 -DOS_LINUX=0" arch=-m64 +debug=-g + preproc_file=4coder_command_metadata.i meta_macros="-DMETA_PASS" clang++ -I"$CODE_HOME" $meta_macros $arch $opts $debug -std=c++11 "$SOURCE" -E -o $preproc_file diff --git a/custom/bin/buildsuper_x86-linux.sh b/custom/bin/buildsuper_x86-linux.sh index becc4c47..f635aebf 100755 --- a/custom/bin/buildsuper_x86-linux.sh +++ b/custom/bin/buildsuper_x86-linux.sh @@ -14,9 +14,11 @@ if [ -z "$SOURCE" ]; then SOURCE="$(readlink -f "$CODE_HOME/4coder_default_bindings.cpp")" fi -opts="-Wno-write-strings -Wno-null-dereference -Wno-comment -Wno-switch -Wno-missing-declarations -Wno-logical-op-parentheses -g -DOS_LINUX=1 -DOS_WINDOWS=0 -DOS_MAC=1" +opts="-Wno-write-strings -Wno-null-dereference -Wno-comment -Wno-switch -Wno-missing-declarations -Wno-logical-op-parentheses -g -DOS_LINUX=1 -DOS_WINDOWS=0 -DOS_MAC=0" arch=-m32 +debug=-g + preproc_file=4coder_command_metadata.i meta_macros="-DMETA_PASS" g++ -I"$CODE_HOME" $meta_macros $arch $opts $debug -std=c++11 "$SOURCE" -E -o $preproc_file diff --git a/custom/generated/4coder_event_codes.h b/custom/generated/4coder_event_codes.h index 633caf07..f94d29e7 100644 --- a/custom/generated/4coder_event_codes.h +++ b/custom/generated/4coder_event_codes.h @@ -1,212 +1,318 @@ enum{ - KeyCode_A = 1, - KeyCode_B = 2, - KeyCode_C = 3, - KeyCode_D = 4, - KeyCode_E = 5, - KeyCode_F = 6, - KeyCode_G = 7, - KeyCode_H = 8, - KeyCode_I = 9, - KeyCode_J = 10, - KeyCode_K = 11, - KeyCode_L = 12, - KeyCode_M = 13, - KeyCode_N = 14, - KeyCode_O = 15, - KeyCode_P = 16, - KeyCode_Q = 17, - KeyCode_R = 18, - KeyCode_S = 19, - KeyCode_T = 20, - KeyCode_U = 21, - KeyCode_V = 22, - KeyCode_W = 23, - KeyCode_X = 24, - KeyCode_Y = 25, - KeyCode_Z = 26, - KeyCode_0 = 27, - KeyCode_1 = 28, - KeyCode_2 = 29, - KeyCode_3 = 30, - KeyCode_4 = 31, - KeyCode_5 = 32, - KeyCode_6 = 33, - KeyCode_7 = 34, - KeyCode_8 = 35, - KeyCode_9 = 36, - KeyCode_Space = 37, - KeyCode_Tick = 38, - KeyCode_Minus = 39, - KeyCode_Equal = 40, - KeyCode_LeftBracket = 41, - KeyCode_RightBracket = 42, - KeyCode_Semicolon = 43, - KeyCode_Quote = 44, - KeyCode_Comma = 45, - KeyCode_Period = 46, - KeyCode_ForwardSlash = 47, - KeyCode_BackwardSlash = 48, - KeyCode_Tab = 49, - KeyCode_Escape = 50, - KeyCode_Pause = 51, - KeyCode_Up = 52, - KeyCode_Down = 53, - KeyCode_Left = 54, - KeyCode_Right = 55, - KeyCode_Backspace = 56, - KeyCode_Return = 57, - KeyCode_Delete = 58, - KeyCode_Insert = 59, - KeyCode_Home = 60, - KeyCode_End = 61, - KeyCode_PageUp = 62, - KeyCode_PageDown = 63, - KeyCode_CapsLock = 64, - KeyCode_NumLock = 65, - KeyCode_ScrollLock = 66, - KeyCode_Menu = 67, - KeyCode_Shift = 68, - KeyCode_Control = 69, - KeyCode_Alt = 70, - KeyCode_Command = 71, - KeyCode_F1 = 72, - KeyCode_F2 = 73, - KeyCode_F3 = 74, - KeyCode_F4 = 75, - KeyCode_F5 = 76, - KeyCode_F6 = 77, - KeyCode_F7 = 78, - KeyCode_F8 = 79, - KeyCode_F9 = 80, - KeyCode_F10 = 81, - KeyCode_F11 = 82, - KeyCode_F12 = 83, - KeyCode_F13 = 84, - KeyCode_F14 = 85, - KeyCode_F15 = 86, - KeyCode_F16 = 87, - KeyCode_COUNT = 88, +KeyCode_A = 1, +KeyCode_B = 2, +KeyCode_C = 3, +KeyCode_D = 4, +KeyCode_E = 5, +KeyCode_F = 6, +KeyCode_G = 7, +KeyCode_H = 8, +KeyCode_I = 9, +KeyCode_J = 10, +KeyCode_K = 11, +KeyCode_L = 12, +KeyCode_M = 13, +KeyCode_N = 14, +KeyCode_O = 15, +KeyCode_P = 16, +KeyCode_Q = 17, +KeyCode_R = 18, +KeyCode_S = 19, +KeyCode_T = 20, +KeyCode_U = 21, +KeyCode_V = 22, +KeyCode_W = 23, +KeyCode_X = 24, +KeyCode_Y = 25, +KeyCode_Z = 26, +KeyCode_0 = 27, +KeyCode_1 = 28, +KeyCode_2 = 29, +KeyCode_3 = 30, +KeyCode_4 = 31, +KeyCode_5 = 32, +KeyCode_6 = 33, +KeyCode_7 = 34, +KeyCode_8 = 35, +KeyCode_9 = 36, +KeyCode_Space = 37, +KeyCode_Tick = 38, +KeyCode_Minus = 39, +KeyCode_Equal = 40, +KeyCode_LeftBracket = 41, +KeyCode_RightBracket = 42, +KeyCode_Semicolon = 43, +KeyCode_Quote = 44, +KeyCode_Comma = 45, +KeyCode_Period = 46, +KeyCode_ForwardSlash = 47, +KeyCode_BackwardSlash = 48, +KeyCode_Tab = 49, +KeyCode_Escape = 50, +KeyCode_Pause = 51, +KeyCode_Up = 52, +KeyCode_Down = 53, +KeyCode_Left = 54, +KeyCode_Right = 55, +KeyCode_Backspace = 56, +KeyCode_Return = 57, +KeyCode_Delete = 58, +KeyCode_Insert = 59, +KeyCode_Home = 60, +KeyCode_End = 61, +KeyCode_PageUp = 62, +KeyCode_PageDown = 63, +KeyCode_CapsLock = 64, +KeyCode_NumLock = 65, +KeyCode_ScrollLock = 66, +KeyCode_Menu = 67, +KeyCode_Shift = 68, +KeyCode_Control = 69, +KeyCode_Alt = 70, +KeyCode_Command = 71, +KeyCode_F1 = 72, +KeyCode_F2 = 73, +KeyCode_F3 = 74, +KeyCode_F4 = 75, +KeyCode_F5 = 76, +KeyCode_F6 = 77, +KeyCode_F7 = 78, +KeyCode_F8 = 79, +KeyCode_F9 = 80, +KeyCode_F10 = 81, +KeyCode_F11 = 82, +KeyCode_F12 = 83, +KeyCode_F13 = 84, +KeyCode_F14 = 85, +KeyCode_F15 = 86, +KeyCode_F16 = 87, +KeyCode_F17 = 88, +KeyCode_F18 = 89, +KeyCode_F19 = 90, +KeyCode_F20 = 91, +KeyCode_F21 = 92, +KeyCode_F22 = 93, +KeyCode_F23 = 94, +KeyCode_F24 = 95, +KeyCode_NumPad0 = 96, +KeyCode_NumPad1 = 97, +KeyCode_NumPad2 = 98, +KeyCode_NumPad3 = 99, +KeyCode_NumPad4 = 100, +KeyCode_NumPad5 = 101, +KeyCode_NumPad6 = 102, +KeyCode_NumPad7 = 103, +KeyCode_NumPad8 = 104, +KeyCode_NumPad9 = 105, +KeyCode_NumPadStar = 106, +KeyCode_NumPadPlus = 107, +KeyCode_NumPadMinus = 108, +KeyCode_NumPadDot = 109, +KeyCode_NumPadSlash = 110, +KeyCode_Ex0 = 111, +KeyCode_Ex1 = 112, +KeyCode_Ex2 = 113, +KeyCode_Ex3 = 114, +KeyCode_Ex4 = 115, +KeyCode_Ex5 = 116, +KeyCode_Ex6 = 117, +KeyCode_Ex7 = 118, +KeyCode_Ex8 = 119, +KeyCode_Ex9 = 120, +KeyCode_Ex10 = 121, +KeyCode_Ex11 = 122, +KeyCode_Ex12 = 123, +KeyCode_Ex13 = 124, +KeyCode_Ex14 = 125, +KeyCode_Ex15 = 126, +KeyCode_Ex16 = 127, +KeyCode_Ex17 = 128, +KeyCode_Ex18 = 129, +KeyCode_Ex19 = 130, +KeyCode_Ex20 = 131, +KeyCode_Ex21 = 132, +KeyCode_Ex22 = 133, +KeyCode_Ex23 = 134, +KeyCode_Ex24 = 135, +KeyCode_Ex25 = 136, +KeyCode_Ex26 = 137, +KeyCode_Ex27 = 138, +KeyCode_Ex28 = 139, +KeyCode_Ex29 = 140, +KeyCode_COUNT = 141, }; global char* key_code_name[KeyCode_COUNT] = { - "None", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "Space", - "Tick", - "Minus", - "Equal", - "LeftBracket", - "RightBracket", - "Semicolon", - "Quote", - "Comma", - "Period", - "ForwardSlash", - "BackwardSlash", - "Tab", - "Escape", - "Pause", - "Up", - "Down", - "Left", - "Right", - "Backspace", - "Return", - "Delete", - "Insert", - "Home", - "End", - "PageUp", - "PageDown", - "CapsLock", - "NumLock", - "ScrollLock", - "Menu", - "Shift", - "Control", - "Alt", - "Command", - "F1", - "F2", - "F3", - "F4", - "F5", - "F6", - "F7", - "F8", - "F9", - "F10", - "F11", - "F12", - "F13", - "F14", - "F15", - "F16", +"None", +"A", +"B", +"C", +"D", +"E", +"F", +"G", +"H", +"I", +"J", +"K", +"L", +"M", +"N", +"O", +"P", +"Q", +"R", +"S", +"T", +"U", +"V", +"W", +"X", +"Y", +"Z", +"0", +"1", +"2", +"3", +"4", +"5", +"6", +"7", +"8", +"9", +"Space", +"Tick", +"Minus", +"Equal", +"LeftBracket", +"RightBracket", +"Semicolon", +"Quote", +"Comma", +"Period", +"ForwardSlash", +"BackwardSlash", +"Tab", +"Escape", +"Pause", +"Up", +"Down", +"Left", +"Right", +"Backspace", +"Return", +"Delete", +"Insert", +"Home", +"End", +"PageUp", +"PageDown", +"CapsLock", +"NumLock", +"ScrollLock", +"Menu", +"Shift", +"Control", +"Alt", +"Command", +"F1", +"F2", +"F3", +"F4", +"F5", +"F6", +"F7", +"F8", +"F9", +"F10", +"F11", +"F12", +"F13", +"F14", +"F15", +"F16", +"F17", +"F18", +"F19", +"F20", +"F21", +"F22", +"F23", +"F24", +"NumPad0", +"NumPad1", +"NumPad2", +"NumPad3", +"NumPad4", +"NumPad5", +"NumPad6", +"NumPad7", +"NumPad8", +"NumPad9", +"NumPadStar", +"NumPadPlus", +"NumPadMinus", +"NumPadDot", +"NumPadSlash", +"Ex0", +"Ex1", +"Ex2", +"Ex3", +"Ex4", +"Ex5", +"Ex6", +"Ex7", +"Ex8", +"Ex9", +"Ex10", +"Ex11", +"Ex12", +"Ex13", +"Ex14", +"Ex15", +"Ex16", +"Ex17", +"Ex18", +"Ex19", +"Ex20", +"Ex21", +"Ex22", +"Ex23", +"Ex24", +"Ex25", +"Ex26", +"Ex27", +"Ex28", +"Ex29", }; enum{ - MouseCode_Left = 1, - MouseCode_Middle = 2, - MouseCode_Right = 3, - MouseCode_COUNT = 4, +MouseCode_Left = 1, +MouseCode_Middle = 2, +MouseCode_Right = 3, +MouseCode_COUNT = 4, }; global char* mouse_code_name[MouseCode_COUNT] = { - "None", - "Left", - "Middle", - "Right", +"None", +"Left", +"Middle", +"Right", }; enum{ - CoreCode_Startup = 1, - CoreCode_Animate = 2, - CoreCode_ClickActivateView = 3, - CoreCode_ClickDeactivateView = 4, - CoreCode_TryExit = 5, - CoreCode_FileExternallyModified = 6, - CoreCode_NewClipboardContents = 7, - CoreCode_COUNT = 8, +CoreCode_Startup = 1, +CoreCode_Animate = 2, +CoreCode_ClickActivateView = 3, +CoreCode_ClickDeactivateView = 4, +CoreCode_TryExit = 5, +CoreCode_FileExternallyModified = 6, +CoreCode_NewClipboardContents = 7, +CoreCode_COUNT = 8, }; global char* core_code_name[CoreCode_COUNT] = { - "None", - "Startup", - "Animate", - "ClickActivateView", - "ClickDeactivateView", - "TryExit", - "FileExternallyModified", - "NewClipboardContents", +"None", +"Startup", +"Animate", +"ClickActivateView", +"ClickDeactivateView", +"TryExit", +"FileExternallyModified", +"NewClipboardContents", }; diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 6f1fb3b4..6cd4a6de 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -1080,7 +1080,7 @@ linux_keycode_init(Display* dpy){ // Find the rest by their key label struct SymCode { KeySym sym; Key_Code code; }; - SymCode sym_table[100]; + SymCode sym_table[108]; SymCode* p = sym_table; *p++ = { XK_space, KeyCode_Space }; @@ -1112,7 +1112,7 @@ linux_keycode_init(Display* dpy){ *p++ = { XK_Super_L, KeyCode_Command }; *p++ = { XK_Super_R, KeyCode_Command }; - for(Key_Code k = KeyCode_F1; k <= KeyCode_F16; ++k) { + for (Key_Code k = KeyCode_F1; k <= KeyCode_F24; ++k){ *p++ = { XK_F1 + (k - KeyCode_F1), k }; } diff --git a/platform_linux/linux_4ed_functions.cpp b/platform_linux/linux_4ed_functions.cpp index 0be85ad0..b3b0bed9 100644 --- a/platform_linux/linux_4ed_functions.cpp +++ b/platform_linux/linux_4ed_functions.cpp @@ -233,6 +233,7 @@ system_save_file(Arena* scratch, char* file_name, String_Const_u8 data){ result = linux_file_attributes_from_struct_stat(&file_stat); } } + close(fd); } else { perror("open"); } diff --git a/project.4coder b/project.4coder index e24d066f..d548b124 100644 --- a/project.4coder +++ b/project.4coder @@ -53,8 +53,8 @@ command_list = { { .name = "run one time", .out = "*run*", .footer_panel = false, .save_dirty_files = false, .cmd = { { "pushd ..\\build & one_time", .os = "win" }, - { "pushd ../build & one_time", .os = "linux" }, - { "pushd ../build & one_time", .os = "mac" }, }, }, + { "cd ../build && ./one_time" , .os = "linux" }, + { "pushd ../build && ./one_time" , .os = "mac" }, }, }, { .name = "build custom api docs", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, @@ -92,7 +92,8 @@ command_list = { { .name = "build keycode generator", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, - .cmd = { { "custom\\bin\\build_one_time 4ed_generate_keycodes.cpp ..\\build", .os = "win" }, }, }, + .cmd = { { "custom\\bin\\build_one_time 4ed_generate_keycodes.cpp ..\\build", .os = "win" }, + { "custom/bin/build_one_time.sh 4ed_generate_keycodes.cpp ../build", .os = "linux" }, }, }, { .name = "build site render", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, diff --git a/ship_files/changes.txt b/ship_files/changes.txt index 2c75b6d6..ef1ccfd9 100644 --- a/ship_files/changes.txt +++ b/ship_files/changes.txt @@ -7,6 +7,8 @@ + in config.4coder the variable virtual_whitespace_regular_indent determines the number of space-widths to use as the regular indentation in a virtual whitespace layout + show whitespace mode implemented in 'default_render_buffer' + `set_face_size` and `set_face_size_this_buffer` commands + + `HookID_WholeScreenRenderCaller` hook runs once per frame after all views render + + Extended key codes list + Fix: tabs are measured with the correct amount of width for the user's settings + Fix: virtual whitespace toggling works when the config initially diabled virtual whitespace + Fix: never miss the most recent post to the clipboard on windows From 6749053db02bef74b4fa97247d06bce085980138 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Tue, 3 Mar 2020 22:57:21 -0800 Subject: [PATCH 39/40] Fix clipboard to work when catch all is set to false --- platform_linux/linux_4ed.cpp | 84 ++++++++++++++++++-------- platform_linux/linux_4ed_functions.cpp | 27 --------- 2 files changed, 60 insertions(+), 51 deletions(-) diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 6cd4a6de..13e8f4bc 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -1218,6 +1218,32 @@ linux_clipboard_send(XSelectionRequestEvent* req) { XSendEvent(req->display, req->requestor, True, 0, (XEvent*)&rsp); } +internal String_Const_u8 +linux_clipboard_recv(Arena *arena){ + Atom type; + int fmt; + unsigned long nitems; + unsigned long bytes_left; + u8 *data; + + int result = XGetWindowProperty(linuxvars.dpy, + linuxvars.win, + linuxvars.atom_CLIPBOARD, + 0L, 0x20000000L, False, + linuxvars.atom_UTF8_STRING, + &type, &fmt, &nitems, + &bytes_left, &data); + + String_Const_u8 clip = {}; + if(result == Success && fmt == 8){ + clip= push_string_copy(arena, SCu8(data, nitems)); + XFree(data); + XDeleteProperty(linuxvars.dpy, linuxvars.win, linuxvars.atom_CLIPBOARD); + } + + return(clip); +} + internal void linux_clipboard_recv(XSelectionEvent* ev) { @@ -1227,31 +1253,42 @@ linux_clipboard_recv(XSelectionEvent* ev) { return; } - Atom type; - int fmt; - unsigned long nitems; - unsigned long bytes_left; - u8 *data; - - int result = XGetWindowProperty( - linuxvars.dpy, - linuxvars.win, - linuxvars.atom_CLIPBOARD, - 0L, 0x20000000L, False, - linuxvars.atom_UTF8_STRING, - &type, &fmt, &nitems, - &bytes_left, &data); - - if(result == Success && fmt == 8){ + Scratch_Block scratch(&linuxvars.tctx); + String_Const_u8 clip = linux_clipboard_recv(scratch); + if (clip.size > 0){ linalloc_clear(linuxvars.clipboard_arena); - linuxvars.clipboard_contents = push_u8_stringf(linuxvars.clipboard_arena, "%.*s", nitems, data); + linuxvars.clipboard_contents = push_string_copy(linuxvars.clipboard_arena, clip); linuxvars.received_new_clipboard = true; - XFree(data); - XDeleteProperty(linuxvars.dpy, linuxvars.win, linuxvars.atom_CLIPBOARD); linux_schedule_step(); } } +internal +system_get_clipboard_sig(){ + // TODO(inso): index? + return(push_string_copy(arena, linuxvars.clipboard_contents)); +} + +internal void +system_post_clipboard(String_Const_u8 str, i32 index){ + // TODO(inso): index? + //LINUX_FN_DEBUG("%.*s", string_expand(str)); + linalloc_clear(linuxvars.clipboard_arena); + linuxvars.clipboard_contents = push_u8_stringf(linuxvars.clipboard_arena, "%.*s", str.size, str.str); + XSetSelectionOwner(linuxvars.dpy, linuxvars.atom_CLIPBOARD, linuxvars.win, CurrentTime); +} + +internal void +system_set_clipboard_catch_all(b32 enabled){ + LINUX_FN_DEBUG("%d", enabled); + linuxvars.clipboard_catch_all = !!enabled; +} + +internal b32 +system_get_clipboard_catch_all(void){ + return linuxvars.clipboard_catch_all; +} + internal String_Const_u8 linux_filter_text(Arena* arena, u8* buf, int len) { u8* const result = push_array(arena, u8, len); @@ -1488,11 +1525,10 @@ linux_handle_x11_events() { default: { // clipboard update notification - ask for the new content - if (linuxvars.clipboard_catch_all && event.type == linuxvars.xfixes_selection_event) { + if (event.type == linuxvars.xfixes_selection_event) { XFixesSelectionNotifyEvent* sne = (XFixesSelectionNotifyEvent*)&event; if (sne->subtype == XFixesSelectionNotify && sne->owner != linuxvars.win){ - XConvertSelection( - linuxvars.dpy, + XConvertSelection(linuxvars.dpy, linuxvars.atom_CLIPBOARD, linuxvars.atom_UTF8_STRING, linuxvars.atom_CLIPBOARD, @@ -1768,10 +1804,10 @@ main(int argc, char **argv){ Application_Step_Input input = {}; - if (linuxvars.received_new_clipboard){ + if (linuxvars.received_new_clipboard && linuxvars.clipboard_catch_all){ input.clipboard = linuxvars.clipboard_contents; - linuxvars.received_new_clipboard = false; } + linuxvars.received_new_clipboard = false; input.first_step = first_step; input.dt = frame_useconds/1000000.f; // variable? diff --git a/platform_linux/linux_4ed_functions.cpp b/platform_linux/linux_4ed_functions.cpp index b3b0bed9..040d503f 100644 --- a/platform_linux/linux_4ed_functions.cpp +++ b/platform_linux/linux_4ed_functions.cpp @@ -335,33 +335,6 @@ system_sleep(u64 microseconds){ nanosleep(&requested, &remaining); } -internal String_Const_u8 -system_get_clipboard(Arena* arena, i32 index){ - // TODO(inso): index? - u8* ptr = push_array_write(arena, u8, linuxvars.clipboard_contents.size, linuxvars.clipboard_contents.str); - return SCu8(ptr, linuxvars.clipboard_contents.size); -} - -internal void -system_post_clipboard(String_Const_u8 str, i32 index){ - // TODO(inso): index? - //LINUX_FN_DEBUG("%.*s", string_expand(str)); - linalloc_clear(linuxvars.clipboard_arena); - linuxvars.clipboard_contents = push_u8_stringf(linuxvars.clipboard_arena, "%.*s", str.size, str.str); - XSetSelectionOwner(linuxvars.dpy, linuxvars.atom_CLIPBOARD, linuxvars.win, CurrentTime); -} - -internal void -system_set_clipboard_catch_all(b32 enabled){ - LINUX_FN_DEBUG("%d", enabled); - linuxvars.clipboard_catch_all = !!enabled; -} - -internal b32 -system_get_clipboard_catch_all(void){ - return linuxvars.clipboard_catch_all; -} - internal b32 system_cli_call(Arena* scratch, char* path, char* script, CLI_Handles* cli_out){ LINUX_FN_DEBUG("%s / %s", path, script); From 61b3341743390de946ea249355ad4aa41490296e Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Tue, 3 Mar 2020 23:43:20 -0800 Subject: [PATCH 40/40] Added win32 keycodes for numpad and extension --- custom/generated/command_metadata.h | 484 ++++++++++++++-------------- platform_win32/win32_4ed.cpp | 38 ++- 2 files changed, 276 insertions(+), 246 deletions(-) diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index e424f1d4..fc706980 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -264,248 +264,248 @@ i32 source_name_len; i32 line_number; }; static Command_Metadata fcoder_metacmd_table[242] = { -{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "../code/custom/4coder_default_framework.cpp", 43, 409 }, -{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "../code/custom/4coder_auto_indent.cpp", 37, 413 }, -{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "../code/custom/4coder_auto_indent.cpp", 37, 423 }, -{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "../code/custom/4coder_auto_indent.cpp", 37, 404 }, -{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "../code/custom/4coder_base_commands.cpp", 39, 154 }, -{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "../code/custom/4coder_base_commands.cpp", 39, 96 }, -{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "../code/custom/4coder_base_commands.cpp", 39, 647 }, -{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "../code/custom/4coder_clipboard.cpp", 35, 68 }, -{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "../code/custom/4coder_build_commands.cpp", 40, 159 }, -{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "../code/custom/4coder_build_commands.cpp", 40, 122 }, -{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "../code/custom/4coder_base_commands.cpp", 39, 197 }, -{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "../code/custom/4coder_default_framework.cpp", 43, 284 }, -{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "../code/custom/4coder_default_framework.cpp", 43, 290 }, -{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "../code/custom/4coder_build_commands.cpp", 40, 180 }, -{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 636 }, -{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "../code/custom/4coder_default_framework.cpp", 43, 480 }, -{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "../code/custom/4coder_clipboard.cpp", 35, 216 }, -{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "../code/custom/4coder_base_commands.cpp", 39, 233 }, -{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "../code/custom/4coder_base_commands.cpp", 39, 223 }, -{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "../code/custom/4coder_base_commands.cpp", 39, 243 }, -{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "../code/custom/4coder_base_commands.cpp", 39, 255 }, -{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "../code/custom/4coder_clipboard.cpp", 35, 7 }, -{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "../code/custom/4coder_project_commands.cpp", 42, 843 }, -{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "../code/custom/4coder_build_commands.cpp", 40, 174 }, -{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "../code/custom/4coder_base_commands.cpp", 39, 655 }, -{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "../code/custom/4coder_docs.cpp", 30, 190 }, -{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "../code/custom/4coder_lists.cpp", 31, 761 }, -{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "../code/custom/4coder_combined_write_commands.cpp", 49, 125 }, -{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "../code/custom/4coder_combined_write_commands.cpp", 49, 149 }, -{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "../code/custom/4coder_clipboard.cpp", 35, 107 }, -{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "../code/custom/4coder_base_commands.cpp", 39, 124 }, -{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "../code/custom/4coder_docs.cpp", 30, 175 }, -{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "../code/custom/4coder_clipboard.cpp", 35, 116 }, -{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 738 }, -{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "../code/custom/4coder_base_commands.cpp", 39, 1897 }, -{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "../code/custom/4coder_default_hooks.cpp", 39, 7 }, -{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "../code/custom/4coder_default_hooks.cpp", 39, 23 }, -{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "../code/custom/4coder_default_hooks.cpp", 39, 51 }, -{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "../code/custom/4coder_base_commands.cpp", 39, 162 }, -{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "../code/custom/4coder_base_commands.cpp", 39, 79 }, -{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "../code/custom/4coder_scope_commands.cpp", 40, 112 }, -{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "../code/custom/4coder_base_commands.cpp", 39, 1323 }, -{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "../code/custom/4coder_base_commands.cpp", 39, 1495 }, -{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "../code/custom/4coder_base_commands.cpp", 39, 134 }, -{ PROC_LINKS(display_key_codes, 0), false, "display_key_codes", 17, "Example of input handling loop", 30, "../code/custom/4coder_examples.cpp", 34, 90 }, -{ PROC_LINKS(display_text_input, 0), false, "display_text_input", 18, "Example of to_writable and leave_current_input_unhandled", 56, "../code/custom/4coder_examples.cpp", 34, 134 }, -{ PROC_LINKS(double_backspace, 0), false, "double_backspace", 16, "Example of history group helpers", 32, "../code/custom/4coder_examples.cpp", 34, 10 }, -{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "../code/custom/4coder_base_commands.cpp", 39, 1481 }, -{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "../code/custom/4coder_cli_command.cpp", 37, 22 }, -{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "../code/custom/4coder_cli_command.cpp", 37, 7 }, -{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "../code/custom/4coder_base_commands.cpp", 39, 825 }, -{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "../code/custom/4coder_helper.cpp", 32, 2224 }, -{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "../code/custom/4coder_helper.cpp", 32, 2232 }, -{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "../code/custom/4coder_jump_sticky.cpp", 37, 525 }, -{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "../code/custom/4coder_jump_sticky.cpp", 37, 542 }, -{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "../code/custom/4coder_jump_sticky.cpp", 37, 348 }, -{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "../code/custom/4coder_jump_sticky.cpp", 37, 375 }, -{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "../code/custom/4coder_base_commands.cpp", 39, 833 }, -{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "../code/custom/4coder_jump_sticky.cpp", 37, 464 }, -{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "../code/custom/4coder_jump_sticky.cpp", 37, 494 }, -{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "../code/custom/4coder_jump_sticky.cpp", 37, 481 }, -{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "../code/custom/4coder_jump_sticky.cpp", 37, 511 }, -{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 685 }, -{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 671 }, -{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "../code/custom/4coder_tutorial.cpp", 34, 869 }, -{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 70 }, -{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "../code/custom/4coder_jump_sticky.cpp", 37, 564 }, -{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "../code/custom/4coder_jump_sticky.cpp", 37, 581 }, -{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "../code/custom/4coder_base_commands.cpp", 39, 727 }, -{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "../code/custom/4coder_lists.cpp", 31, 520 }, -{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "../code/custom/4coder_lists.cpp", 31, 661 }, -{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "../code/custom/4coder_lists.cpp", 31, 715 }, -{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "../code/custom/4coder_lists.cpp", 31, 612 }, -{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "../code/custom/4coder_lists.cpp", 31, 510 }, -{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "../code/custom/4coder_code_index_listers.cpp", 44, 12 }, -{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "../code/custom/4coder_keyboard_macro.cpp", 40, 54 }, -{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "../code/custom/4coder_keyboard_macro.cpp", 40, 77 }, -{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "../code/custom/4coder_keyboard_macro.cpp", 40, 41 }, -{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1641 }, -{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "../code/custom/4coder_tutorial.cpp", 34, 9 }, -{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "../code/custom/4coder_base_commands.cpp", 39, 211 }, -{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "../code/custom/4coder_function_list.cpp", 39, 295 }, -{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "../code/custom/4coder_function_list.cpp", 39, 301 }, -{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "../code/custom/4coder_function_list.cpp", 39, 267 }, -{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "../code/custom/4coder_function_list.cpp", 39, 277 }, -{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "../code/custom/4coder_search.cpp", 32, 165 }, -{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "../code/custom/4coder_search.cpp", 32, 177 }, -{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 189 }, -{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 195 }, -{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "../code/custom/4coder_search.cpp", 32, 201 }, -{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "../code/custom/4coder_search.cpp", 32, 207 }, -{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "../code/custom/4coder_search.cpp", 32, 213 }, -{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "../code/custom/4coder_search.cpp", 32, 221 }, -{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "../code/custom/4coder_search.cpp", 32, 171 }, -{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "../code/custom/4coder_search.cpp", 32, 183 }, -{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "../code/custom/4coder_project_commands.cpp", 42, 863 }, -{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "../code/custom/4coder_config.cpp", 32, 1627 }, -{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "../code/custom/4coder_default_framework.cpp", 43, 457 }, -{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "../code/custom/4coder_default_framework.cpp", 43, 469 }, -{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "../code/custom/4coder_base_commands.cpp", 39, 1435 }, -{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 44 }, -{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 237 }, -{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 249 }, -{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "../code/custom/4coder_miblo_numbers.cpp", 39, 29 }, -{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 231 }, -{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "../code/custom/4coder_miblo_numbers.cpp", 39, 243 }, -{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "../code/custom/4coder_base_commands.cpp", 39, 780 }, -{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "../code/custom/4coder_base_commands.cpp", 39, 265 }, -{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "../code/custom/4coder_base_commands.cpp", 39, 336 }, -{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "../code/custom/4coder_base_commands.cpp", 39, 348 }, -{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "../code/custom/4coder_base_commands.cpp", 39, 354 }, -{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "../code/custom/4coder_base_commands.cpp", 39, 407 }, -{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 431 }, -{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "../code/custom/4coder_base_commands.cpp", 39, 419 }, -{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "../code/custom/4coder_base_commands.cpp", 39, 437 }, -{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "../code/custom/4coder_base_commands.cpp", 39, 514 }, -{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "../code/custom/4coder_base_commands.cpp", 39, 528 }, -{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "../code/custom/4coder_base_commands.cpp", 39, 486 }, -{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "../code/custom/4coder_base_commands.cpp", 39, 471 }, -{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "../code/custom/4coder_base_commands.cpp", 39, 500 }, -{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "../code/custom/4coder_base_commands.cpp", 39, 1475 }, -{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "../code/custom/4coder_base_commands.cpp", 39, 1469 }, -{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "../code/custom/4coder_base_commands.cpp", 39, 445 }, -{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "../code/custom/4coder_base_commands.cpp", 39, 507 }, -{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "../code/custom/4coder_base_commands.cpp", 39, 521 }, -{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "../code/custom/4coder_base_commands.cpp", 39, 479 }, -{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "../code/custom/4coder_base_commands.cpp", 39, 463 }, -{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "../code/custom/4coder_base_commands.cpp", 39, 493 }, -{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "../code/custom/4coder_base_commands.cpp", 39, 330 }, -{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "../code/custom/4coder_base_commands.cpp", 39, 342 }, -{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "../code/custom/4coder_base_commands.cpp", 39, 401 }, -{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 425 }, -{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "../code/custom/4coder_base_commands.cpp", 39, 413 }, -{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "../code/custom/4coder_clipboard.cpp", 35, 364 }, -{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "../code/custom/4coder_clipboard.cpp", 35, 373 }, -{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "../code/custom/4coder_project_commands.cpp", 42, 849 }, -{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "../code/custom/4coder_project_commands.cpp", 42, 855 }, -{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "../code/custom/4coder_base_commands.cpp", 39, 1560 }, -{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1891 }, -{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "../code/custom/4coder_combined_write_commands.cpp", 49, 46 }, -{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "../code/custom/4coder_combined_write_commands.cpp", 49, 62 }, -{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "../code/custom/4coder_combined_write_commands.cpp", 49, 54 }, -{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1592 }, -{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "../code/custom/4coder_default_framework.cpp", 43, 310 }, -{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "../code/custom/4coder_default_framework.cpp", 43, 300 }, -{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "../code/custom/4coder_base_commands.cpp", 39, 372 }, -{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "../code/custom/4coder_base_commands.cpp", 39, 364 }, -{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "../code/custom/4coder_clipboard.cpp", 35, 127 }, -{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "../code/custom/4coder_clipboard.cpp", 35, 202 }, -{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "../code/custom/4coder_clipboard.cpp", 35, 161 }, -{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "../code/custom/4coder_clipboard.cpp", 35, 209 }, -{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "../code/custom/4coder_scope_commands.cpp", 40, 106 }, -{ PROC_LINKS(play_with_a_counter, 0), false, "play_with_a_counter", 19, "Example of query bar", 20, "../code/custom/4coder_examples.cpp", 34, 29 }, -{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "../code/custom/4coder_profile.cpp", 33, 226 }, -{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "../code/custom/4coder_profile.cpp", 33, 219 }, -{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "../code/custom/4coder_profile.cpp", 33, 212 }, -{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "../code/custom/4coder_profile_inspect.cpp", 41, 886 }, -{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "../code/custom/4coder_project_commands.cpp", 42, 1290 }, -{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "../code/custom/4coder_project_commands.cpp", 42, 871 }, -{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "../code/custom/4coder_project_commands.cpp", 42, 897 }, -{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "../code/custom/4coder_base_commands.cpp", 39, 1251 }, -{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "../code/custom/4coder_base_commands.cpp", 39, 1272 }, -{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "../code/custom/4coder_base_commands.cpp", 39, 1288 }, -{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "../code/custom/4coder_base_commands.cpp", 39, 1730 }, -{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "../code/custom/4coder_base_commands.cpp", 39, 1815 }, -{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "../code/custom/4coder_base_commands.cpp", 39, 1400 }, -{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "../code/custom/4coder_base_commands.cpp", 39, 1659 }, -{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "../code/custom/4coder_base_commands.cpp", 39, 1161 }, -{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "../code/custom/4coder_base_commands.cpp", 39, 1152 }, -{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "../code/custom/4coder_base_commands.cpp", 39, 1143 }, -{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "../code/custom/4coder_base_commands.cpp", 39, 1084 }, -{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "../code/custom/4coder_base_commands.cpp", 39, 1096 }, -{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "../code/custom/4coder_base_commands.cpp", 39, 1649 }, -{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "../code/custom/4coder_default_framework.cpp", 43, 382 }, -{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "../code/custom/4coder_base_commands.cpp", 39, 1367 }, -{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "../code/custom/4coder_base_commands.cpp", 39, 1078 }, -{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "../code/custom/4coder_base_commands.cpp", 39, 1090 }, -{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "../code/custom/4coder_helper.cpp", 32, 2212 }, -{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "../code/custom/4coder_helper.cpp", 32, 2200 }, -{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "../code/custom/4coder_helper.cpp", 32, 2218 }, -{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "../code/custom/4coder_helper.cpp", 32, 2206 }, -{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "../code/custom/4coder_base_commands.cpp", 39, 537 }, -{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "../code/custom/4coder_scope_commands.cpp", 40, 57 }, -{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "../code/custom/4coder_scope_commands.cpp", 40, 66 }, -{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "../code/custom/4coder_scope_commands.cpp", 40, 82 }, -{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "../code/custom/4coder_scope_commands.cpp", 40, 99 }, -{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "../code/custom/4coder_scope_commands.cpp", 40, 27 }, -{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "../code/custom/4coder_scope_commands.cpp", 40, 39 }, -{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "../code/custom/4coder_eol.cpp", 29, 125 }, -{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "../code/custom/4coder_eol.cpp", 29, 112 }, -{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "../code/custom/4coder_eol.cpp", 29, 86 }, -{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "../code/custom/4coder_eol.cpp", 29, 99 }, -{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "../code/custom/4coder_base_commands.cpp", 39, 707 }, -{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "../code/custom/4coder_base_commands.cpp", 39, 749 }, -{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "../code/custom/4coder_base_commands.cpp", 39, 115 }, -{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "../code/custom/4coder_default_framework.cpp", 43, 427 }, -{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "../code/custom/4coder_default_framework.cpp", 43, 421 }, -{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1238 }, -{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1250 }, -{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "../code/custom/4coder_project_commands.cpp", 42, 1244 }, -{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "../code/custom/4coder_project_commands.cpp", 42, 1231 }, -{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "../code/custom/4coder_base_commands.cpp", 39, 678 }, -{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "../code/custom/4coder_base_commands.cpp", 39, 664 }, -{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "../code/custom/4coder_log_parser.cpp", 36, 994 }, -{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "../code/custom/4coder_base_commands.cpp", 39, 179 }, -{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "../code/custom/4coder_base_commands.cpp", 39, 187 }, -{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "../code/custom/4coder_combined_write_commands.cpp", 49, 237 }, -{ PROC_LINKS(string_repeat, 0), false, "string_repeat", 13, "Example of query_user_string and query_user_number", 50, "../code/custom/4coder_examples.cpp", 34, 176 }, -{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "../code/custom/4coder_default_framework.cpp", 43, 403 }, -{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "../code/custom/4coder_base_commands.cpp", 39, 1617 }, -{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "../code/custom/4coder_lists.cpp", 31, 785 }, -{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 563 }, -{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "../code/custom/4coder_base_commands.cpp", 39, 550 }, -{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "../code/custom/4coder_base_commands.cpp", 39, 692 }, -{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "../code/custom/4coder_base_commands.cpp", 39, 701 }, -{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "../code/custom/4coder_default_framework.cpp", 43, 451 }, -{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "../code/custom/4coder_default_framework.cpp", 43, 439 }, -{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "../code/custom/4coder_default_framework.cpp", 43, 433 }, -{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "../code/custom/4coder_base_commands.cpp", 39, 806 }, -{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "../code/custom/4coder_base_commands.cpp", 39, 812 }, -{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "../code/custom/4coder_default_framework.cpp", 43, 415 }, -{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "../code/custom/4coder_default_framework.cpp", 43, 445 }, -{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "../code/custom/4coder_base_commands.cpp", 39, 797 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "../code/custom/4coder_code_index.cpp", 36, 1176 }, -{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 20 }, -{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "../code/custom/4coder_tutorial.cpp", 34, 34 }, -{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "../code/custom/4coder_combined_write_commands.cpp", 49, 137 }, -{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "../code/custom/4coder_base_commands.cpp", 39, 1717 }, -{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "../code/custom/4coder_base_commands.cpp", 39, 1744 }, -{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "../code/custom/4coder_base_commands.cpp", 39, 1605 }, -{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "../code/custom/4coder_jump_lister.cpp", 37, 59 }, -{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "../code/custom/4coder_search.cpp", 32, 395 }, -{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "../code/custom/4coder_search.cpp", 32, 642 }, -{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "../code/custom/4coder_combined_write_commands.cpp", 49, 94 }, -{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 82 }, -{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 88 }, -{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "../code/custom/4coder_base_commands.cpp", 39, 67 }, -{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "../code/custom/4coder_auto_indent.cpp", 37, 433 }, -{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "../code/custom/4coder_base_commands.cpp", 39, 59 }, -{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "../code/custom/4coder_combined_write_commands.cpp", 49, 76 }, -{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "../code/custom/4coder_base_commands.cpp", 39, 73 }, -{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "../code/custom/4coder_combined_write_commands.cpp", 49, 100 }, +{ PROC_LINKS(allow_mouse, 0), false, "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 409 }, +{ PROC_LINKS(auto_indent_line_at_cursor, 0), false, "auto_indent_line_at_cursor", 26, "Auto-indents the line on which the cursor sits.", 47, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 413 }, +{ PROC_LINKS(auto_indent_range, 0), false, "auto_indent_range", 17, "Auto-indents the range between the cursor and the mark.", 55, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 423 }, +{ PROC_LINKS(auto_indent_whole_file, 0), false, "auto_indent_whole_file", 22, "Audo-indents the entire current buffer.", 39, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 404 }, +{ PROC_LINKS(backspace_alpha_numeric_boundary, 0), false, "backspace_alpha_numeric_boundary", 32, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 154 }, +{ PROC_LINKS(backspace_char, 0), false, "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 96 }, +{ PROC_LINKS(basic_change_active_panel, 0), false, "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 647 }, +{ PROC_LINKS(begin_clipboard_collection_mode, 0), true, "begin_clipboard_collection_mode", 31, "Allows the user to copy multiple strings from other applications before switching to 4coder and pasting them all.", 113, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 68 }, +{ PROC_LINKS(build_in_build_panel, 0), false, "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 159 }, +{ PROC_LINKS(build_search, 0), false, "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 122 }, +{ PROC_LINKS(center_view, 0), false, "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 197 }, +{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 284 }, +{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 290 }, +{ PROC_LINKS(change_to_build_panel, 0), false, "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 180 }, +{ PROC_LINKS(clean_all_lines, 0), false, "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 636 }, +{ PROC_LINKS(clear_all_themes, 0), false, "clear_all_themes", 16, "Clear the theme list", 20, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 480 }, +{ PROC_LINKS(clear_clipboard, 0), false, "clear_clipboard", 15, "Clears the history of the clipboard", 35, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 216 }, +{ PROC_LINKS(click_set_cursor, 0), false, "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 233 }, +{ PROC_LINKS(click_set_cursor_and_mark, 0), false, "click_set_cursor_and_mark", 25, "Sets the cursor position and mark to the mouse position.", 56, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 223 }, +{ PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 243 }, +{ PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 255 }, +{ PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 7 }, +{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 843 }, +{ PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 174 }, +{ PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 655 }, +{ PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "W:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 190 }, +{ PROC_LINKS(command_lister, 0), true, "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 761 }, +{ PROC_LINKS(comment_line, 0), false, "comment_line", 12, "Insert '//' at the beginning of the line after leading whitespace.", 66, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 125 }, +{ PROC_LINKS(comment_line_toggle, 0), false, "comment_line_toggle", 19, "Turns uncommented lines into commented lines and vice versa for comments starting with '//'.", 92, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 149 }, +{ PROC_LINKS(copy, 0), false, "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 107 }, +{ PROC_LINKS(cursor_mark_swap, 0), false, "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 124 }, +{ PROC_LINKS(custom_api_documentation, 0), true, "custom_api_documentation", 24, "Prompts the user to select a Custom API item then loads a doc buffer for that item", 82, "W:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 175 }, +{ PROC_LINKS(cut, 0), false, "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 116 }, +{ PROC_LINKS(decrease_face_size, 0), false, "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 738 }, +{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1897 }, +{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 7 }, +{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 23 }, +{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "W:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 51 }, +{ PROC_LINKS(delete_alpha_numeric_boundary, 0), false, "delete_alpha_numeric_boundary", 29, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 162 }, +{ PROC_LINKS(delete_char, 0), false, "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 79 }, +{ PROC_LINKS(delete_current_scope, 0), false, "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 112 }, +{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1323 }, +{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1495 }, +{ PROC_LINKS(delete_range, 0), false, "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 134 }, +{ PROC_LINKS(display_key_codes, 0), false, "display_key_codes", 17, "Example of input handling loop", 30, "W:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 90 }, +{ PROC_LINKS(display_text_input, 0), false, "display_text_input", 18, "Example of to_writable and leave_current_input_unhandled", 56, "W:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 134 }, +{ PROC_LINKS(double_backspace, 0), false, "double_backspace", 16, "Example of history group helpers", 32, "W:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 10 }, +{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1481 }, +{ PROC_LINKS(execute_any_cli, 0), false, "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "W:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 22 }, +{ PROC_LINKS(execute_previous_cli, 0), false, "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "W:\\4ed\\code\\custom\\4coder_cli_command.cpp", 41, 7 }, +{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 825 }, +{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2224 }, +{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2232 }, +{ PROC_LINKS(goto_first_jump, 0), false, "goto_first_jump", 15, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 525 }, +{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), false, "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 542 }, +{ PROC_LINKS(goto_jump_at_cursor, 0), false, "goto_jump_at_cursor", 19, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 348 }, +{ PROC_LINKS(goto_jump_at_cursor_same_panel, 0), false, "goto_jump_at_cursor_same_panel", 30, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 375 }, +{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 833 }, +{ PROC_LINKS(goto_next_jump, 0), false, "goto_next_jump", 14, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 464 }, +{ PROC_LINKS(goto_next_jump_no_skips, 0), false, "goto_next_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 494 }, +{ PROC_LINKS(goto_prev_jump, 0), false, "goto_prev_jump", 14, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 481 }, +{ PROC_LINKS(goto_prev_jump_no_skips, 0), false, "goto_prev_jump_no_skips", 23, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 511 }, +{ PROC_LINKS(hide_filebar, 0), false, "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 685 }, +{ PROC_LINKS(hide_scrollbar, 0), false, "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 671 }, +{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 869 }, +{ PROC_LINKS(if0_off, 0), false, "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 70 }, +{ PROC_LINKS(if_read_only_goto_position, 0), false, "if_read_only_goto_position", 26, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 564 }, +{ PROC_LINKS(if_read_only_goto_position_same_panel, 0), false, "if_read_only_goto_position_same_panel", 37, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "W:\\4ed\\code\\custom\\4coder_jump_sticky.cpp", 41, 581 }, +{ PROC_LINKS(increase_face_size, 0), false, "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 727 }, +{ PROC_LINKS(interactive_kill_buffer, 0), true, "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 520 }, +{ PROC_LINKS(interactive_new, 0), true, "interactive_new", 15, "Interactively creates a new file.", 33, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 661 }, +{ PROC_LINKS(interactive_open, 0), true, "interactive_open", 16, "Interactively opens a file.", 27, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 715 }, +{ PROC_LINKS(interactive_open_or_new, 0), true, "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 612 }, +{ PROC_LINKS(interactive_switch_buffer, 0), true, "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 510 }, +{ PROC_LINKS(jump_to_definition, 0), true, "jump_to_definition", 18, "List all definitions in the code index and jump to one chosen by the user.", 74, "W:\\4ed\\code\\custom\\4coder_code_index_listers.cpp", 48, 12 }, +{ PROC_LINKS(keyboard_macro_finish_recording, 0), false, "keyboard_macro_finish_recording", 31, "Stop macro recording, do nothing if macro recording is not already started", 74, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 54 }, +{ PROC_LINKS(keyboard_macro_replay, 0), false, "keyboard_macro_replay", 21, "Replay the most recently recorded keyboard macro", 48, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 77 }, +{ PROC_LINKS(keyboard_macro_start_recording, 0), false, "keyboard_macro_start_recording", 30, "Start macro recording, do nothing if macro recording is already started", 71, "W:\\4ed\\code\\custom\\4coder_keyboard_macro.cpp", 44, 41 }, +{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1641 }, +{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 9 }, +{ PROC_LINKS(left_adjust_view, 0), false, "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 211 }, +{ PROC_LINKS(list_all_functions_all_buffers, 0), false, "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 295 }, +{ PROC_LINKS(list_all_functions_all_buffers_lister, 0), true, "list_all_functions_all_buffers_lister", 37, "Creates a lister of locations that look like function definitions and declarations all buffers.", 95, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 301 }, +{ PROC_LINKS(list_all_functions_current_buffer, 0), false, "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 267 }, +{ PROC_LINKS(list_all_functions_current_buffer_lister, 0), true, "list_all_functions_current_buffer_lister", 40, "Creates a lister of locations that look like function definitions and declarations in the buffer.", 97, "W:\\4ed\\code\\custom\\4coder_function_list.cpp", 43, 277 }, +{ PROC_LINKS(list_all_locations, 0), false, "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 165 }, +{ PROC_LINKS(list_all_locations_case_insensitive, 0), false, "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 177 }, +{ PROC_LINKS(list_all_locations_of_identifier, 0), false, "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 189 }, +{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), false, "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 195 }, +{ PROC_LINKS(list_all_locations_of_selection, 0), false, "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 201 }, +{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), false, "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 207 }, +{ PROC_LINKS(list_all_locations_of_type_definition, 0), false, "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 213 }, +{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 221 }, +{ PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 171 }, +{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 183 }, +{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 863 }, +{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "W:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1627 }, +{ PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 457 }, +{ PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 469 }, +{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1435 }, +{ PROC_LINKS(miblo_decrement_basic, 0), false, "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 44 }, +{ PROC_LINKS(miblo_decrement_time_stamp, 0), false, "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 237 }, +{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 249 }, +{ PROC_LINKS(miblo_increment_basic, 0), false, "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 29 }, +{ PROC_LINKS(miblo_increment_time_stamp, 0), false, "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 231 }, +{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), false, "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "W:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 243 }, +{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 780 }, +{ PROC_LINKS(mouse_wheel_scroll, 0), false, "mouse_wheel_scroll", 18, "Reads the scroll wheel value from the mouse state and scrolls accordingly.", 74, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 265 }, +{ PROC_LINKS(move_down, 0), false, "move_down", 9, "Moves the cursor down one line.", 31, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 336 }, +{ PROC_LINKS(move_down_10, 0), false, "move_down_10", 12, "Moves the cursor down ten lines.", 32, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 348 }, +{ PROC_LINKS(move_down_textual, 0), false, "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 354 }, +{ PROC_LINKS(move_down_to_blank_line, 0), false, "move_down_to_blank_line", 23, "Seeks the cursor down to the next blank line.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 407 }, +{ PROC_LINKS(move_down_to_blank_line_end, 0), false, "move_down_to_blank_line_end", 27, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 431 }, +{ PROC_LINKS(move_down_to_blank_line_skip_whitespace, 0), false, "move_down_to_blank_line_skip_whitespace", 39, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 419 }, +{ PROC_LINKS(move_left, 0), false, "move_left", 9, "Moves the cursor one character to the left.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 437 }, +{ PROC_LINKS(move_left_alpha_numeric_boundary, 0), false, "move_left_alpha_numeric_boundary", 32, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 514 }, +{ PROC_LINKS(move_left_alpha_numeric_or_camel_boundary, 0), false, "move_left_alpha_numeric_or_camel_boundary", 41, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 528 }, +{ PROC_LINKS(move_left_token_boundary, 0), false, "move_left_token_boundary", 24, "Seek left for the next beginning of a token.", 44, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 486 }, +{ PROC_LINKS(move_left_whitespace_boundary, 0), false, "move_left_whitespace_boundary", 29, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 471 }, +{ PROC_LINKS(move_left_whitespace_or_token_boundary, 0), false, "move_left_whitespace_or_token_boundary", 38, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 500 }, +{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1475 }, +{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1469 }, +{ PROC_LINKS(move_right, 0), false, "move_right", 10, "Moves the cursor one character to the right.", 44, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 445 }, +{ PROC_LINKS(move_right_alpha_numeric_boundary, 0), false, "move_right_alpha_numeric_boundary", 33, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 507 }, +{ PROC_LINKS(move_right_alpha_numeric_or_camel_boundary, 0), false, "move_right_alpha_numeric_or_camel_boundary", 42, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 521 }, +{ PROC_LINKS(move_right_token_boundary, 0), false, "move_right_token_boundary", 25, "Seek right for the next end of a token.", 39, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 479 }, +{ PROC_LINKS(move_right_whitespace_boundary, 0), false, "move_right_whitespace_boundary", 30, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 463 }, +{ PROC_LINKS(move_right_whitespace_or_token_boundary, 0), false, "move_right_whitespace_or_token_boundary", 39, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 493 }, +{ PROC_LINKS(move_up, 0), false, "move_up", 7, "Moves the cursor up one line.", 29, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 330 }, +{ PROC_LINKS(move_up_10, 0), false, "move_up_10", 10, "Moves the cursor up ten lines.", 30, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 342 }, +{ PROC_LINKS(move_up_to_blank_line, 0), false, "move_up_to_blank_line", 21, "Seeks the cursor up to the next blank line.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 401 }, +{ PROC_LINKS(move_up_to_blank_line_end, 0), false, "move_up_to_blank_line_end", 25, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 425 }, +{ PROC_LINKS(move_up_to_blank_line_skip_whitespace, 0), false, "move_up_to_blank_line_skip_whitespace", 37, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 413 }, +{ PROC_LINKS(multi_paste_interactive, 0), false, "multi_paste_interactive", 23, "Paste multiple lines from the clipboard history, controlled with arrow keys", 75, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 364 }, +{ PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 373 }, +{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 849 }, +{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 855 }, +{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1560 }, +{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1891 }, +{ PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 46 }, +{ PROC_LINKS(open_long_braces_break, 0), false, "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 62 }, +{ PROC_LINKS(open_long_braces_semicolon, 0), false, "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 54 }, +{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1592 }, +{ PROC_LINKS(open_panel_hsplit, 0), false, "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 310 }, +{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 300 }, +{ PROC_LINKS(page_down, 0), false, "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 372 }, +{ PROC_LINKS(page_up, 0), false, "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 364 }, +{ PROC_LINKS(paste, 0), false, "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 127 }, +{ PROC_LINKS(paste_and_indent, 0), false, "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 202 }, +{ PROC_LINKS(paste_next, 0), false, "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 161 }, +{ PROC_LINKS(paste_next_and_indent, 0), false, "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 209 }, +{ PROC_LINKS(place_in_scope, 0), false, "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 106 }, +{ PROC_LINKS(play_with_a_counter, 0), false, "play_with_a_counter", 19, "Example of query bar", 20, "W:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 29 }, +{ PROC_LINKS(profile_clear, 0), false, "profile_clear", 13, "Clear all profiling information from 4coder's self profiler.", 60, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 226 }, +{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 219 }, +{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 212 }, +{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "W:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 886 }, +{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1290 }, +{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 871 }, +{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 897 }, +{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1251 }, +{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1272 }, +{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1288 }, +{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1730 }, +{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1815 }, +{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1400 }, +{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1659 }, +{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1161 }, +{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1152 }, +{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1143 }, +{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1084 }, +{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1096 }, +{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1649 }, +{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 382 }, +{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1367 }, +{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1078 }, +{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1090 }, +{ PROC_LINKS(seek_beginning_of_line, 0), false, "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2212 }, +{ PROC_LINKS(seek_beginning_of_textual_line, 0), false, "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2200 }, +{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2218 }, +{ PROC_LINKS(seek_end_of_textual_line, 0), false, "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "W:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2206 }, +{ PROC_LINKS(select_all, 0), false, "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 537 }, +{ PROC_LINKS(select_next_scope_absolute, 0), false, "select_next_scope_absolute", 26, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 57 }, +{ PROC_LINKS(select_next_scope_after_current, 0), false, "select_next_scope_after_current", 31, "If a scope is selected, find first scope that starts after the selected scope. Otherwise find the first scope that starts after the cursor.", 139, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 66 }, +{ PROC_LINKS(select_prev_scope_absolute, 0), false, "select_prev_scope_absolute", 26, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 82 }, +{ PROC_LINKS(select_prev_top_most_scope, 0), false, "select_prev_top_most_scope", 26, "Finds the first scope that starts before the cursor, then finds the top most scope that contains that scope.", 108, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 99 }, +{ PROC_LINKS(select_surrounding_scope, 0), false, "select_surrounding_scope", 24, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 27 }, +{ PROC_LINKS(select_surrounding_scope_maximal, 0), false, "select_surrounding_scope_maximal", 32, "Selects the top-most scope that surrounds the cursor.", 53, "W:\\4ed\\code\\custom\\4coder_scope_commands.cpp", 44, 39 }, +{ PROC_LINKS(set_eol_mode_from_contents, 0), false, "set_eol_mode_from_contents", 26, "Sets the buffer's line ending mode to match the contents of the buffer.", 71, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 125 }, +{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 112 }, +{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 86 }, +{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "W:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 99 }, +{ PROC_LINKS(set_face_size, 0), false, "set_face_size", 13, "Set face size of the face used by the current buffer.", 53, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 707 }, +{ PROC_LINKS(set_face_size_this_buffer, 0), false, "set_face_size_this_buffer", 25, "Set face size of the face used by the current buffer; if any other buffers are using the same face a new face is created so that only this buffer is effected", 157, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 749 }, +{ PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 115 }, +{ PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 427 }, +{ PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 421 }, +{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1238 }, +{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1250 }, +{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1244 }, +{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1231 }, +{ PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 678 }, +{ PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 664 }, +{ PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "W:\\4ed\\code\\custom\\4coder_log_parser.cpp", 40, 994 }, +{ PROC_LINKS(snipe_backward_whitespace_or_token_boundary, 0), false, "snipe_backward_whitespace_or_token_boundary", 43, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 179 }, +{ PROC_LINKS(snipe_forward_whitespace_or_token_boundary, 0), false, "snipe_forward_whitespace_or_token_boundary", 42, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 187 }, +{ PROC_LINKS(snippet_lister, 0), true, "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 237 }, +{ PROC_LINKS(string_repeat, 0), false, "string_repeat", 13, "Example of query_user_string and query_user_number", 50, "W:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 176 }, +{ PROC_LINKS(suppress_mouse, 0), false, "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 403 }, +{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1617 }, +{ PROC_LINKS(theme_lister, 0), true, "theme_lister", 12, "Opens an interactive list of all registered themes.", 51, "W:\\4ed\\code\\custom\\4coder_lists.cpp", 35, 785 }, +{ PROC_LINKS(to_lowercase, 0), false, "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 563 }, +{ PROC_LINKS(to_uppercase, 0), false, "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 550 }, +{ PROC_LINKS(toggle_filebar, 0), false, "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 692 }, +{ PROC_LINKS(toggle_fps_meter, 0), false, "toggle_fps_meter", 16, "Toggles the visibility of the FPS performance meter", 51, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 701 }, +{ PROC_LINKS(toggle_fullscreen, 0), false, "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 451 }, +{ PROC_LINKS(toggle_highlight_enclosing_scopes, 0), false, "toggle_highlight_enclosing_scopes", 33, "In code files scopes surrounding the cursor are highlighted with distinguishing colors.", 87, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 439 }, +{ PROC_LINKS(toggle_highlight_line_at_cursor, 0), false, "toggle_highlight_line_at_cursor", 31, "Toggles the line highlight at the cursor.", 41, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 433 }, +{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 806 }, +{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 812 }, +{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 415 }, +{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 445 }, +{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 797 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "W:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1176 }, +{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 20 }, +{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 34 }, +{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 }, +{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1717 }, +{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1744 }, +{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1605 }, +{ PROC_LINKS(view_jump_list_with_lister, 0), false, "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "W:\\4ed\\code\\custom\\4coder_jump_lister.cpp", 41, 59 }, +{ PROC_LINKS(word_complete, 0), false, "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 395 }, +{ PROC_LINKS(word_complete_drop_down, 0), false, "word_complete_drop_down", 23, "Word complete with drop down menu.", 34, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 642 }, +{ PROC_LINKS(write_block, 0), false, "write_block", 11, "At the cursor, insert a block comment.", 38, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 94 }, +{ PROC_LINKS(write_hack, 0), false, "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 82 }, +{ PROC_LINKS(write_note, 0), false, "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 88 }, +{ PROC_LINKS(write_space, 0), false, "write_space", 11, "Inserts a space.", 16, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 67 }, +{ PROC_LINKS(write_text_and_auto_indent, 0), false, "write_text_and_auto_indent", 26, "Inserts text and auto-indents the line on which the cursor sits if any of the text contains 'layout punctuation' such as ;:{}()[]# and new lines.", 145, "W:\\4ed\\code\\custom\\4coder_auto_indent.cpp", 41, 433 }, +{ PROC_LINKS(write_text_input, 0), false, "write_text_input", 16, "Inserts whatever text was used to trigger this command.", 55, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 59 }, +{ PROC_LINKS(write_todo, 0), false, "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 76 }, +{ PROC_LINKS(write_underscore, 0), false, "write_underscore", 16, "Inserts an underscore.", 22, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 73 }, +{ PROC_LINKS(write_zero_struct, 0), false, "write_zero_struct", 17, "At the cursor, insert a ' = {};'.", 33, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 100 }, }; static i32 fcoder_metacmd_ID_allow_mouse = 0; static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 1; diff --git a/platform_win32/win32_4ed.cpp b/platform_win32/win32_4ed.cpp index 5631f44c..34381474 100644 --- a/platform_win32/win32_4ed.cpp +++ b/platform_win32/win32_4ed.cpp @@ -718,8 +718,8 @@ win32_keycode_init(void){ keycode_lookup_table[VK_F6] = KeyCode_F6; keycode_lookup_table[VK_F7] = KeyCode_F7; keycode_lookup_table[VK_F8] = KeyCode_F8; - keycode_lookup_table[VK_F9] = KeyCode_F9; + keycode_lookup_table[VK_F9] = KeyCode_F9; keycode_lookup_table[VK_F10] = KeyCode_F10; keycode_lookup_table[VK_F11] = KeyCode_F11; keycode_lookup_table[VK_F12] = KeyCode_F12; @@ -727,6 +727,36 @@ win32_keycode_init(void){ keycode_lookup_table[VK_F14] = KeyCode_F14; keycode_lookup_table[VK_F15] = KeyCode_F15; keycode_lookup_table[VK_F16] = KeyCode_F16; + + keycode_lookup_table[VK_F17] = KeyCode_F17; + keycode_lookup_table[VK_F18] = KeyCode_F18; + keycode_lookup_table[VK_F19] = KeyCode_F19; + keycode_lookup_table[VK_F20] = KeyCode_F20; + keycode_lookup_table[VK_F21] = KeyCode_F21; + keycode_lookup_table[VK_F22] = KeyCode_F22; + keycode_lookup_table[VK_F23] = KeyCode_F23; + keycode_lookup_table[VK_F24] = KeyCode_F24; + + keycode_lookup_table[VK_NUMPAD0] = KeyCode_NumPad0; + keycode_lookup_table[VK_NUMPAD1] = KeyCode_NumPad1; + keycode_lookup_table[VK_NUMPAD2] = KeyCode_NumPad2; + keycode_lookup_table[VK_NUMPAD3] = KeyCode_NumPad3; + keycode_lookup_table[VK_NUMPAD4] = KeyCode_NumPad4; + keycode_lookup_table[VK_NUMPAD5] = KeyCode_NumPad5; + keycode_lookup_table[VK_NUMPAD6] = KeyCode_NumPad6; + keycode_lookup_table[VK_NUMPAD7] = KeyCode_NumPad7; + keycode_lookup_table[VK_NUMPAD8] = KeyCode_NumPad8; + keycode_lookup_table[VK_NUMPAD9] = KeyCode_NumPad9; + + keycode_lookup_table[VK_MULTIPLY] = KeyCode_NumPadStar; + keycode_lookup_table[VK_ADD] = KeyCode_NumPadPlus; + keycode_lookup_table[VK_SUBTRACT] = KeyCode_NumPadMinus; + keycode_lookup_table[VK_DECIMAL] = KeyCode_NumPadDot; + keycode_lookup_table[VK_DIVIDE] = KeyCode_NumPadSlash; + + for (i32 i = 0xDF; i < 0xFF; i += 1){ + keycode_lookup_table[i] = KeyCode_Ex0 + 1; + } } internal void @@ -1343,9 +1373,9 @@ win32_gl_create_window(HWND *wnd_out, HGLRC *context_out, DWORD style, RECT rect // NOTE(allen): Load wgl extensions #define LoadWGL(f,l) Stmnt((f) = (f##_Function*)wglGetProcAddress(#f); \ -(l) = (l) && win32_wgl_good((Void_Func*)(f));) - - b32 load_success = true; + (l) = (l) && win32_wgl_good((Void_Func*)(f));) + + b32 load_success = true; LoadWGL(wglCreateContextAttribsARB, load_success); LoadWGL(wglChoosePixelFormatARB, load_success); LoadWGL(wglGetExtensionsStringEXT, load_success);