@tZ      !"#$%&'()*+, - . / 0 1 2 3 4 56789:;< = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""""""#### # # # # #$$$$$$$$$$$$$$$$$$ $!$"$#$$$%$&$'$(%)%*%+&,&-&.&/&0&1&2&3&4&5'6'7'8'9':';'<'='>'?'@'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'['\']'^'_'`'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'{'|'}'~''''''''((((((()))**********************+++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------------------------......./////000000000000 0 0 0 0 0000011111111111122 2!2"2#2$2%2&2'2(2)2*2+2,2-2.3/303132333435363738393:3;3<3=3>3?3@3A3B3C3D3E3F3G3H3I3J3K3L3M3N3O3P3Q3R3S3T3U3V3W3X3Y3Z3[3\3]3^3_3`4a4b4c4d4e4f4g4h4i4j4k4l4m4n4o5p5q5r5s5t5u5v5w5x5y5z5{5|5}5~555555555666666666666666677777777777777777777777777888899999999999:;;;;;;;;;;;;<<<<<<<<<<<<<<<<<<<<<<<< < = > > >>>>>>>>>>>>>>>>>>> >!>">#>$>%>&>'>(>)>*>+?,?-?.?/?0?1?2?3?4?5?6?7?8?9?:?;?<?=?>???@?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@ESafeOT )Record presenting a frontend's interface.The functions  and  are both run by the editor's main loop, in response to user actions and so on. Their relation is a little subtle, and is discussed here:'to see some code, look at the function  refreshEditor in Yi.Core#. This is the only place where  and  are used. the function ! is responsible for updating the Editor with the width and height of the windows. Some frontends, such as Pango, need to modify their internal state to do this, and will consequently change their display. This is expected. the function Q should cause the UI to update its display with the information given in the Editor.the functionalities of  and  overlap to some extent, in the sense that both may cause the frontend to update its display. The Yi core provides the following guarantees which the frontend may take advantage of:%in the main editor loop (i.e. in the  refreshEditor function), 0 will be run (possibly multiple times) and then W will be run. This guarantee will hold even in the case of threading (the function  refreshEditor& will always be run atomically, using MVars).between the last run of  and the run of $, some changes may be made to the Editor. However, the text, text attributes, and (displayed) window region of all windows will remain the same. However, the cursor location may change.SThis guarantee allows frontends which calculate rendering of the text during the 8 stage to avoid recalculating the render again during ). Pango is an example of such a frontend.OThe Yi core provides no guarantee about the OS thread from which the functions  and P are called from. In particular, subprocesses (e.g. compilation, ghci) will run  and  from new OS threads (see startSubprocessWatchers in Yi.Corei). The frontend must be preparaed for this: for instance, Gtk-based frontends should wrap GUI updates in  postGUIAsync. Main loop3Clean up, and also terminate if given an exit code.!Suspend (or minimize) the program#Refresh the UI with the given stateGUser force-refresh (in case the screen has been messed up from outside)Set window width and heightReload cabal project views     NoneTiTransform a scanner into a scanner that also adds opening, closing and "next" tokens to indicate layout. Z[\]^_`Z[\]^_`GPL-2yi-devel@googlegroups.com experimentalportableSafe !Helper that shows then packs the Text$, for all those cases where we use a.FThis is kind of like the default Show instance for lists except over bT. It does not leave the elements in extra quotes and should not be attempted to be an and c back.pWorks by resupplying the found prefix back into the list, eventually either finding the prefix or not matching.Like # but returns empty text on failure. %Remove any trailing strings matching irsC (input record separator) from input string. Like perl's chomp(1).!Trim spaces at beginning and end#HFills lines up to the given length, splitting the text up if necessary.$ overInit f runs f over the d+ of the input if possible, preserving the eP element as-is. If given a string with length "d 1, it effectively does nothing. Also see %.% overInit f runs f over the f+ of the input if possible, preserving the gP element as-is. If given a string with length "d 1, it effectively does nothing. Also see $.& Inverse of '. In contrast to h., this does not add an empty line at the end.'Split a Text in lines. Unlike i2, this does not remove any empty line at the end.(7A helper function for creating functions suitable for modifySelectionB and  modifyRegionBQ. To be used when the desired function should map across the lines of a region. !"#$%&'()*+ !"#$%&'()*+" !#)('&*+$% !"#$%&'()*+ Safe:-hGiven a path relative to application data directory, this function finds a path to a given data file..zGiven a path relative to application configuration directory, this function finds a path to a given configuration file./Given an action that retrieves config path, and a path relative to it, this function joins the two together to create a config file path.0#Get Yi master configuration script.2@Get articles.db database of locations to visit (for Yi.IReader.)36Get path to Yi history that stores state between runs.4TGet path to environment file that defines namespace used by Yi command evaluator. j,k-./01234 ,-./01234 40123,./- j,k-./01234Safe5'Combination of the Control.Monad.State modify and 9NRerun the monad until the boolean result is false, collecting list of results.56789:;56789:;:589;7656789:; None$02ALOT'<3A 'Layout a' wrapped in a state monad for tracking Qs. This type is not6 itself a monad, but should rather be thought of as a Q-free version of the U type.=Same as lm, but with all Rs @d. See e for an example of its use.?-Things with orientations which can be flippedA4Used by the vty frontend to draw vertical separatorsBA general bounding boxlIFixed number of "main" windows on the left; stack of windows on the rightmTransposed version of nnRTall windows, with arranged in a balanced binary tree with sliders in between themoCWide windows (windows placed on top of one another, equally spaced)p?Tall windows (i.e. places windows side-by-side, equally spaced)HExistential wrapper for UJ5The type of layout managers. See the layout managers b, f and d" for some example implementations.KbGiven the old layout and the new list of windows, construct a layout for the new list of windows.If the layout manager uses sliding dividers, then a user will expect that most of these dividers don't move when adding a new window. It is the layout manager's responsibility to ensure that this is the case, and this is the purpose of the Layout a argument.oThe old layout may come from a different layout manager, in which case the layout manager is free to ignore it.L4Describe the layout in a form suitable for the user.M<Cycles to the next variant, if there is one (the default is q)N@Cycles to the previous variant, if there is one (the default is qORelative sizes, for WP$Divider position, in the range (0,1)QDivider referenceROrientations for W and XUUI-agnostic layout schema. The basic constructs are (horizontal/vertical) stacks with fixed ratios between window sizes; and (horizontal/vertical) pairs with a slider in between (if available).Y OrientationZZThe layout stack, with the given weights TODO: fix strictness for stack (it's still lazy)[Initial position of the divider\8Index of the divider (for updating the divider position)]Upper of of the pair^Lower of the pair_Accessor for the P with given reference`[Find the divider nearest to a given window, or just the first one in case the argument is raXTrue if the internal layout managers have the same type (but are not necessarily equal).b,Windows placed side-by-side, equally spaced.c4Windows placed on top of one another, equally spaceddNTall windows, arranged in a balanced binary tree with sliders in between them.eTransposed version of dfn4 windows on the left; stack of windows on the right.gTransposed version of f.lSpecial case of k with all Os equal.wThe default layout is  tallLayoutz*The def layout consists of a single windowO<s=>?@ABCDEFGtulvmwnxoypzHIJKLMNOPQRSTUVWXYZ[\]^_`abcd{efgh|ijklmnopqrstuvwxyz{2<=>?@ABCDEFGHIJKLMNOPQRSTUXWVYZ[\]^_`abcdefghijklm3UVWXYZY[\]^RSTPQO_`JKLMNHIacbdefgBCDEFGAh?@=><jiklm1<s=>?@ABCDEFGtulvmwnxoypzHIJKLMNOPQRSTU VWXYZY[\]^_`abcd{efgh|ijklmnopqrstuvwxyz{ GPL-2yi-devel@googlegroups.com experimentalportableNoneCFinish an atomic command, for the purpose of killring accumulation.SPut some text in the killring. It's accumulated if the last command was a kill too}Push a string in the killring.CSet the top of the killring. Never accumulate the previous content.Get the top of the killring.~}  ~} None5  GPL-2yi-devel@googlegroups.com experimentalportableNone0 A window onto a buffer.regular or mini window?the buffer this window opens toSlist of last accessed buffers (former bufKeys). Last accessed one is first element;height of the window (in number of screen lines displayed)(width of the window (in number of chars)Gview area. note that the top point is also available as a buffer mark.identifier for the window (for UI sync) This is required for accurate scrolling. Scrolling depends on the actual number of buffer lines displayed. Line wrapping changes that number relative to the height so we can't use height for that purpose.OThe actual number of buffer lines displayed. Taking into account line wrapping#Get the identification of a window.%Return a "fake" window onto a buffer. None0OT*A tab, containing a collection of windows.For UI sync; fixes #304Visible windows;Current layout. Invariant: must be the layout generated by , up to changing the [s.Glayout manager (for regenerating the layout when we add/remove windows)@Returns a list of all mini windows associated with the given tabAccessor for the windows. If the windows (but not the focus) have changed when setting, then a relayout will be triggered to preserve the internal invariant.iAccessor for the layout manager. When setting, will trigger a relayout if the layout manager has changed.Gets / sets the position of the divider with the given reference. The caller must ensure that the DividerRef is valid, otherwise an error will (might!) occur. A specialised version of "fmap".Forces all windows in the tab!Folds over the windows in the tab;Run the layout on the given tab, for the given aspect ratio Make a tab from multiple windowsMake a tab from one windowEquality on tab identity (the )GPL-2yi-devel@googlegroups.com experimentalportableSafe %&9;<=?T#Abstraction of the automaton state.'Operational representation of a processInteractive process description,Abstraction of monadic interactive processesOutputs a result.iConsumes and returns the next character. Fails if there is no input left, or outside the given bounds.)Just like '(<||)' but in prefix form. It s the second argument.9Convert a process description to an "executable" process.Push an event in the automaton(find all the writes that are accessible.+Parses and returns the specified character.9Parses and returns the specified list of events (lazily).+Combines all parsers in the specified list. option x p will either parse p or return x without consuming any input.8#3SafeSMap an Event to a Char. This is used in the emacs keymap for Ctrl-Q and vim keymap insertSpecialChar%                     GPL-2yi-devel@googlegroups.com experimentalportableNone:[QSet the file to which debugging output should be written. Though this is called initDebug. Debugging output is not created by default (i.e., if this function is never called.) The target file can not be changed, nor debugging disabled.>Outputs the given string before returning the second argument.!Traces x and returns y."Like traceM, but returns ().  !" !"!"   !"GPL-2yi-devel@googlegroups.com experimentalportableNone49;T$Direct subtrees of a treebPrune the nodes before the given point. The path is used to know which nodes we can force or not.-Given an approximate path to a leaf at the end of the region, return: (path to leaf at the end of the region,path from focused node to the leaf, small node encompassing the region)^Return the first element that matches the predicate, or the last of the list if none matches.Return the element before first element that violates the predicate, or the first of the list if that one violates the predicate.kGiven a path to a node, return a path+node which node that encompasses the given node + a point before it..Search the tree in pre-order starting at a given node, until finding a leaf which is at or after the given point. An effort is also made to return a leaf as close as possible to p. TODO: rename to fromLeafToLeafAttTakes a list of (node, index of already inspected child), and return all leaves in this node after the said child).sGiven a root, return all the nodes encountered along it, their paths, and the index of the child which comes next.RReturn all leaves after or before child depending on the relation which is given.3Return all leaves (with paths) inside a given root.|Return all subtrees in a tree; each element of the return list contains paths to nodes. (Root is at the start of each path)/Search the given list, and return the last tree before the given point; with path to the root. (Root is at the start of the path)0+Return all subtrees in a tree, in preorder.1"Return the 1st token of a subtree.2#Return the last token of a subtree.5Given a tree, return (first offset, number of lines).,#$%&'()*+,-./01234567#%&$'()*+,-./01234567#$%&'()*674312/0+,5.-)#$%&'()*+,-./01234567None<=AT 89:;<=>?@A 89:<=;>?@A >89:;<=?@A89:;<=>?@ASafeBCDBDCBCDBCDGPL-2yi-devel@googlegroups.com experimentalportableNoneILE1A CompletionTree is a map of partial completions.Example:2fromList ["put","putStr","putStrLn","print","abc"]Gives the following tree:D/ "p" "abc" / "ut" "rint" / Str "" / Ln ""n(The empty strings are needed to denote the end of a word) (A CompletionTree is not limited to a binary tree)HThis function converts a list of completable elements to a CompletionTree It finds elements that share a common prefix and groups them.fromList . toList = id{The largest element of a non-empty structure with respect to the given comparison function, Nothing if there are multiple largest elements.I.Complete as much as possible without guessing. Examples:/complete $ fromList ["put","putStrLn","putStr"]$("put", fromList ["","Str","StrLn"])5complete $ fromList ["put","putStr","putStrLn","abc"]0("", fromList ["put","putStr","putStrLn","abc"])JUpdate the CompletionTree with new information. An empty list means that there is no completion left. A [mempty] means that the end of a word is reached. Examples:&update (fromList ["put","putStr"]) "p"fromList ["ut","utStr"](update (fromList ["put","putStr"]) "put"fromList ["","Str"])update (fromList ["put","putStr"]) "putS"fromList ["tr"] update (fromList ["put"]) "find" fromList []update (fromList ["put"]) "put" fromList [""]K3Converts a CompletionTree to a list of completions.toList . fromList = sort . nub Examples: toList mempty[]toList (fromList ["a"])["a"]toList (fromList ["a","a","a"])["a"]toList (fromList ["z","x","y"]) ["x","y","z"]LFor debugging purposes.Example::putStrLn $ pretty $ fromList ["put", "putStr", "putStrLn"]["put"[""|"Str"[""|"Ln"]]] EFGHIJKLMEFGHIJKLEFHKIJLG EFGHIJKLMAGPL-2yi-devel@googlegroups.com experimentalportableNone 059:;AOTX2Mutation actions (also used the undo or redo list) For the undoredo, we use the dpartial checkpoint/ (Berlage, pg16) strategy to store just the components of the state that change.Note that the update direction is only a hint for moving the cursor (mainly for undo purposes); the insertions and deletions are always applied Forward.`Note that keeping the text does not cost much: we keep the updates in the undo list; if it's a Deletes it means we have just inserted the text in the buffer, so the update shares the data with the buffer. If it's an Insert" we have to keep the data any way. buffer textMarks for this buffersyntax highlighting state/set of (non overlapping) visual overlay regions9Lowest modified offset since last recomputation of syntaxNew FBuffer filled from string.Write string into buffer.Write string into buffer.uShift a mark position, supposing an update at a given point, by a given amount. Negative amount represent deletions. Point of EOFReturn n Chars starting at i of the buffer.7TODO: This guy is a pretty big bottleneck and only one function uses it which in turn is only seldom used and most of the output is thrown away anyway. We could probably get away with never converting this to String here. The old implementation did so because it worked over ByteString but we don't have to.h"Create an "overlay" for the style sty between points s and e,Obtain a style-update for a specific overlay/Add a style "overlay" between the given points.#Remove a previously added "overlay"'Return style information for the range (i,j) Style information is derived from syntax highlighting, active overlays and current regexp. The returned list contains tuples (l,s,r)> where every tuple is to be interpreted as apply the style s from position l to r in the buffer. In each list, the strokes are guaranteed to be ordered and non-overlapping. The lists of strokes are ordered by decreasing priority: the 1st layer should be "painted" on top.Checks if an Update is validApply a valid updateReverse the given update3Line at the given point. (Lines are indexed from 1);Point that starts the given line (Lines are indexed from 1)Point that's at EOL. Notably, this puts you right before the newline character if one exists, and right at the end of the text if one does not.'Get begining of the line relatively to point.PReturn indices of all strings in buffer matching regex, inside the given region.Modify a mark value.cReturns the requested mark, creating a new mark with that name (at the supplied position) if neededQQRSTUVWXYZ[\]^_`abcdefghLine for which to grab EOL for4Point from which we take the line to find the EOL ofDQRSTUVWXYZ[\]^_dab`cefgh8QRSTUVWXYZ[\][\^_`abcdefghNone$5 i-A URList consists of an undo and a redo list.m A new empty i. Notice we must have a saved file point as this is when we assume we are opening the file so it is currently the same as the one on disknAdd an action to the undo list. According to the restricted, linear undo model, if we add a command whilst the redo list is not empty, we will lose our redoable changes.pAdd a saved file point so that we can tell that the buffer has not been modified since the previous saved file point. Notice that we must be sure to remove the previous saved file points since they are now worthless.q!This undoes one interaction step.r This redoes one iteraction step.CPrepare undo by moving one interaction point from undoes to redoes.4Remove an initial interactive point, if there is one5Insert an initial interactive point, if there is noneQRepeatedly undo actions, storing away the inverse operations in the redo list.Run the undo-function fL on a swapped URList making it operate in a redo fashion instead of undo.sundoIsAtSavedFilePoint. True/ if the undo list is at a SavedFilePoint indicating that the buffer has not been modified since we last saved the file. Note: that an empty undo list does NOT mean that the buffer is not modified since the last save. Because we may have saved the file and then undone actions done before the save.ijklmnopqrstu ijlkmnopqrs mnopsqrijklijklmnopqrstuSafe z{|}~z{|}~z{|}~ z{|}~Safe %&2OQRT Parser processParser specificationJCompute the combination of two profiles, as well as which one is the best.<Right-eval a fully defined process (ie. one that has no Sus) Intelligent, caching best. LPush a chunk of symbols or eof in the process. This forces some suspensions.Push some symbols.Push eofMake a parser into a process.ARun a process (in case you do not need the incremental interface)Parse the same thing as the argument, but will be used only as backup. ie, it will be used only if disjuncted with a failing parser.S    !"#$%&'()*+,-./0  123-      !"#$%&'()*+,-./0  123' ( NoneTGPL-2yi-devel@googlegroups.com experimentalportableNone23445))45BSafe6KSubtraction, but treat maxBound as infinity. i.e. maxBound -? x == maxBound76897897689CSafeT:RExecute IO (Maybe a) action replacing all exceptions with return value of Nothing.;<Execute IO () action, replacing all exceptions with messages<<Execute IO () action, replacing all exceptions with messages:;<:;<:;<DGPL-2yi-devel@googlegroups.com experimentalportableSafe=>Returns absolute name of the file, which doesn't contain any /./, /../, // sequences or symlinks>/Dereferences symbolic links until regular file directorysomething_else appears?Make a path absolute.@,Combines two paths, moves up one level on ..A(Splits path into parts by path separatorText version would look like EF (not . T.null) . T.split (B pathSeparators)But we should move to system-filepath package anyway.=>?@CA=C=>?@CASafe!Canonicalize a user-friendly pathWTurn a user-friendly path into a computer-friendly path by expanding the leading tilda.!Is a user-friendly path absolute?NoneTLRun a command using the system shell, returning stdout, stderr and exit codeDE  DEGPL-2yi-devel@googlegroups.com experimentalportableNone 0234:<=AIT[H3Configuration record. All Yi hooks can be set here. UI to use.UI-specific configuration.*Actions to run when the editor is started.<Actions to run after startup (after startActions) or reload.Default keymap to use."List modes by order of preference.7Produce a .yi.dbg file with a lot of debug information.Set to  for an emacs-like behaviour.Set to FS for an emacs-like behaviour, where all deleted text is accumulated in a killring.List of layout managers for cycleLayoutManagersNext%Custom configuration, containing the js. Configure with configVariableA.When should we use a "fat" cursor (i.e. 2 pixels wide, rather than 1)? Fat cursors have only been implemented for the Pango frontend.&Font name, for the UI that support it.&Font size, for the UI that support it.Style of scroll5Amount to move the buffer when using the scroll wheel/Should the scrollbar be shown on the left side?6Hide scrollbar automatically if text fits on one page.8Hide the tabbar automatically if only one tab is present<Wrap lines at the edge of the window if too long to display.9The char with which to fill empty window space. Usually '~'/ for vi-like editors, ' ' for everything else. UI coloursThe Editor stateFStack of all the buffers. Invariant: first buffer is the current one.&Supply for buffer, window and tab ids.6current tab contains the visible windows pointed list.dynamic componentsMcurrently highlighted regex (also most recent regex for use in vim bindings)2Processed events that didn't yield any action yet.@Actions to be run when the buffer is closed; should be scrapped.>Used to specify the behaviour of the automatic indent command. Increase the indentation to the next higher indentation hint. If we are currently at the highest level of indentation then cycle back to the lowest. Decrease the indentation to the next smaller indentation hint. If we are currently at the smallest level then cycle back to the largest VIncrease the indentation to the next higher hint if no such hint exists do nothing. dDecrease the indentation to the next smaller indentation hint, if no such hint exists do nothing. A Mode customizes the Yi interface for editing a particular data format. It specifies when the mode should be used and controls file-specific syntax highlighting and command input, among other things.$so this can be serialized, debugged.+What type of files does this mode apply to?Syntax highlighterPrettify current "paragraph" Buffer-local keymap modificationemacs-style auto-indent lineBFollow a "link" in the file. (eg. go to location of error message)bStrokes that should be applied when displaying a syntax element should this be an Action instead?6An action that is to be executed when this mode is set'buffer-local modeline formatting method.go to the point where the variable is declared(immutable unique key)undo/redo list*dynamic components+;prefered column to arrive at when we do a lineDown / lineUp,;prefered column to arrive at visually (ie, respecting wrap)-6stick to the end of line (used by vim bindings mostly)./updates that haven't been synched in the UI yet3*time of the last synchronization with disk4read-only flag52the keymap is ready for insertion into this buffer6&does buffer contain directory contents:IHow many points (frontend-specific) to change the font by in this buffer;`Updates that we've seen in this buffer, basically "write-only". Work-around for broken WriterT.GCurrently duplicates some of Vim's indent settings. Allowing a buffer to specify settings that are more dynamic, perhaps via closures, could be useful.I)Insert spaces instead of tabs as possibleJ Size of a TabKIndent by so many columnsL/The BufferM monad writes the updates performed.QContent of the top-level loop.RFor insertion-only modesS^The type of user-bindable functions TODO: doc how these are actually user-bindable are they?^ input stream_ output streama%The only mutable state in the program      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&)('*+,-./0123456789:;<=>?@ABCDEFGHJIKLMNOPQRSTUVWXYZ[\`]^_abcdefghijklmnopqrslmnopkjihgfebcd[\]^_`aVWXYZSTU~qOPQRrLMNGHIJK}BCDEF|A<=>?@{%&'()*+,-./0123456789:;z"#$y !x     wsvut4        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~GPL-2yi-devel@googlegroups.com experimentalportableNone/0234:AILOT[E6Gets a short identifier of a buffer. If we're given a #+ then just wraps the buffer name like so: *name*. If we're given a $), it drops the number of path components.>let memBuf = newB (BufferRef 0) (MemBuffer "foo/bar/hello") ""shortIdentString 2 memBuf"*foo/bar/hello*"@let fileBuf = newB (BufferRef 0) (FileBuffer "foo/bar/hello") ""shortIdentString 2 fileBuf"hello"5Gets the buffer's identifier string, emphasising the #:>let memBuf = newB (BufferRef 0) (MemBuffer "foo/bar/hello") ""identString memBuf"*foo/bar/hello*"@let fileBuf = newB (BufferRef 0) (FileBuffer "foo/bar/hello") ""identString fileBuf"foo/bar/hello"6update the syntax information (clear the dirty "flag")uIncreases the font size in the buffer by specified number. What this number actually means depends on the front-end.uDecreases the font size in the buffer by specified number. What this number actually means depends on the front-end.8Given a buffer, and some information update the modelineON.B. the contents of modelines should be specified by user, and not hardcoded.;Given a point, and the file size, gives us a percent stringAdds an "overlay" to the bufferRemove an existing "overlay" Execute a BufferMw value on a given buffer and window. The new state of the buffer is returned alongside the result of the computation. Execute a BufferM[ value on a given buffer, using a dummy window. The new state of the buffer is discarded.9Mark the current point in the undo list as a saved state.Undo all updates that happened since last save, perform a given action and redo all updates again. Given action must not modify undo history.GWAnalogous to const, but returns a function that takes two parameters, rather than one./Mode applies function that always returns True.0Mode applies function that always returns False.Create buffer named nm with contents s Point of eofExtract the current point'Move point in buffer to the given index6Revert all the pending updates; don't touch the point.6Write an element into the buffer at the current point.0Write the list into the buffer at current point. Insert newline at current point. Insert given H3 at specified point, extending size of the buffer. Insert the H+ at current point, extending size of buffer:Insert the char at current point, extending size of bufferImplementation note: This just s a I. This seems sub-optimal because we should be able to do much better without spewing chunks of size 1 everywhere. This approach is necessary however so an X{ can be recorded. A possible improvement for space would be to have yi-rope  package optimise for appends with length 1. deleteNAt n p deletes n# characters forwards from position pReturn the current line numberTop line of the screenMiddle line of the screenBottom line of the screenJAmount of lines in the screenReturn line numbers of marksGo to line number n. ny is indexed from 1. Returns the actual line we went to (which may be not be the requested line, if it was out of range) Set the modeModify the modeJReturn indices of strings in buffer matched by regex in the given region.PReturn indices of next string in buffer matched by regex in the given directionHighlight the selection$Whether the selection is highlightedhMove point by the given number of characters. A negative offset moves backwards a positive one forward. Move point -1Move cursor -nMove cursor +1Move cursor +nMove point down by n lines. n can be negative. Returns the actual difference in lines which we moved which may be negative if the requested line difference is negative.Moves to a visual column within the current line as shown on the editor (ie, moving within the current width of a single visual line) Move point up one line Move point down one line "Return the contents of the buffer. :Returns the contents of the buffer between the two points.If the startPoint >= endPoint, empty string is returned. If the points are out of bounds, as much of the content as possible is taken: you're not guaranteed to get endPoint - startPoint characters. 'Read the character at the current pointpRead the character at the given index This is an unsafe operation: character NUL is returned when out of boundsDelete n* characters forward from the current point Gives the G for the current buffer.Current column. Note that this is different from offset or number of chars from sol. (This takes into account tabs, unicode chars, etc.)KCurrent column, visually.L?Decides which column we should be on after the given character..Returns start of line point for a given point p$Returns end of line for given point.Go to line indexed from current point Returns the actual moved difference which of course may be negative if the requested difference was negative.hAccess to a value into the extensible state, keyed by its type. This allows you to retrieve inside a L monad, ie: value <- getBufferDyndAccess to a value into the extensible state, keyed by its type. This allows you to save inside a L monad, ie: putBufferDyn updatedvalue perform a  BufferM a4, and return to the current point. (by using a mark)! Perform an  BufferM a", and return to the current point." Perform an  BufferM aU, and return to the current line and column number. The difference between this and ! is that here we attempt to return to the specific line and column number, rather than a specific number of characters from the beginning of the buffer.HIn case the column is further away than EOL, the point is left at EOL:  is used internally.%_What would be the point after doing the given action? The argument must not modify the buffer.(Just stores the mode name.MNOPQRSTUV2Number of characters to drop from FileBuffer namesBuffer to work withWXYZ[\]^_G`aJbcdef    Point to start atPoint to stop at ghijKL !"#$%&'()*+,-./0123456789:;<QRST_dab`ch     "#$<=>?@ABCDGHJIKLMN      !"#$%&'-./0123456789:;<BCDLMNA<=>?@  QRST_`abcdh   !"& 904;7516<2:38    GHIJK-/.#"#$$%' MNOPQRSTUVWXYZ[\]^_G`aJbcdef     ghijKL !"#$%&'()*+,-./0123456789:;<GPL-2yi-devel@googlegroups.com experimentalportableNone >&Delete an arbitrary part of the buffer@#Replace a region with a given rope.A9Map the given function over the characters in the region.BSwap the content of two RegionsCPModifies the given region according to the given string transformation functionD1Extend the right bound of a region to include it.ESee a region as a block/rectangular region, since regions are represented by two point, this returns a list of small regions form this block region.FIJoins lines in the region with a single space, skipping any empty lines.GIConcatenates lines in the region preserving the trailing newline if any.HGets the lines of a region (as a region), preserving newlines. Thus the resulting list of regions is a partition of the original region.]The direction of the region is preserved and all smaller regions will retain that direction.`Note that regions should never be empty, so it would be odd for this to return an empty list...k|Given some text and the previous region, finds the next region (used for implementing linesOfRegionB, not generally useful) =>?@ABC The string modification functionThe region to modifyDEFGHklmnopqrstuvwxyz{|}~=>?@ABCDEFGH B>@?AC=DEFGH =>?@ABCDEFGHkGPL-2yi-devel@googlegroups.com experimentalportableNone0#I Boundary sideL!Designate a given "unit" of text.Ma single characterN!a line of text (between newlines)OYa "vertical" line of text (area of text between two characters at the same column number)Pthe whole documentTLTurns a unit into its "negative" by inverting the boundaries. For example, outsideUnit unitViWordJ will be the unit of spaces between words. For units without boundaries (M, P', ...), this is the identity function.8Common boundary checking function: run the condition on len@ characters in specified direction shifted by specified offset.U,a word as in use in Emacs (fundamental mode)Vkdelimited on the left and right by given characters, boolean argument tells if whether those are included.$Tells if a char can end a sentence (, !, ?).jVerifies that the string matches all the predicates, pairwise. If the string is "too small", then return 2. Note the length of predicates has to be finite.^Helper that takes first two characters of YiString. Faster than take 2 and string conversion._TSeparator characters (space, tab, unicode separators). Most of the units above attempt to identify "words" with various punctuation and symbols included or excluded. This set of units is a simple inverse: it is true for "whitespace" or "separators" and false for anything that is not (letters, numbers, symbols, punctuation, whatever).`4unitSep is true for any kind of whitespace/separatoraNunitSepThisLine is true for any kind of whitespace/separator on this line onlyIs the point at a Unit boundary in the specified  Direction?cFParagraph to implement emacs-like forward-paragraph/backward-paragraphdTParagraph that begins and ends in the paragraph, not the empty lines surrounding it.fWUnit that have its left and right boundaries at the left boundary of the argument unit.ggenAtBoundaryB u d s2 returns whether the point is at a given boundary (d,s) . Boundary (d,s) , taking Word as example, means: Word ^^ ^^ 12 34 1: (Backward,OutsideBound) 2: (Backward,InsideBound) 3: (Forward,InsideBound) 4: (Forward,OutsideBound)rules: genAtBoundaryB u Backward InsideBound = atBoundaryB u Backward genAtBoundaryB u Forward OutsideBound = atBoundaryB u ForwardjvRepeat an action until the condition is fulfilled or the cursor stops moving. The Action may be performed zero times.uRepeat an action until the condition is fulfilled or the cursor stops moving. The Action is performed at least once.mADo an action if the current buffer character passes the predicatenvGeneric move operation Warning: moving To the (OutsideBound, Backward) bound of Document is impossible (offset -1!) genMoveB u b dC: move in direction d until encountering boundary b or unit u. See g for boundary explanation.oYGeneric maybe move operation. As genMoveB, but don't move if we are at boundary already.pMove to the next unit boundaryqAs p(, unless the point is at a unit boundarysTransforms the region given by L in the  with user-supplied function.tGDelete between point and next unit boundary, return the deleted region.v8Region of the whole textunit where the current point is.wBNon empty region of the whole textunit where the current point is.xeRegion between the point and the next boundary. The region is empty if the point is at the boundary.yxNon empty region between the point and the next boundary, In fact the region can be empty if we are at the end of file.z6Non empty region at given point and the next boundary,DIJKLMNOPQRSTOffset from current position Look-ahead predicateDirection to look inUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~6IJKLNMOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~6LMNOPQRSTfUYZ[\]^Vecd_`aWpqsrvwxuyz{|jklimbhtonIJKgX}~;IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ NoneExtend the given region to boundaries of the text unit. For instance one can extend the selection to complete lines, or paragraphs.>IJKLMNOPQSRTUVWXYZ[\]^_`abcdefghijklmnopqrstvwxyz{|>LMNOPQRS_WfTVcde`aZ\^Y[]Ubtmkonqph{|vwxzysrjliIJKXg!GPL-2yi-devel@googlegroups.com experimentalportableNone[\YMove point between the middle, top and bottom of the screen If the point stays at the middle, it'll be gone to the top else if the point stays at the top, it'll be gone to the bottom else it'll be gone to the middleMove point to start of lineMove point to end of lineMove cursor to originMove cursor to end of buffer*Move left if on eol, but not on blank lineMove x- chars back, or to the sol, whichever is lessMove x0 chars forward, or to the eol, whichever is less(Move to first char of next word forwards)Move to first char of next word backwardsMove to the next occurence of c3Move to the character before the next occurence of c"Move to the previous occurence of c6Move to the character after the previous occurence of c.Move to first non-space character in this line1Move to the last non-space character in this lineiGo to the first non space character in the line; if already there, then go to the beginning of the line.?True if current line consists of just a newline (no whitespace)INote: Returns False if line doesn't have any characters besides a newlineMove down next n paragraphs Move up prev n paragraphs Select next n paragraphs7Return true if the current point is the start of a line5Return true if the current point is the end of a lineTrue if point at start of fileTrue if point at end of fileTrue if point at the last line&Get the current line and column numberRead the line the point is on$Read from point to beginning of line;Get the previous point, unless at the beginning of the fileReads in word at point.Reads in word before point.Delete one character backwardTDelete forward whitespace or non-whitespace depending on the character under point.VDelete backward whitespace or non-whitespace depending on the character before point.4Delete backward to the sof or the new line characteremacs' delete-horizontal-space with the optional argument.$capitalise the word under the cursorlowerise word under the cursor(capitalise the first letter of this word(Delete to the end of line, excluding it.0Transpose two characters, (the Emacs C-t action)0Delete trailing whitespace from all lines. Uses " to get back to where it was.Marks%Set the current buffer selection mark%Get the current buffer selection markExchange point & mark.=File info, size in chars, line no, col num, char num, percentScroll up 1 screenScroll down 1 screen%Scroll by n screens (negative for up)*Same as scrollB, but also moves the cursor,Same as scrollByB, but also moves the cursorMove to middle line in screen$Move cursor to the top of the screen'Move cursor to the bottom of the screenScroll by n lines.,Move the point to inside the viewable regionreturn index of Sol on line n above current line&return relative position of the point p/ relative to the region defined by the points rs and re,Move the visible region to include the pointMove to n lines down from top of screenMove to n' lines up from the bottom of the screenMove to middle line in screen(Return the region between point and mark8Return the empty region if the selection is not visible.JGet the current region boundaries. Extended to the current selection unit.7Select the given region: set the selection mark at the } and the current point at the ~.<Get a (lazy) stream of lines in the buffer, starting at the next line in the given direction.GGet the next line of text in the given direction. This returns simply r if there no such line. The same as  but avoids the use of the M type in the return by returning the empty string if there is no next line.Get closest line to the current line (not including the current line) in the given direction which satisfies the given condition. Returns r4 if there is no line which satisfies the condition.Returns the closest line to the current line which is non-blank, in the given direction. Returns the empty string if there is no such line (for example if we are on the top line already).9Prefix each line in the selection using the given string.Uncomments the selection using the given line comment starting string. This only works for the comments which begin at the start of the line. Just like X but automatically inserts a whitespace suffix to the inserted comment string. In fact:SToggle line comments in the selection by adding or removing a prefix to each line.3Replace the contents of the buffer with some string9Fill the text in the region so it fits nicely 80 columns.Sort the lines of the region.7Forces an extra newline into the region (if one exists)BHelper function: revert the buffer contents to its on-disk version<Increase (or decrease if negative) next number on line by n. Increment number in string by n.#Is character under cursor a number.GUsed by isNumber to test if current character under cursor is a number. Characters ['a'..'f'V] are part of a hex number only if preceded by 0x. Test if the current occurence of ['a'..'f'] is part of a hex number.Move point down by nn lines If line extends past width of window, count moving a single line as moving width points to the right.&Implements the same logic that emacs'  `mark-word`L does. Checks the mark point and moves it forth (or backward) for one word.%The string that starts a line comment'The string which begins a line comment3A potentially shorter string that begins a commentrrz"GPL-2yi-devel@googlegroups.com experimentalportableNone[Return either a t or the number of spaces specified by tabSize in the IndentSettings. Note that if you actually want to insert a tab character (for example when editing makefiles) then you should use: insertB '\t'.A specialisation of F. This is the most basic and the user is encouraged to specialise  on their own.This takes two arguments the first is a function to obtain indentation hints from lines above the current one. The second is a function to obtain a set of indentation hints from the previous line. Both of these are in the L monad although the second seems like it is unnecessary. However we must take into account the length of tabs which come from the the tab settings and hence we must be in the L monad.To get the straightforward behaviour of the indents of all previous lines until one of them has zero indent call this with: ?autoIndentHelperB fetchPreviousIndentsB (fmap (: []) indentOfB) However commonly we wish to have something more interesting for the second argument, in particular we commonly wish to have the last opening bracket of the previous line as well as its indent.Cycles through the indentation hints. It does this without requiring to set/get any state. We just look at the current indentation of the current line and moving to the largest indent that is7A function generally useful as the first argument to . This searches the lines above the current line for the indentations of each line until we get to a line which has no indentation *and* is not empty. Indicating that we have reached the outer scope.NReturns the position of the last opening bracket on the line which is not closed on the same line. Note that if we have unmatched parentheses such as "( ]" then we may not get the correct answer, but in that case then arguably we don't really care if we get the correct answer (at least if we get it wrong the user may notice their error). We return a list here as it's a convenient way of returning no hint in the case of there being no non-closed bracket and normally such a hint will be part of a list of hints anyway. NOTE: this could be easily modified to return the indentations of *all* the non-closed opening brackets. But I think this is not what you generally want. TODO: we also do not care whether or not the bracket is within a string or escaped. If someone feels up to caring about that by all means please fix this.gReturns the indentation of a given string. Note that this depends on the current indentation settings.gReturns the length of a given string taking into account the white space and the indentation settings.Indents the current line to the given indentation level. In addition moves the point according to where it was on the line originally. If we were somewhere within the indentation (ie at the start of the line or on an empty line) then we want to just go to the end of the (new) indentation. However if we are currently pointing somewhere within the text of the line then we wish to remain pointing to the same character.Modifies current line indent measured in visible spaces. Respects indent settings. Calling this with value (+ 4) will turn "t" into "tt" if shiftwidth is 4 and into "t " if shiftwidth is 8 If current line is empty nothing happens.#Indent as much as the previous lineIndent as much as the next lineFInsert a newline at point and indent the new line as the previous one.nSet the padding of the string to newCount, filling in tabs if expandTabs is set in the buffers IndentSettings0Counts the size of the indent in the given text.*Assumes nothing but tabs and spaces: uses .xshifts right (or left if num is negative) num times, filling in tabs if expandTabs is set in the buffers IndentSettingsIIncreases the indentation on the region by the given amount of shiftWidthKReturn the number of spaces at the beginning of the line, up to the point.)Action to fetch hints from previous lines,Action to calculate hints from previous line Sets the indent behaviour, see G for a description  GPL-2yi-devel@googlegroups.com experimentalportableNonelmnopqrstuvwxyz{|}~QRSTUVWXYZ[\]^_dab`cefghijlkmnopqrs     "#$<=>?@ABCDGHJIKLMN      !"#$%&'-./0123456789:;<=>?@ABCDEFGHIJKLNMOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~UVWXYZ[\][\^gef#GPL-2yi-devel@googlegroups.com experimentalportableNone:Turn a sequence of (from,style,to) strokes into a sequence of picture points (from,style), taking special care to ensure that the points are strictly increasing and introducing padding segments where neccessary. Precondition: Strokes are ordered and not overlapping.<Paint the given stroke-picture on top of an existing picture 0Arrange a list of items in columns over maximum maxNumberOfLines lines (Arrange a list of items in columns over  numberOfLines lines.)TODO: proper Text/YiString implementation                      $GPL-2yi-devel@googlegroups.com experimentalportableNone !"#$%&' !"#$%&'&%$#"! ' !"#$%&'%GPL-2yi-devel@googlegroups.com experimentalportableNone()*@ !"#$%&'()*&()*()*&NoneIOT+4Fields that can be modified with all lens machinery.,%The configuration monad. Run it with  configMain./Accessor for any j!, to be used by modules defining jcs. Such modules should provide a custom-named field. For instance, take the following hypothetical j:~@newtype UserName = UserName { unUserName :: String } deriving(Typeable, Binary, Default) instance YiConfigVariable UserName8$(nameDeriveAccessors ''UserName (n -> Just (n ++ "A"))) userName :: +  userName = unUserNameA  /@7Here, the hypothetical library would provide the field userName to be used in preference to customVariable.+,-./+,-./,-.+/+,-./'GPL-2yi-devel@googlegroups.com experimentalportableNone[85The initial stateCCreate and fill a new buffer, using contents of string. | Does not focus the window, or make it the current window. | Call newWindowE or switchToBufferE to take care of that.D;Delete a buffer (and release resources associated with it).EReturn the buffers we have, in no particular orderFUReturn a prefix that can be removed from all buffer paths while keeping them unique.IFind buffer with this keyJFind buffers with this nameK/Find buffer with given name. Fail if not found.L[Perform action with any given buffer, using the last window that was used for that buffer.M$Perform action with any given bufferN+Perform action with current window's bufferQReturn the current bufferRPrints a message with .S!Prints a all given messages with .U Set the "background" status lineVClear the status lineYPut string into yank registerZ(Return the contents of the yank register[(Dynamically-extensible state components.These hooks are used by keymaps to store values that result from Actions (i.e. that restult from IO), as opposed to the pure values they generate themselves, and can be stored internally.The  field is a type-indexed map.*Retrieve a value from the extensible state\;Insert a value into the extensible state, keyed by its type]7Like fnewE, create a new buffer filled with the String s, Switch the current window to this buffer. Doesn't associate any file with the buffer (unlike fnewE) and so is good for popup internal buffers (like scratch)^Like ] but defaults to empty contents./Create a new zero size window on a given buffer`*Create a new window onto the given buffer.a1Attach the specified buffer to the current windowbeSwitch to the buffer specified as parameter. If the buffer name is empty, switch to the next buffer.cLClose a buffer. Note: close the current buffer if the empty string is givene:Close current buffer and window, unless it's the last one.fRotate focus to the next windowg#Rotate focus to the previous windowhLSwaps the focused window with the first window. Useful for layouts such as  HPairOneStack-, for which the first window is the largest.iZMoves the focused window to the first window, and moves all other windows down the stack.j%Swap focused window with the next onek)Swap focused window with the previous oneVA "fake" accessor that fixes the current buffer after a change of the current window.QEnforces invariant that top of buffer stack is the buffer of the current window.nLReturn the windows that are currently open on the buffer whose key is giveno5bring the editor focus the window with the given key./Fails if no window with the given key is found.peSplit the current window, opening a second window onto current buffer. TODO: unfold newWindowE here?qFPrints the description of the current layout manager in the status barrVCycle to the next layout manager, or the first one if the current one is nonstandard.sZCycle to the previous layout manager, or the first one if the current one is nonstandard.Helper function for layoutManagersNext and layoutManagersPrevioust8Next variant of the current layout manager, as given by Mu=Previous variant of the current layout manager, as given by Nv2Sets the given divider position on the current tabwDCreates a new tab containing a window that views the current buffer.x4Moves to the next tab in the round robin set of tabsy8Moves to the previous tab in the round robin set of tabszWMoves the focused tab to the given index, or to the end if the index is not specified.{Deletes the current tab. If there is only one tab open then error out. When the last tab is focused, move focus to the left, otherwise move focus to the right.|nClose the current window. If there is only one tab open and the tab contains only one window then do nothing.}5Make the current window the only window on the screen~DSwitch focus to some other window. If none is available, create one.Execute the argument in the context of an other window. Create one if necessary. The current window is re-focused after the argument has completed..Shows the current key bindings in a new window/Creates an in-memory buffer with a unique name.a56789:;<=>?@ABCThe buffer indentifier/The contents with which to populate the bufferDEFGHIJKLMNOPQRSTUVWXYZ[\] buffer namebuffer contents^_`abcdefghijklmnopqrstuvwxyz{|}~ds5789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ds_BE7ec}VFQ8PD{5HIJmoGKd[Z9tursq:zjk]^w`xf;<gyRSTi\=vYU~pWX>ChabA|?@nNOLMla56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~GPL-2yi-devel@googlegroups.com experimentalportableNone  Like usual - but user can specify case sensitivity. See  for exotic unicode gotchas.'Prefix matching function, for use with 0Text from the match up to the end, for use with >A simple fuzzy match algorithm. Example: "abc" matches "a1b2c">A simple fuzzy match algorithm. Example: "abc" matches "a1b2c"UTODO: this is a terrible function, isn't this just case-insensitive infix?  FkzetsuComplete a string given a user input string, a matching function and a list of possibilites. Matching function should return the part of the string that matches the user string.Same as  , but maps  showFunction# on possible matches when printingThis function attempts to provide a better tab completion result in cases where more than one file matches our prefix. Consider directory with following files: 5["Main.hs", "Main.hi", "Main.o", "Test.py", "Foo.hs"].After inserting Mai[ into the minibuffer and attempting to complete, the possible matches will be filtered in  to  ["Main.hs", "Main.hi", "Main.o"]M however because of multiple matches, the buffer will not be updated to say Main. but will instead stay at Mai.This is extremely tedious when trying to complete filenames in directories with many files so here we try to catch common prefixes of filtered files and if the result is longer than what we have, we use it instead.Is case-sensitive?Input to match onmatcher functionitems to match against Show functionInput to match onmatcher functionitems to match against   (GPL-2yi-devel@googlegroups.com experimentalportableNoneSGet the selected region as a rectangle. Returns the region extended to lines, plus the start and end columns of the rectangle."Split text at the boundaries given)GPL-2yi-devel@googlegroups.com experimentalportableNonePut regex into regex registerClear the regex register!Return contents of regex register*None$: +GPL-2yi-devel@googlegroups.com experimentalportableNoneZA TabDescr describes the properties of a UI tab independent of the particular GUI in use.,GPL-2yi-devel@googlegroups.com experimentalportableNone09;OT#Start an input session with History.Finish the current input session with history.0Helper that sets the given history at ident and \s the result. identifierHistory to setMap of existing histories-GPL-2yi-devel@googlegroups.com experimentalportableNone/09:;<=?AIOTwrite a/ returns a keymap that just outputs the action a. withModeY f runs fd on the current buffer's mode. As this runs in the YiM monad, we're able to do more than with just  withModeBB such as prompt the user for something before running the action.Predicate to select exceptionsComputation to runHandler6OPQRSTUVWXYZ[\`]^_abcdefghilmnopqr6lmnopihgfeOPQRrSTUq[\]^_`abcdVWXYZ.GPL-2yi-devel@googlegroups.com experimentalportableNone[Remove anything starting with uppercase letter. These denote either module names or types.Hoogle's output includes a sort of type keyword, telling whether a hit is a package name, syntax, a module name, etc. But we care primarily about the function names, so we filter out anything containing the keywords.tQuery Hoogle, with given search and options. This errors out on no results or if the hoogle command is not on path.Filter the output of  to leave just functions.Return module-function pairs. Call out to D, and overwrite the word at point with the first returned function. Call out to Z, and print inside the Minibuffer the results of searching Hoogle with the word at point./NoneThe class of "valid hooks". This class is exported abstractly, but the instances can be phrased quite simply: the functions (of arbitrarily many arguments, including zero) which run in either the  or S monads.)A typical example would be something likeInt -> String ->  String.JLooks up the configured value for the hook, and runs it. The argument to + will typically be a record accessor. See  for the valid hook types.+//+0GPL-2yi-devel@googlegroups.com experimentalportableNone: 5Parse any character that can be inserted in the text.  optMod f ev produces a  that consumes ev or f ev #Convert a special key into an event p >>! act = p >> 'write' act  p >>=! act = p >>= 'write' . act  ev ?>> proc =  ev >> proc  ev ?>>! act =  ev >>  act  ev ?*>> proc =  ev >> proc  ev ?*>>! act =  ev >>  act     Q                     1 100001None05ITBTrims per-command histories to contain at most N completions each.{Here is a persistent history saving part. We assume each command is a single line. To add new components, one has to:add new field in PersistentState structure,add write and read parts in loadPersistentState/savePersistentState,add a trimming code in savePersistentState) to prevent blowing up of save file.QReads and decodes a persistent state in both strict, and exception robust way.BLoads a persistent state, and sets Yi state variables accordingly.2GPL-2yi-devel@googlegroups.com experimentalportableNoneJOT[FMake an action suitable for an interactive run. UI will be refreshed.qStart up the editor, setting any state with the user preferences and file names passed in, and turning on the UI7Display the errors buffer if it is not already visible.^Process events by advancing the current keymap automaton and executing the generated actions.Quit. EQuit with an exit code. (This is used to implement vim's :cq command)lUpdate (visible) buffers if they have changed on disk. FIXME: since we do IO here we must catch exceptions!;Hide selection, clear "syntax dirty" flag (as appropriate)."Redraw#Suspend the program$pPipe a string through an external command, returning the stdout chomp any trailing newline (is this desirable?)Todo: varients with marks?Same as R%, but do nothing instead of printing ()&,Show an error on the status line and log it.'MClose the current window. If this is the last window open, quit the program.ACONSIDER: call quitEditor when there are no other window in the Y function. (Not possible since the windowset type disallows it -- should it be relaxed?)(This is a like ' but with emacs behaviour of C-x 0: if we're trying to close the minibuffer or last buffer in the editor, then just print a message warning the user about it rather closing mini or quitting editor.Kill a given subprocess*8Start a subprocess with the given command and arguments. Appends a H to the given buffer.BTODO: Figure out and document the Bool here. Probably to do with . !"#$%&'()*Buffer to append toText to append+,- !"#$%&'()*+,- "#-&'($*+%,!) !"#$%&'()*+,-3GPL-2yi-devel@googlegroups.com experimentalportableNone 09;<=IQRT[ -What to prompt the user when asked this type?4Tag a type with a documentation7+Prompts for a buffer name, turns it into a O and passes it on to the handler function. Uses all known buffers for hinting.8@Prompts the user for comment syntax to use for the current mode.9Open a minibuffer window with the given prompt and keymap The third argument is an action to perform after the minibuffer is opened such as move to the first occurence of a searched for string. If you don't need this just supply  return ():#withMinibuffer prompt completer act: open a minibuffer with prompt. Once a string s is obtained, run act s.  completerK can be used to complete functions: it returns a list of possible matches.;Makes a completion function.?.Hint function that does nothing, for use with BAwithMinibufferFree prompt act: Simple version of BB@withMinibufferGen proposal getHint prompt completer onTyping act: open a minibuffer with prompt, and initial content proposal. Once a string s is obtained, run act s.  completer can be used to complete inputs by returning an incrementally better match, and getHint can give an immediate feedback to the user on the current input. on Typingu is an extra action which will fire with every user key-press and receives minibuffer contents. Use something like const $ return () if you don't need this.C8Open a minibuffer, given a finite number of suggestions.*TODO: decide whether we should be keeping b here or moving to YiString.HReturns all the buffer names9./01234567PromptHandlerHint pre-processor. It takes the list of open buffers and a list of all buffers, and should spit out all the buffers to possibly hint, in the wanted order. Note the hinter uses name prefix for filtering regardless of what you do here.89:;List completion, such as .Matcher such as .Function to fetch possibilites for completion.!Input to try and complete against<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ./0123456789:;<=>?@ABCDEFGH9A:BC?@;<>=FGHED4563102./872./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ4GPL-2yi-devel@googlegroups.com experimentalportableNoneLQR[ `Given a possible starting path (which if not given defaults to the current directory) and a fragment of a path we find all files within the given (or current) directory which can complete the given path fragment. We return a pair of both directory plus the filenames on their own that is without their directories. The reason for this is that if we return all of the filenames then we get a hint1 which is way too long to be particularly useful.abGiven a path, trim the file name bit if it exists. If no path given, return current directory.b?Given a possible path and a prefix, return matching file names.c\Place mark at current point. If there's an existing mark at point already, deactivate mark.d'Select the contents of the whole buffereA simple wrapper to adjust the current indentation using the mode specific indentation function but according to the given indent behaviour.f0Generic emacs style prompt file action. Takes a prompt and a continuation act& and prompts the user with file hints.gAs fr but additionally allows the caller to transform the list of hints arbitrarily, such as only showing directories.For use as the hint when opening a file using the minibuffer. We essentially return all the files in the given directory which have the given prefix.jLike M-x cd, it changes the current working directory. Mighty useful when we don't start Yi from the project directory or want to switch projects, as many tools only use the current working directory.k*Shows current working directory. Also see j.Runs a S action in a separate thread.Notes:%It seems to work but I don't know whyMaybe deadlocks?If you're outputting into the Yi window, you should really limit the rate at which you do so: for example, the Pango front-end will quite happily segfault/double-free if you output too fast.I am exporting this for those adventurous to play with but I have only discovered how to do this a night before the release so it's rather experimental. A simple function that prints a message once a second, 5 times, could be written like this: printer :: YiM ThreadId printer = do mv <- io $ newMVar (0 :: Int) forkAction (suicide mv) MustRefresh $ do c <- io $ do modifyMVar_ mv (return . succ) tryReadMVar mv case c of Nothing -> printMsg "messaging unknown time" Just x -> printMsg $ "message #" <> showT x where suicide mv = tryReadMVar mv >>= case Just i | i >= 5 -> return True _ -> threadDelay 1000000 >> return False n:Prints out the rope of the current buffer as-is to stdout.UThe only way to stop it is to close the buffer in question which should free up the .`abcdefgPrompt/Hint transformer: current path, generated hintsAction over choicehijklmruns after we insert the action: this may be a thread delay or a thread suicide or whatever else; when delay returns False, that's our signal to terminate the thread.#should we refresh after each actionThe action to actually runn`abcdefghijklmn`ajkblcdefghimn`abcdefghijklmn5GPL-2yi-devel@googlegroups.com experimentalportableNone05[".keep track of the num of successful operations"if True, DOChoice will be bypassed\The full path to the directory being viewed FIXME Choose better data structure for Marks... -Map values are just leafnames, not full paths 'keys are just leafnames, not full paths (position in the buffer where filename is <position on line where filename is (all pointA are this col) :keep the position of pointer (for refreshing dired buffer)Handy alias for  map.IAlias serving as documentation of some arguments. We keep most paths as H5 for the sole reason that we'll have to render them.^Elementary operations for dired file operations Map a dired mark operation (e.g. delete, rename, copy) command into a list of DiredOps, and use procDiredOp to excute them. Logic and implementation of each operation are packaged in procDiredOp See askDelFiles for example. If new elem op is added, just add corresponding procDiredOp to handle it./remove the buffers that associate with the fileprompt a "yes/no" question. If yes, execute the first list of embedded DiredOps otherwise execute the second list of embedded DiredOpsUsimilar to DOConfirm, but no user interaction. Could be used to check file existence6this is a shortcut, it invokes DCChoice if file existsprompt a string and collect user input. the embedded list of DiredOps is generated based on input, Remember that the input should be checked with DOCheck)prompt a string, provide keybindings for y, n, !, q and optional hb (help) this is useful when overwriting of existing files is required to complete the op choice !) will bypass following DOChoice prompts.6to feedback, given the state. such as show the result. no operation~If file exists, read contents of file into a new buffer, otherwise creating a new empty buffer. Replace the current window with a new window onto the new buffer.EIf the file is already open, just switch to the corresponding buffer.YNeed to clean up semantics for when buffers exist, and how to attach windows to buffers.Yi.FileC module re-exports this, you probably want to import that instead.KIn case of a decoding failure, failure message is returned instead of the .Execute the operationsQPass the list of remaining operations down, insert new ops at the head if needed,Delete a list of file in the given directory GAsk for confirmation, if yes, perform deletions, otherwise showNothingbConfirmation is required for recursive deletion of non-empty directry, but only the top level oneBShow the number of successful deletions at the end of the excutionZTODO: ask confirmation for wether to remove the associated buffers when a file is removedUWrite the contents of the supplied directory into the current buffer in dired formatNReturns a tuple containing the textual region (the end of) which is used for clickK detection and the FilePath of the file represented by that textual regionXReturn a List of (prefix, fullDisplayNameIncludingSourceAndDestOfLink, style, filename)?Return dired entries for the contents of the supplied directory Needed on Mac OS X 10.4!Needed on Mac OS X 10.4"Generic mark toggler.#!Delete all the keys from the map.$NRemoves mark from current file (if any) and moves in the specified direction.%Tmove selected files in a given directory to the target location given by user inputif multiple source then if target is not a existing dir then error else move source files into target dir else if target is dir then if target exist then move source file into target dir else if source is dir and parent of target exists then move source to target else error else if parent of target exist then move source to target else error&Tcopy selected files in a given directory to the target location given by user inputhaskCopyFiles follow the same logic as askRenameFiles, except dir and file are done by different DiredOP'jExtract the filename at point. NB this may fail if the buffer has been edited. Maybe use Markers instead.t()opq*+     ,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ~RSTUVWXYZ ![\]^"euniversal argument, usually indicating whether to mark or unmark. Here Just &  is taken as unmark.Picks which entries to consider7Character used for marking. Pass garbage if unmarking._`a#bc$$Direction to move in after unmarkingdef%&ghij'klm~~F()opq*+     ,-./0123456789:;<= >?@ABCDEFGHIJKKKKKKKLMNOPQ~RSTUVWXYZ ![\]^"_`a#bc$def%&ghij'klm6GPL-2yi-devel@googlegroups.com experimentalportableNone0[ Tries to open a new buffer with ~@ and runs the given action on the buffer handle if it succeeds.If the ~, fails, just the failure message is printed.Same as openingNewFile with no action to run after.*Revert to the contents of the file on diskaTry to write a file in the manner of vi/vim Need to catch any exception to avoid losing bindings4Try to write to a named file in the manner of vi/vimGTry to write to a named file if it doesn't exist. Error out if it does.FWrite current buffer to disk, if this buffer is associated with a file=Write a given buffer to disk if it is associated with a file. Write current buffer to disk as f. The file is also set to f.Write all open buffersMake a backup copy of file=Associate buffer with file; canonicalize the given path name.Checks if the given buffer deserves a save: whether it's a file buffer and whether it's pointing at a file rather than a directory.nkIs there a proper file associated with the buffer? In other words, does it make sense to offer to save it?opqrn~~opqrn7GPL-2yi-devel@googlegroups.com experimentalportableNone0I[s%Cached dictioary for describeNameImplt*Cached variable for getAllNamesInScopeImpl2Config variable for customising the behaviour of  and .Set this variable using . See  ghciEvaluator and finiteListEvaluator for two implementation.implementation of implementation of Sdescribe named action (or at least its type.), simplest implementation is at least return.(Runs the action, as written by the user.CThe behaviour of this function can be customised by modifying the  variable.,Lists the action names in scope, for use by , and help index.CThe behaviour of this function can be customised by modifying the  variable.0Describes the named action in scope, for use by help.CThe behaviour of this function can be customised by modifying the  variable.The evaluator to use for  and .4Accessor for the published actions. Consider using .hPublish the given action, by the given name. This will overwrite any existing actions by the same name.REvaluator based on a fixed list of published actions. Has a few differences from  ghciEvaluator:expressions can't be evaluated)all suggested actions are actually valued@(related to the above) doesn't contain junk actions from Prelude1doesn't require GHCi backend, so uses less memory,Jumps to specified position in a given file.u'Regex parsing the error message format.v}Parses an error message. Fails if it can't parse out the needed information, namely filename, line number and column number.w7Tries to parse an error message at current line using v.1Tries to jump to error at the current line. See w.xTries to strip the y from the front of the given ?. If the prompt is not found, returns the input command as-is.%z{|s}t~Filename to make the jump in.Line to jump to.Column to jump to.uvwyxz{|s}t~uvwyx18GPL-2yi-devel@googlegroups.com experimentalportableNone0I6Dynamic YiVariable to store the help buffer reference.BDisplays help for a given name, or help index, if no name is given4Finds help text to display, given a command argument(Display help buffer with a given text...GPL-2yi-devel@googlegroups.com experimentalportableNone0I[EGlobal searching. Search for regex and move point to that position. Nothing* means reuse the last regular expression. Just s means use sP as the new regular expression. Direction of search can be specified as either Backward or Forwardi (forwards in the buffer). Arguments to modify the compiled regular expression can be supplied as well.Set up a search.Do a search, placing cursor at first char of pattern, if found. Keymaps may implement their own regex language. How do we provide for this? Also, what's happening with ^ not matching sol?2Search and Replace all within the current region. Note the region is the final argument since we might perform the same search and replace over multiple regions however we are unlikely to perform several search and replaces over the same region since the first such may change the bounds of the region.,Peform a search and replace on the selection6Replace a string by another everywhere in the document'Search and replace in the given region.If the input boolean is True, then the replace is done globally, otherwise only the first match is replaced. Returns the number of replacements done.OSearch and replace in the region defined by the given unit. The rest is as in .4Create a SearchExp that matches exactly its argument&Succesfully finish a search. Also see .Cancel a search. Also see . Wrapper over x that passes through the action and accepts the search as successful (i.e. when the user wants to stay at the result). Wrapper over  that passes through the action and marks the search as unsuccessful (i.e. when the user wants to jump back to where the search started).DEditor action describing how to end finish incremental search. The act parameter allows us to specify an extra action to run before finishing up the search. For Vim, we don't want to do anything so we use [ which just does nothing. For emacs, we want to cancel highlighting and stay where we are. Specialised  to do nothing as the action.DFind the next match and select it. Point is end, mark is beginning.&Replace all the remaining occurrences.Exit from query/replace.IWe replace the currently selected match and then move to the next match.This may actually be a bit more general it replaces the current selection with the given replacement string in the given window and buffer.-Nothingh means used previous pattern, if any. Complain otherwise. Use getRegexE to check for previous patterns"Flags to modify the compiled regexBackward or ForwardThe string to search forThe string to replace it withThe region to perform this overtext to search fortext to replace it with& & )9GPL-2yi-devel@googlegroups.com experimentalportableNone The only built in mode of yi Creates a  from a ( and a function that turns tokens into .Specialised version of * for the common case, wrapping up into a  with .HDetermines if the file's extension is one of the extensions in the list..When applied to an extensions list, creates a HI function.NWhen applied to an extensions list and regular expression pattern, creates a HI function.tGenerate a parser for shebang patterns the generated parser will match only if the shebang is at the start of a lineExamples shebangParser "runhaskell"generates a parser that matches "#!/usr/bin/env runhaskell\n" (but also "djsjfaj\n\n\n\r\n#! /usr/bin/env runhaskell \ndkasfkda\n\r\nkasfaj")Note: You can get ("runhaskell" :: Parser String)) by using the OverloadedStrings extension shebangParser "python"9generates a parser that matches "#!/usr/bin/env python\n"Note:Q it doesn't match "#!/usr/bin/env python2\n" (that's why the newline is required)0It is also possible to use more complex parsers: 0shebangParser ("python" *> ("2" <|> "3" <|> ""))'generates a parser that matches any of:"#!/usr/bin/env python\n""#!/usr/bin/env python2\n""#!/usr/bin/env python3\n"+Adds a hook to all matching hooks in a list0Apply a list of mode hooks to a list of AnyModessCheck whether a mode of the same name is already in modeTable and returns the original mode, if it isn't the case. Starting stateList of extensionsPath to compare against)File contents. Currently unused but see .   :GPL-2yi-devel@googlegroups.com experimentalportableNone;GPL-2yi-devel@googlegroups.com experimentalportableNone1TODO: we're just converting back and forth here, 3 and friends need to migrate to YiString it seems.1Open a new buffer for interaction with a process.Uopen a new buffer for interaction with a process, using any interactive-derived mode$Send the type command to the processSend command, recieve reply    <GPL-2yi-devel@googlegroups.com experimentalportableNone0IQR qChanging the buffer name quite useful if you have several the same. This also breaks the relation with the file."shell-command with argument prompt#shell-command with a known argumentcabal-configurenRun the given commands with args and pipe the ouput into the build buffer, which is shown in an other window.4Run the given command with args in interactive mode.Select  or % based on stack or cabal command name cabal-build'Search the source files in the project.Perform a find+grep operation stack-build=NoneList of published Actions    JGPL-2yi-devel@googlegroups.com experimentalportableNonelmnopqrstuvwxyz{|}~      QRSTUVWXYZ[\]^_dab`cefghijlkmnopqrs     "#$<=>?@ABCDGHJIKLMNOPQRSTUVWXYZ[\`]^_abcdefghilmnopqrs      !"#$%&'-./0123456789:;<=>?@ABCDEFGHIJKLNMOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*5789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-`abcdefghijklmn~ >GPL-2yi-devel@googlegroups.com experimentalportableNoneOTyAdds the given key bindings to the `global keymap'. The bindings will override existing bindings in the case of a clash.modeBindKeys mode keys adds the keybindings in keys% to all modes with the same name as mode.As with , a mode by the given name must already be registered, or the function will have no effect, and issue a command-line warning.modeBindKeysByName name keys adds the keybindings in keys to all modes with name name( (if it is registered). Consider using  instead.NRegister the given mode. It will be preferred over any modes already defined.modifyMode mode f+ modifies all modes with the same name as mode, using the function f.Note that the mode argument is only used by its . In particular, a mode by the given name must already be registered, or this function will have no effect, and issue a command-line warning.  mode f =  ( mode) fmodifyModeByName name f modifies the mode with name name using the function f. Consider using  instead. the font name, or r for default. the font size, or r for default.6Amount to move the buffer when using the scroll wheel. the scroll style, or r for default.See  for documentation.(Which side to display the scroll bar on.Should the scroll bar autohide?Should the tab bar autohide?Should lines be wrapped?oThe character with which to fill empty window space. Usually '~' for vi-like editors, ' ' for everything else.UI colour theme._List of registered layout managers. When cycling through layouts, this list will be consulted. 2Produce a .yi.dbg file with debugging information?!bRun when the editor is started (this is run after all actions which have already been registered)List version of !."~Run after the startup actions have completed, or on reload (this is run after all actions which have already been registered)List version of ".#;Actions to run when the editor is started. Consider using ! or  instead.$8Actions to run after startup or reload. Consider using " or  instead.%Default keymap to use.&?'5List of modes by order of preference. Consider using , , or  instead.(Set to 6 for an emacs-like behaviour. Consider starting with defaultEmacsConfig, defaultVimConfig, or defaultCuaConfig to instead.)Set to Fl for an emacs-like behaviour, where all deleted text is accumulated in a killring. Consider starting with defaultEmacsConfig, defaultVimConfig, or defaultCuaConfig instead.*?%    !"#$%&'()*lmnopqrstuvwxyz{|}~ <=>?@ABCDEFGHIJKLMNOPQRSTUXWVYZ[\]^_`abcdefghijklm     BDCQRSTUVWXYZ[\]^_dab`cefghijlkmnopqrs     "#$<=>?@ABCDGHJIKLMNOPQRSTUVWXYZ[\`]^_abcdefghilmnopqrs      !"#$%&'-./0123456789:;<=>?@ABCDEFGHIJKLNMOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&+,5789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-`abcdefghijklmn~     !"#$%&'()*.,+BCD    !"#$%&'()*#    !"#$%&'()*?GPL-2yi-devel@googlegroups.com experimentalportableNone05:I /@local name of the tag file TODO: reload if this file is changed0>path to the tag file directory tags are relative to this path1map from tags to files2trie to speed up tag hinting8TFind the location of a tag using the tag table. Returns a full path and line number9iSuper simple parsing CTag format 1 parsing algorithm TODO: support search patterns in addition to lineno:"Read in a tag file from the system;>Gives all the possible expanded tags that could match a given prefix<0Extends the string to the longest certain length=Set a new TagTable>Reset the TagTable?&Get the currently registered tag table+,-./0123456789:;<=>?@AB-./0123456789:;<=>?8:;<3457-./012?=>69+,-./0123456789:;<=>?@AB@GPL-2yi-devel@googlegroups.com experimentalportableNone0IWord completion[when doing keyword completion, we need to keep track of the word we're trying to complete.LSwitch out of completion mode.MqTry to complete the current word with occurences found elsewhere in the editor. Further calls try other options.IJKLMExtract functionSource functionMessage functionPredicate matcherNOPQRSTU IJKLMNOPQR QPONMLRIJKIJKLMNOPQRSTUKLMNOPNOQNORNOSNOSNTUNTVNTWNTXNTYNZ[\\]^_`abcdefghijklmnopqrstuvwxyz { | } ~                                       !"#$%&'()*+,-./0123456789:;<==>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~AAAAAAAAAAAAAAAAAAAAAAAAe      !"#$%&&'()*+,-./012345667889:;<=>?@ABCDEFGGHIJHHKILMNOPQRSTUVWWXXYZ[\]^^_`abcdefghijklmnopqrsttuvwxyyz{|}}~JJ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!!!!!! !!!"!#!$!%!&"'"(")"*"+","-"."/"0"1"2#3#4#5#6#7#8#9#:#;$<$=$>$?$@$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&Z&[&\&]&^&_&`&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'{'|'}'~''''''''''''''''''''''''''''''''''''''''''''''''''''((((((()))********************b**+++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--- ------------ - - - - ------......./////0 0!0"0#0$0%0&0'0(0)0*0+0,0-0.0/000102030415161718191:1;1<1=1>1?1@2A2B2C2D2E2F2G2H2I2J2K2L2M2N2O2a3P3P3Q3R3S3T3U3V3W3X3Y3Z3[3\3]3^3_3`3a3b3c3d3e3f3g3h3i3j3k3l3m3n3o3p3q3r3s3t3u3v3w3x3y3z3{3|3}3~33444444444444444555555555555555555555555666666666666666677777777777777777777777777888899999999999:;;;;;; ; ; ; ; ;;<<<<<<<<<<<<<<<<<< <!<"<#<$<%<&<'=(>)>*>+>,>->.>/>>0>1>2>3>4>5>6>7>8>9>:>;>><>=>>>>>>?>@>A>B>?C?D?E?E?F?G?H?I?J?J?K?L?M?N?O?P?Q?R?S?T?U?V?W?X?Y?Z?[?\?]?^@_@`@a@b@c@d@e@f@g@h@i@j@k@l@m@n@oppqrstuvwxyz{v|}~~~~vv       vv                 iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANNNNNN      !"#$%&'()*+,-./01233456789:;<=>?@BABBBCBDCECFCGDHDIDJDKDLvMNDOPQRSTU~V~WXYZ[\]^_`abcdefghijklmnopqrstuvwxyNz{Nz|Nz}Nz~NzNzNzNzNzNzNzNzNzNzNzNzNzNzNzvRS!!!!!!v!!!!!!!!!!!!!""""""v"""NNNNNNNNNNNNNNvN''''''''''''''''yy*****/1111111111111112222222222222223333333333 3 3 4 4 4455555555555555555 5!5"5#5$5%5&5'5(5)5*5+5,5-5.5/5051525253535455565758595:5;5<5<5=5>5?5@5A5B5C5D5E5F5G5H5I5J5K5L5M5N5O5P5Q5R5S5T5U5V5W5X5Y5Z5[5\5]5^5_5`5a5b5c5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5s5t6u6v6v6w6x7y7z7{7|7}7~77777y7z77888889NONNO==NNNNNNNNNNNNNNNNNNNNNNNNNNNNN^N^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNv>>>>>??????@@@@@@@@%yi-core-0.17.1-JFYgzEg2fDKGhpDb6eekq5Yi.MonadYi.IncrementalParseYi.Buffer.Misc Yi.Search Yi.Completion Yi.UI.CommonYi.Syntax.Layout Yi.StringYi.Paths Yi.Layout Yi.KillRing Yi.JumpList Yi.WindowYi.Tab Yi.InteractYi.EventYi.DebugYi.Syntax.TreeYi.Syntax.DriverYi.Config.MiscYi.CompletionTree Yi.BufferYi.Buffer.Undo Paths_yi_coreParser.IncrementalYi.Syntax.OnlineTreeSystem.FriendlyPath Yi.ProcessYi.TypesYi.Buffer.RegionYi.Buffer.TextUnitYi.Buffer.NormalYi.Buffer.HighLevelYi.Buffer.Indent Yi.UI.UtilsYi.Config.Lens Yi.ConfigYi.Config.Simple.Types Yi.Editor Yi.RectangleYi.Search.InternalYi.UI.SimpleLayout Yi.UI.TabBar Yi.History Yi.Keymap Yi.HoogleYi.HooksYi.Keymap.KeysYi.PersistentStateYi.Core Yi.MiniBufferYi.MiscYi.DiredYi.FileYi.EvalYi.Command.HelpYi.Mode.CommonYi.Mode.CompilationYi.Mode.Interactive Yi.CommandYi.Config.DefaultYi.Config.SimpleYi.TagYi.TextCompletionYi.Buffer.ImplementationData.DelayList Control.ExcSystem.CanonicalizePathTfilterIndentBehaviourMode modeAppliesYi mtl-2.2.1-BLKBelFsPB3BoFeSWSOYj6Control.Monad.State.Classgets)yi-language-0.17.1-5lxHGQmiwyQ9IEPXrOUnsp Yi.Lexer.AlexstPosn lookedOffsetstLexer AlexStateYi.Regex SearchExp QuoteRegex NoNewLine IgnoreCase SearchOptionYi.Utils commonPrefixUImainendsuspendrefreshuserForceRefreshlayout reloadProjectdummyUIState layoutHandler$fShowBlockOpen $fShowIStateshowTlistify commonTPrefixcommonTPrefix' capitalizecapitalizeFirstchomp dropSpaceisBlankfillTextoverInitoverTailunlines'lines'mapLinesonLinespadLeftpadRight getConfigDir getDataPath getConfigPathgetCustomConfigPathgetConfigFilenamegetConfigModulesgetArticleDbFilenamegetPersistentStateFilenamegetEvaluatorContextFilename getsAndModifywithwhenMmaybeM repeatUntilMassignusesLayoutM Transposed Transposable transposeHasNeighborWest RectanglerectXrectY rectWidth rectHeightAnyLayoutManager LayoutManager pureLayoutdescribeLayout nextVariantpreviousVariant RelativeSizeDividerPosition DividerRef Orientation HorizontalVerticalLayout SingleWindowStackPair orientationwinsdivPosdivRefpairFstpairSnddividerPositionA findDividerlayoutManagerSameTypetallwide slidyTall slidyWide hPairNStack vPairNStacklayoutToRectangles singleWindowpairstack evenStack runLayoutM$fLayoutManagerTransposed$fTransposableLayout$fTransposableOrientation$fLayoutManagerVPairNStack$fLayoutManagerHPairNStack$fLayoutManagerSlidyWide$fLayoutManagerSlidyTall$fLayoutManagerWide$fLayoutManagerTall$fDefaultAnyLayoutManager$fLayoutManagerAnyLayoutManager$fEqAnyLayoutManager$fDefaultLayout $fShowLayout$fEqOrientation$fShowOrientation $fEqLayout$fFunctorLayout$fEqTall$fEqWide $fEqSlidyTall$fEqHPairNStack $fEqRectangle$fShowRectangle$fEqTransposed$fEqVPairNStack $fEqSlidyWideKillring _krKilled _krContents$fBinaryKillring$fShowKillring $fEqKillring krContentskrKilled krLastYankkrEmptykrEndCmdkrPutkrSetkrGetJumpjumpMark jumpBufferRefJumpListaddJumpjumpBack jumpForward $fShowJump $fBinaryJump $fGenericJumpWindowisMinibufkey bufAccessListheightwidth winRegionwkey actualLinesjumpList actualLinesAbufAccessListAbufkeyAheightAisMiniA jumpListAwidthA winRegionAwkeyAwinkey dummyWindow $fEqWindow $fShowWindow$fBinaryWindowTabtkey tabLayoutTabReftabFocustabMiniWindows tabWindowsAtabLayoutManagerAtabDividerPositionA mapWindowsforceTabtabFoldlmakeTabmakeTab1 $fShowTab$fEqTab $fBinaryTab InteractState AmbiguousWaitingDeadRunningPEndChainI MonadInteractwrite eventBoundsadjustPriority deprioritize<||||> importantacceptedrunWriteprocessOneEvent computeStateoneOfanyEvent eventBetweeneventeventschoiceoption mkAutomaton idAutomaton$fShowP$fMonoidInteractState$fMonadInteractIwevent $fMonadPlusI$fMonadI$fAlternativeI$fApplicativeI $fFunctorI$fMonadInteractStateTweEventKeyKEscKFunKPrtScrKPauseKASCIIKBSKInsKHomeKPageUpKDelKEnd KPageDownKNP5KUpKMenuKLeftKDownKRightKEnterKTabModifierMShiftMCtrlMMetaMSuperMHyper prettyEvent eventToChar $fShowEvent $fOrdEvent$fShowModifier $fEqModifier $fOrdModifier$fEqKey $fShowKey$fOrdKey $fEqEvent initDebugtraceerror logPutStrLnlogError logStreamtraceMtraceM_IsTreesubtreesuniplate emptyNode toksAfterallToks tokAtOrBefore toksInRegiontokenBasedAnnotstokenBasedStrokesfromNodeToFinalfromLeafToLeafAfter getLastPathgetAllSubTreesgetFirstElementgetLastElementgetFirstOffset getLastOffset subtreeRegionsepBysepBy1Cachepath cachedStatesrootfocusedPath mkHighlighterunzipFM zipWithFM ScrollStyle SnapToCenter SingleLineCompletionTreeunCompletionTreefromListcompleteupdatetoListpretty$fShowCompletionTree$fMonoidCompletionTree$fEqCompletionTree$fBinaryCompletionTree MarkValue markPoint markGravityUIUpdate TextUpdate StyleUpdateUpdateInsertDelete updatePointupdateDirection_insertUpdateString_deleteUpdateStringOverlay overlayOwner overlayBegin overlayEnd overlayStyleoverlayAnnotation markGravityAA markPointAAupdateIsDelete mkOverlayURListChangeInteractivePoint AtomicChangeemptyU addChangeUdeleteInteractivePointsUsetSavedFilePointUundoUredoUisAtSavedFilePointU$fBinaryURList$fBinaryChange $fShowChange$fGenericChange $fShowURList$fGenericURListversion getBinDir getLibDir getDataDir getLibexecDir getSysconfDirgetDataFileNameProcessLogEntryLLogLEmptyLDislikeLShiftLDoneLFailLSuspLSParserLookYuckEnterprofile countWidthsymboleoffeedZevalLevalL'pushSymspushEof mkProcessruntestNextlookNext recoverWithevalRfullLog $fShowZip $fMonadParser$fAlternativeParser$fApplicativeParser$fFunctorParser $fShowRPolish $fShowSteps$fShowProfileF$fFunctorProfileF$fShowLogEntryscannerTreeBinLeafTipmanyToks $fIsTreeTree $fShowTree $fFunctorTree$fFoldableTree$fTraversableTreeuserToCanonPath expandTilda isAbsolute'SubprocessInfoprocCmdprocArgs procHandlehInhOuthErrbufRefseparateStdErr SubprocessIdrunProgCommand shellFileNamerunShellCommandcreateSubprocess readAvailable RegionStyleLineWise Inclusive ExclusiveBlockConfig startFrontEndconfigUI startActionsinitialActions defaultKmconfigInputPreprocess modeTable debugModeconfigRegionStyleconfigKillringAccumulate%configCheckExternalChangesObsessivelybufferUpdateHandlerlayoutManagers configVars CursorStyle AlwaysFatNeverFatFatWhenFocusedFatWhenFocusedAndInsertingUIBootUIConfigconfigFontNameconfigFontSizeconfigScrollStyleconfigScrollWheelAmountconfigLeftSideScrollBarconfigAutoHideScrollBarconfigAutoHideTabBarconfigLineWrapconfigCursorStyleconfigWindowFill configTheme MonadEditoraskCfg withEditor withEditor_EditorM fromEditorMEditor bufferStackbuffers refSupplytabs_dynamic statusLinesmaxStatusHeightkillring currentRegexsearchDirection pendingEventsonCloseActionsStatusesStatus IncreaseCycle DecreaseCycle IncreaseOnly DecreaseOnlymodeNamemodeHL modePrettify modeKeymap modeIndent modeFollowmodeIndentSettingsmodeToggleCommentSelectionmodeGetStrokes modeOnLoad modeModeLinemodeGotoDeclarationAnyModeSelectionStylehighlightSelectionrectangleSelectionBufferId MemBuffer FileBuffer Attributesidentbkey__undos bufferDynamic preferCol preferVisCol stickyEolpendingUpdatesselectionStyle keymapProcesswinMarkslastActiveWindow lastSyncTimereadOnly insertingdirectoryContentpointFollowsWindowupdateTransactionInFlightupdateTransactionAccumfontsizeVariation updateStreamMarkSetfromMarkinsMarkselMarkWinMarksFBufferbmoderawbuf attributesIndentSettings expandTabstabSize shiftWidthBufferM fromBufferM KeymapSet topKeymap insertKeymapYiMrunYiMYiVaryiEditoryiSubprocessIdSupplyyiSubprocessesyiUiyiInputyiOutputyiConfigyiVarIsRefreshNeeded MustRefreshNoNeedToRefresh KeymapProcess KeymapEndoKeymapKeymapMInteractYiConfigVariable YiVariableActionYiAEditorABufferA emptyActionunsafeWithEditorextractTopKeymap runEditor$fYiVariableRegionStyle$fDefaultRegionStyle$fBinaryRegionStyle$fMonadEditorEditorM$fBinarySelectionStyle$fBinaryBufferId$fBinaryAttributes$fBinaryMarkSet $fEqFBuffer$fApplicativeBufferM$fMonadEditorYiM$fMonadStateEditorYiM $fShowAction $fEqAction$fShowIsRefreshNeeded$fEqIsRefreshNeeded$fEqIndentSettings$fShowIndentSettings$fTraversableMarkSet$fFoldableMarkSet$fFunctorMarkSet $fShowMarkSet$fShowBufferId $fEqBufferId $fOrdBufferId$fShowSelectionStyle$fEqIndentBehaviour$fShowIndentBehaviour$fEqRegionStyle$fShowRegionStyle$fMonadEditorM$fApplicativeEditorM$fMonadStateEditorM$fMonadReaderEditorM$fFunctorEditorM$fMonadBufferM$fFunctorBufferM$fMonadStateBufferM$fMonadReaderBufferM $fMonadYiM$fApplicativeYiM$fMonadReaderYiM$fMonadBaseYiM $fFunctorYiMdirectoryContentAfontsizeVariationAidentA insertingAkeymapProcessAlastActiveWindowA lastSyncTimeApendingUpdatesApointFollowsWindowA preferColA readOnlyA stickyEolAundosAshortIdentString identStringminiIdentString clearSyntaxfilehighlightSelectionArectangleSelectionAincreaseFontSizedecreaseFontSize getModeLine getPercent queryBuffer addOverlayBgetOverlaysOfOwnerB delOverlayBdelOverlaysOfOwnerBisPointInsideOverlay runBuffergetMarks runBufferFull getMarkValueBnewMarkB deleteMarkBrunBufferDummyWindow markSavedBbkeyisUnchangedBufferstartUpdateTransactionBcommitUpdateTransactionBundoBredoBretroactivelyAtSavePointBmodeAlwaysAppliesmodeNeverApplies emptyModenewBsizeBpointBnelemsBstreamBindexedStreamBstrokesRangesBmoveTo setInserting applyUpdaterevertPendingUpdatesBwriteBwriteNnewlineB insertNAtinsertNinsertB deleteNAtcurLn screenTopLn screenMidLn screenBotLn markLinesgotoLnsetMode0 setAnyModesetMode modifyModeonMode withMode0 withModeB withSyntaxB focusSyntax withSyntaxB' regexRegionBregexB modifyMarkB setMarkHereBsetNamedMarkHereBsetVisibleSelectiongetVisibleSelectionaskMarksgetMarkB mayGetMarkBmoveNleftBleftNrightBrightN lineMoveRelmovingToPrefColmovingToPrefVisCol moveToColBmoveToLineColBpointOfLineColBforgetPreferCol savingPrefCollineUplineDownelemsBbetweenBreadBreadAtB replaceCharBreplaceCharWithBelowBreplaceCharWithAboveBinsertCharWithBelowBinsertCharWithAboveBdeleteNindentSettingsBcurColcolOflineOf lineCountB solPointB eolPointB gotoLnFrom getBufferDyn putBufferDynsavingExcursionB markPointA savingPointBsavingPositionBpointAtpointAfterCursorBdestinationOfMoveB askWindowwithEveryLineB $fBinaryMode$fBinaryFBuffer $fShowFBuffer$fHasAttributesFBuffer$fHasAttributesAttributes expandTabsA shiftWidthAtabSizeA modeAppliesA modeFollowAmodeGetStrokesAmodeGotoDeclarationAmodeHLA modeIndentAmodeIndentSettingsA modeKeymapA modeModeLineA modeNameA modeOnLoadA modePrettifyAmodeToggleCommentSelectionA winRegionB deleteRegionB readRegionBreplaceRegionB mapRegionB swapRegionsB modifyRegionBinclusiveRegionBblockifyRegion joinLinesB concatLinesBlinesOfRegionB BoundarySide InsideBound OutsideBoundTextUnit CharacterLineVLineDocumentGenUnitgenEnclosingUnitgenUnitBoundary outsideUnitunitWord unitDelimited isWordChar checkPeekB unitViWord unitViWORDunitViWordAnyBndunitViWORDAnyBndunitViWordOnLineunitViWORDOnLineisAnySepunitSepunitSepThisLine atBoundaryBunitEmacsParagraph unitParagraph unitSentenceleftBoundaryUnitgenAtBoundaryB numberOfBwhileBuntilB doUntilB_untilB_ doIfCharBgenMoveB genMaybeMoveBmoveB maybeMoveB transposeB transformBdeleteBregionWithTwoMovesB regionOfBregionOfNonEmptyB regionOfPartBregionOfPartNonEmptyBregionOfPartNonEmptyAtB readPrevUnitB readUnitBhalfUnit deleteUnitB$fEqBoundarySidegetRegionStyleputRegionStyleconvertRegionToStyleBmkRegionOfStyleBunitWiseRegionextendRegionToBoundariesBufferFileInfobufInfoFileName bufInfoSize bufInfoLineNo bufInfoColNo bufInfoCharNobufInfoPercentbufInfoModified moveToMTB moveToSol moveToEoltopBbotB leftOnEol moveXorSol moveXorEol nextWordB prevWordBgotoCharacterBnextCIncnextCInLineIncnextCExcnextCInLineExcprevCIncprevCInLineIncprevCExcprevCInLineExcfirstNonSpaceB lastNonSpaceBmoveNonspaceOrSolisCurrentLineEmptyBisCurrentLineAllWhiteSpaceBnextNParagraphsprevNParagraphsselectNParagraphsatSolatEolatSofatEof atLastLine getLineAndColgetLineAndColOfPointreadLnBhasWhiteSpaceBeforereadCurrentWordB readPrevWordBbdeleteB killWordB bkillWordB bdeleteLineBdeleteHorizontalSpaceBuppercaseWordBlowercaseWordBcapitaliseWordBswitchCaseChar deleteToEolswapBdeleteTrailingSpaceBsetSelectionMarkPointBgetSelectionMarkPointBexchangePointAndMarkB getBookmarkBbufInfoB upScreensB downScreensB upScreenB downScreenBscrollScreensB vimScrollB vimScrollByBscrollToCursorBscrollCursorToTopBscrollCursorToBottomBscrollBscrollToLineAboveWindowBscrollToLineBelowWindowBsnapInsB snapScreenB downFromTosB upFromBosBmiddleBgetRawestSelectRegionBgetSelectRegionBsetSelectRegionBdeleteBlankLinesB lineStreamB getNextLineBgetNextNonBlankLineBmodifyExtendedSelectionBlinePrefixSelectionBunLineCommentSelectionBtoggleCommentBreplaceBufferContent fillParagraph sortLinessortLinesWithRegionrevertBshapeOfBlockRegionBleftEdgesOfRegionBrightEdgesOfRegionB'splitBlockRegionToContiguousSubRegionsBdeleteRegionWithStyleBreadRegionRopeWithStyleBinsertRopeWithStyleBflipRectangleBmovePercentageFileBfindMatchingPairBincrementNextNumberByB isNumberB test3CharBtestHexBlineMoveVisRelmarkWord$fShowRelPositiontabB autoIndentB cycleIndentsB indentOfB indentToB modifyIndentBindentAsPreviousB indentAsNextB$indentAsTheMostIndentedNeighborLineBnewlineAndIndentBshiftIndentOfRegionBindentOfCurrentPosB applyHeights spliceAnnots strokePicture paintStrokes paintPictureattributesPictureBattributesPictureAndSelB arrangeItems arrangeItems'bufferUpdateHandlerA&configCheckExternalChangesObsessivelyAconfigInputPreprocessAconfigKillringAccumulateAconfigRegionStyleA configUIA configVarsA debugModeA defaultKmAinitialActionsAlayoutManagersA modeTableA startActionsAstartFrontEndAconfigAutoHideScrollBarAconfigAutoHideTabBarAconfigCursorStyleAconfigFontNameAconfigFontSizeAconfigLeftSideScrollBarAconfigLineWrapAconfigScrollStyleAconfigScrollWheelAmountA configThemeAconfigWindowFillAconfigVariable configStyleconfigFundamentalModeconfigTopLevelKeymapFieldConfigM runConfigMcustomVariable$fMonadConfigM$fFunctorConfigM$fApplicativeConfigM$fMonadStateConfigM$fMonadBaseConfigM emptyEditor$fBinaryEditorbuffersA currentRegexA killringAmaxStatusHeightAonCloseActionsApendingEventsAsearchDirectionA statusLinesAwindowswindowsAtabsAaskConfigVariableAstringToNewBuffer deleteBuffer bufferSetcommonNamePrefixgetBufferStack findBufferfindBufferWithfindBufferWithNamegetBufferWithNamewithGivenBufferwithGivenBufferAndWindowwithCurrentBufferwithEveryBuffercurrentWindowA currentBufferprintMsg printMsgs printStatus setStatus clrStatus statusLinestatusLineInfosetRegEgetRegE getEditorDyn putEditorDyn newBufferEnewEmptyBufferEalternateBufferE newWindowEswitchToBufferEswitchToBufferWithNameE closeBufferEgetBufferWithNameOrCurrentcloseBufferAndWindowEnextWinEprevWinEswapWinWithFirstEpushWinToFirstE moveWinNextE moveWinPrevE withWindowEfindWindowWithwindowsOnBufferE focusWindowEsplitElayoutManagersPrintMsgElayoutManagersNextElayoutManagersPreviousElayoutManagerNextVariantElayoutManagerPreviousVariantEsetDividerPosEnewTabEnextTabE previousTabEmoveTabE deleteTabE tryCloseE closeOtherEshiftOtherWindowwithOtherWindowacceptedInputsOtherWindow addJumpHereE addJumpAtE jumpBackE jumpForwardEnewTempBufferEisCasePrefixOf prefixMatchinfixUptoEndMatchsubsequenceMatchsubsequenceTextMatchcontainsMatch' containsMatchcontainsMatchCaseInsensitivecompleteInListcompleteInListCustomShowcompleteInList' getRectangle multiSplit onRectangle openRectanglestringRectangle killRectangle yankRectangle setRegexE resetRegexE getRegexESize2D sizeWidth sizeHeightPoint2DpointColpointRowRectoffsetXoffsetYsizeXsizeY tabbarRect windowRects promptRectcoordsOfCharacterBverticalOffsetsForWindows TabBarDescrTabDescrtabText tabInFocus tabBarDescrtabAbbrevTitle$fShowTabDescr $fEqTabDescrHistory_historyCurrent_historyContents_historyPrefix HistoriesdynKeyA miniBuffer historyUp historyDown historyStarthistoryStartGen historyFinishhistoryFinishGen historyFind historyMovehistoryMoveGenhistoryPrefixSethistoryPrefixSet' setHistory$fYiVariableHistories$fBinaryHistory$fDefaultHistory$fDefaultHistories$fBinaryHistories $fShowHistory $fEqHistory$fShowHistories $fEqHistoriesYiAction makeActionwithUI readEditor catchDynE catchJustE handleJustE$fYiActionAction()$fYiActionBufferMx$fYiActionEditorMx$fYiActionYiMx $fYiActionIOx insertKeymapA topKeymapAmodelessKeymapSet withModeY yiEditorAyiSubprocessIdSupplyAyiSubprocessesA yiConfigAyiInputA yiOutputAyiUiAyiVarA caseSensitizegv hoogleRawhoogleFunctionshoogleFunModulehoogle hoogleSearchHookTyperunHook$fHookType(->) $fHookTypeYiM$fHookTypeEditorM printableChartextCharpStringcharOfshiftctrlmetasuperhypercharctrlChmetaChhyperChoptModspec>>!>>=!?>>?>>!?*>>?*>>!#$fYiConfigVariableMaxHistoryEntries$fDefaultMaxHistoryEntries$fBinaryPersistentState$fGenericPersistentState$fBinaryMaxHistoryEntriesmaxHistoryEntries"$fYiConfigVariablePersistentSearch$fDefaultPersistentSearch$fBinaryPersistentSearchpersistentSearchsavePersistentStateloadPersistentState startEditor quitEditorquitEditorWithExitCodefocusAllSyntax refreshEditor suspendEditorrunProcessWithInput runAction errorEditor closeWindowcloseWindowEmacsonYiVarstartSubprocess sendToProcess withSyntaxCommandArgumentsFilePatternTagRegexTagToKill LineNumber:::DocfromDocpromptingForBuffer commentRegionspawnMinibufferEwithMinibuffer mkCompleteFnsimpleCompleteinfixComplete' infixCompletenoHintnoPossibilitieswithMinibufferFreewithMinibufferGenwithMinibufferFin anyModeNameanyModeByNameM anyModeByNamegetAllModeNamesmatchingBufferNames$fPromptableCommandArguments$fDocTypeFilePatternTag$fDocTypeRegexTag$fDocTypeToKill$fDocTypeLineNumber$fPromptable::: $fShow:::$fYiAction(->)x$fPromptableBufferRef$fPromptableAnyMode$fPromptablePoint$fPromptableTextUnit$fPromptableDirection$fPromptableYiString$fPromptableText$fPromptableInt$fPromptableChar$fPromptable[]$fEq:::$fNum::: $fIsString:::$fShowCommandArguments$fEqCommandArgumentsgetAppropriateFiles getFoldermatchingFileNames placeMark selectAll adjIndent promptFilepromptFileChangingHints matchFile completeFilecdpwd rot13CharprintFileInfoEdebugBufferContent$fYiVariableDiredOpState$fBinaryDiredOpState$fDefaultDiredOpState$fShowDiredOpState$fEqDiredOpState$fGenericDiredOpState$fShowDiredFileInfo$fEqDiredFileInfo$fGenericDiredFileInfo$fShowDiredEntry$fEqDiredEntry$fGenericDiredEntry$fShowDiredState$fEqDiredState$fGenericDiredStateeditFiledireddiredDirdiredDirBuffer$fBinaryDiredFileInfo$fBinaryDiredEntry$fYiVariableDiredState$fDefaultDiredState$fBinaryDiredState$fYiConfigVariablePreSaveHooks$fDefaultPreSaveHooks preSaveHooksopeningNewFile openNewFilerevertEviWrite viWriteTo viSafeWriteTofwriteE fwriteBufferE fwriteToE fwriteAllYbackupE setFileName deservesSave EvaluatorexecEditorActionImplgetAllNamesInScopeImpldescribeNamedActionImplexecEditorActiongetAllNamesInScopedescribeNamedAction evaluator$fDefaultPublishedActions$fYiVariableHelpCache$fDefaultHelpCache$fYiVariableNamesCache$fDefaultNamesCache$fBinaryNamesCache$fBinaryHelpCache$fMonoidPublishedActionspublishedActions publishActionpublishedActionsEvaluatorjumpToE jumpToErrorE consoleKeymap$fYiConfigVariableEvaluator$fDefaultEvaluator"$fYiConfigVariablePublishedActionsdisplayHelpFor$fYiVariableHelpBuffer$fDefaultHelpBuffer$fBinaryHelpBuffer SearchResult PatternFoundPatternNotFound SearchWrapped SearchMatchdoSearch searchInitcontinueSearchsearchReplaceRegionBsearchReplaceSelectionB replaceStringsearchAndRepRegion0searchAndRepRegionsearchAndRepUnit isearchInitEisearchIsEmpty isearchAddEmakeSimpleSearch isearchDelEisearchHistory isearchPrevE isearchNextE isearchWordEisearchFinishEisearchCancelEisearchFinishWithEisearchCancelWithEqrNext qrReplaceAllqrFinish qrReplaceOne$fYiVariableIsearch$fDefaultIsearch$fBinaryIsearch$fEqSearchResult $fShowIsearchTokenBasedModefundamentalModelinearSyntaxMode styleModeextensionMatches anyExtensionextensionOrContentsMatch shebangParser hookModesapplyModeHooks lookupModemode interactIdinteractHistoryMoveinteractHistoryFinishinteractHistoryStartgetInputRegiongetInputsetInput spawnProcessspawnProcessMode feedCommand queryReply CabalBuffer cabalBufferchangeBufferNameE shellCommandE shellCommandVcabalConfigureE configureExitreloadProjectEbuildRuninteractiveRun selectRunner makeBuildcabalRunmakeRun cabalBuildE makeBuildEshell searchSourcesgrepFind stackCommandEstackRun$fYiVariableCabalBuffer$fDefaultCabalBuffer$fBinaryCabalBuffer defaultConfigSideLeftSide RightSideglobalBindKeys modeBindKeysmodeBindKeysByNameaddModemodifyModeByNamefontNamefontSizescrollWheelAmount scrollStyle cursorStyle scrollBarSideautoHideScrollBarautoHideTabBarlineWrap windowFillthemedebug runOnStartuprunAfterStartupinputPreprocessmodes regionStylekillringAccumulate$fYiConfigVariableTagsFileList$fDefaultTagsFileListTagTable tagFileName tagBaseDir tagFileMaptagCompletionTreeTag_unTag tagsFileListunTag' lookupTag readCTagsimportTagTablehintTags completeTagsetTags resetTagsgetTags$fBinaryTagTable$fYiVariableTags $fDefaultTags $fShowTag$fEqTag$fOrdTag $fBinaryTag$fGenericTagTable $fBinaryTagsCompletionScopeFromCurrentBufferFromAllBuffers resetCompletemkWordCompletewordCompleteString'wordCompleteString wordComplete' wordComplete completeWordB$fYiVariableCompletion$fDefaultCompletion$fBinaryCompletion$fShowCompletion$fEqCompletion$fEqCompletionScope$fShowCompletionScopeIState BlockOpenIndentParenisParenmaxPosnbaseGHC.Showshow#text-1.2.2.2-KC7dWoG09dA1F6jKj5GSqhData.Text.InternalText Text.Readread#yi-rope-0.10-B9WFkEstA3bFxPFAt2NLo7Yi.Ropeinitlasttailhead Data.OldListunlineslinesappUserDataCond HPairNStack SlidyWide SlidyTallWideTallGHC.BaseidNothing VPairNStack splitList handleStackpush _krAccumulate _krLastYank krAccumulatemaxDepthmodifyJumpList tabWindowstabLayoutManager buildLayout relayoutIfrelayout pushEvent findWritesGetFailWritePriorBestReturnsBindsGetsFailsWritesPriorityPlus pullWrites remapChar ctrlLowcasesetMetametaBit dbgHandlelogStreamThreadpruneNodesBefore firstThatlastThatfromLeafAfterToFinalallLeavesRelative'nodesAndChildIndexallLeavesRelativeChild allLeavesIn getAllPathsgetSubtreeSpanNodeallLeavesRelative nodesOnPath beforeChild afterChildgoDownindexwalkDownwkDown nullSubtree getFirstTok getLastTok maximumBy'_unCompletionTreememmarkshlCacheoverlays dirtyOffsetnewBI insertChars deleteCharsshiftMarkValuesizeBInelemsBIgetIndexedStream overlayUpdate addOverlayBI delOverlayBIstrokesRangesBI isValidUpdate applyUpdateIreverseUpdateIlineAtsolPoint eolPoint' solPoint' regexRegionBI modifyMarkBIgetMarkDefaultPosBI BufferImpl FBufferData markNamesHLStateMarks dummyHlState updateString updateSize mapOvlMarks getStreamdelOverlaysOfOwnerBIgetOverlaysOfOwnerBIcharsFromSolBI newMarkBIgetMarkValueBIdeleteMarkValueBI getMarkBI setSyntaxBI touchSyntax updateSyntaxgetAstfocusAst$fBinaryUIUpdate$fBinaryUpdate$fBinaryBufferImpl $fShowOverlay $fOrdOverlay $fEqOverlay$fBinaryMarkValueYi.Buffer.Basic DirectionBackwardForwardMarkPointSizeundoInteractiveremIPaddIPundoUntilInteractiveasRedoSavedFilePointcatchIObindirlibdirdatadir libexecdir sysconfdirStepsbetterevalR'iBestfeedZipRPolishRPushRAppRStopProfileProfileFPSuspPFailPRes:>ValAppDoneShiftSh'SusDislikeLogPureApplBindShifEmptDisj:<top_restdislikeThreshold+>rightLogapplytoQtoPevalRPsimplifyonRight manyToks'subTree-? DelayListinsertdecreaseignoringExceptionprintingException orExceptioncanonicalizePath expandSym makeAbsolute combinePath splitPath Data.FoldableelemreplaceShorthandsshellCommandSwitch readChunkghc-prim GHC.TypesTrueconst2YiString singleton screenLines curVisColcolMove HasAttributes attributesAbkey__AbufferDynamicA preferVisColAselectionStyleA updateStreamAupdateTransactionAccumAupdateTransactionInFlightA winMarksA queryRawbuf modifyRawbufqueryAndModifyRawbufdefaultModeLine modifyBufferqueryAndModify getMarksRawgetMarkValueRawundoRedoepochcheckRO modifyMode0 withSyntax0 modifyMarkRaw getInsMark moveToVisColBreplaceCharWithVerticalOffsetmaybeCharBelowBmaybeCharAboveBmaybeCharWithVerticalOffset nextRegion Yi.RegionregionsOverlap regionIsEmptyincludedRegion nearRegioninRegion emptyRegion mkSizeRegion mkRegion'mkRegion unionRegionintersectRegion regionSize fmapRegion regionLast regionFirstRegionregionDirection regionStart regionEnd genBoundaryisEndOfSentence.checksFalsefirstTwo atBoundarydoUntilBisNlatViWordBoundaryatAnyViWordBoundaryatViWordBoundaryOnLineviWordCharTypeviWORDCharType atSepBoundary enclosingUnitreadPreviousOfLnB prevPointBindexOfSolAbovepointScreenRelPositiongetRawSelectRegionBgetMaybeNextLineBMaybegetNextLineWhichBtoggleCommentSelectionB fillRegionmodifyExtendedLRegion increment RelPositionAboveBelowWithin goUnmatchedBpointInWindowBlineMoveVisRelUplineMoveVisRelDownautoIndentHelperBfetchPreviousIndentsBlastOpenBracketHint spacingOfB rePadString countIndent GHC.UnicodeisSpace indentStringmakeIndentStringindentAsNeighborLineB directionElim mayReverse reverseDirmarkId BufferRef fromPointfromSize WindowRef unWindowRefStringYi.Style defaultStylenewZeroSizeWindowfixCurrentBufferA_ withLMStackE bufferStackAdynamicA refSupplyAtabs_A currentTabAnewRef newBufRef insertBuffer forceFold1 forceFoldTabs setTmpStatusacceptedInputsmodifyJumpListE Data.Text isPrefixOf toCaseFold bestMatch filterMatches isSingletonrectToRectanglerectangleToRect layoutWindowlastVisiblePointAndWrapCountBscanrT runHookImpl trimHistoriesreadPersistentStateMaxHistoryEntries_unMaxHistoryEntriesPersistentState histories aKillring aCurrentRegexPersistentSearch_unPersistentSearchunMaxHistoryEntriesunPersistentSearch interactive showErrorsdispatchcheckFileChangesclearAllSyntaxAndHideSelection msgEditorterminateSubprocessesappendToBufferstartSubprocessWatchers recoverMode postActionsshowEvsremoveSubprocess pipeToBuffer waitForExit typeGetPromptcompletionFunctionDocType PromptablegetPromptedValue getPrompt getMinibufferdoPromptgetPromptedValueListgetMinibufferListenumAll textUnits findFileHint forkActiononCharLetterCodedebugBufferContentUsing_diredOpSucCnt_diredOpForAll diredPath diredMarks diredEntriesdiredFilePoints diredNameCol diredCurrFile DiredEntries DiredEntry DiredFilePathDiredOpDORemoveBuffer DOConfirmDOCheck DOCkOverwriteDOInputDOChoice DOFeedbackDONoOp procDiredOp askDelFiles diredRefreshinsertDiredLinelinesToDisplay diredScanDir scanForUid scanForGid diredMarkKind deleteKeys diredUnmarkaskRenameFiles askCopyFiles fileFromPoint DiredOpState DiredState DiredFileDiredDir DiredSymLink DiredSocketDiredBlockDeviceDiredCharacterDeviceDiredNamedPipe DiredNoInfo DiredFileInfo permStringnumLinksownergrp sizeInBytesmodificationTimeString diredOpForAll diredOpSucCnt DORemoveFile DORemoveDir DOCopyFile DOCopyDirDORename DRStringsDRPermsDRLinksDROwnersDRGroupsDRSizesDRDatesDRFilesundrsdiredCurrFileA diredEntriesAdiredFilePointsA diredMarksA diredNameColA diredPathAbypassReadOnly filenameColOfresetDiredOpStateincDiredOpSucCntgetDiredOpStatemodDiredOpState diredDoDeldiredDoMarkedDel diredKeymap modeStringshortCalendarTimeToString diredMark diredMarkDeldiredMarkSymlinksdiredMarkDirectoriesdiredToggleAllMarksdiredMarkWithChardiredRefreshMarkdiredUnmarkPathdiredUnmarkAll currentDir diredRename diredCopy diredLoadnoFileAtThisLine markedFiles diredUpDirdiredCreateDir isFileBuffer PreSaveHooks_unPreSaveHooksunPreSaveHooks HelpCache NamesCache errorRegexparseErrorMessageparseErrorMessageB takeCommandpromptPublishedActions_publishedActions<&>_publishedActionsA HelpBufferhelpFordisplayHelpBuffer helpBufferisearchEndWith isearchEndqrReplaceCurrentIsearchmap3 makeISearch isearchFunE isearchNext0 isearchNextiSearchlinearSyntaxMode'Lexer StyleName commonLexerdefaultPublishedActions nilKeymap,oo-prototypes-0.1.0.0-FFAjhZi7GQPCsp4lfzgnLfData.Prototype.->override extractValueProto fromProtoYi.Style.Library darkBlueTheme defaultThemeTheme brightwhitewhitecyandarkcyanmagentapurplebluedarkblueyellowbrowngreen darkgreenreddarkred lightGreygreyblack colorToText withReverse withUnderlinewithItlcwithBdwithBgwithFgemptyAttributes foreground background reverseAttrbolditalic underlineStyleUIStylemodelineAttributesmodelineFocusStyletabBarAttributestabInFocusStyletabNotFocusedStylebaseAttributes selectedStyleeofStyle errorStyle hintStylestrongHintStyle commentStyleblockCommentStyle keywordStyle numberStylepreprocessorStyle stringStylelongStringStyle typeStyledataConstructorStyle importStyle builtinStyle regexStyle variableStyle operatorStyle quoteStylemakeFileActionmakeFileRuleHeadColorDefaultRGBJustrunManyOnStartuprunManyAfterStartupwarnisModeRegisteredensureModeRegistered TagsFileList_unTagsFileListTagsunTagsFileList CompletionveryQuickCompleteWordwordsAndCurrentWordwordsForCompletionInBufferwordsForCompletionwords' charClass