如何在vim中对齐多个赋值

时间:2013-05-13 12:37:06

标签: c vim

我有这段C代码:

options->file_extension = DEFAULT_FILE_EXTENSION;
options->config = "";
options->max_file_bytes = DEFAULT_MAX_FILE_BYTES;
options->msg_sort_type = SORT_TYPE_NONE;
options->msg_sort_buffer_max_size = DEFAULT_SORT_BUFFER_MAX_SIZE;
options->msg_sort_buffer_flush_time = DEFAULT_SORT_BUFFER_FLUSH_TIME;

在vim中是否有任何简单的方法来对齐它,以便它变成例如?

options->file_extension             = DEFAULT_FILE_EXTENSION;
options->config                     = "";
options->max_file_bytes             = DEFAULT_MAX_FILE_BYTES;
options->msg_sort_type              = SORT_TYPE_NONE;
options->msg_sort_buffer_max_size   = DEFAULT_SORT_BUFFER_MAX_SIZE;
options->msg_sort_buffer_flush_time = DEFAULT_SORT_BUFFER_FLUSH_TIME;

或者即使我在这里写第一行

options->file_extension             = DEFAULT_FILE_EXTENSION;
options->config|<--cursor her now

有没有快速的方法将光标跳到2.线上直到上一行的=

3 个答案:

答案 0 :(得分:3)

我使用Align,我认为它可以胜任:

  • 整个文件::Align =
  • 视线:<leader>t=:'<,'>Align =(即来自视线的:)。

还有Tabular

  • 整个文件::Tab /=
  • 视线:<leader>a=

PS:表格似乎是最受欢迎的选择,但我不知道为什么。 Align没有做的事吗?

答案 1 :(得分:1)

有对齐插件。我用的是“老?” Align

对于您的示例,您可以直观地选择行,然后按<leader>t=您将获得预期的输出。

答案 2 :(得分:0)

有关完成此任务的快速,非鲁棒,灵活,非插件的方法,请考虑以下命令

.,+6s/\(\S*\)\s*=/\=submatch(1) . repeat(' ', 15 - len(submatch(1))) . '='

按组件分析:

.,+6s

在适当范围内替换命令

/\(\S*\)\s*=/

旨在与分配的LHS匹配的模式(正则表达式)(尽可能多的非空格字符,其后是尽可能多的空格字符,再由赋值运算符(=))

\=

启动“ sub-replace-expression”上下文。 Vim将“评估”该表达式并将其用于替换匹配的文本。

submatch(1) . 

在“ sub-replace-expression”上下文中,submatch(1)将被替换为第一个子匹配项(类似于\1)。 .是串联运算符。

repeat(' ', 15 - len(submatch(1)))

此表达式执行“大量提升”对齐。 repeat将根据第一个参数创建一个列表或字符串,' '说“重复一个空格”,而15-len(submatch(1))说“重复很多次”。当然,可以使用赋值应对齐的任何列+初始非空格字符替换15。

. '='

重新启用赋值运算符。请注意,我们不能只键入=,因为这是一个表达式,因此要添加它,我们必须将其与. '='“连接”。

我说这是“不强壮的”,因为那样将无法用于定义(带有赋值的声明),这可能是合乎需要的。但是,通过更改初始正则表达式,可以获得很大的灵活性。这也是值得知道的,因为它在vim中公开了一个非常强大的工具,并且无需依赖插件就可以做很多很好的工作。

进一步阅读:

:help :sub-replace-expression
:help :repeat()