是否可以在保持文本对齐的同时将制表符转换为空格?

仅当没有前导字符时,仅替换项才有用。

评论

如果您已安装vim-faq,则可以在此处获得脱机答案::h vim-faq并搜索/ tab字符。难记的标签是:h faq-14.16。

#1 楼

您可以使用:retab命令。来自
:help :retab


使用给定的新tabstop值,将包含<Tab>的所有空白序列替换为新的
空白字符串。如果未指定新的
制表符大小或为零,则Vim使用'tabstop'的当前值。
空格的数量。


请注意,该命令接受一个范围,因此您可以进行可视选择,然后
然后只需'expandtab'选定的行。

评论


凉!快速简便地工作!

– DenisKolodin
16年11月4日在9:59

举个例子如何?

–石油
17年5月15日在11:30

#2 楼

您可以按照说明使用:retab,但是,这会将所有制表符更改为空格,而不仅仅是行首的制表符

因此(是制表符)
if :; do
⇥echo "⇥hello"
end


更改为(其中是空格字符):

if :; do
␣␣echo "␣␣hello"
end


这可能会在在某些情况下,将空格更改为制表符时甚至是一个更大的问题!

因此,我在行的开头编写了一个仅更改制表符/空格的小函数: />
" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
    let l:spaces = repeat(' ', &tabstop)

    " Replace tabs with spaces
    if a:expandtab
        silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
    " Replace spaces with tabs
    else
        silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
    endif
endfun


使用此版本,您必须在函数调用中手动指定expandtab
(即:call Retab(1)将制表符更改为空格),但您也可以对其进行修改
&expandtab的当前值(与&tabstop一样)
就像:retab一样。 (我碰巧更喜欢手动指定)。

评论


SO上也有一个答案,该答案仅包括在行的开头重新制表。值得链接,因为该解释很清楚。

–贾兰布
2015年2月6日,11:41

有人可以解释一下a:expandtab中的字母a是什么意思吗?

–约翰c。 j。
19年2月2日在23:36



同样,情况似乎相反(开玩笑:D?)。如果您在.vimrc中设置了expandtab,然后对autocmd BufWritePre *进行了设置::call Retab(&expandtab)-缩进将改为制表符,而不是空格。

–约翰c。 j。
19年2月2日在23:50



#3 楼

Vim提供了!retab命令,它将使用给定的新的tabstop(例如<Tab>)值用新的空白字符串替换:set tabstop=2的所有序列,但是可以修改字符串内部的所有选项卡(例如,在C程序中,应使用\t避免这种情况!)

因此也可以使用以下命令将所有制表符更改为空格:

:%s/\t/  /g


或@Shahbaz建议:

:%s/^\t\+/ g


因此仅转换缩进中使用的制表符。

说明:



%代表整个缓冲区/文件(:help :%

s代表替代品(:help sub-replace-special

\t^I代表制表符

-每个选项卡使用所需的空间

g-表示全局,它将转换同一行中出现的多个选项卡

然后将其转换为正确地缩进整个文件,您可以尝试:gg = G。检查:重新缩进严重缩进的代码以获取更多详细信息。

要默认使用空格而不是制表符,需要在.vimrc文件中添加以下设置:

set tabstop=2     " (ts) width (in spaces) that a <tab> is displayed as
set expandtab     " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2  " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)


替代解决方案是使用tidy


相关:




将制表符转换为vim的空格wikia

缩进空格,但仍在Vim中使用首选的shiftwidth?在stackoverflow SE

如何根据一些合理的默认值轻松重新制表html文件?在askubuntu SE

上,有没有一种方法可以通过使用命令自动取消制表源文件中的所有内容?在程序员处

在Vim SE上重新缩进严重缩进的代码

Tab键== 4个空格,并在stackoverflow中在Vim中使用花括号后自动缩进

缩进空格,但仍在Vim中使用首选的shiftwidth?在stackoverflow
(相反)如何在Vim或Linux中将空格转换为制表符?在stackoverflow SE


评论


我至少会做%s / ^ \ t \ + / g,以便仅转换缩进中使用的制表符。同样,gg = G对于诸如python这样的语言可能会造成灾难性的影响。

– Shahbaz
17 Mar 4 '17 at 15:49



:%s / \ t / / g是最好的解决方案,也是最简单的解决方案。

– Amruth A
20-4-9的7:01

#4 楼

尝试使用:

expand -t 4 input_filename output_filename


expand是用于将制表符转换为空格的命令行工具,您可以从shell或:!expand运行它。

它在POSIX中,因此应该在大多数系统上都可用。顺便说一句,unexpand会做相反的操作。

评论


什么是扩展?

–muru
16年2月1日在12:47

Expand是一个内置的终端命令,用于将制表符复制到空格。请在以下链接中找到详细说明。 computerhope.com/unix/uexpand.htm

– Ankit Shah
16-2-1在13:48



如果这些是外部命令,则应提及。

–muru
16年1月1日于13:49

添加了进一步的描述。请查阅

– Ankit Shah
16年2月1日于13:52

您也可以在vim内执行:%!expand -t 4。更好的是,您还可以使用当前的偏移宽度选项::exe'%!expand -t'。 &shiftwidth

–EvergreenTree
16年2月1日在21:29

#5 楼

为了完整起见,在您指定将制表符替换为空格之后,也可以使用=来修复缩进。在正常模式下,可以通过键入:set expandtab来实现。然后,可以通过两种方式使用=:在可视模式下,单个=可以修复所选代码块的缩进。
在正常模式下,gg=G将修复整个文件,其中gg将光标移动到文件的开头,然后应用=,然后G将光标移动到文件的结尾。

参考:链接

评论


假设vim可以正确地重新计算当前的缩进(可能不是这种情况)-甚至对于非结构化文件或在缩略规则略有不同的其他编辑器中编写的代码。

–ideasman42
18年5月9日在5:56



谢谢@ ideasman42;我已经添加了答案,以使其更加完整。

– Samuel Li
18年5月9日在21:07