Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在vim中读取手册页而不使用临时文件的方法是什么_Linux_Unix_Vim_Vi_Manpage - Fatal编程技术网

Linux 在vim中读取手册页而不使用临时文件的方法是什么

Linux 在vim中读取手册页而不使用临时文件的方法是什么,linux,unix,vim,vi,manpage,Linux,Unix,Vim,Vi,Manpage,我希望能够阅读vim中的手册页。出于某种原因,vim似乎无法通过管道读取程序的输出(即“(man ls)| vi”似乎不起作用,可以解释原因的人会得到额外的分数),为了解决这个问题,我使用了以下小脚本: tempo = `mktemp` man $1 > $tempo ; vi $tempo 这个脚本使用临时文件,我想它工作得很好,但是我想知道是否有一种在vim中读取手册页的好方法,而不必创建临时文件。您的示例代码是错误的 tempo=`mktemp` man $1 >

我希望能够阅读vim中的手册页。出于某种原因,vim似乎无法通过管道读取程序的输出(即“(man ls)| vi”似乎不起作用,可以解释原因的人会得到额外的分数),为了解决这个问题,我使用了以下小脚本:

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

这个脚本使用临时文件,我想它工作得很好,但是我想知道是否有一种在vim中读取手册页的好方法,而不必创建临时文件。您的示例代码是错误的

   tempo=`mktemp`
   man $1 > $tempo; vi $tempo
但你真的只需要

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

根据手册页,您需要指定一个
-
文件,以便从标准输入读取该文件;因此:

man ls | vi -
如果这不起作用,您可以尝试使用流程替换:

vi在我的系统(MacOSX)上,我发现上面的控制字符在输出中。相反,我使用了:

export MANPAGER="col -b | vim -MR - "
那就举个例子

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

这对于一般使用也很方便-我有以下几点。为了完整起见,-c命令命名缓冲区

alias vimpager="vim -MR -c 'file [stdin]' -"

Vim在其运行时文件中包含一个手册页查看器,
:man

将这一行放在vimrc中:

runtime! ftplugin/man.vim
现在,您可以通过运行
:man
来阅读Vim中语法突出显示的手册页。例如:

:Man 3 printf
更好的是,您可以将光标放在缓冲区中的一个单词上,然后按
K
\K
)查看该单词的手册页


有关完整的使用和安装说明,请参阅。

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

但是,脚本也很有用:

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

vim test.txt我有一个更好的解决方案,就是我使用的,它是这样的:

/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>' -"
/bin/sh-c“取消设置寻呼机;col-b-x | vim-R-c'set ft=man nomod nolist'-c'映射q:q'-c'映射'-c'映射b'-c'映射K:man=expand(\“\”)”

希望您会喜欢。

以下是我所做的,我用这个在.bashrc中创建了函数

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

vman()

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

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

    unset MANPAGER
}
用法:

vman ls

您还可以在c函数上按
shift-k
打印手册页

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


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

根据文档查看手册页

  • :Man printf
    -以拆分方式打开
    printf(1)
    手册页
  • :Vman 3 putc
    -以垂直拆分方式打开
    putc(3)
    手册页
  • :人优先权
    - 手册页名称的命令完成


*在GitHub上提供:。

谢谢,回答很好,解释也很好。我以后一定会更仔细地阅读手册:)@Maksim:不客气!顺便说一下,许多其他实用程序也使用
-
来表示“标准输入”。我想您不需要使用太多,因为如果您不指定任何文件名,通常他们也会使用标准输入作为默认值。
vi
在这方面是一个例外,这可能会让人困惑。:-)是一个方便的vim插件,它包装了该插件的功能,以便您也可以从命令行打开手册页(没有首先打开Vim)这一个变为私有,看起来在jez/Vim supermanI有一个。我认为这应该是答案,因为它回答了如何在Vim中阅读手册页的问题。在正常的man调用中不要求您更改任何内容的额外积分。这是一种更好、更干净的方式IMHO.:+1:
vman ls