(该问题发布于vim_mac 用户组在 Google 中,但我没有得到解决方案)
在终端 vim 中,按下 <K> 键时,它会正确生成手册页。然而,在 MacVim 中,它会生成一个警告:
WARNING: terminal is not fully functional
然后会显示 ANSI 控制序列,但无法正确转义。可以找到屏幕截图这里。
需要帮助,谢谢!
答案1
这征服术语 Vim插件提供了基于 GUI 的实例Vim具有相当强大的终端仿真。它需要Vim7.0+(Windows 为 7.3+)使用+python
或编译+python3
;MacVim满足这些要求。
下面是使用 ConqueTerm 重新实现正常模式命令功能的函数和绑定K
(您可以将其放在您的中.vimrc
):
:function! ConqueMan()
let cmd = &keywordprg . ' '
if cmd ==# 'man ' || cmd ==# 'man -s '
if v:count > 0
let cmd .= v:count . ' '
else
let cmd = 'man '
endif
endif
let cmd .= expand('<cword>')
execute 'ConqueTermSplit' cmd
:endfunction
:map K :<C-U>call ConqueMan()<CR>
:ounmap K
答案2
这个问题需要大量的编程才能解决,因为正如该线程所述,MacVim 创建了自己的“终端”,该终端不符合任何 terminfo 条目,因此less
无法正确使用它。您可以尝试$TERM
通过 进入 MacVim :set term=...
,但我认为没有任何值适合 MacVim。
如果你有图形手册页查看器,你可以将其设置为keywordprg
。查看:h keywordprg
更多详细信息。
答案3
尝试通过启用内置手册页插件来解决此问题:
runtime ftplugin/man.vim
if has("gui_running")
nnoremap K :<C-U>exe "Man" v:count "<C-R><C-W>"<CR>
endif
答案4
cmcginty 的回答使用 Vim 的:Man
filetype 插件,但这只适用于K运行命令的情况man
(在设置中键入)。以下是仅在调用keywordprg
时提供该功能的解决方案:Kman
function! ManVim(...)
if (&keywordprg == "man")
runtime ftplugin/man.vim
setlocal keywordprg=:Man
endif
normal! K
endfunction
noremap K :call ManVim()<CR>
您可以选择用和来包围它if has("gui_running")
,endif
但我发现这在控制台上也很好用。
请注意,这将检查 Vim 是否会man
在函数调用中运行,以防止keywordprg
在运行其他命令时被拦截,例如在加载 Python 脚本后。下次您点击 时K,keywordprg
将不会匹配。
警告:与原始K命令一样,此解决方案也会卡在连字符和点上,例如手册页(如ssh-add
和 )resolv.conf
。这是因为sh
文件类型不将连字符或点视为关键字字符。
以下是一个解决方案,临时重新定义关键字字符以包含连字符和点:
function! ManVim(...)
if (&keywordprg != "man") " not invoking man, operate as per normal
normal! K
else
if ! exists(":Man") " load man.vim if it's not already present
runtime ftplugin/man.vim
endif
" man pages allow dashes and dots, so we temporarily add those kwd chars
let old_iskeyword = &iskeyword
setlocal iskeyword+=\.,-
if ! exists(":Man") " fallback in case man.vim failed to load
normal! K
endif
let l:man_page = expand("<cword>")
let &l:iskeyword = old_iskeyword
if exists(":Man") " for whatever reason, the exe has to be last
exe "Man" v:count l:man_page
endif
endif
endfunction
noremap K :call ManVim()<CR>
这比我想要的要复杂一些,因为:Man
它会改变当前缓冲区,因此需要最后运行,但是当 man.vim 丢失时的回退必须更早,因为它必须在iskeyword
有额外字符时运行。