2013-05-24 6 views
9

Ich möchte Manpages in Vim lesen können. Aus irgendeinem Grund scheint es, dass vim nicht in der Lage ist, die Ausgabe von Programmen durch Piping zu lesen (dh '(man ls) | vi' scheint nicht zu funktionieren, Bonuspunkte auf jemanden, der den Grund erklären kann) und zu bekommen um diesen, ich habe folgendes kleines Skript unter Verwendung von:Was ist eine Möglichkeit, Manpages in Vim zu lesen, ohne temporäre Dateien zu verwenden

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

Dieses Skript verwendet temporäre Dateien, die ich denke, funktionieren gut, aber ich frage mich, ob es ein guter Weg war man-Seiten in vim zu lesen, ohne auf temporäre Dateien erstellen

Antwort

21

Aus irgendeinem Grund scheint es, dass vim nicht in der Lage ist, die Ausgabe von Programmen durch die Rohrleitung zu lesen [& hellip;]

Entsprechend der man-Seite müssen Sie eine Datei von angeben, damit sie von der Standardeingabe gelesen wird; so:

man ls | vi - 

Wenn das nicht funktioniert, können Sie versuchen, Prozess Substitution mit:

vi <(man $1) 

, die eine Art Pseudo-Datei erstellt und übergibt sie an vi.

+0

Danke, gute Antwort und eine gute Erklärung. Ich werde dafür sorgen, dass Manpages in Zukunft etwas genauer gelesen werden. – MYV

+2

@Maksim: Gern geschehen! Übrigens verwenden viele andere Dienstprogramme auch "-", um "Standardeingabe" zu meinen. Ich schätze, Sie müssen das nicht so oft verwenden, da sie normalerweise auch die Standardeingabe verwenden, wenn Sie * any * filename nicht angeben. vi ist in dieser Hinsicht eine Ausnahme, die verwirrend sein kann. :-) – ruakh

4

Ihr Beispielcode ist falsch.

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

Aber Sie wirklich brauchen nur

man $1 | vi - 
+0

Fest meines Beispielcode zu drucken. Danke: ^) – MYV

5

Auf meinem System (Mac OS X), fand ich, dass die oben links Steuerzeichen in der Ausgabe. Stattdessen verwendete ich:

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

dann nur z.B.

Die vim-Optionen werden deaktiviert, indem der Puffer geändert und schreibgeschützt gemacht wird. Dies verhindert, dass Sie sich beschweren, wenn Sie versuchen, mit ": q" zu beenden (Sie können natürlich: q! Verwenden, aber Sie können auch die Optionen einstellen).

Dies ist auch praktisch für den allgemeinen Gebrauch - ich habe folgendes. Der Befehl -c benennt den Puffer nur der Vollständigkeit halber.

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

Ich denke, dies sollte die Antwort sein, da es die Frage beantwortet, wie man Manpages in vim liest. Bonuspunkte, wenn Sie bei Ihrem normalen Man-Aufruf nichts ändern müssen. –

28

Vim enthält einen Mann Seite Betrachter, :Man, in seinen Laufzeitdateien.

Diese Zeile in vimrc:

runtime! ftplugin/man.vim 

Jetzt können Sie Syntax-markierten Mann Seiten innerhalb Vim gelesen von :Man laufen. Zum Beispiel:

:Man 3 printf 

Noch besser, können Sie einfach Ihren Cursor in dem Puffer auf ein Wort platzieren und <Leader>K (\K) drücken Sie die man-Seite für dieses Wort zu sehen.

Vollständige Anweisungen zur Verwendung und Installation finden Sie unter :h find-manpage.

+0

Das ist großartig! Wie das bei all dieser Zeit an mir vorbeiging, weiß ich nicht. –

+1

[Vim SuperMan] (https://github.com/Z1MM32M4N) ist ein praktisches vim-Plugin, das die Funktionalität dieses Plugins umschließt, so dass Sie auch Manpages von der Kommandozeile aus öffnen können (ohne Vim zuerst zu öffnen). – Z1MM32M4N

+0

sieht aus als gäbe es einen bei jez/vim-superman –

1

Standardmäßig liest vim vimscripts (= vim-Befehle), keine Eingabedateien von stdin. Aus diesem Grund können Sie die Ausgabe man nicht direkt an vim übergeben. wie andere erwähnt haben, müssen Sie vim - verwenden, um vim von stdin lesen zu lassen.

jedoch Rohrleitungen vimscripts kann auch nützlich sein:

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

Die obige vim test.txt öffnen verwenden, ersetzen Sie alle Vokale mit X, schreiben die Ergebnisse output.txt, und beenden (ohne Berücksichtigung von Änderungen die ursprüngliche Datei). Es verwendet ein Here-Dokument, aber Sie können natürlich die vim-Befehle in eine Datei einfügen und vim test.txt < myscript oder cat myscript | vim test.txt verwenden, um das gleiche Ergebnis zu erzielen.

Ich vermute, der Grund, warum sie es so gemacht haben, war, dass Sie mehrere Eingabedateien öffnen können, aber nur ein Skript ausführen. Wenn die Eingabe standardmäßig von stdin gelesen wurde, konnten Sie nur einen Puffer auf diese Weise lesen.

1

Ich habe eine bessere Lösung, die eine, die ich verwendet, es ist wie folgt:

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

Hoffe, dass Sie es genießen werden.

4

Hier ist, was ich getan habe, habe ich gemacht Funktion in meinem .bashrc mit diesem

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

so, wenn ich Vman nennen dies vim ruft automatisch mit stdin den Mann selbst, es funktioniert super.

0

kombinierte ich andere Antworten, ich bin mit

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

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

    unset MANPAGER 
} 

Verbrauch:

vman ls 
0

Sie können auch shift-k auf c-Funktion drücken Sie die Manpage

Verwandte Themen