memo.xight.org

日々のメモ

カテゴリ : zsh

1ページ目 / 全2ページ

cdrの利用とメンテナンス

Summary

zsh の組み込みコマンド cdr は cd の履歴を保存してくれる。
存在しないディレクトリも履歴に残ったままになってしまうので、自動でメンテナンスをさせたい。

autoload -Uz is-at-least
if is-at-least 4.3.11
then
	# cdr, add-zsh-hook を有効にする
	autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
	add-zsh-hook chpwd chpwd_recent_dirs
	add-zsh-hook chpwd my_compact_chpwd_recent_dirs
	 
	# cdr の設定
	zstyle ':completion:*' recent-dirs-insert both
	zstyle ':chpwd:*' recent-dirs-max 5000
	zstyle ':chpwd:*' recent-dirs-default true
	zstyle ':chpwd:*' recent-dirs-file "$HOME/.cache/shell/chpwd-recent-dirs"
	zstyle ':chpwd:*' recent-dirs-pushd true
	
	function my_compact_chpwd_recent_dirs() {
		emulate -L zsh
		setopt extendedglob
		local -aU reply
		integer history_size
		autoload -Uz chpwd_recent_filehandler
		chpwd_recent_filehandler
		history_size=$#reply
		reply=(${^reply}(N))
		(( $history_size == $#reply )) || chpwd_recent_filehandler $reply
	}
fi

pecoと連携

function peco-cdr () {
	local selected_dir=$(cdr -l | awk '{ print $2 }' | peco)
	if [ -n "$selected_dir" ]; then
		BUFFER="cd ${selected_dir}"
		zle accept-line
	fi
	zle clear-screen
}
zle -N peco-cdr
bindkey '^[xcd' peco-cdr # M-x cdに割り当て

Reference

DevAchive - 2014-09-22 - cdr: 開いたディレクトリの履歴からディレクトリを開く
http://wada811.blogspot.com/2014/09/zsh-cdr.html

@znz blog - 2014-07-25 - zshの機能のみで既に存在しないディレクトリをcdrのリストから削除する
http://blog.n-z.jp/blog/2014-07-25-compact-chpwd-recent-dirs.html

zsh で homebrew の補完

Summary

zsh で homebrew の補完をしたい。
/usr/local/Library/Contributions/brew_zsh_completion.zsh が補完ファイルなので、
/usr/local/share/zsh/site-functions にシンボリックリンクを設定すれば良い。

以下を実行

$ cd /usr/local/share/zsh/site-functions
$ ln -s ../../../Library/Contributions/brew_zsh_completion.zsh _brew

Reference

よんちゅBlog - 2012-04-15 - zshでHomebrewを使用する場合に設定しておいたほうが良いこと
http://yonchu.hatenablog.com/entry/20120415/1334506855

oh-my-zsh + zsh-completions

Summary

oh-my-zsh と zsh-completions[2013-09-05-1] を組み合わせて使っている。
$HOME/.zcompdump と $HOME/.zcompdump-HOSTNAME-5.0.2 の
2つの補完用のファイルが作成されてしまっていた。

原因は、 oh-my-zsh.sh 内と、自前の .oh-my-zsh/custom/XXX.zsh 内とで、
compinit を2回呼び出しているため。

oh-my-zsh.sh 内で compinit が呼び出す前に、
fpath を設定すれば良い。

$HOME/.zshrc

if [[ -d /usr/local/share/zsh-completions ]]; then
	fpath=($fpath /usr/local/share/zsh-completions)
fi

source $ZSH/oh-my-zsh.sh

Reference

robbyrussell/oh-my-zsh
https://github.com/robbyrussell/oh-my-zsh

zsh-syntax-highlighting の導入

Install

brew install zsh-syntax-highlighting

.zshrc

if [[ -r /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ]]; then
	source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
fi

zsh-completions - zsh で補完を追加

Summary

vagrant を使うようになったので、zshの補完を強化したい。
zsh-completions を使うことで、補完を強化する。

zsh-completions のダウンロード (git)

mkdir ~/.zsh
cd ~/.zsh
git clone git://github.com/zsh-users/zsh-completions.git

.zshrc (git)

if [[ -d $HOME/.zsh/zsh-completions/src ]]; then
	fpath=($HOME/.zsh/zsh-completions/src $fpath)
fi
autoload -Uz compinit
compinit -u


Install (homebrew)

brew install zsh-completions

.zshrc (homebrew)

if [[ -d /usr/local/share/zsh-completions ]; then
	fpath=(/usr/local/share/zsh-completions $fpath)
fi
autoload -Uz compinit
compinit -u

rebuild 'zcompdump'

rm -f ~/.zcompdump
compinit

Reference

GitHub - zsh-users/zsh-completions
https://github.com/zsh-users/zsh-completions

tmux上でssh, mosh接続したときに新しいウィンドウを生成する

.zshrc

if [[ -x /usr/local/bin/mosh || -x /usr/bin/mosh ]]; then
	function _mosh_tmux() {
		tmux new-window -n $@ "exec mosh $@"
	}
	compdef mosh=ssh
	compdef _mosh_tmux=ssh
	
	alias ssh="_mosh_tmux"
	alias mosh="_mosh_tmux"
fi

Reference

Tmux上でmosh接続したときに新しいウィンドウを生成する
http://blog.glidenote.com/blog/2012/04/11/mosh-with-tmux/

zshでヒストリ補完とヒストリのインクリメンタルサーチ

Summary

ヒストリ補完 (backward) Ctrl+P
ヒストリ補完 (forward) Ctrl+N
ヒストリのインクリメンタルサーチ Ctrl+R

bindkey '^P' history-beginning-search-backward
bindkey '^N' history-beginning-search-forward
bindkey '^R' history-incremental-search-backward


Reference

cooldaemonの備忘録 - bindkey -v で bck-i-search を使う
http://d.hatena.ne.jp/cooldaemon/20060925/1159156394

cooldaemonの備忘録 - 設定ファイルさらし
http://d.hatena.ne.jp/cooldaemon/20060206/1139200968

zed - ZLE Editorを使って開発されたエディタ

Reference

技術メモ帳 - zshで出来ている新感覚エディタzed
http://d.hatena.ne.jp/lurker/20061129/1164809805

Reference

[を] Windows でエクスプローラの履歴を見る
http://chalow.net/2006-11-29-2.html

xe-kdoo - 2005-07-12 - [Windows] 実行したプログラムの履歴(?)
http://yowaken.dip.jp/tdiary/20050712.html#p01

Wikipedia - ROT13

zsh + screen で端末に表示されてる文字列を補完する

Summary

.zshrc に以下を記述.(2nd lifeより)
Ctrl + o で端末上の文字列を補完可能.

# dabbrev
HARDCOPYFILE=$HOME/tmp/screen-hardcopy
touch $HARDCOPYFILE

dabbrev-complete () {
	local reply lines=80 # 80行分
	screen -X eval "hardcopy -h $HARDCOPYFILE"
	reply=($(sed '/^$/d' $HARDCOPYFILE | sed '$ d' | tail -$lines))
	compadd - "${reply[@]%[*/=@|]}"
}

zle -C dabbrev-complete menu-complete dabbrev-complete
bindkey '^o' dabbrev-complete
bindkey '^o^_' reverse-menu-complete

Reference

2nd life - zsh + screen で端末に表示されてる文字列を補完する
http://d.hatena.ne.jp/secondlife/20060108/1136650653

.zshrc のコンパイル

Summary

zsh のシェルスクリプトは zcompile コマンドでコンパイルすることが可能.

.zshrc から .zshrc.zwc ファイルの生成

zcompile .zshrc


注意

同一ディレクトリに .zwc ファイルがある場合 zsh は .zshrc.zwc を実行する.
.zshrc を変更するたびに,zcompile を実行する必要がある.

Reference

zshのある暮らし - FAQ@zshスレ - 設定ファイルの読み込みが遅い
http://hiki.ex-machina.jp/zsh/?FAQ%40zsh%A5%B9%A5%EC#l16

補完関数の表示を過剰にする

補完にファイル名だけでなくコマンドラインオプションも追加する

autoload -U compinit
compinit

.zshrcに以下を追加

zstyle ':completion:*' verbose yes
zstyle ':completion:*:descriptions' format '%B%d%b'
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*:warnings' format 'No matches for: %d'
zstyle ':completion:*' group-name ''

Reference

  zsh補完変数の書き方
  http://www.ayu.ics.keio.ac.jp/members/mukai/tips/zshoption.html

.zshrc

書く順番

  基本設定
  環境変数
  非端末プロセスなら終了
  プロンプト
  シェル変数
  エイリアス
  キーバインド
  補完ルール

非端末プロセスなら終了

[ $#PROMPT -eq 0 -o $#TERM -eq 0 ] && return

- Reference
  紹介マニアMoinMoin - Zshrc
  http://sakito.s2.xrea.com/moin/moin.cgi/Zshrc