diff --git a/.travis.yml b/.travis.yml index 6830d91cb..33d3ed82e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,6 @@ before_install: esac - cp cabal.config yi - - cp cabal.config yi-contrib - sudo add-apt-repository -y ppa:hvr/ghc - sudo apt-get update - sudo apt-get install cabal-install-1.20 ghc-$GHCVER libicu-dev @@ -45,14 +44,12 @@ script: - travis_retry cabal-1.20 install -j2 -fpango --enable-tests -ftesting --only-dependencies --reorder-goals --force-reinstalls - cabal-1.20 install -j1 -fpango --enable-tests -ftesting - cabal-1.20 test - - cd ../yi/example-configs + # - cd ../yi/example-configs # - for config in yi-*.hs; # do # ghc -Wall --make $config; # done; - - cd ../../yi-contrib - - cabal-1.20 install notifications: irc: "chat.freenode.net#yi" diff --git a/CHANGELOG b/CHANGELOG index 610e7dc34..b88684a76 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,6 +7,9 @@ * More intuitive justOneSep (emacs M-SPC) (#665) * Closer behaviour to emacs C-x 0 (#642) * Allow vim to close dired &c buffers (#649) + * yi-contrib was retired. yi-fuzzy-open and yi-snippet salvage the + somewhat useful parts. You can still view the user configs under + the yi-graveyard repository but they will not be maintained. 0.10.0 ------ diff --git a/yi-contrib/.gitignore b/yi-contrib/.gitignore deleted file mode 100644 index 7ca8272b9..000000000 --- a/yi-contrib/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.hi -*.hi-boot -*.o -*.o-boot -*.o.cmd -*.swp -Yi/Lexer/*.hs -.yi.*.dbg -dist/ diff --git a/yi-contrib/LICENSE b/yi-contrib/LICENSE deleted file mode 100644 index d60c31a97..000000000 --- a/yi-contrib/LICENSE +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/yi-contrib/Setup.hs b/yi-contrib/Setup.hs deleted file mode 100644 index 2b70bbbf2..000000000 --- a/yi-contrib/Setup.hs +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env runhaskell -import Distribution.Simple -main :: IO () -main = defaultMain diff --git a/yi-contrib/src/Yi/Config/Users/Amy.hs b/yi-contrib/src/Yi/Config/Users/Amy.hs deleted file mode 100644 index a891b6fb1..000000000 --- a/yi-contrib/src/Yi/Config/Users/Amy.hs +++ /dev/null @@ -1,55 +0,0 @@ -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_HADDOCK show-extensions #-} - --- | --- Module : Yi.Config.Users.Amy --- License : GPL-2 --- Maintainer : yi-devel@googlegroups.com --- Stability : experimental --- Portability : portable - -module Yi.Config.Users.Amy where - -import Yi -import Yi.Keymap.Cua - --- Import the desired UI as needed. --- Some are not complied in, so we import none here. - --- import Yi.UI.Vty (start) --- import Yi.UI.Pango (start) - -myConfig :: Config -myConfig = defaultCuaConfig { - -- Keymap Configuration - defaultKm = extendedCuaKeymapSet, - - -- UI Configuration - -- Override the default UI as such: - startFrontEnd = startFrontEnd myConfig, - -- Yi.UI.Vty.start -- for Vty - -- (can be overridden at the command line) - -- Options: - configUI = defaultUIConfig - { - configFontSize = Nothing, - -- 'Just 10' for specifying the size. - configTheme = configTheme defaultUIConfig, - -- darkBlueTheme -- Change the color scheme here. - - configWindowFill = ' ' - } - } - -defaultUIConfig :: UIConfig -defaultUIConfig = configUI myConfig - --- Add M-x (which is probably Alt-x on your system) to the default --- keyset, and have it launch our custom macro. -extendedCuaKeymapSet :: KeymapSet -extendedCuaKeymapSet = customizedCuaKeymapSet $ - choice [ metaCh 'x' ?>>! helloWorld ] - --- A custom macro -helloWorld :: YiM () -helloWorld = withCurrentBuffer $ insertN "Hello, world!" diff --git a/yi-contrib/src/Yi/Config/Users/Anders.hs b/yi-contrib/src/Yi/Config/Users/Anders.hs deleted file mode 100644 index e7bbfd8f2..000000000 --- a/yi-contrib/src/Yi/Config/Users/Anders.hs +++ /dev/null @@ -1,64 +0,0 @@ -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_HADDOCK show-extensions #-} - --- | --- Module : Yi.Config.Users.Anders --- License : GPL-2 --- Maintainer : yi-devel@googlegroups.com --- Stability : experimental --- Portability : portable - -module Yi.Config.Users.Anders (config, main) where - -import Control.Lens -import Data.Monoid -import Yi hiding (Block) -import Yi.Hoogle (hoogle) -import Yi.Lexer.Haskell (TT) -import qualified Yi.Mode.Haskell as H -import qualified Yi.Rope as R -import Yi.String (mapLines) -import Yi.Syntax.Haskell (Tree) - -config :: Config -config = defaultEmacsConfig - --- | Increase the indentation of the selection -increaseIndent :: BufferM () -increaseIndent = do - r <- getSelectRegionB - r' <- unitWiseRegion Yi.Line r - -- extend the region to full lines - modifyRegionB (mapLines $ R.cons ' ') r' - -- prepend each line with a space - -main :: IO () -main = yi $ config - { defaultKm = defaultKm config - , startFrontEnd = startFrontEnd config - , modeTable = - -- My precise mode with my hooks added - AnyMode (haskellModeHooks H.preciseMode) - -- My no annotations mode with mode hooks - : AnyMode (haskellModeHooks noAnnots) - : modeTable defaultConfig - } - --- | Set my hooks for nice features -haskellModeHooks :: Mode syntax -> Mode syntax -haskellModeHooks mode = - mode { modeName = "my " <> modeName mode - , modeKeymap = - topKeymapA %~ ((ctrlCh 'c' ?>> - choice [ ctrlCh 'l' ?>>! H.ghciLoadBuffer - , ctrl (char 'z') ?>>! H.ghciGet - , ctrl (char 'h') ?>>! hoogle - , ctrlCh 'r' ?>>! H.ghciSend ":r" - , ctrlCh 't' ?>>! H.ghciInferType - , ctrlCh 'n' ?>>! increaseIndent - ]) - <||) } - --- This is used in order to remove the unicode characters usually used. -noAnnots :: Mode (Tree TT) -noAnnots = H.preciseMode {modeName = "preciseNoUnicode"} diff --git a/yi-contrib/src/Yi/Config/Users/Cmcq.hs b/yi-contrib/src/Yi/Config/Users/Cmcq.hs deleted file mode 100644 index 67770d3af..000000000 --- a/yi-contrib/src/Yi/Config/Users/Cmcq.hs +++ /dev/null @@ -1,117 +0,0 @@ -{- - -If Yi is called with parameter "--type", it will insert 500 characters and exit. -With "--open", it will open a buffer, type, and kill the buffer, 50 times. -Pango and Vty frontends are supported. - -Pango build, test, profile: - - cabal build && - dist/build/yi/yi -fpango time +RTS -hr && - hp2ps -c yi.hp && - evince yi.ps - -Vty timing using the "empty-expect" package on Debian: - - empty -f -i in -o out -f dist/build/yi/yi time "$@" && - time cat out >/dev/null - --} - -import Yi -import Yi.Prelude -import Prelude (take) -import Yi.Keymap.Emacs (keymap) -import qualified Yi.UI.Common as Common -import qualified Yi.UI.Vty as Vty -import qualified Yi.UI.Pango as Pango -import Yi.Event (Event(Event),Key(KASCII,KEnter)) ---import Yi.Mode.Latex -import Yi.Mode.Haskell - -import Control.Concurrent (forkIO) -import System.IO (readFile) -import System.Environment -import Data.Char -import Graphics.UI.Gtk hiding (on, Region, Window, Action, Point, Style) -import Control.Exception -import qualified Data.List as L -nil :: IO a -> IO () -nil = (() <$) - -type IdleDo = [IO ()] -> IO () -idleDoVty :: IdleDo -idleDoVty = nil . forkIO . sequence_ - --- Run in the background enough that the display refereshes -idleDoPango :: IdleDo -idleDoPango = foldr idleDo1 (return ()) -idleDo1 :: IO () -> IO () -> IO () -idleDo1 a b = nil $ idleAdd (a >> b >> return False) priorityDefaultIdle - -main :: IO () -main = do - args <- getArgs - when ("--debug" `elem` args) (initDebug ".yi.dbg") - let typing = "--type" `elem` args - opening = "--open" `elem` args - pango = "-fpango" `elem` args - testing = typing || opening - - evs <- if typing then do typingEvs else openingEvs - - let mystart = if pango then Pango.start else Vty.start - let idleDo = if pango then idleDoPango else idleDoVty - withArgs (if testing then [] else args) . yi $ - defaultEmacsConfig - { defaultKm = keymap - , startActions = [] - , startFrontEnd = (if testing then timeStart idleDo evs else id) mystart - , configInputPreprocess = idAutomaton - } - -timeStart :: IdleDo -> [Event] -> UIBoot -> UIBoot -timeStart idleDo evs start p1 ch actionCh p4 = do - ui <- start p1 ch actionCh p4 - evaluate (L.length evs) - return ui - { Common.main = do - actionCh . (:[]) . makeAction . withCurrentBuffer $ setMode Yi.Mode.Haskell.fastMode - idleDo (fmap ch evs) - Common.main ui - } - --- Test sequences -typingEvs, openingEvs :: IO [Event] - -typingEvs = do - --text <- take 500 <$> readFile "doc/haskell08/haskell039-bernardy.tex" - text <- readFile "src/Yi/Buffer.hs" - return (fmap (\x -> Yi.Event.Event (keyFromFile x) []) text ++ quit) - -openingEvs = return (times 50 openAndKill ++ quit) - --- Event helpers -times :: Int -> [a] -> [a] -times n = concat . replicate n - -ckey, key :: Char -> Event -ckey x = Event (Yi.Event.KASCII x) [MCtrl] -key x = Event (Yi.Event.KASCII x) [] - -ret :: Event -ret = Event KEnter [] - -quit, openAndKill, open, blah, killmessages, close, confirm :: [Event] -quit = [ckey 'x', ckey 'c'] -openAndKill = open ++ blah ++ killmessages ++ close ++ confirm -open = [ckey 'x', ckey 'f', key 'z', ret] -blah = replicate 20 (key 'x') --- clear undo information from the *messages* buffer -killmessages = [ckey 'x', key 'b', ret, ckey 'x', key 'k', ret] -close = [ckey 'x', key 'k', ret] -confirm = [key 'y'] - -keyFromFile :: Char -> Key -keyFromFile '\n' = KEnter -keyFromFile x = KASCII x diff --git a/yi-contrib/src/Yi/Config/Users/Corey.hs b/yi-contrib/src/Yi/Config/Users/Corey.hs deleted file mode 100644 index 9a0e9531c..000000000 --- a/yi-contrib/src/Yi/Config/Users/Corey.hs +++ /dev/null @@ -1,126 +0,0 @@ -module Yi.Config.Users.Corey (config, main) where -{- An example yi.hs that uses the Vim keymap with these additions: - - Always uses the VTY UI by default. - - The color style is darkBlueTheme - - The insert mode of the Vim keymap has been extended with a few additions - I find useful. - -} -import Yi -import Yi.Keymap.Vim2 -import Yi.Buffer.Indent (indentAsPreviousB) -import Yi.Keymap.Keys -import Yi.Misc (adjBlock) - --- import qualified Yi.UI.Vty - -import Yi.Style.Library (darkBlueTheme) -import Data.List (isPrefixOf) -import Control.Monad (replicateM_) -import Control.Applicative -import Control.Lens hiding (Action) - -main = yi config - --- Set soft tabs of 4 spaces in width. -prefIndent :: Mode s -> Mode s -prefIndent m = m { - modeIndentSettings = IndentSettings - { - expandTabs = True, - shiftWidth = 4, - tabSize = 4 - }} - -config = defaultConfig - { - -- Use VTY as the default UI. - -- startFrontEnd = Yi.UI.Vty.start, - defaultKm = keymapSet, - modeTable = fmap (onMode prefIndent) (modeTable defaultConfig), - configUI = (configUI defaultConfig) - { - configTheme = darkBlueTheme - } - } - -{- -extendedVimKeymap = defKeymap `override` \super self -> super - { - v_top_level = - (deprioritize >> v_top_level super) - -- On 'o' in normal mode I always want to use the indent of the previous line. - -- TODO: If the line where the newline is to be inserted is inside a - -- block comment then the block comment should be "continued" - -- TODO: Ends up I'm trying to replicate vim's "autoindent" feature. This - -- should be made a function in Yi. - <|> (char 'o' ?>> beginIns self $ do - moveToEol - insertB '\n' - indentAsPreviousB - ) - -- On HLX (Haskell Language Extension) I want to go into insert mode such - -- that the cursor position is correctly placed to start entering the name - -- of an language extension in a LANGUAGE pragma. - -- A language pragma will take either the form - -- {-# LANGUAGE Foo #-} - -- or - -- >{-# LANGUAGE Foo #-} - -- The form should be chosen based on the current mode. - <|> ( pString "HXL" >> startExtesnionNameInsert self ), - v_ins_char = - (deprioritize >> v_ins_char super) - -- On enter I always want to use the indent of previous line - -- TODO: If the line where the newline is to be inserted is inside a - -- block comment then the block comment should be "continued" - -- TODO: Ends up I'm trying to replicate vim's "autoindent" feature. This - -- should be made a function in Yi. - <|> ( spec KEnter ?>>! do - insertB '\n' - indentAsPreviousB - ) - -- I want softtabs to be deleted as if they are tabs. So if the - -- current col is a multiple of 4 and the previous 4 characters - -- are spaces then delete all 4 characters. - -- TODO: Incorporate into Yi itself. - <|> ( spec KBS ?>>! do - c <- curCol - line <- readRegionB =<< regionOfPartB Line Backward - sw <- indentSettingsB >>= return . shiftWidth - let indentStr = replicate sw ' ' - toDel = if (c `mod` sw) /= 0 - then 1 - else if indentStr `isPrefixOf` reverse line - then sw - else 1 - adjBlock (-toDel) - replicateM_ toDel $ deleteB Character Backward - ) - -- On starting to write a block comment I want the close comment - -- text inserted automatically. - <|> choice - [ pString open_tag >>! do - insertN $ open_tag ++ " \n" - indentAsPreviousB - insertN $ " " ++ close_tag - lineUp - | (open_tag, close_tag) <- - [ ("{-", "-}") -- Haskell block comments - , ("/*", "*/") -- C++ block comments - ] - ] - } - - -startExtesnionNameInsert :: ModeMap -> I Event Action () -startExtesnionNameInsert self = beginIns self $ do - p_current <- pointB - m_current <- getMarkB (Just "'") - markPointA m_current .= p_current - moveTo $ Point 0 - insertB '\n' - moveTo $ Point 0 - insertN "{-# LANGUAGE " - p <- pointB - insertN " #-}" - moveTo p --} diff --git a/yi-contrib/src/Yi/Config/Users/Ertai.hs b/yi-contrib/src/Yi/Config/Users/Ertai.hs deleted file mode 100644 index b2d4752fb..000000000 --- a/yi-contrib/src/Yi/Config/Users/Ertai.hs +++ /dev/null @@ -1,120 +0,0 @@ -{-# LANGUAGE TypeFamilies #-} -module Yi.Config.Users.Ertai (config) where - -import Yi -import qualified Yi.Mode.Haskell as Haskell -import qualified Yi.Syntax.Haskell as Haskell -import qualified Yi.Lexer.Haskell as Haskell -import qualified Yi.Syntax.Strokes.Haskell as Haskell -import Data.List (isPrefixOf) -import Data.Maybe -import Data.Foldable (Foldable) -import Yi.Char.Unicode (greek, symbols) -import Control.Monad (replicateM_) -import Control.Applicative -import Control.Lens -import Yi.Keymap.Keys (char,(?>>!),(>>!)) -import Yi.Lexer.Alex (Tok) -import qualified Yi.Syntax.Tree as Tree -import Yi.Hoogle -import Yi.Buffer -import Yi.Keymap.Vim (viWrite, v_ex_cmds, v_top_level, v_ins_char, v_opts, tildeop, savingInsertStringB, savingDeleteCharB, exCmds, exHistInfixComplete') -import Yi.Keymap (withModeY) -import Yi.MiniBuffer (matchingBufferNames) -import qualified Yi.Keymap.Vim as Vim - -myModetable :: [AnyMode] -myModetable = [ - AnyMode $ haskellModeHooks Haskell.cleverMode - , - AnyMode $ haskellModeHooks Haskell.preciseMode - , - AnyMode $ haskellModeHooks Haskell.fastMode - , - AnyMode . haskellModeHooks $ Haskell.cleverMode - , - AnyMode $ haskellModeHooks Haskell.fastMode - , - AnyMode . haskellModeHooks $ Haskell.fastMode - ] - -type Endom a = a -> a - -haskellModeHooks :: (Foldable f) => Endom (Mode (f Haskell.TT)) -haskellModeHooks mode = - -- uncomment for shim: - -- Shim.minorMode $ - mode { - -- modeAdjustBlock = \_ _ -> return (), - -- modeGetStrokes = \_ _ _ _ -> [], - modeName = "my " ++ modeName mode, - -- example of Mode-local rebinding - modeKeymap = topKeymapA %~ - ((char '\\' ?>> choice [char 'l' ?>>! Haskell.ghciLoadBuffer, - char 'z' ?>>! Haskell.ghciGet, - char 'h' ?>>! hoogle, - char 'r' ?>>! Haskell.ghciSend ":r", - char 't' ?>>! Haskell.ghciInferType - ]) - <||) - } - -{- -main :: IO () -main = do args <- getArgs - if any ("--as=" `isPrefixOf`) args - then yi defaultConfig - else yi $ myConfig defaultVimConfig --} - -config :: Config -config = defaultVimConfig { modeTable = fmap (onMode prefIndent) (myModetable ++ modeTable defaultVimConfig) - , defaultKm = Vim.mkKeymap extendedVimKeymap - , startActions = startActions defaultVimConfig ++ [makeAction (maxStatusHeightA .= 10 :: EditorM ())] - } - --- Set soft tabs of 4 spaces in width. -prefIndent :: Mode s -> Mode s -prefIndent m = m { modeIndentSettings = IndentSettings { expandTabs = True - , shiftWidth = 2 - , tabSize = 2 } - } - -mkInputMethod :: [(String,String)] -> Keymap -mkInputMethod xs = choice [pString i >> adjustPriority (negate (length i)) >>! savingInsertStringB o | (i,o) <- xs] - -extraInput :: Keymap -extraInput = ctrl (char ']') ?>> mkInputMethod (greek ++ symbols) - --- need something better -unicodifySymbols :: BufferM () -unicodifySymbols = modifyRegionB f =<< regionOfB unitViWORD - where f x = fromMaybe x $ lookup x (greek ++ symbols) - -extendedVimKeymap :: Proto Vim.ModeMap -extendedVimKeymap = Vim.defKeymap `override` \super self -> super - { v_top_level = (deprioritize >> v_top_level super) - <|> (char ',' ?>>! viWrite) - <|> ((events $ map char "\\u") >>! unicodifySymbols) - <|> ((events $ map char "\\c") >>! withModeY modeToggleCommentSelection) - , v_ins_char = - (deprioritize >> v_ins_char super) - -- I want softtabs to be deleted as if they are tabs. So if the - -- current col is a multiple of 4 and the previous 4 characters - -- are spaces then delete all 4 characters. - <|> (spec KBS ?>>! do - c <- curCol - line <- readRegionB =<< regionOfPartB Line Backward - sw <- indentSettingsB >>= return . shiftWidth - let indentStr = replicate sw ' ' - toDel | (c `mod` sw) == 0 && indentStr `isPrefixOf` reverse line = sw - | otherwise = 1 - replicateM_ toDel $ savingDeleteCharB Backward - ) - <|> (adjustPriority (-1) >> extraInput) - , v_opts = (v_opts super) { tildeop = True } - , v_ex_cmds = exCmds [("b", - withEditor . switchToBufferWithNameE, - Just $ exHistInfixComplete' True matchingBufferNames)] - } - diff --git a/yi-contrib/src/Yi/Config/Users/Gwern.hs b/yi-contrib/src/Yi/Config/Users/Gwern.hs deleted file mode 100644 index 800759d3c..000000000 --- a/yi-contrib/src/Yi/Config/Users/Gwern.hs +++ /dev/null @@ -1,34 +0,0 @@ -module Yi.Config.Users.Gwern (config) where - -import Control.Lens -import Yi -import Yi.Hoogle (hoogle) -import Yi.Keymap.Emacs (defKeymap, _eKeymap, mkKeymap) -import qualified Yi.Mode.Haskell as H -import qualified Yi.Mode.IReader as IReader (ireaderMode) - -config :: Config -config = defaultEmacsConfig - { modeTable = AnyMode bestHaskellMode : AnyMode IReader.ireaderMode : modeTable defaultConfig, - -- Keymap Configuration - defaultKm = myKeymap, - configUI = defaultUIConfig {configFontSize = Nothing, configWindowFill = ' '} } - where defaultUIConfig :: UIConfig - defaultUIConfig = configUI defaultConfig - -- bestHaskellMode :: Mode (Tree (Tok Token)) - bestHaskellMode = -- Shim.minorMode $ - H.cleverMode { modeKeymap = - topKeymapA %~ ((ctrlCh 'c' ?>> choice [ctrlCh 'l' ?>>! H.ghciLoadBuffer, - ctrl (char 'z') ?>>! H.ghciGet, - ctrl (char 'h') ?>>! hoogle, - ctrlCh 'r' ?>>! H.ghciSend ":r", - ctrlCh 't' ?>>! H.ghciInferType]) - <||) } - -myKeymap :: KeymapSet -myKeymap = mkKeymap $ override Yi.Keymap.Emacs.defKeymap $ \proto _self -> - proto { _eKeymap = _eKeymap proto ||> - -- Add a M-g binding for goto-line - (metaCh 'g' ?>>! gotoLn) - -- Use a more clever binding for Home - ||> (spec KHome ?>>! moveNonspaceOrSol) } diff --git a/yi-contrib/src/Yi/Config/Users/JP.hs b/yi-contrib/src/Yi/Config/Users/JP.hs deleted file mode 100644 index 9691e9e9f..000000000 --- a/yi-contrib/src/Yi/Config/Users/JP.hs +++ /dev/null @@ -1,306 +0,0 @@ -{-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_HADDOCK show-extensions #-} - --- | --- Module : Yi.Config.Users.JP --- License : GPL-2 --- Maintainer : yi-devel@googlegroups.com --- Stability : experimental --- Portability : portable - -module Yi.Config.Users.JP (config) where - --- import Yi.Users.JP.Experimental (keymap) --- You can use other keymap by importing some other module: --- import Yi.Keymap.Cua (keymap) - --- If configured with ghcAPI, Shim Mode can be enabled: --- import qualified Yi.Mode.Shim as Shim - -import Control.Applicative -import Control.Lens -import Data.Foldable (Foldable,find) -import Data.Monoid -import Data.Traversable (sequenceA) -import Yi hiding (defaultConfig) -import Yi.Hoogle -import qualified Yi.Interact as I -import Yi.Keymap.Emacs (mkKeymap, defKeymap, ModeMap(..)) -import Yi.Lexer.Alex (tokToSpan, Tok) -import Yi.Lexer.Haskell as Hask -import Yi.Mode.Haskell as Haskell -import qualified Yi.Rope as R -import Yi.String -import Yi.Syntax -import Yi.Syntax.Tree - -increaseIndent :: BufferM () -increaseIndent = modifyExtendedSelectionB Yi.Line $ mapLines (R.cons ' ') - -decreaseIndent :: BufferM () -decreaseIndent = modifyExtendedSelectionB Yi.Line $ mapLines (R.drop 1) - -osx :: Bool -#ifdef darwin_HOST_OS -osx = True -#else -osx = False -#endif - - -tokenToText :: Token -> Maybe String -tokenToText (Hask.ReservedOp Hask.BackSlash) = Just "λ" -tokenToText (Hask.ReservedOp Hask.RightArrow) = Just "→" -- should be → in types and · in exprs -tokenToText (Hask.ReservedOp Hask.DoubleRightArrow) = Just $ if osx then "⇒ " else "⇒" -tokenToText (Hask.ReservedOp Hask.LeftArrow) = Just $ if osx then "← " else "←" --- tokenToText (Hask.Operator ".") = Just "∘" -- should be · or . in types and ∘ in exprs -tokenToText (Hask.Operator "/=") = Just "≠" -tokenToText (Hask.Operator "==") = Just "≡" -tokenToText (Hask.Operator ">=") = Just "≥" -tokenToText (Hask.Operator "<=") = Just "≤" -tokenToText (Hask.Operator "&&") = Just "∧" -tokenToText (Hask.Operator "||") = Just "∨" -tokenToText _ = Nothing - - -haskellModeHooks :: (Foldable tree) => Mode (tree (Tok Token)) -> Mode (tree (Tok Token)) -haskellModeHooks mode = - -- uncomment for shim: - -- Shim.minorMode $ - mode { - - -- modeAdjustBlock = \_ _ -> return (), - -- modeGetStrokes = \_ _ _ _ -> [], - modeName = "my " <> modeName mode, - -- example of Mode-local rebinding - modeKeymap = topKeymapA %~ ((ctrlCh 'c' ?>> choice [ctrlCh 'l' ?>>! ghciLoadBuffer, - ctrl (char 'z') ?>>! ghciGet, - ctrl (char 'h') ?>>! hoogle, - ctrlCh 'r' ?>>! ghciSend ":r", - ctrlCh 't' ?>>! ghciInferType - ]) - <||) - } - --- noAnnots _ _ = [] - -mkInputMethod :: [(String, R.YiString)] -> Keymap -mkInputMethod xs = choice [pString i >> adjustPriority (negate (length i)) >>! insertN o | (i,o) <- xs] - -extraInput :: Keymap -extraInput - = spec KEsc ?>> mkInputMethod (greek <> symbols <> subscripts) - - -tta :: Yi.Lexer.Alex.Tok Token -> Maybe (Yi.Syntax.Span String) -tta = sequenceA . tokToSpan . (fmap Yi.Config.Users.JP.tokenToText) - -frontend :: UIBoot -Just (_, frontend) = foldr1 (<|>) $ fmap (\nm -> find ((nm ==) . fst) availableFrontends) ["vty"] - -defaultConfig :: Config -defaultConfig = defaultEmacsConfig - -deleteB' :: BufferM () -deleteB' = adjBlock (-1) >> deleteN 1 - --- restore sanity in 1-character deletes. -fixKeymap :: Keymap -fixKeymap = choice [(ctrlCh 'd' ?>>! (deleteB')) - , spec KBS ?>>! ((adjBlock (-1) >> bdeleteB)) - , spec KDel ?>>! ((deleteB'))] - - -myKeymap :: KeymapSet -myKeymap = mkKeymap $ override defKeymap $ \proto _self -> - proto { - _completionCaseSensitive = True, - _eKeymap = (adjustPriority (-1) >> choice [extraInput]) <|| (fixKeymap <|| _eKeymap proto) - <|> (ctrl (char '>') ?>>! increaseIndent) - <|> (ctrl (char '<') ?>>! decreaseIndent) - } - -config :: Config -config = defaultConfig { - configInputPreprocess = I.idAutomaton, - startFrontEnd = frontend, - modeTable = AnyMode (haskellModeHooks Haskell.preciseMode) - : AnyMode (haskellModeHooks Haskell.cleverMode) - : AnyMode (haskellModeHooks Haskell.fastMode) - : AnyMode (haskellModeHooks Haskell.literateMode) - : modeTable defaultConfig, - configUI = (configUI defaultConfig) - { configFontSize = Just 10 - -- , configTheme = darkBlueTheme - , configTheme = defaultTheme `override` \superTheme _ -> superTheme - { - selectedStyle = Endo $ \a -> a { - foreground = white, - background = black - } - } - -- , configFontName = Just "Monaco" - }, - defaultKm = myKeymap - } - -greek :: [(String, R.YiString)] -greek = [("alpha", "α") - ,("'a", "α") - ,("beta", "β") - ,("'b", "β") - ,("gamma", "γ") - ,("'g", "γ") - ,("Gamma", "Γ") - ,("'G", "Γ") - ,("delta", "δ") - ,("'d", "δ") - ,("Delta", "Δ") - ,("'D", "Δ") - ,("epsilon", "ε") - ,("'z", "ζ") - ,("zeta", "ζ") - ,("'z", "ζ") - ,("eta", "η") - ,("theta", "θ") - ,("Theta", "Θ") - ,("iota", "ι") - ,("'i", "ι") - ,("kapa", "κ") - ,("'k", "κ") - ,("lambda", "λ") - ,("'l", "λ") - ,("Lambda", "Λ") - ,("'L", "Λ") - ,("mu", "μ") - ,("'m", "μ") - ,("nu", "ν") - ,("'n", "ν") - ,("xi", "ξ") - ,("'x", "ξ") - ,("omicron", "ο") - ,("'o", "ο") - ,("pi", "π") - ,("Pi", "Π") - ,("rho", "ρ") - ,("'r", "ρ") - ,("sigma", "σ") - ,("'s", "σ") - ,("Sigma", "Σ") - ,("'S", "Σ") - ,("tau", "τ") - ,("'t", "τ") - ,("phi", "φ") - ,("Phi", "Φ") - ,("chi", "χ") - ,("Chi", "Χ") - ,("psi", "ψ") - ,("Psi", "Ψ") - ,("omega", "ω") - ,("'w", "ω") - ,("Omega", "Ω") - ,("'O", "Ω") - ] - -symbols :: [(String, R.YiString)] -symbols = - [ - -- parens - ("<","⟨") - ,(">","⟩") - ,(">>","⟫") - ,("<<","⟪") - - ,("[[","⟦") - ,("]]","⟧") - - -- quantifiers - ,("forall", "∀") - ,("exists", "∃") - - -- operators - ,("<|","◃") - -- ,("<|","◁") alternative - ,("|>","▹") - ,("v","∨") - ,("u","∪") - ,("V","⋁") - ,("^","∧") - ,("o","∘") - ,(".","·") - ,("x","×") - ,("neg","¬") - - --- arrows - ,("<-","←") - ,("->","→") - ,("|->","↦") - ,("<-|","↤") - ,("<--","⟵") - ,("-->","⟶") - ,("|-->","⟼") - ,("==>","⟹") - ,("=>","⇒") - ,("<=","⇐") - ,("~>","↝") - ,("<~","↜") - ,("<-<", "↢") - ,(">->", "↣") - ,("<->", "↔") - ,("|<-", "⇤") - ,("->|", "⇥") - - --- relations - ,("c=","⊆") - ,("c","⊂") - ,("c-","∈") - ,("/c-","∉") - ,(">=","≥") - ,("=<","≤") - - ---- equal signs - ,("=def","≝") - ,("=?","≟") - ,("=-","≡") - ,("~=","≃") - ,("/=","≠") - - -- misc - ,("_|_","⊥") - ,("Top","⊤") - ,("|N","ℕ") - ,("|P","ℙ") - ,("|R","ℝ") - ,("^n","ⁿ") - ,("::","∷") - ,("0", "∅") - ,("*", "★") -- or "⋆" - - -- dashes - ,("-","−") - - -- quotes - ,("\"","“”") - - -- turnstyles - ,("|-", "⊢") - ,("|/-", "⊬") - ,("-|", "⊣") - ,("|=", "⊨") - ,("|/=", "⊭") - ,("||-", "⊩") - - ] - --- More: --- arrows: ⇸ ⇆ --- set: ⊇ ⊃ --- circled operators: ⊕ ⊖ ⊗ ⊘ ⊙ ⊚ ⊛ ⊜ ⊝ ⍟ ⎊ ⎉ --- squared operators: ⊞ ⊟ ⊠ ⊡ --- turnstyles: ⊦ ⊧ - - -subscripts :: [(String, R.YiString)] -subscripts = zip (fmap (('_':). (:[])) "0123456789+-=()") - (fmap R.singleton "₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎") diff --git a/yi-contrib/src/Yi/Config/Users/JP/Experimental.hs b/yi-contrib/src/Yi/Config/Users/JP/Experimental.hs deleted file mode 100644 index 1fd05d7b8..000000000 --- a/yi-contrib/src/Yi/Config/Users/JP/Experimental.hs +++ /dev/null @@ -1,233 +0,0 @@ -{-# LANGUAGE FlexibleContexts #-} -module Yi.Users.JP.Experimental where --- This is an attempt at a completely "normalized" keymap. --- Choose your mode/unit with the left hand; --- Perform commands with the right hand. - -import Prelude (zipWith) -import Control.Monad.State -import Data.Char -import Yi.Keymap.Emacs.Utils -import Yi.Rectangle -import Yi -import qualified Yi.Interact as I (choice, I()) - --- | Enhanced keymap type, where the current unit is remembered using a StateT -type KM a = (StateT (TextUnit, String) (I.I Event Action)) a - - -{- - We'll assume QWERTY layout: - -qqq www eee rrr ttt yyy uuu iii ooo ppp - aaa sss ddd fff ggg hhh jjj kkk lll ;;; - zzz xxx ccc vvv bbb nnn mmm ,,, ... /// --} - --- | Keyboard layout definition -leftHand, rightHand :: [String] -leftHand = ["qwert", "asdfg", "zxcvb"] -rightHand = ["yuiop", "hjkl;", "nm,./"] - --- data Mark = Paste | SetMark | Cut | Copy | SwitchMark --- data Special = Complete | Undo | Indent | Search - --- Special shift for events that understands qwerty layout. -shi_ :: Event ->Event -shi_ (Event (KASCII c) ms) | isAlpha c = Event (KASCII (toUpper c)) ms -shi_ (Event (KASCII ',') ms) = Event (KASCII '<') ms -shi_ (Event (KASCII '.') ms) = Event (KASCII '>') ms -shi_ (Event (KASCII '/') ms) = Event (KASCII '?') ms -shi_ (Event (KASCII ';') ms) = Event (KASCII ':') ms -shi_ (Event (KASCII '\'') ms) = Event (KASCII '"') ms -shi_ (Event (KASCII '[') ms) = Event (KASCII '{') ms -shi_ (Event (KASCII ']') ms) = Event (KASCII '}') ms -shi_ _ = error "shi_: unhandled event" - - -selfInsertKeymap :: KM () -selfInsertKeymap = do - c <- printableChar - write (insertB c) - -retKeymap :: KM () -retKeymap = do - Event KEnter [] <- anyEvent - write (insertB '\n') - -insertKeymap :: KM () -insertKeymap = do - event $ char 'g' - write $ msgEditor "-- INSERT --" - many $ do - write $ msgEditor "-- INSERT --" - (selfInsertKeymap <|> retKeymap <|> quickCmdKeymap) <|| unrecognized - quitInsert - return () - -quitInsert :: KM Event -quitInsert = oneOf [ctrl $ spec KEnter, spec KEsc, ctrlCh '\\'] - -quickCmdKeymap :: KM () -quickCmdKeymap = mkCmdKeymap (return Character) ctrl - <|> mkCmdKeymap (return unitWord) (ctrl . shi_) - -quitKeymap :: KM () -quitKeymap = do - Event KEsc [] <- anyEvent - write quitEditor - -unrecognized :: KM () -unrecognized = do - e <- anyEvent - write (msgEditor $ "unrecognized: " ++ show e) - -commandsKeymap :: KM () -commandsKeymap = do - (_, unitName) <- get - write $ msgEditor $ "-- CMD: " ++ unitName - quitKeymap <|| (I.choice $ insertKeymap : cmds : concat unts) - where - cmds = mkCmdKeymap (fst <$> get) id - unts = zipWith (zipWith mkUnt) units leftHand - mkUnt unt ch = do - event $ char ch - put unt - -mkCmdKeymap :: KM TextUnit -> (Event -> Event) -> KM () -mkCmdKeymap getUnit mods = I.choice $ concat $ zipWith (zipWith mkCmd) commands rightHand - where mkCmd cmd ch = do - event $ mods $ char ch - unt <- getUnit - write (cmd unt) - -keymap :: Keymap -keymap = runKM $ forever $ choice - [ - metaCh 'x' ?>>! executeExtendedCommandE, - commandsKeymap, - ctrlCh 'x' ?>> ctrlX - ] - - -{- -Commands: (right hand) - - - cop cut del del com ??? - pop pas mov mov sea ''' - mpp mxp xpo xpo und - -com: complete -und: undo -sea: start incremental search of the Unit at point -pop: pop-yank -pas: paste -xpo: transpose in given direction -''': search start from empty -mxp: exchange point and mark -mpp: mark pop -cop: copy - --} - -commands :: [[TextUnit -> BufferM ()]] -commands = [[copy, cut, del b, del f, complete], - [pop, paste, move b, move f, search], - [mpp, mxp, xpo b, xpo f, undo]] - where copy = todo - cut = todo - pop = todo - mpp = todo - mxp = todo - complete = todo - paste = todo - search = todo - undo = const undoB - move dir u = moveB u dir - del dir u = deleteB u dir - xpo dir u = transposeB u dir - b = Backward - f = Forward - todo = const $ return () - - -{- -Units: (left hand) - - -doc pag col ver ovr - par lin wor cha ins - *** *** *** sea buf --} - -document, page, column :: TextUnit -document = Character -page = Character -column = Character - -units :: [[(TextUnit, String)]] -units = [ - [(document, "DOC"), (page, "PAGE"), (column, "COL"), (VLine, "VER")], -- ↕ - [(unitParagraph, "PARA"), (Line, "Line"), (unitWord, "Word"), (Character, "Char")] - ] - -runKM :: KM () -> Keymap -runKM p = fmap fst $ runStateT p (Character, "Char") - -{- -ins: go to insert mode -ovr: go to overwrite mode -sea: navigate searched items. - - -... free -*** reserved for normal emacs usage. - ----------- - - -C-: briefly switch to character mode -M-: briefly switch to word mode - -C-mode: go to that mode - --} - - - - ------------- --- C-x commands borrowed from emacs. - -ctrlX :: KM () -ctrlX = - choice [ ctrlCh 'o' ?>>! deleteBlankLinesB - , char '0' ?>>! closeWindow - , char '1' ?>>! closeOtherE - , char '2' ?>>! splitE - , char 's' ?>>! askSaveEditor - , ctrlCh 'c' ?>>! askQuitEditor - , ctrlCh 'f' ?>>! findFile - , ctrlCh 's' ?>>! fwriteE - , ctrlCh 'w' ?>>! promptFile "Write file:" fwriteToE - , ctrlCh 'x' ?>>! (exchangePointAndMarkB >> - putA highlightSelectionA True) - , char 'b' ?>>! switchBufferE - , char 'd' ?>>! dired - , char 'e' ?>> - char 'e' ?>>! evalRegionE - , char 'o' ?>>! nextWinE - , char 'k' ?>>! killBufferE - , char 'r' ?>> rectangleFuntions - , char 'u' ?>>! undoB - , char 'v' ?>>! shrinkWinE - ] - -rectangleFuntions :: KM () -rectangleFuntions = choice [char 'a' ?>>! alignRegionOn, - char 'o' ?>>! openRectangle, - char 't' ?>>! stringRectangle, - char 'k' ?>>! killRectangle, - char 'y' ?>>! yankRectangle - ] diff --git a/yi-contrib/src/Yi/Config/Users/Jeff.hs b/yi-contrib/src/Yi/Config/Users/Jeff.hs deleted file mode 100644 index 96c4ca55b..000000000 --- a/yi-contrib/src/Yi/Config/Users/Jeff.hs +++ /dev/null @@ -1,44 +0,0 @@ -{-# LANGUAGE DeriveDataTypeable, FlexibleContexts, FlexibleInstances, - FunctionalDependencies, GeneralizedNewtypeDeriving, - MultiParamTypeClasses, TypeSynonymInstances #-} -module Yi.Config.Users.Jeff (myConfig) where - -import Control.Applicative -import Control.Lens - -import Yi - -import Yi.Keymap.Vim -import Yi.Snippets -import Yi.Snippets.Haskell --- import Yi.UI.Pango as Pango --- import Yi.UI.Vty as Vty - -myConfig :: Config -myConfig = defaultVimConfig - { defaultKm = myVimKeymap - , configUI = (configUI defaultVimConfig) - { configTheme = defaultTheme - , configWindowFill = '~' - } - , startActions = [makeAction (maxStatusHeightA .= 20 :: EditorM ())] - -- , startFrontEnd = Pango.start - } - -myVimKeymap = mkKeymap $ defKeymap `override` \super self -> super - { v_top_level = v_top_level super ||> - (char ';' ?>>! resetRegexE) - - , v_ins_char = (v_ins_char super ||> tabKeymap) <|> - choice [ ctrlCh 's' ?>>! moveToNextBufferMark deleteSnippets - , meta (spec KLeft) ?>>! prevWordB - , meta (spec KRight) ?>>! nextWordB - ] - } - -deleteSnippets = True - -tabKeymap = superTab True $ fromSnippets deleteSnippets $ - [ ("f", hsFunction) - , ("c", hsClass) - ] diff --git a/yi-contrib/src/Yi/Config/Users/Michal.hs b/yi-contrib/src/Yi/Config/Users/Michal.hs deleted file mode 100644 index caaa1bc53..000000000 --- a/yi-contrib/src/Yi/Config/Users/Michal.hs +++ /dev/null @@ -1,169 +0,0 @@ -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_HADDOCK show-extensions #-} - --- | --- Module : Yi.Config.Users.Michal --- License : GPL-2 --- Maintainer : yi-devel@googlegroups.com --- Stability : experimental --- Portability : portable - -module Yi.Config.Users.Michal where - -import Data.Bool -import Data.Eq -import Data.Function -import Data.List (isPrefixOf, isSuffixOf) -import Data.Monoid ((<>)) -import qualified Data.Text as T -import Data.Time.Clock (getCurrentTime) -import Data.Time.Format (formatTime) -import Prelude (String, take, length, repeat, fmap, IO, Monad(..), (>>)) -import System.FilePath (takeFileName) -import System.Locale (defaultTimeLocale) -import Yi hiding (super) -import qualified Yi.Keymap.Vim as V2 -import qualified Yi.Keymap.Vim.Common as V2 -import qualified Yi.Keymap.Vim.Utils as V2 -import qualified Yi.Rope as R -import qualified Yi.Style (Color(Default)) - -myConfig :: Config -myConfig = defaultVimConfig { - modeTable = myModes <> fmap (onMode prefIndent) (modeTable defaultVimConfig), - defaultKm = myKeymapSet, - configCheckExternalChangesObsessively = False, - configUI = (configUI defaultVimConfig) - { - configTheme = myTheme, - configWindowFill = '~' -- Typical for Vim - } -} - -defaultSearchKeymap :: Keymap -defaultSearchKeymap = do - Event (KASCII c) [] <- anyEvent - write . isearchAddE $ T.singleton c - -myKeymapSet :: KeymapSet -myKeymapSet = V2.mkKeymapSet $ V2.defVimConfig `override` \super this -> - let eval = V2.pureEval this - in super { - -- Here we can add custom bindings. - -- See Yi.Keymap.Vim.Common for datatypes and - -- Yi.Keymap.Vim.Utils for useful functions like mkStringBindingE - - -- In case of conflict, that is if there exist multiple bindings - -- whose prereq function returns WholeMatch, - -- the first such binding is used. - -- So it's important to have custom bindings first. - V2.vimBindings = myBindings eval <> V2.vimBindings super - } - -myBindings :: (V2.EventString -> EditorM ()) -> [V2.VimBinding] -myBindings eval = - let nmap x y = V2.mkStringBindingE V2.Normal V2.Drop (x, y, id) - imap x y = V2.VimBindingE (\evs state -> case V2.vsMode state of - V2.Insert _ -> - fmap (const (y >> return V2.Continue)) - (evs `V2.matchesString` x) - _ -> V2.NoMatch) - nmap' x y = V2.mkStringBindingY V2.Normal (x, y, id) - in [ - -- Tab traversal - nmap "" previousTabE - , nmap "" nextTabE - , nmap "" nextTabE - - -- Press space to clear incremental search highlight - , nmap " " (eval ":nohlsearch") - - -- for times when you don't press shift hard enough - , nmap ";" (eval ":") - - , nmap "" (withCurrentBuffer deleteTrailingSpaceB) - , nmap "" (withCurrentBuffer moveToSol) - , nmap "" (withCurrentBuffer readCurrentWordB >>= printMsg . R.toText) - - , imap "" (withCurrentBuffer moveToSol) - , imap "" (withCurrentBuffer moveToEol) - , nmap' "" insertCurrentDate - ] - --- | I declare "proper black" in GTK, since Vty terminal seems to have grayish black in 16-color system. --- Fortunately default _background_ color is available through Default :: Yi.Style.Color. --- Note that this works only in background! (Default foreground color is green.) -defaultColor :: Yi.Style.Color -defaultColor = Yi.Style.Default - --- This is based on Vim's ':colorscheme murphy', but with gray strings, and more brown on operators. -myTheme :: Proto UIStyle -myTheme = defaultTheme `override` \super _ -> super - { modelineAttributes = emptyAttributes { foreground = black, background = darkcyan } - , tabBarAttributes = emptyAttributes { foreground = white, background = defaultColor } - , baseAttributes = emptyAttributes { foreground = defaultColor, background = defaultColor, bold=True } - , commentStyle = withFg darkred <> withBd False <> withItlc True --- , selectedStyle = withFg black <> withBg green <> withReverse True - , selectedStyle = withReverse True - , errorStyle = withBg red <> withFg white - , operatorStyle = withFg brown <> withBd False - , hintStyle = withBg brown <> withFg black - , importStyle = withFg blue - , dataConstructorStyle = withFg blue - , typeStyle = withFg blue - , keywordStyle = withFg yellow - , builtinStyle = withFg brown - , strongHintStyle = withBg brown <> withUnderline True - , stringStyle = withFg brown <> withBd False - , preprocessorStyle = withFg blue --- , constantStyle = withFg cyan --- , specialStyle = withFg yellow - } - --- Softtabs of 2 characters for Berkeley coding style, if not editing makefile. -prefIndent :: Mode syntax -> Mode syntax -prefIndent m = if modeName m == "Makefile" - then m - else m { - modeIndentSettings = IndentSettings - { - expandTabs = True, - shiftWidth = 2, - tabSize = 2 - } - } - -myModes :: [AnyMode] -myModes = [diaryMode] - --- inserting current date and underline -currentDate :: IO String -currentDate = - do tim <- Data.Time.Clock.getCurrentTime - return $ formatTime locale "%A %b %e %Y" tim - where locale = System.Locale.defaultTimeLocale - -makeUnderline :: String -> String -makeUnderline s = s <> ('\n' : line) <> "\n" - where - line = take (length s) (repeat '=') - -currentDateAndUnderline :: IO String -currentDateAndUnderline = - do d <- currentDate - return $ makeUnderline d - -insertCurrentDate :: YiM () -insertCurrentDate = - withUI (\_ -> currentDateAndUnderline) >>= withCurrentBuffer . insertN . R.fromString - --- NOTE: use fundamentalMode as a base? -diaryMode :: AnyMode -diaryMode = AnyMode $ (\super -> super { modeApplies = \path _contents -> let name = takeFileName path - in ".txt" `isSuffixOf` name && - "diary" `isPrefixOf` name, - modeName = "Diary", - modeOnLoad = do modeOnLoad super - r:_ <- regexB Forward $ makeSimpleSearch "*** TODAY ***" - moveTo . regionStart $ r - }) $ emptyMode diff --git a/yi-contrib/src/Yi/Config/Users/Reiner.hs b/yi-contrib/src/Yi/Config/Users/Reiner.hs deleted file mode 100644 index df414bea6..000000000 --- a/yi-contrib/src/Yi/Config/Users/Reiner.hs +++ /dev/null @@ -1,109 +0,0 @@ -{-# LANGUAGE DoAndIfThenElse #-} -{-# LANGUAGE NamedFieldPuns #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE OverloadedStrings #-} -{-# OPTIONS_HADDOCK show-extensions #-} - --- | --- Module : Yi.Config.Users.Reiner --- License : GPL-2 --- Maintainer : yi-devel@googlegroups.com --- Stability : experimental --- Portability : portable - -module Yi.Config.Users.Reiner (setup, main) where - -import Control.Lens -import Data.Monoid -import qualified Data.Text as T -import System.Directory -import System.FilePath -import Yi.Command(buildRun) -import Yi.Config.Simple -import qualified Yi.Mode.Haskell as Haskell -import Yi.Mode.Latex(latexMode3) -import Yi.Monad -import qualified Yi.Rope as R -import Yi.Utils - --- | The main entry point, when used as a standalone yi.hs file. -main :: IO () -main = configMain defaultEmacsConfig setup - --- | Registers my settings in the 'ConfigM' monad. -setup :: ConfigM () -setup = do - setFrontendPreferences ["pango", "vte", "vty"] - fontSize .= Just 9 - - globalBindKeys globalBindings - evaluator .= publishedActionsEvaluator - publishAction "createDirectory" yiCreateDirectory - - addMode Haskell.fastMode - modeBindKeys Haskell.fastMode - (ctrlCh 'c' ?>> ctrlCh 's' ?>>! insertHaskSection) - - -- LaTeX stuff - addMode latexMode3 - publishAction "compileLatex" compileLatex - modeBindKeys latexMode3 (ctrlCh 'c' ?>> ctrlCh 'c' ?>>! compileLatex) - --------------------------------------------------------------------------------- --- Actions and bindings -- --------------------------------------------------------------------------------- -yiCreateDirectory :: YiM () -yiCreateDirectory = do - BufferFileInfo{bufInfoFileName} <- withEditor $ withCurrentBuffer bufInfoB - let dir = takeDirectory bufInfoFileName - exists <- io $ doesDirectoryExist dir - if not exists - then do io $ createDirectoryIfMissing True dir - withEditor $ printMsg $ "Created directory '" <> T.pack dir <> "'." - else withEditor $ printMsg $ "Directory already exists!" - -sectionSize :: Int -sectionSize = 80 - --- inserts the "Actions and bindings" header above -insertHaskSection :: R.YiString -> BufferM () -insertHaskSection s - | lenS >= sectionSize - 6 = do - insertDashes lenS - newlineB - insertN s - newlineB - insertDashes lenS - | otherwise = do - insertDashes sectionSize - newlineB - insertN "--" - let nSpaces = sectionSize - 4 - lenS - nSpacesL = nSpaces `div` 2 - nSpacesR = nSpaces - nSpacesL - insertN $ repChar nSpacesL ' ' - insertN s - insertN $ repChar nSpacesR ' ' - insertN "--" - newlineB - insertDashes sectionSize - where lenS = R.length s - insertDashes n = insertN $ repChar n '-' - repChar n c = R.fromText . T.replicate n $ T.singleton c - - -globalBindings :: I Event Yi.Config.Simple.Action () -globalBindings = choice - [ ctrlCh '\t' ?>>! nextWinE - , shift (ctrlCh '\t') ?>>! prevWinE - , metaCh 'r' ?>>! reload - ] - -compileLatex :: YiM () -compileLatex = do - withEditor (withCurrentBuffer $ gets file) >>= \case - Just filename -> buildRun "pdflatex" ["--file-line-error" - , "--interaction=nonstopmode" - , T.pack filename - ] (const $ return ()) - Nothing -> return () diff --git a/yi-contrib/src/Yi/Style/Misc.hs b/yi-contrib/src/Yi/Style/Misc.hs deleted file mode 100644 index 4a0e067df..000000000 --- a/yi-contrib/src/Yi/Style/Misc.hs +++ /dev/null @@ -1,58 +0,0 @@ -{-# OPTIONS_HADDOCK show-extensions #-} - --- | --- Module : Yi.Style.Misc --- License : GPL-2 --- Maintainer : yi-devel@googlegroups.com --- Stability : experimental --- Portability : portable --- --- A couple of themes. - -module Yi.Style.Misc (happyDeluxe, textExMachina) where - -import Data.Monoid -import Yi.Style -import Yi.Style.Library -import Data.Prototype - --- TextMate themes are available on the TM wiki: --- http://wiki.macromates.com/Themes/UserSubmittedThemes - --- | Theme originally designed by Joseph Andrew Magnani for TextMate, and --- redistributed with explicit permission. It is not usable in the vty UI. -happyDeluxe :: Theme -happyDeluxe = defaultTheme `override` \super _ -> super - { modelineAttributes = emptyAttributes - , tabBarAttributes = emptyAttributes { foreground = RGB 255 255 255 } - , baseAttributes = emptyAttributes { foreground = RGB 255 255 255, background = RGB 14 19 30 } - - , selectedStyle = withBg (RGB 21 40 90) - - , commentStyle = withFg (RGB 53 73 124) - , keywordStyle = withFg (RGB 254 144 6) - , numberStyle = withFg (RGB 20 222 209) - , stringStyle = withFg (RGB 253 102 249) - , typeStyle = mempty - , operatorStyle = mempty - , errorStyle = withFg (RGB 252 45 7) - } - --- | Theme originally developed by Matthew Ratzloff for TextMate, and --- redistributed with explicit permission. It is not usable in the vty UI. -textExMachina :: Theme -textExMachina = defaultTheme `override` \super _ -> super - { modelineAttributes = emptyAttributes { foreground = black } - , tabBarAttributes = emptyAttributes { foreground = black } - , baseAttributes = emptyAttributes { foreground = RGB 230 230 230, background = RGB 21 21 21 } - - , selectedStyle = withBg (RGB 102 102 102) - - , commentStyle = withFg (RGB 51 51 51) - , keywordStyle = withFg (RGB 119 124 178) - , numberStyle = withFg (RGB 174 129 255) - , stringStyle = withFg (RGB 102 204 255) - , typeStyle = withFg (RGB 174 129 255) - , variableStyle = withFg (RGB 255 255 255) - , operatorStyle = withFg (RGB 151 255 127) - } diff --git a/yi-contrib/yi-contrib.cabal b/yi-contrib/yi-contrib.cabal deleted file mode 100644 index e6bc98e4f..000000000 --- a/yi-contrib/yi-contrib.cabal +++ /dev/null @@ -1,49 +0,0 @@ -name: yi-contrib -version: 0.10.1 -category: Development, Editor -synopsis: Add-ons to Yi, the Haskell-Scriptable Editor -description: - 3rd-party add-ons to Yi. The goal of this package is to simplify the core Yi - package. -license: GPL-2 -license-file: LICENSE -author: AUTHORS -maintainer: yi-devel@googlegroups.com -homepage: http://haskell.org/haskellwiki/Yi -bug-reports: https://github.com/yi-editor/yi/issues -Cabal-Version: >= 1.6 -tested-with: GHC==7.8.3 -build-type: Simple - -library - hs-source-dirs: src - exposed-modules: - Yi.Config.Users.Amy - Yi.Config.Users.Anders - -- Yi.Config.Users.Corey - -- Yi.Config.Users.Ertai - Yi.Config.Users.Gwern - -- Yi.Config.Users.Jeff - Yi.Config.Users.JP - Yi.Config.Users.Michal - Yi.Config.Users.Reiner - Yi.Style.Misc - - build-depends: - base >=4.0 && <5, - containers, - lens >= 3.9, - directory < 1.3, - filepath < 1.4, - split >= 0.1 && < 0.3, - mtl >= 0.1.0.1, - yi == 0.10.*, - time >= 1.0 && < 2.0, - old-locale >= 1.0 && < 1.2, - text, - transformers-base, - yi-language >= 0.1.0.3, - yi-rope, - oo-prototypes - - ghc-options: -Wall