我想这样插入文本:此方法非常不方便。

是否可以将单词或单词列表保存到“变量”中,然后使用此变量生成相似的文本?


EDIT在原始问题中我没有说清楚什么,实际上我正在尝试进行一些非常相似的函数定义,因此wordA wordB ...在每个文本克隆中可能会出现很多次,并且文本可能包含很多行。模式完全像这样: >
第二次编辑
每次我做这样的工作时,“ similar_text”部分可能会有所不同,因此,该工作的解决方案最好是可重用的。因为我正在尝试做出非常相似的函数定义,或者是将字符串映射到函数映射表。

阅读答案和一些实践后,我发现将这项工作视为某种形式的工作更方便。替换,因为很难编写可能包含换行符的单独“ part1”,“ part2” ...“ partN”,因此请首先编写模板:

similar text wordA similar text ...
similar text wordB similar text ...
similar text wordC similar text ...


尝试放置文本的副本,但用单词列表替换$ WORD则更容易思考。通过用列表中的单词替换其中的关键字?“

评论

这就是为什么要使用寄存器的原因。您可以将文本拉动(复制)到寄存器,然后使用该寄存器。宏可用于执行类似以及重复的任务。

#1 楼

您可以使用以下功能:

function! GenerateLines()
    let firstpart="similar text part 1"
    let secondpart="similar text part 2"

    let words=["wordA","wordB","wordC","wordD","wordE"]

    for word in words
        let line = firstpart . word . secondpart
        call append(line('.')+1, line)
        normal j
    endfor
endfunction


在变量firstpartsecondpart中,在单词之前和之后重复文本,在列表words中将单词更改。

然后循环将为列表的每个单词创建行的内容,将行插入缓冲区并转到新行。

您可以然后只需调用函数:call GenerateLines()


编辑为了使操作更容易,您还可以将不同部分作为参数传递,该函数应如下所示: />
function! GenerateLines(firstpart, secondpart, words)
    for word in a:words
        call append(line('.')+1, a:firstpart . word . a:secondpart)
        normal j
    endfor
endfunction


您可以这样称呼:

call GenerateLines("first part", "second part", ["wordA","wordB","wordC","wordD","wordE"])


评论


您可以通过调用map(a:words,'a:firstpart。v:val。a:secondpart')并调用append(line('。'),a:words来避免循环。

– Antony
16年7月7日在21:52

由于我经常使用很长的“第一部分”和“第二部分”,甚至“第三部分”进行此类编辑,并且这些部分可能包含换行符,因此在命令模式下键入太多内容似乎太长了,所以也许更方便将文本拖到寄存器中,然后使用函数从寄存器生成文本?

–social_loser
16年7月7日23:50

我编辑了这个问题,它改变了很多,不便之处,敬请原谅。

–social_loser
16年7月8日在1:05

#2 楼

在这种情况下,我的策略会有所不同,但通常会遵循以下步骤:



编写唯一的单词,例如




a)进行搜索和替换,例如

wordA
wordB
...
wordK


b)或使用可视块模式,请参阅:h blockwise-visual。特别是,我将选择单词并使用I在前面插入类似的文本,或者使用A在后面插入类似的文本。


我认为这种策略在您执行此操作时很有意义那种编辑任务相对很少。但是,如果发现需要经常执行此操作,则应遵循@statox的建议,并使用扩展单词列表的函数。

评论


我认为解决方案取决于单词列表的来源。如果来自文件,则:read后面跟着替换很有意义。

– Antony
16年7月7日在21:42

您的解决方案很容易实现,并且可以轻松解决我在原始问题中提出的问题。但是,我的原始帖子中存在一些错误,我进行了2次编辑,并且更改很多,谢谢您的回答,对我的更改和英语不佳表示抱歉:)

–social_loser
16年7月8日在0:52

@social_loser,您可以通过使用“ \ r”来代表替换的替换部分中的换行符来适应此解决方案

– frangio
16年7月9日在2:42

#3 楼

我认为这是可视块(Ctrl + v)的工作。首先,我要写所有不同的词: >
我可以按任意次数按w来控制需要多少列。假设我需要三列,就像上面的命令所示。现在我们有了:

wordA
wordB
wordC
wordD
wordE


光标位于第一行中第三个A <esc>p的开头。接下来,我将阻止选择列之间的空白列,这些列向后移动并在之间添加文本。从当前光标位置开始:

<c-v>5j$yA <esc>pA <esc>p


结果(百分比标记光标位置):

wordA wordA wordA
wordB wordB wordB
wordC wordC wordC
wordD wordD wordD
wordE wordE wordE


重复下一列:

h<c-v>5jI similar text 3<esc>


最后一列(第一个)(左侧):

wordA wordA%similar text 3 wordA
wordB wordB similar text 3 wordB
wordC wordC similar text 3 wordC
wordD wordD similar text 3 wordD
wordE wordE similar text 3 wordE


最后产生:

bh<c-v>5jI similar text 2<esc>


更新:添加了截屏




这似乎很多打字,但实际上很容易习惯。它使您可以自由更改单词的数量,列的数量,甚至列之间的间距。我在上面的所有命令中都有一个wordA硬编码,因为它是命令要在其上进行操作的行数。命令末尾的错误模式。