是否可以将单词或单词列表保存到“变量”中,然后使用此变量生成相似的文本?
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
在变量
firstpart
和secondpart
中,在单词之前和之后重复文本,在列表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
硬编码,因为它是命令要在其上进行操作的行数。命令末尾的错误模式。
评论
这就是为什么要使用寄存器的原因。您可以将文本拉动(复制)到寄存器,然后使用该寄存器。宏可用于执行类似以及重复的任务。