我希望能够在 Vim 中阅读手册页。
出于某种原因,Vim 似乎无法通过管道读取程序的输出。例如(man ls) | vi
,似乎不起作用,对于可以解释原因的人的奖励积分。
为了解决这个问题,我一直在使用以下小脚本:
tempo = `mktemp`
man $1 > $tempo ; vi $tempo
这个脚本使用临时文件,我猜它可以正常工作,但我想知道是否有一种在 Vim 中阅读手册页的好方法,而无需求助于创建临时文件
:Man
Vim在其运行时文件中包含一个手册页查看器.
将此行放入您的 vimrc 中:
runtime! ftplugin/man.vim
现在你可以通过运行来阅读 Vim 中语法高亮的手册页:Man
。例如:
:Man 3 printf
更好的是,您只需将光标放在缓冲区中的一个单词上,然后按<Leader>K
( \K
) 即可查看该单词的手册页。
请参阅:h find-manpage
完整的使用和安装说明。
出于某种原因,vim 似乎无法通过管道读取程序的输出 […]
根据手册页,您需要指定一个文件-
才能从标准输入中读取;所以:
man ls | vi -
如果这不起作用,您可以尝试使用进程替换:
vi <(man $1)
它创建了一种伪文件并将其传递给vi
.
在我的系统(Mac OS X)上,我发现输出中的左上角控制字符。相反,我使用了:
export MANPAGER="col -b | vim -MR - "
然后就是例如
man vim
vim 选项关闭修改缓冲区并使其只读。如果您尝试使用 ":q" 退出,这将停止 vim 抱怨(当然,您可以使用 :q!,但您也可以设置选项)。
这对于一般用途也很方便 - 我有以下内容。-c 命令命名缓冲区,只是为了完整性。
alias vimpager="vim -MR -c 'file [stdin]' -"
这是我所做的:我在 .bashrc 中创建了一个函数:
vman() { vim <(man $1); }
当我调用vman
它时,会自动调用 Vim 来显示手册页。它工作得很好。
默认情况下,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 < myscript
orcat myscript | vim test.txt
来实现相同的结果。
我怀疑他们这样做的原因是您可以打开多个输入文件但只能执行一个脚本。如果默认情况下从标准输入读取输入,则只能读取一个缓冲区。
您的示例代码是错误的。
tempo=`mktemp`
man $1 > $tempo; vi $tempo
但你真的只需要
man $1 | vi -
我结合了其他答案,我正在使用
vman() {
export MANPAGER="col -b" # for FreeBSD/MacOS
# Make it read-only
eval 'man $@ | vim -MR +"set filetype=man" -'
unset MANPAGER
}
用法:
vman ls
你也可以按shift-k
你的 c 函数来打印手册页
我有一个更好的解决方案,我使用的那个是这样的:
/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>' -"
希望你会喜欢它。
您始终可以info
对信息页面使用命令并执行info {cmd} | vim
.