Forked from k-takata/bash-completion-slowness-on-msys2.md
Created
June 5, 2019 13:56
-
-
Save thomthom/d69d82b2f5fc10bb28f47c2d16f74057 to your computer and use it in GitHub Desktop.
Revisions
-
k-takata created this gist
May 13, 2015 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,86 @@ # Bash-completion is very slow on MSYS2 Bash-completion is very slow on MSYS2 when the current user is a domain user. This describes the cause and the solutions. ## Cause Expansion of `~*` is very slow when you use a domain user. For example: ``` $ time echo ~* ~* real 0m23.151s user 0m0.000s sys 0m0.000s ``` When the tab key is pressed, bash-completion tries to evaluate `~*`. That's why bash-completion is slow. ## Solution 1: Disable `~*` in `bash_completion` `~*` is used inside `/usr/share/bash-completion/bash_completion`. Disabling it can solve the problem. ```diff --- /usr/share/bash-completion/bash_completion.org +++ /usr/share/bash-completion/bash_completion @@ -542,9 +542,9 @@ elif [[ $1 == \'* ]]; then # Leave out first character printf -v $2 %s "${1:1}" - elif [[ $1 == ~* ]]; then - # avoid escaping first ~ - printf -v $2 ~%q "${1:1}" + #elif [[ $1 == ~* ]]; then + # # avoid escaping first ~ + # printf -v $2 ~%q "${1:1}" else printf -v $2 %q "$1" fi ``` ## Solution 2: Disable `db` in `/etc/nsswitch.conf` MSYS2 obtains the user information from the system database (in Windows) by default, but it is very slow when the current user is a domain user. Disabling it and make MSYS2 to obtain the user information from files solves the problem. First you need to create `/etc/passwd` and `/etc/group` with the information of the local users (`-l`) and the current (domain) user (`-c`). ```sh $ mkpasswd -l -c > /etc/passwd $ mkgroup -l -c > /etc/group ``` Then you need to modify `/etc/nsswitch.conf` to disable `db` from `group` and `passwd`. ```diff --- /etc/nsswitch.conf.org +++ /etc/nsswitch.conf @@ -1,7 +1,7 @@ # Begin /etc/nsswitch.conf -passwd: files db -group: files db +passwd: files #db +group: files #db db_enum: cache builtin ``` If you don't update `/etc/passwd` and `/etc/group` properly, bash prompt might show your account as `Unknown+User`. See also: * `man 5 nsswitch.conf` on Linux * https://github.com/Alexpux/MSYS2-packages/issues/138#issuecomment-74079347