ฉันจะเปลี่ยนเป็นโหมดแก้ไข vi ใน readline ได้อย่างไร


16

ฉันต้องการเปลี่ยนเป็นโหมดแก้ไข vi ในระบบ readline แต่ฉันไม่ต้องการใช้ 'set -o vi' ฉันต้องการสลับโดยใช้แป้นพิมพ์ลัดชั่วคราว M-C-jหน้าคนพูดว่าฉันสามารถทำเช่นนี้กับ แต่นั่นไม่ได้ผลสำหรับฉัน

ฉันใช้ Ubuntu และ xterm ไม่สามารถทำงานภายใต้ gnome-terminal ได้เช่นกัน

คำตอบ:


12

ฉันขอยืนยันว่าการแมปคีย์บอร์ดMeta+ Control+ jนั้นถูกต้องในระบบของคุณ คุณสามารถใช้คำสั่งนี้เพื่อแสดงรายการ keybinds สำหรับโหมดต่างๆของ Bash ในระบบของฉันไม่มีการผูกกุญแจเช่นกัน

$ bind -P| grep edit
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
vi-editing-mode is not bound to any keys

คุณสามารถทำสิ่งต่อไปนี้เพื่อที่ว่าเมื่อคุณพิมพ์Esc+ eมันจะสลับไปมาระหว่าง 2 โหมด

$ set -o emacs
$ bind '"\ee": vi-editing-mode'
$ set -o vi
$ bind '"\ee": emacs-editing-mode'

bindคำสั่งนี้จะแสดงนี้:

ในโหมด vi

$ bind -P |grep edit
edit-and-execute-command is not bound to any keys
emacs-editing-mode can be found on "\ee".
vi-editing-mode is not bound to any keys

ในโหมด emacs

$ bind -P |grep edit
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
vi-editing-mode can be found on "\ee".

ตอนนี้คุณสามารถใช้Esc+ eเพื่อสลับระหว่าง 2 โหมดที่แตกต่างกัน


ESC Eโปรดทราบว่าคุณจะต้องรวดเร็วเมื่อพิมพ์ หากคุณหยุดชั่วคราวคุณจะเปลี่ยนจากโหมด vi-insert เป็น vi-command หรือยกเลิกคำสั่ง vi ปัจจุบัน
spelufo

6

Bash ปิดการใช้งานอย่างชัดเจนและทางลัด Readline อื่น ๆ ดูinitialize_readline()ฟังก์ชั่นในซอร์สโค้ด bash ( http://www.catonmat.net/download/bashline.c ):

   /* In Bash, the user can switch editing modes with "set -o [vi emacs]",
      so it is not necessary to allow C-M-j for context switching.  Turn
      off this occasionally confusing behaviour. */
   rl_unbind_key_in_map (CTRL('J'), emacs_meta_keymap);
   rl_unbind_key_in_map (CTRL('M'), emacs_meta_keymap);
#if defined (VI_MODE)
  rl_unbind_key_in_map (CTRL('E'), vi_movement_keymap);
#endif

ฉันดูเหมือนจะไม่สามารถแทนที่พฤติกรรมนี้โดยใช้ไฟล์การกำหนดค่า Readline (.inputrc)


6

นี่คือสิ่งที่ฉันใช้สำหรับ~/.inputrcคำตอบของ slm

set show-mode-in-prompt on

set keymap emacs
"\ea": vi-editing-mode

set keymap vi-command
"k": history-search-backward
"j": history-search-forward
"z": emacs-editing-mode
"\ea": emacs-editing-mode

set keymap vi-insert
"\ea": emacs-editing-mode
"\C-l": clear-screen
"\C-e": end-of-line
"\C-k": kill-line

set editing-mode vi

ฉันลองใช้$if mode=ไวยากรณ์ แต่ฉันคิดว่านั่นจะได้รับการแก้ไขแบบสแตติก (ครั้งเดียวเมื่ออ่านไฟล์) ดังนั้นจึงไม่ทำงานอย่างที่ฉันคาด ดังนั้นเราจึงต้องเปลี่ยนไปใช้แต่ละคีย์แมปและปรับเปลี่ยนการเชื่อมโยงคีย์แม้ว่าก่อนหน้านี้จะตั้งค่าไว้บนคีย์แมปอื่น ในตอนท้ายฉันพูดโหมดที่ฉันต้องการเริ่มต้นด้วย


2

ฉันพยายามใช้การแม็ปแบบ emacs ในโหมด vi ฉันลงเอยด้วย:

set keymap vi-command
"k": history-search-backward
"j": history-search-forward

set keymap vi-insert
"\C-A": beginning-of-line
"\C-B": backward-char
"\C-D": delete-char
"\C-E": end-of-line
"\C-F": forward-char
"\C-K": kill-line
"\C-L": clear-screen
"\C-N": next-history
"\C-P": previous-history
"\C-O": operate-and-get-next

# Enable Readline not waiting for additional input when a key is pressed.
# Needed for the mappings below.
set keyseq-timeout 0

# `yank-last-arg` does not work exactly as in emacs mode
"\e.": yank-last-arg
"\e\177": backward-kill-word
"\e0": digit-argument
"\e1": digit-argument
"\e2": digit-argument
"\e3": digit-argument
"\e4": digit-argument
"\e5": digit-argument
"\e6": digit-argument
"\e7": digit-argument
"\e8": digit-argument
"\e9": digit-argument
"\eb": backward-word
"\ec": capitalize-word
"\ed": kill-word
"\ef": forward-word
"\el": downcase-word
"\en": non-incremental-forward-search-history
"\ep": non-incremental-reverse-search-history
"\et": transpose-words
"\eu": upcase-word
"\ey": yank-pop

# some other useful mappings

"\e/": complete-filename
"\ek": kill-whole-line
"\eo": "\C-v\C-j"
# quickly switch to "normal" mode
"\C-[": vi-movement-mode
# perserve the currently editing line so that we can 
# do something else before restoring it.
"\eg": insert-comment
"\er": "\C-R#\C-A\C-D\C-E"

set editing-mode vi

มันจะมีประโยชน์ในการอ่านหน้าคนสำหรับ readlineและREADLINEส่วนในbashman page เป็นประโยชน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.