我在Bash中写了一个函数来看看男人Vim 中的页面:
viman () { man "$@" | vim -R +":set ft=man" - ; }
这工作正常,如果我向它传递一个不存在的手册页,则会出现唯一的问题。它打印出手册页不存在,但仍然vim
以空缓冲区打开。
因此,我更改了函数来检查错误代码(位于16
此处),如果页面不存在则退出。修改后的函数看起来有点像这样:
viman () { man "$@" | [[ $? == 16 ]] && exit 1 | vim -R +":set ft=man" - ; }
但是,现在它没有任何作用。
如果手册页不存在,我只想退出程序,否则使用vim
.
答案1
试试这个:捕获 man 输出,如果成功启动 vim
viman () { text=$(man "$@") && echo "$text" | vim -R +":set ft=man" - ; }
答案2
我喜欢检查返回码的想法man
;但你不能通过管道进行测试。你可以只运行man
两次:
viman () { man "$@" >/dev/null 2>&1 && man "$@" | vim -R +":set ft=man" - ; }
man ... | vim ...
仅当第一次调用man
成功时才会运行。
答案3
有一个名为 的环境变量MANPAGER
,可用于调用man
您想要显示联机帮助页的命令。这样做的优点是您可以man
直接调用,并且如果手册页不存在,则根本不会运行分页程序。
所以一个包装脚本,如下所示~/bin/vimman
:
#! /bin/sh
vim -R +":set ft=man" -
在你的 shell 初始化文件中的某个地方:
export MANPAGER="$HOME/bin/vimman"
您可以直接运行man foo
Vim 中的联机帮助页。
(根据man
所使用的命令,您还可以:
export MANPAGER='vim -R +":set ft=man" -'
而不是直接使用包装脚本。)
如果您有足够新的 Vim,您可以使用该--not-a-term
选项来阻止 Vim 抱怨 stdin 不是 TTY。
无耻插件:我写的一个小插件方便使用 Vim 作为手册页。
答案4
基于这个答案这将启动 vim,如果缓冲区中没有任何内容,则退出。缺点是启动vim
时屏幕会“闪烁”。当man
找不到页面时,它也不会设置退出代码。
viman () { vim -R +':set ft=man|exe !search(".")?"quit!":""' <(man "$@" 2>/dev/null); }
这是对 Jeff Schaller 答案的改进,因为它不会man
在页面存在时加载页面两次。它也不会vim
像我之前的示例那样不必要地加载。还有它做设置没有man
页面时的退出代码。
viman () { man -f "$@" >/dev/null 2>&1 && vim -R +":set ft=man" <(man "$@"); }
这两个示例都使用 Bash 进程替换以避免出现“Vim: Reading from stdin...”消息。
两者都不将页面加载到变量中。