!"#$%&'()*+,-./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"{"|"}"~""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""######################$$$$$$$$$$$$$$$$$%%%%%&&&&&&&&''''''''''''''''''''''''' ' ' ' ' '''''((((()))))) )!)")#)$)%)&)')()))*)+),)-).)/*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-[-\.].^/_/`0a0b1c1d2e2f2g2h2i2j2k2l2m2n2o2p2q2r2s2t2u2v2w2x2y2z2{2|2}2~2222222222222222222222222222222222233333333333333333333333333333333333333333333333333333333333333333444444444444444444444444444444444444444 4 4 4 4 4444444444444444444 4!4"4#4$4%4&4'4(4)4*4+4,4-4.4/404142434455566768697:7;7<7=7>7?7@7A7B7C7D7E8F8G8H9I9J9K:L:M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z;[;\;]<^<_=`=a>b>c?d?e@f@gAhAiBjBkClCmDnDoDpDqDrDsDtDuDvDwDxDyDzD{D|D}D~DDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F F G G GGGGGGGGGGGGGGGGGHH H!H"H#H$H%H&H'H(H)H*H+H,H-H.H/H0I1I2I3I4I5I6I7I8I9I:J;J<J=J>J?J@KAKBKCLDLELFLGLHLILJLKLLLMLNLOLPLQLRLSLTLULVLWLXLYLZL[L\L]L^L_L`LaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLzL{L|L}L~LLLLLL                                                                                                                                          MMMMMMMMMMNNNNNNNNN N!N"N#N$N%N&N'N(N)N*O+O,O-O.O/O0O1O2O3P4P5P6P7P8P9P:P;P<P=P>P?P@PAPBPCQDQEQFQGQHQIQJQKQLRMRNRORPRQRRRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|S}T~UUUUUUUUUUUUUUUUUUVVVVVVVVVVVVVVVVVVVVVWWXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZZ[[[[[[[\\\\\\\]^^^^^^^^_`````````````````````````` ` ` ` ` ``````````````````` `!`"`#a$a%a&a'a(a)b*b+b,b-b.b/b0b1b2b3b4b5b6b7b8b9b:b;b<b=b>b?c@dAdBdCdDdEdFdGdHdIdJeKeLeMeNeOePeQeReSeTfUgVhWiXjYjZj[j\j]j^j_j`jajbjcjdkekflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzl{l|l}l~lmmmmmmmmmmmmnnnTTTTTTTTTTooooooooooooopqqqqqqqqqqqrstuvwxyz{|}}}}}}}}}}}}}}}}}}}}}}}}}~~~         W                   ! " # $ % & ' ( ) * + , - . / 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 { | } ~  S S  Safe-Inferred                                                     Safe-Inferred $Triples: (shorthand, name, unicode) c def ghcdefghcdghefc def ghNone  A blank Trie #Insert a new string into the trie. 2Take a list of String and compress it into a Trie >Take a trie and expand it into the strings that it represents 8Takes a trie and a prefix and returns the sub-trie that  of words with that prefix DFinds the longest certain path down the trie starting at a the root 3 Invariant Assumption: All paths have at least one true node below them :Helper function, finds all the suffixes of a given prefix WHelper function, finds the longest certain path down the trie starting at a given word !   "    #    $ !   "    #     !   "    #    $ Safe-Inferred jk % &lmno 'p (jklmnopjkmnolp jk % &lmno 'p ( Safe-Inferredu'Combination of the Control.Monad.State  ) and 3 }ORerun the monad until the boolean result is false, collecting list of results. qrstuvwxyz{|}~ * +3qrstuvwxyz{|}~qrst3~u|vyw}{zx qrstuvwxyz{|}~ * + Safe-Inferred ,Parser process Parser specification -KCompute 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. 0MPush a chunk of symbols or eof in the process. This forces some suspensions. 1Push some symbols. 2 Push eof 3Make a parser into a process. 4BRun 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. V 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 / 0 j k l 1 2 3 4 m n o p q r s t u v w x 5 < = > ? @ A B C D e f j k l 1 2 3 4 o p0 5 6 7 8 ; : 9 < D C B A @ ? > = E I H G F , S R Q P O N M L K J Y X W V U T Z [ \ ] ^ _ ` a b - c d e f g . h i / 0 j k l 1 2 3 4 m n o p q r s t u v w xNoneFSet the file to which debugging output should be written. Though this  is called initDebug. D 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 (). y z y zNone { | } ~   { | } ~   { | } ~   Safe-Inferred LSubtraction, but treat maxBound as infinity. i.e. maxBound -? x == maxBound     Safe-Inferred SExecute 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     Safe-Inferred Removes /./ // and /../ sequences from path,  doesn't follow symlinks .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 .. )Splits path into parts by path separator     Safe-Inferred "Canonicalize a user-friendly path XTurn a user-friendly path into a computer-friendly path by expanding the leading tilda. "Is a user-friendly path absolute?    None Guess what lib/exe the sourcefile belongs to. CFind a package description file in the given directory. Looks for  .cabal files.  Where to look  pkgname.cabal    Safe-Inferred    Safe-Inferred Safe-Inferred%Remove any trailing strings matching irs (input record separator)  from input string. Like perl' s chomp(1). Trim spaces at beginning and end  Inverse of . In contrast to b , this does # not add an empty line at the end.  Split a String in lines. Unlike  , this does not # remove any empty line at the end. 6A helper function for creating functions suitable for  modifySelectionB and  modifyRegionB. 8 To be used when the desired function should map across  the lines of a region.  Safe-Inferred5Given a path relative to application data directory, 4 this function finds a path to a given data file. >Given a path relative to application configuration directory, = this function finds a path to a given configuration file. $Get Yi master configuration script. AGet articles.db database of locations to visit (for Yi.IReader.) 7Get path to Yi history that stores state between runs. ?Get path to environment file that defines namespace used by Yi  command evaluator.  None The Foldable instance of   only defines foldMap , so the   needed for   is inefficient, V and can cause stack overflows. So, we roll our own (somewhat inefficient) version of   to avoid this. TGet the length of the string. (This information cached, so O(1) amortized runtime.) cCount the number of newlines in the strings. (This information cached, so O(1) amortized runtime.) 4Append two strings by merging the two finger trees. ,Split the string at the specified position. /Split the rope on a chunk, so that the desired < position lies within the first chunk of the second rope. ;Split before the specified line. Lines are indexed from 0. :Split after the specified line. Lines are indexed from 0. * "   None QThe default value. If a function tries to get a copy of the state, but the state  hasn't yet been created, 2 will be called to supply *some* value. The value 8 of initial will probably be something like Nothing, [], "", or  - compare  the mempty of  Data.Monoid. As ", but with O(n*log(n)) behaviour. ?As Map.adjust, but the combining function is applied strictly. EAs Map.alter, but the newly inserted element is forced with the map. Generalisation of   to arbitrary foldables. Alternative to groupBy.  9 groupBy' (\a b -> abs (a - b) <= 1) [1,2,3] = [[1,2,3]] whereas  : groupBy (\a b -> abs (a - b) <= 1) [1,2,3] = [[1,2],[3]] 5TODO: Check in ghc 6.12 release if groupBy == groupBy'. DLift an accessor to a traversable structure. (This can be seen as a  generalization of fmap) 0zipWith, generalized to Traversable structures. 4Return the longest common prefix of a set of lists. 1 P(xs) === all (isPrefixOf (commonPrefix xs)) xs E length s > length (commonPrefix xs) --> not (all (isPrefixOf s) xs) WFinds the first element satisfying the predicate, and returns a zipper pointing at it. Given a function which moves the focus from index A to index B, return a function which swaps the elements at indexes A and B and then moves the focus. See Yi.Editor.swapWinWithFirstE for an example. Write nothing. Use with  Read nothing, and return  . Use with . "     !" # $% &'() *+,-. / 0123456            789:;<=>?@AB   CDEFGHIJKLMNOPQRSTUVWXYZ[   \]^    _`a  b  iqrstuvwxyz{|}~ ! " # $ % & ' ( ) * + , - . / 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ٔ20^%i$(*+ BON'&JHMKILZ[WXVY /-,TUSR>A ?@=< PQ!"ECDGF456)#9;:a`]_78.b1\ None&Direction of movement inside a buffer Window references Size of a buffer region A point in a buffer Reference to a buffer. A mark in a buffer reverse if Backward  direction is in the same style of maybe or either functions, D It takes one argument per direction (backward, then forward) and a ! direction to select the output.  Q R S T U Q R S T U NoneDFinish an atomic command, for the purpose of killring accumulation. Put some text in the killring.  It'1s accumulated if the last command was a kill too VPush a string in the killring. DSet the top of the killring. Never accumulate the previous content. Get the top of the killring.  W X Y Z V [  W X Y Z V [NoneFTreat the input not as a regex but as a literal string to search for. )Compile for newline-insensitive matching ,Compile for matching that ignores char case >Return an escaped (for parseRegex use) version of the string. \,Return a pattern that matches its argument. ]FReverse a pattern. Note that the submatches will be reversed as well. -The regular expression that matches nothing.  ^ _ \ ` ] a b cQ 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 cNone 'An extensible record, indexed by type. 6Serializable, initializable dynamically-typed values. !Class of values that can go in a   or a  . These are ) typically for storing custom state in a FBuffer or an Editor.  An "extensible record" of  (s. Can be constructed and accessed with  and  . 3This type can be thought of as a record containing all  s in existence.  !Class of values that can go in a  ConfigDynamic or a ConfigDynamicValues.  These will typically go in a Config . As the Config has no mutable state, P there is no need to serialize these values: if needed, they will be set in the  user's configuration file. The " constraint ensures that, even if  the user hasn'>t customised this config variable, a value is stil available.  Accessor for any  &. Neither reader nor writer can fail:  if the user's config file hasn't set a value for a  , ! then the default value is used. Build a    Try to extract a value from the  . +Converts a dynamic to a serializable value ,Converts a serializable value to a dynamic.  KAccessor for a dynamic component. If the component is not found, the value  is used.                      None  The region data type. zThe region is semi open: it includes the start but not the end bound. This allows simpler region-manipulation algorithms.  Invariant : regionStart r <= regionEnd r %Take the intersection of two regions ?Take the union of two regions (including what is between them) ECreate a region from ordered bounds. If 2nd argument is greater than % 1st, then the region will be empty. 1Construct a region from its bounds, emacs style:  the right bound is excluded The empty region 4True if the given point is inside the given region. HTrue if the given point is inside the given region or at the end of it. @Returns if a region (1st arg) is included in another (2nd arg)          None  $Abstraction of the automaton state. %(Operational representation of a process ( Interactive process description )-Abstraction of monadic interactive processes *Outputs a result. +)Consumes and returns the next character. A Fails if there is no input left, or outside the given bounds. $Convert a process description to an  executable process. Push an event in the automaton )find all the writes that are accessible. 9,Parses and returns the specified character. ::Parses 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 !"#$%&' ( )*+,-./01 234 5 6789:;<=>  !"#$%&'()*+,-./0123456789:;<=>(%'& $#"!)*+,-./01<6459:;=>3782" $#"!% '&( )*+,-./01 234 5 6789:;<=> None%?A 'Layout a'' wrapped in a state monad for tracking Ss. This type is not6 itself a monad, but should rather be thought of as a S-free version of the W type. @Same as lm, but with all Ts Cd. See f for an example of its use. B.Things with orientations which can be flipped DA general bounding box Fixed number of "main"4 windows on the left; stack of windows on the right Transposed version of   STall windows, with arranged in a balanced binary tree with sliders in between them DWide windows (windows placed on top of one another, equally spaced) @Tall windows (i.e. places windows side-by-side, equally spaced) JExistential wrapper for W L5The type of layout managers. See the layout managers c, g and e# for some example implementations. M>Given the old layout and the new list of windows, construct a % layout for the new list of windows. OIf the layout manager uses sliding dividers, then a user will expect that most  of these dividers don'2t move when adding a new window. It is the layout  manager'Bs responsibility to ensure that this is the case, and this is the  purpose of the Layout a argument. pThe old layout may come from a different layout manager, in which case the layout manager is free to ignore it. N5Describe the layout in a form suitable for the user. O<Cycles to the next variant, if there is one (the default is  F) P@Cycles to the previous variant, if there is one (the default is  F QRelative sizes, for ] R%Divider position, in the range (0,1) SDivider reference TOrientations for ] and X W4UI-agnostic layout schema. The basic constructs are  (horizontal/2vertical) stacks with fixed ratios between window  sizes; and (horizontal/-vertical) pairs with a slider in between (if  available). Y Initial position of the divider Z9Index of the divider (for updating the divider position) [Upper of of the pair \Lower of the pair ^ Orientation  Orientation _)The layout stack, with the given weights # TODO: fix strictness for stack (it's still lazy) aAccessor for the R with given reference bYTrue if the internal layout managers have the same type (but are not necessarily equal). c-Windows placed side-by-side, equally spaced. d5Windows placed on top of one another, equally spaced eOTall windows, arranged in a balanced binary tree with sliders in between them. fTransposed version of e gn5 windows on the left; stack of windows on the right. hTransposed version of g. mSpecial case of l with all Q s equal. The default layout is  tallLayout /The initial layout consists of a single window M? @ABCDEFGHI JKLMNOPQRSTUVWXYZ[\]^_`abcde fghi jklmn 0?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn1W`]X^_^YZ[\TVURSQaLMNOPJKbdcefghDEFGHIiBC@A?kjlmn/? @ABCDEFGHI       JKLMNOPQRSTVUW `]X^_^YZ[\abcde fghi jklmn NoneSMap an Event to a Char. This is used in the emacs keymap for Ctrl-Q and vim keymap insertSpecialChar %opqrstuvwxyz{|}~ opqrstuvwxyz{|}~opq~}|{zyxwvutsr opq~}|{zyxwvutsr None   None A window onto a buffer. regular or mini window?  the buffer this window opens to 0list of last accessed buffers (former bufKeys). $ Last accessed one is first element ;height of the window (in number of screen lines displayed)  view 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. 2 Scrolling depends on the actual number of buffer 4 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.     None+A tab, containing a collection of windows. For UI sync; fixes #304 Visible windows ;Current layout. Invariant: must be the layout generated by  , up to changing the Ys. 7layout manager (for regenerating the layout when we add/remove windows) AReturns a list of all mini windows associated with the given tab Accessor 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. jAccessor 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 !Make a tab from multiple windows Make a tab from one window Equality on tab identity (the )               NoneNone         None*-The system-default color of the engine used. M e.g. in Gtk this should pick whatever the user has chosen as default color < (background or forground depending on usage) for the text. BA StyleName determines what style to use, taking into account the ) set of rendering preferences given by a . Typically, style  names will be -valued field names of .  The UI type #ground attributes for the modeline $transformation of modeline in focus !ground attributes for the tabbar %a tab that currently holds the focus +a tab that does not have the current focus *ground attributes for the main text views the selected portion empty file marker colours indicates errors in text search matches paren matches other hints current search match  all comments #additional only for block comments applied to language keywords numbers /preprocessor directive (often in Haskell or C) constant strings "additional style for long strings ,type name (such as class in an OO language) data constructor style of import names )builtin things, e.g. Array in JavaScript regular expressions #any standard variable (identifier) infix operators 4Style of a quotation (e.g. in template haskell)  stuff that'$s passed to the shell in a Makefile makefile rule headers 7The style is used to transform attributes by modifying . one or more of the visual text attributes. 4Visual text attributes to be applied during layout. The text should be show as active or selected. ; This can be implemented by reverse video on the terminal. "A style that sets the foreground. "A style that sets the background. #A style that sets the font to bold 'A style that sets the style to italics *A style that sets the style to underlined *A style that sets the style to underlined The identity transform. LConvert a color to its text specification, as to be accepted by XParseColor EEENone Initial state  AHow far did the scanner look to produce this intermediate state? G The state can be reused as long as nothing changes before that point.  DRunning function returns a list of results and intermediate states.  Note: the state is the state before/ producing the result in the second component. EThe main type of syntax highlighters. This record type combines all I the required functions, and is parametrized on the type of the internal  state. %The start state for the highlighter. focus at a given point, and return the coresponding node. (hint -- the root can always be returned, at the cost of performance.) /This takes as input a scanner that returns the full result at ? each element in the list; perhaps in a different form for the # purpose of incremental-lazy eval.                            None$3Mutation actions (also used the undo or redo list)  For the undoredo, we use the partial checkpoint/# (Berlage, pg16) strategy to store / just the components of the state that change. DNote that the update direction is only a hint for moving the cursor E (mainly for undo purposes); the insertions and deletions are always  applied Forward.  buffer text Marks for this buffer syntax highlighting state 0set of (non overlapping) visual overlay regions ;Lowest modified offset since last recomputation of syntax  New FBuffer filled from string. read n bytes from buffer b, starting at i Write string into buffer. Write string into buffer. PShift a mark position, supposing an update at a given point, by a given amount. & Negative amount represent deletions.  Point of EOF Return n Chars starting at i of the buffer as a list 3 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 Q 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 E ordered and non-overlapping. The lists of strokes are ordered by 0 decreasing priority: the 1st layer should be painted on top. Checks if an Update is valid Apply a valid update Reverse the given update 4Line at the given point. (Lines are indexed from 1) <Point that starts the given line (Lines are indexed from 1) !$Get begin of the line relatively to point. "QReturn indices of all strings in buffer matching regex, inside the given region. #Modify a mark value. $dReturns the requested mark, creating a new mark with that name (at the supplied position) if needed O !"#$%&'()* % & '   + ( ) * + ,,-. - . / 0 1 2 3 4/012 5 6 7      8   9 :3    ;      ! < " = > ? @ # A B C $ D E F8 !"#$%&'()* %+,-./012    9 :3    ;      ! < " = > ? @ # A C $ D E5 !"#$'%()*()& % & '   + ( ) * + ,,.- - . / 0 1 2 3 4/102 5 6 7      8   9 :3    ;      ! < " = > ? @ # A B C $ D E FNone 7.A URList consists of an undo and a redo list. 8 A new empty 7. I Notice we must have a saved file point as this is when we assume we are A opening the file so it is currently the same as the one on disk 9 Add an action to the undo list. E According to the restricted, linear undo model, if we add a command G whilst the redo list is not empty, we will lose our redoable changes. :CAdd a saved file point so that we can tell that the buffer has not 4 been modified since the previous saved file point. F Notice that we must be sure to remove the previous saved file points  since they are now worthless. ;"This undoes one interaction step. <!This redoes one iteraction step. GDPrepare undo by moving one interaction point from undoes to redoes. H5Remove an initial interactive point, if there is one I6Insert an initial interactive point, if there is none JDRepeatedly undo actions, storing away the inverse operations in the  redo list. KRun the undo-function f on a swapped URList making it . operate in a redo fashion instead of undo. =undoIsAtSavedFilePoint. True4 if the undo list is at a SavedFilePoint indicating G that the buffer has not been modified since we last saved the file. S Note: that an empty undo list does NOT mean that the buffer is not modified since W the last save. Because we may have saved the file and then undone actions done before  the save. 456 L7 M N89:;< G H I J K= O 456789:;<= 89:=;<74654 L657 M N89:;< G H I J K= ONoneS Pimmutable unique key Qundo/ redo list Rdynamic components S3prefered column to arrive at when we do a lineDown / lineUp Tupdates that haven't been synched in the UI yet U+time of the last synchronization with disk Vread-only flag W3the keymap is ready for insertion into this buffer DImaybe a filename associated with this buffer. Filename is canonicalized. E0The BufferM monad writes the updates performed. H?Used to specify the behaviour of the automatic indent command. I9Decrease the indentation to the next smaller indentation , hint, if no such hint exists do nothing. J1Increase the indentation to the next higher hint & if no such hint exists do nothing. K9Decrease the indentation to the next smaller indentation 8 hint. If we are currently at the smallest level then  cycle back to the largest L8Increase the indentation to the next higher indentation 5 hint. If we are currently at the highest level of . indentation then cycle back to the lowest. MAA Mode customizes the Yi interface for editing a particular data : format. It specifies when the mode should be used and G controls file-specific syntax highlighting and command input, among  other things. O%so this can be serialized, debugged. P,What type of files does this mode apply to? QSyntax highlighter RPrettify current " paragraph" S!Buffer-local keymap modification Temacs-style auto-indent line U*adjust the indentation after modification V Follow a "link"4 in the file. (eg. go to location of error message) Y@Strokes that should be applied when displaying a syntax element \7An action that is to be executed when this mode is set ](buffer-local modeline formatting method ` Currently duplicates some of Vim'(s indent settings. Allowing a buffer to J - specify settings that are more dynamic, perhaps via closures, could be  - useful. b*Insert spaces instead of tabs as possible cSize of a Tab dIndent by so many columns l/udpate the syntax information (clear the dirty flag) mUse in readonly! z9Given a buffer, and some information update the modeline @N.B. the contents of modelines should be specified by user, and  not hardcoded. {<Given a point, and the file size, gives us a percent string |Adds an overlay to the buffer }Remove an existing overlay  Execute a BufferM7 value on a given buffer and window. The new state of A the buffer is returned alongside the result of the computation.  Execute a BufferMB value on a given buffer, using a dummy window. The new state of  the buffer is discarded. :Mark the current point in the undo list as a saved state. XFAnalogous to const, but returns a function that takes two parameters,  rather than one. 0Mode applies function that always returns True. 1Mode applies function that always returns False. Create buffer named nm with contents s  Point of eof Extract the current point Return n elems starting at i of the buffer as a list (Move point in buffer to the given index #Revert all the pending updates; don't touch the point. 7Write an element into the buffer at the current point. 1Write the list into the buffer at current point. !Insert newline at current point. =Insert the list at specified point, extending size of buffer ;Insert the list at current point, extending size of buffer ;Insert the char at current point, extending size of buffer  deleteNAt n p deletes n# characters forwards from position p Return the current line number Return line numbers of marks Go to line number n. n is indexed from 1. Returns the A actual line we went to (which may be not be the requested line,  if it was out of range)  Set the mode Modify the mode <Return indices of strings in buffer matched by regex in the  given region. @Return indices of next string in buffer matched by regex in the  given direction Set the given mark' s point. Highlight the selection .Move point by the given number of characters. ; A negative offset moves backwards a positive one forward. Move point -1 Move cursor -n Move cursor +1 Move cursor +n Move 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. Move point up one line Move point down one line ,Return the contents of the buffer as a list (Read the character at the current point &Read the character at the given index K This is an unsafe operation: character NUL is returned when out of bounds Delete n+ characters forward from the current point Current column. F Note that this is different from offset or number of chars from sol. 5 (This takes into account tabs, unicode chars, etc.) &Go to line indexed from current point 5 Returns the actual moved difference which of course ; may be negative if the requested difference was negative. @Access to a value into the extensible state, keyed by its type. 0 This allows you to save or retrieve inside a E monad, ie: ' putA bufferDynamicValueA updatedvalue # value <- getA bufferDynamicValueA  perform a  BufferM a5, and return to the current point. (by using a mark)  perform an  BufferM a", and return to the current point 6What would be the point after doing the given action? * The argument must not modify the buffer. >?@ABC Y Z [ \ ] ^ P Q R S T _ ` a b U V W c d eD f g h i jEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg k l m n o p q r s t u v w x y z { |hijkl } ~ mnopqr s tu v wxy z { |}~  X         !"#+,-.3>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~efgEFGC>?@AB !"#+,.-3oz{ut|}~vwxpqrlMNOPQRSTUVWXYZ[\]^_HLKJI`abcdymhijkDsn>?@ABC Y Z [ \ ] ^ P Q R S T _ ` a b U V W c d eD f g h i jEFGHLKJIMNOPQRSTUVWXYZ[\]^_`abcdefg k l m n o p q r s t u v w x y z { |hijkl } ~ mnopqr s tu v wxy z { |}~  X        None 'Delete an arbitrary part of the buffer %Read an arbitrary part of the buffer &Replace a region with a given string. $Replace a region with a given rope. As 9, but do a minimal edition instead of deleting the whole  region and inserting it back.  Swap the content of two Regions 1Modifies the given region according to the given  string transformation function As 9, but do a minimal edition instead of deleting the whole  region and inserting it back. 2Extend the right bound of a region to include it. See a region as a block/rectangular region, : since regions are represented by two point, this returns 1 a list of small regions form this block region.  !The string modification function The region to modify  "    None Boundary side Designate a given unit of text. the whole document a verticalN line of text (area of text between two characters at the same column number) "a line of text (between newlines)  a single character  Turns a unit into its negative+ by inverting the boundaries. For example,  outsideUnit unitViWord5 will be the unit of spaces between words. For units  without boundaries ( , , ...), this is the identity  function. 8Common boundary checking function: run the condition on siz# characters in specified direction  shifted by specified offset.  kdelimited on the left and right by given characters, boolean argument tells if whether those are included. -a word as in use in Emacs (fundamental mode) $Tells if a char can end a sentence ( , !, ?). =Verifies that the list matches all the predicates, pairwise.  If the list is  too small, then return  . ISeparator characters (space, tab, unicode separators). Most of the units  above attempt to identify words/ with various punctuation and symbols included D 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). *unitSep is true for any kind of whitespace/ separator 2unitSepThisLine is true for any kind of whitespace/separator on this line only Is the point at a Unit boundary in the specified  Direction? 3Paragraph to implement emacs-like forward-paragraph/backward-paragraph UParagraph that begins and ends in the paragraph, not the empty lines surrounding it. XUnit that have its left and right boundaries at the left boundary of the argument unit. genAtBoundaryB 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: A genAtBoundaryB u Backward InsideBound = atBoundaryB u Backward @ genAtBoundaryB u Forward OutsideBound = atBoundaryB u Forward  NRepeat an action until the condition is fulfilled or the cursor stops moving. ) The Action may be performed zero times. NRepeat an action until the condition is fulfilled or the cursor stops moving. ( The Action is performed at least once. #BDo an action if the current buffer character passes the predicate $Generic 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  for boundary explanation. %Generic maybe move operation.  As genMoveB, but don'&t move if we are at boundary already. &Move to the next unit boundary 'As &), unless the point is at a unit boundary *HDelete between point and next unit boundary, return the deleted region. ,9Region of the whole textunit where the current point is. -CNon empty region of the whole textunit where the current point is. .0Region between the point and the next boundary. 6 The region is empty if the point is at the boundary. /:Non empty region between the point and the next boundary, ? In fact the region can be empty if we are at the end of file. 07Non empty region at given point and the next boundary, C          !"#$%&'()*+,-./012346      !"#$%&'()*+,-./012346     &')(,-.+/012 !"#*%$34:          !"#$%&'()*+,-./01234!None>8Extend the given region to boundaries of the text unit. A For instance one can extend the selection to complete lines, or  paragraphs. 56789:;<=> =      !"#$%&'()*,-./01256789:;<=>=     &')(,-./012 !"#*%$59876<;=>: 59876:;<=> "NoneNLMove point to start of line MMove point to end of line NMove cursor to origin OMove cursor to end of buffer P+Move left if on eol, but not on blank line QMove x. chars back, or to the sol, whichever is less RMove x1 chars forward, or to the eol, whichever is less S)Move to first char of next word forwards T*Move to first char of next word backwards VMove to the next occurence of c X3Move to the character before the next occurence of c Z"Move to the previous occurence of c \6Move to the character after the previous occurence of c ^/Move to first non-space character in this line _2Move to the last non-space character in this line `1Go to the first non space character in the line; 9 if already there, then go to the beginning of the line. a@True if current line consists of just a newline (no whitespace) b!Note: Returns False if line doesn'(t have any characters besides a newline cMove down next n paragraphs d Move up prev n paragraphs f8Return true if the current point is the start of a line g6Return true if the current point is the end of a line hTrue if point at start of file iTrue if point at end of file jTrue if point at the last line k'Get the current line and column number mRead the line the point is on oRead from point to end of line p%Read from point to beginning of line r<Get the previous point, unless at the beginning of the file s2Get the next point, unless at the end of the file vDelete one character backward w9Delete forward whitespace or non-whitespace depending on  the character under point. x:Delete backward whitespace or non-whitespace depending on  the character before point. y%capitalise the word under the cursor zlowerise word under the cursor {)capitalise the first letter of this word |/switch the case of the letter under the cursor ~)Delete to the end of line, excluding it. *Delete whole line moving to the next line 1Transpose two characters, (the Emacs C-t action) *Delete trailing whitespace from all lines Marks &Set the current buffer selection mark &Get the current buffer selection mark Exchange point & mark. >File info, size in chars, line no, col num, char num, percent Scroll up 1 screen Scroll down 1 screen &Scroll by n screens (negative for up) <Scroll according to function passed. The function takes the ; | Window height in lines, its result is passed to scrollB  | (negative for up) +Same as scrollB, but also moves the cursor -Same as scrollByB, but also moves the cursor Move to middle line in screen %Move cursor to the top of the screen (Move cursor to the bottom of the screen Scroll by n lines. -Move the point to inside the viewable region return 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 point Move to n lines down from top of screen Move to n( lines up from the bottom of the screen Move to middle line in screen )Return the region between point and mark 9Return the empty region if the selection is not visible. KGet 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 . 2Extend the selection mark using the given region. <Get a (lazy) stream of lines in the buffer, starting at the next line  in the given direction. AUses a string modifying function to modify the current selection D Currently unsets the mark such that we have no selection, arguably = we could instead work out where the new positions should be * and move the mark and point accordingly. (Prefix each line in the selection using  the given string. 6Uncomments the selection using the given line comment 9 starting string. This only works for the comments which ! begin at the start of the line. MToggle line comments in the selection by adding or removing a prefix to each  line. ;Justifies all the lines of the selection to be the same as  the top line. @ NOTE: if the selection begins part way along a line, the other J lines will be justified only with respect to the part of the indentation  which is selected. 4Replace the contents of the buffer with some string :Fill the text in the region so it fits nicely 80 columns. Sort the lines of the region. CHelper function: revert the buffer contents to its on-disk version }?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~&The string that starts a line comment 'The string which begins a line comment 3A potentially shorter string that begins a comment }?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~}LMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~CDEFGHIJK?BA@r?BA@CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~#NoneReturn either a t5 or the number of spaces specified by tabSize in the K IndentSettings. Note that if you actually want to insert a tab character < (for example when editing makefiles) then you should use: insertB '\t'. :Retrieve the current indentation settings for the buffer. A specialisation of . 7 This is the most basic and the user is encouraged to  specialise  on their own. 4This 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 3 from the previous line. Both of these are in the E : monad although the second seems like it is unnecessary. B However we must take into account the length of tabs which come 8 from the the tab settings and hence we must be in the E  monad. DTo get the straightforward behaviour of the indents of all previous : lines until one of them has zero indent call this with:  2autoIndentHelperB fetchPreviousIndentsB (fmap (: [] ) indentOfB) B However commonly we wish to have something more interesting for B the second argument, in particular we commonly wish to have the C 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 is 5A function generally useful as the first argument to   . This searches the lines above 5 the current line for the indentations of each line 2 until we get to a line which has no indentation 6 *and* is not empty. Indicating that we have reached  the outer scope. An application of  which adds more 0 indentation hints using the given keywords. @ The offsets of the first set of keywords are used as hints. @ For the second set of keywords it is not the offsets of the > keywords themselves but the offset of the first non-white # characters after the keywords. <In addition to the keyword hints we also do the same as the  default (!) which is to use any non-closed  opening brackets as hints. 8Returns the position of the last opening bracket on the , line which is not closed on the same line. 4 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 9 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. .Returns the offsets of all the given keywords 5 within the given string. This is potentially useful ! as providing indentation hints. (Returns the offsets of anything that isn't white space after  a keyword on the given line. & This is essentially then the same as  except that @ for each keyword on the input rather than return the offset at F the start of the keyword we return the offset of the first non-white  character after the keyword. BReturns the indentation of a given string. Note that this depends ' on the current indentation settings. =Returns the length of a given string taking into account the . white space and the indentation settings. 9Indents the current line to the given indentation level. A In addition moves the point according to where it was on the A line originally. If we were somewhere within the indentation C (ie at the start of the line or on an empty line) then we want 4 to just go to the end of the (new) indentation. C However if we are currently pointing somewhere within the text G of the line then we wish to remain pointing to the same character. $Indent as much as the previous line $Indent as much as the previous line GInsert a newline at point and indent the new line as the previous one. >Set the padding of the string to newCount, filling in tabs if 1 expandTabs is set in the buffers IndentSettings Hshifts right (or left if num is negative) num times, filling in tabs if 1 expandTabs is set in the buffers IndentSettings JIncreases the indentation on the region by the given amount of shiftWidth KReturn 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  for a description Keywords to act as hints  Keywords to act as offset hints None  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ /10$'%()*()&2$None%A Posix.popen compatibility mapping. H Based on PosixCompat, originally written by Derek Elkins for lambdabot Q TODO: this will probably be called readProcess in the new process package (2.0) /Run a command. This looks up a program name in $PATH, but then calls it  directly with the argument. MRun a command using the system shell, returning stdout, stderr and exit code       %None&None      'None Lexer state  Return a constant token  4Return a constant token, and modify the lexer state (Convert the parsed string into a token, # and also modify the lexer state 'Convert the parsed string into a token ECombine a character scanner with a lexer to produce a token scanner.  May be used together with  mkHighlighter to produce a ,  or with linearSyntaxMode to produce a Mode. Ounfold lexer function into a function that returns a stream of (state x token) *         A lexer !Initial user state for the lexer  (     (               None(None8Scan one token. Return (maybe) a token and a new state. ,          )NoneDirect subtrees of a tree (Prune the nodes before the given point. ; The path is used to know which nodes we can force or not. $FGiven an approximate path to a leaf at the end of the region, return: p (path to leaf at the end of the region,path from focused node to the leaf, small node encompassing the region) MReturn 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. 2Given a path to a node, return a path+node which ; node that encompasses the given node + a point before it. %XSearch 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 fromLeafToLeafAt PTakes a list of (node, index of already inspected child), and return all leaves % in this node after the said child). ?Given a root, return all the nodes encountered along it, their 5 paths, and the index of the child which comes next. 4Return 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) &ASearch the given list, and return the last tree before the given B point; with path to the root. (Root is at the start of the path) ',Return all subtrees in a tree, in preorder. (#Return the 1st token of a subtree. )$Return the last token of a subtree. 6Given a tree, return (first offset, number of lines). D   !"# $ % &'(   )*+, -.             !"#$%&'()*+,-. !-.+*()&'"#,%$=     !"# $ % &'(   )*+, -.            *None/012   3        /0123/2103 /210   3       +None 456789:;<= 456789:;<= :456789;<=456789:;<=,None?;Transform a scanner into a scanner that also adds opening,  closing and next tokens to indicate layout. > ! " # $ %? &>??>>  ! " $ # %? &-None[8Scan one token. Return (maybe) a token and a new state. P ' ( ) * + , - . / 0 1 2 3 4 5@ABCDEFGHIJKLMNOPQRSTUV 6 7 8 9 :WXY ;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@ABCDEFGHIJKLMNOPQRSTUVWXYZ[Z[WX@YAIHGFEDCBVRUTSJQPONMLK3 ' * ) ( + . - , / 3 2 1 0 4 5@AIHGFEDCBJQPONMLKRUTSV 6 7 8 9 :WXY ;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.None]8Scan one token. Return (maybe) a token and a new state. A [ \ ] ^ _ ` 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 { | } ~  \]\]4 [ \ a ` _ ^ ] b e d c f j i h g k l m n o p q r s t\] u v w x y z { | } ~  /None_8Scan one token. Return (maybe) a token and a new state. < ^_ ^_^_1     ^_ 0Nonea8Scan one token. Return (maybe) a token and a new state. ; `a     `a`a0     `a     1Nonec8Scan one token. Return (maybe) a token and a new state. ;  !"#bc$%&'()*+,-./0123456789:;<=>?@ABCDEbcbc0  !"#bc$%&'()*+,-./0123456789:;<=>?@ABCDE2None8Scan one token. Return (maybe) a token and a new state. FGHIJKLMNOPQRSTUVWdefghijklmnopqrstuvwxyz{|}~XYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~=defghijklmnopqrstuvwxyz{|}~=desrqponmlkjihgft~}|{zyxwvuaFGLKJIHMPONQUTSRVWdesrqponmlkjihgft ~}|{zyxwvuXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~3NoneW%Exp can be expression or declaration let expression Data constructor Type constructor 2 data constructor same as with the TC constructor "Righthandside of functions with |  the PAtom in PGuard' does not contain any comments Module identifier  An optional "Righthandside of functions with = An wrapper for errors  Where clause -An atom is a token followed by many comments &A block of things separated by layout #A parenthesized, bracked or braced Class declaration Data declaration RHS Data declaration Type declaration Type signature The body of the module The module declaration part 6Check if a token is a brace, this function is used to - fix the layout so that do { works correctly 5Theese are the tokens ignored by the layout handler.  The parser pModule parse a module #Parse a body that follows a module pEmptyBL# A parser returning an empty block Parse a body of a program Parse Variables Parse VarIdent and ConsIdent Parse an operator using please Parse any operator Parse a consident Parse many variables DParse a nextline token (the nexLine token is inserted by Layout.hs) Parse a startBlock token Parse a endBlock token sym f returns a parser parsing f as a special symbol  exact tokList parse anything that is in tokList please p! returns a parser parsing either p or recovers with the  (Special ! ) token. Parse anything, as errors Parse an ConsIdent Parse a keyword 6Parse an unary operator with and without using please Parse comments Parse something thats optional -Parse an atom with, and without using please -Parse an atom with, and without using please %Parse an atom with optional comments  pSepBy p sep parse zero or more occurences of p , separated  by sep, with optional ending sep, 9 this is quite similar to the sepBy function provided in E Parsec, but this one allows an optional extra separator at the end. 4 commaSep p = p `pSepBy` (symbol (==(Special ','))) ESeparate a list of things separated with comma inside of parenthesis Parse a comma separator Parse a Module declaration %Check if next token is in given list Parse several imports Parse one import Parse simple type synonyms Parse data declarations ;Parse second half of the data declaration, if there is one Parse a deriving Parse for all  Parse optional strict variables Exporting module Parse a Let expression Parse a Do block  Parse part of a lambda binding. Parse an Of block Parse classes and instances 4 This is very imprecise, but shall suffice for now. * At least is does not complain too often. %Parse some guards and a where clause CRight-hand-side of a function or case equation (after the pattern) The RHS of an equation. Parse many of something :Parse a some of something separated by the token (Special  ) :Parse a some of something separated by the token (Special  ), or nothing pBlocks'* :: Parser TT r -> Parser TT (BL.BList r) >Parse a block of some something separated by the tok (Special  ) 'Parse something surrounded by (Special A) and (Special ?) EParse something that can contain a data, type declaration or a class A normalA expression, where none of the following symbols are acceptable. 5Parse an expression, as a concatenation of elements. 5Parse an expression, as a concatenation of elements.  Parse an element of an expression or a pattern.  atC is a list of symbols that, if found, should be considered errors. 7List of things that allways should be parsed as errors 2List of things that should not be parsed as noise AThese symbols are always properly recognized, and therefore they  should never be accepted as noise inside expressions. 2Parse parenthesis, brackets and braces containing - an expression followed by possible comments 2Parse parenthesis, brackets and braces containing - an expression followed by possible comments 2Parse parenthesis, brackets and braces containing - an expression followed by possible comments VCreate a special error token. (e.g. fill in where there is no correct token to parse) S Note that the position of the token has to be correct for correct computation of  node spans. ABj;4None The different tokens. HlStateC is 0 when outside of a multi-line comment and -1 when inside one. The constructors for Operator( have an apostrophe as a suffix because  e.g. LT is already used by Prelude. The constructors for Reserved( have an apostrophe as a suffix because  Default" is already used. Also note that  Undefined' is not intended as  some sort of backup reserved word for things we don't care about -- it  really means the  undefined built-in in JavaScript.  The Line0 constructor represents a single-line comment. Start and End G represent the start and end of a multi-line comment, respectively. Text 0 represents the text in a multi-line comment. .Prefix operators. NOTE: Add', is also a valid prefix operator, but since  it'.s completely useless in the real world, we don't care about it here. / Doing this makes parsing much, much easier. /Postfix operators. 0Infix operators. 2Takes a 8 and returns a style to be used for that type of token.  TODO: The  : check is potentially unnecessarily slow. We could split O the Const constructor into two different ones, one for builtins and one for  others.  Given a String& representing an operator, returns an  with the  appropriate constructor.  Given a String) representing a reserved word, returns a  with  the appropriate constructor. 38Scan one token. Return (maybe) a token and a new state.        !"#$%&'()*+, - !"#$./0%12&  3'()*+,-./0123456789:;<=>?@ABCDEFGHIJR      !"#$%&'()*+,-./0123R132-,+*)('&%$#"!      .0/=        ,+*)('&%$#"!  - !"#$./0%12&  3'()*+,-./0123456789:;<=>?@ABCDEFGHIJ5None58Scan one token. Return (maybe) a token and a new state. ;KLMNOPQRSTUVWXYZ[\]^_`a45bcdefghijklmnopqrstuvwxyz{|}~45450KNMLORQPSWVUTXYZ[\]^_`a45bcdefghijklmnopqrstuvwxyz{|}~6None88Scan one token. Return (maybe) a token and a new state. -678678786"6787NoneD8Scan one token. Return (maybe) a token and a new state. 89:;<=>?@ABCD 9:;<=>?@ABCD BD:A@?>=<;9C&9:A@?>=<;BCD8NoneG8Scan one token. Return (maybe) a token and a new state. EFG      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZEFGFGErEFG      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ9NoneJ8Scan one token. Return (maybe) a token and a new state. S[\]^_`abcdefghijklHmnopqrstuvwxyIJz{|}~HIJIJH@[\a`_^]bedcfjihgklHmsrqpontuvwxyIJz{|}~:NoneL8Scan one token. Return (maybe) a token and a new state. XKLKLKLFKL;None\8Scan one token. Return (maybe) a token and a new state. E     MNOPQRSTUVWXYZ[\ !"#$%&'()*+,-./012345MNOPQRSTUVWXYZ[\[\ZMYXWVUTSRQPON.     M YXWVUTSRQPONZ[\ !"#$%&'()*+,-./012345<None^8Scan one token. Return (maybe) a token and a new state. C6789:;<=>?@ABCDEFGHIJKL]^MNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuv]^]^86987:=<;>BA@?CDEFGHIJKL]^MNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuv=None`8Scan one token. Return (maybe) a token and a new state. wxyz{|}~_`_`_`owx}|{zy~ _`>Noneb8Scan one token. Return (maybe) a token and a new state. 2     ab !"#$%&'()*+abab'     ab !"#$%&'()*+?Noned8Scan one token. Return (maybe) a token and a new state. 7,-./0123456789:;<=>?@ABcdCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`cdcd,,/.-0321487659:;<=>?@ABcdCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`@Nonef8Scan one token. Return (maybe) a token and a new state. 4abcdefghijklmnopqrstuvwefxyz{|}~efef)adcbehgfimlkjnopqrstuvwefxyz{|}~ANoneh8Scan one token. Return (maybe) a token and a new state. 9ghghgh*ghBNonej8Scan one token. Return (maybe) a token and a new state. -ijijij"ijCNoneGet strokes Module for module Get strokes for Imports -Get strokes for expressions and declarations klklklklDNonex?Search the given list, and return the 1st tree after the given B point on the given line. This is the tree that will be moved if D something is inserted at the point. Precondition: point is in the  given line. y6Given a tree, return (first offset, number of lines). VCreate a special error token. (e.g. fill in where there is no correct token to parse) S Note that the position of the token has to be correct for correct computation of  node spans. mnopqrstuvwxyz{|}~mnopqrstuvwxyz{|}~tuvwsmrqponxyz{|}~mrqponstuvwxyz{|}~ENone$$$ FNone(DRepresents either a variable name or a variable name assigned to an  expression. AssBeg is a variable name maybe followed by an assignment.  AssRst' is an equals sign and an expression. (AssBeg x (Just (AssRst  '=' '5'))) means x = 5.  Instances of Failable4 can represent failure. This is a useful class for = future work, since then we can make stroking much easier.  Instances of  Strokable0 are datatypes which can be syntax highlighted. Normal stroker. Error stroker. LGiven a new style and a stroke, return a stroke with the new style appended  to the old one. ,Given a list of tokens to check for errors (xs) and a list of tokens to  stroke (xs'), returns normal strokes for xs' if there were no errors. ' Otherwise returns error strokes for xs'. Given a list of TT8, if any of them is an error, returns an error stroker, L otherwise a normal stroker. Using e.g. existentials, we could make this K more general and have support for heterogeneous lists of elements which " implement Failable, but I haven't had the time to fix this. Given a TT , return a Stroke for it. The main stroking function.  Main parser. Parser for statements such as return, while, do-while, for, etc.  Parser for blocks7, i.e. a bunch of statements wrapped in curly brackets  or just a single statement. (Note that this works for JavaScript 1.8 lambda style function bodies as  well, e.g. function hello() 5,, since expressions are also statements and  we don'!t require a trailing semi-colon. 6TODO: function hello() var x; is not a valid program. LParser for expressions which may be statements. In reality, any expression L is also a valid statement, but this is a slight compromise to get rid of M the massive performance loss which is introduced when allowing JavaScript # objects to be valid statements.  The basic idea here is to parse the rest of expressions, e.g. + 3 in x  + 3 or [i] in x[i]4. Anything which is useful in such a scenario goes  here. TODO: This accepts [] , but shouldn' t, since x[] is invalid. Parser for expressions. JParses both empty and non-empty arrays. Should probably be split up into 0 further parts to allow for the separation of [] and [1, 2, 3]. Parses a semicolon if it' s there. 4Parses a comma-separated list of valid identifiers. Parses a comment. Parses a prefix operator. Parses a infix operator. Parses a postfix operator. Parses any literal. Parses any literal. Parses any string. Parses any valid number. Parses any valid identifier. Parses any boolean. Parses a reserved word. Parses a special token. Parses an operator. !Expects a token x, recovers with . Expects a special token. Expects an expression. 1General recovery parser, inserts an error token. Weighted recovery.  Better name for .  Better name for . =TODO: This code is *screaming* for some generic programming. 6TODO: Somehow fix Failable and failStroker to be more generic . This will - make these instances much nicer and we won'!t have to make ad-hoc stuff like  this.         !"f  f  T          !"GNone1The main verifier which calls the sub-verifiers. DGiven a list of function declarations, checks for multiple function ( declarations, including the functions' subfunctions.  Given two Tok t, compares the ts. 4Returns a list of the functions in the given block. Given a +, returns the token representing the name. Given a $, returns its inner body as a list. Given a  ValidName+ returns the string representing the name. Like #, but drops the first element in the result.    $%&         $%&HNone !"#$%&'()*+,-./'( !"#$%&'()*+,-./%$#"! &'()*+,-./"! #$%&'()*+,-./'(INone3;Turn a sequence of (from,style,to) strokes into a sequence : of picture points (from,style), taking special care to B ensure that the points are strictly increasing and introducing & padding segments where neccessary. : Precondition: Strokes are ordered and not overlapping. 4=Paint the given stroke-picture on top of an existing picture 80Arrange a list of items in columns over maximum maxNumberOfLines lines 9(Arrange a list of items in columns over  numberOfLines lines. 0123456789 0123456789 0123456789 0123456789 Safe-Inferred:<A prototype. Typically the parameter will be a record type. ; Fields can be defined in terms of others fields, with the 7 idea that some of these definitons can be overridden.  Example:  data O = O {f1, f2, f3 :: Int}  deriving Show  o1 = Proto $ \self -> O  {  f1 = 1, N f2 = f1 self + 1, -- 'f1 self' refers to the overriden definition of f1.  f3 = f1 self + 2  } =Get the value of a prototype. \ This can return bottom in case some fields are recursively defined in terms of each other. >`Override a prototype. Fields can be defined in terms of their definition in the base prototype.  Example: * o2 = o1 `override` \super self -> super  {  f1 = f1 super + 10,  f3 = f3 super + 1  } ? Field access :;<=>?:;<=>?:;<=>?KNoneA.Abstract theme that provides useful defaults. B5A Theme inspired by the darkblue colorscheme of Vim. @AB@AB@AB@ABLNoneD4Configuration record. All Yi hooks can be set here. F UI to use. GUI-specific configuration. H+Actions to run when the editor is started. I=Actions to run after startup (after startActions) or reload. JDefault keymap to use. L#List modes by order of preference. M8Produce a .yi.dbg file with a lot of debug information. NSet to 7 for an emacs-like behaviour. OSet to  % for an emacs-like behaviour, where 0 all deleted text is accumulated in a killring. RList of layout managers for cycleLayoutManagersNext S%Custom configuration, containing the YiConfigVariables. Configure with configVariableA. TWhen should we use a "fat"l 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 scroll _6Amount to move the buffer when using the scroll wheel `0Should the scrollbar be shown on the left side? a7Hide scrollbar automatically if text fits on one page. b9Hide the tabbar automatically if only one tab is present c=Wrap lines at the edge of the window if too long to display. e9The char with which to fill empty window space. Usually '~' for vi-like  editors, ' ' for everything else. f UI colours ACDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ACDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~AYZ[\]^_`abcdefTXWVUgDEFGHIJKLMNOPQRShiCwvutsrqponmlkj~}|{zyx!CDEFGHIJKLMNOPQRSTXWVUY Z[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ NoneFThe Editor state Stack of all the buffers.  Invariant: never empty - Invariant: first buffer is the current one. 'Supply for buffer, window and tab ids. 7current tab contains the visible windows pointed list. dynamic components Mcurrently highlighted regex (also most recent regex for use in vim bindings) Processed events that didn't yield any action yet. AActions to be run when the buffer is closed; should be scrapped. The initial state +Specifies the hint for the next temp buffer's name. 8Create 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. <Delete a buffer (and release resources associated with it). Return the buffers we have, in no particular order MReturn a prefix that can be removed from all buffer paths while keeping them  unique. Find buffer with this key Find buffer with this name 0Find buffer with given name. Fail if not found. ?Make all buffers visible by splitting the current window list. L FIXME: rename to displayAllBuffersE; make sure buffers are not open twice. -Rotate the buffer stack by the given amount. [Perform action with any given buffer, using the last window that was used for that buffer. %Perform action with any given buffer "Perform action with current window' s buffer Return the current buffer Display a transient message Set the  background status line Clear the status line Put string into yank register )Return the contents of the yank register )Dynamically-extensible state components. AThese hooks are used by keymaps to store values that result from D Actions (i.e. that restult from IO), as opposed to the pure values 9 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 BAttach the next buffer in the buffer stack to the current window. DAttach the previous buffer in the stack list to the current window. 7Like fnewE, create a new buffer filled with the String s, 0 Switch the current window to this buffer. Doesn't associate any file B with the buffer (unlike fnewE) and so is good for popup internal  buffers (like scratch) 1Creates an in-memory buffer with a unique name. `A hint for the buffer naming scheme can be specified in the dynamic variable TempBufferNameHint Q The new buffer always has a buffer ID that did not exist before newTempBufferE. c TODO: this probably a lot more complicated than it should be: why not count from zero every time? 0Create a new zero size window on a given buffer +Create a new window onto the given buffer. 2Attach the specified buffer to the current window FAttach the specified buffer to some other window than the current one eSwitch to the buffer specified as parameter. If the buffer name is empty, switch to the next buffer. Close a buffer. = Note: close the current buffer if the empty string is given *Close current buffer and window, unless it's the last one.  Rotate focus to the next window $Rotate focus to the previous window KSwaps the focused window with the first window. Useful for layouts such as  HPairOneStack-, for which the first window is the largest. ZMoves the focused window to the first window, and moves all other windows down the stack. &Swap focused window with the next one *Swap focused window with the previous one A fakeF accessor that fixes the current buffer after a change of the current  window. R Enforces invariant that top of buffer stack is the buffer of the current window. JCounterpart of fixCurrentBufferA_: fix the current window to point to the  right buffer. LReturn the windows that are currently open on the buffer whose key is given 6bring the editor focus the window with the given key. 0Fails if no window with the given key is found. GSplit the current window, opening a second window onto current buffer.  TODO: unfold newWindowE here? VCycle to the next layout manager, or the first one if the current one is nonstandard. ZCycle to the previous layout manager, or the first one if the current one is nonstandard. Helper function for layoutManagersNext and layoutManagersPrevious 8Next variant of the current layout manager, as given by O <Previous variant of the current layout manager, as given by P Enlarge the current window Shrink the current window 3Sets the given divider position on the current tab ECreates a new tab containing a window that views the current buffer. 5Moves to the next tab in the round robin set of tabs 9Moves to the previous tab in the round robin set of tabs WMoves the focused tab to the given index, or to the end if the index is not specified. GDeletes the current tab. If there is only one tab open then error out. C When the last tab is focused, move focus to the left, otherwise  move focus to the right. EClose the current window. If there is only one tab open and the tab + contains only one window then do nothing. 6Make the current window the only window on the screen ESwitch 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. EDefines an action to be executed when the current buffer is closed. bUsed by the minibuffer to assure the focus is restored to the buffer that spawned the minibuffer. 0todo: These actions are not restored on reload. Etodo: These actions should probably be very careful at what they do. [ TODO: All in all, this is a very ugly way to achieve the purpose. The nice way to proceed H is to somehow attach the miniwindow to the window that has spawned it. )*+The buffer indentifier /The contents with which to populate the buffer  buffer name buffer contents ,-./t )*+,-./ NoneRecord presenting a frontend' s interface. The functions   and  are both run by the editor's main loop, Nin 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  with the L width and height of the windows. Some frontends, such as Pango, need to J modify their internal state to do this, and will consequently change & their display. This is expected.  the function 1 should cause the UI to update its display with ! the information given in the .  the functionalities of   and  overlap to some extent, in R the sense that both may cause the frontend to update its display. The Yi core P 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  will L 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 +. However, the text, text attributes, and P (displayed) window region of all windows will remain the same. However, ( the cursor location may change. FThis guarantee allows frontends which calculate rendering of the text  during the  6 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 B are called from. In particular, subprocesses (e.g. compilation, ghci) will run   and  from new OS threads (see startSubprocessWatchers in Yi.CoreN). The frontend must be preparaed for this: for instance, Gtk-based frontends should wrap GUI updates in  postGUIAsync.  Main loop &Clean up, and also terminate if given true "Suspend (or minimize) the program $Refresh the UI with the given state  HUser force-refresh (in case the screen has been messed up from outside)  Set window width and height  Reload cabal project views                 MNone'Prefix matching function, for use with  &Infix matching function, for use with   Example: abc matches a1b2c AComplete a string given a user input string, a matching function B and a list of possibilites. Matching function should return the 2 part of the string that matches the user string. Same as  , but maps  showFunction# on possible matches when printing  01     01NNone"$Start an input session with History $/Finish the current input session with history. 23 !"#$%&'()45 !"#$%&'() !"#$%&'()23 !"#$%&'()45ONone+2Align each line of the region on the given regex. ' Fails if it is not found in any line. ,(Get the selected region as a rectangle. X Returns the region extended to lines, plus the start and end columns of the rectangle. -%Split a list at the boundaries given *+,-./012 *+,-./012 *+,-./012 *+,-./012PNone 5local name of the tag file & TODO: reload if this file is changed 6path to the tag file directory  tags are relative to this path 7map from tags to files 8trie to speed up tag hinting :0Find the location of a tag using the tag table. % Returns a full path and line number 65Super simple parsing CTag format 1 parsing algorithm 5 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 =1Extends the string to the longest certain length >Set a new TagTable ?Reset the TagTable @'Get the currently registered tag table 3456789789::6;<=>?@AB;<=>?3456789:;<=>?@AB:;<=9345678@>?BA3456789789::6;<=>?@AB;<=>?QNone CDEFGHIJK@A CDEFGHIJK CDEFGHIJK CDEFGHIJK@ARNoneM[A TabDescr describes the properties of a UI tab independent of the particular GUI in use. LMNOPQRLMNOPQRMNOPLQRLMNOPQRNone TContent of the top-level loop. U"Startup when entering insert mode VFor insertion-only modes W4Startup bit, to execute only once at the beginning. Z$The type of user-bindable functions `all our threads f input stream goutput stream i&The only mutable state in the program mwrite a/ returns a keymap that just outputs the action a. v7Shut down all of our threads. Should free buffers etc. <STUVWXYZ[\]^_`abcdefghijklmnopqrstPredicate to select exceptions Computation to run Handler uvBCDEFGHIJKwxyz{2STUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{2lkjSTUVWwxyz{Z[\nopqrstuvXYcdefghi]^_`abm&STUVWlkjXYZ[\]^_`abcdefghimnopqrstuvBCDEFGHIJKwxyz{UNone Take an ~, and return the first , and an ArticleDB - *without* that article. QGet the first article in the list. We use the list to express relative priority; d the first is the most, the last least. We then just cycle through - every article gets equal time. CWe remove the old first article, and we stick it on the end of the - list using the presumably modified version. LInsert a new article with top priority (that is, at the front of the list). Serialize given ~ out. Read in database from  and then parse it into an ~. SReturns the database as it exists on the disk, and the current Yi buffer contents. [ Note that the Initializable typeclass gives us an empty Seq. So first we try the buffer Z state in the hope we can avoid a very expensive read from disk, and if we find nothing ; (that is, if we get an empty Seq), only then do we call .  Given an ~L, dump the scheduled article into the buffer (replacing previous contents). 5Go to next one. This ignores the buffer, but it doesn'%t remove anything from the database. $ However, the ordering does change. MDelete current article (the article as in the database), and go to next one. [The main action. We fetch the old database, we fetch the modified article from the buffer,  then we call the function  updateSetLastA which removes the first article and pushes our modified article  to the end of the list. UAssume the buffer is an entirely new article just imported this second, and save it.  We don't want to use  updateSetLast# since that will erase an article. ~LM~~~LMVNone6Parse 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 R !"#$%&'()+,-./0123456789:;<=>opqrstuvwxyz{|}~XNoneN0Make an action suitable for an interactive run.  UI will be refreshed. AStart up the editor, setting any state with the user preferences 1 and file names passed in, and turning on the UI O8Display the errors buffer if it is not already visible. P>Process an event by advancing the current keymap automaton an  execing the generated actions. Quit. Q7Update (visible) buffers if they have changed on disk. 6 FIXME: since we do IO here we must catch exceptions! RHide selection, clear  syntax dirty flag (as appropriate). Redraw Suspend the program @Pipe a string through an external command, returning the stdout 1 chomp any trailing newline (is this desirable?) Todo: varients with marks? S6Same as msgEditor, but do nothing instead of printing () -Show an error on the status line and log it. Close the current window. 4 If this is the last window open, quit the program. A CONSIDER: call quitEditor when there are no other window in the N function. O (Not possible since the windowset type disallows it -- should it be relaxed?) TKill a given subprocess 9Start a subprocess with the given command and arguments. NUVOPWQRXSYTZ[\]^   !" # $% &'() *+,-. / 0123456            789:;<=>?@AB   CDEFGHIJKLMNOPQRSTUVWXYZ[   \]^    _`a  b  iqrstuvwxyz{|}~ ! " # $ % & ' ( ) * + , - . / 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      !"#$%&'()+,-./0123456789:;<=>opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~STUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{NUVOPWQRXSYTZ[\]^YNoneDGlobal searching. Search for regex and move point to that position.  Nothing* means reuse the last regular expression. Just s means use  s; as the new regular expression. Direction of search can be  specified as either Backward or Forward (forwards in the buffer). E Arguments to modify the compiled regular expression can be supplied  as well. Put regex into regex register Clear the regex register "Return contents of regex register Set up a search. @Do a search, placing cursor at first char of pattern, if found. M 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 B the same search and replace over multiple regions however we are F 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 selection 7Replace a string by another everywhere in the document (Search and replace in the given region. n 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. <Search and replace in the region defined by the given unit.  The rest is as in . 5Create a SearchExp that matches exactly its argument #Find the next match and select it. " Point is end, mark is beginning. 'Replace all the remaining occurrences. Exit from query/ replace. +_`Nothing means used previous & pattern, if any. Complain otherwise. . Use getRegexE to check for previous patterns #Flags to modify the compiled regex Backward or Forward The String to search for The String to replace it with  The region to perform this over The String to search for The String to replace it with abcdefghi$$'_`abcdefghiZNonejj[None[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, j a module name, etc. But we care primarily about the function names, so we filter out anything containing  the keywords. CQuery Hoogle, with given search and options. This errors out on no 2 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 ', and overwrite the word at point with  the first returned function.  Call out to 1, and print inside the Minibuffer the results of * searching Hoogle with the word at point. \NonekWord completion Awhen doing keyword completion, we need to keep track of the word  we're trying to complete. Switch out of completion mode. HTry to complete the current word with occurences found elsewhere in the + editor. Further calls try other options. klmnopqrstklmnopqrst]Noneuvuv^NoneC-w C-k Kill the rest of line C-y M-w M-y C-M-w _None@Readline-like movement bindings intended for minibuffer keymaps `None"for repeat and potentially macros #see Yi.Keymap.Vim2.vimEval comment 9is set on $, allows j and k walk the right edge of lines like vim's :help paste after C-o and one of v, V, C-v  after C-o  -char denotes how state got into insert mode (i, a, etc.) <     wxyz{| !"}~:      !"9     "!       wxyz{|"! }~aNone #$%&'(#$%&'(#$%&(' #$%&'(bNone)*+,-./0123456789:;<=>)*+,-./0123456789:;<=>)*,-0+./213456798:<;=>)*+,-./0123456789:;<=>cNone????dNone@ABCDEFGHI @ABCDEFGHI BCDEF@AGIH@ABCDEFGHIeNone JKLMNOPQRS 'JKLMNOPQRS KLJ'MNOPRSQ JKLMNOPQRSfNone TTT TgNoneUUUUhNoneVVVViNoneWWWWjNoneZ% ['a,'b XYZ[\]^_`abc XYZ[\]^_`abc \]^_`abX[ZYcX[ZY\]^_`abckNonededededelNone.What to prompt the user when asked this type? l Tag a type with a documentation o:Open a minibuffer window with the given prompt and keymap A The third argument is an action to perform after the minibuffer A is opened such as move to the first occurence of a searched for  string. If you don't need this just supply  return () p#withMinibuffer prompt completer act: open a minibuffer with prompt. Once  a string s is obtained, run act s.  completer can be used to complete 3 functions: it returns a list of possible matches. x7withMinibufferGen proposal getHint prompt completer act: open a minibuffer  with prompt, and initial content proposal. Once a string s is obtained,  run act s.  completer0 can be used to complete inputs by returning an O incrementally better match, and getHint can give an immediate feedback to the  user on the current input. y9Open a minibuffer, given a finite number of suggestions. ~Returns all the buffer names. 5fghijklmnopqrstuvwxyz{|}~fghijklmnopqrstuvwxyz{|}~owpxyuvqrts|}~{zlmnkihjfg.fghijklmnopqrstuvwxyz{|}~mNone?Given a possible starting path (which if not given defaults to ? the current directory) and a fragment of a path we find all D files within the given (or current) directory which can complete  the given path fragment. F We return a pair of both directory plus the filenames on their own E that is without their directories. The reason for this is that if 0 we return all of the filenames then we get a hint which is way too # long to be particularly useful. ?Given a path, trim the file name bit if it exists. If no path $ given, return current directory. @Given a possible path and a prefix, return matching file names. 9A simple wrapper to adjust the current indentation using = the mode specific indentation function but according to the  given indent behaviour. 0Generic emacs style prompt file action. Takes a prompt and a continuation act ( and prompts the user with file hints >For use as the hint when opening a file using the minibuffer. B We essentially return all the files in the given directory which  have the given prefix.    nNone,The full path to the directory being viewed 1 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) /keep track of the num of successful operations #if True, DOChoice will be bypassed 0Elementary 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. H Logic and implementation of each operation are packaged in procDiredOp  See askDelFiles for example. K If new elem op is added, just add corresponding procDiredOp to handle it.  no operation 7to feedback, given the state. such as show the result. )prompt a string, provide keybindings for y, n, !, q and optional h (help) R this is useful when overwriting of existing files is required to complete the op  choice !) will bypass following DOChoice prompts. (prompt a string and collect user input. < the embedded list of DiredOps is generated based on input, 8 Remember that the input should be checked with DOCheck 7this is a shortcut, it invokes DCChoice if file exists Usimilar to DOConfirm, but no user interaction. Could be used to check file existence  prompt a yes/no? question. If yes, execute the first list of embedded DiredOps 8 otherwise execute the second list of embedded DiredOps 0remove the buffers that associate with the file execute the operations R Pass the list of remaining operations down, insert new ops at the head if needed -delete a list of file in the given directory K 1. Ask for confirmation, if yes, perform deletions, otherwise showNothing f 2. Confirmation is required for recursive deletion of non-empty directry, but only the top level one G 3. Show the number of successful deletions at the end of the excution ^ 4. TODO: ask confirmation for wether to remove the associated buffers when a file is removed UWrite the contents of the supplied directory into the current buffer in dired format MReturns a tuple containing the textual region (the end of) which is used for click detection C and the FilePath of the file represented by that textual region XReturn 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 Fmove selected files in a given directory to the target location given  by user input if 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 1 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 Fcopy selected files in a given directory to the target location given  by user input 6askCopyFiles follow the same logic as askRenameFiles, 3 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. c      !"#$5       !"#$TNone }CIf file exists, read contents of file into a new buffer, otherwise D creating a new empty buffer. Replace the current window with a new  window onto the new buffer. FIf the file is already open, just switch to the corresponding buffer. ENeed to clean up semantics for when buffers exist, and how to attach  windows to buffers. +Revert to the contents of the file on disk 'Try to write a file in the manner of vi/vim 6 Need to catch any exception to avoid losing bindings 0Try to write to a named file in the manner of vi/vim (Try to write to a named file if it doesn't exist. Error out if it does. GWrite 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 buffers Make a backup copy of file >Associate buffer with file; canonicalize the given path name. } } } }oNone%&   %&pNone'like dd and d2vd ()*'+,-./012(,+'*)-./012qNone 3   3rNonesNonetNone4545uNonevNone66wNone7878xNone9:;<=9:;<=yNonezNone>>{None?@?@|NoneABAB}NoneCDetermines if the file'2s extension is one of the extensions in the list. .When applied to an extensions list, creates a  function. KWhen applied to an extensions list and regular expression pattern, creates  a  function. ,Adds a hook to all matching hooks in a list 1Apply a list of mode hooks to a list of AnyModes NCheck whether a mode of the same name is already in modeTable and returns the  original mode, if it isn' t the case. DECDEC~NoneNoneNone#The GHCi prompt always begins with >A; this goes to just before it, or if one is already at the start u of the prompt, goes to the beginning of the line. (If at the beginning of the line, this pushes you forward to it.) 2Open a new buffer for interaction with a process. %Send the type command to the process Send command, recieve reply    NoneClever0 haskell mode, using the paren-matching syntax. IExperimental Haskell mode, using a rather precise parser for the syntax. F8Returns true if the token should be indented to look as inside the group. GStart GHCi in a buffer  Return GHCi'"s buffer; create it if necessary.  Show it in another window. Send a command to GHCi Load current buffer in GHCi HIJKLMFNOPQRSTUVWXGYZ  HIJKLMFNOPQRSTUVWXGYZNone2Changing 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 argument cabal-configure KRun the given commands with args and pipe the ouput into the build buffer, $ which is shown in an other window.  cabal-build (Search the source files in the project. Perform a find+grep operation [[NoneHooks for the JavaScript mode. \The  compiler. ]:Returns the JS verifier buffer, creating it if necessary. ^+Creates a new empty buffer and returns it. _IGiven a filename, a BufferRef and a list of errors, prints the errors in  that buffer. `abcd\]^_e `abcd\]^_eNone syntax-based latex mode syntax-based latex mode f  g     f  gNoneh ijklmnopqrstuvwxyz{|}  h ijklmnopqrstuvwxyz{|}None ~   ~NoneVty  screen size ZCopy of the editor state, local to the UI, used to show stuff when the window is resized. %used to trigger redraw in renderLoop !the picture currently displayed. cursor point on the above Initialise the ui Clean up and go home (Redraw the entire terminal from the UI. <Construct images for the tabbar if at least one tab exists. 8Determine whether it is necessary to render the tab bar 8Calculate the lines a window can display from a buffer. &Return a rendered view of the window. Draw a window TODO: horizontal scrolling. Renders text in a rectangle.  This also returns < * the index of the last character fitting in the rectangle E * the position of the Point in (x,y) coordinates, if in the window, 1 * the number of display lines for this drawing. HWe calculate the number of lines displayed for this window so that line  wrapping doesn't break scrolling. DCalculate window heights, given all the windows and current height. " (No specific code for modelines) /Convert a Yi Attr into a Vty attribute change. Apply the attributes in sty and changes to cs . If the  attributes are not used, sty and changes are not evaluated. + /The height of the part of the window we are in .The width of the part of the window we are in ,The position of the first character to draw The position of the cursor 8The number of spaces to represent a tab character with. The data to draw.     None Initialise the ui     None "Fields that can be modified with ( ), get and modify. %The configuration monad. Run it with  configMain. Accessor for any  !, to be used by modules defining  5s. Such modules should provide a custom-named field. .For instance, take the following hypothetical  :  5newtype UserName = UserName { unUserName :: String } , deriving(Typeable, Binary, Initializable) #instance YiConfigVariable UserName  $(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.             WNone*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. CLoads a persistent state, and sets Yi state variables accordingly. CTrims per-command histories to contain at most N completions each. /Trims VimTagStack to contain at most N values. JReads and decodes a persistent state in both strict, and exception robust  way.     None  The 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 Z monads. +A typical example would be something like Int -> String ->  String. ILooks 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.         None 1Config variable for customising the behaviour of   and  . Set this variable using  . See   and finiteListEvaluator for two implementation. implementation of   implementation of   )Runs the action, as written by the user. BThe behaviour of this function can be customised by modifying the   variable. ,Lists the action names in scope, for use by  . BThe behaviour of this function can be customised by modifying the   variable. The evaluator to use for   and  . aEvaluator implemented by calling GHCi. This evaluator can run arbitrary expressions in the class X. .The following two imports are always present:   import Yi ) import qualified Yi.Keymap as Yi.Keymap Also, if the file   $HOME/.config/yi/local/Env.hs $exists, it is imported unqualified. 3Accessor for the published actions. Consider using  . hPublish the given action, by the given name. This will overwrite any existing actions by the same name. QEvaluator based on a fixed list of published actions. Has a few differences from  :  expressions can't be evaluated + all suggested actions are actually valued  (related to the above) doesn'$t contain junk actions from Prelude  doesn',t require GHCi backend, so uses less memory                                                         None 4Quits the editor if there are no unmodified buffers > if there are unmodified buffers then we ask individually for = each modified buffer whether or not the user wishes to save B it or not. If we get to the end of this list and there are still ? some modified buffers then we ask again if the user wishes to , quit, but this is then a simple yes or no. 4Quits the editor if there are no unmodified buffers > if there are unmodified buffers then we ask individually for = each modified buffer whether or not the user wishes to save B it or not. If we get to the end of this list and there are still ? some modified buffers then we ask again if the user wishes to , quit, but this is then a simple yes or no. 3Is there a proper file associated with the buffer? 9 In other words, does it make sense to offer to save it? 4Quits the editor if there are no unmodified buffers ; if there are then simply confirms with the user that they  with to quit. %Insert next character, raw &:Convert the universal argument to a number of repetitions (NOpen a file using the minibuffer. We have to set up some stuff to allow hints  and auto-completion. )/Open a file in a new tab using the minibuffer. .=If on separators (space, tab, unicode seps), reduce multiple * separators to just a single separator. /4Join this line to previous (or next N if universal) ;Shortcut to use a default list when a blank list is given. * Used for default values to emacs queries 08Prompt the user to give a tag and then jump to that tag Opens the file that contains tag(. Uses the global tag table and prompts + the user to open one if it does not exist Call continuation act* with the TagTable. Uses the global table ! and prompts the user if it doesn't exist      ! " # $ % & ' ( ) * + , - . / 0p    ! " # $ % & ' ( ) * + , - . / 0  &   p " ! # $ ' * + , - % ( ) 0 . /     ! " # $ % & ' ( ) * + , - . / 0None 3AIntroduce a keymap that is compatible with both windows and osx, > by parameterising the event modifier required for commands  1 2 3 4 5 6 7 1 2 3 4 5 6 7 2 3 1 4 7 6 5 1 2 3 4 5 6 7None 8 8 8 8None 9 \]^_`abcde 9 dec\]^_`ab 9 9None : : : :None ; < = > ? @ A ; < = > ? @ A ? @ A ; < = > ; < = > ? @ ANoneThe action performed first &The action performed before insertion  The position _before_ insertion The position _after_ insertion %The action performed after insertion LDThe Vim keymap is divided into several parts, roughly corresponding C to the different modes of vi. Each mode is in turn broken up into = separate VimProcs for each phase of key input in that mode. NTop level mode Ovim insert mode R7The given buffer action should be an insertion action. U.The given action should be a deletion action. A The only well tested buffer actions are deleting one character, # or one word, forward or backward. i@eval an ex command to an YiM (), also appends to the ex history  >write the current buffer, but only if modified (cf. :help :x)  >viSearch is a doSearch wrapper that print the search outcome. ' TODO: consider merging with doSearch  Try to do a substitution jOLeave a mode. This always has priority over catch-all actions inside the mode.  6Insert mode is either insertion actions, or the meta (E SC) action  TODO repeat  Keyword Call continuation act* with the TagTable. Uses the global table ! and prompts the user if it doesn't exist  !"#$%&'()*+,-./ B C D E F G H I J K0 L M N O P Q123456789:;<=>? R S T U V W@A X YBCDEFGH Z [ \ ] ^I _ ` aJ b c d e f gK h iLMN O  j k l m nPQRSTUVWXY Z[2HIJK 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 n2 [ g k j L M N O P Q G H I J K B C D E F \ ] ^ _ ` a b c d e f R S T U V W X Y Z l n mHIKJ h ic  !"#$%&'()*+,.-/ B C D E F G H I J K0 L M N O P Q123456789:;<=>? R S T U V W@A X YBCDEFGH Z [ \ ] ^I _ ` aJ b c d e f gK h iLMN O  j k l m nPQRSTUVWXY Z[None tStart Abella in a buffer u Return Abella'"s buffer; create it if necessary.  Show it in another window. vSend a command to Abella \]^_ o p`a q rb sc t u vd o p q r s t u v o p t q r s u v\]^_ o p`a q rb sc t u vdNone ;Convert snippet description list into a SuperTab extension B w x y z { | } ~  efghijklmn8 w x y z { | } ~  = ~  w { y x | } | } z | } z 3 w { y x | } | } z | } z ~      efghijklmnNone    None op qrs    op qrsNonetList of published Actions u6Input preprocessor: Transform Esc;Char into Meta-Char  Useful for emacs lovers ;) v6Open an emacs-like scratch buffer if no file is open. t u vw t u vwNonex#Argument parsing. Pretty standard. HConfiguration information which can be set in the command-line, but not  in the user's configuration file. y3List of editors for which we provide an emulation. zusage string. {usage string. "Transform the config with options |AUpdate the default configuration based on a command-line option. <Static main. This is the front end to the statically linked 2 application, and the real front end, in a sense.  dynamic_main calls = this after setting preferences passed from the boot loader. x}~ yz{ |   x ~}   yz{ | SNone|reloads the configuration JSerializes the editor state and relaunches Yi using the serialized state. : The launch of Yi will result in recompilation of the user's custom yi. This, in effect, reloads  the configuration. ^once the custom yi is compiled this restores the editor state (if requested) then proceeds to  run the editor. ZIf the custom yi compile produces errors or warnings then the messages are presented as a # separate activity in the editor. _The use of a separate activity prevents any other initial actions from immediately masking the  output. LUsed by both the yi executable and the custom yi that is built from the user's configuration. * The yi executable uses a default config. | |  || None% YStarts with the given initial config, makes the described modifications, then starts yi.  Set a field.  Get a field. Modify a field. JSets the frontend to the first frontend from the list which is installed. %Available frontends are a subset of: "vte", "vty", "pango", "cocoa", and "batch". 'Sets the frontend, if it is available. #Adds the given key bindings to the ` global keymap'G. 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  L, a mode by the given name must already be registered, or the function will 3 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 O*. In particular, a mode by the given name e must already be registered, or this function will have no effect, and issue a command-line warning.   mode f =   (O mode) f modifyModeByName name f modifies the mode with name name using the function f. Consider using   instead. , the font name, or - for default. , the font size, or - for default. 7Amount to move the buffer when using the scroll wheel. , the scroll style, or - for default. See T for documentation. )Which side to display the scroll bar on.  Should the scroll bar autohide? Should the tab bar autohide? Should lines be wrapped? =The 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. 3Produce 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. 7Actions 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 75 for an emacs-like behaviour. Consider starting with  ,  , or   to instead. Set to  j for an emacs-like behaviour, where all deleted text is accumulated in a killring. Consider starting with  ,  , or   instead. ? +       !" # $% &'() *+,-. / 0123456            789:;<=>?@AB   CDEFGHIJKLMNOPQRSTUVWXYZ[   \]^    _`a  b  iqrstuvwxyz{|}~ ! " # $ % & ' ( ) * + , - . / 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      !"#$%&'()+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@ABDTUVWXYjklmnopqrsuvwxyz{|}~STUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}        5        TXWVU )     JNone   !" # $% &'() *+,-. / 0123456            789:;<=>?@AB   CDEFGHIJKLMNOPQRSTUVWXYZ[   \]^    _`a  b  iqrstuvwxyz{|}~ ! " # $ % & ' ( ) * + , - . / 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      !"#$%&'()+,-./0123456789:;<=>opqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~STUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}               :;<=>?      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg h i j k l m n o p qrstuv&wxyz{|}~"                     v              !"#$%&'()*++,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRRSTUVWXYYZ[\]^_`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${${$|$}$~$$$$$$$$$$$$%%%%%&&&&&&&&''''''''''''''''''''''''''''''''''((((()))))))))))))))))))))*****++++++++++,,----------------------------..//001122222222222222222222222222222222222 2 2 2 2 222222222222222222222233333 3!3"3#3$3%3&3'3(3)3*33+3,3-33.3/303132333435363738393:3;3<3=3>3?3@3A3B3C3D3E3F3G3H3I3J3K3L3M3N3O3P3Q3R3S3T3@3F3R33U3V44W44X444Y4Z4[4\4]444^4_4`4a4b4c4d4e4f4g4h4i4j4k4l4m4n4o4p4q4r4s4t4u4v4w4x4y4z4{4|4}44~4444444444444444444444444444444444455666777777777777888999::;;;;;;;;;;;;;;;;<<==>>??@@AABBCCDD,DDDD.D,DUDDDDDDVDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFF,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,FFFFFFFFFFFFFFFFFFFFSFFFFFFFVF F F F F FFFFFFFFFFFFFHFFFFFFF F!F"F#F$F%F&F'F(F)GG*G+G,G-GG.G/G0G1G2G3G4G5G6G7G8G9G:HH,HHH.H,HHHVHHHHHHH;H<HI=I>I?I@IAIBICIDIEIFGGHIJKKLKMKNLOLPLPLQLRLSLTLULVLWLXLYLZL[L\L]L^L_L`LaLbLcLdLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLzL{L|L}L~LLLLLLLLLLLLLLL       q                                                                                                                          p        MMMMMMMMMMNNNNN N!N"N#N$N%N&N'N(N)N*N+N,N-N.O/O0O1O2O3O4O5O6O7P8P8P9P:P;P<P=P>P?P@PAPBPCPDPEPFQGQGQHQIQJQKQLQMQNRORPRPRQRRRSRTIUVWXYZ[[\]]^_`aJJbcdefghijklmnopqrstuvwSxTyUzU{U|U}UU~UUUUUUUUUUUUVVVVVVVVVVVVVVVVVVVVVWWXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZZ[[[[[[[\\\\\\\]^^^^^^^^_``````````````````````````````````````` ` ` ` ` `````````aaaaaabbbb b!b"b#b$b%b&b'b(b)b*b+b,b-b.b/b0b1b2c3d4d4d5d5d6d7d8d9d:d;e<e=e>e?e@eAeBeCeDeEfFgGhHiIjJjKjLjMjNjNjOjPjQjRjSjTkUkVlWlWlXlYlZl[l\l]l^l_l`lalblcldlelflglhliljlklllmlnmompmqmrmsmtmumvmwmxmymzn{n|n}T~TTTTTTTTTooooooooooooopqqqqqVqqqqqqrVsVtVuVvVwVxVyVzV{V|V}}}}}}}}}}}}}}}}}}}}}}}}}~~~W               V                ! " #   $ % & ' ( ) * + , - . /  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 { | } ~    0   ++  S S    T ] STU \                        v                                                     ! " # $ % & ' ( ) * + , - . / 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 PD 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 q w x y z {r | } ~                     W W         z z                            ! " # $ # % # & # ' # ( # ) # * # + # , # - #t # . # / # 0 # 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # : # ; # < # = # > # ? # @ # A # B # C # D # # E # F # G # H # I # I # J # K # K # L # M # M # N # O # O P Q R P Q S P Q T P U V P U W P U X P U Y P U Z P U [ P U [ P U \ P U ] P U ] P U ^ _ ` 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 { | } ~                                                  d             \                                                          ! " # $ % & ' ( ) * + , - . / 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& [& \'O' ]' ^' ' _' `' a' b( c( d( c( e( f( g( f( h( i( j( k( l( m( n( o(( p( q( r( s( t( u( v( w( x( y( z( {( |( }( ~( ( ( ( ( ( ( ( ) ) ) ) ) ) ) ) )) ) )) ))) ) )) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) * * * * * * * * * * , , , ,., , , - c- d- c- e- f- g- f- h- i- j- k- l- m- n- o- p- q- r- s- t- u- v- w- x- y- z- {- |- ~- - - - - - - - - - - - - - - - - - - - - - - . . c. . . d. c. e. f. g. f. h. i. j. k. l. m. n. o... p. q. r. s. t. u. v. w. x. y. z. {. |. }. ~. . . . . . . . . . . . . . . . . . . . . . . . . . . . / c/ d/ c/ e/ f/ g/ f/ h/ i/ j/ k/ l/ m/ n/ o/// p/ q/ r/ s/ t/ u/ v/ w/ x/ y/ z/ {/ |/ / }/ ~/ / / / / / / / / / / / / / / / / / / / / / / / / 0 c0 d0 c0 e0 f0 g0 f0 h0 i0 j0 k0 l0 m0 n0 o000 p0 q0 r0 s0 t0 u0 v0 w0 x0 y0 z0 {0 |0 0 }0 ~0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 c1 d1 c1 e1 f1 g1 f1 h1 i1 j1 k1 l1 m1 n1 o111 p1 q1 r1 s1 t1 u1 v1 w1 x1 y1 z1 {1 |1 1 }1 ~1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 c2 2 2 d2 c2 e2 f2 g2 f2 h2 i2 j2 k2 l2 m2 n2 o2 p2 q2 r2 s2 t2 u2 v2 w2 x2 y2 z2 {2 |2 2 ~2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 333 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 !3 "3 #3 $3 %3 &3 '3 (3 )3 *3 +3 ,3 -3 .3 /3 03 13 23 33 43 53 63 73 83 933"33-3 :3 ;3 <3 =3 >3 ?3 @3 A3 B3 C3 D3 E3 F3 G3 H3 I3 J3 K3 L3 M3 N3 O3 P3 Q3 R3 S3 T3 U3 V3 W4 4 X4 Y4 c4 d4 c4 e4 f4 g4 f4 h4 i4 j4 k4 l4 m4 n4 o444 Z44 p4 q4 r4 s4 t4 u4 [4 v4 w4 x4 y4 z4 {4 |4 \4 ]4 ~4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 c5 d5 c5 e5 f5 g5 f5 h5 i5 j5 k5 l5 m5 n5 o555 p5 q5 r5 s5 t5 u5 v5 w5 x5 y5 z5 {5 |5 5 }5 ~5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 c6 d6 c6 e6 f6 g6 f6 h6 i6 j6 k6 l6 m6 n6 o66 p6 q6 r6 s6 t6 u6 v6 w6 x6 y6 z6 {6 |6 }6 ~6 6 6 6 6 6 6 6 6 6 6 7 c7 d7 c7 e7 f7 g7 f7 h7 i7 j7 k7 l7 m7 n7 o7 p7 q7 r7 s7 t7 u7 v7 w7 x7 y7 z7 {7 |7 }7 ~7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 c8 8 8 d8 c8 e8 f8 g8 f8 h8 i8 j8 k8 l8 m8 n8 o8 ^8 _8 `8 a8 b8 p8 q8 r8 s8 t8 u8 v8 w8 x8 y8 z8 {8 |8 c8 d8 8 ~8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 e8 f8 g8 h8 i8 j8 k8 l8 m8 n8 o8 p8 q8 r8 s8 t8 u8 v8 w8 x8 y8 z8 {8 |8 }8 ~8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 c9 9 9 d9 c9 e9 f9 g9 f9 h9 i9 j9 k9 l9 m9 n9 o99 9 9 9 9 9 9 p9 q9 r9 s9 t9 u9 v9 w9 x9 y9 z9 {9 |9Q9 9 9 9 9 }9 ~9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 : : c: : : d: c: e: f: g: f: h: i: j: k: l: m: n: o::: : : : : : p: q: r: s: t: u: v: w: x: y: z: {: |:: : : : }: ~: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : ; c; d; c; e; f; g; f; h; i; j; k; l; m; n; o;; p; q; r; s; t; u; v; w; x; y; z; {; |; ; ~; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; < c< d< c< e< f< g< f< h< i< j< k< l< m< n< o<<< p< q< r< s< t< u< v< w< x< y< z< {< |< < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < = = c= = = d= c= e= f= g= f= h= i= j= k= l= m= n= o=== = = = = = = = = = = = p= q= r= s= t= = = = = u= v= w= x= y= z= {= |= = = = = = = = = = }= ~= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = e= f= g= h= i= j= k= l= m= n= = = = = = = = = = = = = > c> d> c> e> f> g> f> h> i> j> k> l> m> n> o>>> p> q> r> s> t> u> v> w> x> y> z> {> |> }> ~> > > > > > > > > > > > > > > > ? c? d? c? e? f? g? f? h? i? j? k? l? m? n? o??? p? q? r? s? t? u? v? w? x? y? z? {? |? }? ~? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @ c@ d@ c@ e@ f@ g@ f@ h@ i@ j@ k@ l@ m@ n@ o@@@ p@ q@ r@ s@ t@ u@ v@ w@ x@ y@ z@ {@ |@ }@ ~@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ A A cA A A dA cA eA fA gA fA hA iA jA kA lA mA nA oAAA A A pA qA rA sA tA uA vA wA xA yA zA {A |A A }A ~A A A A A A A A A A A A A A A A A B cB dB cB eB fB gB fB hB iB jB kB lB mB nB oBBB pB qB rB sB tB B B uB vB wB xB yB zB {B |B }B ~B B B B B B B B B C C C C C CC C C C CCC C C C C D D F F F F F F F F F F F F F F F F F F F F F F F F F F F G G G H H M M N N N N P P P P P P P P P P Q Q        UUXXXXXX X X X X XXXXXXXYYYYYYYYYYYZ\ \ \!\"\#\$\%\&\'\(])]*`+`,`-`.`/`0`1`2a3a4a5d6d7d8d9d:d;d<d=d>d?d@dAdBeCfDfEfFfGfHfIfJfKfLfMfNgDgOgKgLgPgQgRhShTiUiViEjWkXlYlZl[l\l]l^l_l`lalblcldlelflglhliljlklllmlnlolplqlrlsltnunvnwnxnynzn{n|n}n~nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnoopppppppppSpppqttvwwxxxxxz{{||}}}       !"#$%S&'()*+,-./0123 _ 456789:;<pp=>?@ABBC DEFGHIJKLMNOWPWQWRWSWSWTWUWVWWWXWXWYWZW[W\W]^_`abbcddefghijklmnopqrstuvwxyz{|}~MEK|t5}s     SSyi-0.7.2 Yi.PreludeYi.MonadYi.Char.UnicodeYi.Keymap.CompletionYi.IncrementalParseYi.DebugYi.Config.Misc Yi.StringYi.Paths Yi.UI.Common Yi.EditorYi.Buffer.Basic Yi.KillRingYi.Regex Yi.Dynamic Yi.Region Yi.Interact Yi.LayoutYi.Event Yi.Keymap Yi.JumpList Yi.WindowYi.TabYi.Keymap.Vim2.DigraphYi.Keymap.Vim2.MatchResultYi.Style Yi.SyntaxYi.Buffer.Misc Yi.BufferYi.Buffer.UndoYi.Buffer.RegionYi.Buffer.TextUnitYi.Buffer.NormalYi.Buffer.HighLevelYi.Buffer.Indent Yi.ProcessYi.Keymap.Vim2.StyledRegionYi.Keymap.Vim2.TextObject Yi.Lexer.AlexYi.Lexer.CompilationYi.Syntax.TreeYi.Syntax.OnlineTreeYi.Syntax.DriverYi.Syntax.LayoutYi.Lexer.AbellaYi.Lexer.Cabal Yi.Lexer.CYi.Lexer.ObjectiveCYi.Lexer.CplusplusYi.Lexer.HaskellYi.Syntax.HaskellYi.Lexer.JavaScript Yi.Lexer.Java Yi.Lexer.JSONYi.Lexer.LatexYi.Lexer.LiterateHaskellYi.Lexer.GitCommitYi.Lexer.GNUMakeYi.Lexer.OCaml Yi.Lexer.Ott Yi.Lexer.PerlYi.Lexer.Python Yi.Lexer.Ruby Yi.Lexer.SrmcYi.Lexer.SVNCommitYi.Lexer.WhitespaceYi.Syntax.Strokes.HaskellYi.Syntax.ParenYi.Mode.Haskell.DollarifyYi.Syntax.JavaScriptYi.Verifier.JavaScriptYi.Syntax.Latex Yi.UI.UtilsYiYi.Style.Library Yi.Config Yi.Completion Yi.History Yi.RectangleYi.TagYi.Keymap.Vim.TagStack Yi.UI.TabBarYi.BootYi.File Yi.IReaderYi.Keymap.KeysYi.PersistentStateYi.Core Yi.SearchYi.Keymap.Vim2.Search Yi.HoogleYi.TextCompletionYi.Mode.BuffersYi.Keymap.Emacs.KillRingYi.Keymap.ReadlineYi.Keymap.Vim2.CommonYi.Keymap.Vim2.EventUtilsYi.Keymap.Vim2.StateUtilsYi.Keymap.Vim2.EvalYi.Keymap.Vim2.MotionYi.Keymap.Vim2.UtilsYi.Keymap.Vim2.InsertMapYi.Keymap.Vim2.ReplaceMap#Yi.Keymap.Vim2.ReplaceSingleCharMapYi.Keymap.Vim2.SearchMotionMapYi.Keymap.Vim2.Ex.TypesYi.Keymap.Vim2.Ex.Eval Yi.MiniBufferYi.MiscYi.DiredYi.Keymap.Vim2.Operator'Yi.Keymap.Vim2.NormalOperatorPendingMap!Yi.Keymap.Vim2.Ex.Commands.Common'Yi.Keymap.Vim2.Ex.Commands.BufferDelete!Yi.Keymap.Vim2.Ex.Commands.DeleteYi.Keymap.Vim2.Ex.Commands.Edit#Yi.Keymap.Vim2.Ex.Commands.GotoLineYi.Keymap.Vim2.Ex.Commands.Nohl Yi.Keymap.Vim2.Ex.Commands.PasteYi.Keymap.Vim2.Ex.Commands.Quit!Yi.Keymap.Vim2.Ex.Commands.Reload%Yi.Keymap.Vim2.Ex.Commands.Substitute!Yi.Keymap.Vim2.Ex.Commands.Global Yi.Keymap.Vim2.Ex.Commands.WriteYi.ModesYi.Mode.IReaderYi.Mode.CompilationYi.Mode.InteractiveYi.Mode.Haskell Yi.CommandYi.Mode.JavaScript Yi.Mode.LatexYi.Keymap.Vim2.NormalMapYi.Keymap.Vim2.VisualMap Yi.UI.Vty Yi.UI.BatchYi.Config.Simple.TypesYi.HooksYi.EvalYi.Keymap.Emacs.Utils Yi.Keymap.CuaYi.Keymap.Vim2.Ex.Commands.YiYi.Keymap.Vim2.ExYi.Keymap.Vim2.ExMapYi.Keymap.Emacs Yi.Keymap.VimYi.Mode.Abella Yi.SnippetsYi.Snippets.HaskellYi.Keymap.Vim2Yi.Config.DefaultYi.MainYi.Config.SimpleShim.ProjectContent Data.TrieParser.Incremental Shim.UtilsData.DelayList Control.ExcSystem.CanonicalizePathSystem.FriendlyPathShim.CabalInfoPaths_yi Data.Rope Data.SequenceemptyPreludenubYi.Buffer.ImplementationIndentBehaviourData.PrototypeMode modeAppliesbaseGHC.Base++ghc-primGHC.Primseq System.IOprint Data.TuplefstsndGHC.Num fromInteger-GHC.Real fromRationalGHC.EnumenumFrom enumFromThen enumFromToenumFromThenTo GHC.Classes==>=negatefail>>=>>fmapreturn fromIntegral toInteger toRationalBoundedEnumEq FractionalIntegralMonadFunctorNumOrdGHC.ReadReadRealRealFracData.Typeable.InternalTypeable GHC.TypesCharDouble integer-gmpGHC.Integer.TypeIntegerIO Data.EitherEitherStringLeftRight Data.MaybeJustNothingGHC.Err undefinedMaybe Control.Monad<=<when=<< mtl-2.1.3.1Control.Monad.State.Classgetstransformers-0.3.0.0Control.Monad.Trans.ReaderReaderT runReaderT Text.ReadreadGHC.Listtailheadlastinitminmaxcompare><=</=truncateroundproperFractionfloorceilingremquotRemquotmoddivModdivrecip/ readsPrecreadListsignumabs+*toEnumsuccpredfromEnumminBoundmaxBound writeFileputStrLn$! replicatenulllookup Data.Listunlinesgreeksymbols checkAmbsdisamb subscripts superscriptsbinary-0.5.1.1 Data.BinaryBinaryCompletionTreeCT listToTreestepTreeobvious mergeTreescompleteRefreadRefwriteRef modifyRef getsAndModify modifiesRefreadsRef writesRefmodifiesThenReadsRefwithwhenMmaybeM repeatUntilMgetsAParserEnterYuckLooksymboleoftestNextlookNext recoverWith initDebugtraceerror logPutStrLnlogError logStreamtraceMtraceM_ ScrollStyle SingleLine SnapToCenter capitalizecapitalizeFirstchomp dropSpaceisBlankfillTextunlines'lines'mapLinesonLinespadLeftpadRight getConfigDir getDataPath getConfigPathgetConfigFilenamegetConfigModulesgetArticleDbFilenamegetPersistentStateFilenamegetEvaluatorContextFilenameUIEditorRopereversetoReverseStringtoString fromStringlength countNewLinesappendconcattakedropsplitAtsplitAtChunkBefore splitAtLinesplitreadFile InitializableinitialSemiNum+~-~~-Endom<>iofst3snd3trd3 singletondiscardlistnubSet mapAdjust' mapAlter'mapFromFoldablegroupBy'every commonPrefixfindPLfocusA swapFocusputAgetAmodAdummyPutdummyGet DirectionForwardBackward WindowRef unWindowRefSizefromSizePoint fromPoint BufferRefMarkmarkId reverseDir mayReverse directionElimKillringkrKilled krContentskrEmptykrEndCmdkrPutkrSetkrGet SearchOption QuoteRegex NoNewLine IgnoreCase SearchExpseInput seCompiledseBackCompiled seOptions searchString searchRegexmakeSearchOptsMregexEscapeString emptySearch emptyRegex DynamicValues YiVariableConfigVariablesYiConfigVariableconfigVariableA dynamicValueARegionregionDirection regionStart regionEnd regionFirst regionLast fmapRegion regionSizeintersectRegion unionRegionmkRegion mkRegion' mkSizeRegion emptyRegioninRegion nearRegionincludedRegion regionIsEmptyregionsOverlap InteractStateRunningDeadWaiting AmbiguousPChainEndI MonadInteractwrite eventBoundsadjustPriorityPEqequiv deprioritize<||||>acceptedrunWriteprocessOneEvent computeStateoneOfanyEvent eventBetweeneventeventschoiceoption mkAutomaton idAutomatonLayoutM Transposed Transposable transpose RectanglerectXrectY rectWidth rectHeightAnyLayoutManager LayoutManager pureLayoutdescribeLayout nextVariantpreviousVariant RelativeSizeDividerPosition DividerRef OrientationVertical HorizontalLayoutPairdivPosdivRefpairFstpairSndStack orientationwins SingleWindowdividerPositionAlayoutManagerSameTypetallwide slidyTall slidyWide hPairNStack vPairNStacklayoutToRectangles singleWindowpairstack evenStack runLayoutMEventKeyKTabKEnterKRightKDownKLeftKMenuKUpKNP5 KPageDownKEndKDelKPageUpKHomeKInsKBSKASCIIKPauseKPrtScrKFunKEscModifierMHyperMSuperMMetaMCtrlMShift prettyEvent eventToChar KeymapSet KeymapProcess KeymapEndoKeymapKeymapMInteractActionextractTopKeymap emptyActionJumpjumpMark jumpBufferRefJumpListaddJumpjumpBack jumpForwardWindowisMinibufkey bufAccessListheight winRegionwkey actualLinesjumpListwinkey dummyWindowTabtkey tabLayoutTabReftabFocustabMiniWindows tabWindowsAtabLayoutManagerAtabDividerPositionA mapWindowsforceTabtabFoldlmakeTabmakeTab1charFromDigraph defDigraphs MatchResult WholeMatch PartialMatchNoMatchlookupBestMatch matchesStringColorDefaultRGB StyleNameUIStylemodelineAttributesmodelineFocusStyletabBarAttributestabInFocusStyletabNotFocusedStylebaseAttributes selectedStyleeofStyle errorStyle hintStylestrongHintStyle commentStyleblockCommentStyle keywordStyle numberStylepreprocessorStyle stringStylelongStringStyle typeStyledataConstructorStyle importStyle builtinStyle regexStyle variableStyle operatorStyle quoteStylemakeFileActionmakeFileRuleHeadStyle Attributes foreground background reverseAttrbolditalic underlineemptyAttributeswithFgwithBgwithBdwithItlc withUnderline withReverse defaultStyle colorToTextblackgrey lightGreydarkredred darkgreengreenbrownyellowdarkbluebluepurplemagentadarkcyancyanwhite brightwhiteCacheScannerscanInit scanLooked scanEmptyscanRunExtHL HighlighterSynHL hlStartStatehlRun hlGetTreehlFocusSpan spanBegin spanContentsspanEndStrokeLength skipScanner emptyFileScan mkHighlighter noHighlighter MarkValue markPoint markGravityUpdateDeletedeleteUpdateStringInsert updatePointupdateDirectioninsertUpdateStringOverlayOvlLayer HintLayer UserLayerUIUpdate StyleUpdate TextUpdateupdateIsDelete mkOverlayChange AtomicChangeInteractivePointURListemptyU addChangeUsetSavedFilePointUundoUredoUisAtSavedFilePointUMarkSetfromMarkinsMarkselMarkWinMarksBufferIdBufferM fromBufferM DecreaseOnly IncreaseOnly DecreaseCycle IncreaseCyclemodeNamemodeHL modePrettify modeKeymap modeIndentmodeAdjustBlock modeFollowmodeIndentSettingsmodeToggleCommentSelectionmodeGetStrokesmodeGetAnnotations modePrintTree modeOnLoad modeModeLineAnyModeIndentSettings expandTabstabSize shiftWidthFBufferbmodeshortIdentString identStringminiIdentStringidentA clearSyntaxlastActiveWindowA lastSyncTimeAundosA readOnlyA insertingApointFollowsWindowAfile setPrefCol getPrefColpendingUpdatesAhighlightSelectionArectangleSelectionAkeymapProcessA getModeLine getPercent addOverlayB delOverlayBdelOverlayLayerB runBuffergetMarks runBufferFull getMarkValueBnewMarkB deleteMarkBrunBufferDummyWindow markSavedBbkeyisUnchangedBufferstartUpdateTransactionBcommitUpdateTransactionBundoBredoBmodeAlwaysAppliesmodeNeverApplies emptyModenewBsizeBpointBnelemsBnelemsB'streamBindexedStreamBstrokesRangesBmoveTo setInsertingrevertPendingUpdatesBwriteBwriteNnewlineB insertNAt' insertNAtinsertNinsertN'insertB deleteNAtcurLn markLinesgotoLnsetMode0 setAnyModesetMode modifyModeonMode withMode0 withModeB withSyntaxB focusSyntax withSyntaxB' regexRegionBregexB setMarkPointB modifyMarkB setMarkHereBsetNamedMarkHereBsetVisibleSelectionaskMarksgetMarkB mayGetMarkBmoveNleftBleftNrightBrightN lineMoveRelmovingToPrefCol moveToColBmoveToLineColBpointOfLineColBforgetPreferCol savingPrefCollineUplineDownelemsBreadBreadAtB replaceCharBreplaceCharWithBelowBreplaceCharWithAboveBinsertCharWithBelowBinsertCharWithAboveBdeleteNcurColcolOflineOf lineCountB solPointB gotoLnFrombufferDynamicValueAsavingExcursionB getMarkPointB savingPointBpointAtpointAfterCursorBdestinationOfMoveB askWindowwithEveryLineB modeNameA modeAppliesAmodeHLA modePrettifyA modeKeymapA modeIndentAmodeAdjustBlockA modeFollowAmodeIndentSettingsAmodeToggleCommentSelectionAmodeGetStrokesAmodeGetAnnotationsAmodePrintTreeA modeOnLoadA modeModeLineA winRegionB deleteRegionB readRegionB readRegionB'replaceRegionBreplaceRegionB'replaceRegionClever mapRegionB swapRegionsB modifyRegionBmodifyRegionCleverinclusiveRegionBblockifyRegion joinLinesB concatLinesB BoundarySide OutsideBound InsideBoundTextUnitGenUnitgenEnclosingUnitgenUnitBoundaryDocumentVLineLine Character outsideUnitunitWord unitDelimited isWordChar checkPeekB unitViWord unitViWORDunitViWordAnyBndunitViWORDAnyBndunitViWordOnLineunitViWORDOnLineisAnySepunitSepunitSepThisLine atBoundaryBunitEmacsParagraph unitParagraph unitSentenceleftBoundaryUnitgenAtBoundaryB numberOfBwhileBuntilB doUntilB_untilB_ doIfCharBgenMoveB genMaybeMoveBmoveB maybeMoveB transposeB transformBdeleteBregionWithTwoMovesB regionOfBregionOfNonEmptyB regionOfPartBregionOfPartNonEmptyBregionOfPartNonEmptyAtB readPrevUnitB readUnitBhalfUnit deleteUnitB RegionStyleBlock Exclusive InclusiveLineWise regionStyleAconvertRegionToStyleBmkRegionOfStyleBunitWiseRegionextendRegionToBoundaries RelPositionWithinBelowAboveBufferFileInfobufInfoFileName bufInfoSize bufInfoLineNo bufInfoColNo bufInfoCharNobufInfoPercentbufInfoModified moveToSol moveToEoltopBbotB leftOnEol moveXorSol moveXorEol nextWordB prevWordBgotoCharacterBnextCIncnextCInLineIncnextCExcnextCInLineExcprevCIncprevCInLineIncprevCExcprevCInLineExcfirstNonSpaceB lastNonSpaceBmoveNonspaceOrSolisCurrentLineEmptyBisCurrentLineAllWhiteSpaceBnextNParagraphsprevNParagraphs goUnmatchedBatSolatEolatSofatEof atLastLine getLineAndColgetLineAndColOfPointreadLnB readCharB readRestOfLnBreadPreviousOfLnBhasWhiteSpaceBefore prevPointB nextPointBreadCurrentWordB readPrevWordBbdeleteB killWordB bkillWordBuppercaseWordBlowercaseWordBcapitaliseWordBswitchCaseCharBswitchCaseChar deleteToEoldeleteLineForwardswapBdeleteTrailingSpaceBsetSelectionMarkPointBgetSelectionMarkPointBexchangePointAndMarkB getBookmarkBbufInfoB upScreensB downScreensB upScreenB downScreenBscrollScreensB scrollByB vimScrollB vimScrollByBscrollToCursorBscrollCursorToTopBscrollCursorToBottomBscrollBsnapInsBindexOfSolAbovepointScreenRelPosition snapScreenB downFromTosB upFromBosBmiddleBpointInWindowBgetRawestSelectRegionBgetRawSelectRegionBgetSelectRegionBsetSelectRegionBextendSelectRegionBdeleteBlankLinesB lineStreamBgetMaybeNextLineB getNextLineBgetNextLineWhichBgetNextNonBlankLineBmodifySelectionBmodifyExtendedSelectionBlinePrefixSelectionBunLineCommentSelectionBtoggleCommentSelectionBjustifySelectionWithTopBreplaceBufferContent fillRegion fillParagraph sortLinesrevertBsmallBufferSizeshapeOfBlockRegionBleftEdgesOfRegionBrightEdgesOfRegionB'splitBlockRegionToContiguousSubRegionsBdeleteRegionWithStyleBreadRegionRopeWithStyleBinsertRopeWithStyleBflipRectangleBmovePercentageFileBfindMatchingPairBtabBindentSettingsB autoIndentBautoIndentHelperB cycleIndentsBfetchPreviousIndentsBautoIndentWithKeywordsBlastOpenBracketHint keywordHintskeywordAfterHints indentOfB spacingOfB indentToBindentAsPreviousB indentAsNextBindentAsNeighborLineBnewlineAndIndentB rePadString indentStringshiftIndentOfRegiondeleteIndentOfRegionindentOfCurrentPosBSubprocessInfoprocCmdprocArgs procHandlehInhOuthErrbufRefseparateStdErr SubprocessIdpopenrunProgCommand shellFileNamerunShellCommandcreateSubprocess readAvailable StyledRegionnormalizeRegiontransformCharactersInRegionBtransformCharactersInLineNCountedTextObject TextObjectchangeTextObjectCountregionOfTextObjectBchangeTextObjectStylestringToTextObjectASIPosnposnOfsposnLineposnColToktokTtokLentokPosn AlexStatestLexer lookedOffsetstPosn AlexInput tokToSpantokFromTtokBegintokEnd tokRegion startPosnmoveStr alexGetChar alexGetBytealexCollectCharalexInputPrevChar actionConstactionAndModifyactionStringAndModifyactionStringConst lexScanner unfoldLexerStatescannerTokenTextReport initState alexScanTokenIsTreesubtreesuniplate emptyNode toksAfterallToks tokAtOrBefore toksInRegiontokenBasedAnnotstokenBasedStrokesfromNodeToFinalfromLeafToLeafAfter getLastPathgetAllSubTreesgetFirstElementgetLastElementgetFirstOffset getLastOffset subtreeRegionsepBysepBy1TreeTipLeafBinmanyTokspath cachedStatesrootfocusedPathunzipFM zipWithFM layoutHandlerTT UnrecognizedSkip CommentLine ReservedOpReserved ConsIdentVarIdentNumberOtherOpDotDoubleRightArrow RightArrow BackSlashAndOrOtherExistsForallHlState tokenToStyle tokenToText isComment CppDirectiveTHQuoteCommentOperator ConsOperatorSpecial StringTokCharTokOpTypeTildaArobase DoubleDot DoubleColon LeftArrowEqualPipe ReservedTypeInstanceClassModuleDeriving OtherLayoutOfDoInLetWhereTypeNewTypeDataImportAs QualifiedHiding CommentTypeCloseOpen startsLayout isSpecial isErrorTokExpPInPLetDCTCPGuard'PGuardContextModidOptRHSPErrorerrorTokmarker commentListPWhereExprPAtomParenPClasscKeywordcHeadcwherePData'dataConsPData dataKeyword dtypeConsdEqualdataRhsPType typeKeywordtypeConsequalbtypeTSPImport importKeywordqualname'as specification PModuleDecl moduleKeywordnameexports whereKeywordBodyimportscontent extraContentProgModmodDeclbodyPModulecommentsprogMod indentScannerparseConst ValidNameOpRexStrResUnknownQualify'BitNot' RightShiftZ' RightShift' LeftShift'BitXor'BitOr'BitAnd'Not'Or'And'NotEqualsType' EqualsType'LTE'LT'GTE'GT' NotEquals'Equals' ModuloAssign' DivideAssign'MultiplyAssign'SubtractAssign' AddAssign'Assign' Decrement' Increment'Modulo'Divide' Multiply' Subtract'Add' Undefined'Null'False'True'With'While'Void'Var'TypeOf'Try'Throw'This'Switch'Return'New' InstanceOf'In'If' Function'For'Finally'Else'Do'Delete'Default' Continue'Catch'Case'Break'prefixOperatorspostfixOperatorsinfixOperators NewCommandBeginCommandIndentReserved getStrokes tokenToAnnotErrorAtomisBrace ignoredTokenisNoisegetIndentingSubtreegetSubtreeSpanparse' tokenToStroke modStrokeerrTok QueuedUpdate qUpdatePointqInsertqDelete dollarifydollarifyWithinrunQ openParen closeParen isNormalParenisTuple queueDeletequeueReplaceWith stripComments dollarifyTop dollarifyExprisSimple isCollapsible selectedTreefindLargestWithinwithinsafeLast dollarifyPdollarifyWithinPisNormalParenPisTuplePstripCommentsP dollarifyTopPdollarifyExprP isSimplePisCollapsibleP selectedTreePfindLargestWithinPwithinP safeLastPKeyValue KeyValueErrArrayArrErrArrRestArrContExprErrPostExprExprArrExprCondOpExpr ExprFunCall ExprTypeOf ExprAnonFun ExprParen ExprSimpleExprNew ExprPrefixExprObj VarDecAssAssErrAssRstAssBegBlockErrBlockOne ForContentForErrForIn ForNormalParExpr ParExprErr ParametersParErr StatementCommWithElseIfForDoWhileWhileReturnVarDeclFunDecl SemicolonBListFailablestupid hasFailed Strokable toStrokesnormalonenError failStroker statementblockstmtExpropExpr expressionarray semicolon parametersparExprcommentpreOpinOppostOpopTok simpleTokstrToknumTokbooleanresspcoperplzTokplzSpcplzExprplzanythinghate fromBlockfirstTok errorTokenisErrortoTTfromTTWarnErrWarningUnreachableCodeMultipleFunctionDeclarationverifycheckMultipleFunscheckUnreachablettEqsayisReturn findFunctionsfunNamefunBodynameOf dropWhile'dupsByisBeginisEndindexedAnnotatedStreamB applyHeights spliceAnnots strokePicture paintStrokes paintPictureattributesPictureBattributesPictureAndSelB arrangeItems arrangeItems'Proto fromProto extractValueoverride.->Theme defaultTheme darkBlueThemeUIBootConfig startFrontEndconfigUI startActionsinitialActions defaultKmconfigInputPreprocess modeTable debugModeconfigRegionStyleconfigKillringAccumulate%configCheckExternalChangesObsessivelybufferUpdateHandlerlayoutManagers configVars CursorStyleFatWhenFocusedAndInsertingFatWhenFocusedNeverFat AlwaysFatUIConfigconfigVtyEscDelayconfigFontNameconfigFontSizeconfigScrollStyleconfigScrollWheelAmountconfigLeftSideScrollBarconfigAutoHideScrollBarconfigAutoHideTabBarconfigLineWrapconfigCursorStyleconfigWindowFill configTheme configStyleconfigFundamentalModeconfigTopLevelKeymapstartFrontEndA configUIA startActionsAinitialActionsA defaultKmAconfigInputPreprocessA modeTableA debugModeAconfigRegionStyleAconfigKillringAccumulateA&configCheckExternalChangesObsessivelyAbufferUpdateHandlerAlayoutManagersA configVarsAconfigVtyEscDelayAconfigFontNameAconfigFontSizeAconfigScrollStyleAconfigScrollWheelAmountAconfigLeftSideScrollBarAconfigAutoHideScrollBarAconfigAutoHideTabBarAconfigLineWrapAconfigCursorStyleAconfigWindowFillA configThemeA MonadEditoraskCfg withEditorEditorM fromEditorM bufferStackbuffers refSupplytabs_dynamic statusLinesmaxStatusHeightkillring currentRegexsearchDirection pendingEventsonCloseActionsStatusesStatus liftEditor emptyEditor runEditorTempBufferNameHint tmp_name_basetmp_name_index bufferStackAbuffersA refSupplyAtabs_AdynamicA statusLinesAmaxStatusHeightA killringA currentRegexAsearchDirectionApendingEventsAonCloseActionsAwindowswindowsAtabsA currentTabAaskConfigVariableAdynAnewRef newBufRefstringToNewBuffer insertBuffer forceFold1 forceFoldTabs deleteBuffer bufferSetcommonNamePrefixgetBufferStack findBufferfindBufferWithfindBufferWithNamegetBufferWithNameopenAllBuffersE shiftBufferwithGivenBuffer0withGivenBufferAndWindow0 withBuffer0currentWindowA currentBufferprintMsg printMsgs printStatus setStatus clrStatus statusLinestatusLineInfo setTmpStatussetRegEgetRegE getDynamic setDynamicnextBufWprevBufW newBufferEnewTempBufferEalternateBufferEnewZeroSizeWindow newWindowEswitchToBufferEswitchToBufferOtherWindowEswitchToBufferWithNameE closeBufferEgetBufferWithNameOrCurrentcloseBufferAndWindowEnextWinEprevWinEswapWinWithFirstEpushWinToFirstE moveWinNextE moveWinPrevEfixCurrentBufferA_fixCurrentWindow withWindowEfindWindowWithwindowsOnBufferE focusWindowEsplitElayoutManagersNextElayoutManagersPreviousE withLMStacklayoutManagerNextVariantElayoutManagerPreviousVariantE enlargeWinE shrinkWinEsetDividerPosEnewTabEnextTabE previousTabEmoveTab deleteTabE tryCloseE closeOtherEshiftOtherWindowwithOtherWindowacceptedInputsonCloseBufferE addJumpHereE jumpBackE jumpForwardEmodifyJumpListEmainendsuspendrefreshuserForceRefreshlayout reloadProjectdummyUI mkIsPrefixOf prefixMatch infixMatchsubsequenceMatchcontainsMatch' containsMatchcontainsMatchCaseInsensitivecompleteInListcompleteInListCustomShowcompleteInList'History_historyCurrent_historyContents_historyPrefix HistoriesdynKeyA miniBuffer historyUp historyDown historyStarthistoryStartGen historyFinishhistoryFinishGen historyFind historyMovehistoryMoveGenhistoryPrefixSethistoryPrefixSet' alignRegion alignRegionOn getRectangle multiSplit onRectangle openRectanglestringRectangle killRectangle yankRectangleTagTable tagFileName tagBaseDir tagFileMaptagTrieTag lookupTagimportTagTablehintTags completeTagsetTags resetTagsgetTagssetTagsFileListgetTagsFileList VimTagStack tagsStack getTagStack setTagStack listTagStack pushTagStack peekTagStack popTagStack TabBarDescrTabDescrtabText tabInFocus tabBarDescrtabAbbrevTitle topKeymapstartInsertKeymap insertKeymapstartTopKeymapYiAction makeActionYiMrunYiMYiVaryiEditorthreadsyiSubprocessIdSupplyyiSubprocessesyiUiinputoutputyiConfigyiVarBufferAEditorAYiAwithUIunsafeWithEditorwithGivenBuffer withBuffer readEditor catchDynE catchJustE handleJustEshutdown topKeymapAstartInsertKeymapA insertKeymapAstartTopKeymapAmodelessKeymapSetreloadeditFile ArticleDBADBunADBArticlegetLatestArticle removeSetLastshift insertArticlewriteDBreadDBoldDbNewArticlegetBufferContentssetDisplayedArticle nextArticledeleteAndNextArticlesaveAndNextArticlesaveAsNewArticle printableChartextCharpStringcharOfctrlmetasuperhypercharctrlChmetaChhyperChoptModspec>>!>>=!?>>?>>!?*>>?*>>!savePersistentStateloadPersistentState startEditor quitEditorfocusAllSyntax refreshEditor suspendEditorrunProcessWithInput runAction msgEditor errorEditor closeWindowstartSubprocess sendToProcess withSyntax SearchResult SearchWrappedPatternNotFound PatternFound SearchMatch setRegexE resetRegexE getRegexEdoSearch searchInitcontinueSearchsearchReplaceRegionBsearchReplaceSelectionB replaceStringsearchAndRepRegion0searchAndRepRegionsearchAndRepUnit isearchInitEisearchIsEmpty isearchAddEmakeSimpleSearch isearchDelEisearchHistory isearchPrevE isearchNextE isearchWordEisearchFinishEisearchCancelEqrNext qrReplaceAllqrFinish qrReplaceOne doVimSearchcontinueVimSearch caseSensitizegv hoogleRawhoogleFunctionshoogleFunModulehoogle hoogleSearch resetCompletemkWordCompletewordCompleteString'wordCompleteString wordComplete' wordComplete completeWordB listBuffers killRegion killLineE killringPutkillRestOfLineyankE killRingSaveEyankPopEappendNextKillEstandardMovementBindingsVimStatevsModevsCount vsAccumulatorvsTextObjectAccumulator vsRegisterMapvsActiveRegistervsRepeatableActionvsStringToEval vsStickyEolvsOngoingInsertEventsvsLastGotoCharCommandvsBindingAccumulatorvsSecondaryCursorsvsPasteGotoCharCommandVimModeSearch previousMode directionExVisual InsertVisual InsertNormalReplaceSingleCharReplaceNormalOperatorPendingNormalRegisterregRegionStyle regContentRepeatableActionraPreviousCountraActionString RegisterName OperatorName EventString VimBinding VimBindingE vbeAction VimBindingYvbPrerequisite vbyAction RepeatTokenContinueDropFinish stringToEvent eventToString parseEventsstringToRepeatableActionsplitCountedCommandnormalizeCount switchMode switchModeE modifyStateE resetCount resetCountEgetMaybeCountE getCountE setCountEaccumulateBindingEventEaccumulateEventEaccumulateTextObjectEventE%flushAccumulatorIntoRepeatableActionEdropAccumulatorEdropBindingAccumulatorEdropTextObjectAccumulatorE getRegisterE setRegisterEnormalizeCountE maybeMult setStickyEolEupdateModeIndicatorEsaveInsertEventStringEscheduleActionStringForEval CountedMoveMove moveStyle moveIsJump moveAction stringToMovechangeMoveStyle regionOfMoveBmkStringBindingE mkBindingE mkBindingY selectBinding matchFromBoolmkMotionBindingmkChooseRegisterBindingindentBlockRegionBpasteInclusiveBaddNewLineIfNecessary defInsertMap defReplaceMapdefReplaceSingleMapdefSearchMotionMap LineRangeCurrentLineRange FullRange MarkRange ExCommand cmdComplete cmdIsPure cmdActioncmdAcceptsRangecmdShowstringToExCommandexEvalEexEvalYCommandArgumentsFilePatternTagRegexTagToKill LineNumber:::DocfromDocspawnMinibufferEwithMinibuffer mkCompleteFnsimpleCompleteinfixComplete' infixCompletenoHintnoPossibilitieswithMinibufferFreewithMinibufferGenwithMinibufferFin anyModeNameanyModeByNameM anyModeByNamegetAllModeNamesmatchingBufferNamesgetAppropriateFiles getFoldermatchingFileNamesadjBlock adjIndent promptFile matchFile completeFile findFileHintonCharLetterCode rot13CharprintFileInfoEdireddiredDirdiredDirBufferrevertEviWrite viWriteTo viSafeWriteTofwriteE fwriteBufferE fwriteToE fwriteAllEbackupE setFileName VimOperator operatorNameoperatorApplyToRegionE defOperatorsstringToOperatoroperatorApplyToTextObjectEopYankopDeleteopChangeopFormatmkCharTransformOperatorlastCharForOperatordefNormalOperatorPendingMap OptionActionAskInvertSet parseRange parseOptionfilenameComplete forAllBuffers pureExCommandimpureExCommandTokenBasedModefundamentalModelinearSyntaxMode removeAnnotscModeobjectiveCModecppMode cabalModesrmcMode gitCommitMode svnCommitMode ocamlModeperlModerubyMode pythonModejavaModejsonMode gnuMakeModeottModewhitespaceMode anyExtensionextensionOrContentsMatch hookModesapplyModeHooks lookupModeabstract ireaderMode ireadModemodeghciHome interactIdinteractHistoryMoveinteractHistoryFinishinteractHistoryStartgetInputRegiongetInputsetInput interactive feedCommand queryReplyhaskellAbstract cleverModefastMode literateMode preciseModeghciGetghciSendghciLoadBuffer ghciInferType CabalBuffer cabalBufferchangeBufferNameE shellCommandE shellCommandVcabalConfigureE configureExitreloadProjectEbuildRun makeBuildcabalRun cabalBuildEshell searchSourcesgrepFindjavaScriptModehooks latexMode2 latexMode3 defNormalMap defVisualMapstartFieldConfigM runConfigMcustomVariablemaxHistoryEntriesHookTyperunHook EvaluatorexecEditorActionImplgetAllNamesInScopeImplexecEditorActiongetAllNamesInScope evaluator ghciEvaluatorpublishedActions publishActionpublishedActionsEvaluatorjumpToE jumpToErrorE consoleKeymap UnivArgument askQuitEditor askSaveEditormodifiedQuitEditor isearchKeymap queryReplaceEexecuteExtendedCommandE evalRegionE insertNextCargToIntreadUniversalArgfindFilefindFileNewTab scrollDownE scrollUpE switchBufferE killBufferE justOneSep joinLinesE promptTagcustomizedCuaKeymapSetkeymapportableKeymapcutdelcopypastedefExCommandParsersdefExMapModeMapeKeymapcompletionCaseSensitivemkKeymap defKeymapVimExCmdcmdNamescmdFn completeFnVimOptstildeopcompleteCaseSensitiveenableTagStack v_top_level v_ins_charv_opts v_ex_cmds savingInsertBsavingInsertCharBsavingInsertStringB savingDeleteBsavingDeleteCharBsavingDeleteWordBsavingCommandYsavingCommandE keymapSetnilCmdexCmdexCmdsexSimpleCompleteexInfixComplete'exInfixCompletemkExHistCompleteexHistComplete'exHistCompleteexHistInfixComplete'exHistInfixCompleteexModeexEvalleave leaveInsRepbeginIns beginInsB beginInsE abellaModeVimabellaModeEmacs abellaEvalabellaEvalFromProofPoint abellaUndoabella abellaGet abellaSendMarkInfoDependentMarkInfoValuedMarkInfoendMarkSimpleMarkInfo userIndex startMark SnippetMark DependentMark ValuedMark SimpleMark SnippetCmd SupertabExtSupertab MkSnippetCmd mkSnippetCmdDependentMarksmarks BufferMarks bufferMarkscursor cursorWithdepisDependentMark bufferMarkersmkMarktext&&> runSnippetupdateUpdatedMarksfindEditedMarksdependentSiblingsupdateDependentsupdateDependents'markText setMarkTextwithSimpleRegion markRegionsafeMarkRegion adjMarkRegionfindOverlappingMarksWithfindOverlappingMarksregionsOverlappingMarksoverlappingMarksallOverlappingMarksdependentOverlappingMarksnextBufferMarkisDependentMarkersafeDeleteMarkBmoveToNextBufferMarksuperTab fromSnippetssnippet hsFunctionhsClass VimConfig vimKeymap vimBindings vimOperatorsvimExCommandParsers vimDigraphs mkKeymapSet defVimConfigpureEval impureEvalavailableFrontends defaultConfigdefaultEmacsConfigdefaultVimConfigdefaultCuaConfigtoEmacsStyleConfigtoVimStyleConfigtoVim2StyleConfigtoCuaStyleConfig ConsoleConfig ghcOptions selfCheckdo_argsyiyiDriverSide RightSideLeftSide configMain%=getmodifysetFrontendPreferences setFrontendglobalBindKeys modeBindKeysmodeBindKeysByNameaddModemodifyModeByNamefontNamefontSizescrollWheelAmount scrollStyle cursorStyle scrollBarSideautoHideScrollBarautoHideTabBarlineWrap windowFillthemedebug runOnStartuprunAfterStartupinputPreprocessmodes regionStylekillringAccumulate ModuleKind HiddenModule ExposedModule FolderKind PlainFolderHsSourceFolderFileKind LicenseText SetupScriptTextFileHSourceCSourceHsSource ProjectItem ModuleItem modItemName moduleKind PackageItem pkgItemNameFileItem fileItemName itemFPathfileKind FolderItemfolderItemName folderKindDependenciesItem depItemName projItemName itemVersionitemName greekData zipscriptsinsertfromListtoList lookupPrefix forcedNextpossibleSuffixes certainSuffixTrie liftMaybe $fBinaryTrieshow' compareBy mergeTrees'$fShowCompletionTree $fRefMVar $fRefIORefStepsbetterevalR'iBestfeedpushSymspushEof mkProcessrunProcessZipRPolishRStopRAppRPushLogEntryLSLSuspLFailLDoneLShiftLDislikeLEmptyLLogProfile:>PResPFailPSuspFailLogDislikeBestSusSh'ShiftDoneAppValDisjEmptShifBindApplPure:<top_restfirstsecond***mapSuccdislikeThreshold+>rightLogprofile countWidthapplytoQtoPfeedZevalLevalL'evalRPsimplifyevalRfullLogonRight $fShowZip $fMonadParser$fAlternativeParser$fApplicativeParser$fFunctorParser $fShowRPolish $fShowSteps dbgHandlelogStreamThreadprocessGetContents recurseDirsafeHeadsplitBy splitElemunSplitrevDropequating dropPrefix dropSuffix netEncode netDecode getNetstring skipWhite readCharN hexEncode hexDecodelogfile logAction setLogAction setLogfile getLogfilelogSunlessMshortenuncurry3-? DelayListdecreaseignoringExceptionprintingException orException normalisePathcanonicalizePath expandSym makeAbsolute combinePath splitPath replaceUpToreplaceShorthandsuserToCanonPath expandTilda isAbsolute'guessCabalStanzafindPackageDescguessCabalFilecatchIOversionbindirlibdirdatadir libexecdir sysconfdir getBinDir getLibDir getDataDir getLibexecDir getSysconfDirgetDataFileNamelinesappUserDataCondfingertree-0.1.0.0Data.FingerTree FingerTreefoldr splitAtLine'fromRopeIndices charIndex lineIndexChunk chunkSize fromChunkdefaultChunkSizemkChunk-||-newlinetoLazyByteStringfromLazyByteString cutExcess $fBinaryRope$fMeasuredSizeChunk $fMonoidSizecontainers-0.5.0.0 Data.Map.BasezipWithTchain$fBinaryHashMap$fInitializableMaybe otherwise$GHC.ShowShowControl.Applicative Applicative Data.FoldableFoldableData.Traversable TraversableBoolIntGHC.IntInt8Int16Int32Int64FalseTruedata-accessor-0.2.2.6 Data.Accessor<.setValgetValaccessorAccessorData.Accessor.Basic^:^.^=data-accessor-mtl-0.2.0.4Data.Accessor.Monad.MTL.State%: Data.Functionfix<**>liftAliftA2liftA3optional Data.Functor<$> Alternative<|>manysome*><*<*>puregetConst WrappedArrow WrapArrow unwrapArrow WrappedMonad WrapMonad unwrapMonadZipList getZipListshowShowS showsPrecshowList||not&&shows showString showParenshowCharflipconstControl.CategoryCategory.>>><<< Text.Show showListWithfoldr1foldr'foldl1foldl'foldlfoldMapfold traverse_sum sequence_ sequenceA_productornotElemmsum minimumByminimum maximumBymaximummapM_for_forM_foldrMfoldlMfindelem concatMapasumanyandallonidtraverse sequenceAsequencemapM mapAccumR mapAccumLforMforfoldMapDefault fmapDefault$fInitializableWindowRef$fSemiNumPointSize $fShowPoint$fShowBufferRef$fBinaryDirectionpush krAccumulate krLastYankmaxDepth$fBinaryKillringliteralPatternreversePattern searchOptmapLeftliteralPattern'$fUniplatePattern$fBinarySearchExp$fBinarySearchOptionregex-base-0.93.2Text.Regex.BasegetVersion_Text_Regex_BaseText.Regex.Base.RegexLike MatchOffset MatchLength MatchArray MatchTextmrSubs mrSubListmrAftermrMatchmrBeforeMR getExecOpts setExecOptsdefaultExecOptdefaultCompOpt blankExecOpt blankCompOpt RegexOptionsmakeRegexOptsM makeRegexM makeRegexOpts makeRegex RegexMaker matchOnceText matchAllText matchTest matchCountmatchAll matchOnce RegexLikematchMmatch RegexContextextractafterbeforeExtractgetAllSubmatches AllSubmatchesgetAllTextSubmatchesAllTextSubmatches getAllMatches AllMatchesgetAllTextMatchesAllTextMatchesregex-tdfa-1.2.0Text.Regex.TDFA=~~=~getVersion_Text_Regex_TDFAText.Regex.TDFA.CommonlastStarGreedy newSyntax rightAssoc multiline caseSensitive CompOption captureGroups ExecOptionRegexDynamictoDyn fromDynamic toSerialRep fromSerialRepDV DynamicHelperSerialDCV$fInitializableDynamicValues$fBinaryDynamicValues$fBinaryDynamic$fInitializableConfigVariables ordRegion $fShowRegion$fBinaryRegion pushEvent findWritesPriorWriteGetPlusPriorityWritesFailsGetsBindsReturns pullWrites$fShowP$fMonoidInteractState$fMonadInteractIwevent $fMonadPlusI$fMonadI$fAlternativeI$fApplicativeI $fFunctorI$fMonadInteractStateTwe HPairNStack SlidyWide SlidyTallWideTall$fInitializableAnyLayoutManager$fInitializableLayout VPairNStack splitList handleStack$fLayoutManagerTransposed$fTransposableLayout$fTransposableOrientation$fLayoutManagerVPairNStack$fLayoutManagerHPairNStack$fLayoutManagerSlidyWide$fLayoutManagerSlidyTall$fLayoutManagerWide$fLayoutManagerTall$fLayoutManagerAnyLayoutManager$fEqAnyLayoutManager $fShowLayout remapChar ctrlLowcasesetMetametaBit $fShowEvent $fOrdEventmodifyJumpList $fShowJump $fBinaryJump $fEqWindow $fShowWindow$fBinaryWindow tabWindowstabLayoutManager$fEqTab relayoutIfrelayout buildLayout $fShowTab $fBinaryTab$fShowMatchResult$fAlternativeMatchResult$fApplicativeMatchResult$fFunctorMatchResult$fFunctorScanner $fFunctorSpan$fFoldableSpan$fTraversableSpanmemhlCacheoverlays dirtyOffsetnewBI readChunk insertChars deleteCharsshiftMarkValuesizeBInelemsBI overlayUpdate addOverlayBI delOverlayBIstrokesRangesBI isValidUpdate applyUpdateIreverseUpdateIlineAtsolPoint solPoint' regexRegionBI modifyMarkBIgetMarkDefaultPosBI BufferImpl FBufferData markNames overlayLayer _overlayBegin _overlayEnd _overlayStyleHLStateMarks dummyHlState$fBinaryBufferImpl $fOrdOverlay $fEqOverlay$fBinaryMarkValue updateString updateSize$fBinaryUpdate mapOvlMarks getStreamgetIndexedStreamdelOverlayLayercharsFromSolBI newMarkBIgetMarkValueBIdeleteMarkValueBI getMarkBI setSyntaxBI touchSyntax updateSyntaxgetAstfocusAst$fBinaryUIUpdateundoInteractiveremIPaddIPundoUntilInteractiveasRedoSavedFilePoint$fBinaryChange$fBinaryURListbkey__undos bufferDynamic preferColpendingUpdates lastSyncTimereadOnly insertingconst2$fFunctorMarkSet$fFoldableMarkSet$fTraversableMarkSetidentselectionStyleprocesswinMarkslastActiveWindowpointFollowsWindowupdateTransactionInFlightupdateTransactionAccumSelectionStylehighlightSelectionrectangleSelection$fBinaryMarkSetrawbuf attributesidentAAbkey__AAundosAAbufferDynamicAA preferColAApendingUpdatesAAselectionStyleAA processAA winMarksAAlastActiveWindowAAlastSyncTimeAA readOnlyAA insertingAApointFollowsWindowAAupdateTransactionInFlightAAupdateTransactionAccumAA modifyRawbufqueryAndModifyRawbufattrsAupdateTransactionInFlightAupdateTransactionAccumA preferColAbufferDynamicAselectionStyleA winMarksAdefaultModeLine padString queryBuffer modifyBufferqueryAndModifyundoRedoepochcheckRO applyUpdate modifyMode0 withSyntax0 getInsMarkreplaceCharWithVerticalOffsetmaybeCharBelowBmaybeCharAboveBmaybeCharWithVerticalOffsetcolMove $fShowFBuffer $fEqFBuffer$fApplicativeBufferM $fBinaryMode$fBinarySelectionStyle$fBinaryFBuffer$fBinaryUTCTime$fBinaryAttributes replToMod skippingFirst skippingLast skippingNull genBoundaryisEndOfSentencechecks atBoundarydoUntilBisNlatViWordBoundaryatAnyViWordBoundaryatViWordBoundaryOnLineviWordCharTypeviWORDCharType atSepBoundary enclosingUnit$fYiVariableRegionStyle$fInitializableRegionStyle$fBinaryRegionStyleshellCommandSwitch read_chunktextObjectRegionB'parseTextObjecttoOuter IndexedStrmoveCh $fShowPosn $fOrdPosn $fShowTok $fFunctorTokAlexAcc AlexAccSkip AlexAccNone AlexLastAcc AlexLastSkipAlexNone AlexReturn AlexTokenAlexSkip AlexErrorAlexEOFAlexAddrAlexA# alex_base alex_table alex_check alex_deflt alex_accept stateToInit alexScan' alexScanUser'alex_scan_tkn'cmmscs alex_action_0 alex_action_1alexIndexInt16OffAddralexIndexInt32OffAddr quickIndexalexScan alexScanUser alex_scan_tkniUnbox$fFunctorAlexLastAccpruneNodesBefore firstThatlastThatfromLeafAfterToFinalallLeavesRelative'nodesAndChildIndex allLeavesIn getAllPathsNTTTNTestEmptyNodeallLeavesRelative nodesOnPath beforeChild afterChildallLeavesRelativeChildgoDownindexwalkDownwkDown nullSubtree getFirstTok getLastTok nodeRegiontAtarbitraryFromList arbitraryPath regionInside pointInsideprop_fromLeafAfterToFinalprop_allLeavesAfterprop_allLeavesBeforeprop_fromNodeToLeafAfterprop_fromNodeToFinal$fArbitraryNTTT$fArbitraryRegion$fEqTok$fArbitraryTest $fIsTreeTest$fFoldableTest MaybeOneMoreOneMoreNone manyToks'subTree $fFunctorTree$fFoldableTree$fTraversableTree $fIsTreeTree$fArbitraryPointIState BlockOpenIndentisParenmaxPosn alex_action_2 alex_action_3 alex_action_4 alex_action_5 alex_action_6 alex_action_7 alex_action_8 alex_action_9alex_action_10alex_action_11alex_action_12alex_action_13alex_action_14alex_action_15alex_action_16 AlexAccPredAlexAccSkipPred alexAndPredalexPrevCharIsalexPrevCharMatchesalexPrevCharIsOneOfalexRightContextnestcommalex_action_17alex_action_18alex_action_19alex_action_20alex_action_21alex_action_22alex_action_23alex_action_24alex_action_25alex_action_26alex_action_27alex_action_28alex_action_29alex_action_30alex_action_31alex_action_32alex_action_33alex_action_34alex_action_35alex_action_36alex_action_37alex_action_38alex_action_39alex_action_40alex_action_41alex_action_42alex_action_43alex_action_44alex_action_45alex_action_46alex_action_47alex_action_48alex_action_49alex_action_50alex_action_51alex_action_52pModulepModBodypEmptyBLpBodypVarIdpQvaridpQvarsym isOperatorpQtyconpVarsnextLine startBlockendBlocksymexactpleasepErrppConspKWpOP pCommentspOptpAtomppAtompCAtompSepBy pParenSeppComma pModuleDeclpTestTokpImportspImportpTypepDatapDataRHS pDerivingpForAllstrictFpEModulepLetpDopLambdapOfpClasspGuardpFunRHSpEqpManypBlockspBlocks'pBlockOf pBlockOf'pTopDeclpExpr'pExprpExprOrPatternpElem isNoiseErr isNotNoiserecognizedSymbolspCParenpCBracepCBrack noImportspEmptypToList recoverAtom pBareAtompExportpGadtpAtypepAtype'pContextpConstrspConstr pAlternativepWherepDeclpFunDecl pTypeDeclpBlockrecognizedSometimespPattern pExprElem pTypeExpr pTypeExpr' pTypeElemrecoverableSymbolspParenpBrackpEBrace $fIsTreeExp $fFoldableExpopToOpresToResStartbuiltinConstructorshtmlcomm multicomm LaTeXBlock CommentBlock unCommentCodeLine CodeBlock codeBlockcodeLinealex_action_53alex_action_54alex_action_55alex_action_56alex_action_57alex_action_58alex_action_59alex_action_60alex_action_61alex_action_62alex_action_63alex_action_64alex_action_65alex_action_66alex_action_67alex_action_68alex_action_69alex_action_70alex_action_71alex_action_72alex_action_73alex_action_74alex_action_75alex_action_76alex_action_77alex_action_78alex_action_79alex_action_80alex_action_81DiffDeclaration LineComment MessageLineKeyword SecondLineDigestdiffkeyword lineComment secondLine RuleCommandComplexExpansionIncludeDirective InCommentTopLevelcomplexExpansionincludeDirective ruleCommandbeginHombindspechomsplice HlInVariableHlInSubstRegex HlInPerldoc HlInHeredocHlInInterpHeredocNoIdentHlInInterpHeredocHlCollectHeredocIdentHlStartCollectHeredocIdent HlInStringHlInInterpStringHlInCodefromQuoteStateincreaseVarCastDepthdecreaseVarCastDepthexitVarIfZeroDepthcollectHeredocIdentheredoc interpHeredocinterpHeredocNoIdent interpStringperldocstartCollectHeredocIdentstringvariableHlCommitSummaryHlCommitMessage commitSummary spaceStyletabStyle getStrokeMod getStrokeImpgetStrtspStyle paintAtomisErrisErrNerrStylecomtk'tkTConsttkDConsttkImport$fStrokableStatement$fFoldableStatement$fFoldableParameters$fFoldableParExpr$fFoldableForContent$fFoldableBlock$fFoldableVarDecAss$fFoldableExpr$fFoldableArray$fStrokableArray$fStrokableTok$fStrokableKeyValue$fStrokableParExpr$fStrokableParameters$fStrokableExpr$fStrokableVarDecAss$fStrokableBlock$fStrokableForContent$fFailableKeyValue$fFailableExpr$fFailableParExpr$fFailableParameters$fFailableVarDecAss$fFailableBlock$fFailableForContent$fIsTreeStatement$fFoldableKeyValue dropWhile $fShowReport $fShowWarning $fShowError$fMonadEditorEditorM$fApplicativeEditorM$fBinaryEditor$fShowTempBufferNameHint$fYiVariableTempBufferNameHint!$fInitializableTempBufferNameHint$fBinaryTempBufferNameHint filterMatches isSingleton$fInitializableHistory$fInitializableMap$fYiVariableMap$fBinaryHistory readCTags TagsFileListTags$fInitializableTagsFileList$fInitializableTags$fYiVariableTagsFileList$fYiVariableTags $fBinaryTags$fYiVariableVimTagStack$fInitializableVimTagStack $fPEqEvent$fYiActionAction()$fYiActionBufferMx$fYiActionEditorMx$fYiActionYiMx $fYiActionIOx$fMonadEditorYiM$fMonadStateEditorYiM $fShowAction $fPEqAction$fYiVariableArticleDB$fInitializableArticleDB showErrorsdispatchcheckFileChangesclearAllSyntaxAndHideSelection msgEditor'terminateSubprocesses recoverMode postActionsshowEvspureMonYiVarstartSubprocessWatchersremoveSubprocessappendToBuffer pipeToBuffer waitForExitIsearch makeISearch isearchFunE isearchNext0 isearchNextiSearch isearchEndqrReplaceCurrent$fYiVariableIsearch$fInitializableIsearch regionFirst' CompletionveryQuickCompleteWordwordsAndCurrentWordwordsForCompletionInBufferwordsForCompletionwords' charClass$fYiVariableCompletion$fInitializableCompletionswitch bufferKeymap$fBinaryRepeatableAction$fBinaryRegister$fInitializableVimMode$fBinaryGotoCharCommand$fInitializableVimState$fBinaryVimMode$fYiVariableVimState$fBinaryVimStatespecMap invSpecMapspecList lookupMovelinewiseMotionsexclusiveMotionsinclusiveMotionsrepeatregionOfMoveB' moveForwardB moveBackwardB gotoXOrEOFwithDefaultCountmatchGotoMarkMovematchGotoCharMove $fFunctor(,,) combineActionspecials exitBinding rawPrintablereplayoneshotNormalBindingpasteRegisterBindingdigraphBinding printableprintableActioncompletionBinding cursorBindingexitReplaceModeinsertOrReplaceBinsertOrReplaceCharWithBelowBinsertOrReplaceCharWithAboveB escBindingactualReplaceBinding enterBinding editBinding$fShowExCommand evalHelper typeGetPromptDocType PromptablegetPromptedValue getPrompt getMinibuffercompletionFunctiondoPromptgetPromptedValueListgetMinibufferListenumAll textUnits$fPromptableCommandArguments$fDocTypeFilePatternTag$fDocTypeRegexTag$fDocTypeToKill$fDocTypeLineNumber$fPromptable::: $fShow:::$fYiAction(->)x$fPromptableBufferRef$fPromptableAnyMode$fPromptablePoint$fPromptableTextUnit$fPromptableDirection$fPromptableInt$fPromptableChar$fPromptable[] diredPath diredMarks diredEntriesdiredFilePoints diredNameCol diredCurrFile diredOpSucCnt diredOpForAllDiredOpDONoOp DOFeedbackDOChoiceDOInput DOCkOverwriteDOCheck DOConfirmDORemoveBuffer procDiredOp askDelFiles diredRefreshinsertDiredLinelinesToDisplay diredScanDir scanForUid scanForGidaskRenameFiles askCopyFiles fileFromPoint DiredState DiredEntry DiredNoInfoDiredNamedPipeDiredCharacterDeviceDiredBlockDevice DiredSocket DiredSymLinkDiredDir DiredFile DiredFileInfo permStringnumLinksownergrp sizeInBytesmodificationTimeString$fYiVariableDiredState$fInitializableDiredState$fBinaryDiredState DiredOpStateDORename DOCopyDir DOCopyFile DORemoveDir DORemoveFile DRStringsDRFilesDRDatesDRSizesDRGroupsDROwnersDRLinksDRPermsundrsbypassReadOnly filenameColOfresetDiredOpStateincDiredOpSucCntgetDiredOpStatemodDiredOpState diredDoDeldiredDoMarkedDel diredKeymap modeStringshortCalendarTimeToString diredMark diredMarkDeldiredMarkWithChardiredRefreshMark diredUnmarkdiredUnmarkPathdiredUnmarkAll currentDir diredRename diredCopy diredLoadnoFileAtThisLine markedFiles diredUpDirdiredCreateDir$fInitializableDiredOpState$fBinaryDiredEntry$fYiVariableDiredOpState$fBinaryDiredOpState formatRegionBmkShiftOperator JustOperatorOperandParseResult NoOperandPartialOperandJustMoveJustTextObject textObjectregionForOperatorLineB parseOperand parseCommandsplitCountModifierCommand removePwdeditshowEditnohlactionmodPastequitquitAllEsaveAndQuitAllE needsAWindowB substituteglobal allowedCmdswriteCmd writeAsCmdextensionMatchesStyleBasedMode isMakefile insideGroupghci GhciBuffer _ghciBuffer haskellLexerliterateHaskellLexer adjustBlockcleverAutoIndentHaskellBcleverAutoIndentHaskellCcolOf'tokCol nominalIndenttokText isLineComment contiguouscoalescecleverPrettifytokTypghciInferTypeOf$fYiVariableGhciBuffer$fYiVariableCabalBuffer jsCompile getJSBuffer mkJSBufferjsErrorsJSBufferjavaScriptAbstractjsSimpleIndentjsLexer$fYiVariableJSBuffer latexLexermkDigitBinding motionBindingchooseRegisterBinding zeroBinding repeatBinding jumpBindingsfinishingBingings pasteBefore pasteAfteroperatorBindingscontinuingBindingsnonrepeatableBindingssetMarkBinding searchWordE searchBindingcontinueSearchingrepeatGotoCharE enableVisualEcutCharEtabTraversalBinding withCountwithCountOnBuffer0 exBinding digitBindingschangeVisualStyleBindingregionOfSelectionB shiftDBindingmkOperatorBindingreplaceBindingswitchEdgeBinding insertBindingvtyscrsizeuiEditoruiDirtypicture renderTabBar hasTabBarwindowLinesDisp renderWindow drawWindowdrawTextcomputeHeights colorToAttr paintCharsuiThreaduiEndInputLoopuiEndRenderLoopconfigoAttrsRenderedmkUI fromVtyEvent fromVtyKey fromVtyMod layoutActionrequestRefreshscanrT getRegionImplwithAttributesgetYattributesToAttrlazystys trimHistories trimTagStackreadPersistentStatePersistentState histories vimTagStack aKillring aCurrentRegexMaxHistoryEntriesunMaxHistoryEntries#$fYiConfigVariableMaxHistoryEntries $fInitializableMaxHistoryEntries$fBinaryPersistentStateunMaxHistoryEntriesA runHookImpl$fHookType(->) $fHookTypeYiM$fHookTypeEditorMPublishedActionspublishedActions_ NamesCache$fYiVariableNamesCache$fInitializableNamesCache$fYiConfigVariableEvaluator$fInitializableEvaluatorpublishedActions_A errorRegexparseErrorMessageparseErrorMessageBprompt takeCommand"$fYiConfigVariablePublishedActions$fInitializablePublishedActions isFileBuffer maybeListgotoTag visitTagTablegetModifiedBuffers deservesSaveaskIndividualSaveselfSearchKeymap searchKeymapdigitttselfInsertKeymapsetMark unsetMark replaceSel deleteSelmoveKeysmoveselectrectotherdropToLastWordOfexitExfinishBindingYfinishBindingE finishPrereq finishAction failBindingEhistoryBinding editAction completionKm placeMark selectAlldeleteB' emacsKeys viActFirst viActBefore viBeginPosviEndPos viActAfterviWriteModifiedviSearchviSubins_modekwd_mode MViInsertionMVIunMVI ViInsertionViInsViCmdNoOpArbCmdViMoveNoMoveSeqMove ReplicateArbMovePercentageFileCharMoveGenMove MaybeMove$fYiVariableMViInsertion$fBinaryMViInsertion$fYiVariableViCmd$fInitializableViCmd $fBinaryViCmd viActFirstA viActBeforeA viBeginPosA viEndPosA viActAfterA SearchVariety Unbounded VimExCmdMapunMVI_AtildeopAcompleteCaseSensitiveAenableTagStackA v_top_levelA v_ins_charAv_optsA v_ex_cmdsAlastViCommandAcurrentViInsertionA applyViCmdregionOfViMove applyOperator emptyViInsgetViIns viInsTextviCommandOfViInsertioncommitLastInsertionEsavingCommandE'YsavingCommandEYsavingCommandBsavingCommandB'savingCommandB'YviMoveviReplicateMove ignoreExCmdexFileNameComplete findUserCmd viCharInfo viChar8InfoviFnewE withBuffer0' withBuffer' withEditor' percentMove jumpToMark setMarkHere getViMarkB mayGetViMarkBvalidMarkIdentifierviTagStackPushPos AbellaBuffer _abellaBuffer abellaModeGengetProofPointMarkgetTheoremPointMark abellaNext abellaAbort$fYiVariableAbellaBuffer$fMonoidSupertabExt$fMkSnippetCmdSnippetMark()$fMkSnippetCmdRWSTa$fMkSnippetCmd[]() $fOrdMarkInfo$fYiVariableDependentMarks$fYiVariableBufferMarks$fInitializableDependentMarks$fInitializableBufferMarks$fBinaryMarkInfo defVimKeymap handleEventpureHandleEventperformEvalIfNecessaryallPureBindingsdefaultPublishedActions escToMetaopenScratchBuffer nilKeymapOptseditorsusageversinfo getConfig OpenInTabsDebug GhcOption SelfCheck ConfigFileFrontendFileEditorNmLineNoVersionHelp frontendNamesdefaultConsoleConfigoptionsopenInTabsShortopenInTabsLong $fErrorErrrealMainshowErrorsInConfrunManyOnStartuprunManyAfterStartupwarnisModeRegisteredensureModeRegistered