Git Product home page Git Product logo

emacs-from-scratch's Introduction

Emacs From Scratch

This is an example of a fully custom Emacs configuration that you can use as inspiration when building your own!

We’re developing this configuration live on YouTube, subscribe to System Crafters (make sure to click the bell!) so that you’re notified of future streams.

If you’re enjoying the videos and benefitting from the examples in this repo, please consider becoming a sponsor to support the development of future content!

How to Use This Configuration

This repo is meant to be a companion to the Emacs From Scratch video series, serving as an example of a custom configuration build on top of vanilla Emacs. I give instructions below for how to set it up to try it out, but it isn’t meant to be used as your main configuration! My goal here is to provide a working configuration that you can take inspiration from (and copy from directly).

Just keep in mind that this repo isn’t set up to be used directly as your own configuration! Copy the code to your own dotfiles repository and have fun :)

Episodes

This repo now contains configuration from multiple series on the channel!

Here is a list of all the episode videos with links to the configuration we built for each one:

  1. Live-Coding a Custom Emacs Configuration from Scratch (Code, Notes)
  2. Adding Helpful UI Improvements (Code, Notes)
  3. Key Bindings and Evil (Code, Notes)
  4. Projectile and Magit (Code, Notes)
  5. Org Mode Basics (Code, Notes)
  6. Organizing Your Life with Org Mode (Code, Notes)
  7. Configure Everything with Org Babel (Code, Notes)
  8. Build Your Own IDE with lsp-mode (Code, Notes)
  9. Learn to Love the Terminal Modes (Code, Notes)
  10. Effortless File Management with Dired (Code, Notes)
  11. Keeping Your Emacs Packages Up to Date (Code, Notes)
  12. How to Cut Emacs Start Up Time in Half! (Code, Notes)
  1. The Absolute Beginner’s Guide to Emacs (Notes)
  1. Introduction to Emacs Lisp (Notes)
  2. Types, Conditionals, and Loops (Notes)
  3. Defining Functions and Commands (Notes)
  4. Defining Variables and Scopes (Notes)
  5. Reading and Writing Buffers in Practice (Notes, Code)
  1. Getting Started with EXWM (Code, Notes)
  2. Improving the EXWM Experience (Code, Notes)
  3. Optimizing Window Placement in EXWM (Code, Notes)
  4. Using Multiple Monitors in EXWM (Code, Notes)
  5. The Perfect Panel: Integrating Polybar with Emacs (Code, Notes)
  6. Enabling Desktop Notifications with Dunst (Code, Notes)
  1. How to Debug Your Code with dap-mode (Code, Notes)
  2. Python Development Configuration (Code, Notes)
  1. How to Create and Manage Multiple Windows (Notes)
  2. Organize Your Windows with the Tab Bar in Emacs 27 (Notes)
  3. Dynamic Tiling Windows in Emacs with Edwina (Notes)
  4. Unlock the Power of the Daemon with emacsclient (Notes)
  5. Give Emacs Psychic Completion Powers with prescient.el (Notes)
  6. Teach Emacs to Keep Your Folders Clean (Code, Notes)
  7. Managing Encrypted Passwords with Emacs (Notes)
  8. Hey Emacs, Don’t Move My Windows! (Notes)
  1. Streamline Your E-mail Management with mu4e (Notes)
  2. Managing Multiple Email Accounts with mu4e and mbsync (Notes)
  3. Compose and Send Email with Emacs (Notes)
  4. Enhance Your Emails with Org Mode (Notes)
  5. Craft an Email Workflow with Org Mode (Notes)

Usage Instructions

IMPORTANT: Be sure to read the commentary in Emacs.org in case anything unexpected happens when you load this configuration. Feel free to file an issue to discuss any questions or problems you have so we can discuss it in a future stream!

Linux and macOS

On Linux, Emacs can be found in every major Linux distribution’s package manager. On macOS you can install Emacs using Homebrew via brew install emacs.

You can easily get started with this configuration on Linux and macOS by following these steps:

  1. Clone this repository to a folder on your system: git clone https://github.com/daviwil/emacs-from-scratch
  2. Back up any existing Emacs configuration you may already have in your home directory in the .emacs.d folder (you could try moving it to .emacs.d-old)
  3. Rename the directory for the clone of this repo to ~/.emacs.d.
  4. Start Emacs!

Windows

You can download the latest Emacs version (27.1 at the time of this writing) for Windows by heading to the GNU FTP site. Downloading and running the installer package will likely be the easiest way to get started. You can also install Emacs via Chocolatey if you prefer a more automated approach.

The location where the Emacs configuration folder lives may vary based on your version of Windows. If you have trouble getting this to work, check the official FAQ on the topic. If you still can’t get it to work, feel free to file an issue and I can help investigate.

For most modern Windows versions (Windows 7+), these steps should work:

  1. Clone this repository to a folder on your system: git clone https://github.com/daviwil/emacs-from-scratch
  2. Back up any existing Emacs configuration you may already have in your home directory (likely C:\Users\yourusername\) in the .emacs.d folder (you could try moving it to .emacs.d-old)
  3. Rename the directory for the clone of this repo to C:\Users\yourusername\.emacs.d.
  4. Start Emacs!

Installing the Fira Code Font

This configuration uses the Fira Code font by @tonsky and installation instructions can be found on this wiki page.

However, since this is meant to be your configuration, feel free to choose your own font!

Recommendations

Here are some general recommendations on Emacs usage that you might find helpful:

Replace CapsLock with CTRL

Most people don’t use the CapsLock key (unless you like YELLING ON THE INTERNET) so you can use this simple fix to replace it with the CTRL to make your Emacs life easier. Doing this will prevent you from having to bend your pinky down all day long to hit all those fabled Emacs keybindings, allowing you to keep your hands on the home row of the keyboard.

Here’s how to do it across all 3 major operating systems:

Linux X11

There are many ways to accomplish this in Linux, but the easiest (and most repeatable) I’ve found is to use xmodmap. First, create a file named .Xmodmap in your home folder and populate it like so:

clear lock
clear control
keycode 66 = Control_L
add control = Control_L
add Lock = Control_R

This replaces CapsLock with control and also replaces the Ctrl key on the right side with CapsLock just in case you ever need to use it. Most login systems (GDM, KDM, etc) will load this file when you log in so you might not need to do anything extra for it to take effect, just log out and log back in again. If that doesn’t seem to work, you can add this line to one of your startup files (.xinitrc, .profile, window manager configuration, etc):

xmodmap ~/.Xmodmap

Linux sway

In your ~/.config/sway/config file add this stanza and reload the config (usually $mod-Shift-c) or swaymsg reload:

input * {
xkb_options caps:ctrl_modifier
}

Windows

Approach #1: Change the binding in the Windows registry

On Windows you can use a simple registry file to tweak the CapsLock mapping. Save the following text to a file called CapsLockHack.reg:

REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00

Now double-click on this file in Windows Explorer and allow Windows to apply it to your registry settings. After you log out of your current session and log back in the new key mapping should be in effect. Note that this change will affect all users on your system.

Approach #2: Use Microsoft’s PowerToys

You can use PowerToys’ Keyboard Manager to easily remap the keys. Download the tool from their github page and install it. Then open the powertoys settings (you sould find it in the taskbar), go to keyboard manager, enable it if it isn’t already enabled and remap your keys. Once finished you should see something like:

Caps LockCtrl (Left)

Ctrl (left)Caps Lock

macOS

Thankfully Apple saw fit to make this a first-class option in macOS. You can follow the official documentation for your version of macOS to find the Modifier Keys settings and then switch Caps Lock to Control on that page.

emacs-from-scratch's People

Contributors

abellmann avatar apiraino avatar basbossink avatar bhepple avatar bjschmidt avatar bkaestner avatar codeluggage avatar daviwil avatar luishgh avatar peterpolidoro avatar r-katabasis avatar tiborsimko avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

emacs-from-scratch's Issues

Rainbow Delimiters Package Doesn't Work

I've watched the first two videos in the Emacs from Scratch series and can't get the rainbow-delimiters package to work. The below configuration is based on the things covered in the first two videos:

(setq inhibit-startup-message t)

(scroll-bar-mode -1)        ; Disable visible scrollbar
(tool-bar-mode -1)          ; Disable the toolbar
(tooltip-mode -1)           ; Disable tooltips
(set-fringe-mode 10)        ; Give some breathing room

(menu-bar-mode -1)            ; Disable the menu bar

;; Set up the visible bell
(setq visible-bell t)

(set-face-attribute 'default nil :font "Menlo" :height 160)

;; Make ESC quit prompts
(global-set-key (kbd "<escape>") 'keyboard-escape-quit)

;; Initialize package sources
(require 'package)

(setq package-archives '(("melpa" . "https://melpa.org/packages/")
                         ("org" . "https://orgmode.org/elpa/")
                         ("elpa" . "https://elpa.gnu.org/packages/")))

(package-initialize)
(unless package-archive-contents
 (package-refresh-contents))

;; Initialize use-package on non-Linux platforms
(unless (package-installed-p 'use-package)
   (package-install 'use-package))

(require 'use-package)
(setq use-package-always-ensure t)

(column-number-mode)
(global-display-line-numbers-mode t)
;; Disable line numbers for some modes
(dolist (mode '(org-mode-hook
                term-mode-hook
                eshell-mode-hook))
  (add-hook mode (lambda () (display-line-numbers-mode 0))))

(use-package ivy
  :diminish
  :bind (("C-s" . swiper)
         :map ivy-minibuffer-map
         ("TAB" . ivy-alt-done)
         ("C-l" . ivy-alt-done)
         ("C-j" . ivy-next-line)
         ("C-k" . ivy-previous-line)
         :map ivy-switch-buffer-map
         ("C-k" . ivy-previous-line)
         ("C-l" . ivy-done)
         ("C-d" . ivy-switch-buffer-kill)
         :map ivy-reverse-i-search-map
         ("C-k" . ivy-previous-line)
         ("C-d" . ivy-reverse-i-search-kill))
  :config
  (ivy-mode 1))

;; Run the below command first
;; M-x all-the-icons-install-fonts
(use-package all-the-icons)

(use-package doom-modeline
  :ensure t
  :init (doom-modeline-mode 1)
  :custom ((doom-modeline-height 15)))

(use-package doom-themes
  :init (load-theme 'doom-dracula t))

(use-package rainbow-delimiters
  :hook (prog-mode . rainbow-delimiters-mode))


(use-package which-key
  :init (which-key-mode)
  :diminish which-key-mode
  :config
  (setq which-key-idle-delay 0.2))

(use-package ivy-rich
  :init
  (ivy-rich-mode 1))

(use-package counsel
  :bind (("M-x" . counsel-M-x)
	 ("C-x b" . counsel-ibuffer)
	 ("C-x C-f" . counsel-find-file)
	 :map minibuffer-local-map
	 ("C-r" . 'counsel-minibuffer-history)))

(use-package helpful
  :custom
  (counsel-describe-function-function #'helpful-callable)
  (counsel-describe-variable-function #'helpful-variable)
  :bind
  ([remap describe-function] . counsel-describe-function)
  ([remap describe-command] . helpful-command)
  ([remap describe-variable] . counsel-describe-variable)
  ([remap describe-key] . helpful-key))

I've done M-x eval buffer multiple times but dont see any changes.

Add undo-fu for evil mode

I may be wrong, but according to evil mode's instructions, an undo package should be installed to correctly simulate vim's undo (undo-fu, undo-tree, or emacs 28's undo-redo). Just a (use-package undo-fu) and (setq evil-undo-system 'undo-fu) should be enough I think.

exwm show icon of program open in polybar for each workspace

I want to modify following function such that polybar shows icon of program opened (active) in each workspace for all workspaces.
https://github.com/daviwil/emacs-from-scratch/blob/master/show-notes/Emacs-Desktop-05.org#adding-a-workspace-indicator-to-the-panel

for eg suppose I have following programs active in 4 workspace,
0 : firefox
1: emacs
2: discord
3: terminal
and "0" is active workspace.

So polybar show "0 firfox icon 1 emacsicon 2 discordicon 3 terminalicon"

If icon is not possible, may be plain text based on class of the program should be possible.

For above, I require elisp variable which contains information of currently active program name for each workspace. Can someone help with that.

ivy-mode not enabled on startup

Hi there,

Thanks for this great series. When I start emacs with your init.el based on episode #1, ivy-mode does not get toggled automatically. I need to toggle ivy-mode through M-x before its enabled.

Shouldn't it be enabled by default on startup or am I doing something wrong? I have used the init.el from your repo so I shouldn't have any differences on my side and I'm running emacs 27.1.

Update Cantarell install instruction in Emacs.org

In the Emacs.org in this repo, you say

I am using the Fira Code and Cantarell fonts for this configuration which will more than likely need to be installed on your machine.

But when I run pacman -R cantarell-fonts on my system, I get

error: failed to prepare transaction (could not satisfy dependencies) :: removing cantarell-fonts breaks dependency 'cantarell-fonts' required by gsettings-desktop-schemas :: removing cantarell-fonts breaks dependency 'cantarell-fonts' required by gtk3

Meaning that pretty much everyone will have the Cantarell fonts as everyone will probably have gtk3 installed on their system.

use-package

In you first video use-package does not work because according to:
https://github.com/jwiegley/use-package

;; This is only needed once, near the top of the file
(eval-when-compile
  ;; Following line is not needed if use-package.el is in ~/.emacs.d
  (add-to-list 'load-path "<path where use-package is installed>")
  (require 'use-package))

(use-package foo)

Otherwise gives an estrange error about bind-key feature missing in a compiled bind-key.elc

(use-package foo)

Calling function within :config does not affect the font setup at startup

When calling the function

(defun efs/org-font-setup ()
within the :config-realm
(efs/org-font-setup))
it didn't affect the fonts when opening a (new) org-file. When evaluating
(use-package org
after startup, font behaviour changed as intended.

Adding it as a hook works:

(use-package org
  :hook (org-mode .efs/org-mode-setup)
  :config
  (setq org-ellipsis "")
  (add-hook 'org-mode-hook (lambda () ( efs/org-mode-setup)))) 

Python Lisp mode emacs

from Emacs IDE - Python Development Configuration youtube video
when i try to use revert-buffer or simply open .py file, it gives error like "File mode specification error: (error lisp nesting exceeds 'max-lisp-eval-depth')"

Error Installing doom-modeline with first init.el

Hi Davi,

Thanks for making these videos. Wanting to jump into emac for a some time now but couldn't find a friendly hand to help. I just finished watch your first video and took the init.el file and copy and paste into my init.el. Ran M-x eval-buffer and getting the following

I decided to copy and paste your file since I get the same error with mine.

Error (use-package): Failed to install doom-modeline: https://melpa.org/packages/all-the-icons-20210425.1035.tar: Not found
Error (use-package): doom-modeline/:init: Symbol’s function definition is void: doom-modeline-mode
Error (use-package): Cannot load doom-modeline

improve "Tweaking the garbage collector"

This is about this section of your great docu.
https://github.com/daviwil/emacs-from-scratch/blob/master/show-notes/Emacs-Scratch-12.org#tweaking-the-garbage-collector

The default value currently is 800000. Now one knows if and when this would be modified.
Wouldn't it be better to read and remember/backup the default value on the top of the init.el file and store it back at the end.

Sound simple but not for a beginner. I have no idea how to do this in Lisp.

Symbol’s function definition is void #dired #evil-collection

(use-package dired
  :ensure nil
  :commands (dired dired-jump)
  :bind (("C-x C-j" . dired-jump))
  :custom ((dired-listing-switches "-agho --group-directories-first"))
  :config
  (evil-collection-define-key 'normal 'dired-mode-map
    "h" 'dired-single-up-directory
    "l" 'dired-single-buffer))

Started emacs with config above:

Error (use-package): dired/:config: Symbol’s function definition is void: evil-collection-define-key

But it worked using C-x C-e

email problems with microsoft exchange

I am attempting to follow the mbsync/mu4e series but I find myself running into an error. From my internet searching, it seems this might be related to the Microsoft exchange server not playing nice with mbsync(I am giving my college email the old try). Maybe I have to use offlineimap instead of mbsync? Trying to learn my lesson from my last issue, which is to keep to the KISS method. With that being said, I have copied every step up to the ~/.mbsyncrc template from the video notes of the first email video to my own machine. I know I have the host and user portions correct. I have tried to put in the password as plain text (Pass xxxx) to ensure I am not causing an encryption problem. The CertificateFile location is correct. The rest of the template has been modified accordingly, so I don't think this section is where my problem lies. Like before I will come back to this and see is I can get it to work in the future.

IMAPAccount xxx
Host outlook.office365.com
User [email protected]
Pass xxxxxxxxx
SSLType IMAPS
CertificateFile /etc/ssl/certs/ca-certificates.crt

IMAPStore xxx-remote
Account xxx

MaildirStore xxx-local
Subfolders Verbatim
Path ~/Mail/Xxx
Inbox ~/Mail/Xxx/Inbox

Channel xxx
Master :xxx-remote:
Slave :xxx-local:
Patterns *
Create Both
SyncState *

This is my error:

~ $ mbsync -a
C: 0/1 B: 0/0 M: +0/0 *0/0 #0/0 S: +0/0 *0/0 #0/0
IMAP command 'AUTHENTICATE PLAIN ' returned an error: NO AUTHENTICATE failed.
C: 1/1 B: 0/0 M: +0/0 *0/0 #0/0 S: +0/0 *0/0 #0/0

server-after-make-frame-hook called on every frame

I noticed the comment in Emacs-Tips-08.org about server-after-make-frame-hook only being called once when using the daemon, but I have not found this to be the case. I tested with Emacs 27.1, and best I can tell it is called on every new frame, just like after-make-frame-functions (but with minor difference that it does not accept frame as an argument).

Use chemacs to separate emacs profile

You can use chemacs package to complelely seperate runmacs config folder from yr default emacs.d folder. That way it wont show any packages installed for default config in the runmacs.

I actually use separate exwm profile with only exwm config using chemacs.

Org-mode: SHIFT-TAB not working in Windows-SSH-shell or Debian-tty (sometimes "M-[ ~ is undefined")

Introduction

I am still building my init.el based on your great emacs from scratch videos. Now in org-mode I experience some wired behavior of the SHIFT-TAB key when (un)folding headings in an .org file.

Problem

In some cases SHIFT-TAB creates a M-[ ~ is undefined message or simply does not work without an error message.

System

Debian 11

GNU Emacs 27.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.24, cairo version 1.16.0)
 of 2021-03-28, modified by Debian
Copyright (C) 2020 Free Software Foundation, Inc.

Minimal init.el

This can be used for reproduction.

;; === Package setup ===
(require 'package)
(setq package-archives '(("melpa" . "https://melpa.org/packages/")
			 ("org" . "https://orgmode.org/elpa/")
			 ("elpa" . "https://elpa.gnu.org/packages/")))
(package-initialize)

;; === use-package ==
;; use-package to simplify the config file
(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(require 'use-package)
(setq use-package-always-ensure 't)

(use-package org)

Description of the behavior in multiple cases

Windows SSH-terminal

Form a Windows 10 client and its usual command prompt (not PowerShell, not Terminal.app) I log into my machine via SSH and (of course) use emacs in none-gui mode then. TAB works. But SHIFT-TAB produce the M-[ ~ is undefined error.

A tty terminal (Debian 11)

Here TAB works. But S-TAB does not. The latter does not produce any error message. There is simply no reaction on that button.

Cases in where it is NOT reproducable

  • Gui mode in XFCE session on Debian 11
  • Terminal emulator (terminator) in a XFCE session on Debian 11
  • SSH terminal from Debian 11

Sidenotes

There is a stackoverflow QA for this: https://stackoverflow.com/q/3518846
The solution there does not work for me (Emacs from Debian 11).

This problem is totally out of my scope of understanding. But I am sure you are the one who are able to describe this in a way that even a novice can understand it.

Recommendation: Remap CapsLock Key on Windows: Alternative

I just wanted to share this set of tools by Microsoft called PowerToys. It has a utility especifically for remapping keys aswell as shurtcuts. It's pretty neat since one can easily undo this changes. Hope someone finds this useful.

I leave the link to its github page here

Customize mu4e signature

Hi @daviwil
I just dig into your mu4e configuration videos and I am wondering if you know how we could manage to apply org-mime-htmlize command to the signature ? I would love to insert HTML signatures automatically but these are excluded from conversion. I tried the following attempts:

  • Define my signature using html tags -> KO
  • Define my signature using org tags -> KO
  • Define my signature using org tags and remove the two dashes -> OK
  • Customize (org-mime-mail-signature-separator "") and use org tags -> OK but still have a ugly -- before my signature
  • Customize (message-signature-separator " ") : KO

I found that the -- insertion is hard coded in message.el file...
Any ideas ? Maybe use a hook to remove the double dashes or whatever

[Question] Polybar on dual monitor?

I'm new to EXWM (Noob!) and really enjoyed your Emacs and EXWM series and still learning. I managed to configure most part of polybar but stuck in creating separate panel for each multiple monitors. It would be really helpful, if you assist me with this problem. Thank you!

local-set-key doesn't work anymore?

I use golang so i have some keybinding that i'm really used to. At the same time, I really like what you have here, this gives me a chance to understand how init.el works. But after applying what you have, I realized some of the most important keybinding in golang doesn't work for me anymore.

Even though I put this block back in the init.el, when I type "M-.", I still get "previous command was not evil-repeat: evil-forward-char"

How come the local-set-key doesn't take effect?

(defun my-go-mode-hook ()
; Call Gofmt before saving
(add-hook 'before-save-hook 'gofmt-before-save)
; Godef jump key binding
(local-set-key (kbd "M-.") 'godef-jump)
(local-set-key (kbd "M-*") 'pop-tag-mark)
)
(add-hook 'go-mode-hook 'my-go-mode-hook)

all-the-icons

Might want to install all-the-icons package. Think you have the fonts available from your main installation but they might not be installed one new users machines.

Something like this should work:

(use-package all-the-icons
  :if (display-graphic-p)
  :commands all-the-icons-install-fonts
  :init
  (unless (find-font (font-spec :name "all-the-icons"))
    (all-the-icons-install-fonts t)))

(use-package all-the-icons-dired
  :if (display-graphic-p)
  :hook (dired-mode . all-the-icons-dired-mode))

Org tangle needs to be automatic for more than just emacs configuration

I like this configuration. However, (and this is just a personal opinion) I think there should be some way of telling Emacs which org file to tangle automagically without it having to have to be inside the ~/.emacs.d directory.

My reasoning behind this is that I sometimes write literate programs and need this feature and think it's nifty to have when needed. Maybe having a keyword like a file category that tells emacs to tangle the file automagically. For example:

#+TITLE: Some title
#+Category: tangle

fixed-pitch fonts don't scale in org mode

Following the Emacs From Scratch series, when reaching video 5 on org mode.

Using the following code:
` (set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch)
(set-face-attribute 'org-code nil :inherit '(shadow fixed-pitch))
(set-face-attribute 'org-table nil :inherit '(shadow fixed-pitch))
(set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch))
(set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch))
(set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch))
(set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch)

`

And using the hydra keybinding set in earlier videos, the "toggles" "scale text".
The zoom only affect the variable pitch fonts, the fixed pitch stays the same.

by commenting the above snippet I made the whole text scale together, but there are no fixed-pitch font anymore, which is not what I want.

Any Ideas on how to solve this?

you can see the whole config here

eros-mode

Great elisp tuto...
But, why you do not use "M-x eros-mode" to evaluate your code examples?
It is so practical.
You just need to activate it in the scratch or org buffer where you have your code and instead of going to the end of a sexp expression and hitting "C-x C-e", you can place the point anywhere inside the sexp and hit "C-M x" and you have a beautiful evaluation just after the expression. Like so:

(* 3 4) => 12

et. al.

And you do NOT need to call "ielm"

Also, try to make your fonts presentation with bigger fonts, since lots of people only have access to YT videos through cellphones these days...

Thx, for the Elisp series, anyways

"No such file or directory" "org-tempo"

I did following:
(1) cloned repo - renamed to .emacs.d/
(2) Loaded missing fonts : cantarell and fonts-firacode

then I ran into this - I am not sure how to fix it:

Debugger entered--Lisp error: (file-missing "Cannot open load file" "No such file or directory" "org-tempo")
require(org-tempo)
eval-buffer(#<buffer load> nil "/home/user1/.emacs.d/init.el" nil t) ; Reading at buffer position 12352
load-with-code-conversion("/home/user1/.emacs.d/init.el" "/home/user1/.emacs.d/init.el" t t)
load("/home/user1/.emacs.d/init" t t)
#f(compiled-function () #<bytecode 0x1e0f4d>)()
command-line()
normal-top-level()

Unable to customize the org face

I got a problem when I try to customize the face for org-mode. It worked for the first time, but when I did eval-buffer again. It threw an error (error: Invalid face, org-level-1). And now I cannot find any face related to org in describe-face. I did some research but still have no idea how to fix it. I hope you can help me with this.

bind: takes a list

Hello David, somebody reviewed my init.el which comes from your emacs-from-scratch. He told me that there are missing parenthesis in the :bind section of use-package.

This is your/my current version.


  :bind
  ([remap describe-function] . counsel-describe-function)
  ([remap describe-command] . helpful-command)
  ([remap describe-variable] . counsel-describe-variable)
  ([remap describe-key] . helpful-key))

But it should be

  :bind
  ( ([remap describe-function] . counsel-describe-function)
  ([remap describe-command] . helpful-command)
  ([remap describe-variable] . counsel-describe-variable)
  ([remap describe-key] . helpful-key)) )

Agree or disagree? What would you say? I have no idea! ;)
My emacs start without any error messages about missing parenthesis.

Extension of orgroam videos: Tags

Dear David,

I love your orgroam videos. As you said yourself you are not well experienced with orgroam or the Zettelkasten method. That makes the videos very valuable because you describe it from the viewpoint of a novice user. Even the ZK method itself is very good and short described by you. I often link to that.

I really would like to have your opinion and experience with some orgroam-specific features related to a Zettelkasten-workflow. This would be great for a new video.

One of the most confusing and less documented things are the types of tags. There are filetags, project, ROAM_TAGs, no matter what else and mixed up with org tag system also.

I will assemble two questions here that could inspire a new video to the orgroam series.

  1. What are the consequences of that tags respecting to other features (searching, filter, org-ui, ...)?
  2. Which tags should be use for the ZK method?

dbus-launch might cause problems

Just posting this here incase anyone bumps into it, but if you're wanting things like desktop notifications you need to remove the dbus-launch call as it doesn't seem to pass forward the variable on systemd distros (at least for me, YMMV)

Linux zenith 5.9.14-arch1-1 #1 SMP PREEMPT Sat, 12 Dec 2020 14:37:12 +0000 x86_64 GNU/Linux

Counsel - Bindings (Not helpful)

I noticed currently we have our counsel and helpful bindings set in a particular way. I'm wondering if it would be meaningful to move the remap for describe-function and describe-variable out of the helpful package definition and into counsel.
FROM

(use-package counsel
  :bind (("C-M-j" . 'counsel-switch-buffer)
         :map minibuffer-local-map
         ("C-r" . 'counsel-minibuffer-history))
  :custom
  (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
  :config
  (counsel-mode 1))

(use-package helpful
  :custom
  (counsel-describe-function-function #'helpful-callable)
  (counsel-describe-variable-function #'helpful-variable)
  :bind
  ([remap describe-function] . counsel-describe-function)
  ([remap describe-command] . helpful-command)
  ([remap describe-variable] . counsel-describe-variable)
  ([remap describe-key] . helpful-key))

TO

(use-package counsel
  :bind (("C-M-j" . 'counsel-switch-buffer)
         ([remap describe-function] . counsel-describe-function)
         ([remap describe-variable] . counsel-describe-variable)
         :map minibuffer-local-map
         ("C-r" . 'counsel-minibuffer-history))
  :custom
  (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
  :config
  (counsel-mode 1))

(use-package helpful
  :custom
  (counsel-describe-function-function #'helpful-callable)
  (counsel-describe-variable-function #'helpful-variable)
  :bind
  ([remap describe-command] . helpful-command)
  ([remap describe-key] . helpful-key))

Just a thought. Since we don't need helpful in order to have the counsel bindings still be meaningful.

Evil Magit no longer mainained

On the evil-magit repository page, it says

NOTE [2019-11-24]: This repository is no longer maintained. This package is now a part of evil-collection.

So you can remove evil-magit from the Emacs config

Using GUIX on a VM and using SSH + X11 + EXWM

First off, your videos have been immensely helpful. Thank you for taking the time to stream and publish your knowledge.

The subject of this message pretty much says it all. I have a server in my basement that I use for spinning up different VMs and I would be very interested in building a VM as described. I have done some cursory research across the internet, but the main challenge is documentation for this specific setup using GUIX.

I was hoping that you may have some personal experience with something similar and might be able to lend some advice.

If not, completely understandable and I'll count myself fortunate to have even found your videos.

Again, thank you for your hugely valuable contribution and keep up the great work!

Video request: Emacs EIN package

It would be awesome if you could cover the EIN emacs package for editting jupyter notebooks with Emacs, https://github.com/millejoh/emacs-ipython-notebook, in your video series!

The video they have on the main README page demonstrates a more advanced usage of the package when integrating with AWS, but as a beginner user of Emacs, most of it goes over my head. I'd get so much value from a more in depth tutorial, similar to how your usual videos go.

-- OR an alternative method for editing Jupyter notebooks using emacs would be equally awesome.

EXWM freezing when initially opening up an application

I'll preface by saying I don't actually use your configuration; this might seem like a useless issue then, but I've attempted using yours to the same results.

When initially opening an external X program (let's say Nyxt browser, or Spotify, or Alacritty,) Emacs entirely freezes. This usually lasts about ten to fifteen seconds. I cannot switch workspaces, use any keys (such as M-x or C-x), and interact with buffers. The contents of buffers do still update however, and music still plays.

I had previously been using async-run-command (or a similar name), but have also tried helm-exwm (helm-run-external-command), dmenu (the Emacs one,) and finally your run-in-background command. All result in this freezing.

If this is just the nature of the single-threaded-ness of Emacs, I'm completely fine with it, the productivity gain and keybindings are worth the wait. If it isn't, and something wrong with my configuration, then I'd love to fix it and have this issue/documented for future people who might have the issue.

Thank you in advance! I haven't been able to create a "minimal reproducible example" since it happens even with EXWM and no configuration (which leads me to believe it is just an EXWM thing.) I'd just like to hear if other people experience this as well!

System/Display depended themeing and font config

Dear David,
thanks a lot for your valuable work. What makes your Emacs content special is your way to explain things for absolute novices and professionell at the same time. I have not found that anywhere.

I am still at your Nr.6 video "Organizing Your Life with Org Mode" and also poked into some others. Maybe there still is a video taking my topic into account?

There are some technical detailed questions in my mind but backing them together would be a nice topic for a new video. I think you still discussed some aspects of it in some videos but not all together. The topic could be described as How to configure Emacs appearance independent from the used display and terminal/gui mode.

I use Emacs (I mean sharing the same init.el) on different "systems" and "displays" - sometimes direct/local, sometimes via remote desktop (XRDP) and SSH etc. It is very colorful. In that cases I often have problems with font size, screen resolution and DPI.

  • direct: Debian 11, with 1920x1200 24-inch monitor
  • via SSH: Lenovo ThinkPad Laptop with a 1920x1080 inbuild 14-inch display
  • via XRDP ("use client resolution"): The same ThinkPad
  • via SSH: The ThinkPad but connected to a ThinkVision 27-inch display with 2560x1440 resolution
  • via XRDP ("use client resolution"): The ThinkPad connected to the ThinkVision monitor

Btw: Via SSH and XRDP most of the time the Emacs runs on a headless RapsberryPi 4 with Debian 11 and XFCE. Sometimes I also connect to the first machine (1920-1200 24-inch monitor) via XRDP or SSH from the ThinkPad Laptop.

So you see my problems? ;) I even do not fully understand the interplay between resolution and DPI. And what does Emacs know about my "display" and about the "terminal" or "X" currently using.

Technical questions in detail

  • How to find out the relevant display informations in Emacs?
  • How to find out if I am on terminal or gui mode?
  • How to find out if I am via SSH, tty or terminal-emulation in X?
  • How to configure fonts (face, size, other parameters) depending on that informations?
  • How to use different themes depending on SSH, tty, term-emu or GUI mode?
  • And if there are mode-specific font/theme settings (like you used in your org-mode video): How to take that into account?

invalid face: org-level-1

(dolist (face '((org-level-1 . 1.2)
                (org-level-2 . 1.1)
                (org-level-3 . 1.05)
                (org-level-4 . 1.0)
                (org-level-5 . 1.1)
                (org-level-6 . 1.1)
                (org-level-7 . 1.1)
                (org-level-8 . 1.1)))
  (set-face-attribute (car face) nil :font "Cantarell" :weight 'regular :height (cdr face)))

when I evaluate this code, emacs doesn't complain but when I load a new instance of emacs it gives me an error of: error: Invalid face, org-level-1.

emacs version : 27.1, org version: 9.3

Automatically run org-mime-htmlize a different way

Hey David,

an idea came to my mind watching your video on mu4e with org-mode. Wouldn't it be possible to write a hook that asks for you confirmation before running 'org-mime-htmlize'? Kind of a mixture of the two options you presented at the end.
So mu4e would prompt you for "Do you want to run 'org-mime-htmlize' before sending (y/n)"?

I'm sure that is possible possible somehow, i'm just not that well versed in elisp yet to know how to do that. So it would be a learning chance for me as well if someone could show me a solution to that it would be greatly appreciated!

By the way: Thanks a lot for your videos on emacs! Very much enjoyed watching and learning and they really help alot!
Keep it up!

Polybar systray icons

I don't know if you mentioned this on stream, but how did you change the icons for the polybar systray?

Talking about icons for blueman-applet, nm-applet, etc.

Thanks in advance.

the function ‘auth-source-search’ is not known to be defined.

Hi,

This is my first issue, so I hope I'm providing enough information. I am trying to follow the instructions on your (excellent) video on Emacs's auth-source library, but I'm having trouble with auth-source-search. When I try to evaluate (auth-source-search :host "smtp.gmail.com") - which should return results, since my .authinfo.gpg contains two entries with that hostname - I receive a nil return, and prior to evaluating I get the following message in my echo buffer:

the function ‘auth-source-search’ is not known to be defined.

This is strange to me, since I can call up documentation and navigate to its definition in auth-source.el. Any ideas what's going on?

Emacs 27.1 on Linux 5.10.2-2-MANJARO

Config without evil

Hi, thanks for your config and your nice tutorialas. What would be needed to use this configuration without evil mode?

emms mpv/ipc error

As a long time emms user on portacle, I find myself running into a unique problem. My machine now runs Ubuntu fresh out of the box as well as a build of the desktop environment described in this video series. After loading an up to date version of emms, music files load perfectly well into an emms playlist buffer. However, in playing any one of these files, the minibuffer returns something like "mpv not working: ipc error". I know that we make a call to dbus prior to running emacs in start-exwm.sh, and that there was mention of its use in ipc communications. Is there some hack to correct for what seems to be a communication error? Looking through the internet, I also found this https://lists.gnu.org/archive/html/emms-help/2018-06/msg00000.html talking about the same error.

Ill admit, I am a (emacs) coder by hobby, and a long time user of org/ledger/emms. Hopefully the answer isn't right in front of my face and I am simply missing it. Thanks for any advice!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.