gpt4 book ai didi

regex - Vim 如何制作 :g work properly with zs matches

转载 作者:行者123 更新时间:2023-12-01 22:52:25 25 4
gpt4 key购买 nike

我的文件顶部有这个:

var server = require('http');
var watchr = require('watchr');
var io = require('socket.io');
var fs = require('fs');

我想将这些垃圾转换成正确的变量列表:

var server = require('http'),
watchr = require('watchr'),
io = require('socket.io')(server),
fs = require('fs');

所以我的第一步是找到本段中除第一个之外的所有 var 声明,并缩进它们。因此,我搜索前一行中另一个 var 前面的每个单词 var

这是由于某种原因起作用的正则表达式:

\vvar\_.{-}\zs<(var)@>

说明:

\v          Very magic mode (make all special characters special)
var The word var
\_ Spanning multiple lines
. Any charaacter
{-} Non greedy
\zs Actually start higlighting our search here
< A word boundary
(var) The second occurance of the word var
@> Treat the previous thing (var) as the whole match. Otherwise
Vim is too stupid to match consecutive lines and only
matches every other line

现在,当我在文件中点击 n 时,Vim 会正确跳转到每个 var 语句除了第一个语句。耶!

现在,让我们使用可靠的 :g 命令在与最后一个正则表达式匹配的所有行上运行命令(这将是除第一个之外的所有行,因为 n 会跳过第一个)

vip 那么:

'<,'>g//norm>>

现在我得到:

    var server = require('http');
var watchr = require('watchr');
var io = require('socket.io');
var fs = require('fs');

什么给了?为什么我的第一行要缩进?如何让 gzs@> 或任何我必须弄清楚的可怕的 Vim 正则表达式完美配合?

最佳答案

:global 只会获取多行匹配的第一行,除非您为执行的命令提供偏移量:

:g/^var/+norm >>

结果:

var server = require('http');
var watchr = require('watchr');
var io = require('socket.io');
var fs = require('fs');

无论如何,我建议采用这种更简单的方法:

  1. 将段落连接成一行:

    vipJ or :'{,'}j<CR>

    结果:

    var server = require('http'); var watchr = require('watchr'); var io = require('socket.io'); var fs = require('fs');
  2. 使用正确的字符串在正确的位置拆分该行:

    :s/; var /,\r    /g

    结果:

    var server = require('http'),
    watchr = require('watchr'),
    io = require('socket.io'),
    fs = require('fs');

关于regex - Vim 如何制作 :g work properly with zs matches,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24603805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com