在缩进线上按下Vim中的“Home”

时间:2010-01-10 02:14:11

标签: vim key line

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

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

我的vimrc中有set smartindentset noautoindent作为“提示”页面告诉我要确保禁用autoindent(虽然它似乎首先没有启用 - 也许该选项是无关紧要的。)

5 个答案:

答案 0 :(得分:29)

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

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

我发现使用 0 w 通常是我去一行第一个非空白字符最方便的方法,它与< kbd> ^ ,更容易到达。 (当然,如果线上没有前导空格,请不要按 w 。)

答案 1 :(得分:13)

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

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

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

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

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

因此vim还包括更高级的缩进模式,文件类型缩进,它允许基于每种语言/文件类型的灵活缩进规则,并且是大多数人(甚至是类C语言)的首选缩进模式。如果你使用文件类型缩进,最好关闭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  

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

答案 2 :(得分: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>

注意:我使用的键盘布局将 Home 映射到 Alt Gr + A ,这就是为什么我正在使用它。如果你必须离开键盘的字母区域才能到达 Home ,你可能应该转到正常模式。

答案 3 :(得分:2)

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

_  <underscore>     [count] - 1 lines downward,
                    on the first non-blank character linewise.

答案 4 :(得分:1)

尝试按0(另请参阅:help 0

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

:imap <C-Home> <esc>0a