そういえば、一からvimrc、zshrcを作成しました。ついでにvimium。(ShanonAdventCalendar2017・19日目)

このエントリーをはてなブックマークに追加

はじめに

初心者エンジニアもどきのshiです。

未経験入社後、最初の外部研修でvimをご教示頂いてからvimmerに。
デフォルトで使っていたのですが、色々使いづらかったので設定しようと一念発起。
ついでに、シェルも色々見てみようと思っていたら、zshが良さそうだと。
(隣の先輩が使っていたので調べてみました)

一念発起直後は、フレームワークのoh-my-zsh使っていたんですが、自分にとって不要な機能があったり(何か忘れた)したので、イチから作ることに。


備忘録としても兼ねていますが、詳細な説明はしていません。
私がそうだったのですが、「何が◯◯で、これがXXで」と書かれていても最初はわからないことだらけでした。
ただ、丸コピーできそうな例(機能が多すぎない、少なすぎない)があって、そのコマンド一つ一つに説明があったらなと思っていたので、今回はそんな記事を目指しています。


注意

・初心者エンジニアもどき記載のため間違い含む可能性があります。
・色々なサイトから取ってきて、調べて行末にコメントを記載していますので参考になればと思います。
・色々なサイト様からを参考にさせていただいております。
※ 半年前以上に作成しており、全ての参考サイトを記載できていない可能性があります。


上記、了承いただけましたら、もうしばしお付き合いください。


のぞんだこと

・目に優しい色 & わかりやすいこと
・記憶力が著しく低い自分が使いやすいように(履歴補完)
・レスポンスが早いこと(開くのに1秒かかるとか嫌だ)
 ※ 測っているわけではないです。
・(vim)画面分割を想定
・(vim)vimらしさを残しつつ、エディタ感出していく


作ったやつは、コレ(センスが無いとか言わないで)

zshrc

# .zshrc


# alias 系
alias less='less -i -N'

# alias (履歴に残さない)
alias man=' man'
alias ls=' ls -al --color=auto'
alias cd=' cd'



# 宣言系
autoload -Uz colors; colors # black red green yellow blue magenta cyan white

bindkey -v # キーバインドをviモードに設定



# 色の定義
local C_GREEN=$'%{\e[38;5;2m%}'     # 2
local C_BULE=$'%{\e[38;5;111m%}'    # 111
local C_MAGENTA=$'%{\e[38;5;177m%}' # 177
local C_GRAY=$'%{\e[38;5;242m%}'    # 242
local C_BG_GRAY=$'%{\e[48;5;234m%}' # マーカー 234
local C_RESET=$'%{\e[0m%}'          # 色の適応範囲を終了



# 補完機能関係
autoload -Uz compinit promptinit; compinit          # 補完を有効にする
zstyle ':completion::complete:*' use-cache true     # キャッシュを使用する
zstyle ':completion:*' cache-path ~/.zsh/cache      # キャッシュパス
zstyle ':completion:*:default' menu select=1
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # 大文字、小文字を区別せず補完する

zstyle ':completion:*' list-colors "${LS_COLORS}"                                 # 補完でカラーを使用する
zstyle ':completion:*:*:kill:*:processes' list-colors '=(# b) # ([%0-9]# )*=0=01;31' # kill の候補にも色付き表示

zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin # コマンドにsudoを付けても補完

zmodload zsh/complist # 補完候補のメニュー選択で、矢印キーの代わりにhjklで移動出来るようにする。
bindkey -M menuselect 'h' vi-backward-char # 左
bindkey -M menuselect 'j' vi-down-line-or-history # 下
bindkey -M menuselect 'k' vi-up-line-or-history # 上
bindkey -M menuselect 'l' vi-forward-char # 右

LISTMAX=1000 # 補完リストが多いときに尋ねない

setopt ALWAYS_LAST_PROMPT   # 補完候補など表示する時はその場に表示し、終了時に画面から消す
setopt AUTO_LIST            # 曖昧な補完で、自動的に選択肢をリストアップ
setopt AUTO_MENU            # タブキーの連打で自動的にメニュー補完
setopt AUTO_PARAM_KEYS      # 変数名を補完する
setopt AUTO_PARAM_SLASH     # ディレクトリ名を補完すると、末尾がスラッシュになる。
setopt NO_AUTO_REMOVE_SLASH # 補完が/で終わり、語分割子か/かコマンドの後(;とか&)の場合、補完末尾の/を取る
setopt NO_COMPLETE_ALIASES  # aliasを展開して補完
setopt COMPLETE_IN_WORD     # 語の途中でもカーソル位置で補完
setopt HIST_EXPAND          # 補完時にヒストリを自動的に展開する
setopt LIST_TYPES           # 補完対象のファイルの末尾に識別マークをつける
setopt LIST_PACKED          # 補完候補を詰めて表示
setopt MAGIC_EQUAL_SUBST    # =以降でも補完できるようにする
setopt PRINT_EIGHT_BIT      # 補完候補リストの日本語を正しく表示



# 履歴関係
HISTFILE=$HOME/.zsh_history # 履歴ファイルの定義
SAVEHIST=1000000            # 履歴ファイルのサイズ
HISTSIZE=1000000            # メモリに載せる履歴のサイズ
PATH=${PATH}:~/bin

HISTTIMEFORMAT="[%Y/%M/%D %H:%M:%S] " # ヒストリの一覧を読みやすい形に変更

setopt APPEND_HISTORY         # ヒストリファイルを上書きするのではなく、追加するようにする
setopt EXTENDED_HISTORY       # ヒストリに時刻情報もつける
setopt HIST_EXPIRE_DUPS_FIRST # 履歴がいっぱいの時は最も古いものを先ず削除
setopt HIST_FIND_NO_DUPS      # 履歴検索中、(連続してなくとも)重複を飛ばす
setopt HIST_IGNORE_ALL_DUPS   # 履歴中の重複行をファイル記録前に無くす
setopt HIST_IGNORE_DUPS       # 前と重複する行は記録しない
setopt HIST_IGNORE_SPACE      # 行頭がスペースのコマンドは記録しない
setopt HIST_NO_FUNCTIONS      # ヒストリリストから関数定義を除く
setopt HIST_NO_STORE          # histroyコマンドは記録しない
setopt HIST_REDUCE_BLANKS     # 余分な空白は詰めて記録
setopt HIST_SAVE_NO_DUPS      # 古いコマンドと同じものは無視
setopt INC_APPEND_HISTORY     # 履歴をインクリメンタルに追加
setopt SHARE_HISTORY          # 履歴を共有


# 履歴補完
bindkey '^k' history-beginning-search-backward
bindkey '^j' history-beginning-search-forward

function command_not_found_handler() {
    echo "zsh: command not found: $1"
    sed -i -e '$d' ~/.zsh_history
}



# 未処理
WORDCHARS="$WORDCHARS|:" # "|,:"を単語の一部とみなさない

setopt AUTO_CD # /foo/barでいきなりcd
setopt AUTO_NAME_DIRS # "~$var" でディレクトリにアクセス
setopt AUTO_RESUME # サスペンド中のプロセスと同じコマンド名を実行した場合はリジュームする
setopt RM_STAR_SILENT  # rm * などの際確認しない
setopt MARK_DIRS # ファイル名の展開でディレクトリにマッチした場合末尾に / を付加する
setopt NO_RM_STAR_WAIT # rm *で確認
setopt SUN_KEYBOARD_HACK # 行の末尾がバッククォートでも無視する
setopt EXTENDED_GLOB # ~hoge以外にマッチする機能を使わない
setopt NO_BEEP # BEEPを鳴らさない
setopt SH_WORD_SPLIT # クォートされていない変数拡張が行われたあとで、フィールド分割
setopt ALL_EXPORT # 定義された全ての変数は自動的にexportする
setopt AUTO_PUSHD # 普通のcdでもスタックに入れる
setopt NO_GLOB_DOTS # "*" にドットファイルをマッチ
setopt PUSHD_IGNORE_DUPS # ディレクトリスタックに、同じディレクトリを入れない
setopt NO_IGNORE_EOF # ^Dでログアウトしないようにする
setopt NOTIFY # ジョブの状態をただちに知らせる
setopt MULTIOS # 複数のリダイレクトやパイプに対応
setopt NUMERIC_GLOB_SORT # ファイル名を数値的にソート
setopt CLOBBER # リダイレクトで上書き禁止
setopt NO_PRINT_EXIT_VALUE # 戻り値が0以外の場合終了コードを表示
setopt BRACE_CCL # echo {a-z}などを使えるようにする
setopt HISTVERIFY # !!などを実行する前に確認する
setopt NO_CHECK_JOBS # ジョブがあっても黙って終了する
setopt NO_HIST_VERIFY # 実行するまえに必ず展開結果を確認できるようにする
setopt NO_PROMPTCR # 改行コードで終らない出力もちゃんと出力する
setopt SHORT_LOOPS # loop の短縮形を許す
setopt NO_XTRACE # コマンドラインがどのように展開され実行されたかを表示する
setopt NO_AUTOREMOVESLASH # ディレクトリの最後のスラッシュを自動で削除
setopt NO_CHASE_LINKS # シンボリックリンクは実体を追うようになる
setopt FUNCTION_ARGZERO # $0 にスクリプト名/シェル関数名を格納
setopt NO_FLOW_CONTROL # Ctrl+S/Ctrl+Q によるフロー制御を使わないようにする
setopt INTERACTIVE_COMMENTS # コマンドラインでも # 以降をコメントと見なす
setopt NO_SINGLE_LINE_ZLE # デフォルトの複数行コマンドライン編集ではなく、1行編集モードになる
setopt NOTIFY # バックグラウンドジョブが終了したらすぐに知らせる。
setopt TRANSIENT_RPROMPT


# エディタ
export EDITOR='vim' # nanoからvimに変更
export VISUAL='vim' # nanoからvimに変更
export PAGER='less'


# Git系
autoload -Uz vcs_info # VCSの情報を取得するzsh関数
zstyle ':vcs_info:git:*' check-for-changes true     # formats 設定項目で %c,%u が使用可
zstyle ':vcs_info:git:*' stagedstr "%F{green}!"     # commit されていないファイルがある
zstyle ':vcs_info:git:*' unstagedstr "%F{magenta}+" # add されていないファイルがある
zstyle ':vcs_info:*' formats "%F{cyan}%c%u(%b)%f"   # 通常
zstyle ':vcs_info:*' actionformats '[%b|%a]'        # rebase 途中,merge コンフリクト等 formats 外の表示

# %b ブランチ情報
# %a アクション名(mergeなど)
# %c changes
# %u uncommit



# プロンプト系
setopt PROMPT_SUBST # プロンプト文字列で各種展開を行なう
precmd () { vcs_info } # プロンプト表示直前に vcs_info 呼び出し

PROMPT='


${C_BG_GRAY}${C_GRAY}[%D %*] %M${C_RESET}
${C_BULE}%~${C_RESET} ${vcs_info_msg_0_}
${C_BULE}%# ${C_MAGENTA}>${C_RESET} ' # 3行の改行を含めている

ポイント
・改行を含むprompt(個人的には、色頑張った。)
・vimっぽいコマンド(ctrl+j or ctrl+k)での履歴補完
・いい感じの履歴にする(重複なし、スペースの重複を処理、zshのシェルにないコマンドは履歴に残さない)
・未処理との記載分は、調べてないです。

色合いの参考にしたものは下記、 pure.zsh なるもの。
※ pure.zshは、外見の参考にしただけで内容は見ていないので、詳細はわかりません。
画像の参考:https://suin.io/565

vimrc

" .vimrc

" 設定系
set fenc=utf-8                " 文字コードをUFT-8に設定
set nobackup                  " バックアップファイルを作らない
set noswapfile                " スワップファイルを作らない
set autoread                  " 編集中のファイルが変更されたら自動で読み直す
set hidden                    " バッファが編集中でもその他のファイルを開けるように
set whichwrap=b,s,h,l,<,>,[,] " 左右のカーソル移動で行間移動可能にする
set wildignorecase            " 大文字小文字を無視
set wildmode=list,full        " 完全補完モードに入る



" key設定系
nmap  :nohlsearch

" 履歴補完
cnoremap  
cnoremap  

nnoremap H 20h " 左へ20移動
nnoremap J 20j " 下へ20移動
nnoremap K 20k " 上へ20移動
nnoremap L 20l " 右へ20移動

nnoremap s 
nnoremap sh h " 左windowへ移動
nnoremap sj j " 下windowへ移動
nnoremap sk k " 上windowへ移動
nnoremap sl l " 右windowへ移動
nnoremap sH H " 左へwindowを移動
nnoremap sJ J " 下へwindowを移動
nnoremap sK K " 上へwindowを移動
nnoremap sL L " 右へwindowを移動
nnoremap s= = " 幅を当分
nnoremap s+ + " 高さ+1
nnoremap s- - " 高さ-1




" 見た目系
syntax on           " syntaxハイライトをonにする
set t_Co=256        " 256色表示
colorscheme iceberg " スキーマ
set number          " 行番号の表示
set cursorline      " 現在の行を強調表示
set smartindent     " インデントはスマートインデント
set showmatch       " 括弧入力時の対応する括弧を表示
set laststatus=2    " ステータスラインを常に表示
set showcmd         " 入力中のコマンドをステータスに表示する


" 全角スペース、末尾の半角スペース、タブを視覚化
if has("syntax")
    syntax on
    function! ActivateInvisibleIndicator()
        syntax match InvisibleJISX0208Space " " display containedin=ALL
        highlight InvisibleJISX0208Space term=underline ctermbg=Red
        syntax match InvisibleTrailedSpace "[ ]\+$" display containedin=ALL
        highlight InvisibleTrailedSpace term=underline ctermbg=Red
        syntax match InvisibleTab "\t" display containedin=ALL
        highlight InvisibleTab term=underline ctermbg=Red
    endf

    augroup invisible
        autocmd! invisible
        autocmd BufNew,BufRead * call ActivateInvisibleIndicator()
    augroup END
endif



" Tab,space 系
set list listchars=tab:\\-          " 不可視文字を可視化(タブが「-」と表示される)
set expandtab                       " Tab文字を半角スペースにする
set tabstop=4                       " 行頭以外のTab文字の表示幅(スペースいくつ分)
set shiftwidth=4                    " 行頭でのTab文字の表示幅
autocmd BufWritePre * :%s/\s\+$//ge " 保存時、行末スペースの自動削除



" 検索系
set ignorecase " 検索文字列が小文字の場合は大文字小文字を区別なく検索する
set smartcase " 検索文字列に大文字が含まれている場合は区別して検索する
set incsearch " 検索文字列入力時に順次対象文字列にヒットさせる
set wrapscan " 検索時に最後まで行ったら最初に戻る
set hlsearch " 検索語をハイライト表示
ポイント
・検索系
・見落とし対策系
・補完、履歴補完

vimのカラースキームは下記になります。
URL: http://cocopon.github.io/iceberg.vim/

以上になります。
最初は、コピペで使うと思いますが、説明がないものだったり、多すぎたりするので少なめで説明を書いたものとして、いかがでしょうか。


おまけ(vimium)

これに合わせて、vimiumというchromeの拡張機能を使っているので
chromeでも、まるでvim!(嘘です。)
https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb
そこでもカスタマイズしているので、ついでにどうぞ。

map h goBack
map l goForward
map sh previousTab
map sl nextTab
map H previousTab
map L nextTab
map i LinkHints.activateMode
map I LinkHints.activateModeToOpenInNewTab




その他参考サイトさま一覧
https://qiita.com/reireias/items/60ee9934fb1f5d94f125
https://qiita.com/Hi-king/items/07b6f228b4980122fd96
https://qiita.com/kotashiratsuka/items/ae37757aa1d31d1d4f4d
http://ama-ch.hatenablog.com/entry/20090109/1231526834
https://qiita.com/tkengo/items/cd7d9d56de1b2088dc4c
https://qiita.com/mfujimori/items/9fd41bcd8d1ce9170301


次の記事
« Prev Post
前の記事
Next Post »
Related Posts Plugin for WordPress, Blogger...