Collection of bug-fixes and tweaks

Including:
  - Booting Spotify and Twitter
  - Booting icanhasshortcut for Hammerspoon
  - Fixes for helping to identify the line the cursor is on
This commit is contained in:
Howard Abrams 2026-06-05 16:06:12 -07:00
parent 7e06b04300
commit b6891017af
8 changed files with 43 additions and 150 deletions

View file

@ -19,7 +19,7 @@
"A WAV or AU file used at the completion of a function.") "A WAV or AU file used at the completion of a function.")
;; My replacement in case we can't play internal sounds: ;; My replacement in case we can't play internal sounds:
(defun beep-beep () (defun beep-beep (&rest _)
"Play a default notification sound file. "Play a default notification sound file.
Customize the variable, `beep-alert-sound-file' to adjust the sound." Customize the variable, `beep-alert-sound-file' to adjust the sound."
(if (fboundp 'play-sound-internal) (if (fboundp 'play-sound-internal)

View file

@ -33,7 +33,7 @@ start some music to indicate we are working, and set a timer.
Call `ha-focus-break' when finished." Call `ha-focus-break' when finished."
(interactive) (interactive)
(ha-focus-countdown-timer 25 'ha-focus-break) (ha-focus-countdown-timer 25 'ha-focus-break)
(ha-focus--command "tell application \"Spotify\" to play") (ha-focus--command "tell application \"VLC\" to play")
(if (eq major-mode 'org-mode) (if (eq major-mode 'org-mode)
(org-clock-in) (org-clock-in)
(org-clock-in-last)) (org-clock-in-last))
@ -47,7 +47,7 @@ This also starts another break timer, that calls
`ha-focus-break-over' when finished." `ha-focus-break-over' when finished."
(interactive) (interactive)
(run-with-idle-timer 30 nil 'ha-focus-capture) (run-with-idle-timer 30 nil 'ha-focus-capture)
(ha-focus--command "tell application \"Spotify\" to pause") (ha-focus--command "tell application \"VLC\" to pause")
(ha-focus-countdown-timer 5 'ha-focus-break-over) (ha-focus-countdown-timer 5 'ha-focus-break-over)
(message "🍅 Time to take a break.")) (message "🍅 Time to take a break."))

View file

@ -26,7 +26,7 @@ A literate programming file for helper apps in Emacs.
#+end_src #+end_src
* Introduction * Introduction
The following applications are not needed. I alternate between trying to /stay in Emacs/ taking advantage of the consistent interface, and using a stand-alone app on my Workday computer. The following applications are not needed. I alternate between trying to /stay in Emacs/ taking advantage of the consistent interface, and using a stand-alone app on my Workday computer.
* Federation * Social Media Apps
** Mastodon ** Mastodon
Glad to see the 2FA feature is working on the [[https://codeberg.org/martianh/mastodon.el][mastodon.el]] project, and even more glad to see the great birdland diaspora arrive in the land of the toots. Glad to see the 2FA feature is working on the [[https://codeberg.org/martianh/mastodon.el][mastodon.el]] project, and even more glad to see the great birdland diaspora arrive in the land of the toots.
#+begin_src emacs-lisp #+begin_src emacs-lisp
@ -143,19 +143,6 @@ Perhaps we can make it more attractive:
ement-room-timestamp-format "" ement-room-timestamp-format ""
ement-room-send-message-filter 'ement-room-send-org-filter)) ement-room-send-message-filter 'ement-room-send-org-filter))
#+end_src #+end_src
* Other
** Twitter
The venerable [[https://github.com/hayamiz/twittering-mode/tree/master][twittering-mode]] allows me to follow all the twits.
#+begin_src emacs-lisp :tangle no
(use-package twittering-mode
:init
(setq twittering-use-master-password t
epa-pinentry-mode 'loopback)
:config
(defalias 'epa--decode-coding-string 'decode-coding-string)
(ha-leader "a t" '("twitter" . twit)))
#+end_src
And we are no longer using this package.
** Telega ** Telega
I'm thinking the [[https://zevlg.github.io/telega.el/][Telega package]] would be better than Bitlbee for Telegram communication. I'm thinking the [[https://zevlg.github.io/telega.el/][Telega package]] would be better than Bitlbee for Telegram communication.

View file

@ -244,6 +244,7 @@ Im use [[https://github.com/deseven/icanhazshortcut][ICanHazShortcut]] to hav
#+begin_src sh :shebang "#!/bin/bash" :tangle ~/bin/emacs-capture-clock #+begin_src sh :shebang "#!/bin/bash" :tangle ~/bin/emacs-capture-clock
/usr/bin/osascript ~/bin/emacs-capture-clock.scr /usr/bin/osascript ~/bin/emacs-capture-clock.scr
#+end_src #+end_src
But the following Applescript does the work: But the following Applescript does the work:
#+begin_src applescript :sheband "#!/usr/bin/osascript" :tangle ~/bin/emacs-capture-clock.scr #+begin_src applescript :sheband "#!/usr/bin/osascript" :tangle ~/bin/emacs-capture-clock.scr
tell application "System Events" to set theApp to name of first application process whose frontmost is true tell application "System Events" to set theApp to name of first application process whose frontmost is true
@ -273,6 +274,7 @@ Now we have some goodies on the clipboard, and the script uses =emacsclient= to
(ignore-errors (ignore-errors
(delete-frame))) (delete-frame)))
#+end_src #+end_src
Oh, and it this is from the Terminal program, lets wrap it in a block: Oh, and it this is from the Terminal program, lets wrap it in a block:
#+begin_src emacs-lisp #+begin_src emacs-lisp
(defun ha-external-capture-code-to-org () (defun ha-external-capture-code-to-org ()
@ -288,136 +290,10 @@ Oh, and it this is from the Terminal program, lets wrap it in a block:
(ignore-errors (ignore-errors
(delete-frame))) (delete-frame)))
#+end_src #+end_src
#+begin_src conf :tangle ~/.config/iCanHazShortcut/config.ini
[main]
config version = 2
shell = /bin/bash -l
populate_menu_with_actions = yes
show_hotkeys_in_menu = yes
check_for_updates = yes
start_on_login = yes
show_icon_in_statusbar = yes
set_workdir_with_cd = no
window_x = -988
window_y = 172
window_width = 600
window_height = 361
shortcut_column_enabled = yes
action_column_enabled = yes
command_column_enabled = yes
workdir_column_enabled = no
shortcut_column_width = 80
action_column_width = 160
command_column_width = 173
workdir_column_width = 100
[shortcut1]
shortcut = ⇧⌃⌥⌘E
action = Personal Emacs
command = open -a Emacs
workdir =
enabled = yes
[shortcut2]
shortcut = ⇧⌃⌥E
action = Work Emacs
command = FOR_WORK=yes open -a Emacs-Work
workdir =
enabled = yes
[shortcut3]
shortcut = ⇧⌃⌥⌘X
action = Emacs Capture
command = ~/bin/emacs-capture
workdir =
enabled = yes
[shortcut4]
shortcut = ⇧⌃⌥X
action = Emacs Capture Clipboard
command = ~/bin/emacs-capture-clock
workdir =
enabled = yes
[shortcut5]
shortcut = ⇧⌃⌥T
action = iTerm
command = open -a iTerm
workdir =
enabled = yes
[shortcut6]
shortcut = ⇧⌃⌥S
action = Slack
command = open -a Slack
workdir =
enabled = yes
[shortcut7]
shortcut = ⇧⌃⌥W
action = Spotify
command = open -a Spotify
workdir =
enabled = yes
[shortcut8]
shortcut = ⇧⌃⌥F
action = Firefox
command = open -a Firefox
workdir =
enabled = yes
[shortcut9]
shortcut = ⇧⌃⌥C
action = Chome
command = ~/bin/chrome.scr
workdir =
enabled = yes
[shortcut10]
shortcut = ⇧⌃⌥Q
action = Keepass
command = open -a KeepassXC
workdir =
enabled = yes
[shortcut11]
shortcut = ⇧⌃⌥Z
action = Zoom
command = open -a zoom.us
workdir =
enabled = yes
[shortcut12]
shortcut = ⌃F1
action = Mute Zoom
command = ~/bin/zoom-muter
workdir =
enabled = yes
[shortcut13]
shortcut = ⇧⌃⌥⌘M
action = Capture Meeting
command = ~/bin/emacs-capture-meeting
workdir =
enabled = yes
[shortcut14]
shortcut = ⇧⌃⌥⌘B
action = Outlook
command = open -a "Microsoft Outlook"
workdir =
enabled = yes
[shortcut15]
shortcut = ⇧⌃⌥⌘D
action = Discord
command = open -a Discord
workdir =
enabled = yes
#+end_src
Configure the *ICanHazShortcut* shortcuts to call these scripts, as in this screenshot: Configure the *ICanHazShortcut* shortcuts to call these scripts, as in this screenshot:
[[file:screenshots/icanhazshortcuts.png]] [[file:screenshots/icanhazshortcuts.png]]
And here is the configuration file for that: And here is the configuration file for that:
#+begin_src conf :tangle ~/.config/iCanHazShortcut/config.ini :mkdirp yes #+begin_src conf :tangle ~/.config/iCanHazShortcut/config.ini :mkdirp yes
[main] [main]

View file

@ -1112,6 +1112,7 @@ And some shortcut keys from the =general= project:
"<tab> n" '("new space" . ha-tab-bar-new) "<tab> n" '("new space" . ha-tab-bar-new)
"<tab> u" '("update names" . ha-tab-bar-update-names) "<tab> u" '("update names" . ha-tab-bar-update-names)
"<tab> d" '("delete space" . ha-tab-bar-delete) "<tab> d" '("delete space" . ha-tab-bar-delete)
"<tab> t" '("toggle tab-bar" . tab-bar-mode)
"<tab> w" '("special space" . ha-switch-to-special) "<tab> w" '("special space" . ha-switch-to-special)
"<tab> `" '("recent" . tab-bar-switch-to-recent-tab)) "<tab> `" '("recent" . tab-bar-switch-to-recent-tab))

View file

@ -76,8 +76,7 @@ To make the active window /more noticeable/, we /dim/ the in-active windows with
As an interesting alternative, check out the [[https://www.emacs.dyerdwelling.family/emacs/20240208164549-emacs-selected-window-accent-mode-now-on-melpa/][selected-window-accent]] project. As an interesting alternative, check out the [[https://www.emacs.dyerdwelling.family/emacs/20240208164549-emacs-selected-window-accent-mode-now-on-melpa/][selected-window-accent]] project.
** Ultra Scroll ** Ultra Scroll
The [[https://github.com/jdtsmith/ultra-scroll][ultra-scroll]] project allows smoother scrolling of text and images. While this splits text at the top/bottom of buffer windows, we no longer work within a 80x24 text matrix. Large images would The [[https://github.com/jdtsmith/ultra-scroll][ultra-scroll]] project allows smoother scrolling of text and images. While this splits text at the top/bottom of buffer windows, we no longer work within a 80x24 text matrix. Large images would either be "there or not" which resulted large jumps and large distractions.
either be "there or not" which resulted large jumps and large distractions.
#+BEGIN_SRC emacs-lisp #+BEGIN_SRC emacs-lisp
(use-package ultra-scroll (use-package ultra-scroll
@ -89,16 +88,45 @@ either be "there or not" which resulted large jumps and large distractions.
(ultra-scroll-mode 1)) (ultra-scroll-mode 1))
#+END_SRC #+END_SRC
** Find the Bloody Cursor ** Find the Bloody Cursor
Large screen, lots of windows, so where is the cursor? While I used to use =hl-line+=, I found that the prolific [[https://protesilaos.com/][Protesilaos Stavrou]] [[https://protesilaos.com/codelog/2022-03-14-emacs-pulsar-demo/][introduced his Pulsar project]] is just what I need. Specifically, I might /loose the cursor/ and need to have it highlighted (using ~F8~), but also, this automatically highlights the cursor line with specific /actions/ , like changing windows. Large screen, lots of windows, so where is the cursor? While I used to use =hl-line+=, Sacha Chuas [[https://fediscience.org/@ericsfraga/116279043710841253][suggestion]] solves the problem of the built-in =hl-line= that /highlights paragraphs/ in Org with a single function:
#+BEGIN_SRC emacs-lisp
(defun get-visual-line-range ()
"Identify current visual line (for highlighting mostly)
Use the visual line functions to define the range in the buffer
that should be highlighted when ~hl-line-mode~ is enabled. By
default, the whole line in the file is highlighted. This is not
particularly useful in org files where I have whole paragraphs in a
single file line."
(let (b e)
(save-excursion
(beginning-of-visual-line)
(setq b (point))
(end-of-visual-line)
(setq e (point)))
(cons b e)))
(setq hl-line-range-function #'get-visual-line-range)
(global-hl-line-mode 1)
#+END_SRC
The real trick should /visually/ highlight the current line without being too light and interfering with seeing the text or being too obnoxious (see my [[file:ha-theme.org::*Dark Theme][Dark Theme]]).
I found that the prolific [[https://protesilaos.com/][Protesilaos Stavrou]] [[https://protesilaos.com/codelog/2022-03-14-emacs-pulsar-demo/][introduced his Pulsar project]] is just what I need. Specifically, I might /loose the cursor/ and need to have it highlighted (using ~F8~), but also, this automatically highlights the cursor line with specific /actions/ , like changing windows.
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package pulsar (use-package pulsar
:straight (:host github :repo "protesilaos/pulsar") :straight (:host github :repo "protesilaos/pulsar")
:after winum ace-window
:custom :custom
(pulsar-face 'pulsar-generic) (pulsar-face 'pulsar-generic)
(pulsar-delay 0.15) (pulsar-delay 0.15)
:config :config
(set-face-attribute 'pulsar-generic nil :background "orange")
(dolist (built-in-function '(recenter-top-bottom move-to-window-line-top-bottom reposition-window (dolist (built-in-function '(recenter-top-bottom move-to-window-line-top-bottom reposition-window
bookmark-jump other-window delete-window delete-other-windows bookmark-jump other-window delete-window delete-other-windows
forward-page backward-page scroll-up-command scroll-down-command forward-page backward-page scroll-up-command scroll-down-command

View file

@ -3,7 +3,7 @@
#+date: 2020-09-18 #+date: 2020-09-18
#+tags: emacs org #+tags: emacs org
#+startup: inlineimages #+startup: inlineimages
#+lastmod: [2025-12-02 Tue] #+lastmod: [2026-04-08 Wed]
A literate programming file for configuring org-mode and those files. A literate programming file for configuring org-mode and those files.
@ -1022,8 +1022,8 @@ Next, create a configuration file, =~/.config/proselint/config= file, to turn on
} }
#+end_src #+end_src
And tell [[https://www.flycheck.org/][flycheck]] to use this: And tell [[https://www.flycheck.org/][flycheck]] to use Proselint:
#+begin_src emacs-lisp #+begin_src emacs-lisp :tangle no
(use-package flycheck (use-package flycheck
:config :config
(add-to-list 'flycheck-checkers 'proselint) (add-to-list 'flycheck-checkers 'proselint)

View file

@ -325,6 +325,7 @@ Lets make a /theme/:
`(window-divider ((t :foreground "black"))) `(window-divider ((t :foreground "black")))
`(cursor ((t (:foreground ,gray-10 :background ,cursor)))) `(cursor ((t (:foreground ,gray-10 :background ,cursor))))
`(region ((t (:background ,region)))) `(region ((t (:background ,region))))
`(hl-line ((t (:background ,gray-20))))
`(mode-line ((t (:background ,active :foreground "white")))) `(mode-line ((t (:background ,active :foreground "white"))))
`(mode-line-active ((t (:background ,active)))) `(mode-line-active ((t (:background ,active))))