Как читать 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>' -"
Надеюсь, вам понравится.
Я объединил другие ответы, я использую
vman() {
export MANPAGER="col -b" # for FreeBSD/MacOS
# Make it read-only
eval 'man $@ | vim -MR +"set filetype=man" -'
unset MANPAGER
}
использование:
vman ls