diff --git a/README.md b/README.md index d076cc89..24445cb5 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Installation ------------ Prezto will work with any recent release of Zsh, but the minimum recommended -version is 4.3.10. +version is 4.3.11. 1. Launch Zsh: @@ -36,9 +36,16 @@ version is 4.3.10. ### Troubleshooting If you are not able to find certain commands after switching to *Prezto*, -modify the `PATH` variable in *~/.zshenv* then open a new Zsh terminal +modify the `PATH` variable in *~/.zprofile* then open a new Zsh terminal window or tab. +Updating +-------- + +Pull the latest changes and update submodules. + + git pull && git submodule update --init --recursive + Usage ----- @@ -78,7 +85,8 @@ License (The MIT License) -Copyright (c) 2009-2012 Robby Russell, Sorin Ionescu, and contributors. +Copyright (c) 2009-2011 Robby Russell and contributors. +Copyright (c) 2011-2014 Sorin Ionescu and contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/init.zsh b/init.zsh index fc12297c..75adfe51 100644 --- a/init.zsh +++ b/init.zsh @@ -10,7 +10,7 @@ # # Check for the minimum supported version. -min_zsh_version='4.3.10' +min_zsh_version='4.3.11' if ! autoload -Uz is-at-least || ! is-at-least "$min_zsh_version"; then print "prezto: old shell detected, minimum required: $min_zsh_version" >&2 return 1 @@ -25,7 +25,7 @@ unset min_zsh_version function pmodload { local -a pmodules local pmodule - local pfunction_glob='^([_.]*|prompt_*_setup|README*)(.N:t)' + local pfunction_glob='^([_.]*|prompt_*_setup|README*)(-.N:t)' # $argv is overridden in the anonymous function. pmodules=("$argv[@]") diff --git a/modules/README.md b/modules/README.md index 569a08ff..85ecf1d7 100644 --- a/modules/README.md +++ b/modules/README.md @@ -31,6 +31,16 @@ Dpkg Defines dpkg aliases and functions. +Editor +------ + +Sets key bindings. + +Emacs +----- + +Enables Emacs dependency management. + Environment ----------- @@ -41,13 +51,19 @@ Fasd Maintains a frequently used file and directory list for fast access. +Git +--- + +Enhances the Git distributed version control system by providing aliases, +functions and by exposing repository status information to prompts. + GNU Utility ----------- Provides for the interactive use of GNU utilities on non-GNU systems. GPG ---------- +--- Provides for an easier use of GPG by setting up gpg-agent. @@ -61,16 +77,16 @@ Helper Provides helper functions for developing modules. -History Substring Search ------------------------- - -Integrates zsh-history-substring-search into Prezto. - History ------- Sets history options and defines history aliases. +History Substring Search +------------------------ + +Integrates zsh-history-substring-search into Prezto. + Homebrew -------- @@ -91,6 +107,11 @@ Node.js Provides utility functions for Node.js and loads npm completion. +Ocaml +----- + +Initializes Ocaml package management. + OSX --- @@ -142,10 +163,10 @@ Spectrum Provides for easier use of 256 colors and effects. -SSH-Agent ---------- +SSH +--- -Provides for an easier use of ssh-agent. +Provides for an easier use of SSH by setting up ssh-agent. Syntax Highlighting ------------------- diff --git a/modules/command-not-found/README.md b/modules/command-not-found/README.md index 91a67f25..691806a4 100644 --- a/modules/command-not-found/README.md +++ b/modules/command-not-found/README.md @@ -1,7 +1,8 @@ Command-Not-Found ================= -Loads the [command-not-found][1] tool on Debian-based distributions. +Displays installation information for not found commands by loading the +[command-not-found][1] tool on Debian-based and Arch Linux-based distributions. Authors ------- diff --git a/modules/command-not-found/init.zsh b/modules/command-not-found/init.zsh index 7b554e86..c4d1b9f9 100644 --- a/modules/command-not-found/init.zsh +++ b/modules/command-not-found/init.zsh @@ -5,10 +5,14 @@ # Joseph Jon Booker # +# Load command-not-found on Debian-based distributions. +if [[ -s '/etc/zsh_command_not_found' ]]; then + source '/etc/zsh_command_not_found' +# Load command-not-found on Arch Linux-based distributions. +elif [[ -s '/usr/share/doc/pkgfile/command-not-found.zsh' ]]; then + source '/usr/share/doc/pkgfile/command-not-found.zsh' # Return if requirements are not found. -if [[ ! -s '/etc/zsh_command_not_found' ]]; then +else return 1 fi -source '/etc/zsh_command_not_found' - diff --git a/modules/completion/external b/modules/completion/external index bfb970ca..1d6a2aa0 160000 --- a/modules/completion/external +++ b/modules/completion/external @@ -1 +1 @@ -Subproject commit bfb970cad37136e76873891d9fb1ce1c937b4576 +Subproject commit 1d6a2aa024ea159229b3cfa6942cadaab1961ace diff --git a/modules/editor/init.zsh b/modules/editor/init.zsh index aa867ff5..1f0d8037 100644 --- a/modules/editor/init.zsh +++ b/modules/editor/init.zsh @@ -110,31 +110,40 @@ function editor-info { } zle -N editor-info -# Ensures that $terminfo values are valid and updates editor information when -# the keymap changes. -function zle-keymap-select zle-line-init zle-line-finish { +# Updates editor information when the keymap changes. +function zle-keymap-select { + zle editor-info +} +zle -N zle-keymap-select + +# Enables terminal application mode and updates editor information. +function zle-line-init { # The terminal must be in application mode when ZLE is active for $terminfo # values to be valid. - if (( $+terminfo[smkx] && $+terminfo[rmkx] )); then - case "$0" in - (zle-line-init) - # Enable terminal application mode. - echoti smkx - ;; - (zle-line-finish) - # Disable terminal application mode. - echoti rmkx - ;; - esac + if (( $+terminfo[smkx] )); then + # Enable terminal application mode. + echoti smkx fi # Update editor information. zle editor-info } -zle -N zle-keymap-select -zle -N zle-line-finish zle -N zle-line-init +# Disables terminal application mode and updates editor information. +function zle-line-finish { + # The terminal must be in application mode when ZLE is active for $terminfo + # values to be valid. + if (( $+terminfo[rmkx] )); then + # Disable terminal application mode. + echoti rmkx + fi + + # Update editor information. + zle editor-info +} +zle -N zle-line-finish + # Toggles emacs overwrite mode and updates editor information. function overwrite-mode { zle .overwrite-mode diff --git a/modules/git/functions/git-info b/modules/git/functions/git-info index 1c163962..bc627240 100644 --- a/modules/git/functions/git-info +++ b/modules/git/functions/git-info @@ -348,13 +348,13 @@ function git-info { # Format added. if (( added > 0 )); then zstyle -s ':prezto:module:git:info:added' format 'added_format' - zformat -f added_formatted "$added_format" "a:$added_format" + zformat -f added_formatted "$added_format" "a:$added" fi # Format deleted. if (( deleted > 0 )); then zstyle -s ':prezto:module:git:info:deleted' format 'deleted_format' - zformat -f deleted_formatted "$deleted_format" "d:$deleted_format" + zformat -f deleted_formatted "$deleted_format" "d:$deleted" fi # Format modified. diff --git a/modules/gpg/init.zsh b/modules/gpg/init.zsh index 2e4c4eab..48f1715a 100644 --- a/modules/gpg/init.zsh +++ b/modules/gpg/init.zsh @@ -12,7 +12,7 @@ fi # Set the default paths to gpg-agent files. _gpg_agent_conf="$HOME/.gnupg/gpg-agent.conf" -_gpg_agent_env="$TMPDIR/gpg-agent.env" +_gpg_agent_env="${TMPDIR:-/tmp}/gpg-agent.env" # Start gpg-agent if not started. if ! ps -U "$USER" -o ucomm | grep -q gpg-agent; then diff --git a/modules/history-substring-search/external b/modules/history-substring-search/external index d9b28ed7..1e768040 160000 --- a/modules/history-substring-search/external +++ b/modules/history-substring-search/external @@ -1 +1 @@ -Subproject commit d9b28ed7f9c62d843c6f3e599ab4f3aa0bdd37b5 +Subproject commit 1e7680405239a835aa403a7457cad23750f98e72 diff --git a/modules/history-substring-search/init.zsh b/modules/history-substring-search/init.zsh index 53eb99be..0fc191d8 100644 --- a/modules/history-substring-search/init.zsh +++ b/modules/history-substring-search/init.zsh @@ -10,7 +10,7 @@ pmodload 'editor' # Source module files. -source "${0:h}/external/zsh-history-substring-search.zsh" +source "${0:h}/external/zsh-history-substring-search.zsh" || return 1 # # Search diff --git a/modules/ocaml/README.md b/modules/ocaml/README.md new file mode 100644 index 00000000..7d56fec8 --- /dev/null +++ b/modules/ocaml/README.md @@ -0,0 +1,28 @@ +Ocaml +===== + +Initializes [Ocaml][1] package management. + +OPAM +---- + +[OPAM][2] is a package manager for Ocaml. + +This module enables local package installation with OPAM by extending the +relevant path and Ocaml variables. + +### Usage + +Install packages to your local package directory with `opam install`. + +Authors +------- + +*The authors of this module should be contacted via the [issue tracker][3].* + + - [Sebastian Wiesner](https://github.com/lunaryorn) + +[1]: http://ocaml.org/ +[2]: http://opam.ocamlpro.com/ +[3]: https://github.com/sorin-ionescu/prezto/issues + diff --git a/modules/ocaml/init.zsh b/modules/ocaml/init.zsh new file mode 100644 index 00000000..2e5b71e5 --- /dev/null +++ b/modules/ocaml/init.zsh @@ -0,0 +1,15 @@ +# +# Initializes Ocaml package management. +# +# Authors: +# Sebastian Wiesner +# + +# Return if requirements are not found. +if (( ! $+commands[opam] )); then + return 1 +fi + +# Initialize OPAM. +eval "$(opam config env)" + diff --git a/modules/osx/README.md b/modules/osx/README.md index 498ed2e5..d8eff0ff 100644 --- a/modules/osx/README.md +++ b/modules/osx/README.md @@ -9,17 +9,20 @@ Aliases - `cdf` changes the current working director to the current _Finder_ directory. - `pushdf` pushes the current working directory onto the directory queue and - - `ql` quick looks at files. - - `rm-osx-cruft` deletes .DS\_Store, \_\_MACOSX cruft. + changes the current working director to the current _Finder_ directory. Functions --------- - - `manb` opens _man_ pages in [_Bwana.app_][2]. + - `mand` opens _man_ pages in [_Dash.app_][2]. - `manp` opens _man_ pages in _Preview.app_. - `pfd` prints the current _Finder_ directory. - `pfs` prints the current _Finder_ selection. - `tab` creates a new tab (works in both _Terminal_ and [_iTerm_][3]). + - `ql` previews files in Quick Look. + - `osx-rm-dir-metadata` deletes .DS\_Store, \_\_MACOSX cruft. + - `osx-ls-download-history` displays the Mac OS X download history. + - `osx-rm-download-history` deletes the Mac OS X download history. Authors ------- @@ -29,7 +32,6 @@ Authors - [Sorin Ionescu](https://github.com/sorin-ionescu) [1]: http://www.apple.com/macosx/ -[2]: http://bruji.com/bwana/ +[2]: http://kapeli.com/dash [3]: http://www.iterm2.com/ [4]: https://github.com/sorin-ionescu/prezto/issues - diff --git a/modules/osx/functions/_manb_manp b/modules/osx/functions/_manb_mand_manp similarity index 63% rename from modules/osx/functions/_manb_manp rename to modules/osx/functions/_manb_mand_manp index bbba2af2..ae5630f1 100644 --- a/modules/osx/functions/_manb_manp +++ b/modules/osx/functions/_manb_mand_manp @@ -1,8 +1,8 @@ -#compdef manb manp +#compdef mand manp #autoload # -# Completes manb and manp. +# Completes mand and manp. # # Authors: # Sorin Ionescu diff --git a/modules/osx/functions/manb b/modules/osx/functions/manb deleted file mode 100644 index aac5fb5f..00000000 --- a/modules/osx/functions/manb +++ /dev/null @@ -1,24 +0,0 @@ -# -# Opens man pages in Bwana.app. -# -# Authors: -# Sorin Ionescu -# - -function manb { - local page - if (( $# > 0 )); then - for page in "$@"; do - open "man:$page" 2>/dev/null - if (( $? != 0 )); then - print "$0: Bwana is not installed" >&2 - break - fi - done - else - print 'What manual page do you want?' >&2 - fi -} - -manb "$@" - diff --git a/modules/osx/functions/mand b/modules/osx/functions/mand new file mode 100644 index 00000000..a22114e1 --- /dev/null +++ b/modules/osx/functions/mand @@ -0,0 +1,21 @@ +# +# Opens man pages in Dash.app. +# +# Authors: +# Sorin Ionescu +# + +function mand { + if (( $# > 0 )); then + open "dash://manpages:$1" 2>/dev/null + if (( $? != 0 )); then + print "$0: Dash is not installed" >&2 + break + fi + else + print 'What manual page do you want?' >&2 + fi +} + +mand "$@" + diff --git a/modules/osx/functions/osx-ls-download-history b/modules/osx/functions/osx-ls-download-history new file mode 100644 index 00000000..5727c1b3 --- /dev/null +++ b/modules/osx/functions/osx-ls-download-history @@ -0,0 +1,13 @@ +# +# Displays the Mac OS X download history. +# +# Authors: +# Sorin Ionescu +# + +local db +for db in ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV*; do + if grep -q 'LSQuarantineEvent' < <(sqlite3 "$db" .tables); then + sqlite3 "$db" 'SELECT LSQuarantineDataURLString FROM LSQuarantineEvent' + fi +done diff --git a/modules/osx/functions/osx-rm-dir-metadata b/modules/osx/functions/osx-rm-dir-metadata new file mode 100644 index 00000000..0a91cedb --- /dev/null +++ b/modules/osx/functions/osx-rm-dir-metadata @@ -0,0 +1,11 @@ +# +# Deletes .DS_Store and __MACOSX directories. +# +# Authors: +# Sorin Ionescu +# + +find "${@:-$PWD}" \( \ + -type f -name '.DS_Store' -o \ + -type d -name '__MACOSX' \ +\) -print0 | xargs -0 rm -rf diff --git a/modules/osx/functions/osx-rm-download-history b/modules/osx/functions/osx-rm-download-history new file mode 100644 index 00000000..38377098 --- /dev/null +++ b/modules/osx/functions/osx-rm-download-history @@ -0,0 +1,13 @@ +# +# Deletes the Mac OS X download history. +# +# Authors: +# Sorin Ionescu +# + +local db +for db in ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV*; do + if grep -q 'LSQuarantineEvent' < <(sqlite3 "$db" .tables); then + sqlite3 "$db" 'DELETE FROM LSQuarantineEvent; VACUUM' + fi +done diff --git a/modules/osx/functions/pfd b/modules/osx/functions/pfd index 3e038a68..a4d4b686 100644 --- a/modules/osx/functions/pfd +++ b/modules/osx/functions/pfd @@ -7,7 +7,6 @@ osascript 2>/dev/null < # -osascript 2>/dev/null <&1 < +# + +if (( $# > 0 )); then + qlmanage -p "$@" &> /dev/null +fi diff --git a/modules/osx/init.zsh b/modules/osx/init.zsh index 6acbfbc7..edf6ed3d 100644 --- a/modules/osx/init.zsh +++ b/modules/osx/init.zsh @@ -14,26 +14,8 @@ fi # Aliases # -# Change directory to the current Finder directory. +# Changes directory to the current Finder directory. alias cdf='cd "$(pfd)"' -# Push directory to the current Finder directory. +# Pushes directory to the current Finder directory. alias pushdf='pushd "$(pfd)"' - -# -# Functions -# - -# Open files in Quick Look. -function ql { - (( $# > 0 )) && qlmanage -p "$@" &> /dev/null -} - -# Delete .DS_Store and __MACOSX directories. -function rm-osx-cruft { - find "${@:-$PWD}" \( \ - -type f -name '.DS_Store' -o \ - -type d -name '__MACOSX' \ - \) -print0 | xargs -0 rm -rf -} - diff --git a/modules/pacman/init.zsh b/modules/pacman/init.zsh index c6fdc451..2b4f0a22 100644 --- a/modules/pacman/init.zsh +++ b/modules/pacman/init.zsh @@ -27,6 +27,9 @@ if (( $+commands[$_pacman_frontend] )); then if [[ -s "${0:h}/${_pacman_frontend}.zsh" ]]; then source "${0:h}/${_pacman_frontend}.zsh" fi +else + _pacman_frontend='pacman' + _pacman_sudo='sudo ' fi # @@ -34,49 +37,49 @@ fi # # Pacman. -alias pac='pacman' +alias pac="${_pacman_frontend}" # Installs packages from repositories. -alias paci='sudo pacman --sync' +alias paci="${_pacman_sudo}${_pacman_frontend} --sync" # Installs packages from files. -alias pacI='sudo pacman --upgrade' +alias pacI="${_pacman_sudo}${_pacman_frontend} --upgrade" # Removes packages and unneeded dependencies. -alias pacx='sudo pacman --remove' +alias pacx="${_pacman_sudo}${_pacman_frontend} --remove" # Removes packages, their configuration, and unneeded dependencies. -alias pacX='sudo pacman --remove --nosave --recursive' +alias pacX="${_pacman_sudo}${_pacman_frontend} --remove --nosave --recursive" # Displays information about a package from the repositories. -alias pacq='pacman --sync --info' +alias pacq="${_pacman_frontend} --sync --info" # Displays information about a package from the local database. -alias pacQ='pacman --query --info' +alias pacQ="${_pacman_frontend} --query --info" # Searches for packages in the repositories. -alias pacs='pacman --sync --recursive' +alias pacs="${_pacman_frontend} --sync --search" # Searches for packages in the local database. -alias pacS='pacman --query --recursive' +alias pacS="${_pacman_frontend} --query --search" # Lists orphan packages. -alias pacman-list-orphans='sudo pacman --query --deps --unrequired' +alias pacman-list-orphans="${_pacman_sudo}${_pacman_frontend} --query --deps --unrequired" # Removes orphan packages. -alias pacman-remove-orphans='sudo pacman --remove --recursive $(pacman --quiet --query --deps --unrequired)' +alias pacman-remove-orphans="${_pacman_sudo}${_pacman_frontend} --remove --recursive \$(${_pacman_frontend} --quiet --query --deps --unrequired)" # Synchronizes the local package and Arch Build System databases against the # repositories. if (( $+commands[abs] )); then - alias pacu='sudo pacman --sync --refresh && sudo abs' + alias pacu="${_pacman_sudo}${_pacman_frontend} --sync --refresh && ${_pacman_sudo}abs" else - alias pacu='sudo pacman --sync --refresh' + alias pacu="${_pacman_sudo}${_pacman_frontend} --sync --refresh" fi # Synchronizes the local package database against the repositories then # upgrades outdated packages. -alias pacU='sudo pacman --sync --refresh --sysupgrade' +alias pacU="${_pacman_sudo}${_pacman_frontend} --sync --refresh --sysupgrade" -unset _pacman_frontend +unset _pacman_{frontend,sudo} diff --git a/modules/pacman/yaourt.zsh b/modules/pacman/yaourt.zsh index fb2a8dc2..f4709e08 100644 --- a/modules/pacman/yaourt.zsh +++ b/modules/pacman/yaourt.zsh @@ -11,9 +11,9 @@ # Disable color. if ! zstyle -t ':prezto:module:pacman:yaourt' color; then - alias pacman='pacman --nocolor' + alias pacman='yaourt --nocolor' fi # Manages .pac* files. -alias pacc='pacman -C' +alias pacc='yaourt -C' diff --git a/modules/python/init.zsh b/modules/python/init.zsh index fa9175e5..5715b024 100644 --- a/modules/python/init.zsh +++ b/modules/python/init.zsh @@ -16,9 +16,12 @@ elif (( $+commands[pyenv] )); then eval "$(pyenv init -)" # Prepend PEP 370 per user site packages directory, which defaults to -# ~/Library/Python on Mac OS X and ~/.local elsewhere, to PATH. +# ~/Library/Python on Mac OS X and ~/.local elsewhere, to PATH. The +# path can be overridden using PYTHONUSERBASE. else - if [[ "$OSTYPE" == darwin* ]]; then + if [[ -n "$PYTHONUSERBASE" ]]; then + path=($PYTHONUSERBASE/bin $path) + elif [[ "$OSTYPE" == darwin* ]]; then path=($HOME/Library/Python/*/bin(N) $path) else # This is subject to change. diff --git a/modules/rails/init.zsh b/modules/rails/init.zsh index e51185bb..70f50ce8 100644 --- a/modules/rails/init.zsh +++ b/modules/rails/init.zsh @@ -7,39 +7,30 @@ # Sorin Ionescu # +# Load dependencies. +pmodload 'ruby' + # Return if requirements are not found. -if (( ! $+commands[rails] )); then +if (( ! $+commands[bundle] )); then return 1 fi # -# Aliases (Compatible with Rails 2) -# - -alias ror='rails' -alias rorc='_rails-command console' -alias rordc='_rails-command dbconsole' -alias rordm='rake db:migrate' -alias rordM='rake db:migrate db:test:clone' -alias rordr='rake db:rollback' -alias rorg='_rails-command generate' -alias rorl='tail -f log/development.log' -alias rorlc='rake log:clear' -alias rorp='_rails-command plugin' -alias rorr='_rails-command runner' -alias rors='_rails-command server' -alias rorsd='_rails-command server --debugger' -alias rorx='_rails-command destroy' - -# -# Functions +# Aliases # -function _rails-command { - if [[ -e "script/server" ]]; then - ruby script/"$@" - else - ruby script/rails "$@" - fi -} +alias ror='bundle exec rails' +alias rorc='bundle exec rails console' +alias rordc='bundle exec rails dbconsole' +alias rordm='bundle exec rake db:migrate' +alias rordM='bundle exec rake db:migrate db:test:clone' +alias rordr='bundle exec rake db:rollback' +alias rorg='bundle exec rails generate' +alias rorl='tail -f "$(ruby-app-root)/log/development.log"' +alias rorlc='bundle exec rake log:clear' +alias rorp='bundle exec rails plugin' +alias rorr='bundle exec rails runner' +alias rors='bundle exec rails server' +alias rorsd='bundle exec rails server --debugger' +alias rorx='bundle exec rails destroy' diff --git a/modules/ruby/README.md b/modules/ruby/README.md index 42e63be6..1c955f5e 100644 --- a/modules/ruby/README.md +++ b/modules/ruby/README.md @@ -8,7 +8,7 @@ Local Gem Installation ---------------------- When a Ruby version manager is not detected, local gems are installed in -*~/Library/Ruby/Gems/1.8* on Mac OS X. +*~/.gems*; otherwise, they are installed according to the manager. RVM --- @@ -20,15 +20,33 @@ home directory. Since RVM is loaded into the shell and is known to override shell commands, it may conflict with shell scripts. +Load this module as late as possible when using RVM since RVM will complain if +it is not first in `$PATH`. + rbenv ----- -An alternative RVM is to use [rbenv][3], which allows for switching between multiple, -isolated Ruby installations in the home directory. +An alternative RVM is to use [rbenv][3], which allows for switching between +multiple, isolated Ruby installations in the home directory. While it is not as feature rich as RVM, it is not loaded into the shell and is not known to cause conflicts with shell scripts. +chruby +------ + +Yet another alternative is [chruby][6], which is simpler than both RVM and +rbenv. + +### Settings + +#### Auto-Switch + +To enable auto switching the Ruby version on directory change based on the +.ruby-version file, add the following line to *zpreztorc*: + + zstyle ':prezto:module:ruby:chruby' auto-switch 'yes' + Bundler ------- @@ -59,6 +77,7 @@ Aliases Functions --------- + - `ruby-app-root` displays the path to the Ruby application root directory. - `ruby-info` exposes information about the Ruby environment via the `$ruby_info` associative array. @@ -86,4 +105,4 @@ Authors [3]: https://github.com/sstephenson/rbenv [4]: http://gembundler.com [5]: https://github.com/sorin-ionescu/prezto/issues - +[6]: https://github.com/postmodern/chruby diff --git a/modules/ruby/functions/ruby-app-root b/modules/ruby/functions/ruby-app-root new file mode 100644 index 00000000..cff8966f --- /dev/null +++ b/modules/ruby/functions/ruby-app-root @@ -0,0 +1,19 @@ +# +# Displays the path to the Ruby application root directory. +# +# Authors: +# Sorin Ionescu +# + +local root_dir="$PWD" + +while [[ "$root_dir" != '/' ]]; do + if [[ -f "$root_dir/Gemfile" ]]; then + print "$root_dir" + break + fi + root_dir="$root_dir:h" +done + +return 1 + diff --git a/modules/ruby/functions/ruby-info b/modules/ruby/functions/ruby-info index 7bc8ead6..b3656dd8 100644 --- a/modules/ruby/functions/ruby-info +++ b/modules/ruby/functions/ruby-info @@ -18,6 +18,8 @@ if (( $+commands[rvm-prompt] )); then version="$(rvm-prompt)" elif (( $+commands[rbenv] )); then version="$(rbenv version-name)" +elif (( $+commands[ruby] )); then + version="${${$(ruby --version)[(w)1,(w)2]}/ /-}" fi # Format version. diff --git a/modules/ruby/init.zsh b/modules/ruby/init.zsh index 0303d5a3..eb18dd37 100644 --- a/modules/ruby/init.zsh +++ b/modules/ruby/init.zsh @@ -23,14 +23,16 @@ elif [[ -s "$HOME/.rbenv/bin/rbenv" ]]; then elif (( $+commands[rbenv] )); then eval "$(rbenv init - --no-rehash zsh)" -# Install local gems according to operating system conventions. -else - if [[ "$OSTYPE" == darwin* ]]; then - export GEM_HOME="$HOME/Library/Ruby/Gems/1.8" - path=("$GEM_HOME/bin" $path) - else - path=($HOME/.gem/ruby/*/bin(N) $path) +# Load package manager installed chruby into the shell session. +elif (( $+commands[chruby-exec] )); then + source "${commands[chruby-exec]:h:h}/share/chruby/chruby.sh" + if zstyle -t ':prezto:module:ruby:chruby' auto-switch; then + source "${commands[chruby-exec]:h:h}/share/chruby/auto.sh" fi + +# Prepend local gems bin directories to PATH. +else + path=($HOME/.gem/ruby/*/bin(N) $path) fi # Return if requirements are not found. @@ -48,15 +50,17 @@ alias rb='ruby' # Bundler if (( $+commands[bundle] )); then alias rbb='bundle' - alias rbbe='rbb exec' - alias rbbi='rbb install --path vendor/bundle' - alias rbbl='rbb list' - alias rbbo='rbb open' - alias rbbp='rbb package' - alias rbbu='rbb update' + alias rbbe='bundle exec' + alias rbbi='bundle install --path vendor/bundle' + alias rbbl='bundle list' + alias rbbo='bundle open' + alias rbbp='bundle package' + alias rbbu='bundle update' alias rbbI='rbbi \ - && rbb package \ + && bundle package \ && print .bundle >>! .gitignore \ + && print vendor/assets >>! .gitignore \ && print vendor/bundle >>! .gitignore \ && print vendor/cache >>! .gitignore' fi + diff --git a/modules/screen/init.zsh b/modules/screen/init.zsh index f10efb73..7a5cee3d 100644 --- a/modules/screen/init.zsh +++ b/modules/screen/init.zsh @@ -15,7 +15,7 @@ fi # Auto Start # -if [[ -z "$STY" ]] && ( \ +if [[ -z "$STY" && -z "$EMACS" && -z "$VIM" ]] && ( \ ( [[ -n "$SSH_TTY" ]] && zstyle -t ':prezto:module:screen:auto-start' remote ) || ( [[ -z "$SSH_TTY" ]] && zstyle -t ':prezto:module:screen:auto-start' local ) \ ); then diff --git a/modules/ssh/init.zsh b/modules/ssh/init.zsh index 320f7635..608e34e6 100644 --- a/modules/ssh/init.zsh +++ b/modules/ssh/init.zsh @@ -14,17 +14,20 @@ fi _ssh_dir="$HOME/.ssh" # Set the path to the environment file if not set by another module. -_ssh_agent_env="${_ssh_agent_env:-$TMPDIR/ssh-agent.env}" +_ssh_agent_env="${_ssh_agent_env:-${TMPDIR:-/tmp}/ssh-agent.env}" # Set the path to the persistent authentication socket. -_ssh_agent_sock="$TMPDIR/ssh-agent.sock" +_ssh_agent_sock="${TMPDIR:-/tmp}/ssh-agent.sock" # Start ssh-agent if not started. if [[ ! -S "$SSH_AUTH_SOCK" ]]; then - eval "$(ssh-agent | sed '/^echo /d' | tee "$_ssh_agent_env")" -else # Export environment variables. source "$_ssh_agent_env" 2> /dev/null + + # Start ssh-agent if not started. + if ! ps -U "$USER" -o pid,ucomm | grep -q "${SSH_AGENT_PID} ssh-agent"; then + eval "$(ssh-agent | sed '/^echo /d' | tee "$_ssh_agent_env")" + fi fi # Create a persistent SSH authentication socket. diff --git a/modules/syntax-highlighting/init.zsh b/modules/syntax-highlighting/init.zsh index e5c555bd..55172b89 100644 --- a/modules/syntax-highlighting/init.zsh +++ b/modules/syntax-highlighting/init.zsh @@ -11,7 +11,7 @@ if ! zstyle -t ':prezto:module:syntax-highlighting' color; then fi # Source module files. -source "${0:h}/external/zsh-syntax-highlighting.zsh" +source "${0:h}/external/zsh-syntax-highlighting.zsh" || return 1 # Set highlighters. zstyle -a ':prezto:module:syntax-highlighting' highlighters 'ZSH_HIGHLIGHT_HIGHLIGHTERS' diff --git a/modules/terminal/README.md b/modules/terminal/README.md index f1256c69..435d9720 100644 --- a/modules/terminal/README.md +++ b/modules/terminal/README.md @@ -13,23 +13,33 @@ directory, add the following to *zpreztorc*: zstyle ':prezto:module:terminal' auto-title 'yes' +Auto titling is disabled inside terminal multiplexers, except inside dvtm, since +it interferes with window names defined in configuration files and profile +managers. + +To format terminal window and tab titles, add the following to *zpreztorc*: + + zstyle ':prezto:module:terminal:window-title' format '%n@%m: %s' + zstyle ':prezto:module:terminal:tab-title' format '%m: %s' + +`%s` will be replaced with the current working directory path or the currently +executing program name. + +For a list of sequences, see [Expansion of Prompt Sequences][1]. + Functions --------- -- `set-screen-window-title` sets the screen title. -- `set-terminal-tab-title` sets the terminal tab title. -- `set-terminal-window-title` sets the terminal window title. -- `set-titles-with-command` sets the screen and terminal titles with - a given command. -- `set-titles-with-path` sets the screen and terminal titles with a given path. +- `set-tab-title` sets the terminal tab title. +- `set-window-title` sets the terminal or terminal multiplexer window title. Authors ------- -*The authors of this module should be contacted via the [issue tracker][1].* +*The authors of this module should be contacted via the [issue tracker][2].* - - [James Cox](https://github.com/imajes) - [Sorin Ionescu](https://github.com/sorin-ionescu) -[1]: https://github.com/sorin-ionescu/prezto/issues +[1]: http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Expansion-of-Prompt-Sequences +[2]: https://github.com/sorin-ionescu/prezto/issues diff --git a/modules/terminal/init.zsh b/modules/terminal/init.zsh index dc78a3be..e35b77db 100644 --- a/modules/terminal/init.zsh +++ b/modules/terminal/init.zsh @@ -2,122 +2,123 @@ # Sets terminal window and tab titles. # # Authors: -# James Cox # Sorin Ionescu # # Return if requirements are not found. -if [[ "$TERM" == 'dumb' ]]; then +if [[ "$TERM" == (dumb|linux|*bsd*) ]]; then return 1 fi -# Set the GNU Screen window number. -if [[ -n "$WINDOW" ]]; then - export SCREEN_NO="%B${WINDOW}%b " -else - export SCREEN_NO="" -fi +# Sets the terminal or terminal multiplexer window title. +function set-window-title { + local title_format{,ted} + zstyle -s ':prezto:module:terminal:window-title' format 'title_format' || title_format="%s" + zformat -f title_formatted "$title_format" "s:$argv" -# Sets the GNU Screen title. -function set-screen-window-title { if [[ "$TERM" == screen* ]]; then - printf "\ek%s\e\\" ${(V)argv} + title_format="\ek%s\e\\" + else + title_format="\e]2;%s\a" fi -} -# Sets the terminal window title. -function set-terminal-window-title { - if [[ "$TERM" == ((x|a|ml|dt|E)term*|(u|)rxvt*) ]]; then - printf "\e]2;%s\a" ${(V)argv} - fi + printf "$title_format" "${(V%)title_formatted}" } # Sets the terminal tab title. -function set-terminal-tab-title { - if [[ "$TERM" == ((x|a|ml|dt|E)term*|(u|)rxvt*) ]]; then - printf "\e]1;%s\a" ${(V)argv} - fi +function set-tab-title { + local title_format{,ted} + zstyle -s ':prezto:module:terminal:tab-title' format 'title_format' || title_format="%s" + zformat -f title_formatted "$title_format" "s:$argv" + + printf "\e]1;%s\a" ${(V%)title_formatted} } # Sets the tab and window titles with a given command. -function set-titles-with-command { - # Do not set the window and tab titles in Terminal.app because they are not - # reset upon command termination. - if [[ "$TERM_PROGRAM" == 'Apple_Terminal' ]]; then - return 1 - fi - +function _terminal-set-titles-with-command { emulate -L zsh setopt EXTENDED_GLOB # Get the command name that is under job control. - if [[ "${1[(w)1]}" == (fg|%*)(\;|) ]]; then + if [[ "${2[(w)1]}" == (fg|%*)(\;|) ]]; then # Get the job name, and, if missing, set it to the default %+. - local job_name="${${1[(wr)%*(\;|)]}:-%+}" + local job_name="${${2[(wr)%*(\;|)]}:-%+}" # Make a local copy for use in the subshell. local -A jobtexts_from_parent_shell jobtexts_from_parent_shell=(${(kv)jobtexts}) - jobs $job_name 2>/dev/null > >( + jobs "$job_name" 2>/dev/null > >( read index discarded # The index is already surrounded by brackets: [1]. - set-titles-with-command "${(e):-\$jobtexts_from_parent_shell$index}" + _terminal-set-titles-with-command "${(e):-\$jobtexts_from_parent_shell$index}" ) else # Set the command name, or in the case of sudo or ssh, the next command. - local cmd=${${1[(wr)^(*=*|sudo|ssh|-*)]}:t} + local cmd="${${2[(wr)^(*=*|sudo|ssh|-*)]}:t}" local truncated_cmd="${cmd/(#m)?(#c15,)/${MATCH[1,12]}...}" unset MATCH - if [[ "$TERM" == screen* ]]; then - set-screen-window-title "$truncated_cmd" - else - set-terminal-window-title "$cmd" - set-terminal-tab-title "$truncated_cmd" - fi + set-window-title "$cmd" + set-tab-title "$truncated_cmd" fi } # Sets the tab and window titles with a given path. -function set-titles-with-path { +function _terminal-set-titles-with-path { emulate -L zsh setopt EXTENDED_GLOB local absolute_path="${${1:a}:-$PWD}" + local abbreviated_path="${absolute_path/#$HOME/~}" + local truncated_path="${abbreviated_path/(#m)?(#c15,)/...${MATCH[-12,-1]}}" + unset MATCH - if [[ "$TERM_PROGRAM" == 'Apple_Terminal' ]]; then - printf '\e]7;%s\a' "file://$HOST${absolute_path// /%20}" - else - local abbreviated_path="${absolute_path/#$HOME/~}" - local truncated_path="${abbreviated_path/(#m)?(#c15,)/...${MATCH[-12,-1]}}" - unset MATCH + set-window-title "$abbreviated_path" + set-tab-title "$truncated_path" +} - if [[ "$TERM" == screen* ]]; then - set-screen-window-title "$truncated_path" - else - set-terminal-window-title "$abbreviated_path" - set-terminal-tab-title "$truncated_path" - fi - fi +# Sets the Terminal.app proxy icon. +function _terminal-set-terminal-app-proxy-icon { + printf '\e]7;%s\a' "file://$HOST${${1:-$PWD}// /%20}" } -# Don't override precmd/preexec; append to hook array. +# Do not override precmd/preexec; append to the hook array. autoload -Uz add-zsh-hook -# Sets the tab and window titles before the prompt is displayed. -function set-titles-precmd { - if zstyle -t ':prezto:module:terminal' auto-title; then - set-titles-with-path - fi -} -add-zsh-hook precmd set-titles-precmd +# Set up the Apple Terminal. +if [[ "$TERM_PROGRAM" == 'Apple_Terminal' ]] \ + && ( ! [[ -n "$STY" || -n "$TMUX" || -n "$DVTM" ]] ) +then + # Sets the Terminal.app current working directory before the prompt is + # displayed. + add-zsh-hook precmd _terminal-set-terminal-app-proxy-icon + + # Unsets the Terminal.app current working directory when a terminal + # multiplexer or remote connection is started since it can no longer be + # updated, and it becomes confusing when the directory displayed in the title + # bar is no longer synchronized with real current working directory. + function _terminal-unset-terminal-app-proxy-icon { + if [[ "${2[(w)1]:t}" == (screen|tmux|dvtm|ssh|mosh) ]]; then + _terminal-set-terminal-app-proxy-icon ' ' + fi + } + add-zsh-hook preexec _terminal-unset-terminal-app-proxy-icon -# Sets the tab and window titles before command execution. -function set-titles-preexec { - if zstyle -t ':prezto:module:terminal' auto-title; then - set-titles-with-command "$2" - fi -} -add-zsh-hook preexec set-titles-preexec + # Do not set the tab and window titles in Terminal.app since it sets the tab + # title to the currently running process by default and the current working + # directory is set separately. + return +fi + +# Set up non-Apple terminals. +if zstyle -t ':prezto:module:terminal' auto-title \ + && ( ! [[ -n "$STY" || -n "$TMUX" ]] ) +then + # Sets the tab and window titles before the prompt is displayed. + add-zsh-hook precmd _terminal-set-titles-with-path + + # Sets the tab and window titles before command execution. + add-zsh-hook preexec _terminal-set-titles-with-command +fi diff --git a/modules/tmux/README.md b/modules/tmux/README.md index 68ba9d06..0e2f652f 100644 --- a/modules/tmux/README.md +++ b/modules/tmux/README.md @@ -20,12 +20,15 @@ following line to *zpreztorc*: zstyle ':prezto:module:tmux:auto-start' remote 'yes' -In both cases, it will create a background session named _#Prezto_ and attach -every new shell to it. +In both cases, it will create a background session named _prezto_ if the tmux +server is not started. -To avoid keeping open sessions, this module sets `destroy-unattached off` on -the background session and `destroy-unattached on` on every other session -(global setting). +With `auto-start` enabled, you may want to control how multiple sessions are +managed. The `destroy-unattached` option of tmux controls if the unattached +sessions must be kept alive, making sessions available for later use, configured +in *tmux.conf*: + + set-option -g destroy-unattached [on | off] Aliases ------- @@ -41,7 +44,7 @@ connected** to be displayed, which can be fixed by installing [reattach-to-user-namespace][3], available in [Homebrew][4], and adding the following to *tmux.conf*: - set-option -g default-command "reattach-to-user-namespace -l $SHELL -l" + set-option -g default-command "reattach-to-user-namespace -l $SHELL -l" Furthermore, tmux is known to cause **kernel panics** on Mac OS X. A discussion about this and Prezto has already been [opened][2]. @@ -54,6 +57,7 @@ Authors - [Sorin Ionescu](https://github.com/sorin-ionescu) - [Colin Hebert](https://github.com/ColinHebert) - [Georges Discry](https://github.com/gdiscry) + - [Xavier Cambar](https://github.com/xcambar) [1]: http://tmux.sourceforge.net [2]: https://github.com/sorin-ionescu/prezto/issues/62 diff --git a/modules/tmux/init.zsh b/modules/tmux/init.zsh index a59b259a..29b547f3 100644 --- a/modules/tmux/init.zsh +++ b/modules/tmux/init.zsh @@ -5,6 +5,7 @@ # Sorin Ionescu # Colin Hebert # Georges Discry +# Xavier Cambar # # Return if requirements are not found. @@ -16,31 +17,22 @@ fi # Auto Start # -if [[ -z "$TMUX" ]] && ( \ +if [[ -z "$TMUX" && -z "$EMACS" && -z "$VIM" ]] && ( \ ( [[ -n "$SSH_TTY" ]] && zstyle -t ':prezto:module:tmux:auto-start' remote ) || ( [[ -z "$SSH_TTY" ]] && zstyle -t ':prezto:module:tmux:auto-start' local ) \ ); then - tmux_session='#Prezto' - - if ! tmux has-session -t "$tmux_session" 2> /dev/null; then - # Ensure that tmux server is started. - tmux start-server - - # Disable the destruction of unattached sessions globally. - tmux set-option -g destroy-unattached off &> /dev/null - - # Create a new session. - tmux new-session -d -s "$tmux_session" - - # Disable the destruction of the new, unattached session. - tmux set-option -t "$tmux_session" destroy-unattached off &> /dev/null - - # Enable the destruction of unattached sessions globally to prevent - # an abundance of open, detached sessions. - tmux set-option -g destroy-unattached on &> /dev/null + tmux start-server + + # Create a 'prezto' session if no session has been defined in tmux.conf. + if ! tmux has-session 2> /dev/null; then + tmux_session='prezto' + tmux \ + new-session -d -s "$tmux_session" \; \ + set-option -t "$tmux_session" destroy-unattached off &> /dev/null fi - exec tmux new-session -t "$tmux_session" + # Attach to the 'prezto' session or to the last session used. + exec tmux attach-session fi # diff --git a/modules/utility/README.md b/modules/utility/README.md index 8ed8a4d3..e292dbd1 100644 --- a/modules/utility/README.md +++ b/modules/utility/README.md @@ -51,6 +51,7 @@ Aliases ### Disabled File Globbing + - `bower` - `fc` - `find` - `ftp` diff --git a/modules/utility/init.zsh b/modules/utility/init.zsh index f31f2eb7..58d74959 100644 --- a/modules/utility/init.zsh +++ b/modules/utility/init.zsh @@ -35,6 +35,7 @@ alias mysql='nocorrect mysql' alias rm='nocorrect rm' # Disable globbing. +alias bower='noglob bower' alias fc='noglob fc' alias find='noglob find' alias ftp='noglob ftp' diff --git a/runcoms/README.md b/runcoms/README.md index 74030b87..97824d8c 100644 --- a/runcoms/README.md +++ b/runcoms/README.md @@ -48,7 +48,7 @@ zprofile and zlogin are not meant to be used concurrently but can be done so. This file is sourced by interactive shells. It should define aliases, functions, shell options, and key bindings. -## zpreztorc +### zpreztorc This file configures Prezto. diff --git a/runcoms/zpreztorc b/runcoms/zpreztorc index ee5aa0d3..a54fdb02 100644 --- a/runcoms/zpreztorc +++ b/runcoms/zpreztorc @@ -10,7 +10,7 @@ # # Set case-sensitivity for completion, history lookup, etc. -zstyle ':prezto:*:*' case-sensitive 'no' +# zstyle ':prezto:*:*' case-sensitive 'yes' # Color output (auto set to 'no' on dumb terminals). zstyle ':prezto:*:*' color 'yes' @@ -87,6 +87,13 @@ zstyle ':prezto:module:editor' key-bindings 'emacs' # Auto set to 'off' on dumb terminals. zstyle ':prezto:module:prompt' theme 'sorin' +# +# Ruby +# + +# Auto switch the Ruby version on directory change. +# zstyle ':prezto:module:ruby:chruby' auto-switch 'yes' + # # Screen # @@ -122,14 +129,19 @@ zstyle ':prezto:module:prompt' theme 'sorin' # 'builtin' 'bg=blue' \ # 'command' 'bg=blue' \ # 'function' 'bg=blue' -# # # Terminal # # Auto set the tab and window titles. -zstyle ':prezto:module:terminal' auto-title 'yes' +# zstyle ':prezto:module:terminal' auto-title 'yes' + +# Set the window title format. +# zstyle ':prezto:module:terminal:window-title' format '%n@%m: %s' + +# Set the tab title format. +# zstyle ':prezto:module:terminal:tab-title' format '%m: %s' # # Tmux @@ -140,4 +152,3 @@ zstyle ':prezto:module:terminal' auto-title 'yes' # Auto start a session when Zsh is launched in a SSH connection. # zstyle ':prezto:module:tmux:auto-start' remote 'yes' - diff --git a/runcoms/zprofile b/runcoms/zprofile index 2a3d07e6..7118770c 100644 --- a/runcoms/zprofile +++ b/runcoms/zprofile @@ -5,3 +5,73 @@ # Sorin Ionescu # +# +# Browser +# + +if [[ "$OSTYPE" == darwin* ]]; then + export BROWSER='open' +fi + +# +# Editors +# + +export EDITOR='nano' +export VISUAL='nano' +export PAGER='less' + +# +# Language +# + +if [[ -z "$LANG" ]]; then + export LANG='en_US.UTF-8' +fi + +# +# Paths +# + +# Ensure path arrays do not contain duplicates. +typeset -gU cdpath fpath mailpath path + +# Set the the list of directories that cd searches. +# cdpath=( +# $cdpath +# ) + +# Set the list of directories that Zsh searches for programs. +path=( + /usr/local/{bin,sbin} + $path +) + +# +# Less +# + +# Set the default Less options. +# Mouse-wheel scrolling has been disabled by -X (disable screen clearing). +# Remove -X and -F (exit if the content fits on one screen) to enable it. +export LESS='-F -g -i -M -R -S -w -X -z-4' + +# Set the Less input preprocessor. +if (( $+commands[lesspipe.sh] )); then + export LESSOPEN='| /usr/bin/env lesspipe.sh %s 2>&-' +fi + +# +# Temporary Files +# + +if [[ ! -d "$TMPDIR" ]]; then + export TMPDIR="/tmp/$USER" + mkdir -p -m 700 "$TMPDIR" +fi + +TMPPREFIX="${TMPDIR%/}/zsh" +if [[ ! -d "$TMPPREFIX" ]]; then + mkdir -p "$TMPPREFIX" +fi + diff --git a/runcoms/zshenv b/runcoms/zshenv index 9ff39e06..2b13503a 100644 --- a/runcoms/zshenv +++ b/runcoms/zshenv @@ -5,72 +5,8 @@ # Sorin Ionescu # -# -# Browser -# - -if [[ "$OSTYPE" == darwin* ]]; then - export BROWSER='open' -fi - -# -# Editors -# - -export EDITOR='nano' -export VISUAL='nano' -export PAGER='less' - -# -# Language -# - -if [[ -z "$LANG" ]]; then - export LANG='en_US.UTF-8' -fi - -# -# Paths -# - -typeset -gU cdpath fpath mailpath path - -# Set the the list of directories that cd searches. -# cdpath=( -# $cdpath -# ) - -# Set the list of directories that Zsh searches for programs. -path=( - /usr/local/{bin,sbin} - $path -) - -# -# Less -# - -# Set the default Less options. -# Mouse-wheel scrolling has been disabled by -X (disable screen clearing). -# Remove -X and -F (exit if the content fits on one screen) to enable it. -export LESS='-F -g -i -M -R -S -w -X -z-4' - -# Set the Less input preprocessor. -if (( $+commands[lesspipe.sh] )); then - export LESSOPEN='| /usr/bin/env lesspipe.sh %s 2>&-' -fi - -# -# Temporary Files -# - -if [[ ! -d "$TMPDIR" ]]; then - export TMPDIR="/tmp/$USER" - mkdir -p -m 700 "$TMPDIR" -fi - -TMPPREFIX="${TMPDIR%/}/zsh" -if [[ ! -d "$TMPPREFIX" ]]; then - mkdir -p "$TMPPREFIX" +# Ensure that a non-login, non-interactive shell has a defined environment. +if [[ "$SHLVL" -eq 1 && ! -o LOGIN && -s "${ZDOTDIR:-$HOME}/.zprofile" ]]; then + source "${ZDOTDIR:-$HOME}/.zprofile" fi