我有一个 HTML 表,其行如下:
<tr> <td>DATE</td> <td>NUMBER</td> <td>DESCRIPTION</td> <td>DEADLINE</td> </tr>
<tr> <td>6/7</td> <td>1</td> <td>foo1</td> <td>bar1</td> </tr>
<tr> <td>6/15</td> <td>2</td> <td>foo2</td> <td>bar2</td> </tr>
<tr> <td>6/20</td> <td>3</td> <td>foo3</td> <td>bar3</td> </tr>
... etc ...
我想要做的是将“DESCRIPTION”列中的所有条目向下移动。因此,我想foo1
向下移动一步,我想foo2
向下移动一步,等等。但我想保留表中的所有其他内容。如何在 vim 中执行此操作?
答案1
我的理解是,你希望表格看起来像这样,下面有一个奇怪的空单元格DESCRIPTION
:
<tr> <td>DATE</td> <td>NUMBER</td> <td>DESCRIPTION</td> <td>DEADLINE</td> </tr>
<tr> <td>6/7</td> <td>1</td> <td></td> <td>bar1</td> </tr>
<tr> <td>6/15</td> <td>2</td> <td>foo1</td> <td>bar2</td> </tr>
<tr> <td>6/20</td> <td>3</td> <td>foo2</td> <td>bar3</td> </tr>
…
我说得对吗?下面是一你可以这样做:
使用
:%!column -t
或 Vim 插件格式化此代码:<tr> <td>DATE</td> <td>NUMBER</td> <td>DESCRIPTION</td> <td>DEADLINE</td> </tr> <tr> <td>6/7</td> <td>1</td> <td>foo1</td> <td>bar1</td> </tr> <tr> <td>6/15</td> <td>2</td> <td>foo2</td> <td>bar2</td> </tr> <tr> <td>6/20</td> <td>3</td> <td>foo3</td> <td>bar3</td> </tr>
移至第一个项目然后用 删除它
dit
。foo1
现在位于默认寄存器中。用 启动宏
qx
(使用任何可用的字母代替x
)。使用 移至下一行
j
。使用 可视地选择标签的内容
vit
。使用将选定的文本(
foo2
)替换为默认寄存器()的内容。foo1
p
使用 停止宏
q
。默认寄存器的内容现在是foo2
,可供下次调用宏时使用。使用类似以下命令多次应用宏
<number of rows>@x
。
最终结果:
<tr> <td>DATE</td> <td>NUMBER</td> <td>DESCRIPTION</td> <td>DEADLINE</td> </tr>
<tr> <td>6/7</td> <td>1</td> <td></td> <td>bar1</td> </tr>
<tr> <td>6/15</td> <td>2</td> <td>foo1</td> <td>bar2</td> </tr>
<tr> <td>6/20</td> <td>3</td> <td>foo2</td> <td>bar3</td> </tr>
…
精简版:
:%!column -t<CR>
(movement)
ditqxjvitpq
17@x
如果您不想弄乱默认寄存器(以及系统剪贴板,如果适用),请在步骤 2 中使用另一个命名寄存器。
如果你只想增加foo2
和 Co 中的数字,VisIncr 插件非常好。