Bạn có biết nếu chúng ta có thể cấu hình các bash nhắc để hiển thị trạng thái git/thông tin chi nhánh ở bên phải như zsh thể làm gì? Ảnh chụp màn hình ngẫu nhiên này từ internet cho thấy ý tôi là gì.Làm thế nào để hiển thị thông tin trạng thái git ở phía bên phải của thiết bị đầu cuối?
7
A
Trả lời
0
Một cách sẽ được sử dụng tput
đếm cột của thiết bị đầu cuối của bạn, và subtrack số lượng ký tự mà sẽ được in trái và bên phải, sau đó sử dụng con số đó là số lượng khoảng trống giữa văn bản bên trái và bên phải. Sử dụng printf
để tạo đường.
nhanh Ví dụ:
left="[${status}]\[email protected]\h:\w\$ "
right="$(git symbolic-ref HEAD) $(date +%T)"
spaces="$(($(tput cols) - ${#left} - ${#right}))"
export PS1="$(printf "%s%${spaces}s\n" "$left" "$right")"
9
Hãy thử như sau:
PS1='$(printf "%*s\r%s" $((COLUMNS-1)) "[$(git branch 2>/dev/null | grep '^*' | sed s/..//)] $(date +%H:%M:%S)" "[email protected]:$PWD$ ")'
Lưu ý rằng bạn sẽ không bao giờ nhận được hành vi mà chính xác phù hợp với một zsh với chỉ bash. Trong trường hợp trên, tôi thấy các sự khác biệt sau đây:
- Phần bên phải của lời nhắc sẽ không bị xóa khi bạn chạy lệnh (
accept-line
sự kiện về zsh). - Phần bên phải của lời nhắc sẽ bị xóa nếu bạn nhập nội dung nào đó và sau đó nhấn
<C-u>
hoặc<BS>
. - Phần bên phải của lời nhắc sẽ không được khôi phục nếu bạn nhập nội dung nào đó lên đó rồi xóa văn bản.
- Phần bên phải của lời nhắc sẽ không biến mất nếu bạn nhập thứ gì đó vào nó, mặc dù văn bản trong phần này sẽ bị ghi đè.
1
Hôm nay tôi đã tạo một cái gì đó tương tự theo cách sau. kiểm tra kỹ lưỡng đã không được thực hiện chưa ...
preprompt() {
rc=$?
c=31
[ $rc -eq 0 ] && c=32
PS1="\[$(color $c)\]$rc\[$(color 0)\] \t \w \$ "
# right "prompt"
# We cannot use $COLUMNS here, since in new shells the first prompt
# will get garbled then. Seems like the correct value of COLUMNS is
# in the shell init.
printf "%`tput cols`s`tput cr`" "${USER}@${HOST}"
}
PROMPT_COMMAND=preprompt
1
Đoạn code dưới đây sẽ tạo ra một dấu nhắc mà trông giống như:
Đó là phi trival để làm điều này trong bash
do:
- Readline mode string takes up characters before the prompt is printed, có nghĩa là các giải pháp
printf
sẽ không hoạt động trong một số trường hợp.Bởi vì điều này: - Loại bỏ tất cả (ví dụ như màu sắc) để tính toán một cách chính xác chiều dài của in bên tay phải phía nhắc
- Cần phải sử dụng
__git_ps1
để đối phó vớigit
trường hợp cạnh __git_ps1
chỉ xuất ra màu trong một số hoàn cảnh, và chỉ trong$PS1
- phép màu trong
__git_ps1
đầu ra trong khi loại bỏ các\[
và\]
nhân vật từ đầu ra của nó (mà không thể được lồng vào nhau) - Bao bì toàn nhanh chóng RHS trong
\[
và\]
để đảm bảo rằng dấu nhắc không làm những điều kỳ lạ khi duyệt/chỉnh sửa/hoàn lệnh
#!/bin/bash
# _options=$(shopt -op); set -exu # Save and set shell options for testing
##################
# Set the prompt # Sourced from .bashrc
##################
# Select git info displayed, see /usr/lib/git-core/git-sh-prompt for more
export GIT_PS1_SHOWCOLORHINTS=1 # Make pretty colours inside $PS1
export GIT_PS1_SHOWDIRTYSTATE=1 # '*'=unstaged, '+'=staged
export GIT_PS1_SHOWSTASHSTATE=1 # '$'=stashed
export GIT_PS1_SHOWUNTRACKEDFILES=1 # '%'=untracked
export GIT_PS1_SHOWUPSTREAM="verbose" # 'u='=no difference, 'u+1'=ahead by 1 commit
export GIT_PS1_STATESEPARATOR='' # No space between branch and index status
export GIT_PS1_DESCRIBE_STYLE="describe" # Detached HEAD style:
# describe relative to older annotated tag (v1.6.3.1-13-gdd42c2f)
# contains relative to newer annotated tag (v1.6.3.2~35)
# branch relative to newer tag or branch (master~4)
# default exactly eatching tag
# Sets prompt like:
# [email protected]:~/prj/sample_app[exit]$ master*% u= | 30 Apr 22:27
_set_bash_prompt() {
# Set left hand side of the prompt
PS1="\[email protected]\h:\w\$ "
#
# Git status
#
# Save current state of user shopt settings promptvars and extglob
local user_shopt
user_shopt=$(shopt -p promptvars extglob)
# __git_ps1 usually returns literal text "${__git_ps1_branch_name}" rather
# than the contained branch name, eg "master". This prevents calculating
# the length of the printable characers in the RHS string (used to move the
# cursor that many columns left from the terminal's right edge.) However if
# "shopt promptvars" is unset, __git_ps1 it will include the dereferenced
# branch name instead.
shopt -qu promptvars
# extglob is required for the ${variable//@(pattern)/} replacements
shopt -qs extglob
# Allow disabling git status and no error if __git_ps1 undefined
if [[ ! -v _disable_git_prompt && $(type -t __git_ps1 2>/dev/null) == function ]]; then
# __git_ps1 will only make pretty colours inside $PS1
local old_PS1=$PS1
__git_ps1 "" "" "%s" # force colour; no default round bracket (decorations)
# Strip "\[" and "\[": non-printable character markers. __git_ps1 outputs
# them however the whole of the RHS prompt needs to be included in these
# markers, and they can't be nested.
git=${PS1//@(\\@(\[|\]))/}
PS1=$old_PS1
fi
#
# Right hand side of prompt
#
local rhs="" # String to be printed on the right hand side of terminal
# Create a string like: "25 Apr 13:15"
local date_time
printf -v date_time "%(%e %b %H:%M)T" -1 # -1 is current time
# Format the RHS prompt
[[ -n $git ]] && rhs="$git | " #"
rhs+="\e[0;1;31m${date_time}"
# Strip ANSI CSI commands (eg colours) to enble counting the length of
# printable characters, giving offset of cursor from terminal RHS edge (from
# https://www.commandlinefu.com/commands/view/12043/remove-color-special-escape-ansi-codes-from-text-with-sed)
# Neither bash not sed support lookbehind zero-length assertions, so it's not
# possible to ignore "\\e", (ie a literal '\' followed by a literal 'e'), yet
# still remove "\e" (ie ESC)
local rhs_printable=${rhs//@(\\@(\[|]|[Ee]\[*([0-9;])[a-zA-Z]))/}
# or, in using sed (but requires exec):
# local rhs_printable=$(sed -e 's,\\[][]\|\\[Ee]\[\([0-9;]\)*[A-Za-z],,g' <<< "$rhs")
# Reference: https://en.wikipedia.org/wiki/ANSI_escape_code
local Save='\e[s' # Save cursor position
local Rest='\e[u' # Restore cursor to save point
# Save cursor position, jump to (right hand edge minus N columns) where N is
# the length of the printable RHS string. Print the RHS string, then return
# to the saved position and print the LHS prompt.
# Note: "\[" and "\]" are used so that bash can calculate the number of
# printed characters so that the prompt doesn't do strange things when
# command line editing/browsing/completion. Ensure that these are not nested.
PS1="\[\e[0m${Save}\e[$((COLUMNS - ${#rhs_printable}))G${rhs}${Rest}\]${PS1}"
eval "$user_shopt"
}
# eval "$_options"; unset _options # Restore previous shell options from line 2
Các vấn đề liên quan
- 1. Làm thế nào để hiển thị thanh trạng thái ban đầu bị ẩn khỏi plist iphone
- 2. Làm cách nào để hiển thị nội dung của tệp ở trạng thái cụ thể của repo git?
- 3. Làm cách nào để thêm trạng thái tệp git vào trạng thái của vim?
- 4. Tăng cường "ls" với thông tin trạng thái git?
- 5. Làm thế nào để chạy tập tin php của tôi từ thiết bị đầu cuối mac
- 6. Hoạt động nhắn tin giống như thiết bị đầu cuối
- 7. Làm thế nào để xem các tập tin dạng nhị phân trong thiết bị đầu cuối?
- 8. làm thế nào để đóng thiết bị đầu cuối geany
- 9. hiển thị thông báo trạng thái trong R
- 10. .gitignore hiển thị khi tôi chạy trạng thái git
- 11. Kiểm tra trạng thái đăng nhập ở phía máy khách
- 12. trạng thái git cho kho lưu trữ nhân bản hiển thị tệp đã bị xóa
- 13. Làm thế nào để tôi bắt đầu một lệnh từ thiết bị đầu cuối để thiết bị đầu cuối không phải là cha mẹ?
- 14. Không hiển thị trạng thái di chuột trên các thiết bị cảm ứng
- 15. xóa đầu ra của thiết bị đầu cuối trên linux
- 16. Trạng thái Git hiển thị tệp không được theo dõi ở cấp cao hơn?
- 17. Trạng thái thiết lập bản sao Mongodb hiển thị "RECOVERING"
- 18. Giữ các tập tin bị bỏ qua trong trạng thái git
- 19. Thiết bị đầu cuối ở trạng thái bị hỏng (văn bản vô hình/không có tiếng vang) sau khi thoát() trong khi nhập()/raw_input()
- 20. bắt đầu MongoDB và trở về thiết bị đầu cuối
- 21. Làm thế nào để mở emacs gui/ide từ thiết bị đầu cuối mac?
- 22. Cây Git với các nút có thể chọn trong thiết bị đầu cuối?
- 23. Trạng thái Asynctask luôn hiển thị chạy
- 24. các tệp không được theo dõi không được hiển thị trong trạng thái git
- 25. Làm thế nào để dán vào một thiết bị đầu cuối?
- 26. “~ (END)” có nghĩa là gì khi được hiển thị trong thiết bị đầu cuối?
- 27. 'chỉ trạng thái git' của repo chỉ cho biết chi nhánh ở phía trước nguồn gốc/chủ. Tại sao?
- 28. Cách hiển thị UIActionSheet ngay bên dưới thanh trạng thái điều hướng trên cùng trên iPhone
- 29. Làm thế nào để bỏ/Hủy bỏ thông báo trên thanh trạng thái ở android trình
- 30. Backbone.js - nơi lưu trữ thông tin trạng thái?
mmm, tôi chỉ thấy đây là trên line_ _same. Tôi không nghĩ rằng^sẽ làm việc. Âm thanh giống như bạn cần để có được bàn tay của bạn nhiều hơn trên '[n] curses' stuff. – c00kiemon5ter