From 0af9ab9c1f2d13dc37e702646eb46717f55ed90b Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Mon, 7 Mar 2016 14:39:15 -0500 Subject: [PATCH] add readmes to repository --- README.txt | 166 ++++++++++++++++++++ SUPERREADME.txt | 409 ++++++++++++++++++++++++++++++++++++++++++++++++ TODO.txt | 206 ++++++++++++++++++++++++ 3 files changed, 781 insertions(+) create mode 100644 README.txt create mode 100644 SUPERREADME.txt create mode 100644 TODO.txt diff --git a/README.txt b/README.txt new file mode 100644 index 00000000..9768c915 --- /dev/null +++ b/README.txt @@ -0,0 +1,166 @@ +Distribution Date: 06.03.2016 (dd.mm.yyyy) + +Thank you for contributing to the 4coder project! + +To submit bug reports or to request particular features email editor@4coder.net. + +Watch 4coder.net blog and @AllenWebster4th twitter for news about 4coder progress. + +--------------------------------- +FAIR WARNING +--------------------------------- + +THINGS WILL GET CRASHY FAST IF ANY .ttf FILES ARE MISSING. +THIS EFFECT WILL ALSO OCCUR IF YOU LAUNCH FROM A DIRECTORY +THAT DOESN'T CONTAIN THE .ttf FILES. (This problem will be +fixed eventually). + +This build is extremely "janky" for lack of a better term. From what limitted testing +I have been able to do I think it should run on a Windows 7 machine. It has not been +launched at all on any other version of Windows. I have done what I can to get rid of +the bugs and crashes that would make it unusable, but there are certainly more in there +if you start digging and pressing hard enough. + +**Please USE SOURCE CONTROL WITH 4CODER for now** + +----------------------------------------------------- +INSTRUCTIONS FOR USE +----------------------------------------------------- + +****Changes in 4.0.0**** +alt + x: changed to arbitrary command (NOW WORKS ANYWHERE!) +Opens a command prompt from which you can execute: + "open menu" to open the menu (old behavior of alt+x) + "open all code" loads all cpp and h files in current directory + "close all code" closes all cpp and h files currently open + "open in quotes" opens the file who's name under the cursor is surrounded by quotes + "dos lines" dosify the file end of iles + "nix lines" nixify the file end of iles + +alt + z: execute arbitrary command-line command +Specify an output buffer and a command to execute +and the results will be dropped into the specified buffer. + +****Command line options**** +4ed [] [options] + +-d/-D -- use a dll other than 4coder_custom.dll for your customizations + -d -- if the file isn't found look for 4coder_custom.dll + -D -- only look for the specified + +-i -- line number to jump to in first file to open specified on command line + +-w -- width and height of the 4coder window +-p -- position of the 4coder window + +-W -- open in full screen, overrides -w and -p, although the size will still be the default size of the window + +-T -- invoke special tool isntead of launching 4coder normally + -T version : prints the 4coder version string + +****Old Information**** +Basic Navigation: +mouse click - move cursor +arrows - move cursor +home & end - move cursor to beginning/end of line +page up & page down - page up & page down respectively +control + left/right - move cursor left/right to first whitespace +control + up/down - move cursor up or down to first blank line + +Fancy Navigation: +control + f : begin find mode, uses interaction bar +control + r : begin reverse-find mode, uses interaction bar + +While in find mode or reverse-find mode, pressing enter ends the mode +leaving the cursor wherever the find highlighter is, and pressing escape +ends the mode leaving the cursor wherever it was before the find mode began. + +control + g - goto line number +control + m - swap cursor and mark + +Basic Editing: +characters keys, delete, and backspace +control + c : copy between cursor and mark +control + x : cut between cursor and mark +control + v : paste at cursor +control + V : use after normal paste to cycle through older copied text +control + d : delete between cursor and mark +control + SPACE : set mark to cursor + +Undo and History: +control + z : undo +control + y : redo +control + Z: undo / history timelines +control + h: history back step +control + H: history forward step +alt + left: increase rewind speed (through undo) +alt + right: increase fastforward speed (through redo) +alt + down: stop redining / fastforwarding + +Fancy Editing: +control + u : to uppercase between cursor and mark +control + j : to lowercase between cursor and mark +control + q: query replace +control + a: replace in range +control + =: write increment +control + -: decrement increment +control + [: write {} pair with cursor in line between +control + {: as with a semicolon after "}" +control + }: as with a "break;" after "}" +control + 9: wrap the range specified by mark and cursor in parens +control + i: wrap the range specified by mark and cursor in #if 0 #endif + +Whitespace Boringness: +Typing characters: },],),; and inserting newlines cause the line to autotab +TAB: word complete +control + TAB : auto indent lines between cursor and mark +shift + TAB: auto indent cursor line +control + 1 : set the file to dos mode for writing to disk +control + ! : set the flie to nix mode for writing to disk + +Viewing Options: +alt + c - open theme selection UI +control + p : vertically split the current panel (max 16) +control + '-' : horizontally split the current panel (max 16) +control + P : close the currently selected panel +control + , : switch to another panel +control + l : toggle line wrapping +control + L : toggle end of line mode + mode 1: treat all \r\n and all \n as newline, show \r when not followed by \n + mode 2: treat all \r and \n as newline + mode 3: treat all \n as newline, show all \r +control + ? : toggle highlight whitespace mode + +Tools: +alt + m : search in the current hot directory and up through all parent + > directories for a build.bat, and execute that bat if it discovered, sending + > output to the buffer *compilation* + +File Managing: +control + n : create a new file, begins interactive input mode +control + o : open file, begins interactive input mode +control + O : reopen the current file + (discarding any differences the live version has from the file system's version) +control + s : save +control + w : save as, begins interative input mode +control + i : switch active file in this panel, begins interactive input mode +control + k : kill (close) a file, begins interactive input mode +control + K : kill (close) the file being viewed in the currently active panel + +While in interactive input mode, pressing enter confirms the input for the command, and +pressing escape (once) will end the input mode and abort the command. If the file does +not exist either the nearest match will be opened, or no file will be opened if none is +considered a match. Use backspace to go back through directories. + +Menu UI +Keyboard options: + > left control + left alt act as AltGr + +Theme selection UI +esc - close UI view return to major view if one was open previously + +Themes are saved in p4c files, I encourage either of the following pronciations: +"pack" +"pee-fork" + + diff --git a/SUPERREADME.txt b/SUPERREADME.txt new file mode 100644 index 00000000..e618f3fa --- /dev/null +++ b/SUPERREADME.txt @@ -0,0 +1,409 @@ +Distribution Date: 06.03.2016 (dd.mm.yyyy) + +Thank you for contributing to the 4coder project! + +To submit bug reports or to request particular features email editor@4coder.net. + +Watch 4coder.net blog and @AllenWebster4th twitter for news about 4coder progress. + +------------------------------------- +BUILDING 4coder_custom +------------------------------------- + +To customize 4coder you have to build 4coder_custom.dll. The batch file buildsuper.bat will +compile the dll for you if you have visual studio installed. If you have an old version, use +the example to figure out how to get your old setup working in the new system. + +As you create your customizations keep in mind that this API is still in development. +I will do what I can to keep your customizations working as I settle on an API, but some +updates may deeply break your code. + +------------------------------------- +SOME DOCUMENTATION +------------------------------------- + +See comments in 4coder_custom.cpp for more detailed information. + +Functions to implement (optional in the dll, but required if you are using buildsuper.bat): +get_bindings + +NEW IN 4.0.0: +================ +File_View_Summary becomes View_Summary: +There use to be a lot of different view types and only "file views" were exposed in the API. +As of alpha 4 there are only views and you can always get a view. + +Besides renaming the struct, there is also a change in the meaning of the "buffer_id" field. +A view can have a buffer attached, but not currently be looking at that file. + +All of the following indicate the buffer associated with the view: +buffer_id +locked_buffer_id +hidden_buffer_id + +These ids are nulled out to indicate that access at a particular level is not available. +buffer_id - +This is null if the file is not visible in the view OR if the view is locked. +A view is only locked right now for read only buffers (compilation output). + +locked_buffer_id - +This is null only if the file is not visible. + +hidden_buffer_id - +This is never null. + +In normal circumstances you can just use buffer_id and your code will automatically do +nothing when you try to edit a buffer you should not. + +If what you are writing is unusual and it SHOULD edit a buffer even if it is locked or +hidden, then you can use the other ids to get deeper access. + +================ +Theme changing API + +app->change_theme(app, name, len) +Set the theme to one of the prebuilt themes by name. + +app->change_font(app, name, len) +Set the font to one of the fonts by name (not by ttf file name, by the name in the list). + +app->set_theme_colors(app, colors, count) +Set colors of the current theme by tag color pairs. + +================ +The scrolling interpolation rule is now exposed in the API, and there is an example + +OLD API DOC: +================================================================ +There is an API available to custom commands and hooks, described at length here. +The system has two main data types, buffers and views. A buffer contains text, +undo history, and tokens. Views looks at a file and has a cursor a mark a highlight +and so on. The view and buffer are not the same because not all buffers are viewed, +and there may be two views viewing the same buffer. + +================ +app->memory; +app->memory_size; +Here you get 2mb of memory that are completely yours to do whatever you need to do. This is for +those who found that malloc was not working for their allocation needs. There are currently no +allocation helpers so you'll have to figure out how to manage it. + +================ +app->directory_get_hot(app, out, capacity); +Fills the out buffer with the "hot directory", which is the last directory 4coder has visited. +If it cannot write out the whole name it writes only what it can. + +Always returns the length of the current hot directory in bytes. + +================ +app->file_exists(app, filename, len); +Filename can be either a full path or a relative path. + +Returns whether the file exists. + +================ +app->directory_cd(app, dir, &len, capacity, rel_path, rel_len); +Looks at dir and updates it's contents as if a "cd" command had been cone from that directory. +if rel_path is ".." then the .. is not appended as a string, the directory is shortened if possible. + +Returns false if the directory does not exist or if ".." was specified but it is impossible to back up, +returns true otherwise. + +================ +app->get_file_list(app, dir, len); +If the directory exists, generates a list of all files and folders in that directory. All File_List structs +generated by get_file_list should be freed with free_file_list. + +Returns a File_List struct listing all files and folders in dir, or an empty list if dir does not exist or is empty. + +================ +app->free_file_list(app, list); +Frees a File_List created by get_file_list. + +================ +struct File_List; +The important fields are: + File_Info *infos; + int count; +count is the number of File_Info structs in the File_Info array. + +struct File_Info; + String filename; + int folder; +folder is 1 or 0 to indicate whether the entry is a file or folder. +filrname is a string which may be editted, but not resized, that is filled with the name of a file or folder. + +================ +app->get_buffer_first(app); +app->get_buffer_next(app, &buffer); +The new method for looping over buffers is: + +for (Buffer_Summary b = app->get_buffer_first(app); + b.exists; + app->get_buffer_next(app, &b)) { } + +================ +app->get_buffer(app, index); +Returns a Buffer_Summary which contains information about a buffer and acts as the +handle to the buffer for other functions. The parameter index can be anything in the +range [0,max) where max comes from app->get_buffer_max_index + +================ +app->get_active_buffer(app, index); +Returns a Buffer_Summary obtained from the active panel. + +================ +app->get_buffer_by_name(app, str, len); +Returns a Buffer_Summary who's "full source path" exactly matches str. There is +currently no way to look a buffer up by "live name" the short name shown on the top bar. + +Buffers that are not associated with real files such as *compilation* have their "full source path" +name set to the same value as their live name, therefore you can get a *compilation* buffer with +this API by the name "*compilation*". + +================ +app->refresh_buffer(app, &buffer); +If a changes are made to a buffer the changes are not necessarily reflected in your Buffer_Summary, +use this to get updated information on the buffer. All commands in the low level API will udpate +your Buffer_Summary if a change is made, so refreshing afterwards is not necessary in that case. + +The function returns 1 on success and 0 on failure. + +================ +app->buffer_seek_delimiter(app, &buffer, start, delim, seek_forward, &out); +Starting from start, seeks forward or backward until the first occurance of delim, +the pointer out is filled with the position of the delimiter. + +If no delimiter is found out is filled with -1 for backward seeks and the size of the buffer on forward seeks. + +The function returns 1 on success and 0 on failure. + +================ +app->buffer_seek_string(app, &buffer, start, str, len, seek_forward, &out); +Starting from start, seeks forward or backward until the first occurance of str, +the pointer out is filled with the position of the delimiter. + +If no str is found out is filled with -1 for backward seeks and the size of the buffer on forward seeks. + +The function returns 1 on success and 0 on failure. + +================ +app->buffer_read_range(app, &buffer, start, end, buffer_out); +Fills buffer_out with the text that the buffer contains in the range [start,end) it is your responsibility +to ensure that the memory pointed to by buffer_out is at least (end - start) bytes. + +The function returns 1 on success and 0 on failure. + +================ +app->buffer_replace_range(app, &buffer, start, end, str, len); +Replaces the text in the range between start and end with the the text in str. It is allowed that +start == end so that you may insert str without replacing anything, and it is allowed that len == 0 +so that you may delete text without replacing it with anything. These edits are tracked by history +and cause an update in the tokens if there are tokens. Your buffer will be updated to reflect +the change in the buffer caused by this edit. + +The function returns 1 on success and 0 on failure. + +================ +app->get_view_first(app); +app->get_view_next(app, &view); +The new method for looping over views is: + +for (View_Summary v = app->get_view_first(app); + v.exists; + app->get_view_next(app, &v)) { } + +================ +app->get_file_view(app, index); +Returns a View_Summary which contains information about a file view and acts as +the handle to the file view for other functions. The parameter index can be anything in the +range [0,max) where max comes from app->get_view_max_index + +================ +app->get_active_file_view(app, index); +Returns a View_Summary obtained from the active panel. + +================ +app->refresh_file_view(app, &view); +If a changes are made to a view the changes are not necessarily reflected in your View_Summary, +use this to get updated information on the view. All commands in the low level API will udpate +your View_Summary if a change is made, so refreshing afterwards is not necessary in that case. + +The function returns 1 on success and 0 on failure. + +================ +struct Buffer_Seek; +This struct specifies how to set a position in a file, it is in 4coder_buffer_types.h look there to see +all the options. + +The following helpers will return Buffer_Seek structs for you: ++ To seek to a particular position (0-based-indexing) use seek_pos(pos) ++ To seek to a particular xy you either want seek_wrapped_xy(x, y, round_down) + or seek_unwrapped_xy(x, y, round_down). Wrapped vs unwrapped refers to whether + line wrapping is on. Both seek types are valid whether or not lines are wrapped, but + the results may be surprising if you do not match the correct type. round_down is usually 0, + and the effect is subtle, it has to do with whether the y position should be rounded down or rounded + to the nearest line. x and y are specified in pixels to move the y up or down a while line use view.line_height. ++ To seek to a particular line and character index on that line use seek_line_char(line, char_index) + +================ +app->view_set_cursor(app, &view, seek, set_preferred_x) +Updates the cursor location in this view. See information on the Buffer_Seek struct above for more +information. set_preferred_x if true set's the "preferred_x" of view to match the x of the cursor. The +preferred_x is the x the cursor tries to stay at as it moves up and down. Most cursor motion does set +the preferred_x. + +The function updates the data in the View_Summary. + +The function returns 1 on success and 0 on failure. + +================ +app->view_set_mark(app, &view, seek) +Updates the mark location in this view. See information on the Buffer_Seek struct above for more +information. + +The function updates the data in the View_Summary. + +The function returns 1 on success and 0 on failure. + +================ +app->view_set_highlight(app, &view, start, end, on) +If on is 0 this call turns the highlight off. +If on is 1 this call turns the highlight on and sets the highlight to range from start to end. + +While the highlight is on the view will follow the end of the highlight and the cursor will be hidden. +Be sure to turn the highlight off when you're done with it! + +The function returns 1 on success and 0 on failure. + +================ +app->view_set_file(app, &view, file_id) +Set this view to look at a different buffer (the buffer must already be opened and have a file_id). + +The function updates the data in the View_Summary. + +The function returns 1 on success and 0 on failure. + +================ +app->get_user_input(app, get_type, abort_type); +This is a blocking operation that will allow 4coder to continue operating. The next input event +will be intercepted by this command, and will not be interpreted as normal. Input events include: + pressing a key + clicking left or right + rolling the mouse wheel + moving the mouse + +The get_type flags specify a filter of what types of input you'd like to be notified about. Even if you +are not notified about keyboard input events, they are still not passed to any other systems to be +interpreted as commands or text input. The same is true for mouse input with the exception of +panel resizing, which can be done durring a command. + +The abort_type flags specify the set of inputs you'd like to get an abort message on. It is good to +specify abort flags so that the system will know when your command is about to finish up. After +getting an abort message you can continue to do other work and call commands with exec_command +but you should not call app->get_user_input again. It will not cause an error if you do, but it could lead +to unexpected behavior. And in the future it might be that it IS an error to call get_user_input after an abort. + +================ +struct User_Input; +type: either UserInputKey or UserInputMouse +abort: true if this is an abort message, false otherwise +key: information about a key event +mouse: information about a mouse event +command: if this event would be translated into a command normally, this is the command. + +Use CommandEqual to compare two commands in a typeless way since +cmdid_* and custom commands have different types. + +================ +key is of type: +struct Key_Event_Data; +keycode: always set to exactly the key that was pressed +character: a translation of the key press that takes into account Shift/Control/Alt/AltrGr/Caps-Lock +character_no_caps_lock: same as "character" but doesn't take Caps-Lock into account + +modifiers[i]: flags for modifiers were held when this key was pressed + i: MDFR_SHIFT_INDEX, MDFR_CONTROL_INDEX, MDFR_ALT_INDEX, MDFR_CAPS_INDEX + +TIP! Don't use MDFR_SHIFT, MDFR_CTRL, MDFR_ALT in the array! Those are bit masks, not indices! + +================ +mouse is of type: +struct Mouse_State; +l - whether the left button is down +r - whether the right button is down +press_l - whether the left button was just put down +press_r - whether the right button was just put down +release_l - whether the left button was just released +release_r - whether the right button was just released +wheel - values of 1, 0, -1. Does not report wheel amount, only direction. +out_of_window - 1 if the mouse is outside of the 4coder window, 0 otherwise +x, y - position of the mouse relative to the 4coder window + +================ +app->start_query_bar(app, &bar, 0); +Notify 4coder that you are using a Query_Bar and you want it rendered onto the screen. +While the query bar is still running any changes you make to prompt or string will be +shown right away, you don't have to ask 4coder to update it's bar because it reads straight +out of your Query_Bar. + +If the pointer you pass goes bad, because a stack frame ends or you otherwise no longer +need the bar, you should call app->end_query_bar(app, &bar); so that 4coder doesn't try +to render a query bar from garbage memory. If the command finishes and there are query +bars that haven't been ended, 4coder automatically ends them. + +There is a limit of 8 simultaneous queries bars and right now only file views support them. +The abillity to make a Query_Bar in other views including the empty view will come in the future though. + +The 0 is there because Iintend to add flags for query bars in the future, +for modifying their appearance and behavior. + +Returns 1 if it successfully started a query bar. + +================ +app->end_query_bar(app, &bar); +See start_query_bar for details. + +Changes from 3.3 to 3.4: +-exposed command word complete + +Changes from 3.2 to 3.3: +-exposed command build and added several example uses to the example file +-introduced directory navigation API +-slight tweaks to the API, moving away from macro translation + +Changes from 3.1 to 3.2: +-exposed new commands relating to auto-tab +-removed old commands for whitespace cleaning + +Changes from 3.0 to 3.1: +-start_hook eliminated, now bound through set_hook durring the get_bindings function +-vanilla_keys changed so that specific keys can be overriden +-you can now specify your own maps +-new parameter stack for communicating to some commands +-fulfill_interaction has been removed (push_parameter will be used to achieve it's effect) +-new hook for opening files, intended for file setting configuration +-exposed the new commands relating to history and the timeline scrub bar + +Changes from 2.2.3 to 3.0: +-exposed the new undo / redo commands + +Changes from 2.2.2 to 2.2.3: +-The binding API is remarkably different, but I included a + small set of helpers with this API that make the API look + almost exactly the same. +-you can now specify size for custom fonts +-you can now fulfill interacive commands +-fixed a bug that existed when some commands were used in exec_command + +Changes from 2.2.1 to 2.2.2: +-added MDFR_SHIFT +-removed redundant keys from Key_Codes struct +-added bind_me +-added exec_command +-put bind, bind_me and exec_command into a struct +-added Custom_Command_Function +-added Start_Hook_Function + + + diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 00000000..e3b86069 --- /dev/null +++ b/TODO.txt @@ -0,0 +1,206 @@ + +; Started this list on: (18.01.2016)(dd.mm.yyyy) +; This list is an informal todo list, it may very well miss items +; checked or unchecked, that I inted to do some day. It is included +; in the distribution so that you may take a look and see if your +; requested feature is there, and if not, so that you may remind me. +; Cheers everyone! +; +; BUGS +; [X] '\t' thing +; [X] smoothness in smoothscrolling isn't very smooth +; [X] examine ctrl left/right "stopspots" again +; [X] whitespace left/right +; [X] token left/right +; [X] white or token left/right +; [X] alphanumeric left/right +; [X] alphanumeric or camel left/right +; [X] jumping to top of buffer when invoking compiler +; [X] don't darken character with cursor ghost +; [X] only shows LOADED when all spelled out +; [X] cursor image is broken +; [X] special characters aren't colored correctly +; [X] screen does not always paint on open +; [X] unimportant flag for buffers so they don't ask to save +; [X] problem with clipping panel +; [X] paste highlight range is wrong +; [X] bug in new file interface +; [X] interactive open shouldn't be case sensitive (esp in windows) +; [X] REOPEN is still disabled! +; [X] lctrl + lalt = AltGr option +; [X] don't cursor ghost search highlights +; [X] auto indent stopped working (maps incorrect in one of the views?) +; [X] Assert(size + buffer->line_count < max) +; [X] unsigned +; [X] shift+backspace in interactive view is messed up +; [X] scrolls with mouse off window +; [X] file open same file/switch to file settings wrong +; [X] show whitespace isn't working +; [X] lexer in 4cpp_config.h +; [X] steady view in two panel editing of same file +; [X] offer error +; [X] switch to file "4ed.cpp" with "win32_4ed.cpp" open +; [X] inserting new line at top of file ~ scrolling jump when window is unaligned +; [X] saving/killing *compilation* doesn't work +; [X] line wrapping also doesn't work +; [X] save as corruptitates the filename +; [X] crash when leaving maximized mode and view get's weird +; [X] decrease scroll speed on short windows +; [X] different files, same live name, big ol' bug nest +; [X] can't open 4coder in arbitrary directory +; [X] shift tab +; [X] after auto indent always put cursor after whitespace +; [X] file menu non-ascii file names +; [X] strip \r in paste +; [X] page up scrolling stuff +; [X] stop spots for camel case aren't super +; [X] unmodified command then get's inserted in new view (z bug from hmh) +; [X] view_id always 1 bug +; [X] interactive kill not working +; [X] mouse not working on interactive view +; [X] reopen effects other view too? +; [] indication on failure to save +; [] clean whitespace doesn't appear to be cleaning trailing whitespace anymore??? +; [] sometimes the main cursor is not the same width as the mark cursor in the same spot +; [] tab character wrong width +; [] bouncing when scrolling down +; [] miblo's off screen cursor thing +; [] allen's segfaults on linux launch +; [] fyoucon's segfaults with malloc on win10 +; [] open empty file bug +; +; + +; TODOS +; [X] success message when compiler works +; [X] auto-complete +; [X] detect word to match against +; [X] search in file range for next match and use if found +; [X] create repeatable tracker of previous match and files' searched +; [X] more options for getting buffer in custom API +; [X] write to buffer in custom API +; [X] querry buffer string in custom API +; [X] API for file views +; [X] Seek backwards option +; [X] Use range parameters in all applicable commands +; [X] generate enum for key codes +; [X] API for direct input +; [X] Seek string instead of delimiter +; [X] hook parameters +; [X] API based themes +; +; [] File status (saved, needs saving, out of sync) +; [] feedback messages +; [] command meta data +; [] additional hooks +; [] double binding warnings +; [] kill rect +; [] simple multi-line +; +; search related tech +; [X] replace word (incremental and/or in range) +; [] optimize search +; [] make search wrap around beginning/end +; [] polish for seeking +; +; GUI related tech +; [X] consolidate all UI code properly +; [] arrow navigation of UIs +; [] text links -> arbitrary commands / callbacks? +; +; theme related business +; [] fix the versioning system for themes +; [] theme switch per panel? +; +; [] control schemes +; [] emacs style sub-maps +; [] vim style modes +; [] "tap typing" +; [] "thin cursor" +; +; [] switch over to gap buffer +; [] multiple chunk lexer input +; +; [] macros +; +; [X] cuber's return to previous buffer idea +; [] miblo's various number editors +; +; [] out of sync options +; [] hook +; [] keep copy of unedited orignal, somewhere (compressed, restore by history?) +; +; [] diff +; [] cloc +; [] regex +; [] explicit panel layout +; [] polish for hot directories +; [] undo groups +; +; [] "virtual text" +; [] line numbers +; [] macro expansion +; [] error text at line +; [] word complete ghosting +; + +; INTERNAL TODOS +; [X] switch building non-extensible version by statically linking to custom.cpp +; [] general parameter handling +; [] hashed string pool for clipboard/filenames/etc +; [] ask for clipboards to update by request, not on loop +; [] pack fonts more squarely +; [] setup tests through special tool +; [] new profiling/debugging system +; + +; EASY TODOS +; [X] better messages for example not "BEHIND OS" +; [X] shift backspace +; [] close editor command +; [] panel grow/shrink commands +; [] center view on cursor +; [] delta time in scroll interpolation +; + +; HARD BUGS +; [] repainting too slow for resize looks really dumb +; [] handling cursor in non-client part of window so it doesn't spaz +; [] fill screen right away +; [] how to get fast repaint (do I really need double buffering?) +; [] history breaks when heavily used (disk swaping?) +; [] reduce cpu consumption +; + +; PORTING TODOS +; [X] command line parameters +; [X] get command line arguments +; [X] user settings file name +; [X] custom DLL +; [X] window size and position / full screen +; [X] file(s) to open initially +; [X] position in file to open +; [X] invoking special tools +; [X] transition Win32 layer to using system_shared stuff +; [] user settings file +; [] system fonts +; [] file drag and drop +; [] low latency stuff +; [] actually write the port +; [X] 4coder code compiling +; [X] opengl window up +; [X] basic versions of system functions +; [X] get 4coder to render to window +; [X] keyboard and mouse input (TY:insofaras) +; [X] file exchange (TY:insofaras) +; [X] clipboard (TY:insofaras) +; [X] background threads (TY:insofaras) +; [X] cli stuff (TY:insofaras) +; [] system fonts +; [] file drag and drop +; [] low latency stuff +; [] allow for multiple clipboards +; + +; +