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 |
@@ -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