V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Veyhunk
V2EX  ›  程序员

有没有带历史记录智能提醒的命令行工具?

  •  
  •   Veyhunk · 2019-11-28 01:12:41 +08:00 · 6667 次点击
    这是一个创建于 1819 天前的主题,其中的信息可能已经有所发展或是发生改变。

    作为前端搬砖工, 常用的命令就那几条, 可是每次重复输入很机械, 写成脚本灵活度又不够, 网上找了几圈, 也没有满意的答案

    有没有命令行大佬, 推荐一款带历史记录智能提示的命令行工具?? mac/win 都可以哈

    万分感谢

    需求很简单

    输入 n 按下 tab 选择 npm run dev 或者其他历史记录

    输入 g 按下 tab 选择 git checkout dev 或者其他历史记录

    46 条回复    2024-02-29 11:00:46 +08:00
    findsomeone
        1
    findsomeone  
       2019-11-28 01:14:10 +08:00 via Android   ❤️ 1
    iterm2 ?
    KentY
        2
    KentY  
       2019-11-28 01:26:00 +08:00   ❤️ 8
    不用装特殊的工具.
    我猜你不知道 ctrl-r
    mcfog
        3
    mcfog  
       2019-11-28 01:26:07 +08:00 via Android
    fzf
    Trim21
        4
    Trim21  
       2019-11-28 01:26:21 +08:00 via Android
    有按下 n 然后按上箭头就变成 npm run dev 的 oh-my-zsh…
    前提是历史命令里面有 npm run dev
    KentY
        5
    KentY  
       2019-11-28 01:27:38 +08:00
    @Trim21 小建议, 试着改下习惯, 按 ctrl-p, ctrl-n instead of cursor keys.
    Trim21
        6
    Trim21  
       2019-11-28 01:28:19 +08:00 via Android
    @KentY 我是 capslock+hjkl (
    imycc
        7
    imycc  
       2019-11-28 01:28:34 +08:00   ❤️ 3
    zsh + oh-my-zsh (可选) + zsh-users/zsh-autosuggestions
    或者直接用 fish
    不过都只能显示在当前行,按上下键切换命令。
    还有一种方法,按下 ctrl-r,输入字符可以搜索历史命令,重复 ctrl-r 可以查找前一条。
    一般我是这两种方法混用的。
    Yvette
        8
    Yvette  
       2019-11-28 01:34:07 +08:00   ❤️ 1
    Veyhunk
        9
    Veyhunk  
    OP
       2019-11-28 01:40:07 +08:00
    有没有直接装 VS code 的扩展?
    inhzus
        10
    inhzus  
       2019-11-28 01:43:19 +08:00 via Android
    zsh autosuggestion+1 浅色提示,方向右键或 ^space 补全
    Veyhunk
        11
    Veyhunk  
    OP
       2019-11-28 02:01:18 +08:00
    VScode 扩展找到这个 terminal-tools
    Veyhunk
        12
    Veyhunk  
    OP
       2019-11-28 02:01:58 +08:00
    虽然没有智能匹配, 不过他支持存储常用的命令, 直接选取
    jinliming2
        13
    jinliming2  
       2019-11-28 02:05:34 +08:00 via iPhone
    ~/.bash_profile 写 alias
    ctrl+r
    Veyhunk
        14
    Veyhunk  
    OP
       2019-11-28 02:08:59 +08:00
    既然 terminal-tools 这样的扩展程序可以直接修改命令行输入区域, 那么做一个智能联想弹窗的可行性应该还是有的
    eclipselu
        15
    eclipselu  
       2019-11-28 03:08:11 +08:00
    可以用 fish https://fishshell.com/ 或者用 bash/zsh + 一些插件 (比如 https://github.com/zsh-users/zsh-autosuggestions ) 。用 ctrl-r 以及 fzf 也可以
    iamwho
        16
    iamwho  
       2019-11-28 03:49:49 +08:00
    直接 fish 吧,反正你也不会,就无所谓了。
    tsui
        17
    tsui  
       2019-11-28 04:04:35 +08:00
    ctrl+r 配合 fzf

    用 zsh 的可以同一行补全,这个可有可无
    wweir
        18
    wweir  
       2019-11-28 08:31:32 +08:00 via iPhone
    1. zsh substring match
    2. reverse search comment
    Davic1
        19
    Davic1  
       2019-11-28 09:35:58 +08:00
    # 17 l 正解, Ctrl + R
    julypanda
        20
    julypanda  
       2019-11-28 09:53:43 +08:00
    alias 好了
    photon006
        21
    photon006  
       2019-11-28 10:30:47 +08:00
    vim ~/.inputrc

    粘贴如下内容:
    "\e[A": history-search-backward
    "\e[B": history-search-forward
    set show-all-if-ambiguous on
    set completion-ignore-case on

    exit 退出 terminal 重开
    YoRolling
        22
    YoRolling  
       2019-11-28 12:16:34 +08:00
    vscode 扩展里搜一下 RobotTask 这个看看?

    其实,通过把脚本写在 package.json 里,vsc 是有点点鼠标就可以运行对应 script 的功能的
    YoRolling
        23
    YoRolling  
       2019-11-28 12:18:02 +08:00
    @YoRolling 忘记了是要追溯历史命令的,那就看大佬们的方案吧
    superrichman
        24
    superrichman  
       2019-11-28 12:22:58 +08:00 via iPhone
    要是经常输错命令可以试一试 thefuck,输错之后输入 fuck 会自动提示正确的命令
    clarkyi
        25
    clarkyi  
       2019-11-28 12:31:17 +08:00
    oh my zsh 写出一部分,上下键就可以找出你是你需要的命令
    MrUser
        26
    MrUser  
       2019-11-28 12:58:58 +08:00
    ^r --------------- 可以执行你指定的历史命令
    .inputrc -------- 根据命令的前半部搜索后半部分
    z.lua ------------ 直接进入某深层目录,比如 z wj 进入 /data/project/wjxz (类似 fzf )
    alias ------------ alias gc="git add . && git commit -m"
    ----
    这些已经够了吧?
    tankren
        27
    tankren  
       2019-11-28 13:07:24 +08:00
    zsh
    jeffh
        28
    jeffh  
       2019-11-28 13:14:11 +08:00   ❤️ 1
    我都是 ctrl+r,然后输入命令,然后多次按 ctrl+r 向上查找。
    imcczy
        29
    imcczy  
       2019-11-28 13:25:36 +08:00
    你需要的是 fish shell,但存在跟 bash 不兼容的情况
    https://tva1.sinaimg.cn/large/006y8mN6ly1g9doq4uxthg30rs0go127.gif
    zthxxx
        30
    zthxxx  
       2019-11-28 14:42:19 +08:00
    自带 ctrl+r 过于反人类,每次只能看到一条,永远不知道下一个惊喜和意外哪个会先来 (也不方便搜索)

    @KentY
    @imycc
    @jinliming2
    @eclipselu
    @tsui
    @Davic1
    @jeffh

    推荐还在用原生 ctrl+r 的可以看看这个
    刚做了这样一个历史命令快速查看 /搜索工具,用于替换(增强) zsh 自带的 ctrl+r

    https://github.com/zthxxx/zsh-history-enquirer

    Ctrl + R 在当前行内展开历史记录的预览 /搜索结果,
    npm 直接安装 (所以需要装 nodejs)

    npm i -g zsh-history-enquirer

    因为是在行内,不会在命令行新开一个界面,看起来很轻量

    - 有时候我不是想执行一个历史命令,仅仅是想看看 然后复制一个参数来用
    - 多个单词支持模糊匹配
    - 自动倒序展开多个命令,方便人眼查看 (自带 ctrl+r 每次只能看一条,永远不知道下一条是惊喜还是意外)
    - 方向键上下就能快速选择命令
    - 支持 PageUp / PageDown 快速翻页,回车 Entry 选中,Esc 取消
    - 选择后还能继续编辑 (方便修改参数)

    预览图见下 (imgur 图床,可能需要代理):

    imkerberos
        31
    imkerberos  
       2019-11-28 15:05:03 +08:00
    zplug "zsh-users/zsh-autosuggestions"

    配合 karabiner: 双 shift == ^r
    imn1
        32
    imn1  
       2019-11-28 15:29:32 +08:00
    只是个人用的话,我建议写 alias
    nusnevets
        33
    nusnevets  
       2019-11-28 16:44:30 +08:00   ❤️ 1
    @zthxxx 这个不错, 谢谢了,等一下就去试试:) 怎么 bytedance 可以直接用 imgur 的 :p

    回楼主,找历史记录一般是在很多命令里面找出想要的,用上面的插件就很好,但是从你的需求来看,我理解你有一个比较小的 set commands 非常常用,那样不如直接用 lias 好了。 比如可以用 alias glog="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" 然后把这些放在.[shell]profile 里,我觉得还挺方便的。 这样我只需要 gl tab,就是上面的命令了。
    zdnyp
        34
    zdnyp  
       2019-11-28 16:51:39 +08:00
    cmder 有没有这样的插件,楼主做的这个厉害
    zthxxx
        35
    zthxxx  
       2019-11-28 17:18:36 +08:00
    @nusnevets #33 😂 嗯嗯,如果完全是固定不变的长命令,还是自己写个 alias 最简单,甚至还可以把固定的命令组合写成 function 和 alias 一起放到 shell 的 .profile 或者 .rc 文件里

    这种我做了很多自用的 🌝 为了方便找地方同步,直接放到了 zsh 主题里

    https://github.com/zthxxx/jovial/blob/master/jovial.plugin.zsh
    KentY
        36
    KentY  
       2019-11-28 17:25:23 +08:00
    @zthxxx

    "自带 ctrl+r 过于反人类,每次只能看到一条,永远不知道下一个惊喜和意外哪个会先来 (也不方便搜索)..."

    "过于反人类" 这个形容... 你可以扩充改善先有的东西, 但是这个评价太主观了. 设想下, 用 c-r 的人类多还是用 suggestion 的人类多? 好吧, 我暂且理解你不吝啬用词的一种夸张表达. 不细钻用词表达.

    这个 c-r 的功能本身就不是一个精准定位的功能, 是一个快捷的辅助. 而且你不必每次都从命令开始输入, 比如说, 你前面 有:
    command para1 para2 para3 para4|command2 foo para

    c-r 以后, 可以直接敲 foo, 这条就可以出来了.

    另外还有一些就是个人的使用不同情况了. 我知道 fish 那个灰色的 suggestion 出来以后, zsh 就出现了类似的实现. 我个人看到这个连去试试的冲动都没有, 对我个人来说, 灰色的提示不起什么作用, 反而无谓减慢速度,消耗资源. 因为我个人体会 ctrl-r 的方便之处是, 可以找出"相似"的命令, 从而减少输入. 因为我们不光有 c-r, 我们还有 c-a, c-e, c-h, c-d, c-w alt-w, c-f, alt-f.... 实在长命令不便在命令行多处修改我们还有 c-x-c-e

    可能说多了. 使用习惯本身就是个主观的东西.. 算了发出去吧, 就不删改了.
    fernandoxu
        37
    fernandoxu  
       2019-11-28 17:29:12 +08:00
    vscode/webstorm 上点一点就行了
    zthxxx
        38
    zthxxx  
       2019-11-28 17:52:02 +08:00
    @KentY #36 我也很接受你的说法,以前我也这么想的 🌝;「过于反人类」确实是个夸张的形容,主要是反我自己,以至于不能接受

    你说的 「不必每次都从命令开始输入」那就完全是一个搜索工具最基础的条件了
    原生 Ctrl+R 的核心问题在我看来就是两个

    - 每次只能看一条命令
    - 只能精确匹配不能搜索多个单词

    以下我会给一个场景跟你讲为什么说「反人类」

    第一个问题,以你上面的例子,Ctrl+R 然后敲 foo 搜索,
    出来命令不是你想要的,比如是个错误的 typo,怎么办?
    当然是继续按 Ctrl+R 再向上查找第二个命令,还是不对,怎么办?
    还是只能 Ctrl+R 再查找呀,第三条、第四条都不对呢?

    用户在敲第三次 Ctrl+R 就已经会动摇了,不仅是没耐心,还会质疑自己,
    到底第几个才是我想找的命令?
    还有几次才到我想找的命令?
    我会不会按快了没看清就跳过去了?
    是不是我输错了按 100 次也没有这句命令?

    那么这时会怎么做呢?是直接放弃搜索止损,然后改用 history | grep ;还是继续抱着怀疑人生的心态赌下一个就可能是想要的命令?
    可能无解,最后每次都成 history | grep xxxx | tail -n 20

    所以我做的工具,本质就是打破一个点,「预览止损」
    一次搜索预览 15 条,一目十行扫下去,如果没有找到,用户就会直接对这个词「止损」,
    放弃这个关键词换个词,或者增加更多关键词进一步过滤。
    通过「止损」来提高效率,改善心态,减少掉发。

    当然,如果直接用关键词在 15 条内就找到了 (一般都能找到),那就直接去选中了回车,这个的效率提升就不用讲了 🌝
    eclipselu
        39
    eclipselu  
       2019-11-28 23:27:42 +08:00 via Android
    @zthxxx cool 感谢!不过推荐你可以试试 fzf 非常好用 go 语言写的 安装只有一个 binary 不仅适用于 shell 和 vim Emacs 等结合的也很好 我已经很满意了
    tsui
        40
    tsui  
       2019-11-29 04:54:24 +08:00
    @zthxxx 你这个 zsh-history-enquirer 不是重造了 fzf 的轮子么,为啥不直接用 fzf
    Davic1
        41
    Davic1  
       2019-11-29 09:02:58 +08:00
    @zthxxx 兄弟呀, 这个和 history 也差不多啊, 如 40# 所说....
    zthxxx
        42
    zthxxx  
       2019-11-29 11:27:08 +08:00   ❤️ 1
    @mcfog
    @eclipselu
    @tsui
    @Davic1

    嘿嘿,如果你在用 fzf,那你更该试试我这个 zsh-history-enquirer 工具,因为我正是深度用过 fzf 甚至是它的衍生品 peco 和 percol 做历史搜索,
    并被它们这种 「工程师思维只做个牛逼的工具,完全不考虑用户使用体验」的表现所震惊,
    才自己去造了轮子
    或者说直接针对这些缺点做改进 (开始把我批判一番)

    首先 fzf 居然都没有去重,你见过前后翻 10 页都是相同的 gco . 么?
    其次 fzf 不是 inline (行内) 的,fzf 输入地方离实际命令行输入地方离了 13 行,这会造成目光抖动,在两个输入地方之间来回跳动;
    再然后它给出的排序居然是从上到下的时间正序而不是倒序 (对于直觉来说,常用相识命令就是希望搜索最近使用的)
    最后,长命令超过一行,就显示不了,既不显示开头也不显示结尾,居然是显示中间;要猜猜下图是什么命令么
    最后的最后,当你输入完没有搜索到想要的结果后,想放弃退出,你猜它会给你保留原始输入么?不会。

    以下 imgur 图床,需代理






    至于 peco / percol,除了以上差不多的问题外,它们会直接打开一个窗口,太重了,不仅目光关注点跳动,还会打断注意力,最重要的是你们可以直接去官网看看预览,真的比 fzf 都丑多了。

    -------

    行内、轻量、去重、倒序、显示长命令、退出保留输入,我就加了这些药给自己用
    mcfog
        43
    mcfog  
       2019-11-29 11:57:21 +08:00
    @zthxxx 看了,不需要,直到你说了我才发现 fzf 是不去重的,我用 fzf 都是直接命中一个正确结果的,就算需要去重,我也会用 sort|uniq|fzf

    fzf 的好处正是由于他并不是专门为了 history match 设计的,k8s 切环境,ssh 上机器,常用的工作目录切换等等,我日常工作的所有“选择题”都是 fzf 驱动的几行脚本,你告诉我其中某一个选择题可以用一个工具做的更好并不能打动我换工具

    我还觉得你震惊错了方向,扳手有一百种功能,你看人用扳手来敲钉子,然后震惊扳手的设计者怎么那么不考虑体验然后设计出了锤子,这很好,锤子有锤子的优点,但对于平常用扳手四五十种功能,只是偶尔敲一下钉子的人来说,你的锤子再好用也没用,不用,谢谢
    zthxxx
        44
    zthxxx  
       2019-11-29 15:45:44 +08:00
    @mcfog #43 嗯,你这个就是我刚才说的 「纯工程师思维」,希望有一种银弹解决任何场景下任何问题;

    况且你说的这些 「 k8s 切环境,ssh 上机器,常用的工作目录切换」等「选择题」不都是同一类「历史命令操作」么
    mcfog
        45
    mcfog  
       2019-11-29 16:04:27 +08:00
    @zthxxx unix 哲学恰好是反对银弹的,先 do one thing 再 do it well,这里 fzf 解决的就是“终端下从多行文件中选择一行或多行”这一件事,至于这个多行文件是历史也好是某个文件也好,还是另一个命令的输出也好,是否排序是否去重,选择完以后的结果做什么事情,fzf 一概不管,工程师自己去写脚本把工作流胶起来,这种工程师思维是简单高效的。如果你没有理解到为何这种设计行之有效,为何 fzf 选择不做去重,不做很多你觉得是理所应当的功能,我只能表示遗憾

    k8s 的环境列表不在历史记录而在配置文件里,ssh 的机器列表不在历史记录而在 aws api 里,每天都有 auto scaling 机器可能都不一样,根本不可能依赖历史,常用工作目录更不是搜历史搜出来的了,至少我肯定不会反复 cd 完整路径到常用工作目录
    hack21
        46
    hack21  
       265 天前   ❤️ 1
    @zthxxx #30 牛逼,这就是我想要的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:41 · PVG 13:41 · LAX 21:41 · JFK 00:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.