Subject: bug#32757: 27.0.50; icomplete-mode's M-TAB doesn't as documented

From: OGAWA Hirofumi <[email-masked]>
Date: Tue, 18 Sep 2018 18:19:56 +0900

Documentation of icomplete says:

[‘M-<TAB>’ will select the first completion in the list, like ‘C-j’
but without exiting the minibuffer, so you can edit it further.  This is
typically used when entering a file name, where ‘M-<TAB>’ can be used a
few times to descend in the hierarchy of directories.]

But current implemetation doesn't work like it, and behavior is
useless if completing file name.

Step to reproduce,

cd /path/to/emacs-src
LANG=C emacs -Q
(icomplete-mode)

C-x C-f

	/path/to/emacs-src/{m4/ | nt/ | lib/ ...

Choice "nt/" from list by repeating "C-.", then select "nt/" by "M-TAB"

	/path/to/emacs-src/nt/{lib/ | doc/ | etc/ ...

Completion list is still showing under the /path/to/emacs-src, not
/path/to/emacs-src/nt/, and we can't be used to descend in the
hierarchy of directories.

This is because `minibuffer-force-complete' enters cyclic mode to select
from current completion list, so repeating "M-TAB" doesn't work as
documented.  Furthermore, in the case of icomplete mode, user already
selected from list by "C-." or "C-,", so cyclic behavior of
`minibuffer-force-complete' is useless IMO, especially for file name
completion.

To make changing behavior minimum, this patch just change in the case
of file name completion only to work as documented.

Thanks.

---

 lisp/icomplete.el |   12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff -puN lisp/icomplete.el~icomplete-completion-fix lisp/icomplete.el
--- emacs/lisp/icomplete.el~icomplete-completion-fix	2018-09-18 17:52:07.848686039 +0900
+++ emacs-hirofumi/lisp/icomplete.el	2018-09-18 17:52:48.202692477 +0900
@@ -145,13 +145,23 @@ icompletion is occurring."
 
 (defvar icomplete-minibuffer-map
   (let ((map (make-sparse-keymap)))
-    (define-key map [?\M-\t] 'minibuffer-force-complete)
+    (define-key map [?\M-\t] 'icomplete-force-complete)
     (define-key map [?\C-j]  'icomplete-force-complete-and-exit)
     (define-key map [?\C-.]  'icomplete-forward-completions)
     (define-key map [?\C-,]  'icomplete-backward-completions)
     map)
   "Keymap used by `icomplete-mode' in the minibuffer.")
 
+(defun icomplete-force-complete ()
+  "Select the first completion in the list.
+Repeated uses step through the possible completions if not
+completing file name."
+  (interactive)
+  (call-interactively #'minibuffer-force-complete)
+  ;; Cycle may not be useful for icomplete, so this should be unconditional?
+  (when minibuffer-completing-file-name
+    (completion--flush-all-sorted-completions)))
+
 (defun icomplete-force-complete-and-exit ()
   "Complete the minibuffer and exit.
 Use the first of the matches if there are any displayed, and use
_

In GNU Emacs 27.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.22.30)
 of 2018-08-04 built on devron
Repository revision: da0054c30729e58259c1e7251cb03c8ef13ff943
Windowing system distributor 'The X.Org Foundation', version 11.0.12001000
System Description: Debian GNU/Linux buster/sid

Recent messages:
Checking 205 files in /usr/local/share/emacs/27.0.50/lisp/gnus...
Checking 57 files in /usr/local/share/emacs/27.0.50/lisp/eshell...
Checking 71 files in /usr/local/share/emacs/27.0.50/lisp/erc...
Checking 34 files in /usr/local/share/emacs/27.0.50/lisp/emulation...
Checking 181 files in /usr/local/share/emacs/27.0.50/lisp/emacs-lisp...
Checking 24 files in /usr/local/share/emacs/27.0.50/lisp/cedet...
Checking 57 files in /usr/local/share/emacs/27.0.50/lisp/calendar...
Checking 87 files in /usr/local/share/emacs/27.0.50/lisp/calc...
Checking 107 files in /usr/local/share/emacs/27.0.50/lisp/obsolete...
Checking for load-path shadows...done

Configured using:
 'configure --libexecdir=/usr/local/lib --with-x --with-x-toolkit=gtk3
 --without-xim --with-xpm --with-jpeg --with-tiff --with-gif --with-png
 --with-rsvg --with-dbus --with-wide-int --with-modules'

Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND DBUS GSETTINGS NOTIFY ACL
LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB
TOOLKIT_SCROLL_BARS GTK3 X11 MODULES THREADS JSON LCMS2

Important settings:
  value of $LANG: ja_JP.UTF-8
  value of $XMODIFIERS: @im=ibus
  locale-coding-system: utf-8-unix

Major mode: Group

Minor modes in effect:
  gnus-topic-mode: t
  gnus-undo-mode: t
  flycheck-pos-tip-mode: t
  global-flycheck-mode: t
  auto-insert-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  global-company-mode: t
  company-mode: t
  savehist-mode: t
  eyebrowse-mode: t
  icomplete-mode: t
  show-paren-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  buffer-read-only: t
  column-number-mode: t
  line-number-mode: t

Load-path shadows:
/usr/local/share/emacs/site-lisp/google-translate/features/support/env hides /usr/local/share/emacs/27.0.50/lisp/env

Features:
(shadow nnir emacsbug sendmail stem lookup-entry ndkks lookup-kanji
lookup-kanji-mecab ndict ndeb ndeb-binary lookup-content lookup-vse
lookup-text lookup-text-table lookup-package lookup lookup-types
lookup-utils lookup-cache lookup-vars evi url-http url-gw url-auth
url-cache jka-compr gnus-dup shr-color color mm-archive bbdb-gui
bbdb-hooks gnus-notifications gnus-fun notifications dbus hl-line
elfeed-show elfeed-search bookmark shr text-property-search svg dom
elfeed-csv elfeed elfeed-curl elfeed-log elfeed-db elfeed-lib avl-tree
generator url-queue browse-url xml-query xml pp sort gnus-cite
gnus-async gnus-bcklg qp gnus-ml disp-table gnus-topic utf-7 rfc2104
gnutls network-stream nsm nnfolder bbdb-gnus bbdb-snarf mail-extr nnnil
spam spam-stat bbdb-com warnings bbdb timezone gnus-uu yenc gnus-demon
gnus-delay gnus-draft gnus-agent gnus-srvr gnus-score score-mode
nnvirtual nntp gnus-cache gnus-msg gnus-art mm-uu mml2015 mm-view
mml-smime smime dig gnus-sum nndraft nnmh gnus-group gnus-undo
gnus-start gnus-cloud nnimap nnmail mail-source utf7 netrc nnoo
parse-time gnus-spec gnus-int gnus-range message rmc puny rfc822 mml
mml-sec epa mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev
gmm-utils mailheader gnus-win gnus nnheader gnus-util rmail
rmail-loaddefs rfc2047 rfc2045 ietf-drums mail-utils wid-edit
dircolors-faces ansi-color dired-x dired dired-loaddefs
company-yasnippet flyspell ispell server generic-x multi-translate
google-translate-smooth-ui google-translate google-translate-default-ui
google-translate-core-ui ido google-translate-core google-translate-tk
url url-proxy url-privacy url-expand url-methods url-history url-cookie
url-domsuf url-util mailcap magit-autoloads git-modes-autoloads
flycheck-pos-tip pos-tip flycheck find-func autoinsert yasnippet
elec-pair company-oddmuse company-keywords company-etags etags xref
project ring company-gtags company-dabbrev-code company-dabbrev
company-files company-capf company-cmake company-xcode company-clang
company-semantic company-eclim company-template company-bbdb company
edmacro kmacro bbdb-autoloads savehist browse-kill-ring cl
eyebrowse-session desktop frameset eyebrowse format-spec dash icomplete
paren mozc-im-indicater mozc-popup popup mozc-im advice mm-util
mail-prsvr time-date mule-util mozc rx finder-inf package let-alist
derived pcase cl-extra help-mode easymenu url-handlers url-parse
auth-source cl-seq eieio eieio-core cl-macs eieio-loaddefs
password-cache json map url-vars seq byte-opt gv bytecomp byte-compile
cconv epg epg-config subr-x cl-loaddefs cl-lib japan-util tooltip eldoc
electric uniquify ediff-hook vc-hooks lisp-float-type mwheel term/x-win
x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode elisp-mode lisp-mode
prog-mode register page menu-bar rfn-eshadow isearch timer select
scroll-bar mouse jit-lock font-lock syntax facemenu font-core
term/tty-colors frame cl-generic cham georgian utf-8-lang misc-lang
vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932
hebrew greek romanian slovak czech european ethiopic indian cyrillic
chinese composite charscript charprop case-table epa-hook jka-cmpr-hook
help simple abbrev obarray minibuffer cl-preloaded nadvice loaddefs
button faces cus-face macroexp files text-properties overlay sha1 md5
base64 format env code-pages mule custom widget hashtable-print-readable
backquote threads dbusbind inotify lcms2 dynamic-setting
system-font-setting font-render-setting move-toolbar gtk x-toolkit x
multi-tty make-network-process emacs)

Memory information:
((conses 16 703470 187252)
 (symbols 48 46081 549)
 (miscs 40 466 1661)
 (strings 32 347210 34028)
 (string-bytes 1 12772950)
 (vectors 16 133897)
 (vector-slots 8 2279431 111054)
 (floats 8 20418 3100)
 (intervals 56 3312 1331)
 (buffers 992 65))

-- 
OGAWA Hirofumi <[email-masked]>