From 38f9904f6c98262b7ac43c7ebff501953ae403e1 Mon Sep 17 00:00:00 2001 From: Pierre Neidhardt Date: Mon, 6 Nov 2017 17:52:22 +0100 Subject: [PATCH] Add evil-emms --- evil-collection.el | 1 + evil-emms.el | 181 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 evil-emms.el diff --git a/evil-collection.el b/evil-collection.el index 4250841..b76537e 100644 --- a/evil-collection.el +++ b/evil-collection.el @@ -48,6 +48,7 @@ edebug elfeed elisps-refs + emms eshell flycheck ggtags diff --git a/evil-emms.el b/evil-emms.el new file mode 100644 index 0000000..0143383 --- /dev/null +++ b/evil-emms.el @@ -0,0 +1,181 @@ +;;; evil-emms.el --- Evil bindings for EMMS -*- lexical-binding: t -*- + +;; Copyright (C) 2017 Pierre Neidhardt + +;; Author: Pierre Neidhardt +;; Maintainer: James Nguyen , Pierre Neidhardt +;; URL: https://github.com/jojojames/evil-collection +;; Version: 0.0.1 +;; Package-Requires: ((emacs "25.1")) +;; Keywords: emacs, compile, evil +;; HomePage: https://github.com/jojojames/evil-collection + +;; 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 file 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 . + +;;; Commentary: + +;;; Code: + +(require 'evil) +(require 'emms) + +;;; TODO: Make all playback bindings consistent across modes: +;;; - stop +;;; - pause +;;; - volume +;;; - next/previous +;;; - fast-forward/backward + +;;; TODO: Add bindings to emms-browser-search-mode-map. + +;;; emms-browser does not run any mode hook. As such the default state is 'normal. +;;; TODO: Report upstream. +(defun evil-emms-browser () + (evil-motion-state)) + +(defun evil-emms-playlist-mode-insert-newline-above () + "Insert a newline above point." + (interactive) + (emms-with-inhibit-read-only-t + (evil-insert-newline-above))) + +(defun evil-emms-playlist-mode-insert-newline-below () + "Insert a newline below point." + (interactive) + (emms-with-inhibit-read-only-t + (evil-insert-newline-below))) + +(defun evil-emms-playlist-mode-paste-before () + "Pastes the latest yanked playlist items before the cursor position. +The return value is the yanked text." + (interactive) + (emms-with-inhibit-read-only-t + (goto-char (point-at-bol)) + (yank) + (emms-playlist-mode-correct-previous-yank) + (evil-previous-line) + (evil-beginning-of-line))) + +(defun evil-emms-playlist-mode-paste-after () + "Pastes the latest yanked playlist items behind point. +The return value is the yanked text." + (interactive) + (evil-next-line) + (evil-emms-playlist-mode-paste-before)) + +(defun evil-emms-set-keys () + (advice-add 'emms-browser :after 'evil-emms-browser) + (evil-set-initial-state 'emms-playlist-mode 'motion) + + (dolist (map (list emms-browser-mode-map emms-playlist-mode-map)) + (evil-define-key 'motion map + "+" 'emms-volume-raise + "=" 'emms-volume-raise + "-" 'emms-volume-lower + "u" 'emms-playlist-mode-undo)) + + (with-eval-after-load 'emms-browser + ;; TODO: Why do we need to define emms-browser-mode-map after load and not emms-playlist-mode-map? + (evil-define-key 'motion emms-browser-mode-map + ;; playback controls + "x" 'emms-pause + "X" 'emms-stop + "r" 'emms-random + "<" 'emms-seek-backward + ">" 'emms-seek-forward + (kbd "") 'emms-browser-add-tracks + (kbd "C-") 'emms-browser-add-tracks-and-play + + ;; motion + "[" 'emms-browser-prev-non-track + "]" 'emms-browser-next-non-track + + (kbd "") 'emms-browser-toggle-subitems + (kbd "SPC") 'emms-browser-toggle-subitems + ;; TODO: Use S-? + "g1" 'emms-browser-collapse-all + "g2" 'emms-browser-expand-to-level-2 + "g3" 'emms-browser-expand-to-level-3 + "g4" 'emms-browser-expand-to-level-4 + "g0" 'emms-browser-expand-all + "ga" 'emms-browse-by-artist + "gA" 'emms-browse-by-album + "gb" 'emms-browse-by-genre + "gy" 'emms-browse-by-year + "gc" 'emms-browse-by-composer + "gp" 'emms-browse-by-performer + + "/" 'emms-isearch-buffer ; This shows hidden items during search. + + ;; filter + ;; "" 'emms-browser-previous-filter ; TODO: What does this do? + ;; "" 'emms-browser-next-filter + + "s" (lookup-key emms-browser-mode-map (kbd "s")) + "g" (lookup-key emms-browser-mode-map (kbd "W")) ;; TODO: This overrides other "g-" prefixed keys. + + "C" 'emms-browser-clear-playlist + "D" 'emms-browser-delete-files + "d" 'emms-browser-view-in-dired + "gd" 'emms-playlist-mode-goto-dired-at-point)) ; "d" does the same, keep "gd" for consistency. + + (evil-define-key 'motion emms-playlist-mode-map + ;; playback controls + "x" 'emms-pause + "X" 'emms-stop + "r" 'emms-random + "<" 'emms-seek-backward + ">" 'emms-seek-forward + (kbd "C-j") 'emms-next + (kbd "C-k") 'emms-previous + (kbd "") 'emms-playlist-mode-play-smart + + ;; motion + "gg" 'emms-playlist-mode-first + "G" 'emms-playlist-mode-last + "]" 'emms-playlist-mode-next + "[" 'emms-playlist-mode-previous + + "D" 'emms-playlist-mode-kill-track ; emms-browser uses "D" + "C" 'emms-playlist-mode-clear + "O" 'evil-emms-playlist-mode-insert-newline-above + "o" 'evil-emms-playlist-mode-insert-newline-below + "P" 'evil-emms-playlist-mode-paste-before + "p" 'evil-emms-playlist-mode-paste-after + + "u" 'emms-playlist-mode-undo + + "ze" 'emms-tag-editor-edit + "R" 'emms-tag-editor-rename + + "." 'emms-playlist-mode-center-current + "gd" 'emms-playlist-mode-goto-dired-at-point ; "d" does the same, keep "gd" for consistency. + + "zs" 'emms-show + "a" 'emms-playlist-mode-add-contents + "zp" 'emms-playlist-set-playlist-buffer + + ;; filter + "S" (lookup-key emms-playlist-mode-map (kbd "S")) + "s" (lookup-key emms-playlist-mode-map (kbd "/")) + ;; "" 'emms-playlist-limit-to-all ; TODO: Test. + + (kbd "M-y") 'emms-playlist-mode-yank-pop) + + (evil-define-key 'visual emms-playlist-mode-map + ;; "d" 'emms-playlist-mode-kill + "D" 'emms-playlist-mode-kill)) + +(provide 'evil-emms) +;;; evil-emms.el ends here