インストール - Zsh

提供:MochiuWiki : SUSE, EC, PCB
2021年1月9日 (土) 15:04時点におけるWiki (トーク | 投稿記録)による版 (→‎Zshの設定例)
ナビゲーションに移動 検索に移動

概要

Zshはシェルの一種で、Linux等の標準シェルであるbashよりも便利な機能を持ったシェルである。

Linuxにてターミナルでコマンドを実行することが多々あるが、zshに切り替えることで、作業効率を上げることができる。

ここでは、Zshの最新版をインストールする方法を記載する。
なお、CentOSのパッケージ管理システムでは、最新のZshをインストール出来ないため、yumは使用しない。

最新のZshはこちらのWebサイトで確認できる。


Zshのインストール

CentOS

まず、CentOSでは、Zshのインストールするにはncurses-develが必要となるので、以下のコマンドを実行してインストールする。

sudo yum install ncurses-devel


次に、Zshの公式WebサイトまたはGitリポジトリから、Zshのソースコードをダウンロードする。

wget https://sourceforge.net/projects/zsh/files/zsh/<バージョン名>/zsh-<バージョン名>.tar.xz/download -O zsh-<バージョン名>.tar.xz
tar xvf zsh-<バージョン名>.tar.xz -C zsh-src
cd zsh-src
または
git clone --depth 1 git://git.code.sf.net/p/zsh/code zsh-src
cd zsh-src


続いて、Zshをインストールする。(ここでは、ホームディレクトリにインストールしている)
--enable-multibyteオプションは、マルチバイトを有効にするオプションである。

./configure --enable-multibyte --prefix=$HOME/zsh/zsh-<バージョン名>
make -j 8
make install


SUSE

CentOSと同様である。


Zshを利用可能にする

Zshを利用可能なシェル一覧に追加する。
ここに追加することで、chshコマンドでシェルの変更が可能となる。

sudo echo /<zshのインストールディレクトリ>/bin/zsh >> sudo /etc/shells


次に、ユーザのシェルを変更する。(コマンドを実行するとパスワードの入力が必要となる)

chsh -s /<zshのインストールディレクトリ>/bin/zsh


再度ログインするか再起動を行う。

すると、以下の文言が表示される。これは、Zshに設定ファイルが存在しないために表示される。
ここでは、 0を入力して空の設定ファイルを作成する。

This is the Z Shell configuration function for new users, zsh-newuser-install.
You are seeing this message because you have no zsh startup files(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory~).
This function can help you with a few settings that should make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
    That will prevent this function being run again.

(1)  Continue to the main menu.

--- Type one of the keys in parentheses ---



Zshの設定例

Zshの設定ファイルを作成した後、以下に示すような設定を記述する。

vi ~/.zshrc


# ~/.zshrcファイル

# Ctrl + Dでログアウトしてしまうことを防ぐ
setopt IGNOREEOF

# 既存のファイルをリダイレクトで上書きしない
setopt NOCLOBBER

# 日本語を使用
# export LANG=ja_JP.UTF-8

# パスを追加したい場合
# export PATH="$HOME/bin:$PATH"

# 色を使用
autoload -Uz colors
colors

# 自動補完を有効にする
# コマンドの引数やパス名を途中まで入力して <Tab> を押すといい感じに補完してくれる
# 例: `cd path/to/<Tab>`, `ls -<Tab>`
autoload -Uz compinit
compinit

# Emacs ライクな操作を有効にする(文字入力中に Ctrl-F,B でカーソル移動など)
# Vi ライクな操作が好みであれば `bindkey -v` とする
bindkey -e

# 他のターミナルとヒストリーを共有
setopt share_history

# ヒストリーに重複を表示しない
setopt HIST_IGNORE_ALL_DUPS

# 重複している行は無視する
setopt HIST_IGNORE_DUPS

# 履歴ファイルから空の行を削除する
setopt HIST_REDUCE_BLANKS

# 空白から始めたコマンドを無視
setopt HIST_IGNORE_SPACE

# historyコマンドとfcコマンドを履歴に追加しない
setopt HIST_NO_STORE

HISTFILE=~/.zsh_history
HISTSIZE=100
SAVEHIST=100

# 入力したコマンドが存在せず、かつディレクトリ名と一致するなら、ディレクトリに cd する
# 例: /usr/bin と入力すると /usr/bin ディレクトリに移動
setopt auto_cd

# cd した先のディレクトリをディレクトリスタックに追加する
# ディレクトリスタックとは今までに行ったディレクトリの履歴のこと
# `cd +<Tab>` でディレクトリの履歴が表示され、そこに移動できる
setopt auto_pushd

# pushdから重複を削除
setopt pushd_ignore_dups

# コマンドミスを修正
setopt correct

# グローバルエイリアス
alias -g cd=' cd -P'
alias -g rm='rm -iv'
alias -g cp='cp -i'
alias -g mv='mv -iv'
alias -g ls=' ls -hlvF --group-directories-first --color'
alias -g cat=' cat -n'
alias -g less=' less -n'
alias -g grep=' grep -i'
alias -g en=' LANG=C LANGUAGE=C LC_ALL=C'
alias -g jp='LANG=ja_JP.UTF-8'
alias -g mount='mount -o ro,noload'
alias -g umount='umount -fl'
alias -g nano='nano -lmS'
alias -g L='| less'
alias -g H='| head'
alias -g G='| grep'
alias -g GI='| grep -ri'
alias -g D='--detail'

# エイリアス
alias which=' which'
alias clear=' clear && echo -en "\e[3J"'
alias hclear=' echo -n > ~/.zsh_history && fc -p ~/.zsh_history'
alias igrep=' sudo zypper search -i'
alias repoclean=' sudo zypper clean -a'
alias skate='kdesu /usr/bin/kate'
alias scode='code --user-data-dir=$HOME/Program/VScode_root_project'
alias suse=' cat /etc/SUSE-brand'
alias upoweroff=' sudo systemctl poweroff'
alias ureboot=' sudo systemctl reboot'
alias startx=' startx'
alias exit=' exit'
alias startnm=' sudo systemctl stop wickedd wicked; sudo systemctl start NetworkManager'
alias startwicked=' sudo systemctl stop NetworkManager; sudo systemctl start wickedd wicked'

alias plasma=" killall plasmashell; plasmashell > /dev/null 2>&1 & disown"

alias sshpi='ssh <ユーザ名>@<ホスト名またはIPアドレス> -p <ポート番号> -i <暗号鍵ファイルのフルパス>'
alias sshsakura=' sshpass -p <パスワード> ssh <ユーザ名>@<ホスト名またはIPアドレス> -p <ポート番号>'

# FreeRDPをインストールしている場合
alias rwin10=' $HOME/InstallSoftware/FreeRDP/freerdp-nightly/bin/xfreerdp /u:<仮想マシンのユーザ名> /p:<パスワード> /w:1600 /h:900 +clipboard /sound:rate:44100,channel:2 /drive:<共有ディレクトリ名>,<共有ディレクトリのフルパス> /v:<仮想マシンのIPアドレス>'

# backspace,deleteキーを使えるように
stty erase ^H
bindkey "^[[3~" delete-char

# cdの後にlsを実行
chpwd()
{
   ls -hlFtr --color=auto
}

# どこからでも参照できるディレクトリパス
cdpath=(~)

# 区切り文字の設定
autoload -Uz select-word-style
select-word-style default
zstyle ':zle:*' word-chars "_-./;@"
zstyle ':zle:*' word-style unspecified

# Ctrl + sのロック, Ctrl + qのロック解除を無効にする
setopt no_flow_control

# プロンプトを2行で表示、時刻を表示
PROMPT="%(?.%{${fg[green]}%}.%{${fg[red]}%})%n${reset_color}@${fg[blue]}%m${reset_color}(%*%) %~%# "
# または
PROMPT="%(?.%{${fg[red]}%}.%{${fg[red]}%})%n${reset_color}@${fg[green]}%m${reset_color}(%*%)
> "

# <Tab> でパス名の補完候補を表示した後、続けて<Tab>を押すと候補からパス名を選択できるようになる
# 補完後、メニュー選択モードになり左右キーで移動が出来る
zstyle ':completion:*:default' menu select=2

# 補完で大文字にもマッチ
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

# Ctrl+rでヒストリーのインクリメンタルサーチ、Ctrl+sで逆順
bindkey '^r' history-incremental-pattern-search-backward
bindkey '^s' history-incremental-pattern-search-forward

# コマンドを途中まで入力後、historyから絞り込み
# 例 ls まで打ってCtrl+pでlsコマンドをさかのぼる、Ctrl+bで逆順
autoload -Uz history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^p" history-beginning-search-backward-end
bindkey "^b" history-beginning-search-forward-end

# cdrコマンドを有効 ログアウトしても有効なディレクトリ履歴
# cdr タブでリストを表示
autoload -Uz add-zsh-hook
autoload -Uz chpwd_recent_dirs cdr
add-zsh-hook chpwd chpwd_recent_dirs

# cdrコマンドで履歴にないディレクトリにも移動可能に
zstyle ":chpwd:*" recent-dirs-default true

# 複数ファイルのmv 例 zmv *.txt *.txt.bk
autoload -Uz zmv
alias zmv='noglob zmv -W'

# 改行のない出力をプロンプトで上書きするのを防ぐ
unsetopt promptcr

# mkdirとcdを同時実行
function mkcd()
{
   if [ "$#" -eq 0 ]; then
      echo "Too few arguments!"
   elif [ "$#" -eq 1 ]; then
      if [ -d $1 ]; then
         echo "$1 already exists!"
         cd $1
      else
         mkdir -p $1 && cd $1
      fi
   else
      echo "Too many arguments!"
   fi
}

# manコマンドの結果をfirefoxで閲覧
function manh()
{
   if [ "$#" -eq 0 ]; then
      echo "Too few arguments!"
   elif [ "$#" -eq "1" ]; then
      man --html=firefox $1 &
   else
      echo "Too many arguments!"
   fi
}

# KVMの起動
function startkvm
{
   KVM_STATUS=$(sudo systemctl status libvirtd | grep "Active:" | grep -ie "dead")
   if [ -n "KVM_STATUS" ]; then
      sudo systemctl start libvirtd
   fi

   NETWORK_STATUS=$(sudo virsh net-info default | grep -ie "起動中" -ie "Active" | grep -ie "no")
   if [ -n "$NETWORK_STATUS" ]; then
      sudo virsh net-start default
   fi
}

# KVMの停止
function stopkvm
{
   NETWORK_STATUS=$(sudo virsh net-info default | grep -ie "起動中" -ie "Active" | grep -ie "yes")
   if [ -n "$NETWORK_STATUS" ]; then
      sudo virsh net-destroy default
   fi

   KVM_STATUS=$(sudo systemctl status libvirtd | grep "Active:" | grep -ie "running")
   if [ -n "KVM_STATUS" ]; then
      sudo systemctl stop libvirtd libvirtd.socket libvirtd-admin.socket libvirtd-ro.socket
   fi
}

# カレントディレクトリに存在するディレクトリとファイルの検索
function lgrep()
{
   if [ "$#" -eq "1" ]; then
      for OBJECT in $(\ls -aA --group-directories-first | \grep -iE "${1}")
      do
         ls -AdhlF --color "${OBJECT}"
      done
     
      echo ""
   elif [ "$#" -eq "2" ]; then
      disable -f chpwd
     
      CURRENTDIR=$(pwd)
     
      cd ${1};
      for OBJECT in $(\ls -aA --group-directories-first | \grep -iE "${2}")
      do
         #(unset -f chpwd; cd ${1}; ls -AdhlF --color "${OBJECT}")
         ls -AdhlF --color "${OBJECT}"
      done
     
      cd ${CURRENTDIR}
     
      echo ""
     
      enable -f chpwd
   else
      echo "Specify Arguments."
   fi
  
   unset -v CURRENTDIR OBJECT
  
   return 0
}

# 環境変数PATHの設定
function SetPATH()
{
   BEFORE_HOME='$HOME'
   AFTER_HOME="$HOME"
   PATH_NAME=$(echo ${1//"$BEFORE_HOME"/"$AFTER_HOME"})
   
   SLASH=$(echo ${PATH_NAME: -1:1})
   if [ $SLASH = "/" ]; then
      LENGTH="${#PATH_NAME}"
      let LENGTH=$LENGTH-1
      PATH_NAME=$(echo ${PATH_NAME:0:$LENGTH})
   fi
   
   if [ ! -d $PATH_NAME ]; then
      echo "No Exist Directory $PATH_NAME"
      return 1
   fi
   
   EXIST_FLAG=0
   for VALUE in ${(s/:/)PATH}
   do
      if [ "$VALUE" = "$PATH_NAME" ]; then
         EXIST_FLAG=1
         break
      fi
   done
   
   if [ "$EXIST_FLAG" -eq 0 ]; then
      export PATH="$PATH_NAME:$PATH"
   elif [ $EXIST_FLAG -eq 1 ]; then
      echo "Already Exist $PATH_NAME in PATH " 1>&2
   fi
   
   unset -v SLASH LENGTH BEFORE_HOME AFTER_HOME PATH_NAME EXIST_FLAG VALUE
   
   return 0
}

function SetLIBRARY()
{
   BEFORE_HOME='$HOME'
   AFTER_HOME="$HOME"
   PATH_NAME=$(echo ${1//"$BEFORE_HOME"/"$AFTER_HOME"})
   
   SLASH=$(echo ${PATH_NAME: -1:1})
   if [ $SLASH = "/" ]; then
       LENGTH="${#PATH_NAME}"
       let LENGTH=$LENGTH-1
       PATH_NAME=$(echo ${PATH_NAME:0:$LENGTH})
   fi
   
   if [ ! -d $PATH_NAME ]; then
       echo "No Exist Directory $PATH_NAME"
       return 1
   fi
   
   EXIST_FLAG=0
   for VALUE in ${(s/:/)LD_LIBRARY_PATH}
   do
       if [ "$VALUE" = "$PATH_NAME" ]; then
           EXIST_FLAG=1
           break
       fi
   done
   
   if [ $EXIST_FLAG -eq 0 ]; then
       export LD_LIBRARY_PATH="$PATH_NAME:$LD_LIBRARY_PATH"
   elif [ $EXIST_FLAG -eq 1 ]; then
       echo "Already Exist $PATH_NAME in LD_LIBRARY_PATH " 1>&2
   fi
   
   unset -v SLASH LENGTH BEFORE_HOME AFTER_HOME PATH_NAME EXIST_FLAG VALUE
   
   return 0
}
 
# git設定
RPROMPT="%{${fg[blue]}%}[%~]%{${reset_color}%}"
autoload -Uz vcs_info
setopt prompt_subst
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{yellow}!"
zstyle ':vcs_info:git:*' unstagedstr "%F{red}+"
zstyle ':vcs_info:*' formats "%F{green}%c%u[%b]%f"
zstyle ':vcs_info:*' actionformats '[%b|%a]'
precmd () { vcs_info }
RPROMPT=$RPROMPT'${vcs_info_msg_0_}'