 Unified access to the best community driven cheat sheets repositories of the world. Let's imagine for a moment that there is such a thing as an ideal cheat sheet. How it should look like? What features should it have? * **concise** — it should be concise; it should contain only things you need and nothing else; * **fast** — it should be possible to use it instantly; * **comprehensive** — it should contain answers for every question you could have; * **universal** — it should be available everywhere, as soon as needed, without any preparations; * **unobtrusive** — it does not distract you from your main task when you are using it; * **tutoring** — it helps you to learn the subject; * **inconspicuous** — it should be possible to use it completely unnoticed. Such a thing does exist. ## Features **cheat.sh** * has simple curl/browser interface; * covers 55 programming languages, several DBMSes, and more than 1000 most important UNIX/Linux commands; * provides access to the best community driven cheat sheets repositories in the world as well as to StackOverflow; * available everywhere, no installation needed; * ultrafast, returns answers, as a rule, within 100 ms; * has a convenient command line client, `cht.sh`, that is very advantageous and helpful, though not mandatory; * can be used directly from code editors, without opening a browser and not switching your mental context; * supports a special mode (stealth mode), where it can be used fully invisibly, not even touching a key and not making a sound. ## Usage To get a cheat sheet for a UNIX/Linux command from a command line, query the service using `curl` or any other HTTP/HTTPS client specifying the name of the command in the query: ``` curl cheat.sh/tar curl cht.sh/curl curl https://cheat.sh/rsync curl https://cht.sh/tr ``` As you can see, you can use both HTTPS and HTTP to access the service, and both the long (cheat.sh) and the short (cht.sh) service names. Here `tar`, `curl`, `rsync`, and `tr` are names of the UNIX/Linux commands, you want to get cheat sheets for. If you don't know the name of the command you need, you can search for it using the `~KEYWORD` notation. For example, to see how you can make `snapshots` of a filesystem/volume/something else: ``` curl cht.sh/~snapshot ``` Programming languages cheat sheets are located not directly in the root namespace, but in special namespaces, dedicated to them: ``` curl cht.sh/go/Pointers curl cht.sh/scala/Functions curl cht.sh/python/lambda ``` To get the list of available programming language cheat sheets, do a special query `:list`: ``` curl cht.sh/go/:list ``` (almost) each programming language has a special page, named `:learn`, that describes the language basics (that's a direct mapping from the *"Learn X in Y"* project). It could be a good starting point, if you've just started learning a language. If there is no cheat sheet for some programming language query (and it is almost always the case), it is generated on the fly, basing on available cheat sheets and answers on StackOverflow. Of course, there is no guarantee that the returned cheat sheet will be a 100% hit, but it is almost always exactly what you are looking for. Try these (and your own) queries to get the impression of that, how the answers look like: ``` curl cht.sh/go/reverse+a+list curl cht.sh/python/random+list+elements curl cht.sh/js/parse+json curl cht.sh/lua/merge+tables curl cht.sh/clojure/variadic+function ``` If you don't like an answer for some of your queries, you can pick another one: for that, repeat the query with an additional parameter `/1`, `/2` etc. appended: ``` curl cht.sh/python/random+string curl cht.sh/python/random+string/1 curl cht.sh/python/random+string/2 ``` Cheat sheets are formatted as code of the queried programming language (at least we are trying our best to do so) so they can be pasted into a program in this language directly. Text comments, if there are any, are formatted according to the language syntax. ``` $ curl cht.sh/lua/table+keys -- lua: retrieve list of keys in a table local keyset={} local n=0 for k,v in pairs(tab) do n=n+1 keyset[n]=k end --[[ [ Note that you cannot guarantee any order in keyset. If you want the [ keys in sorted order, then sort keyset with table.sort(keyset). [ [ [lhf] [so/q/12674345] [cc by-sa 3.0] ]] ``` If you don't need text comments in the answer, you can eliminate them using a special option `?Q`: ``` $ curl cht.sh/lua/table+keys?Q local keyset={} local n=0 for k,v in pairs(tab) do n=n+1 keyset[n]=k end ``` And if you don't need syntax highlighting, switch it off using `?T`. You can combine the options together: ``` curl cht.sh/go/reverse+a+list?Q curl cht.sh/python/random+list+elements?Q curl cht.sh/js/parse+json?Q curl cht.sh/lua/merge+tables?QT curl cht.sh/clojure/variadic+function?QT ``` Full list of all options described below and in `/:help`. Try your own queries. Follow these rules: 1. Try to be more specific (`/python/append+file` is better than `/python/file` and `/python/append`); 2. Ask practical question if possible (yet theoretical question are possible too); 3. Ask programming language questions only; specify the name of the programming language as the section name; 4. Separate words with `+` instead of spaces; 5. Do not use special characters, they are ignored anyway. Read more about the programming languages queries below. ## Command line client, cht.sh The cheat.sh service has its own command line client (`cht.sh`), that, comparing to quering the service directly with `curl`, has several useful features: * Special shell mode with a persistent queries context and readline support; * Queries history; * Clipboard integration; * Tab completion support for shells (bash, fish, zsh); * Stealth mode. To install the client: ``` curl https://cht.sh/:cht.sh > ~/bin/cht.sh chmod +x ~/bin/cht.sh ``` Now, you can use `cht.sh` instead of `curl`, and write your queries in more natural way, with spaces instead of `+`: ``` $ cht.sh go reverse a list $ cht.sh python random list elements $ cht.sh js parse json ``` It is even more convenient to start the client in a special shell mode: ``` $ cht.sh --shell cht.sh> go reverse a list ``` If all your queries are supposed to be about the same language, you can change the context of the queries and spare repeating the programming language name: ``` $ cht.sh --shell cht.sh> cd go cht.sh/go> reverse a list ``` or even start the client in this context: ``` $ cht.sh --shell go cht.sh/go> reverse a list ... cht.sh/go> join a list ... ``` If you want to change the context, you can do it with the `cd` command, or if you want do a single query for some other language, just prepend it with `/`: ``` $ cht.sh --shell go ... cht.sh/go> /python dictionary comprehension ... ``` If you want to copy the last answer into the clipboard, you can use the `c` (`copy`) command, or `C` (`ccopy`, without comments). ``` cht.sh/python> append file # python - How do you append to a file? with open("test.txt", "a") as myfile: myfile.write("appended text") cht.sh/python> C copy: 2 lines copied to the selection ``` Type `help` for other internal `cht.sh` commands. ``` cht.sh> help help - show this help hush - do not show the 'help' string at start anymore cd LANG - change the language context copy - copy the last answer in the clipboard (aliases: yank, y, c) ccopy - copy the last answer w/o comments (cut comments; aliases: cc, Y, C) exit - exit the cheat shell (aliases: quit, ^D) id [ID] - set/show an unique session id ("reset" to reset, "remove" to remove) stealth - stealth mode (automatic queries for selected text) update - self update (only if the scriptfile is writeable) version - show current cht.sh version /:help - service help QUERY - space ceparated query staring (examples are below) cht.sh> python zip list cht.sh/python> zip list cht.sh/go> /python zip list ``` ### Tab completion To activate tab completion support for `cht.sh`, add the `:bash_completion` script to your `~/.bashrc`: ``` $ curl https://cheat.sh/:bash_completion > ~/.bash.d/cht.sh $ . ~/.bash.d/cht.sh $ # and add . ~/.bash.d/cht.sh to ~/.bashrc ``` ### Stealth mode One of the important properties of any real cheat sheet, is that it could be used fully unnoticed. cheat.sh can be used completely unnoticed too. The cheat.sh client, `cht.sh`, has a special mode, called **stealth mode**, using that you don't even need to touch your keyboard to open some cheat sheet. In this mode, as soon as you select some text with the mouse (and thus it is added into the selection buffer of X Window System or into the clipboard) it's used as a query string for cheat.sh, and the correspondent cheat sheet is automatically shown. Let's imagine, that you are having an online interview, where your interviewer asks you some questions using a shared document (say Google Docs) and you are supposed to write your coding answers there (it's possible too that you'll type in the questions on your own, just to show to the interviewer that you've heard it right). When using the stealth mode of `cht.sh`, the only thing you need to do in order to see a cheat sheet for some question, is to select the question using the mouse. If you don't want any text in the answers and the only thing you need is code, use the `Q` option when starting the stealth mode.

``` You: Hi! | $ cht.sh --shell python She: Hi! | cht.sh/python> stealth Q She: Are you ready for a small interview? | stealth: you are in the stealth mode; select any text She: Just a couple of questions | stealth: selections longer than 5 words are ignored She: We will talk about python | stealth: query arguments: ?Q She: Let's start from something simple. | stealth: use ^C to leave this mode She: Do you know how to reverse a list in python? | You: Sure | You: (selecting "reverse a list") | stealth: reverse a list | reverse_lst = lst[::-1] You: lst[::-1]? | She: Good. | She: Do you know how to chain a list of lists? | You: (selecting "chain a list of lists") | stealth: chain a list of lists | import itertools | a = [["a","b"], ["c"]] | print list(itertools.chain.from_iterable(a)) You: May I use external modules? | She: What module do you want to use? | You: itertools | She: Yes, you may use it | You: Ok, then: | You: itertools.chain.from_iterable(a) | She: Good. Let's try something harder. | She: What about quicksort implementation? | You: (selecting "quicksort implementation") | stealth: quicksort implementation You: Let me think about it. | (some big and clumsy lowlevel implementation is shown) You: Well...(starting typing it in) | def sort(array=[12,4,5,6,7,3,1,15]): | less = [] She: (seeing your ugly pascal style) | equal = [] She: Could you write it more concise? | greater = [] | if len(array) > 1: You: What do you mean? | pivot = array[0] | for x in array: She: I mean, | if x < pivot: less.append(x) She: do you really need all these ifs and fors? | if x == pivot: equal.append(x) She: Could you may be just use filter instead? | if x > pivot: greater.append(x) | return sort(less)+equal+sort(greater) You: quicksort with filter? | else: | return array She: Yes | You: (selecting "quicksort with filter") | stealth: quicksort with filter You: Ok, I will try. | return qsort(filter(lt, L[1:]))+[pivot] \ You: Something like this? | +qsort(filter(ge, L[1:])) You: qsort(filter(lt, L[1:]))+[pivot] \ | + qsort(filter(ge, L[1:])) | | She: Yes! Perfect! Exactly what I wanted to see! | | ``` Or course, it is just fun, and you should never cheat in your coding interviews, because you know what happens when you do.  ## Editors integration You can use *cheat.sh* directly from the editor (*Vim* and *Emacs* are currently supported). Instead of opening your browser, googling, browsing Stack Overflow and eventually copying the code snippets you need into the clipboard and later pasting them into the editor, you can achieve the same instantly and without leaving the editor at all! Here is how it looks like in Vim: 1. If you have a question while editing a program, you can just type your question directly in the buffer and press `