根据单个字符缩进一段代码

时间:2019-07-18 11:12:55

标签: vim

问题的标题听起来可能有点含糊,所以我将在这里更清楚地说明情况。 我在文件中有这些代码行,要针对字符=进行对齐。

const service = require('./service');
const baseService = require('./baseService');
const config = require('../config');
const Promise = require('bluebird');
const errors = require('../errors');

我希望以上几行看起来像这样

const service     = require('./service');
const baseService = require('./baseService');
const config      = require('../config');
const Promise     = require('bluebird');
const errors      = require('../errors');

我希望所有=字符都位于同一列中,并相应地移动随后的代码。我该怎么做才能完成这项任务?

能够执行此操作的插件会很好,但是如果我无需任何插件的帮助就可以执行此操作。这样我也会学到一些东西。

3 个答案:

答案 0 :(得分:7)

使用GNU工具

 :%!column -t -s= -o=      

  % ............. current file
  ! ............. use external command
 -t ............. use tabs
 -s ............. input separator
 -o ............. output separator

代替整个文件,它可以是行1,5的范围,也可以用vip选择一个段落

我最终创建了一个名为AlignText的函数,该函数使用列命令来解决此问题:

" Align text by a chosen char
" https://stackoverflow.com/questions/57093175/
" https://vi.stackexchange.com/a/2412/7339
if !exists('*AlignText')
    function! AlignText(param) range
        execute a:firstline . ',' . a:lastline . '!column -t -s' . a:param . ' -o' . a:param
    endfunction
endif
command! -range=% -nargs=1 Align <line1>,<line2>call AlignText(<q-args>)
" :Align =
" :8,$ Align =

如果您要先测试此功能,然后再将其放入vimrc,请将代码复制到剪贴板中,然后尝试以下操作:

:@+

现在您可以使用类似这样的东西:

:15,22Align /
:Align ,

通过任何更改,我想使用函数调用而不是命令1,不要忘记传递范围并将参数放在引号之间。

截然不同的版本,既不接受也不包含参数,仅使用“ column -t”

" https://stackoverflow.com/questions/57093175/
" https://vi.stackexchange.com/a/2412/7339
function! AlignText(...) range
    if a:0 < 1
        execute a:firstline . ',' . a:lastline . '!column -t'
    else
        execute a:firstline . ',' . a:lastline . '!column -t -s' . a:1 . ' -o' . a:1
    endif
endfunction
command! -range=% -nargs=? Align <line1>,<line2>call AlignText(<f-args>)

答案 1 :(得分:4)

有些插件可以进行这种对齐。例如

对齐或轻松对齐。我已经使用Align很久了,根据您的要求,我只选择这些行并进行<leader>t=

https://github.com/vim-scripts/Align

https://github.com/junegunn/vim-easy-align

您当然可以自己编写代码,找出=之前的最大长度,然后知道应该在partBefore=之间插入多少空格。 (diff)在每一行上。

答案 2 :(得分:1)

注意:最初是answered,位于Vi and Vim Stack Exchange。)

如果您在紧要关头而无需安装和学习任何插件的情况下对齐表达式,这是一种快速的方法。

  1. 在视觉选择中选择线条。例如,如果这是您的整个缓冲区,则可以使用ggVG,但是如果这些行位于文件的中间,则只需进行适当选择即可。也许V4j
  2. =之前插入足够的空格,您可以使用:normal f=9i 进行此操作。 (请注意末尾的“空格”。)这将在视觉选择的各行中的每个=之前添加9个空格。如果9还不够,则添加更多(如您想添加的更多,例如99或999。)请注意,在通过可视选择键入:时,Vim会自动插入范围,因此实际命令为{{ 1}},但您无需键入这些字符。
  3. 移动到要刷新:'<,'>normal f=9i 的列。在这种情况下,第2行的变量名最长,因此请移至该变量名的末尾两个空格,即=的末尾。如果这是整个缓冲区,则可以使用=到达那里。
  4. 停留在同一列上,移至块的第一行。在这种情况下,您将从第2行移至第1行,因此2G2e2l就足够了。
  5. k开始可视块选择。
  6. 移动到块的最后一行。如果这是整个缓冲区,则可以使用Ctrl-V,如果这是文件的中间位置,则可以使用G向下四行,等等。
  7. (可选)使用4j进行选择,直到可视块选择的行的行尾为止。 更新:由于$可以正常工作,即使您没有选择末尾的行,实际上也不需要此步骤。例如,在使用<时很重要$附加到所有行的末尾。
  8. 现在,您可以使用A命令将线向左移动,但是直到它们撞到可视块的左侧为止。每个<只会将它们移动一个<,因此您可能需要多个。因此,可以肯定的是,如果在步骤2中添加了大量的空格,请使用'shiftwidth'(或9<99<。)

Voilà!

这是一个非常酷的技术,当您需要的灵活性超出插件所能提供的灵活性时,它可能会很有用。这是学习和保留Vim工具箱的好方法。