如何在打开括号后设置自动缩进

11
当我输入一个开放的括号后跟一个换行符时,我希望光标自动缩进一个制表符值 - 就像用开放大括号或方括号一样。出于某种原因,它会缩进 两个 制表符值。 我特别希望能够让它在 .dart 文件中正常工作。 这是我的 .vimrc:
set tabstop=2
set softtabstop=2
set shiftwidth=2
set autoindent
set expandtab

我缺少什么?谢谢。


1
取决于文件类型,可能会有所不同。顺便说一句,建议不要调整制表符宽度(这控制了实际制表符字符的宽度,您无法在 vim 之外始终控制其宽度)。最好将其保持不变,这样您总是能看到相同宽度的制表符,并且必要时使用空格进行对齐。 - D. Ben Knoble
感谢您的评论。已删除tabstop,但仍然遇到相同的问题。特别希望能使其适用于.dart文件。 - rampatowl
你可以定义这个映射: inoremap <silent> (<cr> (<cr>)<up><end><cr><tab> - builder-7000
1个回答

4

所以在vim中有几个缩进选项(请参见:h C-indenting以获得更好的理解) 此外,vimways上有一篇很棒的文章https://vimways.org/2019/indentation-without-dents/强烈推荐

1. smartindent 这是最简单的选项,它并没有做太多事情,请参阅:h 'smartindent'

自动插入缩进:

  • 在以'{'结尾的行后。
  • 在以'cinwords'中的关键字开头的行后。
  • 在以'}'开头的行前(仅使用“O”命令)。

2. cindent 请参阅:h cindent,它可以覆盖smartindent,这就是您目前正在体验的内容(您想要更改的内容)

3. indentexpr,这是真正的东西,它非常强大,大多数插件都使用此选项,但问题是如何使用它。
类似这样的东西。
setlocal indentexpr=GetMyCustomIndent()

" Only define the function once
if exists("*GetMyCustomIndent") | finish | endif

function! GetMyCustomIndent()
    return 0
endfunction


你可以创建一个函数,vim会调用它以确定需要插入多少缩进空格。
结果应该是缩进空格的数量(或-1表示保持当前缩进)。为了尊重用户对'shiftwidth'的选择,返回indentlvl * shiftwidth()。
因此,正如您在这里所看到的,这是非常强大的选项,您可以使用它做很多事情。我建议阅读vimways上的文章。
这里的大部分内容都是从vim文档和文章中复制而来,因此全部归功于vim-doc和文章作者Axel Forsman。

或者您可以使用插件

或者

您可以复制那里的缩进功能并进行一些修改 :p https://github.com/dart-lang/dart-vim-plugin/blob/master/indent/dart.vim

function! DartIndent()
  " Default to cindent in most cases
  let indentTo = cindent(v:lnum)

  let previousLine = getline(prevnonblank(v:lnum - 1))
  let currentLine = getline(v:lnum)

  " Don't indent after an annotation
  if previousLine =~# '^\s*@.*$'
    let indentTo = indent(v:lnum - 1)
  endif

  " Indent after opening List literal
  if previousLine =~# '\[$' && !(currentLine =~# '^\s*\]')
    let indentTo = indent(v:lnum - 1) + &shiftwidth
  endif

  return indentTo
endfunction

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接