From 72bfb7fe88a7880def59bf743fd8ef3492b7b465 Mon Sep 17 00:00:00 2001 From: ndwarshuis Date: Sat, 17 Oct 2020 20:14:43 -0400 Subject: [PATCH] ENH goodbye helm, maybe we will meet again someday :'( --- etc/conf.org | 233 ++++++++++++++++----------------------------------- 1 file changed, 70 insertions(+), 163 deletions(-) diff --git a/etc/conf.org b/etc/conf.org index 6911cef..ba34ea5 100644 --- a/etc/conf.org +++ b/etc/conf.org @@ -529,41 +529,16 @@ This is an elegant window selector. It displays a number in the corner when acti :box nil)))))) #+END_SRC ** navigation -*** helm +*** ivy :PROPERTIES: -:ID: 919f08f5-dd1a-45c6-b791-2beb8d14747c +:CREATED: [2020-10-17 Sat 18:13] +:ID: 54e8e317-7696-4c67-a4bc-ebd920017e77 :END: -One of the best packages for emacs. Helm is basically a search and completion engine (other exanples being =ido-mode= and =ivy-mode=) which is mainly used for finding files and selecting commands (which are obviously used often). It also integrates well with many other modes such as =evil-mode= and =org-mode=. -#+BEGIN_SRC emacs-lisp -(use-package helm +#+begin_src emacs-lisp +(use-package ivy :straight t - :delight - :init - (helm-mode 1) - :config - (setq helm-autoresize-max-height 40 - helm-M-x-fuzzy-match nil - helm-buffers-fuzzy-matching nil - helm-recentf-fuzzy-match nil - helm-semantic-fuzzy-match nil - helm-imenu-fuzzy-match nil - helm-scroll-amount 8) - (add-to-list 'display-buffer-alist - `(,(rx bos "*helm" (* not-newline) "*" eos) - (display-buffer-in-side-window) - (inhibit-same-window . t) - (window-height . 0.4))) - (helm-autoresize-mode 1) - (require 'helm-config)) -#+END_SRC -*** helm-swoop -:PROPERTIES: -:ID: e94756f2-8d24-426d-a77c-83ed76bedf42 -:END: -#+BEGIN_SRC emacs-lisp -(use-package helm-swoop - :straight t) -#+END_SRC + :delight) +#+end_src *** avy :PROPERTIES: :ID: 516f0610-4766-4711-a697-aaff0107a94b @@ -699,15 +674,12 @@ Alot of languages at least semi-adhere to the 80-characters-per-line rule. =fci- :PROPERTIES: :ID: d2ea7a4e-e955-4f55-9e73-e71c8a167592 :END: -I use the built-in =flyspell-mode= to handle spellchecking. Obviously I am going to use =helm= when I spellcheck something. +Use the built-in =flyspell-mode= to handle spellchecking with favorite completion engine. #+BEGIN_SRC emacs-lisp -;; (use-package flyspell-correct-helm -;; :straight flyspell-correct -;; :after (helm flyspell)) - -(use-package helm-flyspell +(use-package flyspell-correct-ivy :straight t - :after (helm flyspell)) + :config + (setq flyspell-correct-interface #'flyspell-correct-ivy)) #+END_SRC This will spell-check comments in programming languages. @@ -720,11 +692,6 @@ Since flyspell mode is enabled in so many buffers, use a short modeline alias. #+BEGIN_SRC emacs-lisp (delight 'flyspell-mode "σ" "flyspell") #+END_SRC - -Additionally, I want to automatically highlight errors whenever =flyspell-mode= is enabled. -#+BEGIN_SRC emacs-lisp -;; (add-hook 'flyspell-mode-hook 'flyspell-buffer) -#+END_SRC *** syntax checking :PROPERTIES: :ID: efbac4ba-e2d4-498a-bd20-ad330aa2b8e8 @@ -1244,7 +1211,7 @@ I like having my lines short and readable (also easier to git). Turn on autofill :PROPERTIES: :ID: 13b5981b-4f22-4565-97a7-933570009797 :END: -Together, =org-ref= and =helm-bibtex= provide a nice pipeline to search a BibTex database and insert citations. +Together, =org-ref= and =ivy-bibtex= (also includes =ivy-bibtex=) provide a nice pipeline to search a BibTex database and insert citations. #+BEGIN_SRC emacs-lisp (use-package org-ref :straight t @@ -1254,9 +1221,9 @@ Together, =org-ref= and =helm-bibtex= provide a nice pipeline to search a BibTex org-ref-bibliography-notes (expand-file-name "~/BibTeX/notes.org") org-ref-default-bibliography (expand-file-name "~/BibTeX/master.bib"))) -(use-package helm-bibtex +(use-package ivy-bibtex :straight t - :after helm + :after ivy :config (setq bibtex-completion-bibliography (expand-file-name "~/BibTeX/master.bib") bibtex-completion-library-path (expand-file-name "~/BibTeX/pdf") @@ -1578,20 +1545,6 @@ Since I use org mode as my config file, makes sense to have a table of contents (set-face-attribute 'org-column nil :background "#1e2023") ;; org-columns-summary-types #+END_SRC -*** rifle -:PROPERTIES: -:ID: 97ff686e-05d8-4d32-9354-eaaf8691f940 -:END: -#+BEGIN_SRC emacs-lisp -(use-package helm-org-rifle - :straight t - :after (org helm)) - -(defun nd/helm-org-rifle-brain () - "Rifle files in `org-brain-path'." - (interactive) - (helm-org-rifle-directories (list org-brain-path))) -#+END_SRC ** calfw :PROPERTIES: :ID: 57d3105c-eab1-4784-ab27-cf63e6c56b05 @@ -2117,7 +2070,7 @@ In some capture templates I want to automatically store a link to the entry so I :PROPERTIES: :ID: 8316d4a9-1365-40a7-89ab-e4670c30303c :END: -Refile (like capture) should be fast, and I search all org file simultaneously using helm (setting =org-outline-path-complete-in-steps= to =nil= makes search happen for entire trees at once and not just the current level). Refiling is easiest to do from a block agenda view (see below) where headings can be moved in bulk. +Refile (like capture) should be fast, and I search all org file simultaneously using =ivy= (setting =org-outline-path-complete-in-steps= to =nil= makes search happen for entire trees at once and not just the current level). Refiling is easiest to do from a block agenda view (see below) where headings can be moved in bulk. #+BEGIN_SRC emacs-lisp (setq org-refile-targets '((nil :maxlevel . 9) ("~/Org/reference/idea.org" :maxlevel . 9) @@ -3401,11 +3354,21 @@ This really means "super awesome pomodoro implementation." =Tomato-mode= sounds :END: For some reason there is no default way to get a "print prompt." Instead one needs to either install some third-party helper or make a function like this. #+BEGIN_SRC emacs-lisp -(defun nd/helm-set-printer-name () - "Set the printer name using helm-completion to select printer." +(defun nd/find-printers () + "Return a list of available printers on Unix systems." + (when (executable-find "lpstat") + (with-temp-buffer + (call-process "lpstat" nil t nil "-a") + (->> (buffer-string) + (s-split "\n") + (-remove-item "") + (--map (car (s-split " " it))))))) + +(defun nd/ivy-set-printer-name () + "Set the printer name using ivy-completion to select printer." (interactive) - (let ((pl (or helm-ff-printer-list (helm-ff-find-printers)))) - (if pl (setq printer-name (helm-comp-read "Printer: " pl))))) + (let ((pl (nd/find-printers))) + (when pl (setq printer-name (ivy-read "Printer: " pl))))) #+END_SRC ** magit :PROPERTIES: @@ -3421,14 +3384,6 @@ For some reason there is no default way to get a "print prompt." Instead one nee git-commit-summary-max-length 50))) #+END_SRC ** dired -*** no confirm -:PROPERTIES: -:ID: 4639e71a-4fca-4e5f-b973-b720ca24605b -:END: -Keeping confirmation enabled does weird stuff with helm. Not ideal at the moment but we shall see if I find something better. -#+BEGIN_SRC emacs-lisp -(setq dired-no-confirm '(move copy)) -#+END_SRC *** compression :PROPERTIES: :ID: 2b3bb88b-c161-4cc0-a6c9-2674ad067cdb @@ -3935,8 +3890,8 @@ I like being evil. All package and custom bindings go here. #+BEGIN_SRC emacs-lisp (use-package evil :straight t - :init :after undo-tree + :init ;; this is required to make evil collection work (setq evil-want-integration t evil-want-keybinding nil @@ -4088,7 +4043,7 @@ Some of these commands just get in the way of being evil (which really means tha (evil-org-agenda-set-keys) ;; some of the defaults bug me... (evil-define-key 'motion org-agenda-mode-map - "C" #'org-x-agenda-helm-select-categories + ;;"C" #'org-x-agenda-helm-select-categories "D" #'org-agenda-day-view "W" #'org-agenda-week-view "M" #'org-agenda-month-view @@ -4168,7 +4123,7 @@ Most packages that don't have an evil version are in this one. Some don't behave :init (setq evil-collection-mode-list '(anaconda-mode arc-mode company comint custom debug edebug dired - doc-view ebib ediff elfeed flycheck helm help + doc-view ebib ediff elfeed flycheck ivy help minibuffer mu4e profiler term which-key)) (setq evil-collection-setup-minibuffer t) :config @@ -4200,57 +4155,42 @@ Only regular files are considered." file-list)))) (defun nd/dired-open-with () - "Open marked non-text files in external app via open-with dialog -according to mime types as listed in all available desktop files." + "Open marked files in external app. +If multiple apps are available (according to mime type), present +all options in a list to user." (interactive) - (let* ((mf (seq-filter #'file-regular-p (dired-get-marked-files))) - (qmf (mapcar #'shell-quote-argument mf)) - (file-mime-list (mapcar (lambda (f) (list f (nd/get-mime-type f))) qmf))) - - (if (= (length file-mime-list) 0) - (message "No files selected") - - (let* ((first-pair (car file-mime-list)) - (last-pairs (cdr file-mime-list)) - mime-alist file-list) - (setq file-list (nth 0 first-pair) - mime-alist (nd/get-apps-from-mime (nth 1 first-pair))) - ;; if multiple files selected, add to the selection list - (if last-pairs - (progn - (setq file-list (string-join (mapcar #'car file-mime-list) " ")) - (dolist (mime (mapcar (lambda (f) (nth 1 f)) last-pairs)) - (setq mime-alist (intersection mime-alist - (nd/get-apps-from-mime mime) - :test #'equal))))) - (if (= (length mime-alist) 0) - (let* ((ml (delete-dups (mapcan #'cdr file-mime-list))) - (mls (string-join ml ", "))) - (if (= (length ml) 1) - (message (concat "No apps found for mime type: " mls)) - (message (concat "No common apps found for mime types: " mls)))) - (helm - :sources (helm-build-sync-source "Apps" - :candidates mime-alist - :action '(("Open" . (lambda (f) (nd/execute-desktop-command f file-list))))) - :buffer "*helm open with*")))))) + (let* ((file-list (-filter #'file-regular-p (dired-get-marked-files))) + (app-list (->> (-map #'nd/get-mime-type file-list) + (-map #'nd/get-apps-from-mime) + (-reduce #'-intersection)))) + (cl-flet + ((exec + (cell) + (nd/execute-desktop-command (cdr cell) (s-join " " file-list)))) + (cond + ((and (= 1 (length file-list)) (= 0 (length app-list))) + (message "No apps found for file")) + ((= 0 (length app-list)) + (message "No common apps found for files")) + ((= 0 (length file-list)) + (message "No files selected")) + (t + (ivy-read "Open with" app-list :action #'exec)))))) (defun nd/dired-sort-by () - "Sort current dired buffer by a list of choices presented in helm menu. + "Sort current dired buffer by list of choices. Note this assumes there are no sorting switches on `dired-ls'" (interactive) - (let ((sort-alist '(("Name" . "") - ("Date" . "-t") - ("Size" . "-S") - ("Extension" . "-X") - ("Dirs First" . "--group-directories-first")))) - (helm - :sources - (helm-build-sync-source "Switches" - :candidates sort-alist - :action - '(("Sort" . (lambda (s) (dired-sort-other (concat dired-listing-switches " " s)))))) - :buffer "*helm sort buffer*"))) + (cl-flet + ((apply-switch + (cell) + (dired-sort-other (concat dired-listing-switches " " (cdr cell))))) + (let ((sort-alist '(("Name" . "") + ("Date" . "-t") + ("Size" . "-S") + ("Extension" . "-X") + ("Dirs First" . "--group-directories-first")))) + (ivy-read "Switches" sort-alist :action #'apply-switch)))) (put 'dired-find-alternate-file 'disabled nil) @@ -4320,16 +4260,6 @@ Not to be confused with =interactive-haskell-mode= which is part of the editing (kbd "[[") #'haskell-interactive-mode-prompt-previous (kbd "]]") #'haskell-interactive-mode-prompt-next) #+END_SRC -**** helm -:PROPERTIES: -:ID: dea59175-276f-40ff-8e0a-0f6e2a60ce30 -:END: -I like tab completion...regardless of what the helm zealots say. -#+BEGIN_SRC emacs-lisp -(evil-define-key '(normal insert) helm-map - (kbd "") 'helm-execute-persistent-action - (kbd "C-") 'helm-select-action) -#+END_SRC **** pdf-view :PROPERTIES: :ID: e2613015-2a9d-40c8-a9bc-5342ae90b5bf @@ -4452,25 +4382,6 @@ These are for mode-specific bindings that can/should be outside of the evil maps #+BEGIN_SRC emacs-lisp (define-key dired-mode-map (kbd "C-x g") 'magit) #+END_SRC -*** helm-prefix -:PROPERTIES: -:ID: fc0b586b-97cc-4fc0-8bcd-977c5de12545 -:END: -Some of these are useful enough that I make give them a direct binding without requiring a prefix. For now this is fine. -#+BEGIN_SRC emacs-lisp -(define-key helm-command-prefix (kbd "b") #'helm-bibtex) -(define-key helm-command-prefix (kbd "B") #'helm-bibtex-with-local-bibliography) -(define-key helm-command-prefix (kbd "s") #'helm-swoop) -(define-key helm-command-prefix (kbd "S") #'helm-surfraw) -(define-key helm-command-prefix (kbd "o") #'helm-org-rifle) -(define-key helm-command-prefix (kbd "") #'helm-resume) -#+END_SRC - -Give =f= to =nd/helm-flyspell-correct= instead of =helm-multi-files= and give the latter =F= (used much less). -#+BEGIN_SRC emacs-lisp -(define-key helm-command-prefix (kbd "f") 'helm-flyspell-correct) -(define-key helm-command-prefix (kbd "F") 'helm-multi-files) -#+END_SRC *** outline-magic :PROPERTIES: :ID: 2810a854-29d6-4f34-866e-767f9c64c3c1 @@ -4600,7 +4511,9 @@ The function keys are nice because they are almost (not always) free in every mo (global-set-key (kbd "") 'org-clock-goto) (global-set-key (kbd "C-") 'org-tomato-user-get-summary) (global-set-key (kbd "C-S-") 'org-tomato-user-pomodoro-goto) -(global-set-key (kbd "") 'helm-command-prefix) +(global-set-key (kbd " s") #'swiper-thing-at-point) +(global-set-key (kbd " o") #'counsel-org-goto-all) +(global-set-key (kbd " f") #'flyspell-correct-at-point) (defhydra hydra-multimedia (global-map "" :exit t) "convenient multimedia controls" @@ -4649,10 +4562,10 @@ The function keys are nice because they are almost (not always) free in every mo (global-set-key (kbd "C-x 3") 'nd/split-and-follow-vertically) (global-unset-key (kbd "C-x c")) (global-set-key (kbd "C-x k") 'nd/kill-current-buffer) -(global-set-key (kbd "C-x C-d") 'helm-bookmarks) +(global-set-key (kbd "C-x C-d") #'counsel-bookmarked-directory) (global-set-key (kbd "C-x C-c C-d") 'nd/find-devices) -(global-set-key (kbd "C-x C-f") 'helm-find-files) -(global-set-key (kbd "C-x C-b") 'helm-buffers-list) +(global-set-key (kbd "C-x C-f") #'counsel-find-file) +(global-set-key (kbd "C-x C-b") #'ivy-switch-buffer) (global-set-key (kbd "C-M-S-k") 'nd/close-all-buffers) (global-set-key (kbd "C-M-S-o") 'nd/org-close-all-buffers) @@ -4662,13 +4575,7 @@ The function keys are nice because they are almost (not always) free in every mo (global-set-key (kbd "M-b") 'nd/switch-to-previous-buffer) (global-set-key (kbd "M-I") 'imenu) (global-set-key (kbd "M-s") 'avy-goto-char) -(global-set-key (kbd "M-x") 'helm-M-x) - -;; (defhydra hydra-buffer (global-map "M-b" :exit t) -;; "buffer functions" -;; ("M-b" nd/switch-to-previous-buffer) -;; ("k" nd/kill-current-buffer) -;; ("l" helm-buffers-list)) +(global-set-key (kbd "M-x") 'counsel-M-x) (defhydra hydra-window (global-map "M-o") "window"