mirror of
https://github.com/skywind3000/z.lua
synced 2026-03-22 15:49:47 +00:00
Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
38c1741f4f | ||
|
|
fdff5c5e1e | ||
|
|
b691d537f2 | ||
|
|
472925ac92 | ||
|
|
5ba0e50894 | ||
|
|
c769dba4dd | ||
|
|
bbca83c9a5 | ||
|
|
53c127a4a2 | ||
|
|
5f7fa928b6 | ||
|
|
68de23ecef | ||
|
|
5ea08c5dac | ||
|
|
9dd0fec7ed | ||
|
|
fe11dd30c5 | ||
|
|
db92fa0a1c | ||
|
|
b1702839d2 | ||
|
|
1a0428f54e | ||
|
|
31e9d42d08 | ||
|
|
14b942634c | ||
|
|
6cfe2150e9 |
13
README.cn.md
13
README.cn.md
@@ -269,7 +269,7 @@ PS:你可以使用 `$_ZL_FZF` 环境变量来精确指明 fzf 的可执行路
|
||||
- **(单个参数)**:`cd` 到离当前目录最近的以关键字开头的父目录,如果找不到就尝试跳到包含关键字的父目录。
|
||||
- **(两个参数)**:将当前路径中的第一个关键词替换为第二个关键词。
|
||||
|
||||
为了使用简便,我们继续将 `z -b` 取个别名成 `zb`:
|
||||
先将 `z -b` 别名成 `zb`:
|
||||
|
||||
```bash
|
||||
# 一直向上退到项目根目录(就是里面有一个 .git 目录的地方)
|
||||
@@ -350,23 +350,22 @@ $ z -
|
||||
=> cd -
|
||||
```
|
||||
|
||||
这个 `dirstack` 是根据 z.lua 的路径历史数据库计算的出来的,所以和具体的 shell 或者操作系统都没有关系。你退出再登陆不会丢失这些路径历史,不同的 shell 之间也可以共享同一份历史数据。
|
||||
这个 `dirstack` 是根据 z.lua 的路径历史数据库计算的出来的,和具体的 shell 或者操作系统无关。你退出再登陆不会丢失这些记录,不同的 shell 之间也可以共享同一份记录。
|
||||
|
||||
此外,还有另外一种方法,通过使用前面提到的 `-I` 和 `-t` 参数组和,可以使用 fzf 进行交互式选择:
|
||||
此外,还能通过前面提到的 `-I` 和 `-t` 参数组和,使用 fzf 选择最近去过的目录:
|
||||
|
||||
```bash
|
||||
alias zh='z -I -t .'
|
||||
```
|
||||
|
||||
首先定义个新的别名 `zh`(回到历史路径的意思),我们使用了 `-t` 参数来告诉 `z.lua` 按照时间戳作为权重进行排序,同时 `-I` 启用 fzf 进行搜索,最后的句号代表任意路径。
|
||||
方便起见,定义个新的别名 `zh`(回到历史路径的意思),我们用 `-t` 参数来告诉 `z.lua` 按时间戳为权重排序,同时 `-I` 启用 fzf 搜索,最后句号代表任意路径。
|
||||
|
||||
那么当我们在命令行敲入 zh 时,就可以用 fzf 选择最近呆过的路径了:
|
||||
那么当我们在命令行敲入 zh 时,就可以用 fzf 进行历史路径操作了:
|
||||
|
||||

|
||||
|
||||
第一列数据代表该路径多少秒以前访问过,第二列是路径名称。此时,你可以试着敲几个字母,用 fzf 的字符串模糊匹配进行定位,或者用光标键的上和下(CTRL+J/K 也可以)来上下移动,最后按回车 cd 过去,或者 ESC 放弃。
|
||||
第一列上次访问距今多少秒,第二列是目录名。你可以试着敲几个字母,用 fzf 的字符串模糊匹配进行定位,或者用光标键的上和下(CTRL+J/K 也可以)来上下移动,最后按回车 cd 过去,或者 ESC 放弃。
|
||||
|
||||
注意:最好把增强匹配模式打开,这样查看历史路径时可以把当前路径过滤掉。
|
||||
|
||||
|
||||
## Tips
|
||||
|
||||
10
README.md
10
README.md
@@ -275,9 +275,9 @@ Now you can input some space separated keywords (no order required) or use `CTRL
|
||||
|
||||
Of course, you can always give more keywords to `z` command to match your destination precisely. `"z -I"` is similar to `"z -i"`, but use fzf. Both `"-i"` and `"-I"` provide you another way for path navigation.
|
||||
|
||||
Usually, `z -I` can be aliased to `zf` (z + fuzzy finder) for convenience. If there are only one path matched, `z -I` will jump to it directly, fzf will only be invoked for multiple matches.
|
||||
Usually, `z -I` can be aliased to `zf` (z + fuzzy finder) for convenience. If there are only one path matched, `z -I` will jump to it directly, fzf will only be invoked for multiple matches. `"z -I ."` or `"zf ."` can be used to use fzf select from entire database.
|
||||
|
||||
`"z -I ."` or `"zf ."` can be used to use fzf select from entire database. Environment variable `_ZL_FZF_FLAG` is for passing additional arguments to fzf.
|
||||
For more information about this, please visit [wiki - effective with fzf](https://github.com/skywind3000/z.lua/wiki/Effective-with-fzf).
|
||||
|
||||
NOTE: For fish shell, this feature requires fish 2.7.0 or above. You can specify fzf executable in `$_ZL_FZF` environment variable, `"fzf"` will be called by default.
|
||||
|
||||
@@ -458,6 +458,11 @@ As you see, z.lua is the fastest one and requires less resource.
|
||||
|
||||
## History
|
||||
|
||||
- 1.5.10 (2019-03-01): Prevent writing file racing.
|
||||
- 1.5.9 (2019-02-25): `z -b` should not match current directory (close #56).
|
||||
- 1.5.8 (2019-02-21): new `$_ZL_FZF_HEIGHT` to control `--height` parameter in fzf.
|
||||
- 1.5.7 (2019-02-21): rename `$_ZL_FZF_SORT` to `$_ZL_INT_SORT` it will affect both `-i` and `-I`.
|
||||
- 1.5.6 (2019-02-20): set `$_ZL_FZF_SORT` to 1 to sort directories by alphabet in fzf.
|
||||
- 1.5.5 (2019-02-20): `$_ZL_FZF_FLAG` can be used to override fzf flags, default to "+s -e".
|
||||
- 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.
|
||||
@@ -488,6 +493,7 @@ As you see, z.lua is the fastest one and requires less resource.
|
||||
|
||||
This project needs help for the tasks below:
|
||||
|
||||
- [ ] Support csh/tcsh.
|
||||
- [ ] Completion: Actually I got little knowledge in completion, and need help to improve it.
|
||||
- [ ] Completion: Implement completion for Power Shell.
|
||||
- [ ] Completion: Implement completion for different arguments.
|
||||
|
||||
BIN
images/step1.png
Normal file
BIN
images/step1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
BIN
images/step2.png
Normal file
BIN
images/step2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
BIN
images/step3.png
Normal file
BIN
images/step3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.6 KiB |
BIN
images/step4.png
Normal file
BIN
images/step4.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.8 KiB |
37
z.lua
37
z.lua
@@ -4,7 +4,7 @@
|
||||
-- z.lua - a cd command that learns, by skywind 2018, 2019
|
||||
-- Licensed under MIT license.
|
||||
--
|
||||
-- Version 1.5.5, Last Modified: 2019/02/20 12:07
|
||||
-- Version 1.5.10, Last Modified: 2019/03/01 13:08
|
||||
--
|
||||
-- * 10x faster than fasd and autojump, 3x faster than z.sh
|
||||
-- * available for posix shells: bash, zsh, sh, ash, dash, busybox
|
||||
@@ -770,6 +770,10 @@ end
|
||||
-----------------------------------------------------------------------
|
||||
function os.environ(name, default)
|
||||
local value = os.getenv(name)
|
||||
if os.envmap ~= nil and type(os.envmap) == 'table' then
|
||||
local t = os.envmap[name]
|
||||
value = (t ~= nil and type(t) == 'string') and t or value
|
||||
end
|
||||
if value == nil then
|
||||
return default
|
||||
elseif type(default) == 'boolean' then
|
||||
@@ -956,11 +960,16 @@ function data_save(filename, M)
|
||||
fp = io.open(filename, 'w')
|
||||
else
|
||||
math.random_init()
|
||||
tmpname = filename .. '.' .. tostring(os.time())
|
||||
tmpname = tmpname .. math.random_string(8)
|
||||
local rnd = os.getenv('_ZL_RANDOM')
|
||||
tmpname = tmpname .. '' .. (rnd and rnd or '')
|
||||
-- print('tmpname: '..tmpname)
|
||||
while true do
|
||||
tmpname = filename .. '.' .. tostring(os.time())
|
||||
tmpname = tmpname .. math.random_string(8)
|
||||
local rnd = os.getenv('_ZL_RANDOM')
|
||||
tmpname = tmpname .. '' .. (rnd and rnd or '')
|
||||
if not os.path.exists(tmpname) then
|
||||
-- print('tmpname: '..tmpname)
|
||||
break
|
||||
end
|
||||
end
|
||||
fp = io.open(tmpname, 'w')
|
||||
end
|
||||
if fp == nil then
|
||||
@@ -1427,6 +1436,9 @@ function z_cd(patterns)
|
||||
elseif Z_INTERACTIVE == 0 then
|
||||
return M[1].name
|
||||
end
|
||||
if os.environ('_ZL_INT_SORT', false) then
|
||||
table.sort(M, function (a, b) return a.name < b.name end)
|
||||
end
|
||||
local retval = nil
|
||||
if Z_INTERACTIVE == 1 then
|
||||
PRINT_MODE = '<stderr>'
|
||||
@@ -1454,8 +1466,9 @@ function z_cd(patterns)
|
||||
cmd = ((fzf == '') and 'fzf' or fzf) .. ' ' .. cmd .. ' ' .. flag
|
||||
if not windows then
|
||||
tmpname = os.tmpname()
|
||||
if not os.environ('_ZL_FZF_FULLSCR', false) then
|
||||
cmd = cmd .. ' --height 35%'
|
||||
local height = os.environ('_ZL_FZF_HEIGHT', '35%')
|
||||
if height ~= nil and height ~= '' and height ~= '0' then
|
||||
cmd = cmd .. ' --height ' .. height
|
||||
end
|
||||
cmd = cmd .. ' < "' .. tmpname .. '"'
|
||||
else
|
||||
@@ -1547,6 +1560,7 @@ function cd_backward(args, options, pwd)
|
||||
end
|
||||
return os.path.normpath(path)
|
||||
else
|
||||
pwd = os.path.split(pwd)
|
||||
local test = windows and pwd:gsub('\\', '/') or pwd
|
||||
local key = windows and args[1]:lower() or args[1]
|
||||
if not key:match('%u') then
|
||||
@@ -1997,9 +2011,10 @@ function z_shell_init(opts)
|
||||
end
|
||||
print(script_complete_bash)
|
||||
if opts.fzf ~= nil then
|
||||
fzf_cmd = "fzf --nth 2 --reverse --inline-info --tac "
|
||||
if not os.environ('_ZL_FZF_FULLSCR', false) then
|
||||
fzf_cmd = fzf_cmd .. ' --height 35%'
|
||||
fzf_cmd = "fzf --nth 2.. --reverse --inline-info --tac "
|
||||
local height = os.environ('_ZL_FZF_HEIGHT', '35%')
|
||||
if height ~= nil and height ~= '' and height ~= '0' then
|
||||
fzf_cmd = fzf_cmd .. ' --height ' .. height .. ' '
|
||||
end
|
||||
local flag = os.environ('_ZL_FZF_FLAG', '')
|
||||
flag = (flag == '' or flag == nil) and '+s -e' or flag
|
||||
|
||||
@@ -6,14 +6,14 @@ ZLUA_SCRIPT="${0:A:h}/z.lua"
|
||||
|
||||
# search lua executable
|
||||
if [[ -z "$ZLUA_EXEC" ]]; then
|
||||
if [[ -x "$(which lua)" ]]; then
|
||||
ZLUA_EXEC="$(which lua)"
|
||||
elif [[ -x "$(which lua5.3)" ]]; then
|
||||
ZLUA_EXEC="$(which lua5.3)"
|
||||
elif [[ -x "$(which lua5.2)" ]]; then
|
||||
ZLUA_EXEC="$(which lua5.2)"
|
||||
elif [[ -x "$(which lua5.1)" ]]; then
|
||||
ZLUA_EXEC="$(which lua5.1)"
|
||||
if [[ -x "$(command which lua)" ]]; then
|
||||
ZLUA_EXEC="$(command which lua)"
|
||||
elif [[ -x "$(command which lua5.3)" ]]; then
|
||||
ZLUA_EXEC="$(command which lua5.3)"
|
||||
elif [[ -x "$(command which lua5.2)" ]]; then
|
||||
ZLUA_EXEC="$(command which lua5.2)"
|
||||
elif [[ -x "$(command which lua5.1)" ]]; then
|
||||
ZLUA_EXEC="$(command which lua5.1)"
|
||||
else
|
||||
echo "Not find lua in your $PATH, please install it."
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user