Nó có thể nhảy giữa các dấu nhắc lệnh trước / tiếp theo không?


7

Tôi đang sử dụng zsh trong OS X Terminal.app và trong một thời gian dài, tôi đã mong muốn có một cách để nhảy qua lại giữa các lời nhắc trước / tiếp theo trong đầu ra của thiết bị đầu cuối.

Một điều thuận tiện với điều này là có thể xem xét (và theo dõi lỗi tại) ở cuối mỗi đầu ra của lệnh; ví dụ. khi bạn xây dựng công cụ từ nguồn với ./cool; làm; thực hiện cài đặt. Lưu ý: Rõ ràng tôi không đề cập đến việc nhảy qua lại trong lịch sử lệnh, nhưng để biết cách nhìn vào phần cuối của mỗi đầu ra của lệnh.

Có ai đã nghe nói về chức năng như vậy trong thế giới * nix (tốt nhất là Mac) chưa? Nó sẽ yêu cầu một số loại plugin Terminal trung tâm hệ điều hành, hoặc nó có thể được thực hiện theo chương trình thông qua một tập lệnh shell có thể được gắn với một phím tắt? Có lẽ tôi là người duy nhất nghĩ về điều này? :)


Bạn có kiểm soát chuỗi lệnh đang được chạy không? bạn chỉ muốn tạm dừng? bạn có muốn nhắc bạn tiếp tục không?
xenoterracide

Đây là một kịch bản ví dụ: Giả sử tôi muốn biên dịch và cài đặt một số chương trình (sử dụng tiêu chuẩn ./cool && make && make install) và sau lệnh make, tôi gặp một số lỗi. Bây giờ, cách tôi hiểu nó (tôi có thể sai hoàn toàn), lỗi nghiêm trọng, khiến lệnh make bị lỗi, thường hiển thị ở dòng cuối cùng trong đầu ra, phải không? Dù sao, tại thời điểm này, tôi có thể làm một cái gì đó như 'mèo CÀI ĐẶT' để đọc tài liệu CÀI ĐẶT để kiểm tra xem có điều gì tôi đã bỏ lỡ không. (Do hạn chế ký tự nhận xét, tôi sẽ tiếp tục trong nhận xét tiếp theo của mình.)
Henrik

NGAY BÂY GIỜ, nếu tôi muốn quay lại để xem lỗi gì đã khiến lệnh tạo ban đầu của tôi không thành công, bây giờ tôi phải cuộn lại vị trí đó một cách thủ công, vì 'con mèo CÀI ĐẶT' của tôi đã in một tấn văn bản sau nó. Tôi không biết liệu kịch bản này có phải là minh chứng nhất hay không - nhưng có nhiều tình huống khác mà tôi ước mình có thể "nhảy" trở lại các dòng nhắc trước đó và kiểm tra đầu ra lệnh trước đó; cho dù đó là một lệnh ls đơn giản, thực hiện, trạng thái git hoặc bất cứ điều gì - hoán đổi vị trí trong cửa sổ bằng cách sử dụng lời nhắc làm vị trí "đánh dấu" có vẻ là một ý tưởng thú vị đối với tôi.
Henrik

1
@hced không, lỗi có thể ở bất cứ đâu trong đầu ra, cách tốt nhất để tìm lỗi bài viết là chuyển hướng stederr sang một tệp.
xenoterracide

1
@hced Tôi không thực hiện chuyển hướng thường xuyên và không cảm thấy muốn tìm kiếm nó, ở đâu đó trên đây ai đó đã đăng trên chuyển hướng. nhưng điều đó có vẻ đúng ngoại trừ ... tại sao bạn chạy makevới sudobạn không bao giờ nên (phải) biên dịch thành root. chỉ make installcó thể yêu cầu root.
xenoterracide

Câu trả lời:


4

Tôi chưa bao giờ nghe nói về một tính năng như vậy với các vỏ điển hình (zsh, cá hoặc cách khác) trong các trình giả lập thiết bị đầu cuối điển hình. Khi bạn đã nhấn Entervào dấu nhắc, dòng lệnh đó chỉ tồn tại dưới dạng mục lịch sử khi có liên quan đến trình bao, và như một loạt các ký tự được hiển thị (không thể phân biệt với đầu ra lệnh) khi có liên quan đến trình giả lập thiết bị đầu cuối.

Mặt khác, loại điều hướng mà bạn yêu cầu có sẵn như là một vấn đề tất nhiên trong các shell chạy trong bộ đệm Emacs , M-x shellnếu bạn muốn phiên bản dòng lệnh thông thường của shell và Emacs hoặc M-x eshellnếu bạn muốn một vỏ được tích hợp vào Emacs.


1
Tôi sẽ bầu bạn nếu tôi có thể, mặc dù danh tiếng hiện tại của tôi không cho phép tôi. Cảm ơn bạn thông tin thú vị. Câu hỏi ngớ ngẩn có lẽ, nhưng làm thế nào để bạn thực hiện điều hướng như vậy trong vỏ của Emacs? Điều này cũng khiến tôi tò mò nếu nó cũng đúng trong Vim (đó là trình soạn thảo tôi đã giải quyết cho việc học), sử dụng: shell (trong trường hợp câu hỏi ngớ ngẩn trước đây của tôi cũng áp dụng cho Vim; làm thế nào để bạn thực hiện "nhảy giữa lời nhắc "trong vỏ của Vim).
Henrik

3
@hced: Trong Emacs, bạn có được điều hướng con trỏ bình thường, cộng với một vài lệnh cụ thể như C-c C-pC-c C-nđể điều hướng đến lời nhắc trước đó / tiếp theo. Vim không có bất kỳ tính năng tương tự nào: :shellchỉ khởi động một vỏ tương tác trực tiếp với thiết bị đầu cuối Vim đang chạy (và bạn không thể tương tác với Vim cho đến khi vỏ thoát ra).
Gilles 'SO- ngừng trở nên xấu xa'

+1 tôi không biết về C-c C-p. Cảm ơn!
Mikel

Trong eshell, thậm chí còn có một lệnh như vậy eshell-show-output, dường như thậm chí còn làm chặt chẽ hơn những gì bị buộc sau khi hỏi câu hỏi này.
imz - Ivan Zakharyaschev

2

Trong eshellEmacs, có lệnh (chưa được đề cập ở đây trong các câu trả lời khác) dường như để giải quyết nhiệm vụ mà bạn đang tự hỏi về việc hỏi câu hỏi của bạn - eshell-show-output; mô tả của nó ( C-h feshell-show-output):

Nó chắc chắn sẽ C-c C-r, C-M-l.

(eshell-show-output &optional arg)

Hiển thị bắt đầu lô đầu ra của trình thông dịch này ở đầu cửa sổ. Đặt dấu cho giá trị của điểm khi lệnh này được chạy. Với một đối số tiền tố, thu hẹp vùng đến đầu ra lệnh cuối cùng.

Hiệu ứng thu hẹp (với một đối số tiền tố, nghĩa là C-u C-c C-r) cũng có thể thú vị đối với bạn khi giao nhiệm vụ.


Cảm ơn vì tiền boa, sẽ thử điều này nếu tôi bắt đầu sử dụng Emacs. (Tôi thích Vim hơn những ngày này. Nếu có một kỹ thuật ditto cho Vim giống như bạn đã mô tả ở trên, tôi rất vui khi nghe nó.)
Henrik

1

Một câu trả lời cho câu hỏi của bạn là sử dụng emacs với Mx eshell. Điều này cung cấp cho bạn một chức năng vỏ hợp lý đầy đủ bên trong emacs. Việc xem nhanh các tệp rõ ràng có thể được thực hiện bằng cách mở chúng trong trình chỉnh sửa, nhưng quan trọng hơn là bạn có thể sử dụng chức năng tìm kiếm của nó để tìm kiếm lại qua bộ đệm cho bất kỳ đầu ra nào trước đó (hoặc bất kỳ lời nhắc nào trước đó).

Một câu trả lời khác là sử dụng màn hình, tôi tin rằng nó cũng có chức năng tìm kiếm của lịch sử, nhưng đã quá lâu kể từ khi tôi sử dụng nó để ghi nhớ các tổ hợp phím là gì.


Trong eshell, thậm chí còn có một lệnh như vậy eshell-show-output, dường như thậm chí còn làm chặt chẽ hơn những gì bị buộc sau khi hỏi câu hỏi này.
imz - Ivan Zakharyaschev

1

Để mở rộng về nhận xét của xenoterracide ...

Thay vì chạy make, tôi đặt cái này vào.bashrc

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

rồi chạy mthay make.

Điều này đặt tất cả đầu ra make.log, nhưng chỉ in lỗi trên bàn điều khiển.

Bằng cách đó, bạn không có hàng tấn đầu ra trên màn hình, có thể dễ dàng nhìn thấy lỗi và có thể đọc make.logđể chẩn đoán bất kỳ vấn đề nào nếu thất bại.


0

Không chắc đây có phải là một câu trả lời không, nhưng vì tôi đang đăng một hình ảnh nên tôi đoán nó sẽ hoạt động.

Bạn có thể làm cho dấu nhắc bash của bạn trông khác đi để dễ dàng phát hiện ra hoặc sử dụng zsh và làm cho dấu nhắc của bạn trông giống như thế này.

văn bản thay thế

Tôi lấy lời nhắc từ đâu đó trên mạng, tôi quên mất đâu. Và tôi đã kết hợp nó với một tệp zshrc khác mà tôi tìm thấy ở nơi khác. Tôi sẽ chỉ dán toàn bộ ở đây. Lời nhắc là tất cả được chứa ở phía dưới nếu bạn không nhận được.

#------------------------------
# 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

Tôi nghĩ lời nhắc của bạn thực sự thú vị (quan tâm chia sẻ mã của nó trong trường nhận xét bên dưới?). Mặc dù nó không phải là hoàn toàn những gì tôi đã chụp cho, mà là để nhấn một phím tắt để nhảy giữa các lệnh nộp (tức là vị trí của nhắc nhở cựu trong cửa sổ hiện hành).
Henrik

Rất có thể là từ ZSH Prompt của Phil , nhưng nhiều người khác đã sao chép và sửa đổi để sử dụng riêng. Trang của Phil! Đưa ra mô tả chi tiết / phân tích mã / tập lệnh. Tôi tìm thấy có thể các biến thể bằng cách thực hiện tìm kiếm Google PR_HBAR, một trong các biến.
Friartek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.