Как читать man-страницы в vim без использования временных файлов

Я хочу иметь возможность читать man-страницы в vim. По какой-то причине кажется, что vim не может читать выходные данные программ через конвейер (i.e '(man ls) / vi', похоже, не работает, бонусные очки кому-то, кто может объяснить, почему), и чтобы обойти это, я использовал следующий маленький скрипт:

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

этот скрипт использует временные файлы, которые, я думаю, отлично работают, но мне было интересно, есть ли хороший способ читать man-страницы в vim, не прибегая к созданию временные файлы

9 ответов


по какой-то причине кажется, что vim не может считывать выходные данные программ через трубопровод [...]

согласно man-странице, вам нужно указать файл - чтобы заставить его читать со стандартного ввода; так:

man ls | vi -

если это не работает, вы можете попробовать использовать подмена процесса:

vi <(man )

который создает своего рода псевдо-файл и передает его в vi.


Vim включает в себя просмотрщик man-страниц,:Man, в его исполняемые файлы.

поместите эту строку в свой vimrc:

runtime! ftplugin/man.vim

теперь вы можете читать выделенные синтаксисом man-страницы внутри Vim, запустив :Man. Например:

:Man 3 printf

еще лучше, вы можете просто поместить курсор на слово в буфере и нажать <Leader>K (\K), чтобы увидеть справочную страницу для этого слова.

посмотреть :h find-manpage для полного использования и установки инструкции.


в моей системе (Mac OS X) я обнаружил, что вышеперечисленные левые управляющие символы на выходе. Вместо этого я использовал:

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

потом просто например

man vim

параметры vim отключают изменение буфера и делают его доступным только для чтения. Это останавливает Vim жаловаться, если вы пытаетесь выйти с ": q " (вы можете использовать: q! конечно, но вы также можете установить параметры).

Это также удобно для общего использования - у меня есть следующее. Команда-c называет буфер, только для полнота.

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

ваш пример кода является неверной.

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

но вам действительно нужно только

   man  | vi -

вот что я сделал, я сделал функцию в мой .bashrc и с этим

vman() { vim <(man ); }

поэтому, когда я вызываю vman, это автоматически вызывает vim с stdin самого человека, он отлично работает.


по умолчанию vim считывает vimscripts (=команды vim), а не входные файлы из stdin. Вот почему вы не можете напрямую pipe man вывод в vim; как упоминали другие, вы должны использовать vim - чтобы заставить vim читать из stdin.

однако трубопроводы vimscripts также могут быть полезны:

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

выше будет использовать vim для открытия теста.txt, замените все гласные на X, запишите результаты на выход.txt и quit (игнорирование изменений в исходном файле). Он использует здесь документ, но конечно, вы можете поместить команды vim в файл и использовать vim test.txt < myscript или cat myscript | vim test.txt для достижения того же результата.

Я подозреваю, почему они сделали это таким образом, что вы можете открыть несколько входных файлов, но выполнить только один сценарий. Если вход считывался из stdin по умолчанию, таким образом можно было прочитать только один буфер.


У меня есть лучшее решение, то, которое я использовал, оно выглядит так:

/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>' -"

Надеюсь, вам понравится.


вы также можете нажать shift-k на вашей функции c для печати man-страницы


Я объединил другие ответы, я использую

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

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

    unset MANPAGER
}

использование:

vman ls