2013-05-24 14 views
9

Chcę móc czytać strony man w vim. Z jakiegoś powodu wydaje się, że vim nie jest w stanie odczytać danych wyjściowych programów za pomocą potoków (tj. "(Man ls) | vi" nie działa, punkty bonusowe dla kogoś, kto może wyjaśnić dlaczego) i uzyskać wokół tego, Używam następujący mały skrypt:Jaki jest sposób czytania stron man w vimie bez używania plików tymczasowych?

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

skrypt ten wykorzystuje pliki tymczasowe, które myślę, działa dobrze, ale zastanawiałem się, czy to był dobry sposób, aby przeczytać strony man w vim bez uciekania się do tworzenie plików tymczasowych

Odpowiedz

21

Z jakiegoś powodu wydaje się, że vim nie jest w stanie odczytać dane wyjściowe programów za pośrednictwem rurociągu [& hellip;]

Zgodnie ze stroną podręcznika, należy podać plik o numerze -, aby odczytać go ze standardowego wejścia; tak:

man ls | vi - 

Jeśli to nie zadziała, możesz spróbować użyć proces zastępowania:

vi <(man $1) 

który tworzy coś w rodzaju pseudo-pliku i przekazuje go do vi.

+0

Dziękuję, dobra odpowiedź i dobre wyjaśnienie. W przyszłości będę uważnie czytał strony man :) – MYV

+2

@Maksim: Nie ma za co! Nawiasem mówiąc, wiele innych narzędzi również używa '-' do określenia" standardowe wejście ". Domyślam się, że nie musiałeś używać tego tak bardzo, ponieważ zazwyczaj używają standardowego wejścia jako domyślnego, jeśli nie podasz * żadnej * nazwy pliku. "vi" jest wyjątkiem w tym względzie, co może być mylące. :-) – ruakh

4

Twój przykładowy kod jest nieprawidłowy.

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

ale naprawdę wystarczy

man $1 | vi - 
+0

stały mój przykładowy kod. Dzięki: ^) – MYV

5

W moim systemie (Mac OS X) znalazłem powyższe lewe znaki sterujące na wyjściu. Zamiast tego użyłem:

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

następnie np.

man vim 

Opcje vim wyłączają modyfikowanie bufora i ustawianie go jako tylko do odczytu. Zatrzymuje to vim narzekanie, jeśli spróbujesz wyjść z ": q" (możesz użyć: q! Oczywiście, ale równie dobrze możesz ustawić opcje).

Jest to również przydatne do ogólnego użytku - Mam następujące. Komenda -c nazywa bufor, tylko dla kompletności.

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

Myślę, że to powinna być odpowiedź, ponieważ odpowiada na pytanie, jak czytać strony man w vim. Punkty premiowe za niewymaganie zmian w normalnym wywołaniu człowieka. –

28

Vim posiada stronę widza człowiek, :Man w swojej pliki wykonywalne.

umieścić ten wiersz w vimrc:

runtime! ftplugin/man.vim 

Teraz można odczytać z podświetlaniem składni strony człowieka wewnątrz vim uruchamiając :Man. Na przykład:

:Man 3 printf 

Jeszcze lepiej, można po prostu umieść kursor na słowa w buforze, a następnie naciśnij <Leader>K (\K), aby zobaczyć na stronie man tego słowa.

Zobacz pełną instrukcję użytkowania i instalacji pod numerem :h find-manpage.

+0

To jest niesamowite! Jak to minęło mnie przez cały ten czas, nie wiem. –

+1

[Vim SuperMan] (https://github.com/Z1MM32M4N) to wygodna wtyczka vima, która otacza funkcjonalność tej wtyczki, dzięki czemu można również otwierać strony man z wiersza poleceń (bez otwierania Vima). – Z1MM32M4N

+0

To poszło prywatne, wygląda na to, że jest jeden w jez/vim-superman –

1

Domyślnie vim czyta vimscripts (= polecenia vim), a nie pliki wejściowe ze stdin. Dlatego nie można bezpośrednio wyprowadzać wyjścia man do vim; jak wspomnieli inni, musisz użyć vim -, aby vim czytał ze standardowego wejścia.

Jednak vimscripts rurociągów mogą być przydatne także:

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

Powyższy użyje vim otworzyć Test.txt, wymienić wszystkie samogłoski z X, zapisać wyniki do Output.txt i zamknąć (pomijając zmiany oryginalny plik). Używa tutaj dokumentu, ale możesz oczywiście umieścić polecenia vim w pliku i użyć vim test.txt < myscript lub cat myscript | vim test.txt, aby osiągnąć ten sam rezultat.

Podejrzewam, że powodem, dla którego zrobili to w ten sposób, było to, że można otworzyć wiele plików wejściowych, ale wykonać tylko jeden skrypt. Jeśli wejście zostało odczytane ze standardowego wejścia domyślnie, można było odczytać tylko jeden bufor w ten sposób.

1

mam lepsze rozwiązanie, ten, który ja używany, to jest tak:

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

nadzieję, że Ci się spodoba.

4

Oto co zrobiłem, zrobiłem funkcję w moim .bashrc z tym

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

więc kiedy zadzwonić Vman to automatycznie wywołuje vim z stdin samego człowieka, to działa świetnie.

0

I połączeniu pozostały odpowiedzi, używam

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

    # Make it read-only 
    eval 'man [email protected] | vim -MR +"set filetype=man" -' 

    unset MANPAGER 
} 

Zastosowanie:

vman ls 
0

Można również nacisnąć shift-k na swojej funkcji c, aby wydrukować strony man