;;; -*- lexical-binding: t -*- ;;; ohai-ido.el --- Make minibuffer selection tolerable. ;; Copyright (C) 2015 Bodil Stokke ;; Author: Bodil Stokke ;; This program 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 of the License, 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. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Code: ;; Enable ido-mode. (ido-mode t) (setq ido-enable-prefix nil ido-enable-flex-matching t ido-create-new-buffer 'always ido-use-filename-at-point 'guess ido-use-url-at-point t ido-max-prospects 10 ido-use-virtual-buffers t) ;; Make sure ido is really everywhere. (package-require 'ido-ubiquitous) (ido-ubiquitous-mode) ;; Use smex to provide ido-like interface for M-x (package-require 'smex) (smex-initialize) (global-set-key (kbd "M-x") 'smex) (global-set-key (kbd "M-X") 'smex-major-mode-commands) ;; This is the old M-x. (global-set-key (kbd "C-c C-c M-x") 'execute-extended-command) ;; Vertical ido. (package-require 'ido-vertical-mode) (ido-vertical-mode) ;; Improved fuzzy matching. (package-require 'flx-ido) (flx-ido-mode 1) (setq ido-enable-flex-matching t ido-use-faces nil gc-cons-threshold 20000000) ;; Bind C-t to use ido to jump to a symbol in the current buffer. (require 'imenu) (defun ido-imenu () "Update the imenu index and then use ido to select a symbol to navigate to. Symbols matching the text at point are put first in the completion list." (interactive) (imenu--make-index-alist) (let ((name-and-pos '()) (symbol-names '())) (flet ((addsymbols (symbol-list) (when (listp symbol-list) (dolist (symbol symbol-list) (let ((name nil) (position nil)) (cond ((and (listp symbol) (imenu--subalist-p symbol)) (addsymbols symbol)) ((listp symbol) (setq name (car symbol)) (setq position (cdr symbol))) ((stringp symbol) (setq name symbol) (setq position (get-text-property 1 'org-imenu-marker symbol)))) (unless (or (null position) (null name)) (add-to-list 'symbol-names name) (add-to-list 'name-and-pos (cons name position)))))))) (addsymbols imenu--index-alist)) ;; If there are matching symbols at point, put them at the beginning of `symbol-names'. (let ((symbol-at-point (thing-at-point 'symbol))) (when symbol-at-point (let* ((regexp (concat (regexp-quote symbol-at-point) "$")) (matching-symbols (delq nil (mapcar (lambda (symbol) (if (string-match regexp symbol) symbol)) symbol-names)))) (when matching-symbols (sort matching-symbols (lambda (a b) (> (length a) (length b)))) (mapc (lambda (symbol) (setq symbol-names (cons symbol (delete symbol symbol-names)))) matching-symbols))))) (let* ((selected-symbol (ido-completing-read "Symbol? " symbol-names)) (position (cdr (assoc selected-symbol name-and-pos)))) (goto-char position)))) (set-default 'imenu-auto-rescan t) (global-set-key (kbd "C-t") 'ido-imenu) ;; Bind `~` to go to homedir when in ido-find-file. ;; From http://whattheemacsd.com/setup-ido.el-02.html (add-hook 'ido-setup-hook (lambda () ;; Go straight home (define-key ido-file-completion-map (kbd "~") (lambda () (interactive) (if (looking-back "/") (insert "~/") (call-interactively 'self-insert-command)))))) (provide 'ohai-ido)