2

这个问题显然远远超出了我对 Vim 的理解。这两个键绑定仅相差两个字符,否则它们完全相同。

" Move viewport up/down.
noremap <C-d> :exe "normal! " . (winheight(".") / 4) . "\<C-e>"<CR>
noremap <C-u> :exe "normal! " . (winheight(".") / 4) . "\<C-y>"<CR>

然而,底部的 ( <C-u>) 可以正常工作,而顶部的 ( ) 会导致此错误:

E114:缺少引号:“\” E15:无效的表达式:“正常!”。(winheight(".") / 4) 。"\"

我已经重新启动 Vim 两次,并确保只有这些命令绑定到它们的键。我也尝试切换它们,以防由于某种原因相关,但<C-d>命令仍然崩溃。

那么沃尔多在哪里?


输出gvim.exe --version

VIM - Vi IMproved 7.3(2010 年 8 月 15 日,2010 年 8 月 16 日 10:31:31 编译)
支持 OLE 的 MS-Windows 64 位 GUI 版本
由 george@reilly.org 编译
带有 GUI 的巨大版本。包含 (+) 或不包含 (-) 的功能:
+阿拉伯语 +autocmd +balloon_eval +browse ++builtin_terms +byte_offset +cindent
+clientserver +剪贴板 +cmdline_compl +cmdline_hist +cmdline_info +comments
+隐藏 +cryptv +cscope +cursorbind +cursorshape +dialog_con_gui +diff
+digraphs -dnd -ebcdic +emacs_tags +eval +ex_extra +extra_search +farsi
+file_in_path +find_in_path +float +folding -footer +gettext/dyn -hangul_input
+iconv/dyn +insert_expand +jumplist +keymap +langmap +libcall +linebreak
+lispindent +listcmds +localmap -lua +menu +mksession +modify_fname +mouse
+mouseshape +multi_byte_ime/dyn +multi_lang -mzscheme +netbeans_intg +ole
-osfiletype +path_extra -perl +persistent_undo +postscript +printer +profile
+python/dyn -python3 +quickfix +reltime +rightleft -ruby +scrollbind +signs
+smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary
+tag_old_static -tag_any_white -t​​cl -tgetent -termresponse +textobjects +title
+工具栏 +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo
+vreplace +wildignore +wildmenu +windows +writebackup -xfontset -xim
-xterm_save -xpm_w32
   系统 vimrc 文件: "$VIM\vimrc"
     用户 vimrc 文件:“$HOME\_vimrc”
 第二个用户 vimrc 文件:“$VIM\_vimrc”
      用户 exrc 文件:“$HOME\_exrc”
  第二个用户 exrc 文件:“$VIM\_exrc”
  系统 gvimrc 文件: "$VIM\gvimrc"
    用户 gvimrc 文件:“$HOME\_gvimrc”
第二个用户 gvimrc 文件:"$VIM\_gvimrc"
    系统菜单文件: "$VIMRUNTIME\menu.vim"
编译:cl -c /W3 /nologo -I。-Iproto -DHAVE_PATHDEF -DWIN32 -DFEAT_CSCOPE
-DFEAT_NETBEANS_INTG -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 /Fo.\ObjGOY/ /Ox /GL -DNDEBUG  
/Zl /MT -DFEAT_OLE -DFEAT_MBYTE_IME -DDYNAMIC_IME -DFEAT_MBYTE -DFEAT_GUI_W32
-DDYNAMIC_ICONV -DDYNAMIC_GETTEXT -DFEAT_PYTHON -DDYNAMIC_PYTHON  
-DDYNAMIC_PYTHON_DLL=\"python27.dll\" -DMSWINPS -DFEAT_HUGE /Fd.\ObjGOY/ /Zi
链接:链接 /RELEASE /nologo /subsystem:windows /LTCG:STATUS oldnames.lib kernel32.lib advapi32.lib
shell32.lib gdi32.lib comdlg32.lib ole32.lib uuid.lib /machine:AMD64 /nodefaultlib gdi32.lib version.lib   
winspool.lib comctl32.lib advapi32.lib shell32.lib /machine:AMD64 /nodefaultlib libcmt.lib oleaut32.lib user32.lib

我从官方 Vim 下载页面上的链接下载了 Vim:

http://code.google.com/p/vim-win3264/downloads/list

4

1 回答 1

6

noremap解释<C-e><C-y>之前exe一样,exe然后输入控制序列,这些序列不一定被正确解释。一种可能的解决方法是定义命令,然后映射到它们:

com! ShiftDown exe "norm!" winheight(".")/4 . "<C-e>"
com! ShiftUp exe "norm!" winheight(".")/4 . "<C-y>"
noremap <C-d> :ShiftDown<CR>
noremap <C-u> :ShiftUp<CR>

也可以通过使用<C-v> <C-e><C-v> <C-y>插入这些字符直接映射命令:

noremap <C-d> :exe "norm!" winheight(".")/4 . "<C-v><C-e>"<CR>
noremap <C-u> :exe "norm!" winheight(".")/4 . "<C-v><C-y>"<CR>

或者,<LT>可用于插入文字<

noremap <C-d> :exe "norm!" winheight(".")/4 . "<Bslash><LT>C-e>"<CR>
noremap <C-u> :exe "norm!" winheight(".")/4 . "<Bslash><LT>C-y>"<CR>

注意虽然文字\可能有效,但:help map建议使用<Bslash>是安全的。

于 2013-01-16T02:44:09.800 回答