How to set and determine the command-line editing mode of Bash?

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP

up vote
8
down vote

favorite

3

How to set the vi or emacs command line editing mode the Bash AND how to determine which mode is currently set?

share|improve this question

    up vote
    8
    down vote

    favorite

    3

    How to set the vi or emacs command line editing mode the Bash AND how to determine which mode is currently set?

    share|improve this question

      up vote
      8
      down vote

      favorite

      3

      up vote
      8
      down vote

      favorite

      3
      3

      How to set the vi or emacs command line editing mode the Bash AND how to determine which mode is currently set?

      share|improve this question

      How to set the vi or emacs command line editing mode the Bash AND how to determine which mode is currently set?

      bash emacs vi

      share|improve this question

      share|improve this question

      share|improve this question

      share|improve this question

      edited Nov 30 at 6:13

      bignose

      22528

      22528

      asked Nov 29 at 19:02

      Blcknx

      1415

      1415

          3 Answers
          3

          active

          oldest

          votes

          up vote
          4
          down vote

          accepted

          Since your question is specific about bash:

          To set it permanently for every new session:

          echo 'set -o vi' >> ~/.bashrc
          

          or (recommended), add (or change) a line in ./inputrc:

          set editing-mode vi
          

          This will set the editing mode of readline which is used by several other programs beside bash.

          It is easy to unset both options:

          shopt -ou vi emacs
          

          To set one, either:

          set -o vi
          

          Or

          shopt -os vi
          

          The same for emacs. Setting vi unsets emacs and viceversa.

          To list the state:

          $ shopt -op emacs
          set +o emacs
          
          $ shopt -op vi
          set -o vi
          

          Or both at once:

          $ shopt -op emacs vi
          set +o emacs
          set -o vi
          

          To test if vi is set:

          shopt -oq vi      &&   echo vi is set
          

          Or (ksh syntax):

          [[ -o vi ]]        &&   echo vi is set
          

          emacs:

          shopt -oq emacs   &&   echo emacs is set
          

          Or:

          [[ -o emacs ]]    &&   echo emacs is set
          

          or, to test that no option is set:

          ! ( shopt -oq emacs || shopt -oq vi ) && echo no option is set
          

          share|improve this answer

            up vote
            14
            down vote

            To set:

            set -o vi
            

            Or:

            set -o emacs
            

            (setting one unsets the other. You can do set -o vi +o vi to unset both)

            To check:

            if [[ -o emacs ]]; then
              echo emacs mode
            elif [[ -o vi ]]; then
              echo vi mode
            else
              echo neither
            fi
            

            That syntax comes from ksh. The set -o vi is POSIX. set -o emacs is not (as Richard Stallman objected to the emacs mode being specified by POSIX) but very common among shell implementations. Some shells support extra editing modes. [[ -o option ]] is not POSIX, but supported by ksh, bash and zsh. [ -o option ] is supported by bash, ksh and yash (note that -o is also a binary OR operator for [).

            share|improve this answer

            • It works and it is surprising, that it is that difficult to determine the mode.
              – Blcknx
              Nov 29 at 19:06

            • 3

              set -o | egrep -w '^emacs|vi' will return whether emacs or vi is set.
              – Stephen Harris
              Nov 29 at 19:10

            up vote
            3
            down vote

            There is also bind -V | grep editing-mode.

            man bash is huge but well worth reading in depth.

            share|improve this answer

              Your Answer

              StackExchange.ready(function() {
              var channelOptions = {
              tags: “”.split(” “),
              id: “106”
              };
              initTagRenderer(“”.split(” “), “”.split(” “), channelOptions);

              StackExchange.using(“externalEditor”, function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using(“snippets”, function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: ‘answer’,
              convertImagesToLinks: false,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: null,
              bindNavPrevention: true,
              postfix: “”,
              imageUploader: {
              brandingHtml: “Powered by u003ca class=”icon-imgur-white” href=”https://imgur.com/”u003eu003c/au003e”,
              contentPolicyHtml: “User contributions licensed under u003ca href=”https://creativecommons.org/licenses/by-sa/3.0/”u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href=”https://stackoverflow.com/legal/content-policy”u003e(content policy)u003c/au003e”,
              allowUrls: true
              },
              onDemand: true,
              discardSelector: “.discard-answer”
              ,immediatelyShowMarkdownHelp:true
              });

              }
              });

              draft saved
              draft discarded

              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin(‘.new-post-login’, ‘https%3a%2f%2funix.stackexchange.com%2fquestions%2f484997%2fhow-to-set-and-determine-the-command-line-editing-mode-of-bash%23new-answer’, ‘question_page’);
              }
              );

              Post as a guest

              Required, but never shown

              3 Answers
              3

              active

              oldest

              votes

              3 Answers
              3

              active

              oldest

              votes

              active

              oldest

              votes

              active

              oldest

              votes

              up vote
              4
              down vote

              accepted

              Since your question is specific about bash:

              To set it permanently for every new session:

              echo 'set -o vi' >> ~/.bashrc
              

              or (recommended), add (or change) a line in ./inputrc:

              set editing-mode vi
              

              This will set the editing mode of readline which is used by several other programs beside bash.

              It is easy to unset both options:

              shopt -ou vi emacs
              

              To set one, either:

              set -o vi
              

              Or

              shopt -os vi
              

              The same for emacs. Setting vi unsets emacs and viceversa.

              To list the state:

              $ shopt -op emacs
              set +o emacs
              
              $ shopt -op vi
              set -o vi
              

              Or both at once:

              $ shopt -op emacs vi
              set +o emacs
              set -o vi
              

              To test if vi is set:

              shopt -oq vi      &&   echo vi is set
              

              Or (ksh syntax):

              [[ -o vi ]]        &&   echo vi is set
              

              emacs:

              shopt -oq emacs   &&   echo emacs is set
              

              Or:

              [[ -o emacs ]]    &&   echo emacs is set
              

              or, to test that no option is set:

              ! ( shopt -oq emacs || shopt -oq vi ) && echo no option is set
              

              share|improve this answer

                up vote
                4
                down vote

                accepted

                Since your question is specific about bash:

                To set it permanently for every new session:

                echo 'set -o vi' >> ~/.bashrc
                

                or (recommended), add (or change) a line in ./inputrc:

                set editing-mode vi
                

                This will set the editing mode of readline which is used by several other programs beside bash.

                It is easy to unset both options:

                shopt -ou vi emacs
                

                To set one, either:

                set -o vi
                

                Or

                shopt -os vi
                

                The same for emacs. Setting vi unsets emacs and viceversa.

                To list the state:

                $ shopt -op emacs
                set +o emacs
                
                $ shopt -op vi
                set -o vi
                

                Or both at once:

                $ shopt -op emacs vi
                set +o emacs
                set -o vi
                

                To test if vi is set:

                shopt -oq vi      &&   echo vi is set
                

                Or (ksh syntax):

                [[ -o vi ]]        &&   echo vi is set
                

                emacs:

                shopt -oq emacs   &&   echo emacs is set
                

                Or:

                [[ -o emacs ]]    &&   echo emacs is set
                

                or, to test that no option is set:

                ! ( shopt -oq emacs || shopt -oq vi ) && echo no option is set
                

                share|improve this answer

                  up vote
                  4
                  down vote

                  accepted

                  up vote
                  4
                  down vote

                  accepted

                  Since your question is specific about bash:

                  To set it permanently for every new session:

                  echo 'set -o vi' >> ~/.bashrc
                  

                  or (recommended), add (or change) a line in ./inputrc:

                  set editing-mode vi
                  

                  This will set the editing mode of readline which is used by several other programs beside bash.

                  It is easy to unset both options:

                  shopt -ou vi emacs
                  

                  To set one, either:

                  set -o vi
                  

                  Or

                  shopt -os vi
                  

                  The same for emacs. Setting vi unsets emacs and viceversa.

                  To list the state:

                  $ shopt -op emacs
                  set +o emacs
                  
                  $ shopt -op vi
                  set -o vi
                  

                  Or both at once:

                  $ shopt -op emacs vi
                  set +o emacs
                  set -o vi
                  

                  To test if vi is set:

                  shopt -oq vi      &&   echo vi is set
                  

                  Or (ksh syntax):

                  [[ -o vi ]]        &&   echo vi is set
                  

                  emacs:

                  shopt -oq emacs   &&   echo emacs is set
                  

                  Or:

                  [[ -o emacs ]]    &&   echo emacs is set
                  

                  or, to test that no option is set:

                  ! ( shopt -oq emacs || shopt -oq vi ) && echo no option is set
                  

                  share|improve this answer

                  Since your question is specific about bash:

                  To set it permanently for every new session:

                  echo 'set -o vi' >> ~/.bashrc
                  

                  or (recommended), add (or change) a line in ./inputrc:

                  set editing-mode vi
                  

                  This will set the editing mode of readline which is used by several other programs beside bash.

                  It is easy to unset both options:

                  shopt -ou vi emacs
                  

                  To set one, either:

                  set -o vi
                  

                  Or

                  shopt -os vi
                  

                  The same for emacs. Setting vi unsets emacs and viceversa.

                  To list the state:

                  $ shopt -op emacs
                  set +o emacs
                  
                  $ shopt -op vi
                  set -o vi
                  

                  Or both at once:

                  $ shopt -op emacs vi
                  set +o emacs
                  set -o vi
                  

                  To test if vi is set:

                  shopt -oq vi      &&   echo vi is set
                  

                  Or (ksh syntax):

                  [[ -o vi ]]        &&   echo vi is set
                  

                  emacs:

                  shopt -oq emacs   &&   echo emacs is set
                  

                  Or:

                  [[ -o emacs ]]    &&   echo emacs is set
                  

                  or, to test that no option is set:

                  ! ( shopt -oq emacs || shopt -oq vi ) && echo no option is set
                  

                  share|improve this answer

                  share|improve this answer

                  share|improve this answer

                  edited Nov 29 at 23:42

                  answered Nov 29 at 22:58

                  Isaac

                  10.7k11447

                  10.7k11447

                      up vote
                      14
                      down vote

                      To set:

                      set -o vi
                      

                      Or:

                      set -o emacs
                      

                      (setting one unsets the other. You can do set -o vi +o vi to unset both)

                      To check:

                      if [[ -o emacs ]]; then
                        echo emacs mode
                      elif [[ -o vi ]]; then
                        echo vi mode
                      else
                        echo neither
                      fi
                      

                      That syntax comes from ksh. The set -o vi is POSIX. set -o emacs is not (as Richard Stallman objected to the emacs mode being specified by POSIX) but very common among shell implementations. Some shells support extra editing modes. [[ -o option ]] is not POSIX, but supported by ksh, bash and zsh. [ -o option ] is supported by bash, ksh and yash (note that -o is also a binary OR operator for [).

                      share|improve this answer

                      • It works and it is surprising, that it is that difficult to determine the mode.
                        – Blcknx
                        Nov 29 at 19:06

                      • 3

                        set -o | egrep -w '^emacs|vi' will return whether emacs or vi is set.
                        – Stephen Harris
                        Nov 29 at 19:10

                      up vote
                      14
                      down vote

                      To set:

                      set -o vi
                      

                      Or:

                      set -o emacs
                      

                      (setting one unsets the other. You can do set -o vi +o vi to unset both)

                      To check:

                      if [[ -o emacs ]]; then
                        echo emacs mode
                      elif [[ -o vi ]]; then
                        echo vi mode
                      else
                        echo neither
                      fi
                      

                      That syntax comes from ksh. The set -o vi is POSIX. set -o emacs is not (as Richard Stallman objected to the emacs mode being specified by POSIX) but very common among shell implementations. Some shells support extra editing modes. [[ -o option ]] is not POSIX, but supported by ksh, bash and zsh. [ -o option ] is supported by bash, ksh and yash (note that -o is also a binary OR operator for [).

                      share|improve this answer

                      • It works and it is surprising, that it is that difficult to determine the mode.
                        – Blcknx
                        Nov 29 at 19:06

                      • 3

                        set -o | egrep -w '^emacs|vi' will return whether emacs or vi is set.
                        – Stephen Harris
                        Nov 29 at 19:10

                      up vote
                      14
                      down vote

                      up vote
                      14
                      down vote

                      To set:

                      set -o vi
                      

                      Or:

                      set -o emacs
                      

                      (setting one unsets the other. You can do set -o vi +o vi to unset both)

                      To check:

                      if [[ -o emacs ]]; then
                        echo emacs mode
                      elif [[ -o vi ]]; then
                        echo vi mode
                      else
                        echo neither
                      fi
                      

                      That syntax comes from ksh. The set -o vi is POSIX. set -o emacs is not (as Richard Stallman objected to the emacs mode being specified by POSIX) but very common among shell implementations. Some shells support extra editing modes. [[ -o option ]] is not POSIX, but supported by ksh, bash and zsh. [ -o option ] is supported by bash, ksh and yash (note that -o is also a binary OR operator for [).

                      share|improve this answer

                      To set:

                      set -o vi
                      

                      Or:

                      set -o emacs
                      

                      (setting one unsets the other. You can do set -o vi +o vi to unset both)

                      To check:

                      if [[ -o emacs ]]; then
                        echo emacs mode
                      elif [[ -o vi ]]; then
                        echo vi mode
                      else
                        echo neither
                      fi
                      

                      That syntax comes from ksh. The set -o vi is POSIX. set -o emacs is not (as Richard Stallman objected to the emacs mode being specified by POSIX) but very common among shell implementations. Some shells support extra editing modes. [[ -o option ]] is not POSIX, but supported by ksh, bash and zsh. [ -o option ] is supported by bash, ksh and yash (note that -o is also a binary OR operator for [).

                      share|improve this answer

                      share|improve this answer

                      share|improve this answer

                      edited Nov 29 at 19:14

                      answered Nov 29 at 19:05

                      Stéphane Chazelas

                      296k54559904

                      296k54559904

                      • It works and it is surprising, that it is that difficult to determine the mode.
                        – Blcknx
                        Nov 29 at 19:06

                      • 3

                        set -o | egrep -w '^emacs|vi' will return whether emacs or vi is set.
                        – Stephen Harris
                        Nov 29 at 19:10

                      • It works and it is surprising, that it is that difficult to determine the mode.
                        – Blcknx
                        Nov 29 at 19:06

                      • 3

                        set -o | egrep -w '^emacs|vi' will return whether emacs or vi is set.
                        – Stephen Harris
                        Nov 29 at 19:10

                      It works and it is surprising, that it is that difficult to determine the mode.
                      – Blcknx
                      Nov 29 at 19:06

                      It works and it is surprising, that it is that difficult to determine the mode.
                      – Blcknx
                      Nov 29 at 19:06

                      3

                      3

                      set -o | egrep -w '^emacs|vi' will return whether emacs or vi is set.
                      – Stephen Harris
                      Nov 29 at 19:10

                      set -o | egrep -w '^emacs|vi' will return whether emacs or vi is set.
                      – Stephen Harris
                      Nov 29 at 19:10

                      up vote
                      3
                      down vote

                      There is also bind -V | grep editing-mode.

                      man bash is huge but well worth reading in depth.

                      share|improve this answer

                        up vote
                        3
                        down vote

                        There is also bind -V | grep editing-mode.

                        man bash is huge but well worth reading in depth.

                        share|improve this answer

                          up vote
                          3
                          down vote

                          up vote
                          3
                          down vote

                          There is also bind -V | grep editing-mode.

                          man bash is huge but well worth reading in depth.

                          share|improve this answer

                          There is also bind -V | grep editing-mode.

                          man bash is huge but well worth reading in depth.

                          share|improve this answer

                          share|improve this answer

                          share|improve this answer

                          answered Nov 29 at 22:25

                          studog

                          25316

                          25316

                              draft saved
                              draft discarded

                              Thanks for contributing an answer to Unix & Linux Stack Exchange!

                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid

                              • Asking for help, clarification, or responding to other answers.
                              • Making statements based on opinion; back them up with references or personal experience.

                              To learn more, see our tips on writing great answers.

                              Some of your past answers have not been well-received, and you’re in danger of being blocked from answering.

                              Please pay close attention to the following guidance:

                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid

                              • Asking for help, clarification, or responding to other answers.
                              • Making statements based on opinion; back them up with references or personal experience.

                              To learn more, see our tips on writing great answers.

                              draft saved

                              draft discarded

                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin(‘.new-post-login’, ‘https%3a%2f%2funix.stackexchange.com%2fquestions%2f484997%2fhow-to-set-and-determine-the-command-line-editing-mode-of-bash%23new-answer’, ‘question_page’);
                              }
                              );

                              Post as a guest

                              Required, but never shown

                              Required, but never shown

                              Required, but never shown

                              Required, but never shown

                              Required, but never shown

                              Required, but never shown

                              Required, but never shown

                              Required, but never shown

                              Required, but never shown

                              Related Post

                              Leave a Reply

                              Your email address will not be published. Required fields are marked *