LoginSignup
13
12

More than 5 years have passed since last update.

親ディレクトリへ「cd ..」をShift + Upでキーバインド

Last updated at Posted at 2016-07-29

Finder(Mac OS)なら「Cmd + Up」、Explorer(Windows OS)なら「Alt + Up」で親ディレクトリへ移動ができる。端末でも同じようなことができたらと思い「Shift + Up」を設定してみたら、意外と使えたので紹介

環境

名前 バージョン
OS OS X El Capitan 10.11.6
端末 iTerm2 3.0.5
シェル zsh 5.2

設定

~/.zshrcに以下内容を追加

# hook関数precmd実行
__call_precmds() {
  type precmd > /dev/null 2>&1 && precmd
  for __pre_func in $precmd_functions; do $__pre_func; done
}

#shift+upで親ディレクトリへ
__cd_up()   { builtin cd ..; echo "\r\n"; __call_precmds; zle reset-prompt }
zle -N __cd_up;   bindkey '^[[1;2A' __cd_up

※上記の^[^ + [ でなく「Esc」

試行錯誤

上記設定内容にいたるまで

1.最初に

まずは何も考えず、zshのキーバインド設定のお約束な書き方で記載

参考:
 ・よく実行するコマンドにキーバインドを割り当てると捗る話
 ・zle:bindkeys[ZshWiki]

__cd_up() { cd ..; zle reset-prompt }
zle -N __cd_up;   bindkey '^[[1;2A' __cd_up

そしたら、cdの拡張プラグインenhancdが動いてエラーが、、

awk: i/o error occurred while closing /dev/stdin
 source line number 16
awk: i/o error occurred while closing /dev/stdin

設定していたことをすっかり忘れていた。。。

2.余計な処理が入らないように

素のcdが動くようにbuiltinを追加

__cd_up() { builtin cd ..; zle reset-prompt }
zle -N __cd_up;   bindkey '^[[1;2A' __cd_up

参考:
$ man shから

builtin shell-builtin [arguments]
Execute the specified shell builtin, passing it arguments, and return its exit
status. This is useful when defining a function whose name is the same as a
shell builtin, retaining the functionality of the builtin within the function.
The cd builtin is commonly redefined this way. The return status is false if
shell-builtin is not a shell builtin command.

しかし、改行してくれない

# Shift + Upを押下
[2016-07-29 15:28] ~/workspace -> [2016-07-29 15:28] ~
%

こうなってほしい

# Shift + Upを押下
[2016-07-29 15:28] ~/workspace
%
[2016-07-29 15:28] ~
%

3.改行を入れる

何も考えずにecho "\r\n" 入れてみた

__cd_up() { builtin cd ..; echo "\r\n"; zle reset-prompt }
zle -N __cd_up;   bindkey '^[[1;2A' __cd_up

思った通り、動いた。
が、右プロンプトに表示するgit情報が変化しない

[2016-07-29 16:24] ~/workspace/study
% cd dotfile
[2016-07-29 16:24] ~/workspace/study/dotfiles
%                                                            (git)-[master]
[2016-07-29 16:24] ~/workspace/study
%                                                            (git)-[master]

4.原因の調査

右プロンプトはhook関数によって描画を変更しているらしい
※該当の設定はコピペなので、気付かなかった
参考:
zshでhook関数を登録する
zshのターミナルにリポジトリの情報を表示してみる

~/.zshrcにて

########################################
# vcs_info
autoload -Uz vcs_info
autoload -Uz add-zsh-hook

zstyle ':vcs_info:*' formats '%F{green}(%s)-[%b]%f'
zstyle ':vcs_info:*' actionformats '%F{red}(%s)-[%b|%a]%f'

_update_vcs_info_msg() {
    RPROMPT="${vcs_info_msg_0_}"
}
add-zsh-hook precmd _update_vcs_info_msg

hook関数を全く考慮していなかったことに気づく

5.hook関数実行処理追加して完成

参考:
 precmdを明示的に呼ぶ方法

# hook関数precmd実行
__call_precmds() {
  type precmd > /dev/null 2>&1 && precmd
  for __pre_func in $precmd_functions; do $__pre_func; done
}

#shift+upで親ディレクトリへ
__cd_up()   { builtin cd ..; echo "\r\n"; __call_precmds; zle reset-prompt }
zle -N __cd_up;   bindkey '^[[1;2A' __cd_up

うまく動いた

おまけ:「戻る」を可能に(cdからpushdに変更)

Finder(Mac OS)なら「Cmd + [」、Explorer(Windows OS)なら「Alt + Left」で前のディレクトリへ移動できる。
pushdを使用すれば、同じようなことができるのではと思いつき変更
ついでに「Shift + Down」でpopd実行する処理を追加

参考:
 ディレクトリの移動は cd コマンドよりも pushd コマンドのほうが便利!
 

# hook関数precmd実行
__call_precmds() {
  type precmd > /dev/null 2>&1 && precmd
  for __pre_func in $precmd_functions; do $__pre_func; done
}

#shift+upで親ディレクトリへ
#shift+downで戻る
__cd_up()   { builtin pushd ..; echo; __call_precmds; zle reset-prompt }
__cd_undo() { builtin popd;     echo; __call_precmds; zle reset-prompt }
zle -N __cd_up;   bindkey '^[[1;2A' __cd_up
zle -N __cd_undo; bindkey '^[[1;2B' __cd_undo

pushdを実行するとディレクトリスタックを表示し、改行するのでecho "\r\n"; -> echo;に変更

使ってみての感想

 上記のキーバインド設定を追加してから、実はそれほど便利には感じていなかったのですがキーバインド未設定の端末を操作することで無意識に
「Shift + Up」
を押していたことに気づきました
 よく考えると「cd ..」は「c + d + Space + . + . + Enter」と6回キーを押す必要があります。
やや雑に考えれば、キーバインドしておくことで速さは単純に6倍向上することになります。さらに「cd ..」はどちらかといえば、使用頻度が高いコマンドです。

実際は思った以上に役立っていたようです。

13
12
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
13
12