Wäre es möglich, zwischen den Eingabeaufforderungen prev / next zu wechseln?


7

Ich verwende zsh in OS X Terminal.app und habe mich schon seit einiger Zeit nach einer Möglichkeit gesehnt, zwischen den vorherigen / nächsten Eingabeaufforderungen in der Terminalausgabe hin und her zu springen.

Eine Annehmlichkeit dabei wäre, in der Lage zu sein, das Ende der Ausgabe jedes Befehls zu überprüfen (und Fehler zu verfolgen); z.B. wenn Sie mit ./configure Inhalte aus dem Quellcode erstellen; machen; make install. Hinweis: Ich beziehe mich offensichtlich nicht auf das Hin- und Herspringen im Befehlsverlauf, sondern auf eine Möglichkeit, einen Blick auf die Enden der Ausgabe jedes Befehls zu werfen.

Hat jemand von solchen Funktionen in der * nix (vorzugsweise auch Mac) Welt gehört? Wäre dafür eine Art OS-zentriertes Terminal-Plugin erforderlich, oder kann dies programmgesteuert über ein Shell-Skript erfolgen, das mit einer Tastenkombination verknüpft werden kann? Vielleicht bin ich der einzige, der darüber nachdenkt? :) :)


Haben Sie die Kontrolle über die Befehlssequenz, die ausgeführt wird? Willst du nur eine Pause? Möchten Sie, dass Sie aufgefordert werden, fortzufahren?
Xenoterracide

Hier ein Beispielszenario: Angenommen, ich möchte ein Programm kompilieren und installieren (unter Verwendung der Standardprozedur ./configure && make && make install), und nach dem Befehl make treten einige Fehler auf. So wie ich es verstehe (ich kann mich völlig irren), wird der entscheidende Fehler, der dazu führt, dass der Befehl make fehlschlägt, normalerweise in der letzten Zeile (n) in der Ausgabe angezeigt, nicht wahr? An diesem Punkt könnte ich sowieso etwas wie "cat INSTALL" tun, um das INSTALL-Dokument zu lesen und zu überprüfen, ob ich etwas verpasst habe. (Aufgrund der Einschränkung der Kommentarzeichen fahre ich mit meinem nächsten Kommentar fort.)
Henrik

Wenn ich jetzt zurückgehen möchte, um zu sehen, was der Fehler war, der dazu geführt hat, dass mein anfänglicher Befehl make fehlgeschlagen ist, muss ich jetzt wieder manuell zu dieser Position scrollen, da meine "cat INSTALL" eine Menge Text danach gedruckt hat. Ich weiß nicht, ob dieses Szenario am aufschlussreichsten ist - aber es gibt viele andere Situationen, in denen ich mir wünschte, ich könnte einfach zu vorherigen Eingabeaufforderungszeilen "zurückspringen" und die vorherige Befehlsausgabe überprüfen. ob es sich um einen einfachen ls-Befehl, make, git-Status oder was auch immer handelte - das Vertauschen von Positionen im Fenster mithilfe von Eingabeaufforderungen als "Lesezeichen" -Positionen scheint mir eine interessante Idee zu sein.
Henrik

1
@hced nein, Fehler können sich überall in der Ausgabe befinden. Der beste Weg, um Fehler zu finden, besteht darin, stederr in eine Datei umzuleiten.
Xenoterracide

1
@hced Ich leite nicht oft um und habe keine Lust, nachzuschlagen. Irgendwo hier hat jemand etwas über Umleitung gepostet. aber das sieht richtig aus. außer ... warum laufen Sie makemit sudosollten Sie nie als root kompilieren (müssen). nur make installkönnte root erfordern.
Xenoterracide

Antworten:


4

Ich habe noch nie von einer solchen Funktion mit typischen Muscheln (zsh, fish oder sonstwie) in typischen Terminalemulatoren gehört. Sobald Sie Enteran einer Eingabeaufforderung gedrückt haben , existiert diese Befehlszeile nur als Verlaufseintrag für die Shell und als eine Reihe angezeigter Zeichen (nicht von der Befehlsausgabe zu unterscheiden) für den Terminalemulator.

Auf der anderen Seite ist die Art der Navigation, nach der Sie fragen, selbstverständlich in Shells verfügbar, die in einem Emacs- Puffer ausgeführt werden. M-x shellWenn Sie Ihre übliche Shell und die Befehlszeilenversion von Emacs M-x eshellmöchten oder wenn Sie eine in Emacs integrierte Shell möchten.


1
Ich würde dich abstimmen, wenn ich könnte, obwohl mein aktueller Ruf es mir nicht erlaubt. Danke für deine interessanten Infos. Dumme Frage wahrscheinlich, aber wie führen Sie eine solche Navigation in Emacs 'Shell durch? Dies macht mich auch neugierig, ob dies auch für Vim gilt (das ist der Editor, für den ich mich entschieden habe). Verwenden Sie dazu: shell (in diesem Fall gilt meine vorherige dumme Frage auch für Vim; wie führen Sie den "Sprung zwischen" durch? Eingabeaufforderungen "in Vims Shell).
Henrik

3
@hced: In Emacs erhalten Sie eine normale Cursornavigation sowie einige spezifische Befehle wie C-c C-pund C-c C-n, um zur vorherigen / nächsten Eingabeaufforderung zu navigieren. Vim hat keine ähnliche Funktion: :shellStartet nur eine Shell, die direkt mit dem Terminal interagiert, in dem Vim ausgeführt wird (und Sie können nicht mit Vim interagieren, bis die Shell beendet wird).
Gilles 'SO - hör auf böse zu sein'

+1 Ich wusste nichts davon C-c C-p. Vielen Dank!
Mikel

In eshell gibt es sogar einen Befehl wie eshell-show-output, der noch genauer zu tun scheint, wonach er strebt, wenn er diese Frage stellt.
imz - Ivan Zakharyaschev

2

In eshellEmacs gibt es einen Befehl (der hier in anderen Antworten noch nicht erwähnt wurde), der die Aufgabe anzugehen scheint, über die Sie sich implizit wundern, wenn Sie Ihre Frage stellen - eshell-show-output; seine Beschreibung ( C-h feshell-show-output):

Es ist gebunden an C-c C-r, C-M-l.

(eshell-show-output &optional arg)

Zeigen Sie den Start dieses Stapels von Interpreter-Ausgaben oben im Fenster an. Setzt die Markierung auf den Wert von Punkt, wenn dieser Befehl ausgeführt wird. Verengt mit einem Präfixargument den Bereich auf die letzte Befehlsausgabe.

Der Verengungseffekt (mit einem Präfixargument, dh C-u C-c C-r) könnte für Sie bei Ihrer Aufgabe ebenfalls interessant sein.


Vielen Dank für den Tipp. Ich werde es versuchen, wenn ich Emacs verwende. (Ich bin heutzutage mehr in Vim. Wenn es eine Vitto-Technik für Vim gibt, wie die, die Sie oben beschrieben haben, würde ich mich freuen, sie zu hören.)
Henrik

1

Eine Antwort auf Ihre Frage ist die Verwendung von Emacs mit Mx Eshell. Dies gibt Ihnen eine einigermaßen volle Shell-Funktionalität innerhalb von Emacs. Ein kurzer Blick auf Dateien kann natürlich durch Öffnen im Editor erfolgen. Noch wichtiger ist jedoch, dass Sie die Suchfunktion verwenden können, um den Puffer nach früheren Ausgaben (oder früheren Eingabeaufforderungen) zu durchsuchen.

Eine andere Antwort ist die Verwendung des Bildschirms. Ich glaube, dies hat auch eine Suchfunktion des Verlaufs, aber es ist zu lange her, seit ich ihn verwendet habe, um mich an die Tastenkombinationen zu erinnern.


In eshell gibt es sogar einen Befehl wie eshell-show-output, der noch genauer zu tun scheint, wonach er strebt, wenn er diese Frage stellt.
imz - Ivan Zakharyaschev

1

Um den Kommentar von Xenoterracide zu erweitern ...

Anstatt zu rennen make, stecke ich das in meine.bashrc

# make with an automatic log and pager
m()
{
    command make "$@" 2>&1 1>&- 1>make.log | tee -a make.log
}

dann laufen mstatt make.

Dadurch werden alle Ausgaben make.logauf die Konsole übertragen, aber nur Fehler ausgegeben .

Auf diese Weise haben Sie keine Tonnen Ausgabe auf dem Bildschirm, können leicht Fehler erkennen und lesen, make.logum Probleme zu diagnostizieren, wenn dies fehlschlägt.


0

Ich bin mir nicht sicher, ob dies eine Antwort sein sollte, aber da ich ein Bild poste, denke ich, dass es funktionieren wird.

Sie können Ihre Bash-Eingabeaufforderung anders aussehen lassen, damit sie leicht erkannt wird, oder zsh verwenden und Ihre Eingabeaufforderung so aussehen lassen.

Alt-Text

Ich nahm meine Aufforderung von irgendwo online, ich vergesse wo. Und ich habe es mit einer anderen zshrc-Datei kombiniert, die ich woanders gefunden habe. Ich werde einfach das Ganze hier einfügen. Die Eingabeaufforderung befindet sich ganz unten, wenn Sie das nicht möchten.

#------------------------------
# History stuff
#------------------------------
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000

#------------------------------
# Variables
#------------------------------
export EDITOR="vim"
export PAGER="vimpager"
export PATH="${PATH}:${HOME}/bin"
export PATH="${PATH}:${HOME}/.android-sdk-linux_x86/tools"
export PATH="${PATH}:${HOME}/Dropbox/bin"
#-----------------------------
# Dircolors
#-----------------------------
#LS_COLORS='rs=0:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:';
#export LS_COLORS


LS_COLORS='di=34;01:fi=0:ln=96;1:pi=36;1:so=01;31;1:bd=5:cd=5:or=01;31:mi=0:ex=01;93:*.so*=93:*.doc=01;33:*.docx=01;33:*.xls=01;33:*.xlsx=01;33:*.pdf=01;33:*.odt=01;33:*.torrent=91:*.bin=33:*.sh=33:*.run=33:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:'
export LS_COLORS



#------------------------------
# Keybindings
#------------------------------
bindkey -e
typeset -g -A key
#bindkey '\e[3~' delete-char
bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
#bindkey '\e[2~' overwrite-mode
bindkey '^?' backward-delete-char
bindkey '^[[1~' beginning-of-line
bindkey '^[[5~' up-line-or-history
bindkey '^[[3~' delete-char
bindkey '^[[4~' end-of-line
bindkey '^[[6~' down-line-or-history
bindkey '^[[A' up-line-or-search
bindkey '^[[D' backward-char
bindkey '^[[B' down-line-or-search
bindkey '^[[C' forward-char 
# for rxvt
bindkey "\e[8~" end-of-line
bindkey "\e[7~" beginning-of-line
# for gnome-terminal
bindkey "\eOH" beginning-of-line
bindkey "\eOF" end-of-line

#------------------------------
# Alias stuff
#------------------------------
alias ls="ls --color -F"
alias ll='ls -lAgh --group-directories-first --color'
alias saptget="sudo apt-get "



#------------------------------
# Comp stuff
#------------------------------
zmodload zsh/complist 
autoload -Uz compinit
compinit
zstyle :compinstall filename '${HOME}/.zshrc'

#- buggy
zstyle ':completion:*:descriptions' format '%U%B%d%b%u'
zstyle ':completion:*:warnings' format '%BSorry, no matches for: %d%b'
#-/buggy

zstyle ':completion:*:pacman:*' force-list always
zstyle ':completion:*:*:pacman:*' menu yes select

zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}

zstyle ':completion:*:*:kill:*' menu yes select
zstyle ':completion:*:kill:*'   force-list always

zstyle ':completion:*:*:killall:*' menu yes select
zstyle ':completion:*:killall:*'   force-list always


#------------------------------
# Prompt
#------------------------------
function precmd {

    local TERMWIDTH
    (( TERMWIDTH = ${COLUMNS} - 1 ))


    ###
    # Truncate the path if it's too long.

    PR_FILLBAR=""
    PR_PWDLEN=""

    local promptsize=${#${(%):---(%n@%m:%1~)---()--}}
    local pwdsize=${#${(%):-%~}}

    if [[ "$promptsize + $pwdsize" -gt $TERMWIDTH ]]; then
        ((PR_PWDLEN=$TERMWIDTH - $promptsize))
    else
    PR_FILLBAR="\${(l.(($TERMWIDTH - ($promptsize + $pwdsize)))..${PR_HBAR}.)}"
    fi


    ###
    # Get APM info.

    if which ibam > /dev/null; then
    PR_APM_RESULT=`ibam --percentbattery`
    elif which apm > /dev/null; then
    PR_APM_RESULT=`apm`
    fi
}


setopt extended_glob
setopt extendedglob
preexec () {
    if [[ "$TERM" == "screen" ]]; then
    local CMD=${1[(wr)^(*=*|sudo|-*)]}
    echo -n "\ek$CMD\e\\"
    fi
}


setprompt () {
    ###
    # Need this so the prompt will work.

    setopt prompt_subst


    ###
    # See if we can use colors.

    autoload colors zsh/terminfo
    if [[ "$terminfo[colors]" -ge 8 ]]; then
    colors
    fi
    for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; do
    eval PR_$color='%{$terminfo[bold]$fg[${(L)color}]%}'
    eval PR_LIGHT_$color='%{$fg[${(L)color}]%}'
    (( count = $count + 1 ))
    done
    PR_NO_COLOUR="%{$terminfo[sgr0]%}"


    ###
    # See if we can use extended characters to look nicer.

    typeset -A altchar
    set -A altchar ${(s..)terminfo[acsc]}
    PR_SET_CHARSET="%{$terminfo[enacs]%}"
    PR_SHIFT_IN="%{$terminfo[smacs]%}"
    PR_SHIFT_OUT="%{$terminfo[rmacs]%}"
    PR_HBAR=${altchar[q]:--}
    PR_ULCORNER=${altchar[l]:--}
    PR_LLCORNER=${altchar[m]:--}
    PR_LRCORNER=${altchar[j]:--}
    PR_URCORNER=${altchar[k]:--}


    ###
    # Decide if we need to set titlebar text.

    case $TERM in
    xterm*)
        PR_TITLEBAR=$'%{\e]0;%(!.-=*[ROOT]*=- | .)%n@%m:%~ | ${COLUMNS}x${LINES} | %y\a%}'
        ;;
    screen)
        PR_TITLEBAR=$'%{\e_screen \005 (\005t) | %(!.-=[ROOT]=- | .)%n@%m:%~ | ${COLUMNS}x${LINES} | %y\e\\%}'
        ;;
    *)
        PR_TITLEBAR=''
        ;;
    esac


    ###
    # Decide whether to set a screen title
    if [[ "$TERM" == "screen" ]]; then
    PR_STITLE=$'%{\ekzsh\e\\%}'
    else
    PR_STITLE=''
    fi


    ###
    # APM detection

    if which ibam > /dev/null; then
    PR_APM='$PR_RED${${PR_APM_RESULT[(f)1]}[(w)-2]}%%(${${PR_APM_RESULT[(f)3]}[(w)-1]})$PR_LIGHT_BLUE:'
    elif which apm > /dev/null; then
    PR_APM='$PR_RED${PR_APM_RESULT[(w)5,(w)6]/\% /%%}$PR_LIGHT_BLUE:'
    else
    PR_APM=''
    fi


    ###
    # Finally, the prompt.

    PROMPT='$PR_SET_CHARSET$PR_STITLE${(e)PR_TITLEBAR}\
$PR_CYAN$PR_SHIFT_IN$PR_ULCORNER$PR_BLUE$PR_HBAR$PR_SHIFT_OUT(\
$PR_WHITE%(!.%SROOT%s.%n)$PR_WHITE@%m $PR_MAGENTA%1~\
$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_CYAN$PR_HBAR${(e)PR_FILLBAR}$PR_BLUE$PR_HBAR$PR_SHIFT_OUT(\
$PR_MAGENTA%$PR_PWDLEN<...<%~%<<\
$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_CYAN$PR_URCORNER$PR_SHIFT_OUT\

$PR_CYAN$PR_SHIFT_IN$PR_LLCORNER$PR_BLUE$PR_HBAR$PR_SHIFT_OUT(\
%(?..$PR_LIGHT_RED%?$PR_BLUE:)\
${(e)PR_APM}$PR_YELLOW%D{%H:%M}\
$PR_LIGHT_BLUE:%(!.$PR_RED.$PR_WHITE)%#$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT\
$PR_CYAN$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT\
$PR_NO_COLOUR '

    RPROMPT=' $PR_CYAN$PR_SHIFT_IN$PR_HBAR$PR_BLUE$PR_HBAR$PR_SHIFT_OUT\
($PR_YELLOW%D{%a,%b%d}$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_CYAN$PR_LRCORNER$PR_SHIFT_OUT$PR_NO_COLOUR'

    PS2='$PR_CYAN$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT\
$PR_BLUE$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT(\
$PR_LIGHT_GREEN%_$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT\
$PR_CYAN$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT$PR_NO_COLOUR '
}

setprompt

Ich denke, Ihre Eingabeaufforderung ist wirklich interessant (möchten Sie den Code in einem Kommentarfeld unten teilen?). Obwohl es nicht ganz das war, wofür ich fotografiert habe, nämlich eine Tastenkombination zu drücken, um zwischen den übermittelten Befehlen zu springen (dh Positionen früherer Eingabeaufforderungen im aktuellen Fenster).
Henrik

Höchstwahrscheinlich von Phil! 'S ZSH Prompt , aber viele andere haben für ihren eigenen Gebrauch kopiert und modifiziert. Die Seite von Phil! Enthält eine detaillierte Beschreibung / Aufschlüsselung des Codes / Skripts. Ich fand möglicherweise Variationen, indem ich eine Google-Suche nach PR_HBAReiner der Variablen durchführte.
Friartek
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.