问题的标题听起来可能有点含糊,所以我将在这里更清楚地说明情况。
我在文件中有这些代码行,要针对字符=
进行对齐。
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');
我希望所有=
字符都位于同一列中,并相应地移动随后的代码。我该怎么做才能完成这项任务?
能够执行此操作的插件会很好,但是如果我无需任何插件的帮助就可以执行此操作。这样我也会学到一些东西。
答案 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。)
如果您在紧要关头而无需安装和学习任何插件的情况下对齐表达式,这是一种快速的方法。
ggVG
,但是如果这些行位于文件的中间,则只需进行适当选择即可。也许V4j
?=
之前插入足够的空格,您可以使用:normal f=9i
进行此操作。 (请注意末尾的“空格”。)这将在视觉选择的各行中的每个=
之前添加9个空格。如果9还不够,则添加更多(如您想添加的更多,例如99或999。)请注意,在通过可视选择键入:
时,Vim会自动插入范围,因此实际命令为{{ 1}},但您无需键入这些字符。:'<,'>normal f=9i
的列。在这种情况下,第2行的变量名最长,因此请移至该变量名的末尾两个空格,即=
的末尾。如果这是整个缓冲区,则可以使用=
到达那里。2G2e2l
就足够了。k
开始可视块选择。Ctrl-V
,如果这是文件的中间位置,则可以使用G
向下四行,等等。4j
进行选择,直到可视块选择的每行的行尾为止。 更新:由于$
可以正常工作,即使您没有选择末尾的行,实际上也不需要此步骤。例如,在使用<
时很重要$
附加到所有行的末尾。A
命令将线向左移动,但是直到它们撞到可视块的左侧为止。每个<
只会将它们移动一个<
,因此您可能需要多个。因此,可以肯定的是,如果在步骤2中添加了大量的空格,请使用'shiftwidth'
(或9<
或99<
。)Voilà!
这是一个非常酷的技术,当您需要的灵活性超出插件所能提供的灵活性时,它可能会很有用。这是学习和保留Vim工具箱的好方法。