V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ChristopherWu
V2EX  ›  程序员

如何在 grep 的时候,选择打开文件?

  •  
  •   ChristopherWu · 2019-01-31 10:23:37 +08:00 · 2532 次点击
    这是一个创建于 2157 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前这是我纯命令行工作的唯一不太爽的地方,grep 完后,不能纯键盘操作,需要手动复制文件名,然后 vim 打开编辑。

    谢谢各位指点分享。

    19 条回复    2019-01-31 19:02:54 +08:00
    quinoa42
        1
    quinoa42  
       2019-01-31 10:36:34 +08:00 via Android
    通过 xargs 把找到的文件名传给 vim
    SamsonWang
        2
    SamsonWang  
       2019-01-31 10:37:29 +08:00 via Android
    grep 和 awk 组合使用能够取得文件名,再通过管道传给 vi ?

    我平常用 emacs,可以直接在 emacs 里调用 grep,不知道 vi 有没有类似的功能。
    quinoa42
        3
    quinoa42  
       2019-01-31 10:38:20 +08:00 via Android
    直接用 command substitution 也是可以的
    quinoa42
        4
    quinoa42  
       2019-01-31 10:39:05 +08:00 via Android
    另外如果你用 tmux 的话,就可以纯键盘复制文字了 233
    scriptB0y
        5
    scriptB0y  
       2019-01-31 10:42:07 +08:00   ❤️ 1
    ChristopherWu
        6
    ChristopherWu  
    OP
       2019-01-31 10:53:22 +08:00   ❤️ 1
    @quinoa42 xargs 这个是没有实用意义的吧。。因为你 grep 就不可能准确 grep 到一个文件
    Yggdroot
        7
    Yggdroot  
       2019-01-31 10:54:24 +08:00
    vim `cmd | grep xxx`
    quinoa42
        8
    quinoa42  
       2019-01-31 10:54:48 +08:00 via Android
    @ChristopherWu 但可以都打开呀(
    不过要手动选的话就用楼上上的 fpp 或者 fzf/skim
    ChristopherWu
        9
    ChristopherWu  
    OP
       2019-01-31 10:55:13 +08:00
    @scriptB0y fpp 似乎就是我想要的~
    AsaMyth
        10
    AsaMyth  
       2019-01-31 10:55:44 +08:00 via Android
    一般开俩 terminal,一个 grep,一个 vim🤐
    ChristopherWu
        11
    ChristopherWu  
    OP
       2019-01-31 10:55:59 +08:00
    @quinoa42 因为我用的语言跳转太弱了,迫于特殊架构,不能处理简化的模块。所以我只能 grep 来做跳转,所以大量文件这个是木有用的 - = -
    quinoa42
        12
    quinoa42  
       2019-01-31 10:57:51 +08:00 via Android
    @ChristopherWu 如果你经常需要这么做的话可以给 vim 装 denite/leaderF 等等 plugin 其中一个,方便很多
    ChristopherWu
        13
    ChristopherWu  
    OP
       2019-01-31 10:57:53 +08:00
    @AsaMyth grep 了后,你还是要复制文件名或者手动打。fpp 是最优解~
    trait
        14
    trait  
       2019-01-31 10:59:24 +08:00
    vim $(grep -l dididada)
    pkookp8
        15
    pkookp8  
       2019-01-31 11:10:33 +08:00 via Android
    vim
    :grep! pattern path parameter
    回车回车
    pkookp8
        16
    pkookp8  
       2019-01-31 11:11:38 +08:00 via Android
    @pkookp8 少了一步
    :copen
    pkookp8
        17
    pkookp8  
       2019-01-31 11:39:41 +08:00 via Android
    function! UseGrepFind()
    call inputsave()
    let p = input('dir search.Enter pattern:')
    let searchdir = input('dir:')
    if searchdir == ""
    let searchdir = "./src"
    endif
    call inputrestore()
    execute 'grep! -nrE "'.p.'" "'.searchdir.'"'
    execute 'copen'
    endfunction
    nnoremap <F7> :call UseGrepFind()<CR><CR>

    自己看着改一下吧
    pkookp8
        18
    pkookp8  
       2019-01-31 11:43:51 +08:00 via Android
    @pkookp8 手机贴的,没格式了,缩进一下吧
    f7 输路径,不输默认./src
    然后输字符串,可以正则
    需要全词匹配 grep -w 就行,忽略大小写-i,但我想不到有什么好的交互体验的方法就没加了
    shm7
        19
    shm7  
       2019-01-31 19:02:54 +08:00 via iPhone
    管道吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5436 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:10 · PVG 16:10 · LAX 00:10 · JFK 03:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.