如何在列X之间插入空格以排列列中的内容?

Did*_*set 61 vim

我的复制操作符的源代码编写如下.

foo = rhs.foo;
foobar = rhs.foobar;
bar = rhs.bar;
toto = rhs.toto;
Run Code Online (Sandbox Code Playgroud)

我想按照以下方式排列(更具人性化,不是吗?).

foo    = rhs.foo;
foobar = rhs.foobar;
bar    = rhs.bar;
toto   = rhs.toto;
Run Code Online (Sandbox Code Playgroud)

是否有一个VIM魔术插入到列N,或类似的东西,这将允许我使用每行几次击键排队?

Tal*_*tle 106

这里的其他答案都很棒,特别是@ nelstrom对Tabular.vim的评论以及他出色的截屏视频.

但是,如果我觉得懒得安装任何Vim插件,但不知何故愿意使用Vim宏,我会使用宏.

算法:

For each line,
    Add tons of spaces before the symbol =
    Go to the column you want to align to
    Delete all text up to =, thereby shifting the = into the spot you want.
Run Code Online (Sandbox Code Playgroud)

以你为例,

foo = rhs.foo;
foobar = rhs.foobar;
bar = rhs.bar;
toto = rhs.toto;
Run Code Online (Sandbox Code Playgroud)

将光标定位在第一行的任意位置,并在正常模式下键入以记录该行的宏:

qa0f=100i <Esc>8|dwjq
Run Code Online (Sandbox Code Playgroud)

这意味着:

  1. qa - 在热键中记录一个宏 a
  2. 0 - 转到该行的开头
  3. f= - 转到第一个等号
  4. 100i <Esc>- (后面有一个空格i,并且<Esc>意味着按下转义,不要输入"<Esc>".)插入100个空格
  5. 8| - 转到第8列(抱歉,您必须手动确定要对齐的列)
  6. dw - 删除直到下一个非空格字符
  7. j - 转到下一行
  8. q - 停止录音.

然后a将光标存储在热键上3次(对于其余3行),将光标放在第二行并按:

3@a
Run Code Online (Sandbox Code Playgroud)

  • 我很恼火,我没有想到这个宏算法.我更喜欢这个插件的解决方案:) (12认同)
  • 我喜欢这个答案.谢谢你的提示! (7认同)
  • 很棒的答案.非常光滑.谢谢! (2认同)
  • @TalkLittle:很好地使用了不需要任何附加插件的无插件解决方案。很好地使用了带注释的 vim 命令来帮助新用户。所有支持和解释原生 vim 功能的良好实践。 (2认同)

evn*_*vnu 26

如果您使用的是类似unix的环境,则可以使用命令行工具column.使用可视模式标记您的线条,然后:

:'<,'>!column -t
Run Code Online (Sandbox Code Playgroud)

这会将所选文本粘贴到命令的stdin之后'<,'>!.请注意,在以可视模式'<,'>!点击时会自动插入:.

  • @freitass,我知道这很旧,但是 `:'&lt;,'&gt;!column -t -o ' '` 有效。请参阅列的手册页。`-o` 是列分隔符 arg。 (2认同)

Xav*_* T. 21

有一个很好的插件可以完成,更多,称为Align.vim

对于您的情况,您需要选择表达式然后键入:Align =.它将使用=作为分隔符和引用来对齐所有内容.

(有很多选项可以对齐,左,右,循环等)

您还可以检查提供类似功能的Tabular.vim.请参见那里的截屏视频进行演示.

  • Align.vim与[Tabular.vim](https://github.com/godlygeek/tabular)之间没有太大区别,但在尝试了两者之后,我最终选择了后者.我制作了一个关于[使用Tabular.vim对齐文本]的截屏视频(http://vimcasts.org/episodes/aligning-text-with-tabular-vim/),其中介绍了我最喜欢的一些功能. (12认同)

Pat*_*nan 9

一种快速,简单的方法是添加X空格,然后删回到X列.例如,如果X = 40,请键入

40a<Space><Esc>d40|
Run Code Online (Sandbox Code Playgroud)

  • X=200 的宏:`&lt;Esc&gt;q200a&lt;Space&gt;&lt;Esc&gt;d200|q`。然后只要你想要空格到第 200 列就输入 `@a`。(最简单和最好的答案恕我直言:) (2认同)
  • 非常酷。这是迄今为止最好的解决方案。一旦你理解了它,你就会永远记住它,因为它是合乎逻辑的。它可以通过简单的 vim 命令开箱即用。谢谢帕特里克。我还使用它在宏中创建虚线:`j04W40i-&lt;Space&gt;&lt;Esc&gt;d40|`(转到下一行,转到行开头,向前移动 4 个完整单词(第 4 列),插入虚线(40 次) '-'),删除虚线回到第 40 列。 (2认同)