默认的VIM缩进命令会缩进shiftwidth个空格
例如:
>> Indent line by shiftwidth spaces
<< De-indent line by shiftwidth spaces
有没有一种方法可以缩进一个或N个(其中n!= shiftwidth)空格?
一种方法是使用 Ctrl+V
在该块中垂直选择列,然后使用 I
垂直插入,然后输入一个 space
并按 <Esc>
。 但是否有更好的方法?
默认的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 spaces}是你想要插入的空格数。
虽然有点冗长,但对于任何范围都很有效。如果你想对整个文件进行操作,你可以做到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}
,但在某些情况下非常有用。
使用tabstop和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}
也许掌握多种方法比只了解一种更好?毕竟,有时候最佳解决方案取决于问题本身 :):
,接着输入 '<,'>s/^/ /
来添加一个空格。谢谢! - ryanjdillonet
、ts
和sw
的人:它们分别代表着expandtab
、tabstop
和shiftwidth
。 - winklerrr使用Visual Block模式在vi中将一块代码缩进三个空格:
选择你想要缩进的代码块。在normal模式下使用Ctrl+V并用箭头向下选择文本。当它被选择后,输入“:”来给所选文本块发送命令。
以下内容将出现在命令行中::'<,'>
要将缩进设置为3个空格,请键入le 3
并按回车。这是将出现的内容::'<,'>le 3
所选文本立即缩进3个空格。
使用Visual Line模式在vi中将一块代码缩进三个空格:
进入normal模式,按以下键:
Vjjjj:le 3
你所做的操作解释:
V
表示开始选择文本。
jjjj
向下箭头移动 4 行,高亮 4 行文本。
:
告诉 vi 你将输入一个指令来处理被选中的文本。
le 3
表示将高亮的文本向右缩进 3 行。
:le 3
缩进是从左边距(列1/0)开始的解决方案,但我认为原帖想要从文本块的位置进一步缩进。例如,为了更好地垂直对齐代码/文本,与更好的位置相比,自动缩进的文本只有几个空格。 - Paul Lemmens<position cursor at top of block>
m a
<position cursor at bottom of block>
m b
进行替换命令,使得你的标记之间每个换行符都被替换为所需数量的空格(在此示例中为2个空格):
:'a,'bs/^/ /g
Ctrl-V
选择一个或多个空格列块,然后在相同位置上复制和粘贴。我喜欢使用空格来缩进一个可视选择,只需一个空格:
vnoremap <silent> <space> :s/^/ /<CR>:noh<CR>gv
我无法使用 Shift+Space 来取消缩进,所以我使用 z:
vnoremap <silent> z :s/^\s\=//<CR>:noh<CR>gv
我需要在vim脚本中将给定数量的空格,amount
,去除。这个方法可行:
let sw_setting = &shiftwidth
set shiftwidth=1
exe "normal v" . amount . "<"
let &shiftwidth = sw_setting
exe...
行,使其在正常模式下执行"<<"重复amount
次。也就是说:如果amount
为3,则不要使用normal v3<
,而应该使用normal <<<<<<
。
sw
?那是它存在的目的。 - Daenyth{count}>
将缩进{count}*'shiftwidth'
,而在普通模式下,{count}
用于计算已缩进的行数。也许这正是你想要的。请注意,对于可视块选择,情况相同,但空格插入在块的第一列之前,而不是行的开头。 - Benoit