17

我有一个使用“home”键返回行首的坏习惯。当我最近开始使用 vim 时,我注意到当我在缩进的行上按 home 键时,它会将我返回到行的开头。在记事本++(我曾经使用的编辑器)中,它会让我回到该行代码的开头,就在缩进之后。

有没有办法在 vim 中复制这种行为?通常,当我按下 home 键时,它处于插入模式,我(通常)将变量粘贴在那里。

set smartindent在我的 vimrc 中有set noautoindent一个“提示”页面告诉我确保禁用自动缩进(尽管它似乎一开始没有启用 - 也许该选项是无关的。)

4

5 回答 5

31

在 Vim 中,有两种常用的方法可以转到一行的“开头”:

  • 0(零)转到文本的第一列
  • ^转到行上的第一个非空白

我发现 using0w通常是我转到一行中第一个非空白字符的最方便的方法,它与键的数量相同^并且更容易到达。(当然,如果该行没有前导空格,请不要按w。)

于 2010-01-10T02:23:16.840 回答
14

您可以重新映射Home为相同^(文档说Home的默认功能等同于移动命令1|):

:map <Home> ^  
:imap <Home> <Esc>^i  

这应该使插入模式映射相当于退出插入模式,按下^然后返回插入模式。我不知道映射运动命令以在插入模式内使用的最佳方法,所以这可能会破坏某些东西,但它似乎有效。

至于你的缩进设置,它们不应该对运动控制产生影响,但我也认为你可能更愿意让它们设置不同。autoindent 只是保留新行的当前缩进(因此,如果您在一行的开头放置 4 个空格,则在您按下回车后,您的新行也将在其前面放置 4 个空格)。我不知道你为什么不想要它,因为它在几乎任何编程语言中都非常有用,甚至只是自由格式的文本。另一方面,smartindent 实现了一些硬编码的轻 C-ish 缩进规则,例如在开始 { 后缩进,在结束 } 后缩进,但不会自动继承前一行的缩进。如果您使用 smartindent,文档建议保持自动缩进。

然而,smartindent 对于不符合其硬编码规则的语言是无用的,甚至是有害的(比如当它自动从任何以“#”开头的行中删除缩进时,它认为这是一个预处理器指令,但对python 程序员试图写一个缩进的注释)。

所以 vim 还包括一个更高级的缩进模式,文件类型缩进,它允许基于每种语言/文件类型的灵活缩进规则,并且是大多数人的首选缩进模式(即使对于类 C 语言)。如果您确实使用文件类型缩进,最好关闭 smartindent(否则它会干扰文件类型缩进,例如将所有注释行移动到 python 文件中的第 0 列)。

就个人而言,我总是启用自动缩进,在可用时使用文件类型,并且从不使用智能缩进。我的 .vimrc 包括:

set autoindent " doesn't interfere with filetype indents, and is useful for text  
if has("autocmd")  
  " Enable file type detection and indentation  
  filetype plugin indent on  
  set nosmartindent  
endif  

我想只有当文件类型不存在文件类型缩进时,如果您正在编辑许多不同的类 C 语言而没有可用的文件类型缩进,您可以做一些事情来打开智能缩进。

于 2010-02-16T20:35:56.353 回答
9

这是我的.vimrc. 如果您在行中的任何位置,这将映射Home到移动到文本的开头,如果您在文本的开头,则映射到第 0 列。

function ExtendedHome()
    let column = col('.')
    normal! ^
    if column == col('.')
        normal! 0
    endif
endfunction
noremap <silent> <Home> :call ExtendedHome()<CR>
inoremap <silent> <Home> <C-O>:call ExtendedHome()<CR>

注意:我正在使用映射HomeAlt Gr+的键盘布局A,这就是我使用它的原因。如果您必须离开键盘的字母字段才能到达Home,您可能应该转到正常模式。

于 2013-03-17T09:38:09.057 回答
2

您还可以_在普通模式下使用以转到当前行的第一个非空白字符。您也可以在此动作中使用计数。

_  <underscore>     [count] - 1 lines downward,
                    on the first non-blank character linewise.
于 2015-07-28T14:56:26.700 回答
1

尝试按下0(另见:help 0

此外,这可能会有所帮助:

:imap <C-Home> <esc>0a
于 2010-01-10T02:22:32.630 回答