मैं रीडलाइन में vi संपादन मोड में कैसे स्विच करूं?


16

मैं एक रीडलाइन वातावरण में vi संपादन मोड पर स्विच करना चाहता हूं। लेकिन मैं 'सेट -o vi' का उपयोग नहीं करना चाहता। मैं एक कीबोर्ड शॉर्टकट का उपयोग करके अस्थायी रूप से स्विच करना चाहता हूं। मैन पेज कहता है कि मैं ऐसा कर सकता हूं M-C-j। लेकिन वह मेरे लिए काम नहीं करता है।

मैं Ubuntu और एक xterm का उपयोग कर रहा हूँ। सूक्ति-टर्मिनल के तहत काम नहीं करता है।

जवाबों:


12

मैं पुष्टि करता हूं कि कीबोर्ड मैपिंग Meta+ Control+ jवास्तव में आपके सिस्टम पर सही है। आप इस कमांड का उपयोग बैश के विभिन्न मोड के लिए सभी कीबाइंड को सूचीबद्ध करने के लिए कर सकते हैं। मेरे सिस्टम पर या तो कीबाइंडिंग नहीं थी।

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

अब आप 2 अलग-अलग मोड के बीच Esc+ eटॉगल करने के लिए उपयोग कर सकते हैं ।


ध्यान दें कि टाइप करते समय आपको जल्दी होना है ESC E। यदि आप विराम देते हैं तो आप vi-insert से vi-command मोड में जाएंगे, या वर्तमान vi कमांड को रद्द कर सकते हैं।
spelufo

6

बैश स्पष्ट रूप से और कुछ अन्य रीडलाइन शॉर्टकट को निष्क्रिय कर देता है। 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

मुझे रीडलाइन कॉन्फ़िगरेशन फ़ाइल (.inputrc) का उपयोग करके इस व्यवहार को ओवरराइड करने में सक्षम नहीं लगता है।


6

यहाँ मैंने अपने लिए प्रयोग किया ~/.inputrc, जो स्लम के उत्तर पर आधारित है।

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

मैंने वीआई मोड में इस्तेमाल होने वाले एमएसीएस-स्टाइल मैपिंग की कोशिश की। मैं इसके साथ समाप्त हुआ:

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सेक्शन को पढ़ने में मददगार है bash

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.