Teru Komaki's Blog (Temporary)

BashをViモードに変更して快適になった話

私は、まだまだ初心者のVimmerだと思いますが、Vimがあまりにも快適で使っていて気持ち良いため、普段からキーバインドをVimに変更できないかをググっています。

タイトルの通り、普段使っている Bash にも Viモード があるということが分かり、早速変更したのでメモ。

設定したターミナル

bash

BashのViモードについてググる

なにはともあれ、ググる

上の記事では~/.bashrcset -o viを追加すればOK、と書いてある。

1# ~/.bashrc
2
3set -o vi

しかし、私は最終的に、以下のブログを参考にし~/.bashrcではなく~/.inputrcを修正しました。

以下に、Use vi shortcuts in terminalに記載されている設定を引用

 1# ~/.inputrc
 2
 3# Use Vi, not Emacs, style editing
 4set editing-mode vi
 5
 6# Show all completions as soon as I press tab, even if there's more than one
 7set show-all-if-ambiguous on
 8# Ignore case
 9set completion-ignore-case on
10# on menu-complete, first display the common prefix, then cycle through the 
11# options when hitting TAB
12set menu-complete-display-prefix on
13
14###########################################################
15# Keymaps for when we're in command mode (e.g., after hitting ESC)
16set keymap vi-command
17
18# Insert the arguments from the last command
19"p": "i !!*\r"
20
21# When hitting option-up/option-down, cycle through the previous commands
22# which start with the prefix you've entered, rather than just cycling through
23# the last entered commands.
24# In OS X's Terminal.app preferences, I have 'Use option as meta key' off, and
25# have mapped "option cursor up" to "\033\033[A" and "option cursor down" to 
26# "\033\033[B".
27# Feel free to bind to whatever you want. Delete the first '\e' in the keymap
28# to set plain up/down to do a history search by default.
29"\e\e[A": history-search-backward
30"\e\e[B": history-search-forward
31
32###########################################################
33# Keymaps for when we're in insert (i.e., typing stuff in) mode
34set keymap vi-insert
35
36# Pressing tab will list all completions & select the first one. Pressing it 
37# again will cycle through available completions.
38TAB: menu-complete
39# Shift-TAB cycles completions backward
40"\e[Z": menu-complete-backward
41
42# Option-up/option-down should also apply to insert mode
43"\e\e[A": history-search-backward
44"\e\e[B": history-search-forward
45
46# Needed because binding 'p' in command mode above wipes its insert mode
47# function, too. This fixes that, and will insert 'p' when you type 'p'.
48"p": self-insert

~/.inputrc を修正する

ほとんど、Use vi shortcuts in terminalの設定をコピーしていますが…

for vi modeの部分は、のちほど説明

 1# Use Vi, not Emacs, style editing
 2set editing-mode vi
 3
 4# Show all completions as soon as I press tab, even if there's more than one
 5set show-all-if-ambiguous on
 6# Ignore case
 7set completion-ignore-case on
 8# on menu-complete, first display the common prefix, then cycle through the 
 9# options when hitting TAB
10set menu-complete-display-prefix on
11
12###########################################################
13# Keymaps for when we're in command mode (e.g., after hitting ESC)
14set keymap vi-command
15
16###########################################################
17# Keymaps for when we're in insert (i.e., typing stuff in) mode
18set keymap vi-insert
19
20# Pressing tab will list all completions & select the first one. Pressing it 
21# again will cycle through available completions.
22TAB: menu-complete
23# Shift-TAB cycles completions backward
24"\e[Z": menu-complete-backward
25
26# for vi mode
27set show-mode-in-prompt on
28set vi-ins-mode-string \1\e[34;1m\2(ins) \1\e[0m\2
29set vi-cmd-mode-string \1\e[31;1m\2(cmd) \1\e[0m\2

せっかくなので ~/.bashrc のPS1も載せとく

色をちょこちょこ設定しようと思ったので、以下のように設定してる

バッドプラクティスかもしれないので、優しい方は突っ込んで頂けるとありがたいですm(_ _)m

 1#--------------------------------------------------
 2# ps1
 3#--------------------------------------------------
 4
 5function prompt {
 6  local GITPS='$(__git_ps1 " [%s]")'
 7  local BLUE="\[\e[1;34m\]"
 8  local RED="\[\e[1;31m\]"
 9  local GREEN="\[\e[2;32m\]"
10  local WHITE="\[\e[00m\]"
11  local GRAY="\[\e[1;37m\]"
12  PS1="$BLUE\w$BLUE$RED$GITPS$RED $WHITE\$$WHITE "
13}
14prompt

現在のモードがわからない問題

.inputrcを設定し、ターミナルを起動すれば、無事 Viモードになっているはず

この状態で、しばらく使っていたのですが、ターミナルに現在のモードが表示されていないため、現在のモードがinsなのかcmdなのか分からない問題が発生

ということで、ターミナルに現在のモードを表示するために、引き続きググる

ターミナルに現在のモードを表示する

以下の記事にたどり着いた

色々と見たが、おそらく GitHubREADME.mdを見るのが、わかりやすい

GitHubを見ると、Bashのバージョンが4.3.48以上が必要っぽい

現在使っているBashのバージョンを確認し、必要であれば、brewでインストールし、ログインシェルを変更する必要がある

Bashのバージョンの確認

まずは確認

1~ $ /bin/bash -version
2GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
3Copyright (C) 2007 Free Software Foundation, Inc.

brewでBashをインストールする

いつも通り、インストール

 1~ $ brew install bash
 2Updating Homebrew...
 3==> Auto-updated Homebrew!
 4Updated 3 taps (homebrew/cask-versions, homebrew/core and homebrew/cask).
 5==> Updated Formulae
 6asciidoctor ✔                 ccextractor                   ethereum                      grib-api                      openvdb                       source-to-image
 7harfbuzz ✔                    chruby-fish                   fluent-bit                    hebcal                        pacapt                        typescript
 8weechat ✔                     cpprestsdk                    fonttools                     ioping                        pdftoipe                      you-get
 9activemq                      dartsim                       git-archive-all               libjson-rpc-cpp               ppsspp
10ark                           dfmt                          glm                           liblo                         rdesktop
11bash-snippets                 django-completion             grails                        mongo-cxx-driver              selenium-server-standalone
12
13==> Downloading https://homebrew.bintray.com/bottles/bash-4.4.23.high_sierra.bottle.tar.gz
14######################################################################## 100.0%
15==> Pouring bash-4.4.23.high_sierra.bottle.tar.gz
16==> Caveats
17In order to use this build of bash as your login shell,
18it must be added to /etc/shells.
19==> Summary
20🍺  /usr/local/Cellar/bash/4.4.23: 146 files, 8.8MB

brewの出力にも書かれている通り/etc/shellsに追加する

1In order to use this build of bash as your login shell,
2it must be added to /etc/shells.

/etc/shells に追加する

現在のファイルを確認

 1~ $ sudo cat /etc/shells
 2# List of acceptable shells for chpass(1).
 3# Ftpd will not allow users to connect who are not using
 4# one of these shells.
 5
 6/bin/bash
 7/bin/csh
 8/bin/ksh
 9/bin/sh
10/bin/tcsh
11/bin/zsh

brewでインストールしたBashを追加

1~ $ sudo vim /etc/shells

修正後に、改めて確認

 1~ $ sudo cat /etc/shells
 2# List of acceptable shells for chpass(1).
 3# Ftpd will not allow users to connect who are not using
 4# one of these shells.
 5
 6/bin/bash
 7/bin/csh
 8/bin/ksh
 9/bin/sh
10/bin/tcsh
11/bin/zsh
12/usr/local/bin/bash

ログインシェルを変更する

変更する前に確認

1~ $ which bash
2/bin/bash

変更するためのコマンドを確認

1~ $ man chsh

一部抜粋

 1CHPASS(1)                 BSD General Commands Manual                CHPASS(1)
 2
 3NAME
 4     chpass, chfn, chsh -- add or change user database information
 5
 6SYNOPSIS
 7     chpass [-l location] [-u authname] [-s newshell] [user]
 8
 9DESCRIPTION
10     The chpass utility allows editing of the user database information associated with user or, by default, the current user.
11
12     The chpass utility cannot change the user's password on Open Directory systems.  Use the passwd(1) utility instead.
13
14     The chfn, and chsh utilities behave identically to chpass.  (There is only one program.)
15
16     The information is formatted and supplied to an editor for changes.
17
18     Only the information that the user is allowed to change is displayed.
19
20     The options are as follows:
21
22     -l location
23             If not specified, chpass will perform a search for the user record on all available Open Directory nodes.  When specified, chpass will edit the user record on the directory node at the given location.
24
25     -u authname
26             The user name to use when authenticating to the directory node containing the user.
27
28     -s newshell
29             Attempt to change the user's shell to newshell.
30
31     Possible display items are as follows:
32
33           Login:              user's login name
34           Uid:                user's login
35           Gid:                user's login group
36           Generated uid:      user's UUID
37           Full Name:          user's real name
38           Office Location:    user's office location
39           Office Phone:       user's office phone
40           Home Phone:         user's home phone
41           Home Directory:     user's home directory
42           Shell:              user's login shell

ということで、以下のコマンドを実行

1~ $ chsh -s /usr/local/bin/bash
2Changing shell for yourName.
3Password for yourName:

確認(reboot必要かも…)

1~ $ which bash
2/usr/local/bin/bash

改めてバージョンを確認する

確認

1~ $ bash --version
2GNU bash, version 4.4.23(1)-release (x86_64-apple-darwin17.5.0)
3Copyright (C) 2016 Free Software Foundation, Inc.
4License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
5
6This is free software; you are free to change and redistribute it.
7There is NO WARRANTY, to the extent permitted by law.

現在のモードが表示されるはず

これで現在のモードが表示されるはず

モードの表示を修正する

~/.inputrcを修正すればよい

このブログを見ている人には、説明不要だと思うので、各自で要調整

1# for vi mode
2set show-mode-in-prompt on
3set vi-ins-mode-string \1\e[34;1m\2(ins) \1\e[0m\2
4set vi-cmd-mode-string \1\e[31;1m\2(cmd) \1\e[0m\2

あとがき

いつも使うターミナルをViのキーバインドで操作できるようになって、本当に快適になった