编辑shell-script时,大量补全候选项卡住

用Emacs编辑.zshrc时,由于我的company-mode触发字母数为1,这就导致输入一个字母就出现大量都候选项把emacs卡住,如图

image

想知道这是由哪个补全后端提供的?

M-x company-diag 这个诊断命令可以看到当前用了哪个后端。

建议你 设置 2个字符再开始补全。一个字符就触发,候选太多了。

即使把最短触发长度改成2,仍然会有大量的候选,下面是ab前缀下company-diag的结果:

Emacs 28.1 (x86_64-pc-linux-gnu) of 2022-04-10 on frederik
Company 0.9.13

company-backends: ((company-capf company-yasnippet)
 (company-dabbrev-code company-keywords company-files)
 company-dabbrev)

Used backend: (company-capf company-yasnippet)

Value of c-a-p-f: (sh-completion-at-point-function comint-completion-at-point t)
Major mode: sh-mode
Prefix: "ab"
Completions:
  #("portabledeviceapi.mof" 4 6 (face orderless-match-face-0))
  #("portabledeviceclassextension.mof" 4 6 (face orderless-match-face-0))
  #("portabledeviceconnectapi.mof" 4 6 (face orderless-match-face-0))
  #("portabledevicetypes.mof" 4 6 (face orderless-match-face-0))
  #("portabledevicewiacompat.mof" 4 6 (face orderless-match-face-0))
  #("texttable.xsl" 5 7 (face orderless-match-face-0))
  #("Win32_EncryptableVolume.dll" 13 15 (face orderless-match-face-0))
  #("win32_encryptablevolume.mof" 13 15 (face orderless-match-face-0))
  #("Win32_EncryptableVolumeUninstall.mof" 13 15 (face orderless-match-face-0))
  #("AboutSettingsHandlers.dll" 0 2 (face orderless-match-face-0))
  #("AboveLockAppHost.dll" 0 2 (face orderless-match-face-0))
  #("AppXApplicabilityBlob.dll" 10 12 (face orderless-match-face-0))
  #("AppxApplicabilityEngine.dll" 10 12 (face orderless-match-face-0))
  #("cabapi.dll" 1 3 (face orderless-match-face-0))
  #("cabinet.dll" 1 3 (face orderless-match-face-0))
  #("cabview.dll" 1 3 (face orderless-match-face-0))
  #("CapabilityAccessHandlers.dll" 3 5 (face orderless-match-face-0))
  #("CapabilityAccessManager.dll" 3 5 (face orderless-match-face-0))
  #("CapabilityAccessManagerClient.dll" 3 5 (face orderless-match-face-0))
  #("cellulardatacapabilityhandler.dll" 15 17 (face orderless-match-face-0))
  #("ComposableShellProxyStub.dll" 6 8 (face orderless-match-face-0))
  #("dab.dll" 1 3 (face orderless-match-face-0))
  #("dabapi.dll" 1 3 (face orderless-match-face-0))
  #("directxdatabasehelper.dll" 10 12 (face orderless-match-face-0))
  #("directxdatabaseupdater.exe" 10 12 (face orderless-match-face-0))
  #("f1db7d81-95be-4911-935a-8ab71629112a_HyperV-IsolatedVM.dll" 25 27 (face orderless-match-face-0))
  #("label.exe" 1 3 (face orderless-match-face-0))
  #("makecab.exe" 5 7 (face orderless-match-face-0))
  #("Microsoft.Uev.CabUtil.dll" 15 17 (face orderless-match-face-0))
  #("PhonePlatformAbstraction.dll" 13 15 (face orderless-match-face-0))
  #("PortableDeviceApi.dll" 4 6 (face orderless-match-face-0))
  #("PortableDeviceClassExtension.dll" 4 6 (face orderless-match-face-0))
  #("PortableDeviceConnectApi.dll" 4 6 (face orderless-match-face-0))
  #("PortableDeviceStatus.dll" 4 6 (face orderless-match-face-0))
  #("PortableDeviceSyncProvider.dll" 4 6 (face orderless-match-face-0))
  #("PortableDeviceTypes.dll" 4 6 (face orderless-match-face-0))
  #("PortableDeviceWiaCompat.dll" 4 6 (face orderless-match-face-0))
  #("RemovableMediaProvisioningPlugin.dll" 5 7 (face orderless-match-face-0))
  #("SettingsHandlers_CapabilityAccess.dll" 20 22 (face orderless-match-face-0))
  #("Tabbtn.dll" 1 3 (face orderless-match-face-0))
  #("TabbtnEx.dll" 1 3 (face orderless-match-face-0))
  #("tabcal.exe" 1 3 (face orderless-match-face-0))
  #("TabletPC.cpl" 1 3 (face orderless-match-face-0))
  #("TabSvc.dll" 1 3 (face orderless-match-face-0))
  #("UpdatePolicyScenarioReliabilityAggregator.dll" 24 26 (face orderless-match-face-0))
  #("VocabRoamingHandler.dll" 3 5 (face orderless-match-face-0))
  #("WABSyncProvider.dll" 1 3 (face orderless-match-face-0))
  #("wifidatacapabilityhandler.dll" 11 13 (face orderless-match-face-0))
  #("WinBioDatabase/" 9 11 (face orderless-match-face-0))
  #("Windows.Devices.Portable.dll" 20 22 (face orderless-match-face-0))
  #("Windows.Internal.UI.Shell.WindowTabManager.dll" 33 35 (face orderless-match-face-0))
  #("Windows.Networking.Sockets.PushEnabledApplication.dll" 33 35 (face orderless-match-face-0))
  #("WindowsInternal.ComposableShell.Display.dll" 22 24 (face orderless-match-face-0))
  #("quantization-table.xml" 14 16 (face orderless-match-face-0))
  #("ip6tables-apply" 4 6 (face orderless-match-face-0))
  #("portablectl" 4 6 (face orderless-match-face-0))
  #("term_colortab" 11 13 (face orderless-match-face-0))
  #("psfaddtable" 7 9 (face orderless-match-face-0))
  #("pmxab" 3 5 (face orderless-match-face-0))
  #("ip6tables-nft-restore" 4 6 (face orderless-match-face-0))
  #("iptables-restore-translate" 3 5 (face orderless-match-face-0))
  #("xtables-nft-multi" 2 4 (face orderless-match-face-0))
  #("psfstriptable" 9 11 (face orderless-match-face-0))
  #("swaplabel" 5 7 (face orderless-match-face-0))
  #("slabtop" 2 4 (face orderless-match-face-0))
  #("disable-paste" 3 5 (face orderless-match-face-0))
  #("imlib2_grab" 9 11 (face orderless-match-face-0))
  #("ip6tables-legacy-restore" 4 6 (face orderless-match-face-0))
  #("ip6tables-restore-translate" 4 6 (face orderless-match-face-0))
  #("arptables-nft" 4 6 (face orderless-match-face-0))
  #("xtables-legacy-multi" 2 4 (face orderless-match-face-0))
  #("iptables-nft-save" 3 5 (face orderless-match-face-0))
  #("tabs" 1 3 (face orderless-match-face-0))
  #("byobu-disable" 9 11 (face orderless-match-face-0))
  #("ip6tables-legacy" 4 6 (face orderless-match-face-0))
  #("iptables-restore" 3 5 (face orderless-match-face-0))
  #("iptables-xml" 3 5 (face orderless-match-face-0))
  #("iptables-legacy" 3 5 (face orderless-match-face-0))
  #("genfstab" 6 8 (face orderless-match-face-0))
  #("psfxtable" 5 7 (face orderless-match-face-0))
  #("ip6tables-nft-save" 4 6 (face orderless-match-face-0))
  #("arptables-nft-restore" 4 6 (face orderless-match-face-0))
  #("ip6tables-restore" 4 6 (face orderless-match-face-0))
  #("ebtables-nft-restore" 3 5 (face orderless-match-face-0))
  #("ip6tables-nft" 4 6 (face orderless-match-face-0))
  #("ebtables-nft" 3 5 (face orderless-match-face-0))
  #("ip6tables-save" 4 6 (face orderless-match-face-0))
  #("psfgettable" 7 9 (face orderless-match-face-0))
  #("ir-keytable" 7 9 (face orderless-match-face-0))
  #("iptables-legacy-restore" 3 5 (face orderless-match-face-0))
  #("iptables" 3 5 (face orderless-match-face-0))
  #("ip6tables" 4 6 (face orderless-match-face-0))
  #("ip6tables-translate" 4 6 (face orderless-match-face-0))
  #("iptables-nft-restore" 3 5 (face orderless-match-face-0))
  #("arptables-nft-save" 4 6 (face orderless-match-face-0))
  #("ebtables-nft-save" 3 5 (face orderless-match-face-0))
  #("iptables-apply" 3 5 (face orderless-match-face-0))
  #("byobu-enable" 8 10 (face orderless-match-face-0))
  #("iptables-save" 3 5 (face orderless-match-face-0))
  #("byobu-disable-prompt" 9 11 (face orderless-match-face-0))
  #("iptables-nft" 3 5 (face orderless-match-face-0))
  #("ip6tables-legacy-save" 4 6 (face orderless-match-face-0))
  #("update-mime-database" 15 17 (face orderless-match-face-0))
  #("gen-enc-table" 9 11 (face orderless-match-face-0))
  #("shtab" 3 5 (face orderless-match-face-0))
  #("dnssec-keyfromlabel" 15 17 (face orderless-match-face-0))
  #("byobu-enable-prompt" 8 10 (face orderless-match-face-0))
  #("iptables-legacy-save" 3 5 (face orderless-match-face-0))
  #("update-desktop-database" 18 20 (face orderless-match-face-0))
  #("xtables-monitor" 2 4 (face orderless-match-face-0))
  #("iptables-translate" 3 5 (face orderless-match-face-0))
  #("e2label" 3 5 (face orderless-match-face-0))
  #("ip6tables-apply" 4 6 (face orderless-match-face-0))
  #("portablectl" 4 6 (face orderless-match-face-0))
  #("term_colortab" 11 13 (face orderless-match-face-0))
  #("psfaddtable" 7 9 (face orderless-match-face-0))
  #("pmxab" 3 5 (face orderless-match-face-0))
  #("ip6tables-nft-restore" 4 6 (face orderless-match-face-0))
  #("iptables-restore-translate" 3 5 (face orderless-match-face-0))
  #("xtables-nft-multi" 2 4 (face orderless-match-face-0))
  #("psfstriptable" 9 11 (face orderless-match-face-0))
  #("swaplabel" 5 7 (face orderless-match-face-0))
  #("slabtop" 2 4 (face orderless-match-face-0))
  #("disable-paste" 3 5 (face orderless-match-face-0))
  #("imlib2_grab" 9 11 (face orderless-match-face-0))
  #("ip6tables-legacy-restore" 4 6 (face orderless-match-face-0))
  #("ip6tables-restore-translate" 4 6 (face orderless-match-face-0))
  #("arptables-nft" 4 6 (face orderless-match-face-0))
  #("xtables-legacy-multi" 2 4 (face orderless-match-face-0))
  #("iptables-nft-save" 3 5 (face orderless-match-face-0))
  #("tabs" 1 3 (face orderless-match-face-0))
  #("byobu-disable" 9 11 (face orderless-match-face-0))
  #("ip6tables-legacy" 4 6 (face orderless-match-face-0))
  #("iptables-restore" 3 5 (face orderless-match-face-0))
  #("iptables-xml" 3 5 (face orderless-match-face-0))
  #("iptables-legacy" 3 5 (face orderless-match-face-0))
  #("genfstab" 6 8 (face orderless-match-face-0))
  #("psfxtable" 5 7 (face orderless-match-face-0))
  #("ip6tables-nft-save" 4 6 (face orderless-match-face-0))
  #("arptables-nft-restore" 4 6 (face orderless-match-face-0))
  #("ip6tables-restore" 4 6 (face orderless-match-face-0))
  #("ebtables-nft-restore" 3 5 (face orderless-match-face-0))
  #("ip6tables-nft" 4 6 (face orderless-match-face-0))
  #("ebtables-nft" 3 5 (face orderless-match-face-0))
  #("ip6tables-save" 4 6 (face orderless-match-face-0))
  #("psfgettable" 7 9 (face orderless-match-face-0))
  #("ir-keytable" 7 9 (face orderless-match-face-0))
  #("iptables-legacy-restore" 3 5 (face orderless-match-face-0))
  #("iptables" 3 5 (face orderless-match-face-0))
  #("ip6tables" 4 6 (face orderless-match-face-0))
  #("ip6tables-translate" 4 6 (face orderless-match-face-0))
  #("iptables-nft-restore" 3 5 (face orderless-match-face-0))
  #("arptables-nft-save" 4 6 (face orderless-match-face-0))
  #("ebtables-nft-save" 3 5 (face orderless-match-face-0))
  #("iptables-apply" 3 5 (face orderless-match-face-0))
  #("byobu-enable" 8 10 (face orderless-match-face-0))
  #("iptables-save" 3 5 (face orderless-match-face-0))
  #("byobu-disable-prompt" 9 11 (face orderless-match-face-0))
  #("iptables-nft" 3 5 (face orderless-match-face-0))
  #("ip6tables-legacy-save" 4 6 (face orderless-match-face-0))
  #("update-mime-database" 15 17 (face orderless-match-face-0))
  #("gen-enc-table" 9 11 (face orderless-match-face-0))
  #("shtab" 3 5 (face orderless-match-face-0))
  #("dnssec-keyfromlabel" 15 17 (face orderless-match-face-0))
  #("byobu-enable-prompt" 8 10 (face orderless-match-face-0))
  #("iptables-legacy-save" 3 5 (face orderless-match-face-0))
  #("update-desktop-database" 18 20 (face orderless-match-face-0))
  #("xtables-monitor" 2 4 (face orderless-match-face-0))
  #("iptables-translate" 3 5 (face orderless-match-face-0))
  #("e2label" 3 5 (face orderless-match-face-0))
  #("ip6tables-apply" 4 6 (face orderless-match-face-0))
  #("portablectl" 4 6 (face orderless-match-face-0))
  #("term_colortab" 11 13 (face orderless-match-face-0))
  #("psfaddtable" 7 9 (face orderless-match-face-0))
  #("pmxab" 3 5 (face orderless-match-face-0))
  #("ip6tables-nft-restore" 4 6 (face orderless-match-face-0))
  #("iptables-restore-translate" 3 5 (face orderless-match-face-0))
  #("xtables-nft-multi" 2 4 (face orderless-match-face-0))
  #("psfstriptable" 9 11 (face orderless-match-face-0))
  #("swaplabel" 5 7 (face orderless-match-face-0))
  #("slabtop" 2 4 (face orderless-match-face-0))
  #("disable-paste" 3 5 (face orderless-match-face-0))
  #("imlib2_grab" 9 11 (face orderless-match-face-0))
  #("ip6tables-legacy-restore" 4 6 (face orderless-match-face-0))
  #("ip6tables-restore-translate" 4 6 (face orderless-match-face-0))
  #("arptables-nft" 4 6 (face orderless-match-face-0))
  #("xtables-legacy-multi" 2 4 (face orderless-match-face-0))
  #("iptables-nft-save" 3 5 (face orderless-match-face-0))
  #("tabs" 1 3 (face orderless-match-face-0))
  #("byobu-disable" 9 11 (face orderless-match-face-0))
  #("ip6tables-legacy" 4 6 (face orderless-match-face-0))
  #("iptables-restore" 3 5 (face orderless-match-face-0))
  #("iptables-xml" 3 5 (face orderless-match-face-0))
  #("iptables-legacy" 3 5 (face orderless-match-face-0))
  #("genfstab" 6 8 (face orderless-match-face-0))
  #("psfxtable" 5 7 (face orderless-match-face-0))
  #("ip6tables-nft-save" 4 6 (face orderless-match-face-0))
  #("arptables-nft-restore" 4 6 (face orderless-match-face-0))
  #("ip6tables-restore" 4 6 (face orderless-match-face-0))
  #("ebtables-nft-restore" 3 5 (face orderless-match-face-0))
  #("ip6tables-nft" 4 6 (face orderless-match-face-0))
  #("ebtables-nft" 3 5 (face orderless-match-face-0))
  #("ip6tables-save" 4 6 (face orderless-match-face-0))
  #("psfgettable" 7 9 (face orderless-match-face-0))
  #("ir-keytable" 7 9 (face orderless-match-face-0))
  #("iptables-legacy-restore" 3 5 (face orderless-match-face-0))
  #("iptables" 3 5 (face orderless-match-face-0))
  #("ip6tables" 4 6 (face orderless-match-face-0))
  #("ip6tables-translate" 4 6 (face orderless-match-face-0))
  #("iptables-nft-restore" 3 5 (face orderless-match-face-0))
  #("arptables-nft-save" 4 6 (face orderless-match-face-0))
  #("ebtables-nft-save" 3 5 (face orderless-match-face-0))
  #("iptables-apply" 3 5 (face orderless-match-face-0))
  #("byobu-enable" 8 10 (face orderless-match-face-0))
  #("iptables-save" 3 5 (face orderless-match-face-0))
  #("byobu-disable-prompt" 9 11 (face orderless-match-face-0))
  #("iptables-nft" 3 5 (face orderless-match-face-0))
  #("ip6tables-legacy-save" 4 6 (face orderless-match-face-0))
  #("update-mime-database" 15 17 (face orderless-match-face-0))
  #("gen-enc-table" 9 11 (face orderless-match-face-0))
  #("shtab" 3 5 (face orderless-match-face-0))
  #("dnssec-keyfromlabel" 15 17 (face orderless-match-face-0))
  #("byobu-enable-prompt" 8 10 (face orderless-match-face-0))
  #("iptables-legacy-save" 3 5 (face orderless-match-face-0))
  #("update-desktop-database" 18 20 (face orderless-match-face-0))
  #("xtables-monitor" 2 4 (face orderless-match-face-0))
  #("iptables-translate" 3 5 (face orderless-match-face-0))
  #("e2label" 3 5 (face orderless-match-face-0))
  #("ip6tables-apply" 4 6 (face orderless-match-face-0))
  #("portablectl" 4 6 (face orderless-match-face-0))
  #("term_colortab" 11 13 (face orderless-match-face-0))
  #("psfaddtable" 7 9 (face orderless-match-face-0))
  #("pmxab" 3 5 (face orderless-match-face-0))
  #("ip6tables-nft-restore" 4 6 (face orderless-match-face-0))
  #("iptables-restore-translate" 3 5 (face orderless-match-face-0))
  #("xtables-nft-multi" 2 4 (face orderless-match-face-0))
  #("psfstriptable" 9 11 (face orderless-match-face-0))
  #("swaplabel" 5 7 (face orderless-match-face-0))
  #("slabtop" 2 4 (face orderless-match-face-0))
  #("disable-paste" 3 5 (face orderless-match-face-0))
  #("imlib2_grab" 9 11 (face orderless-match-face-0))
  #("ip6tables-legacy-restore" 4 6 (face orderless-match-face-0))
  #("ip6tables-restore-translate" 4 6 (face orderless-match-face-0))
  #("arptables-nft" 4 6 (face orderless-match-face-0))
  #("xtables-legacy-multi" 2 4 (face orderless-match-face-0))
  #("iptables-nft-save" 3 5 (face orderless-match-face-0))
  #("tabs" 1 3 (face orderless-match-face-0))
  #("byobu-disable" 9 11 (face orderless-match-face-0))
  #("ip6tables-legacy" 4 6 (face orderless-match-face-0))
  #("iptables-restore" 3 5 (face orderless-match-face-0))
  #("iptables-xml" 3 5 (face orderless-match-face-0))
  #("iptables-legacy" 3 5 (face orderless-match-face-0))
  #("genfstab" 6 8 (face orderless-match-face-0))
  #("psfxtable" 5 7 (face orderless-match-face-0))
  #("ip6tables-nft-save" 4 6 (face orderless-match-face-0))
  #("arptables-nft-restore" 4 6 (face orderless-match-face-0))
  #("ip6tables-restore" 4 6 (face orderless-match-face-0))
  #("ebtables-nft-restore" 3 5 (face orderless-match-face-0))
  #("ip6tables-nft" 4 6 (face orderless-match-face-0))
  #("ebtables-nft" 3 5 (face orderless-match-face-0))
  #("ip6tables-save" 4 6 (face orderless-match-face-0))
  #("psfgettable" 7 9 (face orderless-match-face-0))
  #("ir-keytable" 7 9 (face orderless-match-face-0))
  #("iptables-legacy-restore" 3 5 (face orderless-match-face-0))
  #("iptables" 3 5 (face orderless-match-face-0))
  #("ip6tables" 4 6 (face orderless-match-face-0))
  #("ip6tables-translate" 4 6 (face orderless-match-face-0))
  #("iptables-nft-restore" 3 5 (face orderless-match-face-0))
  #("arptables-nft-save" 4 6 (face orderless-match-face-0))
  #("ebtables-nft-save" 3 5 (face orderless-match-face-0))
  #("iptables-apply" 3 5 (face orderless-match-face-0))
  #("byobu-enable" 8 10 (face orderless-match-face-0))
  #("iptables-save" 3 5 (face orderless-match-face-0))
  #("byobu-disable-prompt" 9 11 (face orderless-match-face-0))
  #("iptables-nft" 3 5 (face orderless-match-face-0))
  #("ip6tables-legacy-save" 4 6 (face orderless-match-face-0))
  #("update-mime-database" 15 17 (face orderless-match-face-0))
  #("gen-enc-table" 9 11 (face orderless-match-face-0))
  #("shtab" 3 5 (face orderless-match-face-0))
  #("dnssec-keyfromlabel" 15 17 (face orderless-match-face-0))
  #("byobu-enable-prompt" 8 10 (face orderless-match-face-0))
  #("iptables-legacy-save" 3 5 (face orderless-match-face-0))
  #("update-desktop-database" 18 20 (face orderless-match-face-0))
  #("xtables-monitor" 2 4 (face orderless-match-face-0))
  #("iptables-translate" 3 5 (face orderless-match-face-0))
  #("e2label" 3 5 (face orderless-match-face-0))

感觉像是windows的问题,你当前major-mode是shell-mode,company补全返回的是文件名,win的IO性能拉跨,如果当前目录文件太多就会这样吧。。

是的,看见一堆的dll我也觉得是windows的问题,但是我的.zshrc在wsl下的home目录啊……这是怎么补出这样一堆候选的

显然是这个变量的问题

谢谢,感觉确实是的,

sudo fd 'portabledeviceapi.mof' /
/mnt/c/Windows/WinSxS/wow64_microsoft-windows-wpd-portabledeviceapi_31bf3856ad364e35_10.0.22000.1_none_ab990e3e2533c598/portabledeviceapi.mof

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Program Files/ImageMagick-7.1.0-Q16-HDRI:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/mnt/c/Program Files/dotnet/:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files (x86)/dotnet/:/mnt/c/Program Files/Wolfram Research/WolframScript/:/mnt/c/Users/wang1/AppData/Local/Microsoft/WindowsApps:/mnt/c/Program Files/Bandizip/:/mnt/c/Program Files/JetBrains/PyCharm Community Edition 2021.3.2/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl

找了一下上面补全项当中的一个,明明也不在PATH当中,我不理解这是怎么被刨出来的,按照这个逻辑的话,难道其实遍历了所有的文件来匹配?

sh-completion-at-point-function这个函数我不太清楚该怎么改,这个搜索的深度我觉得太夸张了一点

这个不就在 path 里么,/mnt/c/Windows

你这 path 这么长,论坛都没法引用了。

把不必要的清理掉吧h

原来如此!好像有点明白了。之前的想法是,linux下的PATH不是递归的,既然没有/a/b/c只有/a就应该搜索不到/a/b/c/d。但是事实是,作为补全的话/a/b/c/d又确实是/a开头的补全项,所以才导致了这个情况……

能否在不改动PATH的前提下,把这个搜索的深度给限制一下呢?