mirror of
https://github.com/skywind3000/z.lua
synced 2026-03-24 08:39:49 +00:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4d4dc8802b | ||
|
|
761b3ebf31 | ||
|
|
4e7ecde314 | ||
|
|
e5c78e3087 | ||
|
|
1fb4f25744 | ||
|
|
6057644adb | ||
|
|
dc02feb424 |
14
README.md
14
README.md
@@ -24,7 +24,6 @@ For example, `z foo bar` would match `/foo/bar` but not `/bar/foo`.
|
||||
- Interactive selection enables you to choose where to go before cd.
|
||||
- Intergrated with FZF (optional) for interactive selection and completion.
|
||||
- Quickly go back to a parent directory instead of typing "cd ../../..".
|
||||
- Cooperate with [fz](https://github.com/changyuheng/fz) to provide better completion, see [FAQ](https://github.com/skywind3000/z.lua/wiki/FAQ#fzsh-for-better-completion).
|
||||
- Corresponding experience in different shells and operating systems.
|
||||
- Compatible with Lua 5.1, 5.2 and 5.3+
|
||||
- Self contained, distributed as a single `z.lua` script, no other dependence.
|
||||
@@ -35,7 +34,7 @@ For example, `z foo bar` would match `/foo/bar` but not `/bar/foo`.
|
||||
```bash
|
||||
z foo # cd to most frecent dir matching foo
|
||||
z foo bar # cd to most frecent dir matching foo and bar
|
||||
z -r foo # cd to highest ranked dir matching foo
|
||||
z -r foo # cd to the highest ranked dir matching foo
|
||||
z -t foo # cd to most recently accessed dir matching foo
|
||||
z -l foo # list matches instead of cd
|
||||
z -c foo # restrict matches to subdirs of $PWD
|
||||
@@ -220,14 +219,14 @@ If no match is found, it will fall back to default matching method.
|
||||
|
||||
- Skip the current directory:
|
||||
|
||||
when you are calling `z xxx` but the best match is the current directory, z.lua will choose the 2nd best match result for you. Assuming the database:
|
||||
When you are calling `z xxx` but the best match is the current directory, z.lua will choose the 2nd best match result for you. Assuming the database:
|
||||
|
||||
10 /Users/Great_Wall/.rbenv/versions/2.4.1/lib/ruby/gems
|
||||
20 /Library/Ruby/Gems/2.0.0/gems
|
||||
|
||||
When I use `z gems` by default, it will take me to `/Library/Ruby/Gems/2.0.0/gems`, but it's not what I want, so I press up arrow and execute `z gems` again, it will take me to `/Users/Great_Wall/.rbenv/versions/2.4.1/lib/ruby/gems` and this what I want.
|
||||
|
||||
Of course I can always use `z env gems` to indicate what I want precisely. Skip the current directory means when you use `z xxx` you always want to change directory instead of stay in the same directory and do nothing if current directory is the best match.
|
||||
Of course, I can always use `z env gems` to indicate what I want precisely. Skip the current directory means when you use `z xxx` you always want to change directory instead of stay in the same directory and do nothing if current directory is the best match.
|
||||
|
||||
The default matching method is designed to be compatible with original z.sh, but the enhanced matching method is much more handy and exclusive to z.lua.
|
||||
|
||||
@@ -236,7 +235,7 @@ The default matching method is designed to be compatible with original z.sh, but
|
||||
|
||||
By default, z.lua will add current directory to database each time before display command prompt (correspond with z.sh). But there is an option to allow z.lua add path only if current working directory changed.
|
||||
|
||||
To enable this, you can set `$_ZL_ADD_ONCE` to `1` before init z.lua. Or you can init z.lua on linux like this:
|
||||
To enable this, you can set `$_ZL_ADD_ONCE` to `1` before init z.lua. Or you can initialize z.lua on linux like this:
|
||||
|
||||
````bash
|
||||
eval "$(lua /path/to/z.lua --init bash once)"
|
||||
@@ -286,7 +285,7 @@ NOTE: For fish shell, this feature requires fish 2.7.0 or above. You can specify
|
||||
New option `"-b"` can quickly go back to a specific parent directory in bash instead of typing "cd ../../.." redundantly.
|
||||
|
||||
- **(No argument)**: `cd` into the project root, the project root the nearest parent directory with `.git`/`.hg`/`.svn` in it
|
||||
- **(One argument)**: `cd` into the closest parent starting with keyword, if not find, goto the parent containing keyword.
|
||||
- **(One argument)**: `cd` into the closest parent starting with keyword, if not find, go to the parent containing keyword.
|
||||
- **(Two arguments)**: replace the first value with the second one (in the current path).
|
||||
|
||||
Let's start by aliasing `z -b` to `zb`:
|
||||
@@ -419,7 +418,7 @@ Don't forget to read the [Frequently Asked Questions](https://github.com/skywind
|
||||
|
||||
## Benchmark
|
||||
|
||||
The slowest part is adding path to history data file. It will run every time when you press enter (installed in $PROMPT_COMMAND). so I profile it on my nas:
|
||||
The slowest part is adding path to history data file. It will run every time when you press enter (installed in $PROMPT_COMMAND). So I profile it on my NAS:
|
||||
|
||||
```bash
|
||||
$ time autojump --add /tmp
|
||||
@@ -457,6 +456,7 @@ As you see, z.lua is the fastest one and requires less resource.
|
||||
|
||||
## History
|
||||
|
||||
- 1.5.4 (2019-02-19): fixed: file/path existence detection fails on read-only fs (closed [#49](https://github.com/skywind3000/z.lua/issues/49) by [@contrun](https://github.com/contrun)).
|
||||
- 1.5.3 (2019-02-17): new `$_ZL_FZF_FLAG` for passing additional flags to fzf, add `-e` argument to fzf.
|
||||
- 1.5.2 (2019-02-16): be aware of all arguments in fzf completion.
|
||||
- 1.5.1 (2019-02-15): new: simulated dir stack by `z -`, `z --` and `z -{num}`.
|
||||
|
||||
31
z.lua
31
z.lua
@@ -4,7 +4,7 @@
|
||||
-- z.lua - a cd command that learns, by skywind 2018, 2019
|
||||
-- Licensed under MIT license.
|
||||
--
|
||||
-- Version 1.5.3, Last Modified: 2019/02/17 16:22
|
||||
-- Version 1.5.4, Last Modified: 2019/02/19 11:18
|
||||
--
|
||||
-- * 10x faster than fasd and autojump, 3x faster than z.sh
|
||||
-- * available for posix shells: bash, zsh, sh, ash, dash, busybox
|
||||
@@ -158,6 +158,10 @@ function string:startswith(text)
|
||||
return false
|
||||
end
|
||||
|
||||
function string:endswith(text)
|
||||
return text == "" or self:sub(-#text) == text
|
||||
end
|
||||
|
||||
function string:lstrip()
|
||||
if self == nil then return nil end
|
||||
local s = self:gsub('^%s+', '')
|
||||
@@ -418,6 +422,8 @@ end
|
||||
function os.path.isdir(pathname)
|
||||
if pathname == '/' then
|
||||
return true
|
||||
elseif pathname == '' then
|
||||
return false
|
||||
elseif windows then
|
||||
if pathname == '\\' then
|
||||
return true
|
||||
@@ -425,15 +431,11 @@ function os.path.isdir(pathname)
|
||||
return true
|
||||
end
|
||||
end
|
||||
local name = pathname .. '/'
|
||||
local ok, err, code = os.rename(name, name)
|
||||
if not ok then
|
||||
if code == 13 then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
local name = pathname
|
||||
if (not name:endswith('/')) and (not name:endswith('\\')) then
|
||||
name = name .. '/'
|
||||
end
|
||||
return true
|
||||
return os.path.exists(name)
|
||||
end
|
||||
|
||||
|
||||
@@ -445,6 +447,12 @@ function os.path.exists(name)
|
||||
if not ok then
|
||||
if code == 13 then
|
||||
return true
|
||||
elseif code == 30 then
|
||||
local f = io.open(name,"r")
|
||||
if f ~= nil then
|
||||
io.close(f)
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
@@ -1266,13 +1274,14 @@ function z_match(patterns, method, subdir)
|
||||
subdir = subdir ~= nil and subdir or false
|
||||
local M = data_load(DATA_FILE)
|
||||
M = data_select(M, patterns, false)
|
||||
M = data_filter(M)
|
||||
if Z_MATCHNAME then
|
||||
local N = data_select(M, patterns, true)
|
||||
N = data_filter(N)
|
||||
if #N > 0 then
|
||||
M = N
|
||||
end
|
||||
end
|
||||
M = data_filter(M)
|
||||
M = data_update_frecent(M)
|
||||
if method == 'time' then
|
||||
current = os.time()
|
||||
@@ -1325,7 +1334,7 @@ end
|
||||
-----------------------------------------------------------------------
|
||||
function z_print(M, weight, number)
|
||||
local N = {}
|
||||
local maxsize = 10
|
||||
local maxsize = 9
|
||||
local numsize = string.len(tostring(#M))
|
||||
for _, item in pairs(M) do
|
||||
local record = {}
|
||||
|
||||
Reference in New Issue
Block a user