Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim-在每个字母之间插入一些内容_Vim - Fatal编程技术网

Vim-在每个字母之间插入一些内容

Vim-在每个字母之间插入一些内容,vim,Vim,在vim中,我有一行文本如下: abcdef qqa_<esc>lq4@q :%s/\a\zs\ze\a/_/g 现在,我想在每个字母之间添加一个下划线或其他内容,结果如下: a_b_c_d_e_f 我所知道的唯一方法是录制如下宏: abcdef qqa_<esc>lq4@q :%s/\a\zs\ze\a/_/g qqa_lq4@q 有更好更简单的方法吗?:%s/\(\p\)\p\@=/\1\ug/g :启动一个命令 %搜索整个文档 \(\p\)将匹配并

在vim中,我有一行文本如下:

abcdef
qqa_<esc>lq4@q
:%s/\a\zs\ze\a/_/g
现在,我想在每个字母之间添加一个下划线或其他内容,结果如下:

a_b_c_d_e_f
我所知道的唯一方法是录制如下宏:

abcdef
qqa_<esc>lq4@q
:%s/\a\zs\ze\a/_/g
qqa_lq4@q
有更好更简单的方法吗?

:%s/\(\p\)\p\@=/\1\ug/g

  • 启动一个命令
  • %
    搜索整个文档
  • \(\p\)
    将匹配并捕获可打印符号。例如,如果只想匹配字符,可以将
    \p
    替换为
    \w
  • \p@=
    执行前瞻检查,以确保匹配的(第一个)
    \p
    后面是另一个
    \p
    。第二个,即
    \p\@=
    不构成匹配的一部分。这很重要
  • 在替换零件中,
    \1
    填写匹配的(第一个)
    \p
    值,并且
    \u
    是一个文本
  • 最后一个标志,
    g
    是标准的“全部完成”标志

使用正向前瞻并替换:

:%s/\(.\(.\)\@=\)/\1_/g

这将匹配任何字符后跟任何字符,除了
换行符

如果您只想在字母之间添加
,您可以这样做:

abcdef
qqa_<esc>lq4@q
:%s/\a\zs\ze\a/_/g
如果需要多于ASCII字母,请用其他模式替换
\a


要了解这是如何工作的:
:help\a
:help\zs
:help\ze
,以下是一种快速且更具交互性的方法,所有操作都在正常模式下进行

光标位于行首时,按:

  • i_x
    插入和删除分隔符。(我们这样做是为了产生副作用。)
  • gp
    将分离器放回原位
  • ,按住它直到作业完成
  • 不幸的是,我们不能在这里使用带有
    的计数,因为它只会在现场粘贴分隔符“count”次。

    :%s/./&:/g

    这将在每两个字符后为整行添加“:”。 前两个句点表示要跳过的字符数。 vim解释“&”(来自我收集的信息)以确定要添加的字符。 只需在“&”后面指示该字符即可 “/g”在全局范围内进行更改。 但是,我还没有弄清楚如何排除行的结尾,结果是插入的字符被标记到了结尾…因此类似于:

    “c400ad4db63b”


    变成“c4:00:ad:4d:b6:3b:”

    像这样的东西正是我想要的!可能添加0步骤:0。g0(或gg)“将光标引导到行(文件)的开头”