在缩进线上按下Vim中的"Home"

Rei*_*eid 16 vim key line

我有一个习惯,就是使用'home'键回到一行的开头.当我最近开始使用vim时,我注意到当我按下带有缩进的衬里的主页键时,它会将我返回到行的最开头.在Notepad ++(我以前使用的编辑器)中,它会在缩进后立即将我返回到该行的代码的开头.

有没有办法在vim中复制这种行为?通常,当我按下它时,它在插入模式下(通常)在那里粘贴一个变量.

set smartindent在我的vimrc中,set noautoindent作为"提示"页面告诉我确保禁用autoindent(虽然它似乎首先没有启用 - 也许这个选项是无关紧要的.)

Gre*_*ill 30

有两种常用的方法可以在Vim中找到一行的"开头":

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

我发现使用0w对于我来说通常是最便捷的方式来转到一行上的第一个非空白字符,它与键的数量相同^并且更容易到达.(当然,如果线上没有前导空格,请不要按w.)


小智 13

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

:map <Home> ^  
:imap <Home> <Esc>^i  
Run Code Online (Sandbox Code Playgroud)

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

至于你的缩进设置,它们不应该对运动控制有影响,但我也认为你可能更喜欢让它们设置不同.autoindent只保留新行的当前缩进(因此,如果在行的开头放置4个空格,则在按返回后,新行也将在其前面放置4个空格).我不知道你为什么不想这样,因为它几乎适用于任何编程语言,甚至只是自由形式的文本.另一方面,smartindent实现了一些硬编码的轻微C-ish缩进规则,例如在打开后缩进{,并在关闭后进行deindenting},但不会自动从前一行继承缩进.如果您使用smartindent,文档建议保持自动注册.

但是,smartindent对于那些不符合其硬编码规则的语言来说是无用的,甚至是非常有害的(比如当它自动从任何以'#'开头的行中删除缩进时,它认为这是一个预处理器指令但是错误的python程序员试图写一个缩进的评论).

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

就个人而言,我总是有自动注册,在可用时使用文件类型,从不使用smartindent.我的.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  
Run Code Online (Sandbox Code Playgroud)

我想有一些事情可以让smartindent在文件类型不存在文件类型缩进时打开,如果你正在编辑那些没有文件类型缩进的许多不同的类C语言.


Chr*_*ial 7

这就是我的.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>
Run Code Online (Sandbox Code Playgroud)

注意:我使用映射HomeAlt Gr+ 的键盘布局A,这就是我使用它的原因.如果您必须离开键盘的字母区域Home,则应该转到正常模式.