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

发自己写的几个 vim 玩具脚本, 有类似需求的可试用, 也欢迎意见,建议,修改等

  •  1
     
  •   KentY · 2016-06-13 17:09:49 +08:00 · 4156 次点击
    这是一个创建于 2845 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 vim 10 好几年了, 应该说日子不算短了, 有时候使用时遇到一些机械性的重复工作或特殊需求, 就想弄个脚本来做, 所以陆续写了些脚本. 代码量不是很大的, 就放自己的 vimrc 里了. 稍微多点的, 就另写了个脚本, 但基本都属于玩儿票玩具水平. 如果有类似需要的, 可以查看试用, 但凡能减轻你的工作量, 我会很高兴. 因为自己做的东西有第 2 个人受益也是个让人欣慰的事.. 同时也欢迎各种意见建议.

    所有脚本都有 readme 详细解释, 可点进去看, 基本都有截图, 大多数有 gif 动图:

    • last256: ( https://github.com/sk1418/last256 ) 自用的一个 colorscheme, 里面有些常用的 highlight 设定, 比如 Important, Fixme, Todo ...

    • BlockIt: ( https://github.com/sk1418/blockit ) 选择一个区域, 自动生成围绕它的 ASCII 字符的边框, 有对齐选项

    • QFGrep ( https://github.com/sk1418/QFGrep ) 当 grep/ack/ag 的结果在 quickfix/locationList 里显示时, 可做进一步筛选, 从而加速选择. (后可恢复最初 grep/ack/ag 结果)

    • Join ( https://github.com/sk1418/Join ) 扩充增强 vim 自身的 :join 命令, 比如反向 join; 反序 join; 保持被 join 行;特定间隔符 join 等

    • HowMuch ( https://github.com/sk1418/HowMuch ) 在 vim 中进行数学运算, 支持 visual 选择计算, 支持 3 种计算引擎 py/bc/vim, 支持自动选择引擎, 支持用户自己扩展新引擎, 支持列求和.

    29 条回复    2016-06-14 16:48:05 +08:00
    itfanr
        1
    itfanr  
       2016-06-13 17:27:24 +08:00
    mark 。大神啊
    HaoC12
        2
    HaoC12  
       2016-06-13 19:21:44 +08:00
    很酷的样子~
    bramblex
        3
    bramblex  
       2016-06-13 19:27:49 +08:00
    https://github.com/bramblex/BlxVimrc

    我造了个这个玩具
    SpicyCat
        4
    SpicyCat  
       2016-06-13 19:30:16 +08:00
    收藏了
    congeec
        5
    congeec  
       2016-06-13 19:30:18 +08:00
    虽然用不着,不过要顶你一下
    KentY
        6
    KentY  
    OP
       2016-06-13 19:42:39 +08:00
    @bramblex 对于 vimrc 的管理, 各人有不同倾向性. 有那种按功能分成各种不同小文件, 再 source 的, 觉得那样便于管理修改的. 可能你就是这样的人群中一员. 我个人还是倾向一个 vimrc 文件. 因为这个文件再大也大不到哪去, 我个人的就不算很小的了. 包含注释行数大概 900 多吧. 但是通过 fold 什么的我觉得查找, 修改挺方便的. 我不排斥你那种多配置文件的方式, 但是各有各的便利和不足, 主要看个人习惯了. 自己用着方便顺手就好. 毕竟配置文件一旦弄好了, 也不总去折腾了.
    alexapollo
        7
    alexapollo  
       2016-06-13 19:51:47 +08:00
    很细的一些功能,赞一个
    xiaket
        8
    xiaket  
       2016-06-13 20:00:24 +08:00
    那我也蹭地方晒个玩具好了: https://github.com/xiaket/better-header
    bramblex
        9
    bramblex  
       2016-06-13 20:03:03 +08:00
    @KentY

    哎…… 看来你完全没有把 vimscript 当成一门编程语言啊……我的 require.vimrc 是给一个类似 python / ruby / nodejs 的模块机制, source 只是实现方式而已。

    一个文件并不是单纯的一个配置,而是一个模块。并且引用一个模块的时候并不会影响全局。比如定一个模块,然后就能通过 let module = Require('<module path>') 得到这个模块。
    wsdjeg
        10
    wsdjeg  
       2016-06-13 20:07:45 +08:00
    @bramblex 听起来很不错,我之前 vimrc 3000+行,那看起来一个累啊,索性撕碎了, 碎了滞后就不知道怎么整合了,目前也没想到好方法,只能通过 source 解决.
    bramblex
        11
    bramblex  
       2016-06-13 20:08:44 +08:00
    比如,这是我写的一个 Json Parser 的模块 https://github.com/bramblex/BlxVimrc/blob/master/utils/json.vimrc

    调用它的时候是这样调用这个模块来解析 Json 字符串的时候只需要如下代码:
    let json = Require('utils/json')
    let ret = json.parse('{"aaa": "bbb", "ccc": "dddd"}')
    wsdjeg
        12
    wsdjeg  
       2016-06-13 20:09:11 +08:00
    @KentY bramblex 是不是 block 我啦?>_<
    wsdjeg
        13
    wsdjeg  
       2016-06-13 20:12:54 +08:00
    @bramblex func 内部可以再定义 func?
    Tink
        14
    Tink  
       2016-06-13 21:17:01 +08:00
    强!
    KentY
        15
    KentY  
    OP
       2016-06-13 22:31:13 +08:00
    @bramblex 或许我没有完全理解你做这个的初衷, 简单的以为就是根据特定情况 source 不同配置文件了. 不好意思. 大概看了下你的例子, 好像不完全是, 大约是针对不同功能你自己写了一些常用功能的函数组合, 然后通过 Require()来 load/source 你写好的具体有"通用接口"的函数组合. 或者说, 你把一些常用功能进行了 encapsulate (这个没想起来怎么翻译), 让这些功能有"模块"的样子. 希望这次我对你的 Require 理解没有大的错误. 应该说是一种新角度的尝试... 我个人觉得, 这样做了各个"模块"独立化挺好的, 但是作为配置文件的管理, 一旦修改什么, 可能成本有点高.当然这是我的主观臆断.

    vimscript 是一种脚本语言, 而且设计的也挺有意思的, 但是弊端也明显, 只能 vim 能对它解释执行, 而且效率什么的完全是依靠 vim 自身的. 所以如果按编程语言来说, 说实话不怎么好用. 所以很早前就有人给 vimscript 写库, 做各种 encapsulation, 比如各种语言中 dot 操作符, foo(para).bar(...) like this. 但是这些只是在形式上接近, 本质上无法改变, 因为它是在 vim 的代码里实现的.

    不管怎么说这个编辑器支持不同的语言接口, 扩展性就加强了, 同时, 也让不同的用户彻底展开想象去做各种尝试, 所以有了为数众多的有创造性的优秀插件.

    @wsdjeg 你说的什么 block 你什么的, 我没明白.
    xuboying
        16
    xuboying  
       2016-06-13 23:22:30 +08:00
    last256 里用的 tabbar 是什么插件?
    KentY
        17
    KentY  
    OP
       2016-06-13 23:25:12 +08:00
    @xuboying 我不能理解你的问题... sorry
    bramblex
        18
    bramblex  
       2016-06-13 23:27:21 +08:00
    @KentY

    之前我还想给 vim script 造一个面向对象系统,不过由于我弃了 vim 的坑,于是就算了……
    xuboying
        19
    xuboying  
       2016-06-13 23:34:20 +08:00
    @KentY 我发了帖子以后我就想起来这是在 console 下显示的原生 tab 了(我一般用 gui 的版本),我以为高手都不用 tab 。。。
    xuboying
        20
    xuboying  
       2016-06-13 23:35:55 +08:00
    last256 对 perl 语法支持不好啊,能提 issue 么
    whatot
        21
    whatot  
       2016-06-13 23:50:17 +08:00
    KentY
        22
    KentY  
    OP
       2016-06-14 00:32:43 +08:00
    @xuboying 哦, 我现在明白了, 对不起啊, 我看成 tagbar 了, 我 90%都是在终端下用 vim. 我平时不用 tab,和高手无关, 只是我实在适应不了 vim 的 tab, 找不到北. 还是 buffer 好用很多. 但是我的 git conflict view 有 3 个 tabs, 所以就设置了下 tab 的样式, 否则我自己看不见 tab 边界 :-D

    发现问题当然可以提 issue, 最好你能自己给 fix 了, 我就省事啦.. ;-) .. 如果是针对某个 syntax 的 color 有问题, 有没有可能是那个 syntax 文件的问题呢? 我基本没打开过 perl 文件, 不敢妄言.
    KentY
        23
    KentY  
    OP
       2016-06-14 00:35:25 +08:00
    @whatot 我没太明白你的意思, 是说和我写的那个 QFGrep 比较么? 你举的这 2 个跟我的那个好像做不同的事情吧?
    whatot
        24
    whatot  
       2016-06-14 09:07:48 +08:00
    @KentY vim 里面 unite 做这类的 filter 比较容易, emacs 里面的 helm ( ido , ivy )也是如此,我觉得现成的差不多都是可用的。 swoop 与你的插件确实有点偏差。
    andyhuzhill
        25
    andyhuzhill  
       2016-06-14 10:36:01 +08:00
    我很好奇你是用什么工具做的那几个 Demo 的  gif 图  还有一个可以显示按键的
    yangyanggnu
        26
    yangyanggnu  
       2016-06-14 11:14:16 +08:00
    @KentY @andyhuzhill
    我也关系你的录屏工具是啥?从截图来看,桌面环境像是 GNOME , linux 下直接录屏成 gif 的工具不多,我平时用 byzanz (自己脚本控制指定区域录屏、指定窗口录屏, https://github.com/yangyangwithgnu/the_new_world_linux#5.4 ),但无法呈现按键信息。
    wnnpmqitrh
        27
    wnnpmqitrh  
       2016-06-14 13:19:45 +08:00
    请教 vim 如何先加载 ftplugin 中的插件再加载 vimrc 中的配置,因为插件中有些映射与 vimrc 中的冲突了
    KentY
        28
    KentY  
    OP
       2016-06-14 16:44:40 +08:00
    @whatot QFGrep 和 unit/ctrlp 的 filter 意思是不一样的. 也许你没太仔细看. 我那个小脚本是做 QF 的 filtering, 当然不排除 unite 什么的这种大而全的插件现在也有这个功能了, 我没关注.. 我觉得不应该, 因为感兴趣的对象不同.

    @andyhuzhill 我用的录屏一直是 byzanz, 觉得挺好用, 制定性也强. 自己写了个小脚本 wrapper, 来使得用起来更加方便点. @yangyanggnu 你文章里的脚本有个跟我的很相像啊! 我的也是录制指定窗口的和时间的. 至于按键显示, 是另一个软件, 是什么都忘记了, 因为觉得有点华而不实. 好像当时我找了有两个, 一个效果好点, 但是双屏时候有 bug, 想给它 fix 了, 后来没空就撂下了. 选了另一个. 桌面是 xfce.
    KentY
        29
    KentY  
    OP
       2016-06-14 16:48:05 +08:00
    @wnnpmqitrh vim 一般是顺序加载设置的, 如果有映射冲突, 你想要你自己的生效, 可以把你的 mapping 放在最后. 如果你的插件是 lazy init 的, 类似那种用到才加载的, 也许只能 fork 那个插件然后自己修改下吧, 比如加个 mapping check 什么的. 还有即使看看插件文档, 一般成熟的插件的映射是应该可以让用户自己安排的.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3367 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 11:21 · PVG 19:21 · LAX 04:21 · JFK 07:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.