A few weeks ago when I was talking about autocomplete and dabbrevone of my commenters asked if I had tried hippie-expand. My response was no, but I should take a look as it might allow me to input buffer names more quickly which is something I often need to do.
Following the recipe from the emacs wiki, I tried this:
(global-set-key [(meta f5)] (make-hippie-expand-function '(try-expand-dabbrev-visible try-expand-dabbrev try-expand-dabbrev-all-buffers try-complete-file-name) t))
After some experimentation, the limitation is obvious. I usually want to complete the entire filename including the path but I can’t remember what the path begins with.
The next thing I thought about was removing *Messages* and *Buffer List* from dabbrev-ignored-buffer-names
. Unfortunately, I still need to complete from the beginning of the path but this is generally useful so I’m going to keep it. Really, I want to be able to select any part of the filename and complete from that. Sounds like a job for ido
.
First I need a method that returns all buffer names and filenames.
(defun get-files-and-buffers () (let ((res '())) (dolist (buffer (buffer-list) res) (let ((buffername (buffer-name buffer)) (filename (buffer-file-name buffer))) (unless (string-match "^ *\\*.*\\*$" buffername) (push buffername res)) (when filename (push filename res))))))
Then I can use ido to select between them which is perfect.
(defun insert-file-or-buffer-name (&optional initial) (interactive) (let ((name (ido-completing-read "File/Buffer Name: " (get-files-and-buffers) nil nil initial))) (when (and (stringp name) (> (length name) 0)) (insert name)))) (global-set-key (kbd "<f2> i b") 'insert-file-or-buffer-name)