Readline'da vi düzenleme moduna nasıl geçebilirim?


16

Bir readline ortamında vi düzenleme moduna geçmek istiyorum. Ama 'set -o vi' kullanmak istemiyorum. Geçici olarak bir klavye kısayolu kullanarak geçiş yapmak istiyorum. Man sayfası bunu yapabileceğimi söylüyor M-C-j. Ama bu benim için işe yaramıyor.

Ubuntu ve xterm kullanıyorum. GNOME terminali altında da çalışmaz.

Yanıtlar:


12

Meta+ Control+ Klavye eşlemesinin jaslında sisteminizde doğru olduğunu onaylarım . Bash'in çeşitli modları için tüm tuş bağlantılarını listelemek için bu komutu kullanabilirsiniz. Sistemimde de bir tuş takımı yoktu.

$ 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+ Yazdığınızda e2 mod arasında geçiş yapması için aşağıdakileri yapabilirsiniz .

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

bindKomut şimdi bunu gösterir:

vi modunda

$ 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 modunda

$ 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".

Artık Esc+ tuşlarını ekullanarak 2 farklı mod arasında geçiş yapabilirsiniz.


Yazarken hızlı olmanız gerektiğini unutmayın ESC E. Duraklarsanız vi-insert'den vi-command moduna geçersiniz veya sadece geçerli vi komutunu iptal edebilirsiniz.
spelufo

6

Bash bunu ve diğer birkaç Readline kısayolunu açıkça devre dışı bırakır. initialize_readline()Bash kaynak kodundaki işleve bakın ( 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

Ben Readline yapılandırma dosyasını (.inputrc) kullanarak bu davranışı geçersiz kılmak mümkün görünmüyor.


6

İşte ~/.inputrcslm cevabına dayanarak, benim için kullanarak sonuçlandı .

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=Sözdizimini denedim , ancak statik olarak (bir kez, dosyayı okurken) çözüldüğünü düşünüyorum, bu yüzden beklediğim gibi çalışmıyor. Bu nedenle, daha önce başka bir tuş eşlemesine ayarlanmış olsa bile her bir tuş eşlemesine geçmeli ve tuş bağlantılarını değiştirmeliyiz. Sonunda hangi modla başlamak istediğimi söylüyorum.


2

Vi modunda emacs tarzı eşlemeler kullanılmaya çalıştım. Sonunda:

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

Man sayfalarını okumak için yararlıdır readlineve READLINEilgili bölüme bashadam sayfası.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.