Bagaimana cara saya beralih ke mode edit vi di readline?


16

Saya ingin beralih ke mode edit vi di lingkungan readline. Tapi saya tidak ingin menggunakan 'set -o vi'. Saya ingin beralih sementara menggunakan pintasan keyboard. Halaman manual mengatakan saya bisa melakukan ini M-C-j. Tapi itu tidak berhasil untukku.

Saya menggunakan Ubuntu dan xterm. Juga tidak bekerja di bawah terminal gnome.

Jawaban:


12

Saya akan mengonfirmasi bahwa pemetaan keyboard Meta+ Control+ jsebenarnya sudah benar di sistem Anda. Anda dapat menggunakan perintah ini untuk mendaftar semua ikatan tombol untuk berbagai mode Bash. Di sistem saya juga tidak ada keybinding.

$ 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

Anda dapat melakukan yang berikut sehingga saat Anda mengetik Esc+ eitu akan beralih di antara 2 mode.

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

The bindperintah sekarang menunjukkan ini:

dalam mode 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

dalam mode 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".

Sekarang Anda dapat menggunakan Esc+ euntuk beralih di antara 2 mode yang berbeda.


Perhatikan bahwa Anda harus cepat saat mengetik ESC E. Jika Anda berhenti sebentar, Anda akan beralih dari mode vi-insert ke mode vi-command, atau membatalkan saja perintah vi saat ini.
spelufo

6

Bash secara eksplisit menonaktifkan ini dan beberapa pintasan Readline lainnya. Lihat initialize_readline()fungsi dalam kode sumber 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

Saya sepertinya tidak dapat mengesampingkan perilaku ini menggunakan file konfigurasi Readline (.inputrc).


6

Inilah yang akhirnya saya gunakan untuk saya ~/.inputrc, berdasarkan jawaban 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

Saya mencoba $if mode=sintaks, tetapi saya pikir itu diselesaikan secara statis (satu kali, ketika membaca file), jadi itu tidak berfungsi seperti yang saya harapkan. Jadi kita perlu beralih ke masing-masing peta tombol dan memodifikasi binding kuncinya, bahkan jika sebelumnya diatur pada peta tombol lain. Pada akhirnya saya katakan mode mana yang ingin saya mulai.


2

Saya mencoba agar pemetaan bergaya emacs digunakan dalam mode vi. Saya berakhir dengan:

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

Sangat membantu untuk membaca halaman manual untuk readlinedan READLINEbagian pada bashhalaman manual.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.