4

我想映射主页按钮,以便 vim 转到 vim 中的第一个非空白字符。但是映射主页按钮没有任何作用?如果我映射另一个键,那么它可以正常工作。

见下面我的 vimrc 文件:

map <Home> 0w
imap <Home> <ESC>0wi

以上不起作用。虽然以下工作(例如 Ctrl-F)

map <C-f> 0w
imap <C-f> <ESC>0wi

有没有办法将 Home 键映射到这个?我真的需要它,因为我在使用 Notepad++、Sublime text 2、Visual Studio 时已经习惯了它……

我还尝试了以下方法,但没有结果。当使用另一个键时,它会再次工作...... http://vim.wikia.com/wiki/Smart_home

4

1 回答 1

9

来自Vim FAQ(也可以通过这个不错的插件获得):

20.4. I am not able to create a mapping for the <xxx> key. What is wrong?

1) First make sure, the key is passed correctly to Vim. To determine if
   this is the case, put Vim in Insert mode and then hit Ctrl-V (or
   Ctrl-Q if your Ctrl-V is remapped to the paste operation (e.g. on
   Windows if you are using the mswin.vim script file) followed by your
   key.

   If nothing appears in the buffer (and assuming that you have
   'showcmd' on, ^V remains displayed near the bottom right of the Vim
   screen), then Vim doesn't get your key correctly and there is nothing
   to be done, other than selecting a different key for your mapping or
   using GVim, which should recognise the key correctly.

这样你可以检查home你按下的键是否与 Vim 理解的相同<Home>

另一种可能性是其他一些映射正在干扰这个映射。您可以尝试以下方法:

noremap <Home> 0w
inoremap <Home> <ESC>0wi

编辑:

问题似乎在于您的终端正在发送homeVim 无法识别为<Home>.

我相信最好的解决方案是让 Vim 正确识别该密钥,这样您就可以将您的密钥移动.vimrc到其他终端/系统而无需更改。

来自:h xterm-end-home-keys

  On some systems (at least on FreeBSD with XFree86 3.1.2) the codes that the
  <End> and <Home> keys send contain a <Nul> character.  To make these keys send
  the proper key code, add these lines to your ~/.Xdefaults file:

  *VT100.Translations:      #override \n\
        <Key>Home: string("0x1b") string("[7~") \n\
        <Key>End: string("0x1b") string("[8~")

如果这不起作用,您可以尝试:set t_kh=^V^[[1~. 如果它有效,您可以将其附在检查您的终端类型时。可以在以下位置找到更多信息:h terminal options


编辑2:

20.4. I am not able to create a mapping for the <xxx> key. What is wrong?

:
:

3) If the key is seen, but not as itself and not as some recognizable
   key, then there is probably an error in the terminal library for the
   current terminal (termcap or terminfo database). In that case >

        :set term?

   will tell you which termcap or terminfo Vim is using. You can try to
   tell vim, what termcode to use in that terminal, by adding the
   following to your vimrc: >

        if &term == <termname>
            set <C-Right>=<keycode>
        endif

   where <termname> above should be replaced by the value of 'term'
   (with quotes around it) and <keycode> by what you get when hitting
   Ctrl-V followed by Ctrl-Right in Insert mode (with nothing around
   it). <C-Right> should be left as-is (9 characters). Don't forget that
   in a :set command, white space is not allowed between the equal sign
   and the value, and any space, double quote, vertical bar or backslash
   present as part of the value must be backslash-escaped.

   Now you should be able to see the keycode corresponding to the key
   and you can create a mapping for the key using the following command: >

        :map <C-Right>  <your_command_to_be_mapped>

For more information, read 

    :h map-keys-fails
    :h map-special-keys
    :h key-codes
于 2013-06-06T11:43:08.910 回答