195 lines
8.4 KiB
EmacsLisp
195 lines
8.4 KiB
EmacsLisp
;;; packages.el --- Spacemacs Completion Layer packages File
|
|
;;
|
|
;; Copyright (c) 2012-2016 Sylvain Benner & Contributors
|
|
;;
|
|
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
|
|
;; URL: https://github.com/syl20bnr/spacemacs
|
|
;;
|
|
;; This file is not part of GNU Emacs.
|
|
;;
|
|
;;; License: GPLv3
|
|
|
|
(setq spacemacs-completion-packages
|
|
'(
|
|
(ido :location built-in)
|
|
ido-vertical-mode
|
|
))
|
|
|
|
(defun spacemacs-completion/init-ido ()
|
|
(setq ido-save-directory-list-file
|
|
(concat spacemacs-cache-directory "ido.last")
|
|
;; enable fuzzy matching
|
|
ido-enable-flex-matching t)
|
|
(ido-mode t))
|
|
|
|
(defun spacemacs-completion/init-ido-vertical-mode ()
|
|
(use-package ido-vertical-mode
|
|
:init
|
|
(progn
|
|
(ido-vertical-mode t)
|
|
(defun spacemacs//ido-minibuffer-setup ()
|
|
"Setup the minibuffer."
|
|
;; Since ido is implemented in a while loop where each
|
|
;; iteration setup a whole new minibuffer, we have to keep
|
|
;; track of any activated ido navigation transient-state and force
|
|
;; the reactivation at each iteration.
|
|
(when spacemacs--ido-navigation-ms-enabled
|
|
(spacemacs/ido-navigation-micro-state)))
|
|
(add-hook 'ido-minibuffer-setup-hook 'spacemacs//ido-minibuffer-setup)
|
|
|
|
(defun spacemacs//ido-setup ()
|
|
(when spacemacs--ido-navigation-ms-face-cookie-minibuffer
|
|
(face-remap-remove-relative
|
|
spacemacs--ido-navigation-ms-face-cookie-minibuffer))
|
|
;; be sure to wipe any previous transient-state flag
|
|
(setq spacemacs--ido-navigation-ms-enabled nil)
|
|
;; overwrite the key bindings for ido vertical mode only
|
|
(define-key ido-completion-map (kbd "C-<return>") 'ido-select-text)
|
|
;; use M-RET in terminal
|
|
(define-key ido-completion-map "\M-\r" 'ido-select-text)
|
|
(define-key ido-completion-map (kbd "C-h") 'ido-delete-backward-updir)
|
|
(define-key ido-completion-map (kbd "C-j") 'ido-next-match)
|
|
(define-key ido-completion-map (kbd "C-k") 'ido-prev-match)
|
|
(define-key ido-completion-map (kbd "C-l") 'ido-exit-minibuffer)
|
|
(define-key ido-completion-map (kbd "C-n") 'ido-next-match)
|
|
(define-key ido-completion-map (kbd "C-p") 'ido-prev-match)
|
|
(define-key ido-completion-map (kbd "C-S-h") 'ido-prev-match-dir)
|
|
(define-key ido-completion-map (kbd "C-S-j") 'next-history-element)
|
|
(define-key ido-completion-map (kbd "C-S-k") 'previous-history-element)
|
|
(define-key ido-completion-map (kbd "C-S-l") 'ido-next-match-dir)
|
|
(define-key ido-completion-map (kbd "C-S-n") 'next-history-element)
|
|
(define-key ido-completion-map (kbd "C-S-p") 'previous-history-element)
|
|
;; ido-other window maps
|
|
(define-key ido-completion-map (kbd "C-o") 'spacemacs/ido-invoke-in-other-window)
|
|
(define-key ido-completion-map (kbd "C-s") 'spacemacs/ido-invoke-in-vertical-split)
|
|
(define-key ido-completion-map (kbd "C-t") 'spacemacs/ido-invoke-in-new-frame)
|
|
(define-key ido-completion-map (kbd "C-v") 'spacemacs/ido-invoke-in-horizontal-split)
|
|
;; more natural navigation keys: up, down to change current item
|
|
;; left to go up dir
|
|
;; right to open the selected item
|
|
(define-key ido-completion-map (kbd "<up>") 'ido-prev-match)
|
|
(define-key ido-completion-map (kbd "<down>") 'ido-next-match)
|
|
(define-key ido-completion-map (kbd "<left>") 'ido-delete-backward-updir)
|
|
(define-key ido-completion-map (kbd "<right>") 'ido-exit-minibuffer)
|
|
;; initiate transient-state
|
|
(define-key ido-completion-map (kbd "M-SPC") 'spacemacs/ido-navigation-micro-state)
|
|
(define-key ido-completion-map (kbd "s-M-SPC") 'spacemacs/ido-navigation-micro-state)
|
|
)
|
|
(add-hook 'ido-setup-hook 'spacemacs//ido-setup)
|
|
|
|
(defun spacemacs/ido-invoke-in-other-window ()
|
|
"signals ido mode to switch to (or create) another window after exiting"
|
|
(interactive)
|
|
(setq ido-exit-minibuffer-target-window 'other)
|
|
(ido-exit-minibuffer))
|
|
|
|
(defun spacemacs/ido-invoke-in-horizontal-split ()
|
|
"signals ido mode to split horizontally and switch after exiting"
|
|
(interactive)
|
|
(setq ido-exit-minibuffer-target-window 'horizontal)
|
|
(ido-exit-minibuffer))
|
|
|
|
(defun spacemacs/ido-invoke-in-vertical-split ()
|
|
"signals ido mode to split vertically and switch after exiting"
|
|
(interactive)
|
|
(setq ido-exit-minibuffer-target-window 'vertical)
|
|
(ido-exit-minibuffer))
|
|
|
|
(defun spacemacs/ido-invoke-in-new-frame ()
|
|
"signals ido mode to create a new frame after exiting"
|
|
(interactive)
|
|
(setq ido-exit-minibuffer-target-window 'frame)
|
|
(ido-exit-minibuffer))
|
|
|
|
(defadvice ido-read-internal
|
|
(around ido-read-internal-with-minibuffer-other-window activate)
|
|
(let* (ido-exit-minibuffer-target-window
|
|
(this-buffer (current-buffer))
|
|
(result ad-do-it))
|
|
(cond
|
|
((equal ido-exit-minibuffer-target-window 'other)
|
|
(if (= 1 (count-windows))
|
|
(spacemacs/split-window-horizontally-and-switch)
|
|
(other-window 1)))
|
|
((equal ido-exit-minibuffer-target-window 'horizontal)
|
|
(spacemacs/split-window-horizontally-and-switch))
|
|
|
|
((equal ido-exit-minibuffer-target-window 'vertical)
|
|
(spacemacs/split-window-vertically-and-switch))
|
|
((equal ido-exit-minibuffer-target-window 'frame)
|
|
(make-frame)))
|
|
;; why? Some ido commands, such as textmate.el's
|
|
;; textmate-goto-symbol don't switch the current buffer
|
|
(switch-to-buffer this-buffer)
|
|
result))
|
|
|
|
(defvar spacemacs--ido-navigation-ms-enabled nil
|
|
"Flag which is non nil when ido navigation transient-state is enabled.")
|
|
|
|
(defvar spacemacs--ido-navigation-ms-face-cookie-minibuffer nil
|
|
"Cookie pointing to the local face remapping.")
|
|
|
|
(defface spacemacs-ido-navigation-ms-face
|
|
`((t :background ,(face-attribute 'error :foreground)
|
|
:foreground "black"
|
|
:weight bold))
|
|
"Face for ido minibuffer prompt when ido transient-state is activated."
|
|
:group 'spacemacs)
|
|
|
|
(defun spacemacs//ido-navigation-ms-set-face ()
|
|
"Set faces for ido navigation transient-state."
|
|
(setq spacemacs--ido-navigation-ms-face-cookie-minibuffer
|
|
(face-remap-add-relative
|
|
'minibuffer-prompt
|
|
'spacemacs-ido-navigation-ms-face)))
|
|
|
|
(defun spacemacs//ido-navigation-ms-on-enter ()
|
|
"Initialization of ido transient-state."
|
|
(setq spacemacs--ido-navigation-ms-enabled t)
|
|
(spacemacs//ido-navigation-ms-set-face))
|
|
|
|
(defun spacemacs//ido-navigation-ms-on-exit ()
|
|
"Action to perform when exiting ido transient-state."
|
|
(face-remap-remove-relative
|
|
spacemacs--ido-navigation-ms-face-cookie-minibuffer))
|
|
|
|
(defun spacemacs//ido-navigation-ms-full-doc ()
|
|
"Full documentation for ido navigation transient-state."
|
|
"
|
|
[?] display this help
|
|
[e] enter dired
|
|
[j] [k] next/previous match
|
|
[J] [K] sub/parent directory
|
|
[h] delete backward or parent directory
|
|
[l] select match
|
|
[n] [p] next/previous directory in history
|
|
[o] open in other window
|
|
[s] open in a new horizontal split
|
|
[t] open in other frame
|
|
[v] open in a new vertical split
|
|
[q] quit")
|
|
|
|
(spacemacs|define-transient-state ido-navigation
|
|
:title "ido Transient State"
|
|
:foreign-keys run
|
|
:on-enter (spacemacs//ido-navigation-ms-on-enter)
|
|
:on-exit (spacemacs//ido-navigation-ms-on-exit)
|
|
:bindings
|
|
;;("?" nil (spacemacs//ido-navigation-ms-full-doc))
|
|
("<RET>" ido-exit-minibuffer :exit t)
|
|
("<escape>" nil :exit t)
|
|
("e" ido-select-text :exit t)
|
|
("h" ido-delete-backward-updir)
|
|
("j" ido-next-match)
|
|
("J" ido-next-match-dir)
|
|
("k" ido-prev-match)
|
|
("K" ido-prev-match-dir)
|
|
("l" ido-exit-minibuffer :exit t)
|
|
("n" ido-next-match-dir)
|
|
("o" spacemacs/ido-invoke-in-other-window :exit t)
|
|
("p" ido-prev-match-dir)
|
|
("q" nil :exit t)
|
|
("s" spacemacs/ido-invoke-in-vertical-split :exit t)
|
|
("t" spacemacs/ido-invoke-in-new-frame :exit t)
|
|
("v" spacemacs/ido-invoke-in-horizontal-split :exit t)))))
|