2009-06-24 9 views
102

Khi sử dụng chế độ vi (set -o vi) với Bash, sẽ tốt hơn khi có lời nhắc phụ thuộc vào chế độ bạn hiện đang ở (chèn hoặc lệnh). Làm cách nào để tìm ra chế độ chỉnh sửa này?Dấu nhắc bash khác nhau cho chế độ chỉnh sửa vi khác nhau?

Btw, đây có vẻ là có thể trong ZSH:

+0

Cũng tò mò về điều này. Được săn lùng qua tài liệu bash, nhưng không tìm thấy gì cả. –

Trả lời

0

Mặc dù không phải là một giải pháp một bước, một cách để bạn có thể đạt được điều này là bằng cách viết một kịch bản rằng những thay đổi cả chế độ chỉnh sửa và nhắc nhở đồng thời & sử dụng cho biết kịch bản độc quyền khi thay đổi chế độ.

IE: Có một kịch bản gọi là bash-vi mà thực hiện "set -o vi; PS1='desired vi mode prompt';"


Edit: (Không thể bình luận nào) tôi thấy, tôi đoán tôi đã không đọc những câu hỏi một cách cẩn thận đủ & bỏ qua các tài liệu tham khảo để chèn chế độ lệnh &. Bạn cũng không chắc chắn cách thiết lập điều đó. Thông thường nó đã không được một vấn đề đối với tôi vì tôi chỉ sử dụng chế độ lệnh cho các hoạt động ngắn gọn - tôi có thể thấy lý do tại sao nó sẽ hữu ích mặc dù.

+1

Không, những gì Thomas yêu cầu là khác nhau. Với 'set -o vi' trên, anh ta muốn một dấu nhắc rõ ràng khác khi anh ta nhấn , và sau đó nhắc nhở ban đầu một lần nữa khi anh ta nhấn . – ephemient

19

Sau khi tìm kiếm 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 di chuyển từ chế độ chèn sang chế độ lệnh. Có vẻ như có một cơ hội ở đây để ai đó vá nguồn bash mặc dù có các cuộc gọi để bắt đầu và dừng các chế độ trong nguồn.

Khi xem bài đăng của bạn, điều đó khiến tôi quan tâm đến cài đặt chế độ bash vi. Tôi yêu vi và tại sao không phải 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 đang ở chế độ chèn mà không có thay đổi nhanh (vì vậy hãy nói nhiều bài đăng trên diễn đàn) Đối với những gì bạn đáng được ở 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 vì tôi quan tâm đến việc xem điều này diễn ra ở đâu.

0

Tôi cố gắng để có được một chỉ báo cho chế độ BASH vi cũng được, và tất cả các bạn đã học nó âm thanh đơn giản và chỉ cần không có cách nào để làm điều đó được nêu ra.

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 chắn chế độ nào là. IF 'a' xuất hiện sau KHUYẾN MÃI BASH, tôi biết tôi đang ở chế độ 'INSERT'. THEN, 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 sự khó chịu nhỏ.

Nhân tiện, tôi 'bí danh a =' cal ', hoặc một cái gì đó khác để cung cấp cho lần truy cập trống' a 'ít hữu ích.

+2

Sẽ có ý nghĩa hơn với tôi để chỉ nhấn "esc || c- [" chứ không phải là a. Sau đó, bạn không cần phải tìm hiểu những gì chế độ của bạn trong; hoặc chèn các ký tự không mong muốn bạn phải xóa (hoặc nhấn return) – wom

54

bash tươi 4.3 và 6.3 readline 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, việc đưa

set show-mode-in-prompt on 

vào/etc/inputrc hoặc ~/.inputrc (thx stooj) sẽ ảnh hưởng đến tất cả các chương trình hỗ trợ readline của bạn;)

+0

bất kỳ trạng thái nào 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 nhưng đối với các dòng nhắc dựa trên readline 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 nào khác (ngoài điều này và bài viết [bạn tham chiếu] (http://cnswww.cns.cwru.edu/php/chet/readline/CHANGES)) –

+3

Chỉ cần thêm vào từ eMPee584 - nếu bạn đang chạy bash 4.3 hoặc cao hơn, hãy thêm thông tin sau vào tập tin ~/.inputrc của bạn hiển thị chế độ hiển thị lời nhắc Điều này thêm dấu + vào bên trái dấu nhắc của bạn nếu bạn đang ở chế độ chỉnh sửa và : nếu bạn đang ở chế độ lệnh. – stooj

+3

Vì vậy, trong khi điều này hoạt động; là có một cách để di chuyển nơi này nhân vật vi-mode ngồi int ông nhắc không? Nếu bạn có nhiều dòng nhắc (tùy chỉnh) nó không hoạt động tốt như vậy :) –

16

Bash 4.4/Readline 7.0 will add support for user-settable mode strings.

Bạn có thể thử các phiên bản beta, nhưng chúng có vẻ hơi lỗi một chút vào lúc này. Họ cũng chưa hỗ trợ chỉ định nơi trong dấu nhắc bạn muốn chỉ báo chế độ xảy ra (mà tôi nghĩ là tính năng sát thủ).

Nếu bạn không muốn chờ đợi và không sợ một chút biên soạn, tôi đã xuất bản các phiên bản vá của bash 4.3 và readline 6.3 thành 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 thứ như thế này:

enter image description here

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

6

Multiline nhanh chóng và .inputrc

inputrc có tùy chọn hiển thị + để chèn và : cho chế độ thông 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 dấu nhắc nhiều dòng.

Một giải pháp có một dòng PS1 (>) và một hàm phản hồi điều gì đó trước dấu nhắc. Nó được xây dựng thành bash và được gọi là 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. -e là để diễn giải mã màu và không cần thiết phải thêm \[ hoặc \], không hoạt động.

Chèn chế độ:

20:57 /home/sshbio/dotfiles/bash 
+ > _ 

Bình thường chế độ:

20:57 /home/sshbio/dotfiles/bash 
: > _ 

tab Nhấn, chỉ có PS1 được lặp đi lặp lại, có ý nghĩa đối với tôi:

20:57 /home/sshbio/dotfiles/bash 
+ > ls _ 
bashrc  bash_profile  inputrc 
+ > ls _ 

Preview (Source)

+0

Nếu sử dụng màu sắc trong' vi-cmd-mode-string' hoặc 'vi-ins-mode-string', những bắt đầu bằng '\ 1' và được postfixed bởi' \ 2'. Xem [ở đây] (https://www.gnu.org/software/bash/manual/bash.html#Readline-Init-File). ['và' \ ['vẫn nên được phát ra, nhưng bạn sẽ cần' \\ ['và' \\] 'bên trong printf. –