默认的 VIM 缩进命令按 shiftwidth 空格缩进
例如
>> Indent line by shiftwidth spaces
<< De-indent line by shiftwidth spaces
有没有办法用一个或 n 个(其中 n != shiftwidth)空格缩进?
一种方法是使用
Ctrl+V
垂直选择块中的列。然后,I
垂直插入,然后输入 space
和 <Esc>
.但是有更好的方法吗?
最佳答案
我不确定是否有更好的方法。但是,有几种方法可以做到(无论如何我都能想到)......
您的视觉块解决方案
就像你说的:按 Ctl-V
选择你想要的线路,按I
插入,然后输入空格数。
搜索
与上述类似,但更灵活 - 您可以与“选择段落”一起使用 vip
命令,或任何范围:按 v
或 vip
或者你有什么选择范围和类型:s/^/{n spaces}
其中 {n 个空格} 是您要插入的空格数。
它有点冗长,但几乎适用于任何范围。哎呀,如果你想做整个文件,你可以做 Ctl-A
(取决于操作系统)并缩进整个文件(或者只是跳过整个视觉模式的事情,只是在命令模式下执行...如 :1,$s/^/{n spaces}
请注意,您不必在 s///中包含第三个斜杠,因为您没有在搜索末尾放置任何开关。
全局
也许您只想缩进匹配某个模式的行。说...包含 foo 的所有行。没问题:输入 :g/foo/s/^/{n spaces}
如果具有类似模式的多行部分,则全局特别方便。您可以转入普通模式并选择所需的行并相应地缩进::g/foo/norm Vjj:s/^/{n spaces}Ctl-V{Enter}
.稍微复杂一点的额外 Ctl-V{Enter}
最后但在某些情况下有用。
使用制表位和 shiftwidth
是的,如果你经常这样做 - 我会做 :set ts=2
和 :set et
和 :set sw=2
并使用 >>
和 <<
每一种方式...
创建函数
好的,所以仍然不够简短,无论出于何种原因,您都需要做很多事情,而且您不能忍受 sw
, et
和 ts
设置。没问题,写个快速函数,给个localleader
映射:
function! AddSpace(num) range
let s:counter = 0
let s:spaces = ''
while s:counter < a:num
let s:spaces .= ' '
let s:counter = s:counter + 1
endwhile
execute a:firstline .','. a:lastline .'s/^/'. s:spaces
endfunction
:map <LocalLeader>i :call AddSpace(3)Ctl-V{enter}
也许只知道一种以上的方法比只知道一种更好?毕竟,有时最好的解决方案取决于问题:)
关于Vim:缩进一个空格(不是 shiftwidth 空格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9287813/