* ido
#+begin_src emacs-lisp
-
-;; easier to read, and more than the default 12
-(setq ido-separator nil)
-(setq ido-max-prospects 20)
-
-(ido-mode t)
-(ido-everywhere t) ;; file dialogs
-
-;; do out of order matching when all else fails
-(setq ido-enable-flex-matching t
- ido-create-new-buffer 'always ;; create new buffer/file without asking
- ido-use-filename-at-point 'guess ;; use filename at point if it makes sense
- ido-save-directory-list-file "~/.emacs.d/.ido.last"
- ido-default-file-method 'selected-window) ;; make duplicate windows
-;; todo, the next 2 functions seem to do roughly the same.
-;; figure out which one is better. the first comes from emacs starter kit,
-;; i forget about the second.
-(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 '()))
- (cl-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))))
-
-(defun ido-goto-symbol (&optional symbol-list)
- "Refresh imenu and jump to a place in the buffer using Ido."
- (interactive)
- (unless (featurep 'imenu)
- (require 'imenu nil t))
- (cond
- ((not symbol-list)
- (let ((ido-mode ido-mode)
- (ido-enable-flex-matching
- (if (boundp 'ido-enable-flex-matching)
- ido-enable-flex-matching t))
- name-and-pos symbol-names position)
- (unless ido-mode
- (ido-mode 1)
- (setq ido-enable-flex-matching t))
- (while (progn
- (imenu--cleanup)
- (setq imenu--index-alist nil)
- (ido-goto-symbol (imenu--make-index-alist))
- (setq selected-symbol
- (ido-completing-read "Symbol? " symbol-names))
- (string= (car imenu--rescan-item) selected-symbol)))
- (unless (and (boundp 'mark-active) mark-active)
- (push-mark nil t nil))
- (setq position (cdr (assoc selected-symbol name-and-pos)))
- (cond
- ((overlayp position)
- (goto-char (overlay-start position)))
- (t
- (goto-char position)))))
- ((listp symbol-list)
- (dolist (symbol symbol-list)
- (let (name position)
- (cond
- ((and (listp symbol) (imenu--subalist-p symbol))
- (ido-goto-symbol 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)
- (string= (car imenu--rescan-item) name))
- (add-to-list 'symbol-names (substring-no-properties name))
- (add-to-list 'name-and-pos (cons (substring-no-properties name) position))))))))
+(require 'ido)
+;; easier to read with just spaces as separator
+(setf (nth 2 ido-decorations) " ")
+;; note, at one point I liked this, but I don't now.
+;;(setq ido-max-prospects 20)
+
+;; using counsel/ivy instead
+;;(ido-mode t)
+;; sets read-file-name-function, and read-buffer-function to ido.
+;; searching through the emacs source code, it seems this is used
+;; very few if any places.
+;;(ido-everywhere t)
#+end_src