28

我希望能够在 Vim 中阅读手册页。

出于某种原因,Vim 似乎无法通过管道读取程序的输出。例如(man ls) | vi,似乎不起作用,对于可以解释原因的人的奖励积分。

为了解决这个问题,我一直在使用以下小脚本:

tempo = `mktemp`
man $1 > $tempo ; vi $tempo

这个脚本使用临时文件,我猜它可以正常工作,但我想知道是否有一种在 Vim 中阅读手册页的好方法,而无需求助于创建临时文件

4

11 回答 11

43

:ManVim在其运行时文件中包含一个手册页查看器.

将此行放入您的 vimrc 中:

runtime! ftplugin/man.vim

现在你可以通过运行来阅读 Vim 中语法高亮的手册页:Man。例如:

:Man 3 printf

更好的是,您只需将光标放在缓冲区中的一个单词上,然后按<Leader>K( \K) 即可查看该单词的手册页。

请参阅:h find-manpage完整的使用和安装说明。

于 2013-05-25T14:46:04.410 回答
38

出于某种原因,vim 似乎无法通过管道读取程序的输出 […]

根据手册页,您需要指定一个文件-才能从标准输入中读取;所以:

man ls | vi -

如果这不起作用,您可以尝试使用进程替换

vi <(man $1)

它创建了一种伪文件并将其传递给vi.

于 2013-05-24T17:12:41.107 回答
15

在我的系统(Mac OS X)上,我发现输出中的左上角控制字符。相反,我使用了:

export MANPAGER="col -b | vim -MR - "

然后就是例如

man vim

vim 选项关闭修改缓冲区并使其只读。如果您尝试使用 ":q" 退出,这将停止 vim 抱怨(当然,您可以使用 :q!,但您也可以设置选项)。

这对于一般用途也很方便 - 我有以下内容。-c 命令命名缓冲区,只是为了完整性。

alias vimpager="vim -MR -c 'file [stdin]' -"
于 2013-05-24T18:39:06.670 回答
5

这是我所做的:我在 .bashrc 中创建了一个函数:

vman() { vim <(man $1); }

当我调用vman它时,会自动调用 Vim 来显示手册页。它工作得很好。

于 2014-07-31T11:40:33.073 回答
4

默认情况下,vim 从标准输入读取 vimscripts(=vim 命令),而不是输入文件。这就是为什么您不能直接man将输出通过管道传输到 vim 的原因;正如其他人所提到的,您必须使用vim -vim 从标准输入读取。

然而,管道 vimscripts 也很有用:

vim test.txt <<EOF
:%s/[aiueo]/X/g
:wq! output.txt
EOF

以上将使用vim打开test.txt,将所有元音替换为X,将结果写入output.txt,然后退出(忽略对原文件的改动)。它使用此处的文档,但您当然可以将 vim 命令放在一个文件中并使用vim test.txt < myscriptorcat myscript | vim test.txt来实现相同的结果。

我怀疑他们这样做的原因是您可以打开多个输入文件但只能执行一个脚本。如果默认情况下从标准输入读取输入,则只能读取一个缓冲区。

于 2013-05-25T14:58:20.323 回答
4

您的示例代码是错误的。

   tempo=`mktemp`
   man $1 > $tempo; vi $tempo

但你真的只需要

   man $1 | vi -
于 2013-05-24T17:12:24.553 回答
2

我结合了其他答案,我正在使用

vman() {
    export MANPAGER="col -b" # for FreeBSD/MacOS

    # Make it read-only
    eval 'man $@ | vim -MR +"set filetype=man" -'

    unset MANPAGER
}

用法:

vman ls
于 2016-11-28T16:30:38.970 回答
2

你也可以按shift-k你的 c 函数来打印手册页

于 2016-12-07T15:41:58.497 回答
1

我有一个更好的解决方案,我使用的那个是这样的:

/bin/sh -c "unset PAGER;col -b -x | vim -R -c 'set ft=man nomod nolist' -c 'map q :q<CR>' -c 'map <SPACE> <C-D>' -c 'map b <C-U>' -c 'nmap K :Man <C-R>=expand(\"<cword>\")<CR><CR>' -"

希望你会喜欢它。

于 2014-06-05T07:47:42.813 回答
0

很多好的答案,关于插件,值得补充的是*提供了一组方便的功能来打开和阅读手册页:vim-man

根据文档查看手册页。

  • :Man printfprintf(1)-拆分打开手册页
  • :Vman 3 putcputc(3)-在垂直拆分中打开手册页
  • :Man pri<Tab>- 手册页名称的命令完成

* 在 GitHub 上可用:https ://github.com/vim-utils/vim-man 。

于 2020-08-04T08:14:29.087 回答
0

您始终可以info对信息页面使用命令并执行info {cmd} | vim.

于 2019-11-10T23:45:54.023 回答