Nvim :help
页面,从 生成 于 源代码, 使用 tree-sitter-vimdoc 解析器。
CTRL-F
(不会插入) "o" 如果您在任何位置输入 <CR>
或使用 "o" 命令(不在插入模式下!) "O" 如果您使用 "O" 命令(不在插入模式下!) "e" 如果您在行首输入 "else" 的第二个 'e'CTRL-F
是此功能的默认键。如果为此定义 CTRL-I
,请小心,因为 CTRL-I
是 <Tab>
的 ASCII 码。* 当一个 "*" 位于键之前时,Vim 会在插入键之前重新缩进该行。如果 'cinkeys' 包含 "*<Return>",Vim 会在打开新行之前重新缩进当前行。0 当一个零位于键之前(但出现在 "!" 或 "*" 之后)时,Vim 只会在键是您在行中输入的第一个字符时重新缩进该行。当用在 "=" 之前时,Vim 仅会在单词之前只有空格时重新缩进该行。CTRL-F
。o 当您使用 "o" 命令或 Vim 在当前行下方打开新行(例如,当您在插入模式下输入 <Enter>
时)时,会重新缩进一行。O 当您使用 "O" 命令时,会重新缩进一行。e 当您在行首输入 "else" 的第二个 'e' 时,会重新缩进一行。: 当您在标签或 case 语句后输入 ":" 时,会重新缩进一行。不要为 "class::method" 中的 ":", 在 C++ 中重新缩进。要为任何 ":" 重新缩进,请使用 "<:>"。=word 当您输入 "word" 的最后一个字符时,会重新缩进。 "word" 实际上可能是另一个单词的一部分。因此,"=end" 会在您输入 "endif" 或 "endwhile" 中的 "d" 时触发重新缩进。但不会在您输入 "bend" 时触发。在完成操作生成以 "word" 开头的单词时,也会重新缩进。 "0=word" 只会在单词之前只有空格时重新缩进。 =~word 类似于 =word,但不区分大小写。<Enter>
键时都缩进,而是在按 <Tab>
键时才缩进,我建议:set cinkeys=0{,0},:,0#,!<Tab>,!^F您可能也希望关闭 'autoindent'。
<BS>
、<Tab>
或 <Space>
来更改缩进,或者使用 CTRL-T
或 CTRL-D
后重新缩进。if (cond) if (cond) if (cond) { { { foo; foo; foo; } } }
if (cond) { if (cond) { if (cond) { foo; foo; foo; } } } else else else { { { bar; bar; bar; } } }
if (cond) if (cond) if (cond) foo; foo; foo; else else else { { { bar; bar; bar; } } }
func() func() func() { { { int foo; int foo; int foo;
if (cond) if (cond) if (cond) { { { foo; foo; foo;
if (cond) if (cond) if (cond) { { { foo; foo; foo; } } }
func() func() func() { { { if (cond) if (cond) if (cond) { { { a = b; a = b; a = b; } } } } } }
func() func() func() { { { { { { stmt; stmt; stmt; LABEL: LABEL: LABEL: } } } } } }
switch (x) switch(x) { { case 1: case 1: a = b; a = b; default: default: } }
case 11: case 11: a = a + 1; a = a + 1; b = b + 1;
switch (a) { switch (a) { case 1: { case 1: { break; break; } }
switch (x) switch(x) { { case 1: case 1: a = b; a = b; break; break; default: default: a = 0; a = 0; break; break; } }
{ { public: public: a = b; a = b; private: private: } }
public: public: a = a + 1; a = a + 1; b = b + 1;
namespace { namespace { void function(); void function(); } } namespace my namespace my { { void function(); void function(); } }
extern "C" { extern "C" { void function(); void function(); } } extern "C" extern "C" { { void function(); void function(); } }
func(a, b) func(a, b) func(a, b) int a; int a; int a; char b; char b; char b;
int int int func() func() func()
class MyClass : class MyClass : public BaseClass public BaseClass {} {} MyClass::MyClass() : MyClass::MyClass() : BaseClass(3) BaseClass(3) {} {}
a = b + 9 * a = b + 9 * c; c;
/* /* text. text. */ */
/******** /******** text. text. ********/ ********/
a = b; a = b; /* comment */ /* comment */ c = d; c = d;
if (c1 && (c2 || if (c1 && (c2 || c3)) c3)) foo; foo; if (c1 && if (c1 && (c2 || c3)) (c2 || c3)) { {
if (c123456789 if (c123456789 && (c22345 && (c22345 || c3)) || c3))
c = c1 && c = c1 && ( ( c2 || c2 || c3 c3 ) && c4; ) && c4;
if ( c1 if ( c1 && ( c2 && ( c2 || c3)) || c3)) foo; foo;
a_long_line( a_long_line( argument, argument, argument); argument); a_short_line(argument, a_short_line(argument, argument); argument);
if (condition1 if (condition1 && condition2) && condition2) action(); action(); function(argument1 function(argument1 && argument2); && argument2);
c = c1 && ( c = c1 && ( c2 || c2 || c3 c3 ) && c4; ) && c4; if ( if ( c1 && c2 c1 && c2 ) ) foo; foo;
if (cond1 && if (cond1 && cond2 cond2 ) )
object.add(new ChangeListener() { public void stateChanged(ChangeEvent e) { do_something(); } });
var bar = { foo: { that: this, some: ok, }, "bar":{ a : 2, b: "123abc", x: 4, "y": 5 } }
cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,N0,E0,ps,ts,is,+s, c3,C0,/0,(2s,us,U0,w0,W0,k0,m0,j0,J0,)20,*70,#0,P0Vim 将一行放在第 1 列,如果
searchpairpos()
的最大扫描距离。较大的值在处理非常长的形式时以性能换取正确性。值为 0 将无限扫描。默认值为 300。(defn bad [] "Incorrect indentation") (defn good [] "Correct indentation")
" Default let g:clojure_fuzzy_indent = 1 let g:clojure_fuzzy_indent_patterns = ['^with', '^def', '^let'] let g:clojure_fuzzy_indent_blacklist = \ ['-fn$', '\v^with-%(meta|out-str|loading-context)$']
"^foo"
这样的模式将与所有这些候选者匹配:foobar
、my.ns/foobar
和 #'foobar
。" Default let g:clojure_special_indent_words = \ 'deftype,defrecord,reify,proxy,extend-type,extend-protocol,letfn'
(def default "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.") (def aligned "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.")
(foo bar baz)
1
会更改此行为,以便所有子形式都与同一列对齐,模拟 clojure-mode.el 的默认行为(foo bar baz)
let fortran_do_enddo=1在这种情况下,do 循环将被缩进。如果您的所有循环都只是在 .f90 文件中采用 do/enddo 形式,那么您应该使用 autocommand 设置缓冲区标志,例如
au! BufRead,BufNewFile *.f90 let b:fortran_do_enddo=1以便在 .f90 文件中缩进 do 循环,并在扩展名为 .for 的其他 Fortran 文件中将其保留。
let fortran_indent_less=1可以通过设置相应的缓冲区局部变量来实现更精细的控制,如下所示:
let b:fortran_indent_less=1
:let g:html_indent_script1 = "inc" :let g:html_indent_style1 = "inc"
:let g:html_indent_attribute = 1
:let g:html_indent_inctags = "html,body,head,tbody"您也可以使用以下命令删除此类标签:
:let g:html_indent_autotags = "th,td,tr,tfoot,thead"这两个变量的默认值都是空的。 注意: 初始的 "inctags" 只在每个 Vim 会话中定义一次。
:call HtmlIndent_CheckUserSettings()详细信息:“块标签”内具有“外来”内容的缩进计算
<script>
: {customizable}
如果是块的第一行 : cindent(v:lnum) 如果属性为空或包含“java” : -1 否则(vbscript、tcl 等) <style>
: {customizable}
如果是块的第一行 : GetCSSIndent() 否则 <!-- --> : -1:let g:MATLAB_function_indent = {0, 1 or 2 (default)}其中 0 代表经典,1 代表缩进嵌套函数,2 代表缩进所有函数。
:%s /\r$//g或者,您可以简单地 :let 变量 `PHP_removeCRwhenUnix` 为 1,脚本将在 Vim 加载 PHP 文件时(在每次 BufRead 时)静默地删除它们。
:let g:PHP_autoformatcomment = 0否则,将从 'formatoptions' 字符串中删除 't',并将添加 "qrowcb",有关更多信息,请参见 fo-table。
# Comment // Comment /* Comment */
:let g:PHP_default_indenting = N例如,当 N = 1 时,将得到以下结果:
<?php if (!isset($History_lst_sel)) if (!isset($History_lst_sel)) if (!isset($History_lst_sel)) { $History_lst_sel=0; } else $foo="bar"; $command_hist = TRUE; ?>(请注意 PHP 容器标记和代码之间的额外缩进)。
:let g:PHP_BracesAtCodeLevel = 1将得到以下结果:
if ($foo) { foo(); }而不是:
if ($foo) { foo(); }注意: 如果使用此选项,缩进速度会略微变慢,因为一些优化将不可用。
:let g:PHP_vintage_case_default_indent = 1在 PHP 中,'case/default' 块内不需要花括号,因此 'case:' 和 'default:' 的缩进与 'switch()' 相同,以避免无意义的缩进。您可以使用上述选项恢复到传统方式。
$user_name_very_long->name() ->age() ->info();
:let g:PHP_noArrowMatching = 1
$user_name_very_long->name() ->age() ->info();
let g:PHP_IndentFunctionCallParameters = 1函数调用参数将缩进 1 个额外级别。对于两个空格的缩进:
function call_the_thing( $with_this, $and_that ) { $this->do_the_thing( $with_this, $and_that ); }
let g:PHP_IndentFunctionDeclarationParameters = 1
function call_the_thing( $with_this, $and_that ) { $this->do_the_thing( $with_this, $and_that ); }
let g:python_indent = {}给出的示例是默认值。请注意,字典值被设置为表达式,这样您就可以稍后更改 'shiftwidth' 的值,而无需更新这些值。
let g:python_indent.open_paren = 'shiftwidth() * 2'在嵌套括号后缩进
let g:python_indent.nested_paren = 'shiftwidth()'连续行的缩进
let g:python_indent.continue = 'shiftwidth() * 2'默认情况下,多行构造中的右括号会对齐到前一行的第一个非空格字符的下方。如果您希望将其对齐到开始多行构造的行第一个字符的下方,请重置此键:
let g:python_indent.closed_paren_align_last_line = v:false该方法使用 searchpair() 向后查找未关闭的括号。这有时会很慢,因此在 150 毫秒后会超时。如果您发现缩进不正确,可以在毫秒内设置更大的超时时间:
let g:python_indent.searchpair_timeout = 500如果向后查找未关闭的括号仍然太慢,特别是在复制粘贴操作期间,或者如果您不需要在多行括号内缩进,您可以完全禁用此功能:
let g:python_indent.disable_parentheses_indenting = 1为了向后兼容,还支持这些变量:
g:pyindent_open_paren g:pyindent_nested_paren g:pyindent_continue g:pyindent_searchpair_timeout g:pyindent_disable_parentheses_indentingR ft-r-indent
let r_indent_align_args = 0
let r_indent_ess_comments = 1
let r_indent_comment_column = 30
let r_indent_ess_compatible = 1
### r_indent_ess_compatible = 1 ### r_indent_ess_compatible = 0 foo <- foo <- function(x) function(x) { { paste(x) paste(x) } }
'\(&\||\|+\|-\|\*\|/\|=\|\~\|%\|->\)\s*$'
匹配的行之后缩进。如果您希望在与其他模式匹配的行之后进行缩进,则应在您的 vimrc 中设置 `r_indent_op_pattern` 的适当值。let b:verilog_indent_modules = 1然后将缩进模块块。要停止此操作,请删除该变量。
:unlet b:verilog_indent_modules要仅为 Verilog 文件设置变量,可以使用以下语句:
au BufReadPost * if exists("b:current_syntax") au BufReadPost * if b:current_syntax == "verilog" au BufReadPost * let b:verilog_indent_modules = 1 au BufReadPost * endif au BufReadPost * endif此外,设置变量 `b:verilog_indent_width` 可以更改缩进宽度(默认值为 'shiftwidth')。
let b:verilog_indent_width = 4 let b:verilog_indent_width = shiftwidth() * 2此外,您可以打开调试问题的详细模式:
let b:verilog_indent_verbose = 1请确保首先执行 ":set cmdheight=2",以允许显示消息。
ENTITY sync IS PORT ( clk : IN STD_LOGIC; reset_n : IN STD_LOGIC; data_input : IN STD_LOGIC; data_out : OUT STD_LOGIC ); END ENTITY sync;要关闭此功能,请在 `vimrc` 文件中添加:
let g:vhdl_indent_genportmap = 0这将导致先前的对齐示例发生变化:
ENTITY sync IS PORT ( clk : IN STD_LOGIC; reset_n : IN STD_LOGIC; data_input : IN STD_LOGIC; data_out : OUT STD_LOGIC ); END ENTITY sync;默认情况下,将对等号右侧赋值 “<=” 语句进行对齐。这会导致以下对齐示例:
sig_out <= (bus_a(1) AND (sig_b OR sig_c)) OR (bus_a(0) AND sig_d);要关闭此功能,请在 `vimrc` 文件中添加:
let g:vhdl_indent_rhsassign = 0这将导致先前的对齐示例发生变化:
sig_out <= (bus_a(1) AND (sig_b OR sig_c)) OR (bus_a(0) AND sig_d);全行注释(以 "--" 开头的行)将缩进到与上一行注释对齐,前提是 "--" 后面有一个空格。
sig_a <= sig_b; -- start of a comment -- continuation of the comment -- more of the same comment在插入模式下,在键入 "-- "(注意空格 " ")之后,按 `CTRL-F` 将使当前的 "-- " 与上一行的 "--" 对齐。
sig_c <= sig_d; -- comment 0 -- comment 1 -- comment 2 --debug_code: --PROCESS(debug_in) --BEGIN -- FOR i IN 15 DOWNTO 0 LOOP -- debug_out(8*i+7 DOWNTO 8*i) <= debug_in(15-i); -- END LOOP; --END PROCESS debug_code; -- comment 3 sig_e <= sig_f; -- comment 4 -- comment 5得到以下结果:
sig_c <= sig_d; -- comment 0 -- comment 1 -- comment 2 --debug_code: --PROCESS(debug_in) --BEGIN -- FOR i IN 15 DOWNTO 0 LOOP -- debug_out(8*i+7 DOWNTO 8*i) <= debug_in(15-i); -- END LOOP; --END PROCESS debug_code; -- comment 3 sig_e <= sig_f; -- comment 4 -- comment 5请注意,"--debug_code:" 没有与 "-- comment 2" 对齐,因为 "--debug_code:" 中的 "--" 后面没有空格。
:let g:vim_indent_cont = shiftwidth() * 3默认值为 shiftwidth 的三倍。
let g:yaml_indent_multiline_scalar = 1