mirror of
https://github.com/skywind3000/z.lua
synced 2026-03-22 15:49:47 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0effba4021 | ||
|
|
cada42e5ea | ||
|
|
b8b6d1afd6 | ||
|
|
4abe97f989 | ||
|
|
756d13d8fa |
32
README.cn.md
32
README.cn.md
@@ -14,11 +14,11 @@ z.lua 是一个快速路径切换工具,它会跟踪你在 shell 下访问过
|
|||||||
|
|
||||||
- 性能比 **z.sh** 快三倍,比 **fasd** / **autojump** 快十倍以上。
|
- 性能比 **z.sh** 快三倍,比 **fasd** / **autojump** 快十倍以上。
|
||||||
- 支持 Posix Shell:bash, zsh, dash, sh, ash, busybox 等等。
|
- 支持 Posix Shell:bash, zsh, dash, sh, ash, busybox 等等。
|
||||||
- 支持 Fish Shell,Power Shell 和 Windows cmd。
|
- 支持 Fish Shell,Power Shell 和 Windows cmd。
|
||||||
- 使用增强匹配算法,更准确的带你去到你想去的地方。
|
- 使用增强匹配算法,更准确的带你去到你想去的地方。
|
||||||
- 低占用,能够仅在当前路径改变时才更新数据库(将 `$_ZL_ADD_ONCE` 设成 1)。
|
- 低占用,能够仅在当前路径改变时才更新数据库(将 `$_ZL_ADD_ONCE` 设成 1)。
|
||||||
- 交互选择模式,如果有多个匹配结果的话,跳转前允许你进行选择。
|
- 交互选择模式,如果有多个匹配结果的话,跳转前允许你进行选择。
|
||||||
- 集成 fzf (可选),可以用来做可视化选择或者参数补全。
|
- 集成 fzf (可选),可以用来做可视化选择或者参数补全。
|
||||||
- 快速跳转到父目录,或者项目根目录,代替反复 “cd ../../.." 。
|
- 快速跳转到父目录,或者项目根目录,代替反复 “cd ../../.." 。
|
||||||
- 兼容 lua 5.1, 5.2 和 5.3 以上版本。
|
- 兼容 lua 5.1, 5.2 和 5.3 以上版本。
|
||||||
- 自包含且无额外依赖,单个 `z.lua` 文件完成所有工作。
|
- 自包含且无额外依赖,单个 `z.lua` 文件完成所有工作。
|
||||||
@@ -42,10 +42,10 @@ z -b foo # 跳转到父目录中名称以 foo 开头的那一级
|
|||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
- Posix Shells(Bash、zsh、dash、sh 或 BusyBox 等):
|
- Posix Shells(Bash、zsh、dash、sh 或 BusyBox 等):
|
||||||
|
|
||||||
在你的 `.bashrc`, `.zshrc` 或者 `.profile` 文件中按 shell 类型添加对应语句:
|
在你的 `.bashrc`, `.zshrc` 或者 `.profile` 文件中按 shell 类型添加对应语句:
|
||||||
|
|
||||||
eval "$(lua /path/to/z.lua --init bash)" # BASH 初始化
|
eval "$(lua /path/to/z.lua --init bash)" # BASH 初始化
|
||||||
eval "$(lua /path/to/z.lua --init zsh)" # ZSH 初始化
|
eval "$(lua /path/to/z.lua --init zsh)" # ZSH 初始化
|
||||||
eval "$(lua /path/to/z.lua --init posix)" # Posix shell 初始化
|
eval "$(lua /path/to/z.lua --init posix)" # Posix shell 初始化
|
||||||
@@ -79,8 +79,8 @@ z -b foo # 跳转到父目录中名称以 foo 开头的那一级
|
|||||||
|
|
||||||
但是第二种方法需要记得在 z.lua 位置改变或者 lua 版本升级后需要重新生成。
|
但是第二种方法需要记得在 z.lua 位置改变或者 lua 版本升级后需要重新生成。
|
||||||
|
|
||||||
- Power Shell:
|
- Power Shell:
|
||||||
|
|
||||||
在你 Power Shell 的配置文件 `profile.ps1` 中放入下面语句:
|
在你 Power Shell 的配置文件 `profile.ps1` 中放入下面语句:
|
||||||
|
|
||||||
iex ($(lua /path/to/z.lua --init powershell) -join "`n")
|
iex ($(lua /path/to/z.lua --init powershell) -join "`n")
|
||||||
@@ -90,7 +90,7 @@ z -b foo # 跳转到父目录中名称以 foo 开头的那一级
|
|||||||
|
|
||||||
- 将 z.lua 和 z.cmd 拷贝到 clink 的安装目录。
|
- 将 z.lua 和 z.cmd 拷贝到 clink 的安装目录。
|
||||||
- 将 clink 的安装目录添加到 `%PATH%` (z.cmd 可以被任意位置调用到)。
|
- 将 clink 的安装目录添加到 `%PATH%` (z.cmd 可以被任意位置调用到)。
|
||||||
- 保证 lua 命令在你的 `%PATH%` 环境变量中。
|
- 保证 lua 命令在你的 `%PATH%` 环境变量中。
|
||||||
|
|
||||||
|
|
||||||
- Windows cmder:
|
- Windows cmder:
|
||||||
@@ -161,7 +161,7 @@ Frecency 是一个由 'recent' 和 'frequency' 组成的合成词,这个术语
|
|||||||
|
|
||||||
对于一个给定的正则关键字序列(即 z 命令后面的参数),只有同时满足两个条件才算匹配成功:
|
对于一个给定的正则关键字序列(即 z 命令后面的参数),只有同时满足两个条件才算匹配成功:
|
||||||
|
|
||||||
1. 正则关键字将按顺序进行匹配(这条和默认匹配法相同)。
|
1. 正则关键字将按顺序进行匹配(这条和默认匹配法相同)。
|
||||||
2. 最后一个关键字可以和路径名的最后一段相匹配。
|
2. 最后一个关键字可以和路径名的最后一段相匹配。
|
||||||
|
|
||||||
如果两条规则同时启用找不到任何结果,那么将会退回到只用规则 1 进行筛选,这两条规则是参考 fasd 引入的。
|
如果两条规则同时启用找不到任何结果,那么将会退回到只用规则 1 进行筛选,这两条规则是参考 fasd 引入的。
|
||||||
@@ -182,7 +182,7 @@ Frecency 是一个由 'recent' 和 'frequency' 组成的合成词,这个术语
|
|||||||
小技巧:
|
小技巧:
|
||||||
|
|
||||||
- 如果你在增强匹配算法下,想让最后一个关键字不当匹配最后一段路径名,还可以像默认匹配算法中一样匹配路径的其他部分的话,你可以在最后加一个独立的 '$' 参数,比如:`"z wo $"`
|
- 如果你在增强匹配算法下,想让最后一个关键字不当匹配最后一段路径名,还可以像默认匹配算法中一样匹配路径的其他部分的话,你可以在最后加一个独立的 '$' 参数,比如:`"z wo $"`
|
||||||
- 如果你在增强匹配算法下,想让最后一个关键字匹配最后一段路径名以前的部分,那么可以增加一个斜杆参数,比如:`"z wo /"`。
|
- 如果你在增强匹配算法下,想让最后一个关键字匹配最后一段路径名以前的部分,那么可以增加一个斜杆参数,比如:`"z wo /"`。
|
||||||
|
|
||||||
|
|
||||||
- 如果没法匹配,同时又存在一条路径名和关键字相同,那么 cd 过去:
|
- 如果没法匹配,同时又存在一条路径名和关键字相同,那么 cd 过去:
|
||||||
@@ -265,7 +265,7 @@ PS:你可以使用 `$_ZL_FZF` 环境变量来精确指明 fzf 的可执行路
|
|||||||
|
|
||||||
`"-b"` 选项可以快速回到某一级父目录,避免重复的输入 "cd ../../.."。
|
`"-b"` 选项可以快速回到某一级父目录,避免重复的输入 "cd ../../.."。
|
||||||
|
|
||||||
- **(没有参数)**:`cd` 到项目根目录,即跳转到最近的包含 (.git/.svn/.hg) 的父目录。
|
- **(没有参数)**:`cd` 到项目根目录,即跳转到最近的包含 (.git/.svn/.hg) 的父目录。
|
||||||
- **(单个参数)**:`cd` 到离当前目录最近的以关键字开头的父目录,如果找不到就尝试跳到包含关键字的父目录。
|
- **(单个参数)**:`cd` 到离当前目录最近的以关键字开头的父目录,如果找不到就尝试跳到包含关键字的父目录。
|
||||||
- **(两个参数)**:将当前路径中的第一个关键词替换为第二个关键词。
|
- **(两个参数)**:将当前路径中的第一个关键词替换为第二个关键词。
|
||||||
|
|
||||||
@@ -302,6 +302,8 @@ export _ZL_ROOT_MARKERS=".git,.svn,.hg,.root,package.json"
|
|||||||
|
|
||||||
**Bonus**:`zb ..` 相当于 `cd ..`,`zb ...` 相当于 `cd ../..`,而 `zb ....` 相当于 `cd ../../..` 等等。 最后 `zb ..20` 等同于调用 `cd ..` 二十次。
|
**Bonus**:`zb ..` 相当于 `cd ..`,`zb ...` 相当于 `cd ../..`,而 `zb ....` 相当于 `cd ../../..` 等等。 最后 `zb ..20` 等同于调用 `cd ..` 二十次。
|
||||||
|
|
||||||
|
**Bonus**: 试试 `z -b -i` 以及 `z -b -I`,推荐把他们取个别名成 `zbi` 和 `zbf`。
|
||||||
|
|
||||||
|
|
||||||
## 补全功能
|
## 补全功能
|
||||||
|
|
||||||
|
|||||||
@@ -323,6 +323,7 @@ If you want `zb` jump back to a parent directory contains a `.root` or `package.
|
|||||||
|
|
||||||
**Bonus**: `zb ..` equals to `cd ..`, `zb ...` equals to `cd ../..` and `zb ....` equals to `cd ../../..`, and so on. Finally, `zb ..20` equals to `cd (..)x20`.
|
**Bonus**: `zb ..` equals to `cd ..`, `zb ...` equals to `cd ../..` and `zb ....` equals to `cd ../../..`, and so on. Finally, `zb ..20` equals to `cd (..)x20`.
|
||||||
|
|
||||||
|
**Bonus**: try `z -b -i` and `z -b -I` and you can alias them to `zbi` and `zbf`.
|
||||||
|
|
||||||
## Completion
|
## Completion
|
||||||
|
|
||||||
@@ -459,6 +460,7 @@ As you see, z.lua is the fastest one and requires less resource.
|
|||||||
|
|
||||||
## History
|
## History
|
||||||
|
|
||||||
|
- 1.8.3 (2020-02-09): new: `z -b -i` and `z -b -I` to jump backwards in interactive mode.
|
||||||
- 1.7.4 (2019-12-29): new: `$_ZL_HYPHEN` to treat hyphen as a normal character, see [here](https://github.com/skywind3000/z.lua/wiki/FAQ#how-to-input-a-hyphen---in-the-keyword-).
|
- 1.7.4 (2019-12-29): new: `$_ZL_HYPHEN` to treat hyphen as a normal character, see [here](https://github.com/skywind3000/z.lua/wiki/FAQ#how-to-input-a-hyphen---in-the-keyword-).
|
||||||
- 1.7.3 (2019-09-07): use [lua-filesystem](http://keplerproject.github.io/luafilesystem/) package if possible when `$_ZL_USE_LFS` is `1`.
|
- 1.7.3 (2019-09-07): use [lua-filesystem](http://keplerproject.github.io/luafilesystem/) package if possible when `$_ZL_USE_LFS` is `1`.
|
||||||
- 1.7.2 (2019-08-01): Improve bash/zsh shell compatibility by [@barlik](https://github.com/barlik).
|
- 1.7.2 (2019-08-01): Improve bash/zsh shell compatibility by [@barlik](https://github.com/barlik).
|
||||||
|
|||||||
97
z.lua
97
z.lua
@@ -1,10 +1,10 @@
|
|||||||
#! /usr/bin/env lua
|
#! /usr/bin/env lua
|
||||||
--=====================================================================
|
--=====================================================================
|
||||||
--
|
--
|
||||||
-- z.lua - a cd command that learns, by skywind 2018, 2019
|
-- z.lua - a cd command that learns, by skywind 2018, 2019, 2020
|
||||||
-- Licensed under MIT license.
|
-- Licensed under MIT license.
|
||||||
--
|
--
|
||||||
-- Version 1.7.4, Last Modified: 2019/12/29 04:52
|
-- Version 1.8.3, Last Modified: 2020/02/10 00:05
|
||||||
--
|
--
|
||||||
-- * 10x faster than fasd and autojump, 3x faster than z.sh
|
-- * 10x faster than fasd and autojump, 3x faster than z.sh
|
||||||
-- * available for posix shells: bash, zsh, sh, ash, dash, busybox
|
-- * available for posix shells: bash, zsh, sh, ash, dash, busybox
|
||||||
@@ -1585,7 +1585,7 @@ function z_cd(patterns)
|
|||||||
io.stderr:write('> ')
|
io.stderr:write('> ')
|
||||||
io.stderr:flush()
|
io.stderr:flush()
|
||||||
local input = io.read('*l')
|
local input = io.read('*l')
|
||||||
if input == nil then
|
if input == nil or input == '' then
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
local index = tonumber(input)
|
local index = tonumber(input)
|
||||||
@@ -1767,6 +1767,91 @@ function cd_minus(args, options)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
-- cd breadcrumbs: z -b -i, z -b -I
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
function cd_breadcrumbs(pwd, interactive)
|
||||||
|
local pwd = (pwd == nil or pwd == '') and os.pwd() or pwd
|
||||||
|
local pwd = os.path.normpath(pwd)
|
||||||
|
local path, _ = os.path.split(pwd)
|
||||||
|
local elements = {}
|
||||||
|
local interactive = interactive and interactive or 1
|
||||||
|
local fullname = os.environ('_ZL_FULL_PATH', false)
|
||||||
|
while true do
|
||||||
|
local head, name = os.path.split(path)
|
||||||
|
if head == path then -- reached root
|
||||||
|
table.insert(elements, {head, head})
|
||||||
|
break
|
||||||
|
elseif name ~= '' then
|
||||||
|
table.insert(elements, {name, path})
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
path = head
|
||||||
|
end
|
||||||
|
local tmpname = '/tmp/zlua.txt'
|
||||||
|
local fp = io.stderr
|
||||||
|
if interactive == 2 then
|
||||||
|
if not windows then
|
||||||
|
tmpname = os.tmpname()
|
||||||
|
else
|
||||||
|
tmpname = os.tmpname():gsub('\\', ''):gsub('%.', '')
|
||||||
|
tmpname = os.environ('TMP', '') .. '\\zlua_' .. tmpname .. '.txt'
|
||||||
|
end
|
||||||
|
fp = io.open(tmpname, 'w')
|
||||||
|
end
|
||||||
|
-- print table
|
||||||
|
local maxsize = string.len(tostring(#elements))
|
||||||
|
for i = #elements, 1, -1 do
|
||||||
|
local item = elements[i]
|
||||||
|
local name = item[1]
|
||||||
|
local text = string.rep(' ', maxsize - string.len(i)) .. tostring(i)
|
||||||
|
text = text .. ': ' .. (fullname and item[2] or item[1])
|
||||||
|
fp:write(text .. '\n')
|
||||||
|
end
|
||||||
|
if fp ~= io.stderr then
|
||||||
|
fp:close()
|
||||||
|
end
|
||||||
|
local retval = ''
|
||||||
|
-- select from stdin or fzf
|
||||||
|
if interactive == 1 then
|
||||||
|
io.stderr:write('> ')
|
||||||
|
io.stderr:flush()
|
||||||
|
retval = io.read('*l')
|
||||||
|
elseif interactive == 2 then
|
||||||
|
local fzf = os.environ('_ZL_FZF', 'fzf')
|
||||||
|
local cmd = '--reverse --inline-info --tac '
|
||||||
|
local flag = os.environ('_ZL_FZF_FLAG', '')
|
||||||
|
flag = (flag == '' or flag == nil) and '+s -e' or flag
|
||||||
|
cmd = ((fzf == '') and 'fzf' or fzf) .. ' ' .. cmd .. ' ' .. flag
|
||||||
|
if not windows then
|
||||||
|
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
|
||||||
|
cmd = 'type "' .. tmpname .. '" | ' .. cmd
|
||||||
|
end
|
||||||
|
retval = os.call(cmd)
|
||||||
|
os.remove(tmpname)
|
||||||
|
if retval == '' or retval == nil then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
local pos = retval:find(':')
|
||||||
|
if not pos then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
retval = retval:sub(1, pos - 1):gsub('^%s*', '')
|
||||||
|
end
|
||||||
|
local index = tonumber(retval)
|
||||||
|
if index == nil or index < 1 or index > #elements then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
return elements[index][2]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
-- main entry
|
-- main entry
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
@@ -1801,7 +1886,11 @@ function main(argv)
|
|||||||
if options['--cd'] or options['-e'] then
|
if options['--cd'] or options['-e'] then
|
||||||
local path = ''
|
local path = ''
|
||||||
if options['-b'] then
|
if options['-b'] then
|
||||||
path = cd_backward(args, options)
|
if Z_INTERACTIVE == 0 then
|
||||||
|
path = cd_backward(args, options)
|
||||||
|
else
|
||||||
|
path = cd_breadcrumbs('', Z_INTERACTIVE)
|
||||||
|
end
|
||||||
elseif options['-'] then
|
elseif options['-'] then
|
||||||
path = cd_minus(args, options)
|
path = cd_minus(args, options)
|
||||||
elseif #args == 0 then
|
elseif #args == 0 then
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ if [[ -z "$_ZL_NO_ALIASES" ]]; then
|
|||||||
alias zc='z -c'
|
alias zc='z -c'
|
||||||
alias zf='z -I'
|
alias zf='z -I'
|
||||||
alias zb='z -b'
|
alias zb='z -b'
|
||||||
|
alias zbi='z -b -i'
|
||||||
|
alias zbf='z -b -I'
|
||||||
alias zh='z -I -t .'
|
alias zh='z -I -t .'
|
||||||
alias zzc='zz -c'
|
alias zzc='zz -c'
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user