1

我有这段 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. 行上的光标跳转到=上一行?

4

3 回答 3

3

我使用Align,我认为它可以完成这项工作:

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

还有表格

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

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

于 2013-05-13T12:41:46.103 回答
1

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

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

于 2013-05-13T12:42:37.237 回答
0

对于完成此任务的快速、非鲁棒、vimmy、非插件方式,请考虑以下命令

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

按成分分析:

.,+6s

在适当的范围内替换命令

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

用于匹配 LHS 赋值的模式(正则表达式)(尽可能多的非空格字符后跟尽可能多的空格字符,后跟赋值运算符 (=))

\=

启动“子替换表达式”上下文。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()
于 2019-02-26T08:57:25.197 回答