diff --git a/emacs-notes.org b/emacs-notes.org index b7ad361..339c7d4 100644 --- a/emacs-notes.org +++ b/emacs-notes.org @@ -9,1256 +9,29 @@ authors that I find useful. * Emacs Features +Random links and notes about various of Emacs' features. + ** Eshell - [[https://www.masteringemacs.org/article/complete-guide-mastering-eshell][Mastering Eshell]] by Mickey Petersen - [[http://www.howardism.org/Technical/Emacs/eshell-fun.html][Eschewing Zshell for Emacs Shell]] by Howard Abrams - [[https://github.com/howardabrams/dot-files/blob/master/emacs-eshell.org][Abrams' EShell configuration]] -* Workshop for Emacs Macros +** Fonts and Themes -(By [[https://www.howardism.org/][Howard Abrams]], 2015 Nov 24) +- To show all available fonts, use the function ~x-family-fonts~. -Basic idea of this file is to be both a *guide* and a *practice pad* -for leveling up on Emacs’ keyboard macro system. +- Load custom themes with ~customize-themes~ instead of calling ~load-theme~ + directly. However, this does not set ~custom-enabled-themes~ correctly + (Emacs 26.1), so directly customizing ~custom-enabled-themes~ seems to be the + best thing (although one has to know the names of the themes then). -To use, just [[https://github.com/howardabrams/pdx-emacs-hackers/raw/master/workshops/keyboard-macros.org][download this file]] to your system, and edit it in Emacs. -Then just follow along... If you are not familiar with org-mode files, -here are the basics for this workshop: +** Magit Walkthrough +:PROPERTIES: +:CREATED: [2018-08-11 Sat 21:05] +:END: - - Hit a tab on the header expands or collapses it - - Narrow to show just one section with: C-x n s - - Return by widening normally with: C-x n w - - Hyperlinks can be clicked on to view the Emacs Manual - -Pretty much treat the rest of this document as a text file. - -** Basic Usage - - Let’s begin with something simple to try out this project. - In the /block area/ below, hit: C-c ' (yes, the apostrophe). - When done with the tasks, hit: C-x C-s to close and return here. - - #+BEGIN_SRC org - - This foobar should be Interesting - - Nulla foobar Posuere - - Nullam foobar Tempus - - Etiam foobar laoreet quam sed Arcu - - Donec foobar hendrerit tempor Tellus - - Mauris foobar mollis tincidunt Felis - - etiam laoreet quam sed arcu - - nullam rutrum - - sed diam - - lorem ipsum dolor sit amet, consectetuer adipiscing elit - - mauris ac felis vel velit tristique imperdiet - - fusce suscipit, wisi nec facilisis facilisis, est dui fermentum leo, quis tempor ligula erat quis odio - - donec hendrerit tempor tellus - #+END_SRC - - Notice that the frame is split with this document still visible? - - Good, let’s play around. Let’s capitalize the first letter of each line. - Position point at the beginning of the first line, and then: - - - F3 - - M-c - - C-n - - C-a - - F4 - - Press F4 repeatedly to capitalize the first word on each line. - Don’t capitalize /every/ line... leave a few alone for a moment. - Now you have the basics. - - Let’s make a new macro to capitalize the /last/ word on each line. - Pop back up to the top of the list, and: - - - F3 - - C-e - - M-b - - M-c - - C-n - - F4 - - Once again, leave a few lines alone. - Just one more macro, as I want to show you something interesting. - Jump back to the beginning, and: - - - F3 - - C-a - - M-f - - Space - - foobar (or type any single word you find amusing) - - C-n - - F4 - - Type: C-x C-k C-k - - Notice it behaves the same as F4, but you can keep typing C-k to - execute your macro. - - Start typing C-n and/or C-p and notice the minibuffer. It alternates - between the following: - - - M-c C-n C-a - - C-e M-b M-c C-n - - C-a M-f SPC f 2*o b a r C-n - - Typing C-k at any point will execute that macro. You’ve now see the - Emacs Macro Ring, and can manipulate it. You are now at Level 2. - - Type C-c ' (apostrophe) to close that side window. - -** Naming Macros - - While that =foobar= macro may be quite handy, looping around the - keyboard macro ring to select it may be inefficient. Name it! - - C-x C-k n - - Give it a name of foobar, and now, you can: M-x foobar - to have the macro run. - - Perhaps it may be more useful to bind that macro to some un-used - key, like C-c k or F2 ... type: - - C-x C-k b - - And then type your binding, e.g. C-c k - - You know that C-c followed by a single letter is supposed to be free - of usage and available for your nefarious reasons, right? - - Read the [[info:emacs#Save%20Keyboard%20Macro][the Emacs Manual]] for details. If you actually tried this - example, then you have earned enough experience points to be level 3. - -** What do you mean On Every Line? - - Keyboard macros are slick, and while we /could/ prefix the F4 with - the numbering prefix to run it multiple times at once, e.g. C-9 F4, - a typical use case is to run it on every line in a region. - - Position the cursor in the block, and type: C-c ‘ - - #+BEGIN_SRC org - I will not take out the trash - I should not stop swearing - I may not stop to smell the roses - I do not want to go shopping - I could not care less - #+END_SRC - - With the point on the first line, type: - - - F3 - - C-a - - M-f - - M-f - - Space - - not (type the word, =not=) - - F4 - - Now select the remaining 4 lines any way you like, and type: - - - C-x C-k r - - Read [[info:emacs#Basic%20Keyboard%20Macro][the Emacs Manual]] for complete details, and welcome to level 4. - -** Numbering - - Numbering things seems to be important to people. Let’s see if we - can easily number the worst song ever inflicted on humanity. - - Once again, position the point inside the block, and type: C-c ' - - #+BEGIN_SRC org - 1 Drummers Drumming - 2 Pipers Piping - 3 Lords a Leaping - 4 Ladies Dancing - 5 Maids a Milking - 6 Swans a Swimming - 7 Geese a Laying - 8 Golden Rings - 9 Calling Birds - 10 French Hens - 11 Turtle Doves - 12 Partridge in a Pear Tree - #+END_SRC - - Follow along at home. First, position the point at the end (on the - line with the partridge), and: - - - C-x C-k C-c - - 1 - - Return (to set a counter to 1) - - F3 - - C-a - - F3 - - Spacebar - - C-n - - F4 - - Yes, hitting the F3 key twice (once to start the macro, and again to - insert the value of the counter) is a bit odd. You can also use the - binding: C-x C-k C-i - - Each time you hit F4, you increment the counter that is inserted. - - By the way, if you didn’t do the whole =C-x C-k C-c= to set the - counter to 1, the first value would be 0. Read [[info:emacs#Keyboard%20Macro%20Counter][the manual]] for - details. - -** Fixing Macros - - Now that you are a Level 5 Elf Keyboard Macro-er, and you can now - sling macros everywhere, you may notice that sometimes, in the - middle of a long macro, you flub it. - - If you hit F4 too soon (it happens), hit: C-u C-u F3 to pick up - where you left off and enter the rest of the macro. Hit F4 when you - are really finished. - - If you need to fix a keyboard macro with more finesse, type: - - C-x C-k C-e - - And behold the glory. Tis a simple language that should be pretty - obvious to a skilled Macro-er as yourself. Type C-h m once in that - buffer to display details of how to edit the macro. When you are - finished editing, type: C-c C-c - - I’ll let you play around with your own example for this one. - Read [[info:emacs#Edit%20Keyboard%20Macro][the manual]] for complete details. - -** Variations on a Theme - - To gain the Level 7 Keyboard Macro-er title, one should know how to - customize a macro /while/ running it. The following section of HTML - code needs some textual changes. We want to add one of the following - phrases to the /end/ of every paragraph that has a =class= of =change=: - - * Because I said so. Got it? - * Because I'm the boss. Got it? - * You heard me. Got it? - * Just do it. Got it? - - To begin, first move to the following block (hint: C-c M-f) and hit - TAB to collapse the block (you gotta see all the instructions, - right?) Next, issue a C-c ' on this block to show it in a new - window. If you have trouble with your HTML mode, change the =html= - to =text=. - - #+BEGIN_SRC html - - - -

- Proin neque massa, cursus ut, gravida ut, lobortis eget, lacus. - Praesent augue. Sed diam. Nunc eleifend leo vitae magna. Nunc - rutrum turpis sed pede. -

-

- Nullam rutrum. Nunc rutrum turpis sed pede. -

-

- Phasellus at dui in ligula mollis ultricies. Curabitur lacinia - pulvinar nibh. Donec pretium posuere tellus. Praesent - fermentum tempor tellus. Proin quam nisl, tincidunt et, mattis - eget, convallis nec, purus. -

-

- Fusce sagittis, libero non molestie mollis, magna orci ultrices - dolor, at vulputate neque nulla lacinia eros. Sed diam. Nam - vestibulum accumsan nisl. -

-

- Aliquam feugiat tellus ut neque. Nam vestibulum accumsan - nisl. Praesent fermentum tempor tellus. -

-

- Vivamus id enim. Suspendisse potenti. Curabitur lacinia - pulvinar nibh. Mauris ac felis vel velit tristique imperdiet. -

-

- Donec vitae dolor. Mauris ac felis vel velit tristique - imperdiet. Nunc aliquet, augue nec adipiscing interdum, lacus - tellus malesuada massa, quis varius mi purus non odio. Proin - quam nisl, tincidunt et, mattis eget, convallis nec, purus. Nam - euismod tellus id erat. -

-

- Nullam rutrum. -

- - - #+END_SRC - - Type the following: - - - F3 - - C-s - - Type: class="change" - - C-e - - C-s - - Type:

- - C-p - - C-e - - C-x q - - Type: Got it? - - C-n - - F4 - - In this particular case, we actually didn't do anything special, so - move to the beginning of the buffer, and hit F4, and the cursor will - go to the end of every paragraph that needs changing, and stop with - a prompt: - - Proceed with macro? (Y, N, RET, C-l, C-r) - - Type C-r and begin typing one of our phrases, and when you are done, - type: C-M-c - - The prompt will be re-displayed, so finish the macro with 'Y'. - Check out [[info:emacs#Keyboard%20Macro%20Query][the manual]] for details on this =C-x q= business. - -* Emacs Calc Tutorials - -By Andrew Hyatt, found here: https://github.com/ahyatt/emacs-calc-tutorials. -License is GPLv3. - -Order as given by https://blog.markhepburn.com/2013/12/07/andrew-hyatts-emacs-calc-tutorials - -** README - -#+BEGIN_EXAMPLE -This repository contains tutorials about emacs calc originally writen on the -Emacs community on Google+. - -The best way to read is probably just to open the org files directly, which -Github will display correctly. - -If anyone would like to correct anything, add any tutorials, or request -anything, the normal Github bug / request / or pull request process will work. - -#+END_EXAMPLE - -** HEX - -OK, seems like there's interest in some quick calc tips. Here's today's: - -How to convert decimal to hexidecimal. Let's say you want to convert number -12345 to hex. - -#+BEGIN_EXAMPLE -M-x calc -d 6 (sets the number radix to 16, meaning all output will be in hex) -10#12345 (inputs the number 12345 in base 10) - -The output reads: -1: 16#3039 -#+END_EXAMPLE - -The answer is therefore =0x3039=. - -And then you can do a =d 0= to set the number radix back to normal, base 10. - -Here's how to do the other way. Let's convert =0xABCDEF= to base 10. - -#+BEGIN_EXAMPLE -M-x calc -16#ABCDEF - -The output reads: -1: 11259375 -#+END_EXAMPLE - -** Date - -Ever want to know how many seconds old David Hasselhoff is? calc can do many -things, but it doesn't know much about Hasselhoff, so first I do a query on -Google for [david hasselhoff]. I get a knowledge card on the right saying he was -born July 17, 1952. It doesn't give a time, so we'll just assume it was at -midnight. - -#+BEGIN_EXAMPLE -M-x calc -t N (put the current time on the stack) -' (press ' to enter algebraic mode, then you input the date). -- (subtract the two to get the number of days David has been alive) -24 (we're going to multiply by 24, the number of hours in a day) -60 (the number of minutes in an hour) -60 (the number of seconds in a minute) -* -* -* - -Final result: -1: 1910255938.01 -#+END_EXAMPLE - -There you have it, he's... wait, how many seconds? That's really hard to read. - -Back into calc! - -#+BEGIN_EXAMPLE -d g (toggle digit grouping) - -The final final result: -1: 1,910,255,938.01 -#+END_EXAMPLE - -Ah, that's a 1.9 billion seconds. Sweet! - -** Time - -Hey, what's the time? It's time to get ill! No, actually I meant the time in -seconds since the epoch. Yesterday I went over doing math with time, which is -fun but not something I use everyday. Much more useful is converting to and from -Unix timestamps. - -Let's start by getting the time now in seconds since the epoch: - -#+BEGIN_EXAMPLE -M-x calc -t N (get the time now) -t U (convert the time to seconds since the epoch) - -Result: -1: 1359424746 -#+END_EXAMPLE - -Oh, and you want to insert that into your last used buffer? - -#+BEGIN_EXAMPLE -y (that doesn't mean "yes", that means yank into the last buffer) -#+END_EXAMPLE - -Done! Just to be complete, let's convert another date we have to input: - -#+BEGIN_EXAMPLE -'<12:00pm Jul 4, 1776> (single quote to enter algebraic mode, then the date) -t U (converts the time to seconds since the epoch) -#+END_EXAMPLE - -But wait, what will happen? This is considerably before the epoch. - -#+BEGIN_EXAMPLE -Result: -1: -6106003200 -#+END_EXAMPLE - -Oh calc, you never let me down. - -Let's do the other way. Remember the Billenium? - -#+BEGIN_EXAMPLE -1e9 -t U (converts the time in seconds since the epoch to text) - -Result: -1: <9:46:40pm Sat Sep 8, 2001> -#+END_EXAMPLE - -Wow, I never realized how close the Billenium was to September 11th. Kind of spooky... - -** Random - -I use calc whenever I need a random number. The interface is easy and the random -numbers are (supposedly) high quality. - -So, let's start with something simple: A random number between 0 and 100: - -#+BEGIN_EXAMPLE -M-x calc -100 (the upper bound, all values will be between 0 and this) -k r (creates a random number between 0 and the number on the stack) - -Result: -1: 66 (of course, yours will be different) -#+END_EXAMPLE - -I want another one! -#+BEGIN_EXAMPLE -k a (creates another number with the same upper bound as the last) -#+END_EXAMPLE - -Now that I’ve had a taste of that sweet sweet randomness, I want a vector of 50! - -#+BEGIN_EXAMPLE -100 (the upper bound, again) -50 (the number to generate) -k h (generate a vector of 50 random numbers between 0 and 100) - -1: [60, 72, 61, 74, 77, 97, 10, 90, 8, 29, 82, 81, 51, 58, 7, 88, 99, 1, 37, 89, 93, 84, 52, 94, 2, 35, 5, 48, 87, 47, 14, 6, 79, 18, 67, 76, 70, 9, 43, 65, 69, 23, 55, 11, 53, 78, 50, 30, 13, 42] -#+END_EXAMPLE - -OK, that's nice. But how about a number between 0 and 1? - -#+BEGIN_EXAMPLE -1.0 -k r - -Result: -1: 0.636988102539 -#+END_EXAMPLE - -OK, how about number between -50 and 50? For that we need to use what calc calls -an interval form: - -#+BEGIN_EXAMPLE -[ (Starts interval form) -50 (You can't just type -50 in calc) -n (negate, givint -50) -.. (the middle part of the interval form) -50] (closing the interval form) -#+END_EXAMPLE - -What you see now in calc is: -#+BEGIN_EXAMPLE -[-50 .. 50] -#+END_EXAMPLE -And you could have just typed it in with: -#+BEGIN_EXAMPLE -'[-50 .. 50] -#+END_EXAMPLE -which would be a lot easier, really. - -#+BEGIN_EXAMPLE -k r -#+END_EXAMPLE -This produces a random number from the bounds of the interval, in this case both --50 and 50 are possible, if you wanted them to be exlusive bounds, you'd use the -form =(-50 .. 50)=. - -Finally, you can re-arrange a list: -#+BEGIN_EXAMPLE -'[1 2 3 4] (our starting vector) --1 (signals to use the vector above, could also be the size of the vector) -k h - -Result: -1: [3, 1, 4, 2] -#+END_EXAMPLE - -But =k a= will not give you more variants, unfortunately. - -** Unit Conversion - -You load 16 tons, and what do you get? I mean, in kilograms. - -#+BEGIN_EXAMPLE -M-x calc -' 16 tons (' to enter algebraic mode, so you can type out the units) -u c kg (u c for "unit convert", and kg being the target unit). - -Result: -1: 14514.95584 kg -#+END_EXAMPLE - -Calc treats units as special. If you added something, such as: - -#+BEGIN_EXAMPLE -3 -+ - -Result: -1: 14514.95584 kg + 3 -#+END_EXAMPLE - -But you can remove the units from the above using: -#+BEGIN_EXAMPLE -u r (remove units) - -Result: -1: 14517.95584 -#+END_EXAMPLE - -OK, that's all well and good. But I've always wondered how much is Grandpa -Simpson's gas mileage when he said "My car gets 40 rods to the hogshead and -that's the way I likes it." - -For that, we need to define the units. Calc knows about a lot of units, but -maybe not the rod and hogshead. In fact, in the calc info pages, defining what a -"rod" is the example for how to define your own units. Let's get started! - -#+BEGIN_EXAMPLE -'16 ft (The equivalent to one rod) -u d rod Rod (defines a new unit rod, with optional description "Rod") -#+END_EXAMPLE -Now a hogshead is a unit of measurement that varies by what liquid it contains. -I don't know what the unit is for gasoline, but let's use sherry as a -substitute, in which a hogshead is 245 liters. - -#+BEGIN_EXAMPLE -'245 liters -u d hogshead (don't bother with a description this time) -'40 rod -'1 hogshead -/ -#+END_EXAMPLE -Wait, what units should we be using? -#+BEGIN_EXAMPLE -u v (show the units table, a handy table of all units) -u c mi/gal (the units come from the unit table) - -Result: -1: 1.87280731429e-3 mi / gal -#+END_EXAMPLE - -But wait, we can do better. Why upgrade this measure to something that isn't -even standard? Miles per gallon is just a bit better than rods per hogshead (in -fact, that was what the original joke was about). - -#+BEGIN_EXAMPLE -u c si (convert everything to scientific units) - -Result: -1: 796.212244896 / m^2 -#+END_EXAMPLE - -Not that I understand this number, but at least in miles per gallon, I can see -that that's not such great fuel economy, but what you do expect from Grandpa? - -OK, one more cool thing, then I'm out of here. Calc can split up numbers into -multiple units. Here's 42 inches in feet and inches: - -#+BEGIN_EXAMPLE -'42 in -u c ft+in (Convert to a mixture of feet and inches) - -Result: -1: 3 ft + 6. in -#+END_EXAMPLE - -Calc, you're sooo coool! - -** Pi and Precision - -This one's about p and P and mostly about pi. - -First, let's pi it up: - -#+BEGIN_EXAMPLE -M-x calc -P (this gives you pi) - -Result: -1: 3.14159265359 -#+END_EXAMPLE - -Well, I guess that's a reasonable pi. But, c'mon, this is calc. Can't we get a -bit more digits? How about 100? - -#+BEGIN_EXAMPLE -p 100 (sets precisions to 100) -P (need to ask calc again for pi, it doesn't recalculate) - -Result: -1: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 -#+END_EXAMPLE - -Well, but actually evaluating it robs it of its never-ending charm. Let's just -use it as a variable. How about calculating the area of a circle with a 5 km -radius? - -#+BEGIN_EXAMPLE -'5000 m -2 -^ -'pi (enter pi as a variable) -* - -We get: -1: 25000000 m^2 pi -#+END_EXAMPLE - -Yeah, sure that’s what I said I wanted, but I’ve changed my mind - now I want a number. - -#+BEGIN_EXAMPLE -= - -1: 78539816.3397448309615660845819875721049292349843776455243736148076954101571552249657008706335529267 m^2 -#+END_EXAMPLE - -Whoops, looked like I forgot to set the precision back to normal. And I can't -read this. Let's make it a bit nicer. - -#+BEGIN_EXAMPLE -Control-_ (normal emacs undo) -p 7 -d g (turn digit grouping on) -= - -Result: -1: 7.853983e7 m^2 -#+END_EXAMPLE - -Oh, that's because I didn't have enough precision to render it without resorting -to scientific notation. Let's just bump the precision up again. - -#+BEGIN_EXAMPLE -Control-_ (undo, since we have to redo the pi conversion with more precision) -p 10 -= - -Result: -1: 78,539,816.35 m^2 -#+END_EXAMPLE - -Ah, that's better. - -** Strings - -Did you know you could work with strings in calc? For an example, let's find out -what "Hello world" is in binary: - -#+BEGIN_EXAMPLE -M-x calc -d 2 (change the to binary mode) -"Hello world (Enter the string "Hello world" which turns into a vector of numbers) - -Result: -1: [2#1001000, 2#1100101, 2#1101100, 2#1101100, 2#1101111, 2#100000, 2#1110111, 2#1101111, 2#1110010, 2#1101100, 2#1100100] -#+END_EXAMPLE - -And similarly, we can convert back. If someone gave you the binary number: -=01001000011011110110110001100001= and asked what the string was, I'd have no -idea... but calc knows: - -#+BEGIN_EXAMPLE -d " (changes to string mode) -C-x b scratch (whaaa, leave calc?) -01001000011011110110110001100001 (enter the number we're parsing) -C-a (go to the start of the line) -C-x ( (start a macro) -2# (prefix the number with a binary indicator) -C-u 8 C-f (Jump forward 8 characters) - (insert a space to separate the numbers) -C-x ) (end the macro) -C-x e (repeat the macro) -e e (repeat twice twice more) -C- (set mark) -C-a (goto beginning of line) -C-x g (copy region into calc) - -Result: - -1: "Hola" -#+END_EXAMPLE - -And there you have it! Maybe there is an easier way to convert from the giant -binary number to a vector of bytes, but I don't know it yet. - -** Fractional Arithmetic - -This one is pretty short, but it's about one of my favorite features of calc: -the ability to handle fractions as fractions instead of rendering them as real -numbers. - -Quick, what's =5/8 + 9/21=? - -Um, ok... better start multiplying things... wait, let's just tell calc to do -it. - -#+BEGIN_EXAMPLE -M-x calc -5:8 (this is how you enter a fraction) -9:21 -+ - -Result: -1: 59/56 -#+END_EXAMPLE - -So easy! If we want to convert it to a float you can do this: - -#+BEGIN_EXAMPLE -c f (convert to -float) - -Result: - -1: 1.05357142857*10.^0 -#+END_EXAMPLE - -And if you want it back as a fraction, then just do: - -#+BEGIN_EXAMPLE -c F (convert to fraction) - -Result: - -1: 59/56 -#+END_EXAMPLE - -That's so awesome! - -You could also enter fractions this way: - -#+BEGIN_EXAMPLE -m f (set fraction mode, integer division will result in fractions) -5 -8 -/ - -Result: - -1: 5/8 -#+END_EXAMPLE - -Now you can live in the nice world of fractions as much as you like. It's a nice -world, full of pleasant to look at integers taking up little horizontal space - -** Algebra - -I think it's time to write about one of the amazing things that calc can do: -algebra! - -Before we get into how to solve equations, I just want to write about on some -cool things you can do with the calc display. - -Let's say you have a formula you want to work with =a + sqrt(b) = 5=. Let's enter -that into calc: - -#+BEGIN_EXAMPLE -M-x calc -'a + sqrt(b) = 5 (' starts algebraic mode). - -Result: -1: a + sqrt(b) = 5 -#+END_EXAMPLE - -Well, that's not so surprising, that's what we put in. Kind of disappointing, -though. Is that it calc? We love your brains, but what about your looks? That's -important too! - -#+BEGIN_EXAMPLE -d B (turn on calc-big-language mode) - -Result: - ___ -1: a + V b = 5 -#+END_EXAMPLE - -Hey, that's an ASCII square-root symbol. What other cool things can you do here? - -#+BEGIN_EXAMPLE -a^2 - -Result: - - 2 -1: a - -3:4 (enter the fraction 3/4) - -Result: - - 3 -1: - - 4 -#+END_EXAMPLE - -Here's how to get back: -#+BEGIN_EXAMPLE -d N (calc-normal-language) -#+END_EXAMPLE - -And an alternative, in which all operators are explicitly represented as -functions: - -#+BEGIN_EXAMPLE -1: a + sqrt(b) = 5 (re-enter the formula) -d U (calc-unformatted-language) - -Result: -1: eq(add(a, sqrt(b)), 5) -#+END_EXAMPLE - -But, wait, did you think that's all? What if you wanted to enter that equation -in Mathematica? - -#+BEGIN_EXAMPLE -d M (calc-mathematica-language) - -Result: - -1: a + Sqrt[b] == 5 -#+END_EXAMPLE - -Ooh! Calc! Do c++ next! - -#+BEGIN_EXAMPLE -d C (calc-c-language) - -1: a + sqrt(b) == 5 -#+END_EXAMPLE - -Latex! - -#+BEGIN_EXAMPLE -d L (calc-latex-language) - -Result: - -1: a + \sqrt{b} = 5 -#+END_EXAMPLE - -I could keep going, but trust me, there's more. And you can even define your own -languages by constructing syntax tables, but I won't get into that now. - -** More on Algebra - -Jim is 42 years old. He has one brother, and their total age is 100. What is the -brother's age? OK, this isn't a very hard problem, but let's just introduce calc -algebra by solving it. - -#+BEGIN_EXAMPLE -M-x calc -'42 + x = 100 (' to enter algebraic input) -a S x (solve for x) - -Result: -1: x = 58 -#+END_EXAMPLE - -Let's make this harder. Jim and Dan's ages sum to 100. Jim is 5 years older than -Dan. How old are they? - -#+BEGIN_EXAMPLE -'[j + d = 100, d + 5 = j] -a S j,d - -Result: -1: [j = 52.5, d = 47.5] -#+END_EXAMPLE - -Nice! - -And of course it can give you more than just numerical solutions: - -#+BEGIN_EXAMPLE -'sin(x) + tan(y) = pi / 2 -a S y (solve for y) - -Result: -1: y = arctan(pi / 2 - sin(x)) -#+END_EXAMPLE - -Sometimes there are more than one solution. For example: -#+BEGIN_EXAMPLE -'x^2 = 25 -a S x - -Result: -1: x = 5 -#+END_EXAMPLE - -Wait, what happened to -5! That's a valid solution, why didn't calc tell us -about it? What's happening here is that calc is telling us about the first valid -thing it can find, which is basically how it operates. But you can always get -everything: - -#+BEGIN_EXAMPLE -'x^2 = 25 -a P x (find the polynomial solutions) - -Result: -1: [5, -5] -#+END_EXAMPLE - -Sometimes there aren't a finite number of results because you aren't dealing -with polynomials. You can just get a generalized solution: - -#+BEGIN_EXAMPLE -'sin(x)^2 = 25 -H a S x (solve for x, giving the generalized solution) - -Result: -1: x = arcsin(5 s1) (-1)^n1 + 180 n1 -#+END_EXAMPLE - -This uses the calc notation =n1=, which you just means any integer. You can also -see another notation =s1= which means any sign. In this case =5 s1= means that that -number can be 5 or -5. - -Looking at how awesome calc is, it's just a shame I never knew about it in high -school... - -** Financial - -I recently chatted with emacspeak creator T.V. Raman, and told him I was -writing a series of short tutorials about calc. He is really a calc fanatic, and -told me a story in which he astounded a loan officer by calculating scheduled -loan payments with just a few keystrokes in calc. Raman is living proof that -calc is a useful tool for so many situations, and it always pays to have emacs -running. He also mentioned that he found the explanation in the calc tutorial -about the financial functions to be the clearest he's ever read. - -So, yes, calc can do finance. Let's say that you were sitting in front of a loan -officer, and she told you that for your loan of $500,000, you need to pay in 30 -installments with a 5% interest rate. How much do you need to pay each month? -Wait a second! Stop right there, loan officer! I have calc! - -#+BEGIN_EXAMPLE -M-x calc -500000 (the amount of the loan) -30 (the number of payments) -'5% (equivalent to typing 0.05) -b M (calc-fin-pmt, computing the amount of periodic payments to amortize a loan) - -Result: -1: 25,000 -#+END_EXAMPLE - -OK, but that's a bit obvious, since $25,000 is just 5% of $500,000. If the -number of payments was much smaller, we'd get a larger value. Let's take another -question: if you wanted to only pay $10,000 in each installment? How many -installments would it take to pay off the loan? - -#+BEGIN_EXAMPLE -'5% -10000 (the payment we want to make) -500000 (the loan amount) -b # (calc-fin-nper, calculate the number of installments needed) - -Result -1: nper(0.05, 10,000, 500,000) -#+END_EXAMPLE - -What? Oh, I see, I also go the message: "Payment too small to cover interest -rate: 10000". Oh, right, 5% of $500,000 is already $25,000, so we'd never pay it -off at that rate. What if we payed $50,000 instead? - -#+BEGIN_EXAMPLE -'5% -50000 (the payment we want to make) -500000 (the loan amount) -b # - -Result: -1: 14.2066908 -#+END_EXAMPLE - -So, it would take just over 14 payments to pay off the loan. - -OK, one more cool one: Let's say you meet an investment banker who gives you the -following deal. I've got a investment for you, she says. Just give me $100,000 -and I'll give you $10,000 at the end of each year for the next 12 years. -Assuming the interest rate will stay at 3% for the next 12 years. Is it a good -deal? - -Hey, what are you asking me for? I have no idea! Calc knows, though, because it -can tell you the break-even point for the cost of an investment that gives -periodic payments. - -#+BEGIN_EXAMPLE -'3% (the interest rate) -12 (the number of payments) -10000 (the payment you get each time) -b P (calc-fin-pv, calculate the "present value" of the investment, the break-even point for the investment) - -Result: -1: 99,540.0399357 -#+END_EXAMPLE - -In other words, the break-even point for the initial cost is $99,540. If the -investment costs more than this, it's no good at that assumed interest rate. -Better reject the deal. Trust calc more than any investment banker. - -This is just a small sampling of some of the financial calculations that calc -can perform. The next time you are making an investment, fire up calc. You'll -not only have confidence in the deal, you may just amaze someone with the power -of emacs, just like T.V. Raman did. - -** Calculus - -Quick, integrate =2x + sin(y)=! Well, frankly, it's been so long since I've done -calculus by hand I can't remember anymore. Well, knowing calculus is good, but -knowing calc is even more useful! - -#+BEGIN_EXAMPLE -M-x calc -'2x + sin(y) (The single quote enters algebraic mode) -a i y (Calculate the integral with respect to y) - -Result -1: 2 x y - 180 cos(y) / pi -#+END_EXAMPLE - -You can also integrate over specific regions by using C-u a i, whereupon it will -prompt you for the start and end point of the integration. - -As the manual mentions, the results are often not as simplified as they could -be. Calc is impressive, but it isn't as sophisticated as Mathematica. - -An example of some issues are if we just take the derivative of the integral we -just calculated. We should get back to our original formula. - -#+BEGIN_EXAMPLE -a d y (Calculate the derivative with respect to y) - -Result: -1: 2 x + 3.14159265358 sin(y) / pi -#+END_EXAMPLE - -Clearly this should be 2x + sin(y), but calc may have made an error. - -OK, let's make calc do something cool so we can forget this unfortunate -incident. Hey, how about making a Taylor series of a function? - -#+BEGIN_EXAMPLE -'2x + sin(y) (re-enter the formula) -a t y 6 (Calculate the Taylor series of a term, over y, for 6 terms) - -Result: -1: 2 x + y - y^3 / 6 + y^5 / 120 - y^7 / 5040 + y^9 / 362880 -#+END_EXAMPLE - -This isn't a bad approximation, see [[https://www.google.com/search?q=y+-+y%5E3+%2F+6+%2B+y%5E5+%2F+120+-+y%5E7+%2F+5040+%2B+y%5E9+%2F+362880][Google’s answer]] for comparison. - -So, yes, calc can do college-level math, even if the answers aren't perfectly -simplified. It's not Mathematica, but it is free and integrated into emacs, so -it's definitely nice to have. - -** Bit Manipulation - -Quick! What bits are set on the number 925817? What, are you going to convert it -to binary and note positions of 1s? Ha! I laugh at such primitive techniques. - -#+BEGIN_EXAMPLE -M-x calc -925817 -b u (unpack the bits into a vector) - -Result -1: [0, [3 .. 6], 13, [17 .. 19]] -#+END_EXAMPLE - -How many bits is that? - -#+BEGIN_EXAMPLE -v # (count the number of items in a vector) - -Result: -1: 9 -#+END_EXAMPLE - -This is convenient! So yes, calc has some nice functions for binary numbers. The -interesting thing about calc's binary number functions aren't just that you can -do bitwise operations such as AND and OR, but it has the notion of a word size -that it works with. Well, it'd have to do things like NOT. - -Let's check it out. First, we'll see what the number 925817 looks like in binary. - -#+BEGIN_EXAMPLE -925817 -d 2 - -Result: -1: 2#11100010000001111001 -#+END_EXAMPLE - -This is nice, but it'd be better to see the whole word. - -#+BEGIN_EXAMPLE -d z (Display leading zeroes) - -Result: -1: 2#00000000000011100010000001111001 -#+END_EXAMPLE - -Ah, that's more like it. The word size by default is 32 bits, as you can see. -Or, wait, can you see? Hard to count. Let's verify it. - -#+BEGIN_EXAMPLE -d 0 (go back to base-10 mode) -0 (we start with 0) -b n (calculate the not) - -Result: -1: 4294967295 -#+END_EXAMPLE - -Now we already know how to count the 1's... - -#+BEGIN_EXAMPLE -b u v # - -Reuslt: - -1: 0000000032 -#+END_EXAMPLE - -Whoops, looks like we still have leading 0s. But we've confirmed it, so let's just let it go for now. - -Now, let's see what the number 925817 is if you reverse all the bits. I can't -take credit for this particular bit of cleverness, this technique comes straight -from calc's info pages. - -#+BEGIN_EXAMPLE -d z (get rid of leading 0s) -925817 -b u (unpack into a vector) -31 - (tranform each bit position by subtracting it from 31, the tab just switches the items around on the stack) -b p (repack the vector) - -Result: -1: 2651090944 -#+END_EXAMPLE - -Woody Allen once praised New York by saying how he loves that you can go to -Chinatown and eat a crab in the middle of the night, but in reality what kind of -crazy person would need to do that? I feel the same way about all these -features. Will I really ever need to reverse the bits of a number? Not sure, but -I do love the way that calc has me covered for whatever I really want to do. - -By the way, want to go to 64-bit mode? Just change the word size. - -#+BEGIN_EXAMPLE -b w 64 (change the word size to 64) -#+END_EXAMPLE - -Now let's reverse the bits of 925817 again to see what we get. It'll be -amusingly huge! - -#+BEGIN_EXAMPLE -925817 -b u (unpack into a vector) -63 - (tranform each number by subtracting it from 31, the tab just switches the items around on the stack) -b p (repack the vector) - -Result: -1: 11386348903201767424 -#+END_EXAMPLE - -Ah, that's what it was. I was just about to give that same answer myself. - -One more cool thing. If you give a negative word size, calc will interpret -binary number as 2's complement numbers. For example: - -#+BEGIN_EXAMPLE -b w 32 (set the word size to 32) -2 (just to choose a simple number) -b n (bitwise not) - -Result: -1: 4294967293 -#+END_EXAMPLE - -And now with 2's complement! - -#+BEGIN_EXAMPLE -b w -32 (set the word size to -32, in other words, a 2's complement version of 32 bit) -2 -b n - -Result: -1: -3 -#+END_EXAMPLE - -Hope this helps you twiddle those bits in all the ways that make you happy. +https://emacsair.me/2017/09/01/magit-walk-through/ * Random Notes @@ -1489,12 +262,6 @@ https://www.reddit.com/r/emacs/comments/8ekz0u/how_to_pastethencopy/. Syntax: ~/telnet:HOST#PORT:~, works also with other protocols. -** Magit Walkthrough -:PROPERTIES: -:CREATED: [2018-08-11 Sat 21:05] -:END: - -https://emacsair.me/2017/09/01/magit-walk-through/ ** Fractals in Emacs :PROPERTIES: :CREATED: [2018-08-04 Sat 13:01] @@ -2084,13 +851,1249 @@ Approach: sort all buffers by size. - Customize the variable =file-coding-system-alist= to control whether certain files should always be opened with a specific encoding. -** Fonts and Themes +* Tutorials +** Workshop for Emacs Macros -Inspired by https://github.com/kunalb/poet. +(By [[https://www.howardism.org/][Howard Abrams]], 2015 Nov 24) -- To show all available fonts, use the function ~x-family-fonts~. +Basic idea of this file is to be both a *guide* and a *practice pad* +for leveling up on Emacs’ keyboard macro system. + +To use, just [[https://github.com/howardabrams/pdx-emacs-hackers/raw/master/workshops/keyboard-macros.org][download this file]] to your system, and edit it in Emacs. +Then just follow along... If you are not familiar with org-mode files, +here are the basics for this workshop: + + - Hit a tab on the header expands or collapses it + - Narrow to show just one section with: C-x n s + - Return by widening normally with: C-x n w + - Hyperlinks can be clicked on to view the Emacs Manual + +Pretty much treat the rest of this document as a text file. + +*** Basic Usage + + Let’s begin with something simple to try out this project. + In the /block area/ below, hit: C-c ' (yes, the apostrophe). + When done with the tasks, hit: C-x C-s to close and return here. + + #+BEGIN_SRC org + - This foobar should be Interesting + - Nulla foobar Posuere + - Nullam foobar Tempus + - Etiam foobar laoreet quam sed Arcu + - Donec foobar hendrerit tempor Tellus + - Mauris foobar mollis tincidunt Felis + - etiam laoreet quam sed arcu + - nullam rutrum + - sed diam + - lorem ipsum dolor sit amet, consectetuer adipiscing elit + - mauris ac felis vel velit tristique imperdiet + - fusce suscipit, wisi nec facilisis facilisis, est dui fermentum leo, quis tempor ligula erat quis odio + - donec hendrerit tempor tellus + #+END_SRC + + Notice that the frame is split with this document still visible? + + Good, let’s play around. Let’s capitalize the first letter of each line. + Position point at the beginning of the first line, and then: + + - F3 + - M-c + - C-n + - C-a + - F4 + + Press F4 repeatedly to capitalize the first word on each line. + Don’t capitalize /every/ line... leave a few alone for a moment. + Now you have the basics. + + Let’s make a new macro to capitalize the /last/ word on each line. + Pop back up to the top of the list, and: + + - F3 + - C-e + - M-b + - M-c + - C-n + - F4 + + Once again, leave a few lines alone. + Just one more macro, as I want to show you something interesting. + Jump back to the beginning, and: + + - F3 + - C-a + - M-f + - Space + - foobar (or type any single word you find amusing) + - C-n + - F4 + + Type: C-x C-k C-k + + Notice it behaves the same as F4, but you can keep typing C-k to + execute your macro. + + Start typing C-n and/or C-p and notice the minibuffer. It alternates + between the following: + + - M-c C-n C-a + - C-e M-b M-c C-n + - C-a M-f SPC f 2*o b a r C-n + + Typing C-k at any point will execute that macro. You’ve now see the + Emacs Macro Ring, and can manipulate it. You are now at Level 2. + + Type C-c ' (apostrophe) to close that side window. + +*** Naming Macros + + While that =foobar= macro may be quite handy, looping around the + keyboard macro ring to select it may be inefficient. Name it! + + C-x C-k n + + Give it a name of foobar, and now, you can: M-x foobar + to have the macro run. + + Perhaps it may be more useful to bind that macro to some un-used + key, like C-c k or F2 ... type: + + C-x C-k b + + And then type your binding, e.g. C-c k + + You know that C-c followed by a single letter is supposed to be free + of usage and available for your nefarious reasons, right? + + Read the [[info:emacs#Save%20Keyboard%20Macro][the Emacs Manual]] for details. If you actually tried this + example, then you have earned enough experience points to be level 3. + +*** What do you mean On Every Line? + + Keyboard macros are slick, and while we /could/ prefix the F4 with + the numbering prefix to run it multiple times at once, e.g. C-9 F4, + a typical use case is to run it on every line in a region. + + Position the cursor in the block, and type: C-c ‘ + + #+BEGIN_SRC org + I will not take out the trash + I should not stop swearing + I may not stop to smell the roses + I do not want to go shopping + I could not care less + #+END_SRC + + With the point on the first line, type: + + - F3 + - C-a + - M-f + - M-f + - Space + - not (type the word, =not=) + - F4 + + Now select the remaining 4 lines any way you like, and type: + + - C-x C-k r + + Read [[info:emacs#Basic%20Keyboard%20Macro][the Emacs Manual]] for complete details, and welcome to level 4. + +*** Numbering + + Numbering things seems to be important to people. Let’s see if we + can easily number the worst song ever inflicted on humanity. + + Once again, position the point inside the block, and type: C-c ' + + #+BEGIN_SRC org + 1 Drummers Drumming + 2 Pipers Piping + 3 Lords a Leaping + 4 Ladies Dancing + 5 Maids a Milking + 6 Swans a Swimming + 7 Geese a Laying + 8 Golden Rings + 9 Calling Birds + 10 French Hens + 11 Turtle Doves + 12 Partridge in a Pear Tree + #+END_SRC + + Follow along at home. First, position the point at the end (on the + line with the partridge), and: + + - C-x C-k C-c + - 1 + - Return (to set a counter to 1) + - F3 + - C-a + - F3 + - Spacebar + - C-n + - F4 + + Yes, hitting the F3 key twice (once to start the macro, and again to + insert the value of the counter) is a bit odd. You can also use the + binding: C-x C-k C-i + + Each time you hit F4, you increment the counter that is inserted. + + By the way, if you didn’t do the whole =C-x C-k C-c= to set the + counter to 1, the first value would be 0. Read [[info:emacs#Keyboard%20Macro%20Counter][the manual]] for + details. + +*** Fixing Macros + + Now that you are a Level 5 Elf Keyboard Macro-er, and you can now + sling macros everywhere, you may notice that sometimes, in the + middle of a long macro, you flub it. + + If you hit F4 too soon (it happens), hit: C-u C-u F3 to pick up + where you left off and enter the rest of the macro. Hit F4 when you + are really finished. + + If you need to fix a keyboard macro with more finesse, type: + + C-x C-k C-e + + And behold the glory. Tis a simple language that should be pretty + obvious to a skilled Macro-er as yourself. Type C-h m once in that + buffer to display details of how to edit the macro. When you are + finished editing, type: C-c C-c + + I’ll let you play around with your own example for this one. + Read [[info:emacs#Edit%20Keyboard%20Macro][the manual]] for complete details. + +*** Variations on a Theme + + To gain the Level 7 Keyboard Macro-er title, one should know how to + customize a macro /while/ running it. The following section of HTML + code needs some textual changes. We want to add one of the following + phrases to the /end/ of every paragraph that has a =class= of =change=: + + * Because I said so. Got it? + * Because I'm the boss. Got it? + * You heard me. Got it? + * Just do it. Got it? + + To begin, first move to the following block (hint: C-c M-f) and hit + TAB to collapse the block (you gotta see all the instructions, + right?) Next, issue a C-c ' on this block to show it in a new + window. If you have trouble with your HTML mode, change the =html= + to =text=. + + #+BEGIN_SRC html + + + +

+ Proin neque massa, cursus ut, gravida ut, lobortis eget, lacus. + Praesent augue. Sed diam. Nunc eleifend leo vitae magna. Nunc + rutrum turpis sed pede. +

+

+ Nullam rutrum. Nunc rutrum turpis sed pede. +

+

+ Phasellus at dui in ligula mollis ultricies. Curabitur lacinia + pulvinar nibh. Donec pretium posuere tellus. Praesent + fermentum tempor tellus. Proin quam nisl, tincidunt et, mattis + eget, convallis nec, purus. +

+

+ Fusce sagittis, libero non molestie mollis, magna orci ultrices + dolor, at vulputate neque nulla lacinia eros. Sed diam. Nam + vestibulum accumsan nisl. +

+

+ Aliquam feugiat tellus ut neque. Nam vestibulum accumsan + nisl. Praesent fermentum tempor tellus. +

+

+ Vivamus id enim. Suspendisse potenti. Curabitur lacinia + pulvinar nibh. Mauris ac felis vel velit tristique imperdiet. +

+

+ Donec vitae dolor. Mauris ac felis vel velit tristique + imperdiet. Nunc aliquet, augue nec adipiscing interdum, lacus + tellus malesuada massa, quis varius mi purus non odio. Proin + quam nisl, tincidunt et, mattis eget, convallis nec, purus. Nam + euismod tellus id erat. +

+

+ Nullam rutrum. +

+ + + #+END_SRC + + Type the following: + + - F3 + - C-s + - Type: class="change" + - C-e + - C-s + - Type:

+ - C-p + - C-e + - C-x q + - Type: Got it? + - C-n + - F4 + + In this particular case, we actually didn't do anything special, so + move to the beginning of the buffer, and hit F4, and the cursor will + go to the end of every paragraph that needs changing, and stop with + a prompt: + + Proceed with macro? (Y, N, RET, C-l, C-r) + + Type C-r and begin typing one of our phrases, and when you are done, + type: C-M-c + + The prompt will be re-displayed, so finish the macro with 'Y'. + Check out [[info:emacs#Keyboard%20Macro%20Query][the manual]] for details on this =C-x q= business. + +** Emacs Calc Tutorials + +By Andrew Hyatt, found here: https://github.com/ahyatt/emacs-calc-tutorials. +License is GPLv3. + +Order as given by https://blog.markhepburn.com/2013/12/07/andrew-hyatts-emacs-calc-tutorials + +*** README + +#+BEGIN_EXAMPLE +This repository contains tutorials about emacs calc originally writen on the +Emacs community on Google+. + +The best way to read is probably just to open the org files directly, which +Github will display correctly. + +If anyone would like to correct anything, add any tutorials, or request +anything, the normal Github bug / request / or pull request process will work. + +#+END_EXAMPLE + +*** HEX + +OK, seems like there's interest in some quick calc tips. Here's today's: + +How to convert decimal to hexidecimal. Let's say you want to convert number +12345 to hex. + +#+BEGIN_EXAMPLE +M-x calc +d 6 (sets the number radix to 16, meaning all output will be in hex) +10#12345 (inputs the number 12345 in base 10) + +The output reads: +1: 16#3039 +#+END_EXAMPLE + +The answer is therefore =0x3039=. + +And then you can do a =d 0= to set the number radix back to normal, base 10. + +Here's how to do the other way. Let's convert =0xABCDEF= to base 10. + +#+BEGIN_EXAMPLE +M-x calc +16#ABCDEF + +The output reads: +1: 11259375 +#+END_EXAMPLE + +*** Date + +Ever want to know how many seconds old David Hasselhoff is? calc can do many +things, but it doesn't know much about Hasselhoff, so first I do a query on +Google for [david hasselhoff]. I get a knowledge card on the right saying he was +born July 17, 1952. It doesn't give a time, so we'll just assume it was at +midnight. + +#+BEGIN_EXAMPLE +M-x calc +t N (put the current time on the stack) +' (press ' to enter algebraic mode, then you input the date). +- (subtract the two to get the number of days David has been alive) +24 (we're going to multiply by 24, the number of hours in a day) +60 (the number of minutes in an hour) +60 (the number of seconds in a minute) +* +* +* + +Final result: +1: 1910255938.01 +#+END_EXAMPLE + +There you have it, he's... wait, how many seconds? That's really hard to read. + +Back into calc! + +#+BEGIN_EXAMPLE +d g (toggle digit grouping) + +The final final result: +1: 1,910,255,938.01 +#+END_EXAMPLE + +Ah, that's a 1.9 billion seconds. Sweet! + +*** Time + +Hey, what's the time? It's time to get ill! No, actually I meant the time in +seconds since the epoch. Yesterday I went over doing math with time, which is +fun but not something I use everyday. Much more useful is converting to and from +Unix timestamps. + +Let's start by getting the time now in seconds since the epoch: + +#+BEGIN_EXAMPLE +M-x calc +t N (get the time now) +t U (convert the time to seconds since the epoch) + +Result: +1: 1359424746 +#+END_EXAMPLE + +Oh, and you want to insert that into your last used buffer? + +#+BEGIN_EXAMPLE +y (that doesn't mean "yes", that means yank into the last buffer) +#+END_EXAMPLE + +Done! Just to be complete, let's convert another date we have to input: + +#+BEGIN_EXAMPLE +'<12:00pm Jul 4, 1776> (single quote to enter algebraic mode, then the date) +t U (converts the time to seconds since the epoch) +#+END_EXAMPLE + +But wait, what will happen? This is considerably before the epoch. + +#+BEGIN_EXAMPLE +Result: +1: -6106003200 +#+END_EXAMPLE + +Oh calc, you never let me down. + +Let's do the other way. Remember the Billenium? + +#+BEGIN_EXAMPLE +1e9 +t U (converts the time in seconds since the epoch to text) + +Result: +1: <9:46:40pm Sat Sep 8, 2001> +#+END_EXAMPLE + +Wow, I never realized how close the Billenium was to September 11th. Kind of spooky... + +*** Random + +I use calc whenever I need a random number. The interface is easy and the random +numbers are (supposedly) high quality. + +So, let's start with something simple: A random number between 0 and 100: + +#+BEGIN_EXAMPLE +M-x calc +100 (the upper bound, all values will be between 0 and this) +k r (creates a random number between 0 and the number on the stack) + +Result: +1: 66 (of course, yours will be different) +#+END_EXAMPLE + +I want another one! +#+BEGIN_EXAMPLE +k a (creates another number with the same upper bound as the last) +#+END_EXAMPLE + +Now that I’ve had a taste of that sweet sweet randomness, I want a vector of 50! + +#+BEGIN_EXAMPLE +100 (the upper bound, again) +50 (the number to generate) +k h (generate a vector of 50 random numbers between 0 and 100) + +1: [60, 72, 61, 74, 77, 97, 10, 90, 8, 29, 82, 81, 51, 58, 7, 88, 99, 1, 37, 89, 93, 84, 52, 94, 2, 35, 5, 48, 87, 47, 14, 6, 79, 18, 67, 76, 70, 9, 43, 65, 69, 23, 55, 11, 53, 78, 50, 30, 13, 42] +#+END_EXAMPLE + +OK, that's nice. But how about a number between 0 and 1? + +#+BEGIN_EXAMPLE +1.0 +k r + +Result: +1: 0.636988102539 +#+END_EXAMPLE + +OK, how about number between -50 and 50? For that we need to use what calc calls +an interval form: + +#+BEGIN_EXAMPLE +[ (Starts interval form) +50 (You can't just type -50 in calc) +n (negate, givint -50) +.. (the middle part of the interval form) +50] (closing the interval form) +#+END_EXAMPLE + +What you see now in calc is: +#+BEGIN_EXAMPLE +[-50 .. 50] +#+END_EXAMPLE +And you could have just typed it in with: +#+BEGIN_EXAMPLE +'[-50 .. 50] +#+END_EXAMPLE +which would be a lot easier, really. + +#+BEGIN_EXAMPLE +k r +#+END_EXAMPLE +This produces a random number from the bounds of the interval, in this case both +-50 and 50 are possible, if you wanted them to be exlusive bounds, you'd use the +form =(-50 .. 50)=. + +Finally, you can re-arrange a list: +#+BEGIN_EXAMPLE +'[1 2 3 4] (our starting vector) +-1 (signals to use the vector above, could also be the size of the vector) +k h + +Result: +1: [3, 1, 4, 2] +#+END_EXAMPLE + +But =k a= will not give you more variants, unfortunately. + +*** Unit Conversion + +You load 16 tons, and what do you get? I mean, in kilograms. + +#+BEGIN_EXAMPLE +M-x calc +' 16 tons (' to enter algebraic mode, so you can type out the units) +u c kg (u c for "unit convert", and kg being the target unit). + +Result: +1: 14514.95584 kg +#+END_EXAMPLE + +Calc treats units as special. If you added something, such as: + +#+BEGIN_EXAMPLE +3 ++ + +Result: +1: 14514.95584 kg + 3 +#+END_EXAMPLE + +But you can remove the units from the above using: +#+BEGIN_EXAMPLE +u r (remove units) + +Result: +1: 14517.95584 +#+END_EXAMPLE + +OK, that's all well and good. But I've always wondered how much is Grandpa +Simpson's gas mileage when he said "My car gets 40 rods to the hogshead and +that's the way I likes it." + +For that, we need to define the units. Calc knows about a lot of units, but +maybe not the rod and hogshead. In fact, in the calc info pages, defining what a +"rod" is the example for how to define your own units. Let's get started! + +#+BEGIN_EXAMPLE +'16 ft (The equivalent to one rod) +u d rod Rod (defines a new unit rod, with optional description "Rod") +#+END_EXAMPLE +Now a hogshead is a unit of measurement that varies by what liquid it contains. +I don't know what the unit is for gasoline, but let's use sherry as a +substitute, in which a hogshead is 245 liters. + +#+BEGIN_EXAMPLE +'245 liters +u d hogshead (don't bother with a description this time) +'40 rod +'1 hogshead +/ +#+END_EXAMPLE +Wait, what units should we be using? +#+BEGIN_EXAMPLE +u v (show the units table, a handy table of all units) +u c mi/gal (the units come from the unit table) + +Result: +1: 1.87280731429e-3 mi / gal +#+END_EXAMPLE + +But wait, we can do better. Why upgrade this measure to something that isn't +even standard? Miles per gallon is just a bit better than rods per hogshead (in +fact, that was what the original joke was about). + +#+BEGIN_EXAMPLE +u c si (convert everything to scientific units) + +Result: +1: 796.212244896 / m^2 +#+END_EXAMPLE + +Not that I understand this number, but at least in miles per gallon, I can see +that that's not such great fuel economy, but what you do expect from Grandpa? + +OK, one more cool thing, then I'm out of here. Calc can split up numbers into +multiple units. Here's 42 inches in feet and inches: + +#+BEGIN_EXAMPLE +'42 in +u c ft+in (Convert to a mixture of feet and inches) + +Result: +1: 3 ft + 6. in +#+END_EXAMPLE + +Calc, you're sooo coool! + +*** Pi and Precision + +This one's about p and P and mostly about pi. + +First, let's pi it up: + +#+BEGIN_EXAMPLE +M-x calc +P (this gives you pi) + +Result: +1: 3.14159265359 +#+END_EXAMPLE + +Well, I guess that's a reasonable pi. But, c'mon, this is calc. Can't we get a +bit more digits? How about 100? + +#+BEGIN_EXAMPLE +p 100 (sets precisions to 100) +P (need to ask calc again for pi, it doesn't recalculate) + +Result: +1: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 +#+END_EXAMPLE + +Well, but actually evaluating it robs it of its never-ending charm. Let's just +use it as a variable. How about calculating the area of a circle with a 5 km +radius? + +#+BEGIN_EXAMPLE +'5000 m +2 +^ +'pi (enter pi as a variable) +* + +We get: +1: 25000000 m^2 pi +#+END_EXAMPLE + +Yeah, sure that’s what I said I wanted, but I’ve changed my mind - now I want a number. + +#+BEGIN_EXAMPLE += + +1: 78539816.3397448309615660845819875721049292349843776455243736148076954101571552249657008706335529267 m^2 +#+END_EXAMPLE + +Whoops, looked like I forgot to set the precision back to normal. And I can't +read this. Let's make it a bit nicer. + +#+BEGIN_EXAMPLE +Control-_ (normal emacs undo) +p 7 +d g (turn digit grouping on) += + +Result: +1: 7.853983e7 m^2 +#+END_EXAMPLE + +Oh, that's because I didn't have enough precision to render it without resorting +to scientific notation. Let's just bump the precision up again. + +#+BEGIN_EXAMPLE +Control-_ (undo, since we have to redo the pi conversion with more precision) +p 10 += + +Result: +1: 78,539,816.35 m^2 +#+END_EXAMPLE + +Ah, that's better. + +*** Strings + +Did you know you could work with strings in calc? For an example, let's find out +what "Hello world" is in binary: + +#+BEGIN_EXAMPLE +M-x calc +d 2 (change the to binary mode) +"Hello world (Enter the string "Hello world" which turns into a vector of numbers) + +Result: +1: [2#1001000, 2#1100101, 2#1101100, 2#1101100, 2#1101111, 2#100000, 2#1110111, 2#1101111, 2#1110010, 2#1101100, 2#1100100] +#+END_EXAMPLE + +And similarly, we can convert back. If someone gave you the binary number: +=01001000011011110110110001100001= and asked what the string was, I'd have no +idea... but calc knows: + +#+BEGIN_EXAMPLE +d " (changes to string mode) +C-x b scratch (whaaa, leave calc?) +01001000011011110110110001100001 (enter the number we're parsing) +C-a (go to the start of the line) +C-x ( (start a macro) +2# (prefix the number with a binary indicator) +C-u 8 C-f (Jump forward 8 characters) + (insert a space to separate the numbers) +C-x ) (end the macro) +C-x e (repeat the macro) +e e (repeat twice twice more) +C- (set mark) +C-a (goto beginning of line) +C-x g (copy region into calc) + +Result: + +1: "Hola" +#+END_EXAMPLE + +And there you have it! Maybe there is an easier way to convert from the giant +binary number to a vector of bytes, but I don't know it yet. + +*** Fractional Arithmetic + +This one is pretty short, but it's about one of my favorite features of calc: +the ability to handle fractions as fractions instead of rendering them as real +numbers. + +Quick, what's =5/8 + 9/21=? + +Um, ok... better start multiplying things... wait, let's just tell calc to do +it. + +#+BEGIN_EXAMPLE +M-x calc +5:8 (this is how you enter a fraction) +9:21 ++ + +Result: +1: 59/56 +#+END_EXAMPLE + +So easy! If we want to convert it to a float you can do this: + +#+BEGIN_EXAMPLE +c f (convert to +float) + +Result: + +1: 1.05357142857*10.^0 +#+END_EXAMPLE + +And if you want it back as a fraction, then just do: + +#+BEGIN_EXAMPLE +c F (convert to fraction) + +Result: + +1: 59/56 +#+END_EXAMPLE + +That's so awesome! + +You could also enter fractions this way: + +#+BEGIN_EXAMPLE +m f (set fraction mode, integer division will result in fractions) +5 +8 +/ + +Result: + +1: 5/8 +#+END_EXAMPLE + +Now you can live in the nice world of fractions as much as you like. It's a nice +world, full of pleasant to look at integers taking up little horizontal space + +*** Algebra + +I think it's time to write about one of the amazing things that calc can do: +algebra! + +Before we get into how to solve equations, I just want to write about on some +cool things you can do with the calc display. + +Let's say you have a formula you want to work with =a + sqrt(b) = 5=. Let's enter +that into calc: + +#+BEGIN_EXAMPLE +M-x calc +'a + sqrt(b) = 5 (' starts algebraic mode). + +Result: +1: a + sqrt(b) = 5 +#+END_EXAMPLE + +Well, that's not so surprising, that's what we put in. Kind of disappointing, +though. Is that it calc? We love your brains, but what about your looks? That's +important too! + +#+BEGIN_EXAMPLE +d B (turn on calc-big-language mode) + +Result: + ___ +1: a + V b = 5 +#+END_EXAMPLE + +Hey, that's an ASCII square-root symbol. What other cool things can you do here? + +#+BEGIN_EXAMPLE +a^2 + +Result: + + 2 +1: a + +3:4 (enter the fraction 3/4) + +Result: + + 3 +1: - + 4 +#+END_EXAMPLE + +Here's how to get back: +#+BEGIN_EXAMPLE +d N (calc-normal-language) +#+END_EXAMPLE + +And an alternative, in which all operators are explicitly represented as +functions: + +#+BEGIN_EXAMPLE +1: a + sqrt(b) = 5 (re-enter the formula) +d U (calc-unformatted-language) + +Result: +1: eq(add(a, sqrt(b)), 5) +#+END_EXAMPLE + +But, wait, did you think that's all? What if you wanted to enter that equation +in Mathematica? + +#+BEGIN_EXAMPLE +d M (calc-mathematica-language) + +Result: + +1: a + Sqrt[b] == 5 +#+END_EXAMPLE + +Ooh! Calc! Do c++ next! + +#+BEGIN_EXAMPLE +d C (calc-c-language) + +1: a + sqrt(b) == 5 +#+END_EXAMPLE + +Latex! + +#+BEGIN_EXAMPLE +d L (calc-latex-language) + +Result: + +1: a + \sqrt{b} = 5 +#+END_EXAMPLE + +I could keep going, but trust me, there's more. And you can even define your own +languages by constructing syntax tables, but I won't get into that now. + +*** More on Algebra + +Jim is 42 years old. He has one brother, and their total age is 100. What is the +brother's age? OK, this isn't a very hard problem, but let's just introduce calc +algebra by solving it. + +#+BEGIN_EXAMPLE +M-x calc +'42 + x = 100 (' to enter algebraic input) +a S x (solve for x) + +Result: +1: x = 58 +#+END_EXAMPLE + +Let's make this harder. Jim and Dan's ages sum to 100. Jim is 5 years older than +Dan. How old are they? + +#+BEGIN_EXAMPLE +'[j + d = 100, d + 5 = j] +a S j,d + +Result: +1: [j = 52.5, d = 47.5] +#+END_EXAMPLE + +Nice! + +And of course it can give you more than just numerical solutions: + +#+BEGIN_EXAMPLE +'sin(x) + tan(y) = pi / 2 +a S y (solve for y) + +Result: +1: y = arctan(pi / 2 - sin(x)) +#+END_EXAMPLE + +Sometimes there are more than one solution. For example: +#+BEGIN_EXAMPLE +'x^2 = 25 +a S x + +Result: +1: x = 5 +#+END_EXAMPLE + +Wait, what happened to -5! That's a valid solution, why didn't calc tell us +about it? What's happening here is that calc is telling us about the first valid +thing it can find, which is basically how it operates. But you can always get +everything: + +#+BEGIN_EXAMPLE +'x^2 = 25 +a P x (find the polynomial solutions) + +Result: +1: [5, -5] +#+END_EXAMPLE + +Sometimes there aren't a finite number of results because you aren't dealing +with polynomials. You can just get a generalized solution: + +#+BEGIN_EXAMPLE +'sin(x)^2 = 25 +H a S x (solve for x, giving the generalized solution) + +Result: +1: x = arcsin(5 s1) (-1)^n1 + 180 n1 +#+END_EXAMPLE + +This uses the calc notation =n1=, which you just means any integer. You can also +see another notation =s1= which means any sign. In this case =5 s1= means that that +number can be 5 or -5. + +Looking at how awesome calc is, it's just a shame I never knew about it in high +school... + +*** Financial + +I recently chatted with emacspeak creator T.V. Raman, and told him I was +writing a series of short tutorials about calc. He is really a calc fanatic, and +told me a story in which he astounded a loan officer by calculating scheduled +loan payments with just a few keystrokes in calc. Raman is living proof that +calc is a useful tool for so many situations, and it always pays to have emacs +running. He also mentioned that he found the explanation in the calc tutorial +about the financial functions to be the clearest he's ever read. + +So, yes, calc can do finance. Let's say that you were sitting in front of a loan +officer, and she told you that for your loan of $500,000, you need to pay in 30 +installments with a 5% interest rate. How much do you need to pay each month? +Wait a second! Stop right there, loan officer! I have calc! + +#+BEGIN_EXAMPLE +M-x calc +500000 (the amount of the loan) +30 (the number of payments) +'5% (equivalent to typing 0.05) +b M (calc-fin-pmt, computing the amount of periodic payments to amortize a loan) + +Result: +1: 25,000 +#+END_EXAMPLE + +OK, but that's a bit obvious, since $25,000 is just 5% of $500,000. If the +number of payments was much smaller, we'd get a larger value. Let's take another +question: if you wanted to only pay $10,000 in each installment? How many +installments would it take to pay off the loan? + +#+BEGIN_EXAMPLE +'5% +10000 (the payment we want to make) +500000 (the loan amount) +b # (calc-fin-nper, calculate the number of installments needed) + +Result +1: nper(0.05, 10,000, 500,000) +#+END_EXAMPLE + +What? Oh, I see, I also go the message: "Payment too small to cover interest +rate: 10000". Oh, right, 5% of $500,000 is already $25,000, so we'd never pay it +off at that rate. What if we payed $50,000 instead? + +#+BEGIN_EXAMPLE +'5% +50000 (the payment we want to make) +500000 (the loan amount) +b # + +Result: +1: 14.2066908 +#+END_EXAMPLE + +So, it would take just over 14 payments to pay off the loan. + +OK, one more cool one: Let's say you meet an investment banker who gives you the +following deal. I've got a investment for you, she says. Just give me $100,000 +and I'll give you $10,000 at the end of each year for the next 12 years. +Assuming the interest rate will stay at 3% for the next 12 years. Is it a good +deal? + +Hey, what are you asking me for? I have no idea! Calc knows, though, because it +can tell you the break-even point for the cost of an investment that gives +periodic payments. + +#+BEGIN_EXAMPLE +'3% (the interest rate) +12 (the number of payments) +10000 (the payment you get each time) +b P (calc-fin-pv, calculate the "present value" of the investment, the break-even point for the investment) + +Result: +1: 99,540.0399357 +#+END_EXAMPLE + +In other words, the break-even point for the initial cost is $99,540. If the +investment costs more than this, it's no good at that assumed interest rate. +Better reject the deal. Trust calc more than any investment banker. + +This is just a small sampling of some of the financial calculations that calc +can perform. The next time you are making an investment, fire up calc. You'll +not only have confidence in the deal, you may just amaze someone with the power +of emacs, just like T.V. Raman did. + +*** Calculus + +Quick, integrate =2x + sin(y)=! Well, frankly, it's been so long since I've done +calculus by hand I can't remember anymore. Well, knowing calculus is good, but +knowing calc is even more useful! + +#+BEGIN_EXAMPLE +M-x calc +'2x + sin(y) (The single quote enters algebraic mode) +a i y (Calculate the integral with respect to y) + +Result +1: 2 x y - 180 cos(y) / pi +#+END_EXAMPLE + +You can also integrate over specific regions by using C-u a i, whereupon it will +prompt you for the start and end point of the integration. + +As the manual mentions, the results are often not as simplified as they could +be. Calc is impressive, but it isn't as sophisticated as Mathematica. + +An example of some issues are if we just take the derivative of the integral we +just calculated. We should get back to our original formula. + +#+BEGIN_EXAMPLE +a d y (Calculate the derivative with respect to y) + +Result: +1: 2 x + 3.14159265358 sin(y) / pi +#+END_EXAMPLE + +Clearly this should be 2x + sin(y), but calc may have made an error. + +OK, let's make calc do something cool so we can forget this unfortunate +incident. Hey, how about making a Taylor series of a function? + +#+BEGIN_EXAMPLE +'2x + sin(y) (re-enter the formula) +a t y 6 (Calculate the Taylor series of a term, over y, for 6 terms) + +Result: +1: 2 x + y - y^3 / 6 + y^5 / 120 - y^7 / 5040 + y^9 / 362880 +#+END_EXAMPLE + +This isn't a bad approximation, see [[https://www.google.com/search?q=y+-+y%5E3+%2F+6+%2B+y%5E5+%2F+120+-+y%5E7+%2F+5040+%2B+y%5E9+%2F+362880][Google’s answer]] for comparison. + +So, yes, calc can do college-level math, even if the answers aren't perfectly +simplified. It's not Mathematica, but it is free and integrated into emacs, so +it's definitely nice to have. + +*** Bit Manipulation + +Quick! What bits are set on the number 925817? What, are you going to convert it +to binary and note positions of 1s? Ha! I laugh at such primitive techniques. + +#+BEGIN_EXAMPLE +M-x calc +925817 +b u (unpack the bits into a vector) + +Result +1: [0, [3 .. 6], 13, [17 .. 19]] +#+END_EXAMPLE + +How many bits is that? + +#+BEGIN_EXAMPLE +v # (count the number of items in a vector) + +Result: +1: 9 +#+END_EXAMPLE + +This is convenient! So yes, calc has some nice functions for binary numbers. The +interesting thing about calc's binary number functions aren't just that you can +do bitwise operations such as AND and OR, but it has the notion of a word size +that it works with. Well, it'd have to do things like NOT. + +Let's check it out. First, we'll see what the number 925817 looks like in binary. + +#+BEGIN_EXAMPLE +925817 +d 2 + +Result: +1: 2#11100010000001111001 +#+END_EXAMPLE + +This is nice, but it'd be better to see the whole word. + +#+BEGIN_EXAMPLE +d z (Display leading zeroes) + +Result: +1: 2#00000000000011100010000001111001 +#+END_EXAMPLE + +Ah, that's more like it. The word size by default is 32 bits, as you can see. +Or, wait, can you see? Hard to count. Let's verify it. + +#+BEGIN_EXAMPLE +d 0 (go back to base-10 mode) +0 (we start with 0) +b n (calculate the not) + +Result: +1: 4294967295 +#+END_EXAMPLE + +Now we already know how to count the 1's... + +#+BEGIN_EXAMPLE +b u v # + +Reuslt: + +1: 0000000032 +#+END_EXAMPLE + +Whoops, looks like we still have leading 0s. But we've confirmed it, so let's just let it go for now. + +Now, let's see what the number 925817 is if you reverse all the bits. I can't +take credit for this particular bit of cleverness, this technique comes straight +from calc's info pages. + +#+BEGIN_EXAMPLE +d z (get rid of leading 0s) +925817 +b u (unpack into a vector) +31 - (tranform each bit position by subtracting it from 31, the tab just switches the items around on the stack) +b p (repack the vector) + +Result: +1: 2651090944 +#+END_EXAMPLE + +Woody Allen once praised New York by saying how he loves that you can go to +Chinatown and eat a crab in the middle of the night, but in reality what kind of +crazy person would need to do that? I feel the same way about all these +features. Will I really ever need to reverse the bits of a number? Not sure, but +I do love the way that calc has me covered for whatever I really want to do. + +By the way, want to go to 64-bit mode? Just change the word size. + +#+BEGIN_EXAMPLE +b w 64 (change the word size to 64) +#+END_EXAMPLE + +Now let's reverse the bits of 925817 again to see what we get. It'll be +amusingly huge! + +#+BEGIN_EXAMPLE +925817 +b u (unpack into a vector) +63 - (tranform each number by subtracting it from 31, the tab just switches the items around on the stack) +b p (repack the vector) + +Result: +1: 11386348903201767424 +#+END_EXAMPLE + +Ah, that's what it was. I was just about to give that same answer myself. + +One more cool thing. If you give a negative word size, calc will interpret +binary number as 2's complement numbers. For example: + +#+BEGIN_EXAMPLE +b w 32 (set the word size to 32) +2 (just to choose a simple number) +b n (bitwise not) + +Result: +1: 4294967293 +#+END_EXAMPLE + +And now with 2's complement! + +#+BEGIN_EXAMPLE +b w -32 (set the word size to -32, in other words, a 2's complement version of 32 bit) +2 +b n + +Result: +1: -3 +#+END_EXAMPLE + +Hope this helps you twiddle those bits in all the ways that make you happy. -- Load custom themes with ~customize-themes~ instead of calling ~load-theme~ - directly. However, this does not set ~custom-enabled-themes~ correctly - (Emacs 26.1), so directly customizing ~custom-enabled-themes~ seems to be the - best thing (although one has to know the names of the themes then).