Khi sử dụng chế độ vi (set -o vi) với Bash, sẽ rất hay nếu có một lời nhắc tùy thuộc vào chế độ bạn hiện đang sử dụng (chèn hoặc lệnh). Làm thế nào để tìm ra chế độ chỉnh sửa này?
Btw, điều này có vẻ khả thi trong ZSH :
Khi sử dụng chế độ vi (set -o vi) với Bash, sẽ rất hay nếu có một lời nhắc tùy thuộc vào chế độ bạn hiện đang sử dụng (chèn hoặc lệnh). Làm thế nào để tìm ra chế độ chỉnh sửa này?
Btw, điều này có vẻ khả thi trong ZSH :
Câu trả lời:
Mới bash 4.3 và readline 6.3 có một cái gì đó cho các bạn .. từ changelog:
4. New Features in Readline
j. New user-settable variable, show-mode-in-prompt, adds a characters to the
beginning of the prompt indicating the current editing mode.
Vì vậy, đặt
set show-mode-in-prompt on
thành / etc / inputrc hoặc ~ / .inputrc (thx stooj) sẽ ảnh hưởng đến tất cả các chương trình hỗ trợ dòng đọc của bạn;)
Bash 4.4 / Readline 7.0 sẽ thêm hỗ trợ cho các chuỗi chế độ do người dùng thiết lập .
Bạn có thể thử các phiên bản beta, nhưng chúng có vẻ hơi lỗi vào lúc này. Họ cũng chưa hỗ trợ chỉ định vị trí trong lời nhắc bạn muốn chỉ báo chế độ xuất hiện (mà tôi nghĩ là tính năng giết người).
Nếu bạn không muốn chờ đợi và không ngại biên dịch một chút, tôi đã xuất bản các phiên bản vá lỗi của bash 4.3 và readline 6.3 lên github hỗ trợ chức năng này.
Với các phiên bản đã vá, bạn có thể làm những việc như sau:
Thông tin chi tiết, bao gồm cả cách cài đặt, có tại https://github.com/calid/bash
Sau khi tìm kiếm trên google, xem qua trang bash man và sau đó xem qua mã nguồn bash (lib / readline / vi_mode.c), có vẻ như không có cách nào dễ dàng để thay đổi lời nhắc khi chuyển từ chế độ chèn sang chế độ lệnh. Có vẻ như ở đây có thể có một cơ hội cho ai đó vá nguồn bash vì có những lời kêu gọi khởi động và dừng các chế độ trong nguồn.
Khi nhìn thấy bài đăng của bạn, tôi thấy hứng thú với cài đặt chế độ vi phạm. Tôi thích vi và sẽ tại sao không trên dòng lệnh. Tuy nhiên, có vẻ như chúng tôi sẽ phải theo dõi xem chúng tôi có đang ở chế độ chèn hay không mà không cần thay đổi kịp thời (vì vậy có nhiều bài đăng trên diễn đàn) Vì điều đáng giá là bạn luôn ở chế độ chèn trừ khi bạn nhấn ESC. Làm cho nó dễ dàng hơn một chút, nhưng không phải lúc nào cũng trực quan.
Tôi đang đặt câu hỏi của bạn lên vì tôi muốn biết điều này sẽ đi đến đâu.
.inputrc
Inputrc có một tùy chọn để hiển thị +
cho chèn và :
cho chế độ bình thường, bằng cách thêm set show-mode-in-prompt on
vào ~/.inputrc
như eMPee584 đã viết, nhưng điều này không hoạt động tốt với lời nhắc đa dòng (với các phiên bản bash và readline cũ hơn).
Một giải pháp là có một dòng duy nhất PS1
( >
) và một hàm lặp lại điều gì đó trước lời nhắc. Nó được xây dựng thành bash và được gọi PROMPT_COMMAND
.
function prompt {
PS1=' > '
echo -e "$(date +%R) $PWD"
}
PROMPT_COMMAND='prompt'
Các chuỗi nhắc thông thường không có sẵn trong echo của printf. Các -e
là mã màu phiên dịch, và nó không phải là cần thiết để thêm \[
hoặc \]
, mà không làm việc anyway.
Chế độ chèn :
20:57 /home/sshbio/dotfiles/bash
+ > _
Chế độ bình thường :
20:57 /home/sshbio/dotfiles/bash
: > _
Nhấn tab , chỉ PS1 được lặp lại, điều này có ý nghĩa đối với tôi:
20:57 /home/sshbio/dotfiles/bash
+ > ls _
bashrc bash_profile inputrc
+ > ls _
Đây là những gì tôi có trong ~/.inputrc
set show-mode-in-prompt on
set vi-ins-mode-string \1\e[34;1m\2└──[ins] \1\e[0m\2
set vi-cmd-mode-string \1\e[33;1m\2└──[cmd] \1\e[0m\2
Chế độ chèn nó có màu xanh lam.
└──[ins]
Chế độ lệnh nó có màu vàng.
└──[cmd]
Nhược điểm là nó không hiển thị tty
có nghĩa là nó chỉ hoạt động trên trình giả lập đầu cuối chỉ có màu sắc.
Tôi cũng cố gắng lấy một chỉ báo cho chế độ BASH vi, và tất cả các bạn đều biết rằng nó có vẻ đơn giản và chưa có cách nào để thực hiện.
Cách tiếp cận hiện tại của tôi là: nhấn 'a' khi tôi không chắc đó là chế độ nào. NẾU 'a' xuất hiện sau KHUYẾN MẠI TIỀN MẶT, tôi biết rằng mình đang ở chế độ 'CHÈN'. SAU ĐÓ, tôi nhấn 'RETURN' và tiếp tục. Đây là một cách dễ dàng để tôi giải quyết những bức xúc nhỏ.
Nhân tiện, tôi 'alias a =' cal ', hoặc một cái gì đó khác để cung cấp cho hit rỗng' một chút hữu ích.
cho lời nhắc Multiline như hình ảnh này
vòng quanh công việc của tôi là như thế này
lời nhắc bash của tôi
export PS1=" ┌錄 \[\e[32m\]\u\[\e[m\]\[\e[32m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\] \w \\$ \n "
.inputrc
set show-mode-in-prompt on
set vi-ins-mode-string " └──錄 (ins):"
set vi-cmd-mode-string " └──錄 (cmd):"
hy vọng điều này đã giúp bạn
.inputrc
Trước tiên, bạn nên đảm bảo rằng bạn đang chạy phiên bản bash cao hơn 4.3
:
$ bash --version
GNU bash, version 4.4
Sau đó đặt các dòng sau vào của bạn ~/.inputrc
:
#################### VIM ####################
# FOR MORE INFORMATION CHECK:
# https://wiki.archlinux.org/index.php/Readline
# TURN ON VIM (E.G. FOR READLINE)
set editing-mode vi
# SHOW THE VIM MODE IN THE PROMPT (COMMAND OR INSERT)
set show-mode-in-prompt on
# SET THE MODE STRING AND CURSOR TO INDICATE THE VIM MODE
# FOR THE NUMBER AFTER `\e[`:
# 0: blinking block
# 1: blinking block (default)
# 2: steady block
# 3: blinking underline
# 4: steady underline
# 5: blinking bar (xterm)
# 6: steady bar (xterm)
set vi-ins-mode-string (ins)\1\e[5 q\2
set vi-cmd-mode-string (cmd)\1\e[1 q\2
Trong chế độ lệnh, con trỏ được hiển thị dưới dạng khối.
Trong chế độ chèn, con trỏ được hiển thị dưới dạng thanh dọc.
Bản thân lời nhắc sau đó sẽ trông như thế này tùy thuộc vào chế độ:
(cmd)$ ...
(ins)$ ...