Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Ohmyzsh
Commits
a952854c
Commit
a952854c
authored
Dec 27, 2019
by
Marc Cornellà
Browse files
gnu-utils: add README, simplify plugin
parent
59930902
Changes
2
Show whitespace changes
Inline
Side-by-side
plugins/gnu-utils/README.md
0 → 100644
View file @
a952854c
# gnu-utils plugin
This plugin binds GNU coreutils to their default names, so that you don't have
to call them using their prefixed name, which starts with
`g`
. This is useful
in systems which don't have GNU coreutils installed by default, mainly macOS
or FreeBSD, which use BSD coreutils.
To use it, add
`gnu-utils`
to the plugins array in your zshrc file:
```
zsh
plugins
=(
... gnu-utils
)
```
The plugin works by changing the path that the command hash points to, so
instead of
`ls`
pointing to
`/bin/ls`
, it points to wherever
`gls`
is
installed.
Since
`hash -rf`
or
`rehash`
refreshes the command hashes, it also wraps
`hash`
and
`rehash`
so that the coreutils binding is always done again
after calling these two commands.
Look at the source code of the plugin to see which GNU coreutils are tried
to rebind. Open an issue if there are some missing.
## Other methods
The plugin also documents two other ways to do this:
1.
Using a function wrapper, such that, for example, there exists a function
named
`ls`
which calls
`gls`
instead. Since functions have a higher preference
than commands, this ends up calling the GNU coreutil. It has also a higher
preference over shell builtins (
`gecho`
is called instead of the builtin
`echo`
).
2.
Using an alias. This has an even higher preference than functions, but they
could be overridden because of a user setting.
## Author
-
[
Sorin Ionescu
](
https://github.com/sorin-ionescu
)
.
plugins/gnu-utils/gnu-utils.plugin.zsh
View file @
a952854c
...
...
@@ -5,9 +5,12 @@
# VERSION: 1.0.0
# ------------------------------------------------------------------------------
# Detect if GNU coreutils are installed by looking for gwhoami
if
[[
!
-x
"
${
commands
[gwhoami]
}
"
]]
;
then
return
fi
if
[[
-x
"
${
commands
[gwhoami]
}
"
]]
;
then
__gnu_utils
()
{
__gnu_utils
()
{
emulate
-L
zsh
local
gcmds
local
gcmd
...
...
@@ -36,48 +39,45 @@ if [[ -x "${commands[gwhoami]}" ]]; then
gcmds+
=(
'gsed'
'gtar'
'gtime'
)
for
gcmd
in
"
${
gcmds
[@]
}
"
;
do
#
# Do nothing if the command isn't found
((
${
+commands[
$gcmd
]
}
))
||
continue
# This method allows for builtin commands to be primary but it's
# lost if hash -r or rehash -f is executed. Thus, those two
# functions have to be wrapped.
#
((
${
+commands[
$gcmd
]
}
))
&&
hash
${
gcmd
[2,-1]
}
=
${
commands
[
$gcmd
]
}
hash
${
gcmd
[2,-1]
}
=
${
commands
[
$gcmd
]
}
#
# This method generates wrapper functions.
# It will override shell builtins.
#
# (( ${+commands[$gcmd]} )) && \
# eval "function $gcmd[2,-1]() { \"${prefix}/${gcmd//"["/"\\["}\" \"\$@\"; }"
#
# This method is inflexible since the aliases are at risk of being
# overridden resulting in the BSD coreutils being called.
#
# (( ${+commands[$gcmd]} )) && \
# alias "$gcmd[2,-1]"="${prefix}/${gcmd//"["/"\\["}"
done
return
0
}
__gnu_utils
;
}
__gnu_utils
function
hash
()
{
function
hash
()
{
if
[[
"
$*
"
=
~
"-(r|f)"
]]
;
then
builtin hash
"
$@
"
__gnu_utils
else
builtin hash
"
$@
"
fi
}
}
function
rehash
()
{
function
rehash
()
{
if
[[
"
$*
"
=
~
"-f"
]]
;
then
builtin
rehash
"
$@
"
__gnu_utils
else
builtin
rehash
"
$@
"
fi
}
fi
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment