Permalink
Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.
Sign up| ;;; ivy-hydra.el --- Additional key bindings for Ivy -*- lexical-binding: t -*- | |
| ;; Copyright (C) 2015-2018 Free Software Foundation, Inc. | |
| ;; Author: Oleh Krehel <ohwoeowho@gmail.com> | |
| ;; URL: https://github.com/abo-abo/swiper | |
| ;; Version: 0.10.0 | |
| ;; Package-Requires: ((emacs "24.1") (ivy "0.9.0") (hydra "0.13.4")) | |
| ;; Keywords: convenience | |
| ;; This file is part of GNU Emacs. | |
| ;; This file is free software; you can redistribute it and/or modify | |
| ;; it under the terms of the GNU General Public License as published by | |
| ;; the Free Software Foundation; either version 3, or (at your option) | |
| ;; any later version. | |
| ;; This program is distributed in the hope that it will be useful, | |
| ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| ;; GNU General Public License for more details. | |
| ;; For a full copy of the GNU General Public License | |
| ;; see <http://www.gnu.org/licenses/>. | |
| ;;; Commentary: | |
| ;; This package provides the `hydra-ivy/body' command, which is a | |
| ;; quasi-prefix map, with many useful bindings. These bindings are | |
| ;; shorter than usual, using mostly unprefixed keys. | |
| ;;; Code: | |
| (require 'ivy) | |
| (require 'hydra) | |
| (defun ivy--matcher-desc () | |
| "Return description of `ivy--regex-function'." | |
| (let ((cell (assq ivy--regex-function ivy-preferred-re-builders))) | |
| (if cell | |
| (cdr cell) | |
| "other"))) | |
| (defhydra hydra-ivy (:hint nil | |
| :color pink) | |
| " | |
| ^ ^ ^ ^ ^ ^ | ^Call^ ^ ^ | ^Cancel^ | ^Options^ | Action _w_/_s_/_a_: %-14s(ivy-action-name) | |
| ^-^-^-^-^-^-+-^-^---------^-^--+-^-^------+-^-^-------+-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--------------------------- | |
| ^ ^ _k_ ^ ^ | _f_ollow occ_u_r | _i_nsert | _c_: calling %-5s(if ivy-calling \"on\" \"off\") _C_ase-fold: %-10`ivy-case-fold-search | |
| _h_ ^+^ _l_ | _d_one ^ ^ | _o_ops | _m_: matcher %-5s(ivy--matcher-desc)^^^^^^^^^^^^ _t_runcate: %-11`truncate-lines | |
| ^ ^ _j_ ^ ^ | _g_o ^ ^ | ^ ^ | _<_/_>_: shrink/grow^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _D_efinition of this menu | |
| " | |
| ;; arrows | |
| ("h" ivy-beginning-of-buffer) | |
| ("j" ivy-next-line) | |
| ("k" ivy-previous-line) | |
| ("l" ivy-end-of-buffer) | |
| ;; actions | |
| ("o" keyboard-escape-quit :exit t) | |
| ("C-g" keyboard-escape-quit :exit t) | |
| ("i" nil) | |
| ("C-o" nil) | |
| ("f" ivy-alt-done :exit nil) | |
| ("C-j" ivy-alt-done :exit nil) | |
| ("d" ivy-done :exit t) | |
| ("g" ivy-call) | |
| ("C-m" ivy-done :exit t) | |
| ("c" ivy-toggle-calling) | |
| ("m" ivy-rotate-preferred-builders) | |
| (">" ivy-minibuffer-grow) | |
| ("<" ivy-minibuffer-shrink) | |
| ("w" ivy-prev-action) | |
| ("s" ivy-next-action) | |
| ("a" ivy-read-action) | |
| ("t" (setq truncate-lines (not truncate-lines))) | |
| ("C" ivy-toggle-case-fold) | |
| ("u" ivy-occur :exit t) | |
| ("D" (ivy-exit-with-action | |
| (lambda (_) (find-function 'hydra-ivy/body))) | |
| :exit t)) | |
| (defvar ivy-dispatching-done-columns 2 | |
| "Number of columns to use if the hint does not fit on one line.") | |
| (defun ivy-dispatching-done-hydra () | |
| "Select one of the available actions and call `ivy-done'." | |
| (interactive) | |
| (let* ((actions (ivy-state-action ivy-last)) | |
| (estimated-len (+ 25 (length | |
| (mapconcat | |
| (lambda (x) (format "[%s] %s" (nth 0 x) (nth 2 x))) | |
| (cdr actions) ", ")))) | |
| (n-columns (if (> estimated-len (window-width)) | |
| ivy-dispatching-done-columns | |
| nil))) | |
| (if (null (ivy--actionp actions)) | |
| (ivy-done) | |
| (funcall | |
| (eval | |
| `(defhydra ivy-read-action (:color teal :columns ,n-columns) | |
| "action" | |
| ,@(mapcar (lambda (x) | |
| (list (nth 0 x) | |
| `(progn | |
| (ivy-set-action ',(nth 1 x)) | |
| (ivy-done)) | |
| (nth 2 x))) | |
| (cdr actions)) | |
| ("M-o" nil "back") | |
| ("C-g" nil))))))) | |
| (define-key ivy-minibuffer-map (kbd "M-o") 'ivy-dispatching-done-hydra) | |
| (provide 'ivy-hydra) | |
| ;;; ivy-hydra.el ends here |