2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Bashでviモード

Last updated at Posted at 2025-10-03

はじめに

私は現在ITスクールRareTECHにて学習しているIT学習歴7ヶ月のひよっこです。
Vim歴6ヶ月のひよっこVimmerです。
今回が初投稿となりますので、お手柔らかにお願いします。

この記事を書こうと思ったきっかけ

最近ようやくターミナル操作に慣れ始めて、ふと思ったことが、
なぜシェルのキーバインドはEmacs寄りなのかと。ならばviもあるのかと。
調べてみるもんですね。ちゃんとありました。
そこで今回、私と同じ疑問を持たれた方に向けて記事を書くことにしました。

bashのviモードとは

bashのviモードとは、GNU Readline Libraryの機能をvi風に割り当てたショートカット群です。
Readlineとは、ユーザが入力中の行を編集するためのものです。
例えば、単語単位で入力した文字を消す機能や、カーソル行をターミナルの一番上にする機能とかがあります。(clearコマンドとは別物です。)

viモードの設定方法

方法A

  1. 現在の設定を確認
    ターミナルで下記のコマンドを実行

    set -o | grep -E 'emacs|vi'
    

    出力例

    emacs           on
    vi              off
    

    デフォルトでは上記のようにviがoffになっているかと思います。

  2. 次にターミナルで下記を実行

    set -o vi
    
    1. 再度設定を確認
    set -o | grep -E 'emacs|vi'
    

    出力例

    emacs           off
    vi              on
    

    上記のようにviがonになっていたらOKです。

これでviの操作ができるようになっています。
操作が切り替わっていない場合はターミナルを再起動してください。
初期状態はinsertモードですので、まずEscを押してからj, kなど試してください。

方法B

.bashrcに書く

  1. ~/.bashrcを開く

    vi ~/.bashrc
    
  2. 下記を追記

    set -o vi
    
  3. 設定を反映

    source ~/.bashrc
    

方法C(おすすめ)

  1. ホームディレクトリに.inputrcを作成(または編集)

    vi ~./inputrc
    
  2. 下記を追記

    set editing-mode vi
    
  3. 設定を反映
    設定を反映するには一度シェルを再起動するか、下記を実行

    bind -f ~/.inputrc
    

    あとは方法Aと同じ手順で確認作業をしてください。

おまけ

これでターミナルでの作業をvi操作で行うことができますね!
しかしこのままでは、insertモードかnormalモードか分からないですね。

  • そこで下記を.inputrcに追記してください。

    set vi-ins-mode-string "\1\e[32m\2🅘 \1\e[0m\2"
    set vi-cmd-mode-string "\1\e[35m\2🅝 \1\e[0m\2"
    
  • 設定を反映
    設定を反映するには一度シェルを再起動するか、下記を実行

    bind -f ~/.inputrc
    

    screenshot-2025-10-03_14-24-30.png
    画像の通りインサート・ノーマルモードが分かるようになります。

  • 下記は私の設定です。

    # .inputrc
    
    # 基本設定
    #---------------------------
    # viモード有効化
    set editing-mode vi
    
    # 連続キーの受付猶予
    set keyseq-timeout 500
    
    # Tabで候補を表示
    set show-all-if-ambiguous on
    
    # 補完時に大文字小文字を無視
    set completion-ignore-case on
    
    # ディレクトリの"/"補完
    set mark-symlinked-directories on
    
    # 補完候補全表示
    set page-completions off
    
    # 補完候補に色付け
    set colored-stats on
    
    # コピペ時にEnterが押されてコマンドが実行されるのを防ぐ
    set enable-bracketed-paste on
    
    # プロンプトにモードを自動表示
    set show-mode-in-prompt on
    
    # 表示する文字列
    set vi-ins-mode-string "\1\e[32m\2🅘 \1\e[0m\2"
    set vi-cmd-mode-string "\1\e[35m\2🅝 \1\e[0m\2"
    #---------------------------
    
    # キーマップ
    #---------------------------
    # normal mode
    $if mode=vi
    set keymap vi-command
    
    # <S-h>行頭<S-l>行末
    "H": beginning-of-line
    "L": end-of-line
    
    # gu / gU -> 小文字化 / 大文字化
    "gu": downcase-word
    "gU": upcase-word
    
    # n -> 履歴のインクリメンタル検索
    "n": history-search-backward
    # N -> 直前の検索と逆方向へ
    "N": history-search-forward
    
    # insert mode
    set keymap vi-insert
    
    # jjでnormal mode
    "jj": vi-movement-mode
    
    # <C-l>で画面クリア
    "\c-l": clear-screen
    #---------------------------
    
    $endif
    

おわりに

より細かな設定がしたい方はこちらのArchWikiをご参照ください。
参考記事 : bash を viモードで使うことにした

以上、最後まで読んでいただきありがとうございました!
間違い等ございましたらコメントいただけると幸いです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?