397 lines
12 KiB
Ruby
397 lines
12 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "rake"
|
|
require "fileutils"
|
|
require "English"
|
|
|
|
def macos?
|
|
RUBY_PLATFORM.downcase.include?("darwin")
|
|
end
|
|
|
|
def linux?
|
|
RUBY_PLATFORM.downcase.include?("linux")
|
|
end
|
|
|
|
# this has all the runcoms from this directory.
|
|
task :link_files do
|
|
if want_to_install?("git configs (color, aliases)")
|
|
install_files(Dir.glob("git/*"))
|
|
end
|
|
if want_to_install?("irb/pry configs (more colorful)")
|
|
install_files(Dir.glob("irb/*"))
|
|
end
|
|
if want_to_install?("rubygems config (faster/no docs)")
|
|
install_files(Dir.glob("ruby/*"))
|
|
end
|
|
if want_to_install?("ctags config (better js/ruby support)")
|
|
install_files(Dir.glob("ctags/*"))
|
|
end
|
|
install_files(Dir.glob("tmux/*")) if want_to_install?("tmux config")
|
|
if want_to_install?("vimification of command line tools")
|
|
install_files(Dir.glob("vimify/*"))
|
|
end
|
|
run %(
|
|
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
|
|
)
|
|
end
|
|
|
|
desc "Hook our dotfiles into system-standard positions."
|
|
task install: %i[submodule_init submodules] do
|
|
puts
|
|
puts "======================================================"
|
|
puts "Welcome to YADR Installation."
|
|
puts "======================================================"
|
|
puts
|
|
|
|
install_homebrew if macos?
|
|
install_rvm_binstubs
|
|
|
|
Rake::Task["link_files"].execute
|
|
Rake::Task["install_tools"].execute
|
|
Rake::Task["install_prezto"].execute
|
|
Rake::Task["install_spacevim"].execute
|
|
|
|
install_fonts
|
|
|
|
install_term_theme if macos?
|
|
|
|
run_bundle_config
|
|
|
|
success_msg("installed")
|
|
end
|
|
|
|
task :install_prezto do
|
|
install_prezto if want_to_install?("zsh enhancements & prezto")
|
|
end
|
|
|
|
desc "install spacevim and related config files"
|
|
task :install_spacevim do
|
|
run 'curl -sLf https://spacevim.org/install.sh | sed "s;github.com/SpaceVim;xiemala.com/ruilisi;" | bash'
|
|
install_files(Dir.glob("SpaceVim*"))
|
|
end
|
|
|
|
desc "Update spacevim"
|
|
task :update_spacevim do
|
|
run %(
|
|
cd ~/.SpaceVim
|
|
git remote set-url origin https://xiemala.com/ruilisi/SpaceVim.git
|
|
git pull --rebase
|
|
)
|
|
end
|
|
|
|
desc "Install tools which are necessary for developers"
|
|
task :install_tools do
|
|
if macos?
|
|
run %(
|
|
brew install proxychains-ng
|
|
)
|
|
else
|
|
run %(
|
|
apt install proxychains
|
|
)
|
|
end
|
|
end
|
|
|
|
desc "Prepare necessary components for spacevim/typescript"
|
|
task :prepare_spacevim_typescript do
|
|
run %(
|
|
pip install neovim
|
|
npm install -g neovim typescript
|
|
)
|
|
end
|
|
|
|
task :update do
|
|
Rake::Task["vundle_migration"].execute if needs_migration_to_vundle?
|
|
Rake::Task["install"].execute
|
|
# TODO: for now, we do the same as install. But it would be nice
|
|
# not to clobber zsh files
|
|
end
|
|
|
|
task :sync do
|
|
vundle_path = File.join("vim", "bundle", "vundle")
|
|
unless File.exist?(vundle_path)
|
|
run %(
|
|
cd $HOME/.yadr
|
|
git clone https://github.com/gmarik/vundle.git #{vundle_path}
|
|
)
|
|
end
|
|
end
|
|
|
|
task :submodule_init do
|
|
run %( git submodule update --init --recursive ) unless ENV["SKIP_SUBMODULES"]
|
|
end
|
|
|
|
desc "Init and update submodules."
|
|
task :submodules do
|
|
unless ENV["SKIP_SUBMODULES"]
|
|
puts "======================================================"
|
|
puts "Downloading YADR submodules...please wait"
|
|
puts "======================================================"
|
|
|
|
run %(
|
|
cd $HOME/.yadr
|
|
git submodule update --recursive
|
|
git clean -df
|
|
)
|
|
puts
|
|
end
|
|
end
|
|
|
|
task default: "install"
|
|
|
|
private
|
|
|
|
def run(cmd)
|
|
puts "[Running] #{cmd}"
|
|
`#{cmd}` unless ENV["DEBUG"]
|
|
end
|
|
|
|
def number_of_cores
|
|
cores = if macos?
|
|
run %( sysctl -n hw.ncpu )
|
|
else
|
|
run %( nproc )
|
|
end
|
|
puts
|
|
cores.to_i
|
|
end
|
|
|
|
def run_bundle_config
|
|
return unless system("which bundle")
|
|
|
|
bundler_jobs = number_of_cores - 1
|
|
puts "======================================================"
|
|
puts "Configuring Bundlers for parallel gem installation"
|
|
puts "======================================================"
|
|
run %( bundle config --global jobs #{bundler_jobs} )
|
|
puts
|
|
end
|
|
|
|
def install_rvm_binstubs
|
|
puts "======================================================"
|
|
puts "Installing RVM Bundler support. Never have to type"
|
|
puts "bundle exec again! Please use bundle --binstubs and RVM"
|
|
puts "will automatically use those bins after cd'ing into dir."
|
|
puts "======================================================"
|
|
run %( chmod +x $rvm_path/hooks/after_cd_bundler )
|
|
puts
|
|
end
|
|
|
|
def install_homebrew
|
|
run %(which brew)
|
|
unless $CHILD_STATUS.success?
|
|
puts "======================================================"
|
|
puts "Installing Homebrew, the OSX package manager...If it's"
|
|
puts "already installed, this will do nothing."
|
|
puts "======================================================"
|
|
run %{ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"}
|
|
end
|
|
|
|
puts
|
|
puts
|
|
puts "======================================================"
|
|
puts "Updating Homebrew."
|
|
puts "======================================================"
|
|
run %(brew update)
|
|
puts
|
|
puts
|
|
puts "======================================================"
|
|
puts "Installing Homebrew packages...There may be some warnings."
|
|
puts "======================================================"
|
|
run %(brew install zsh ctags git hub tmux reattach-to-user-namespace ripgrep ghi)
|
|
run %(brew install macvim --with-override-system-vim --with-lua --with-luajit)
|
|
puts
|
|
puts
|
|
end
|
|
|
|
def install_fonts
|
|
puts "======================================================"
|
|
puts "Installing patched fonts for Powerline/Lightline."
|
|
puts "======================================================"
|
|
run %( cp -f $HOME/.yadr/fonts/* $HOME/Library/Fonts ) if macos?
|
|
if linux?
|
|
run %( mkdir -p ~/.fonts && cp ~/.yadr/fonts/* ~/.fonts && fc-cache -vf ~/.fonts )
|
|
end
|
|
puts
|
|
end
|
|
|
|
def install_term_theme
|
|
puts "======================================================"
|
|
puts "Installing iTerm2 solarized theme."
|
|
puts "======================================================"
|
|
run %( /usr/libexec/PlistBuddy -c "Add :'Custom Color Presets':'Solarized Light' dict" ~/Library/Preferences/com.googlecode.iterm2.plist )
|
|
run %( /usr/libexec/PlistBuddy -c "Merge 'iTerm2/Solarized Light.itermcolors' :'Custom Color Presets':'Solarized Light'" ~/Library/Preferences/com.googlecode.iterm2.plist )
|
|
run %( /usr/libexec/PlistBuddy -c "Add :'Custom Color Presets':'Solarized Dark' dict" ~/Library/Preferences/com.googlecode.iterm2.plist )
|
|
run %( /usr/libexec/PlistBuddy -c "Merge 'iTerm2/Solarized Dark.itermcolors' :'Custom Color Presets':'Solarized Dark'" ~/Library/Preferences/com.googlecode.iterm2.plist )
|
|
|
|
# If iTerm2 is not installed or has never run, we can't autoinstall the profile since the plist is not there
|
|
unless File.exist?(File.join(ENV["HOME"], "/Library/Preferences/com.googlecode.iterm2.plist"))
|
|
puts "======================================================"
|
|
puts "To make sure your profile is using the solarized theme"
|
|
puts "Please check your settings under:"
|
|
puts "Preferences> Profiles> [your profile]> Colors> Load Preset.."
|
|
puts "======================================================"
|
|
return
|
|
end
|
|
|
|
# Ask the user which theme he wants to install
|
|
message = "Which theme would you like to apply to your iTerm2 profile?"
|
|
color_scheme = ask message, iTerm_available_themes
|
|
|
|
return if color_scheme == "None"
|
|
|
|
color_scheme_file = File.join("iTerm2", "#{color_scheme}.itermcolors")
|
|
|
|
# Ask the user on which profile he wants to install the theme
|
|
profiles = iTerm_profile_list
|
|
message = "I've found #{profiles.size} #{profiles.size > 1 ? "profiles" : "profile"} on your iTerm2 configuration, which one would you like to apply the Solarized theme to?"
|
|
profiles << "All"
|
|
selected = ask message, profiles
|
|
|
|
if selected == "All"
|
|
(profiles.size - 1).times { |idx| apply_theme_to_iterm_profile_idx idx, color_scheme_file }
|
|
else
|
|
apply_theme_to_iterm_profile_idx profiles.index(selected), color_scheme_file
|
|
end
|
|
end
|
|
|
|
def iTerm_available_themes
|
|
Dir["iTerm2/*.itermcolors"].map { |value| File.basename(value, ".itermcolors") } << "None"
|
|
end
|
|
|
|
def iTerm_profile_list
|
|
profiles = []
|
|
begin
|
|
profiles << `/usr/libexec/PlistBuddy -c "Print :'New Bookmarks':#{profiles.size}:Name" ~/Library/Preferences/com.googlecode.iterm2.plist 2>/dev/null`
|
|
end while $CHILD_STATUS.exitstatus == 0
|
|
profiles.pop
|
|
profiles
|
|
end
|
|
|
|
def ask(message, values)
|
|
puts message
|
|
while true
|
|
values.each_with_index { |val, idx| puts " #{idx + 1}. #{val}" }
|
|
selection = STDIN.gets.chomp
|
|
if (begin
|
|
Float(selection).nil?
|
|
rescue StandardError
|
|
true
|
|
end) || selection.to_i < 0 || selection.to_i > values.size + 1
|
|
puts "ERROR: Invalid selection.\n\n"
|
|
else
|
|
break
|
|
end
|
|
end
|
|
selection = selection.to_i - 1
|
|
values[selection]
|
|
end
|
|
|
|
def install_prezto
|
|
puts
|
|
puts "Installing Prezto (ZSH Enhancements)..."
|
|
|
|
run %( ln -nfs "$HOME/.yadr/zsh/prezto" "${ZDOTDIR:-$HOME}/.zprezto" )
|
|
|
|
# The prezto runcoms are only going to be installed if zprezto has never been installed
|
|
install_files(Dir.glob("zsh/prezto/runcoms/z*"), :symlink)
|
|
|
|
puts
|
|
puts "Overriding prezto ~/.zpreztorc with YADR's zpreztorc to enable additional modules..."
|
|
install_files(Dir.glob("zsh/prezto-override/z*"), :symlink)
|
|
|
|
puts
|
|
puts "Creating directories for your customizations"
|
|
run %( mkdir -p $HOME/.zsh.before )
|
|
run %( mkdir -p $HOME/.zsh.after )
|
|
run %( mkdir -p $HOME/.zsh.prompts )
|
|
|
|
if (ENV["SHELL"]).to_s.include? "zsh"
|
|
puts "Zsh is already configured as your shell of choice. Restart your session to load the new settings"
|
|
else
|
|
puts "Setting zsh as your default shell"
|
|
if File.exist?("/usr/local/bin/zsh")
|
|
if File.readlines("/private/etc/shells").grep("/usr/local/bin/zsh").empty?
|
|
puts "Adding zsh to standard shell list"
|
|
run %( echo "/usr/local/bin/zsh" | sudo tee -a /private/etc/shells )
|
|
end
|
|
run %( chsh -s /usr/local/bin/zsh )
|
|
else
|
|
run %( chsh -s /bin/zsh )
|
|
end
|
|
end
|
|
end
|
|
|
|
def want_to_install?(section)
|
|
if ENV["ASK"] == "true"
|
|
puts "Would you like to install configuration files for: #{section}? [y]es, [n]o"
|
|
STDIN.gets.chomp == "y"
|
|
else
|
|
true
|
|
end
|
|
end
|
|
|
|
def install_files(files, method = :symlink)
|
|
files.each do |f|
|
|
file = f.split("/").last
|
|
source = "#{ENV["PWD"]}/#{f}"
|
|
target = "#{ENV["HOME"]}/.#{file}"
|
|
|
|
puts "======================#{file}=============================="
|
|
puts "Source: #{source}"
|
|
puts "Target: #{target}"
|
|
|
|
if File.exist?(target) && (!File.symlink?(target) || (File.symlink?(target) && File.readlink(target) != source))
|
|
puts "[Overwriting] #{target}...leaving original at #{target}.backup..."
|
|
run %( mv "$HOME/.#{file}" "$HOME/.#{file}.backup" )
|
|
end
|
|
|
|
if method == :symlink
|
|
run %( ln -nfs "#{source}" "#{target}" )
|
|
else
|
|
run %( cp -f "#{source}" "#{target}" )
|
|
end
|
|
|
|
# Temporary solution until we find a way to allow customization
|
|
# This modifies zshrc to load all of yadr's zsh extensions.
|
|
# Eventually yadr's zsh extensions should be ported to prezto modules.
|
|
source_config_code = "for config_file ($HOME/.yadr/zsh/*.zsh) source $config_file"
|
|
if file == "zshrc"
|
|
File.open(target, "a+") do |zshrc|
|
|
if zshrc.readlines.grep(/#{Regexp.escape(source_config_code)}/).empty?
|
|
zshrc.puts(source_config_code)
|
|
end
|
|
end
|
|
end
|
|
|
|
puts "=========================================================="
|
|
puts
|
|
end
|
|
end
|
|
|
|
def needs_migration_to_vundle?
|
|
File.exist? File.join("vim", "bundle", "tpope-vim-pathogen")
|
|
end
|
|
|
|
def apply_theme_to_iterm_profile_idx(index, color_scheme_path)
|
|
values = []
|
|
16.times { |i| values << "Ansi #{i} Color" }
|
|
values << ["Background Color", "Bold Color", "Cursor Color", "Cursor Text Color", "Foreground Color", "Selected Text Color", "Selection Color"]
|
|
values.flatten.each { |entry| run %( /usr/libexec/PlistBuddy -c "Delete :'New Bookmarks':#{index}:'#{entry}'" ~/Library/Preferences/com.googlecode.iterm2.plist ) }
|
|
|
|
run %( /usr/libexec/PlistBuddy -c "Merge '#{color_scheme_path}' :'New Bookmarks':#{index}" ~/Library/Preferences/com.googlecode.iterm2.plist )
|
|
run %( defaults read com.googlecode.iterm2 )
|
|
end
|
|
|
|
def success_msg(action)
|
|
puts ""
|
|
puts " _ _ _ "
|
|
puts " | | | | | | "
|
|
puts " | |___| |_____ __| | ____ "
|
|
puts " |_____ (____ |/ _ |/ ___) "
|
|
puts " _____| / ___ ( (_| | | "
|
|
puts " (_______\_____|\____|_| "
|
|
puts ""
|
|
puts "YADR has been #{action}. Please restart your terminal and vim."
|
|
end
|