Anzeigen von Manpages in vim

7

Ich habe eine Funktion in bash geschrieben, um sie manpagesin vim zu sehen

viman () { man "$@" | vim -R +":set ft=man" - ; }

Dies funktioniert gut, das einzige Problem tritt auf, wenn ich ein manpagean es übergebe, das nicht existiert. Es wird gedruckt, dass das manpagenicht vorhanden ist, aber dennoch vimmit einem leeren Puffer geöffnet wird .
Also habe ich die Funktion geändert, um den Fehlercode (der 16hier ist) zu überprüfen und zu beenden, wenn der manpagenicht existiert. Die modefied Funktion sieht ungefähr so ​​aus -

viman () { man "$@" | [[ $? == 16 ]] && exit 1 | vim -R +":set ft=man" -  ; }

Aber jetzt macht es nichts !!

Ich möchte das Programm nur beenden, wenn das manpagenicht existiert, sonst öffne das manpagemitvim

Ritajit Kundu
quelle

Antworten:

7

Versuchen Sie Folgendes: Erfassen Sie die Man-Ausgabe und starten Sie vim bei Erfolg

viman () { text=$(man "$@") && echo "$text" | vim -R +":set ft=man" - ; }
Glenn Jackman
quelle
Das Erfassen der Ausgabe in einem Text ist eine einfache und brillante Idee. Alles zusammen ist die vimanFunktion fertig -viman () { text=$(man "$@") && echo "$text" | vim -R +":set ft=man nomod nonu noma nolist colorcolumn=" - ; }
Ritajit Kundu
3

Ich mag die Idee, den manRückkehrcode zu überprüfen . Sie können jedoch nicht zum Test pfeifen. Sie könnten nur manzweimal laufen :

viman () { man "$@" >/dev/null 2>&1 && man "$@" | vim -R +":set ft=man" - ; }

Dies wird man ... | vim ...nur ausgeführt, wenn der erste Aufruf von manerfolgreich war.

Jeff Schaller
quelle
2

Es gibt eine Umgebungsvariable namens MANPAGER, manmit der Sie den Befehl aufrufen können, den Sie zum Anzeigen der Manpage benötigen. Dies hat den Vorteil, dass Sie mandirekt anrufen und der Pager überhaupt nicht ausgeführt wird, wenn die Manpage nicht vorhanden ist.

Also ein Wrapper-Skript, sagen wir in ~/bin/vimman:

#! /bin/sh
vim -R +":set ft=man" -

Mit diesem in Ihren Shell-Initialisierungsdateien irgendwo:

export MANPAGER="$HOME/bin/vimman"

Und Sie können direkt man foozu Manpages in Vim laufen .

(Abhängig vom verwendeten manBefehl können Sie auch Folgendes haben:

export MANPAGER='vim -R +":set ft=man" -'

direkt anstelle eines Wrapper-Skripts.)


Wenn Sie ein ausreichend neues Vim haben, können Sie die --not-a-termOption verwenden, um Vim davon abzuhalten, sich darüber zu beschweren, dass stdin kein TTY ist.


Schamloser Plug: Ich habe ein kleines Plugin geschrieben , um die Verwendung von Vim als Manpager zu erleichtern.

muru
quelle
Dies ist auch eine gute Lösung, aber lassen Sie mich fragen, ich bin viel von der Manpage abhängig als von Google oder versuche es zumindest. Deshalb habe ich verschiedene Wrapper geschrieben, um den Manpager interessant zu machen, denn es gibt einen GUI-Manpager, der mit Yelp funktioniert , jetzt frage ich mich, ob der Aufschrei damit arbeiten kann?
Ritajit Kundu
@RitajitKundu Wenn Sie Yelp verwenden, können Sie direkt Manpages darin öffnen: yelp man:foo( askubuntu.com/a/390095/158442 )
Muru
1

Basierend auf dieser Antwort startet vim und wird beendet, wenn sich nichts im Puffer befindet. Der Nachteil ist, dass es startet, vimso dass der Bildschirm "blinkt". Es wird auch kein Exit-Code festgelegt, wenn eine manSeite nicht gefunden wird.

viman () { vim -R +':set ft=man|exe !search(".")?"quit!":""' <(man "$@" 2>/dev/null); }

Dies ist eine Verbesserung gegenüber Jeff Schallers Antwort, da die manSeite nicht zweimal geladen wird, wenn sie vorhanden ist. Es wird auch nicht vimunnötig geladen wie in meinem vorherigen Beispiel. Und es wird ein Exit-Code festgelegt, wenn keine manSeite vorhanden ist.

viman () { man -f "$@" >/dev/null 2>&1 && vim -R +":set ft=man" <(man "$@"); }

Beide Beispiele verwenden die Bash-Prozessersetzung, um die Meldung "Vim: Lesen von stdin ..." zu vermeiden.

Weder lädt die Seite in eine Variable.

Bis auf weiteres angehalten.
quelle
Eine noch leichtere Alternative dazu man -wkann sein man -w.
Matteo Italia