blob: bbdb2230138fe28452da92088ef2da0c411b1321 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
#!/usr/bin/env fish
# nixos-config - My current NixOS configuration
#
# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# This file is part of my nixos-config.
#
# You should have received a copy of the License along with this program.
# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
# This was taken from the
# `${pkgs.nix-index}/etc/profile.d/command-not-found.sh` file on 2024-02-28
function _log
printf $argv >&2
end
function _bail
__fish_default_command_not_found_handler $argv
return "$status"
end
function _common_prefix
set --function prefix
for str in $argv
set position 1
for c in (string split '' "$str")
if test -z $prefix[$position]
set prefix[$position] "$c"
else if test $prefix[$position] != "$c"
if test $position = 1
# The first letter of the prefix mis-matched.
# As such there is no shared prefix, and we can simple bail early.
echo ""
return
else
set prefix $prefix[1..(math $position - 1)]
end
break
end
set position (math $position + 1)
end
end
echo "$(string join "" $prefix)"
end
function fish_command_not_found
# Only run if it's an interactive shell
if not status is-interactive
return (_bail $argv)
end
# The nixpkgs flake should always be available on NixOS
set --local toplevel nixpkgs
set --local cmd "$argv[1]"
set --local attrs "$(nix-locate --minimal --no-group --type x --type s --whole-name --at-root "/bin/$cmd")"
if test -n "$attrs"
set --function len "$(echo "$attrs" | count)"
else
set --function len 0
end
switch "$len"
case 0
case 1 or '*'
_log "The program '%s' is currently not installed.\n" "$cmd"
end
switch "$len"
case 0
return (_bail $argv)
case 1
# If only one package provides this, then we can invoke it
# without asking the user.
# These will not return 127 if they worked correctly.
_log "A shell will be opened with it.\n"
if nix build "$toplevel#$attrs" --no-link
nix shell "$toplevel#$attrs"
return "$status"
else
_log "Failed to build: '%s#%s'\n" "$toplevel" "$attrs"
return (_bail $argv)
end
case '*'
_log "It is provided by several packages. You can run it load it with:\n"
set --local counter 0
set --local attrs $(echo $attrs)
for attr in $attrs
_log "%3s)" "$counter"
_log " nix shell %s#%s\n" "$toplevel" "$attr";
set counter "$(math "$counter" + 1)"
end
commandline "nix shell $toplevel#$(_common_prefix $attrs)"
end
# command not found should always exit with 127
return 127
end
|