Lời nhắc bash khác nhau cho chế độ chỉnh sửa vi khác nhau?


113

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 :

bash  prompt 

Tôi cũng tò mò về điều này. Đã tìm kiếm thông qua tài liệu bash, nhưng không tìm thấy bất cứ điều gì.
Andrew Ferrier

Câu trả lời:


67

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;)


bất kỳ trạng thái về điều này? Tôi đang cố gắng tìm một cái gì đó như thế này (không phải cho bash mà cho các lời nhắc dựa trên dòng đọc khác mà tôi sử dụng). Tôi đã googling và đã không tìm thấy bất kỳ bản cập nhật khác (ngoài việc này và bài viết bạn tham chiếu )
Mike HR

4
Chỉ cần thêm vào từ eMPee584 - nếu bạn đang chạy bash 4.3 trở lên, hãy thêm phần sau vào tập hợp tệp ~ / .inputrc show-mode-in-prompt của bạn. Điều này sẽ thêm dấu + vào bên trái lời nhắc của bạn nếu bạn đang ở chế độ chỉnh sửa và a: nếu bạn đang ở chế độ lệnh.
stooj

3
Vì vậy, trong khi điều này hoạt động; có cách nào để di chuyển nơi nhân vật chế độ vi-mode này ngồi trong lời nhắc của anh ấy không? Nếu bạn có nhắc nhở nhiều dòng (tùy chỉnh) nó không hoạt động tất cả những gì tốt :)
James Mills

Đối với 4.3, nó luôn ở đầu lời nhắc và thật không may, readline sẽ chỉ vẽ lại dòng cuối cùng của lời nhắc nhiều dòng. Xem câu trả lời "Lời nhắc nhiều dòng và .inputrc" để biết cách giải quyết khác hoặc xem câu trả lời về cách vá lỗi bash 4.3 với bản sửa lỗi của 4.4 cho vấn đề này.
studgeek

20

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:

nhập mô tả hình ảnh ở đây

Thông tin chi tiết, bao gồm cả cách cài đặt, có tại https://github.com/calid/bash


19

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.


7

Lời nhắc đa dòng và .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 onvào ~/.inputrcnhư 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 -elà 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 _

Xem trước (Nguồn)


Nếu sử dụng màu trong vi-cmd-mode-stringhoặc vi-ins-mode-string, những màu này phải được ghi trước \1và ghi sau \2. Xem tại đây . Ngoài ra, \[\[vẫn nên được phát ra, nhưng bạn sẽ cần \\[\\]bên trong printf.
Tom Hale

1

Đâ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ị ttycó nghĩa là nó chỉ hoạt động trên trình giả lập đầu cuối chỉ có màu sắc.


0

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.


2
Sẽ có ý nghĩa hơn đối với tôi nếu chỉ nhấn "esc || c- [" hơn là a. Sau đó, bạn không cần phải nhìn để biết bạn đang ở chế độ nào; hoặc chèn ký tự không mong muốn, bạn phải loại bỏ (hoặc nhấn cửa sổ mới)
WOM

0

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


0

Các kiểu nhắc và con trỏ khác nhau qua .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)$ ...
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.