1
0
mirror of https://github.com/skywind3000/z.lua synced 2026-03-22 07:39:48 +00:00

14 Commits

Author SHA1 Message Date
skywind3000
bca25eba12 fish shell: set $_ZL_ECHO in global scope 2020-02-10 19:26:22 +08:00
skywind3000
097ca07ecd update fish script 2020-02-10 18:24:20 +08:00
skywind3000
4ee783956d update doc 2020-02-10 10:52:03 +08:00
skywind3000
0effba4021 polish: 1.8.3 2020-02-10 00:14:09 +08:00
skywind3000
cada42e5ea z.lua 1.8.3: polish interactive mode in z -b -i 2020-02-10 00:09:08 +08:00
skywind3000
b8b6d1afd6 z.lua 1.8.2 2020-02-09 23:46:35 +08:00
skywind3000
4abe97f989 jump backwards 2020-02-09 23:39:36 +08:00
skywind3000
756d13d8fa zlua 1.8.1: new -b -i and -b -I for interactive backwards cd 2020-02-09 23:34:37 +08:00
skywind3000
4900651af3 Merge branch 'master' of https://github.com/skywind3000/z.lua 2019-12-29 04:59:20 +08:00
skywind3000
836efd3973 1.7.4: new $_ZL_HYPHEN option 2019-12-29 04:59:08 +08:00
Linwei
3b8b4c1fbb Merge pull request #87 from davidosomething/no-aliases
Introduce _ZL_NO_ALIASES to skip creating aliases
2019-12-26 00:35:12 +08:00
David O'Trakoun
8eaebca04a Introduce _ZL_NO_ALIASES to skip creating aliases 2019-12-25 00:16:44 -05:00
Linwei
fdd037acf8 Merge pull request #85 from rongmu/_zl_fzf_flag-fix
[zsh plugin] allow the user to customize _ZL_FZF_FLAG beforehand
2019-12-10 17:45:04 +08:00
Shaoyun Yu
a817cf6ed2 allow the user to custom _ZL_FZF_FLAG beforehand
increase flexibility: allow the user to custom _ZL_FZF_FLAG before the zsh plugin is loaded
2019-12-10 10:50:55 +09:00
5 changed files with 144 additions and 31 deletions

View File

@@ -14,11 +14,11 @@ z.lua 是一个快速路径切换工具,它会跟踪你在 shell 下访问过
- 性能比 **z.sh** 快三倍,比 **fasd** / **autojump** 快十倍以上。
- 支持 Posix Shellbash, zsh, dash, sh, ash, busybox 等等。
- 支持 Fish ShellPower Shell 和 Windows cmd。
- 使用增强匹配算法,更准确的带你去到你想去的地方。
- 低占用,能够仅在当前路径改变时才更新数据库(将 `$_ZL_ADD_ONCE` 设成 1
- 交互选择模式,如果有多个匹配结果的话,跳转前允许你进行选择。
- 集成 fzf (可选),可以用来做可视化选择或者参数补全。
- 支持 Fish ShellPower Shell 和 Windows cmd。
- 使用增强匹配算法,更准确的带你去到你想去的地方。
- 低占用,能够仅在当前路径改变时才更新数据库(将 `$_ZL_ADD_ONCE` 设成 1
- 交互选择模式,如果有多个匹配结果的话,跳转前允许你进行选择。
- 集成 fzf (可选),可以用来做可视化选择或者参数补全。
- 快速跳转到父目录,或者项目根目录,代替反复 “cd ../../.." 。
- 兼容 lua 5.1, 5.2 和 5.3 以上版本。
- 自包含且无额外依赖,单个 `z.lua` 文件完成所有工作。
@@ -42,10 +42,10 @@ z -b foo # 跳转到父目录中名称以 foo 开头的那一级
## Install
- Posix ShellsBash、zsh、dash、sh 或 BusyBox 等):
在你的 `.bashrc`, `.zshrc` 或者 `.profile` 文件中按 shell 类型添加对应语句:
- Posix ShellsBash、zsh、dash、sh 或 BusyBox 等):
在你的 `.bashrc`, `.zshrc` 或者 `.profile` 文件中按 shell 类型添加对应语句:
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 posix)" # Posix shell 初始化
@@ -79,8 +79,8 @@ z -b foo # 跳转到父目录中名称以 foo 开头的那一级
但是第二种方法需要记得在 z.lua 位置改变或者 lua 版本升级后需要重新生成。
- Power Shell:
- Power Shell:
在你 Power Shell 的配置文件 `profile.ps1` 中放入下面语句:
iex ($(lua /path/to/z.lua --init powershell) -join "`n")
@@ -90,7 +90,7 @@ z -b foo # 跳转到父目录中名称以 foo 开头的那一级
- 将 z.lua 和 z.cmd 拷贝到 clink 的安装目录。
- 将 clink 的安装目录添加到 `%PATH%` (z.cmd 可以被任意位置调用到)。
- 保证 lua 命令在你的 `%PATH%` 环境变量中。
- 保证 lua 命令在你的 `%PATH%` 环境变量中。
- Windows cmder:
@@ -111,6 +111,7 @@ z -b foo # 跳转到父目录中名称以 foo 开头的那一级
- 设置 `$_ZL_CD` 用来指定你想用的 cd 命令,比如有人用 cd_func 。
- 设置 `$_ZL_ECHO` 为 1 可以在跳转后显示目标路径名称。
- 设置 `$_ZL_MATCH_MODE` 为 1 可以打开 “增强匹配模式”。
- 设置 `$_ZL_HYPHEN` 为 1 可以允许关键字中包含横线 (横线默认是 lua 正则关键字,要转写成 `%-`)。
## Aging
@@ -161,7 +162,7 @@ Frecency 是一个由 'recent' 和 'frequency' 组成的合成词,这个术语
对于一个给定的正则关键字序列(即 z 命令后面的参数),只有同时满足两个条件才算匹配成功:
1. 正则关键字将按顺序进行匹配(这条和默认匹配法相同)。
1. 正则关键字将按顺序进行匹配(这条和默认匹配法相同)。
2. 最后一个关键字可以和路径名的最后一段相匹配。
如果两条规则同时启用找不到任何结果,那么将会退回到只用规则 1 进行筛选,这两条规则是参考 fasd 引入的。
@@ -175,14 +176,14 @@ Frecency 是一个由 'recent' 和 'frequency' 组成的合成词,这个术语
30 /home/user/workspace/project2
40 /home/user/workspace/project3
在增强模式下使用 `"z wo"` 的话,只有 `/home/user/work` 满足匹配,因为按照第二条规则,这是唯一一条最有一段名称匹配 `wo` 的路径。
在增强模式下使用 `"z wo"` 的话,只有 `/home/user/workspace` 满足匹配,因为按照第二条规则,这是唯一一条最有一段名称匹配 `wo` 的路径。
因为最后一级目录名称总是最容易记住的,所以给到它比较高的优先级。在默认匹配算法中,你同样可以用 `"z space$"` 来达到相同的目的,但是 `"z wo"` 可以打更少的字。
小技巧:
- 如果你在增强匹配算法下,想让最后一个关键字不当匹配最后一段路径名,还可以像默认匹配算法中一样匹配路径的其他部分的话,你可以在最后加一个独立的 '$' 参数,比如:`"z wo $"`
- 如果你在增强匹配算法下,想让最后一个关键字匹配最后一段路径名以前的部分,那么可以增加一个斜杆参数,比如:`"z wo /"`。
- 如果你在增强匹配算法下,想让最后一个关键字匹配最后一段路径名以前的部分,那么可以增加一个斜杆参数,比如:`"z wo /"`。
- 如果没法匹配,同时又存在一条路径名和关键字相同,那么 cd 过去:
@@ -265,7 +266,7 @@ PS你可以使用 `$_ZL_FZF` 环境变量来精确指明 fzf 的可执行路
`"-b"` 选项可以快速回到某一级父目录,避免重复的输入 "cd ../../.."。
- **(没有参数)**`cd` 到项目根目录,即跳转到最近的包含 (.git/.svn/.hg) 的父目录。
- **(没有参数)**`cd` 到项目根目录,即跳转到最近的包含 (.git/.svn/.hg) 的父目录。
- **(单个参数)**`cd` 到离当前目录最近的以关键字开头的父目录,如果找不到就尝试跳到包含关键字的父目录。
- **(两个参数)**:将当前路径中的第一个关键词替换为第二个关键词。
@@ -302,6 +303,8 @@ export _ZL_ROOT_MARKERS=".git,.svn,.hg,.root,package.json"
**Bonus**`zb ..` 相当于 `cd ..``zb ...` 相当于 `cd ../..`,而 `zb ....` 相当于 `cd ../../..` 等等。 最后 `zb ..20` 等同于调用 `cd ..` 二十次。
**Bonus**: 试试 `z -b -i` 以及 `z -b -I`,推荐把他们取个别名成 `zbi` 和 `zbf`。
## 补全功能

View File

@@ -131,6 +131,7 @@ z -b foo # cd to the parent directory starting with foo
- set `$_ZL_ECHO` to 1 to display new directory name after cd.
- set `$_ZL_MATCH_MODE` to 1 to enable enhanced matching.
- set `$_ZL_NO_CHECK` to 1 to disable path validation, use `z --purge` to clean
- set `$_ZL_HYPHEN` to 1 to treat hyphon (-) as a normal character not a lua regexp keyword.
## Aging
@@ -195,7 +196,7 @@ If no match is found, it will fall back to default matching method.
30 /home/user/workspace/project2
40 /home/user/workspace/project3
If you use `"z wo"` in enhanced matching mode, only the `/home/user/work` will be matched, because according to rule No.2 it is the only path whose last segment matches `"wo"`.
If you use `"z wo"` in enhanced matching mode, only the `/home/user/workspace` will be matched, because according to rule No.2 it is the only path whose last segment matches `"wo"`.
Since the last segment of a path is always easier to be recalled, it is sane to give it higher priority. You can also achieve this by typing `"z space$"` in both methods, but `"z wo"` is easier to type.
@@ -322,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**: try `z -b -i` and `z -b -I` and you can alias them to `zbi` and `zbf`.
## Completion
@@ -458,6 +460,9 @@ As you see, z.lua is the fastest one and requires less resource.
## History
- 1.8.4 (2020-02-10): fish shell: set `$_ZL_ECHO` to global scope.
- 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.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.1 (2019-06-07): Fixed: `$_ZL_DATA` failure on Linux sometimes.

View File

@@ -35,6 +35,8 @@ if test -e $_zlua_dir/z.lua
alias zz='z -i' # cd with interactive selection
alias zf='z -I' # use fzf to select in multiple matches
alias zb='z -b' # quickly cd to the parent directory
alias zbi='z -b -i' # interactive jump backward
alias zbf='z -b -I' # interactive jump backward with fzf
set -U ZLUA_SCRIPT "$ZLUA_SCRIPT" 2> /dev/null
set -U ZLUA_LUAEXE "$ZLUA_LUAEXE" 2> /dev/null
end

111
z.lua
View File

@@ -1,10 +1,10 @@
#! /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.
--
-- Version 1.7.3, Last Modified: 2019/09/06 17:27
-- Version 1.8.4, Last Modified: 2020/02/10 19:22
--
-- * 10x faster than fasd and autojump, 3x faster than z.sh
-- * available for posix shells: bash, zsh, sh, ash, dash, busybox
@@ -75,6 +75,7 @@
-- set $_ZL_MATCH_MODE to 1 to enable enhanced matching mode.
-- set $_ZL_NO_CHECK to 1 to disable path validation. z --purge to clear.
-- set $_ZL_USE_LFS to 1 to use lua-filesystem package
-- set $_ZL_HYPHEN to 1 to stop treating hyphen as a regexp keyword
--
--=====================================================================
@@ -121,6 +122,7 @@ Z_CMD = 'z'
Z_MATCHMODE = 0
Z_MATCHNAME = false
Z_SKIPPWD = false
Z_HYPHEN = false
os.LOG_NAME = os.getenv('_ZL_LOG_NAME')
@@ -1267,6 +1269,9 @@ function data_select(M, patterns, matchlast)
local pats = {}
for i = 1, #patterns do
local p = patterns[i]
if Z_HYPHEN then
p = p:gsub('-', '%%-')
end
table.insert(pats, case_insensitive_pattern(p))
end
for i = 1, #M do
@@ -1580,7 +1585,7 @@ function z_cd(patterns)
io.stderr:write('> ')
io.stderr:flush()
local input = io.read('*l')
if input == nil then
if input == nil or input == '' then
return nil
end
local index = tonumber(input)
@@ -1762,6 +1767,91 @@ function cd_minus(args, options)
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
-----------------------------------------------------------------------
@@ -1796,7 +1886,11 @@ function main(argv)
if options['--cd'] or options['-e'] then
local path = ''
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
path = cd_minus(args, options)
elseif #args == 0 then
@@ -1868,6 +1962,7 @@ function z_init()
local _zl_matchname = os.getenv('_ZL_MATCH_NAME')
local _zl_skippwd = os.getenv('_ZL_SKIP_PWD')
local _zl_matchmode = os.getenv('_ZL_MATCH_MODE')
local _zl_hyphen = os.getenv('_ZL_HYPHEN')
if _zl_data ~= nil and _zl_data ~= "" then
if windows then
DATA_FILE = _zl_data
@@ -1920,6 +2015,12 @@ function z_init()
Z_SKIPPWD = true
end
end
if _zl_hyphen ~= nil then
local m = string.lower(_zl_hyphen)
if (m == '1' or m == 'yes' or m == 'true' or m == 't') then
Z_HYPHEN = true
end
end
end
@@ -2310,7 +2411,7 @@ function z_fish_init(opts)
print('set -x _ZL_MATCH_MODE 1')
end
if opts.echo then
print('set _ZL_ECHO 1')
print('set -g _ZL_ECHO 1')
end
if opts.nc then
print('set -x _ZL_NO_CHECK 1')

View File

@@ -20,15 +20,17 @@ if [[ -z "$ZLUA_EXEC" ]]; then
fi
fi
export _ZL_FZF_FLAG="-e"
export _ZL_FZF_FLAG=${_ZL_FZF_FLAG:-"-e"}
eval "$($ZLUA_EXEC $ZLUA_SCRIPT --init zsh once enhanced)"
alias zz='z -i'
alias zc='z -c'
alias zf='z -I'
alias zb='z -b'
alias zh='z -I -t .'
alias zzc='zz -c'
if [[ -z "$_ZL_NO_ALIASES" ]]; then
alias zz='z -i'
alias zc='z -c'
alias zf='z -I'
alias zb='z -b'
alias zbi='z -b -i'
alias zbf='z -b -I'
alias zh='z -I -t .'
alias zzc='zz -c'
fi