MacVim无法正常工作:警告:终端无法完全发挥作用

MacVim无法正常工作:警告:终端无法完全发挥作用

(该问题发布于vim_mac 用户组在 Google 中,但我没有得到解决方案)

在终端 vim 中,按下 <K> 键时,它会正确生成手册页。然而,在 MacVim 中,它会生成一个警告:

WARNING: terminal is not fully functional 

然后会显示 ANSI 控制序列,但无法正确转义。可以找到屏幕截图这里

需要帮助,谢谢!

答案1

征服术语 Vim插件提供了基于 GUI 的实例Vim具有相当强大的终端仿真。它需要Vim7.0+(Windows 为 7.3+)使用+python或编译+python3MacVim满足这些要求。

下面是使用 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 的:Manfiletype 插件,但这只适用于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 脚本后。下次您点击 时Kkeywordprg将不会匹配。

警告:与原始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有额外字符时运行。

相关内容