about summary refs log tree commit diff
path: root/configs
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2016-11-16T20·13-0500
committerWilliam Carroll <wpcarro@gmail.com>2016-11-16T20·13-0500
commit338d3f7b444bb712662a92e7132d392c0f47a167 (patch)
tree6eb4df47f16d3469ed1213b7facc2f08fe8b5f1a /configs
parenta69a30792fa1213e9da5a7a15539228d826d8ec4 (diff)
parentc5a96b49b7a12b52cf9bfdeb4663c6272e093adc (diff)
Merge branch 'develop'
Diffstat (limited to 'configs')
-rw-r--r--configs/.ctags89
-rw-r--r--configs/.tmux.conf12
-rw-r--r--configs/.vimrc423
-rw-r--r--configs/.zsh_profile6
-rwxr-xr-xconfigs/setup_configs.sh69
5 files changed, 561 insertions, 38 deletions
diff --git a/configs/.ctags b/configs/.ctags
new file mode 100644
index 000000000000..7899e7a21960
--- /dev/null
+++ b/configs/.ctags
@@ -0,0 +1,89 @@
+--recurse=yes
+--exclude=.git
+--exclude=vendor/
+--exclude=node_modules
+--exclude=db
+--exclude=log
+--exclude=tmp
+
+
+--regex-ruby=/.*alias(_method)?[[:space:]]+:([[:alnum:]_=!?]+),?[[:space:]]+:([[:alnum:]_=!]+)/\2/f,function/
+--regex-ruby=/(^|[:;])[ \t]*([A-Z][[:alnum:]_]+) *=/\2/c,class,constant/
+--regex-ruby=/(^|;)[ \t]*(has_many|belongs_to|has_one|has_and_belongs_to_many)\(? *:([[:alnum:]_]+)/\3/f,function,association/
+--regex-ruby=/(^|;)[ \t]*(named_)?scope\(? *:([[:alnum:]_]+)/\3/f,function,named_scope/
+--regex-ruby=/(^|;)[ \t]*expose\(? *:([[:alnum:]_]+)/\2/f,function,exposure/
+--regex-ruby=/(^|;)[ \t]*event\(? *:([[:alnum:]_]+)/\2/f,function,aasm_event/
+--regex-ruby=/(^|;)[ \t]*event\(? *:([[:alnum:]_]+)/\2!/f,function,aasm_event/
+--regex-ruby=/(^|;)[ \t]*event\(? *:([[:alnum:]_]+)/\2?/f,function,aasm_event/
+
+--langmap=Ruby:+(Rakefile)
+
+--langdef=js
+--langmap=js:.js
+--langmap=js:+.jsx
+
+--regex-js=/[ \t.]([A-Z][A-Z0-9._$]+)[ \t]*[=:][ \t]*([0-9"'\[\{]|null)/\1/n,constant/
+
+--regex-js=/\.([A-Za-z0-9._$]+)[ \t]*=[ \t]*\{/\1/o,object/
+--regex-js=/['"]*([A-Za-z0-9_$]+)['"]*[ \t]*:[ \t]*\{/\1/o,object/
+--regex-js=/([A-Za-z0-9._$]+)\[["']([A-Za-z0-9_$]+)["']\][ \t]*=[ \t]*\{/\1\.\2/o,object/
+
+--regex-js=/([A-Za-z0-9._$]+)[ \t]*=[ \t]*\(function\(\)/\1/c,class/
+--regex-js=/['"]*([A-Za-z0-9_$]+)['"]*:[ \t]*\(function\(\)/\1/c,class/
+--regex-js=/class[ \t]+([A-Za-z0-9._$]+)[ \t]*/\1/c,class/
+--regex-js=/([A-Za-z$][A-Za-z0-9_$()]+)[ \t]*=[ \t]*[Rr]eact.createClass[ \t]*\(/\1/c,class/
+--regex-js=/([A-Z][A-Za-z0-9_$]+)[ \t]*=[ \t]*[A-Za-z0-9_$]*[ \t]*[{(]/\1/c,class/
+--regex-js=/([A-Z][A-Za-z0-9_$]+)[ \t]*:[ \t]*[A-Za-z0-9_$]*[ \t]*[{(]/\1/c,class/
+
+--regex-js=/([A-Za-z$][A-Za-z0-9_$]+)[ \t]*=[ \t]*function[ \t]*\(/\1/f,function/
+
+--regex-js=/(function)*[ \t]*([A-Za-z$_][A-Za-z0-9_$]+)[ \t]*\([^)]*\)[ \t]*\{/\2/f,function/
+--regex-js=/['"]*([A-Za-z$][A-Za-z0-9_$]+)['"]*:[ \t]*function[ \t]*\(/\1/m,method/
+--regex-js=/([A-Za-z0-9_$]+)\[["']([A-Za-z0-9_$]+)["']\][ \t]*=[ \t]*function[ \t]*\(/\2/m,method/
+
+
+--langdef=haskell
+--langmap=haskell:.hs
+--regex-haskell=/^module[ \t]*([A-Z][a-zA-Z0-9'_.]*)/\1/m,module/
+--regex-haskell=/^(new)?type[ \t]*([A-Z][a-zA-Z0-9'_]*)./\2/t,type/
+--regex-haskell=/^class[ \t]*([A-Z][a-zA-Z0-9'_]*)/\1/c,class/
+--regex-haskell=/^data[ \t]*([A-Z][a-zA-Z0-9'_]*)/\1/d,data/
+--regex-haskell=/^([a-z_][a-zA-Z0-9'_]*).*=/\1/v,function/
+
+--langmap=C++:+.mm
+
+--langdef=golang
+--langmap=golang:.go
+--regex-golang=/func([ \t]+\([^)]+\))?[ \t]+([a-zA-Z0-9_]+)/\2/d,func/
+--regex-golang=/var[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/d,var/
+--regex-golang=/type[ \t]+([a-zA-Z_][a-zA-Z0-9_]+)/\1/d,type/
+
+--langdef=Rust
+--langmap=Rust:.rs
+--regex-Rust=/^[ \t]*(#\[[^\]]\][ \t]*)*(pub[ \t]+)?(extern[ \t]+)?("[^"]+"[ \t]+)?(unsafe[ \t]+)?fn[ \t]+([a-zA-Z0-9_]+)/\6/f,functions,function definitions/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?type[ \t]+([a-zA-Z0-9_]+)/\2/T,types,type definitions/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?enum[ \t]+([a-zA-Z0-9_]+)/\2/g,enum,enumeration names/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?struct[ \t]+([a-zA-Z0-9_]+)/\2/s,structure names/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?mod[ \t]+([a-zA-Z0-9_]+)/\2/m,modules,module names/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?static[ \t]+([a-zA-Z0-9_]+)/\2/c,consts,static constants/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?trait[ \t]+([a-zA-Z0-9_]+)/\2/t,traits,traits/
+--regex-Rust=/^[ \t]*(pub[ \t]+)?impl([ \t\n]*<[^>]*>)?[ \t]+(([a-zA-Z0-9_:]+)[ \t]*(<[^>]*>)?[ \t]+(for)[ \t]+)?([a-zA-Z0-9_]+)/\4 \6 \7/i,impls,trait implementations/
+--regex-Rust=/^[ \t]*macro_rules![ \t]+([a-zA-Z0-9_]+)/\1/d,macros,macro definitions/
+
+--langdef=typescript
+--langmap=typescript:.ts
+--regex-typescript=/^[ \t]*(export)?[ \t]*class[ \t]+([a-zA-Z0-9_]+)/\2/c,classes/
+--regex-typescript=/^[ \t]*(export)?[ \t]*module[ \t]+([a-zA-Z0-9_]+)/\2/n,modules/
+--regex-typescript=/^[ \t]*(export)?[ \t]*function[ \t]+([a-zA-Z0-9_]+)/\2/f,functions/
+--regex-typescript=/^[ \t]*export[ \t]+var[ \t]+([a-zA-Z0-9_]+)/\1/v,variables/
+--regex-typescript=/^[ \t]*var[ \t]+([a-zA-Z0-9_]+)[ \t]*=[ \t]*function[ \t]*\(\)/\1/v,varlambdas/
+--regex-typescript=/^[ \t]*(export)?[ \t]*(public|private)[ \t]+(static)?[ \t]*([a-zA-Z0-9_]+)/\4/m,members/
+--regex-typescript=/^[ \t]*(export)?[ \t]*interface[ \t]+([a-zA-Z0-9_]+)/\2/i,interfaces/
+--regex-typescript=/^[ \t]*(export)?[ \t]*enum[ \t]+([a-zA-Z0-9_]+)/\2/e,enums/
+--regex-typescript=/^[ \t]*import[ \t]+([a-zA-Z0-9_]+)/\1/I,imports/
+
+--langdef=elm
+--langmap=elm:.elm
+--regex-elm=/^module[ \t]*([A-Z][a-zA-Z0-9'_.]*)/\1/m,module/
+--regex-elm=/^type[ \t]*([A-Z][a-zA-Z0-9'_]*)./\1/t,type/
+--regex-elm=/^([a-z_][a-zA-Z0-9'_]*).*=/\1/v,function/
diff --git a/configs/.tmux.conf b/configs/.tmux.conf
index 04b210c12f55..904c95892c53 100644
--- a/configs/.tmux.conf
+++ b/configs/.tmux.conf
@@ -1,17 +1,25 @@
-set -g default-terminal "screen-256color"
-set -g mouse on
+source-file "${HOME}/makersquare/tmux-themepack/powerline/block/green.tmuxtheme"
+
+unbind C-b
+set -g prefix C-a
+bind C-a send-prefix
+
 
 bind-key -r -T prefix k select-pane -U
 bind-key -r -T prefix j select-pane -D
 bind-key -r -T prefix h select-pane -L
 bind-key -r -T prefix l select-pane -R
 
+
 bind-key -r -T prefix C-k resize-p -U 2
 bind-key -r -T prefix C-j resize-p -D 2
 bind-key -r -T prefix C-h resize-p -L 2
 bind-key -r -T prefix C-l resize-p -R 2
 
+
 bind % split-window -c "#{pane_current_path}"
 bind '"' split-window -h -c "#{pane_current_path}"
 bind c new-window -c "#{pane_current_path}"
 
+set -g default-terminal "tmux"
+
diff --git a/configs/.vimrc b/configs/.vimrc
new file mode 100644
index 000000000000..b5bb7241c009
--- /dev/null
+++ b/configs/.vimrc
@@ -0,0 +1,423 @@
+" -- BEGIN: Vundle config --
+set nocompatible              " be iMproved, required
+filetype off                  " required
+
+" set the runtime path to include Vundle and initialize
+set rtp+=~/.vim/bundle/Vundle.vim
+call vundle#begin()
+" alternatively, pass a path where Vundle should install plugins
+"call vundle#begin('~/some/path/here')
+
+" let Vundle manage Vundle, required
+Plugin 'VundleVim/Vundle.vim'
+
+" The following are examples of different formats supported.
+" Keep Plugin commands between vundle#begin/end.
+
+" Displays git information in airline.
+Plugin 'tpope/vim-fugitive'
+
+Plugin 'Raimondi/delimitMate'
+
+" Autocompletion
+Plugin 'Valloric/YouCompleteMe'
+
+" Displays git-tracked C*UD ops within gutter.
+Plugin 'airblade/vim-gitgutter'
+Plugin 'kien/ctrlp.vim'
+Plugin 'mileszs/ack.vim'
+Plugin 'pangloss/vim-javascript'
+Plugin 'scrooloose/nerdtree'
+Plugin 'scrooloose/syntastic'
+
+" Syntax Highlighting Support
+Plugin 'lambdatoast/elm.vim'
+
+" Themes
+Plugin 'sickill/vim-monokai'
+Plugin 'altercation/vim-colors-solarized'
+
+" Executes shell commands and pipes output into new Vim buffer.
+Plugin 'sjl/clam.vim'
+
+" Multiple cursors for simultaneous edits.
+" NOTE: use <C-n> to run miltiple cursors not <C-d>
+Plugin 'terryma/vim-multiple-cursors'
+
+" Visualize buffers
+Plugin 'vim-airline/vim-airline'
+Plugin 'vim-airline/vim-airline-themes'
+
+
+call vundle#end()            " required
+filetype plugin indent on    " required
+" Put your non-Plugin stuff after this line
+" -- END: Vundle config --
+
+
+" Airline Settings
+" Enables the list of buffers.
+let g:airline#extensions#tabline#enabled = 1
+
+" Shows the filename only.
+let g:airline#extensions#tabline#fnamemod = ':t'
+
+" Allow glyphs in airline
+let g:airline_powerline_fonts = 1
+
+
+" It's the twenty-first century...no swaps.
+set noswapfile
+
+
+" Allow visual tab completion in command mode
+set wildmenu
+
+
+" Show Vim commands as they're being input.
+set showcmd
+
+
+" Code folding
+set foldmethod=indent
+set foldnestmax=10
+set nofoldenable
+set foldlevel=4
+
+
+" Use relative line numbers
+set relativenumber
+
+
+" Opens all folds within the buffer
+nnoremap ZZ zR
+
+" Closes all folds within the buffer
+nnoremap zz zM
+
+" Opens all folds beneath the cursor
+" NOTE: j is the character to go down
+nnoremap zJ zO
+
+" Opens single fold beneath the cursor
+" NOTE: j is the character to go down
+nnoremap zj zo
+
+" Opens single fold beneath the cursor
+" NOTE: k is the character to go down
+nnoremap zK zC
+
+" Opens single fold beneath the cursor
+" NOTE: k is the character to go down
+nnoremap zk zc
+
+
+" Changes <leader> to <space> character.
+let mapleader = " "
+
+
+" Supports mouse interaction.
+set mouse=a
+
+
+" Highlights matches during a search.
+set hlsearch
+
+nnoremap <leader>/ :set hlsearch!<CR>
+
+
+" Use custom-made snippets.
+nnoremap ,jsfn :-1read $HOME/.vim/function_skeleton.js<CR>o
+
+
+" backspace settings
+set backspace=2
+set backspace=indent,eol,start
+
+
+" Javascript specific variables
+let g:javascript_plugin_jsdoc = 1
+
+" GlobalListchars
+set list
+set listchars=eol:¶,trail:~,nbsp:␣
+
+
+" Keeps everything concealed at all times. Even when cursor is on the word.
+set conceallevel=1
+set concealcursor=nvic
+
+" JavaScript thanks to pangloss/vim-javascript
+" let g:javascript_conceal_function = "ƒ"
+" match ErrorMsg /ƒ/
+
+
+" Ultisnips
+" Track the engine.
+Plugin 'SirVer/ultisnips'
+
+" Snippets are separated from the engine. Add this if you want them:
+Plugin 'honza/vim-snippets'
+
+" Trigger configuration. Do not use <tab> if you use https://github.com/Valloric/YouCompleteMe.
+let g:UltiSnipsExpandTrigger="<c-x>"
+" let g:UltiSnipsJumpForwardTrigger="<c-j>"
+" let g:UltiSnipsJumpBackwardTrigger="<c-k>"
+
+
+" map jk to <Esc>
+inoremap jk <Esc>
+
+
+" Conventional Emacs line-editor defaults
+inoremap <C-a> <Esc>I
+inoremap <C-e> <Esc>A
+
+
+" Manage Vertical and Horizontal splits
+nnoremap vs <Esc>:vs<CR>
+nnoremap vv <Esc>:vs<CR>
+nnoremap sp <Esc>:sp<CR>
+nnoremap ss <Esc>:sp<CR>
+
+
+" Move around splits with <leader>
+nnoremap <leader>h <C-w>h
+nnoremap <leader>j <C-w>j
+nnoremap <leader>k <C-w>k
+nnoremap <leader>l <C-w>l
+nnoremap <leader>q <C-w>q
+
+
+" Fuzzy-find open buffer via CtrlP
+nnoremap <leader>bg :CtrlPBuffer<CR>
+
+
+" Buffer creation and management
+" Buffer movement
+nnoremap <C-l> :1bnext<CR>
+nnoremap <C-h> :1bprevious<CR>
+
+" Buffer creation
+nnoremap <C-t> :enew<CR>
+
+" Buffer deletion
+nnoremap <leader>bq :bp <BAR> bd #<CR>
+
+
+" make Y do what is intuitive given: 
+"   D: deletes until EOL
+"   C: changes until EOL
+"   Y: (should) yank until EOL
+nnoremap Y y$
+
+
+" flip number keys to their shift+ counterparts
+nnoremap t1 t!
+nnoremap t2 t@
+nnoremap t3 t#
+nnoremap t4 t$
+nnoremap t5 t%
+nnoremap t6 t^
+nnoremap t7 t&
+nnoremap t8 t*
+nnoremap t9 t(
+nnoremap t0 t)
+
+nnoremap T1 T!
+nnoremap T2 T@
+nnoremap T3 T#
+nnoremap T4 T$
+nnoremap T5 T%
+nnoremap T6 T^
+nnoremap T7 T&
+nnoremap T8 T*
+nnoremap T9 T(
+nnoremap T0 T)
+
+nnoremap f1 f!
+nnoremap f2 f@
+nnoremap f3 f#
+nnoremap f4 f$
+nnoremap f5 f%
+nnoremap f6 f^
+nnoremap f7 f&
+nnoremap f8 f*
+nnoremap f9 f(
+nnoremap f0 f)
+
+nnoremap F1 F!
+nnoremap F2 F@
+nnoremap F3 F#
+nnoremap F4 F$
+nnoremap F5 F%
+nnoremap F6 F^
+nnoremap F7 F&
+nnoremap F8 F*
+nnoremap F9 F(
+nnoremap F0 F)
+
+
+" Karate edits
+nnoremap ca9 ca(
+nnoremap da9 da(
+nnoremap va9 va(
+
+nnoremap ca0 ca)
+nnoremap da0 da)
+nnoremap va0 va)
+
+nnoremap ci9 ci(
+nnoremap di9 di(
+nnoremap vi9 vi(
+
+nnoremap ci0 ci)
+nnoremap di0 di)
+nnoremap vi0 vi)
+
+
+" scrolling and maintaing mouse position
+nnoremap <C-j> j<C-e>
+nnoremap <C-k> k<C-y>
+
+
+" reload file after git changes
+nnoremap <C-r> :e<CR>
+
+
+" -- Syntastic Settings --
+set statusline+=%#warningmsg#
+set statusline+=%{SyntasticStatuslineFlag()}
+set statusline+=%*
+
+let g:syntastic_always_populate_loc_list = 1
+let g:syntastic_auto_loc_list = 1
+let g:syntastic_check_on_open = 1
+let g:syntastic_check_on_wq = 1
+let g:syntastic_javascript_checkers = ['gjslint']
+
+
+" Basic settings
+set number
+set tabstop=2
+set expandtab
+set shiftwidth=2
+
+syntax enable
+set background=dark
+colorscheme solarized
+
+set t_Co=255
+
+
+" Support italics
+highlight Comment cterm=italic
+
+
+" Define highlighting groups
+" NOTE: The ANSII aliases for colors will change when iTerm2 settings are
+" changed.
+highlight InterestingWord1 ctermbg=Magenta ctermfg=Black
+highlight InterestingWord2 ctermbg=Blue ctermfg=Black
+
+" h1 highlighting
+nnoremap <silent> <leader>1 :execute '2match InterestingWord1 /\<<c-r><c-w>\>/'<CR>
+nnoremap <silent> <leader>x1 :execute '2match none'<CR>
+
+" h2 highlighting
+nnoremap <silent> <leader>2 :execute '3match InterestingWord2 /\<<c-r><c-w>\>/'<CR>
+nnoremap <silent> <leader>x2 :execute '3match none'<CR>
+
+"clear all highlighted groups
+nnoremap <silent> <leader>xx :execute '2match none'<CR> :execute '3match none'<CR> hh
+
+
+" pasteboard copy & paste
+nnoremap <C-c> V"+y
+vnoremap <C-c> "+y
+
+inoremap <C-v> <Esc>"+pa
+nnoremap <C-v> o<Esc>"+p
+vnoremap <C-v> "+p
+
+
+" Manage 80 char line limits
+highlight OverLength ctermbg=White ctermfg=Black
+match OverLength /\%81v.\+/
+set wrap!
+
+
+" Toggle word-wrapping
+nnoremap <leader>w :set wrap!<CR>
+
+
+" Resize split to 10,20,...,100 chars
+" Uncomment the next lines for support at those sizes.
+" These bindings interfere with the highlight groups, however.
+" Increases the width of a vertical split.
+" nnoremap <leader>1 :vertical resize 10<CR>
+" nnoremap <leader>2 :vertical resize 20<CR>
+nnoremap <leader>3 :vertical resize 30<CR>
+nnoremap <leader>4 :vertical resize 40<CR>
+nnoremap <leader>5 :vertical resize 50<CR>
+nnoremap <leader>6 :vertical resize 60<CR>
+nnoremap <leader>7 :vertical resize 70<CR>
+nnoremap <leader>8 :vertical resize 80<CR>
+nnoremap <leader>9 :vertical resize 90<CR>
+nnoremap <leader>0 :vertical resize 100<CR>
+
+
+" Increases the height of a horizontal split.
+nnoremap <leader>v1 :resize 5<CR>
+nnoremap <leader>v2 :resize 10<CR>
+nnoremap <leader>v3 :resize 15<CR>
+nnoremap <leader>v4 :resize 20<CR>
+nnoremap <leader>v5 :resize 25<CR>
+nnoremap <leader>v6 :resize 30<CR>
+nnoremap <leader>v7 :resize 35<CR>
+nnoremap <leader>v8 :resize 40<CR>
+
+
+" NERDTree settings
+" Show hidden files by default. (Toggle with capital 'i')
+let NERDTreeShowHidden=1
+
+" View Directory tree with ctrl + \
+nnoremap <C-\> :NERDTreeToggle<CR>
+
+" View open buffer location in tree.
+nnoremap <C-o> :NERDTreeFind<CR>
+
+
+" BOL and EOL
+nnoremap H ^
+vnoremap H ^
+nnoremap L $
+vnoremap L $
+
+
+" trim trailing whitespace on save
+autocmd BufWritePre *.{js,py,tpl,less,html} :%s/\s\+$//e
+
+
+" set default font and size
+set guifont=Operator\ Mono:h16
+
+
+" CtrlP Config.
+set runtimepath^=~/.vim/bundle/ctrlp.vim
+" let g:ctrlp_map = '<c-p>'
+let g:ctrlp_cmd = 'CtrlP'
+
+" Maps CtrlP to leader to future-proof config.
+nnoremap <leader>p :CtrlP<CR>
+
+" Fuzzy-finds files within cwd.
+" nnoremap <leader>pf :CtrlP<CR>
+
+" Ignores dirs and files
+let g:ctrlp_custom_ignore = {
+  \ 'dir':  'node_modules',
+  \ 'file': '\v\.(exe|dll|png|jpg|jpeg)$'
+\}
+
diff --git a/configs/.zsh_profile b/configs/.zsh_profile
index 26da66d00ccb..f80664afcd88 100644
--- a/configs/.zsh_profile
+++ b/configs/.zsh_profile
@@ -24,7 +24,7 @@ source $HOME/pc_settings/scripts/setup_keybindings.sh
 # BEGIN: bindkeys
 bindkey "^R" history-incremental-search-backward
 
-bindkey -M viins 'jj' vi-cmd-mode
+bindkey -M viins 'jk' vi-cmd-mode
 # END: bindkeys
 
 # export docker env variables
@@ -39,3 +39,7 @@ bindkey -M viins 'jj' vi-cmd-mode
 # brew install zsh-syntax-highlighting
 source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
 
+# Regain control of CLI <C- mappings for vim keybindings
+# RE: http://superuser.com/questions/588846/cannot-get-vim-to-remap-ctrls-to-w
+stty -ixon
+
diff --git a/configs/setup_configs.sh b/configs/setup_configs.sh
index e1a742c4b199..02d863277f2b 100755
--- a/configs/setup_configs.sh
+++ b/configs/setup_configs.sh
@@ -1,39 +1,38 @@
 #!/usr/bin/env bash
 
 
-# .zsh_profile
-if [ -f "$HOME"/.zsh_profile ] && [ ! -L "$HOME"/.zsh_profile ]; then
-    # backup .zsh_profile
-    echo -n "Backing up .zsh_profile ... " && \
-    mv "$HOME"/.zsh_profile "$HOME"/.zsh_profile.bak && \
-    echo "Done."
-fi
-
-if [ -L "$HOME"/.zsh_profile ]; then
-    # TODO: make sure that .zsh_profile is symlinked to the correct location.
-    echo ".zsh_profile is already symlinked."
-else
-    # create symlink to pc_settings .zsh_profile
-    echo -n "Symlinking to pc_settings/configs/.zsh_profile ... " && \
-    ln -s "$HOME"/pc_settings/configs/.zsh_profile "$HOME"/.zsh_profile && \
-    echo "Done."
-fi
-
-
-# backup .tmux.conf
-if [ -f "$HOME"/.tmux.conf ] && [ ! -L "$HOME"/.tmux.conf ]; then
-    echo -n "Backing up .tmux.conf ... " && \
-    mv "$HOME"/.tmux.conf "$HOME"/.tmux.conf.bak && \
-    echo "Done."
-fi
-
-if [ -L "$HOME"/.tmux.conf ]; then
-    # TODO: make sure that .tmux.conf is symlinked to the correct location.
-    echo ".tmux.conf is already symlinked."
-else
-    # create symlink to pc_settings .tmux.conf
-    echo -n "Symlinking to pc_settings/configs/.tmux.conf ... " && \
-    ln -s "$HOME"/pc_settings/configs/.tmux.conf "$HOME"/.tmux.conf && \
-    echo "Done."
-fi
+pc_settings_path="$HOME/pc_settings"
+
+
+config_files=( \
+  ".zsh_profile" \
+  ".tmux.conf" \
+  ".ctags" \
+  ".vimrc" \
+)
+
+
+for i in {0..3}; do
+    cf="${config_files[i]}"
+    echo "\"$cf\": "
+
+    if [ -f "$HOME/$cf" ] && [ ! -L "$HOME/$cf" ]; then
+        echo -n "Backing up $cf ... " && \
+        mv "$HOME/$cf" "$HOME/$cf.bak" && \
+        echo "Done."
+    fi
+
+    if [ -L "$HOME/$cf" ]; then
+        if [ $(readlink "$HOME/$cf") = "$pc_settings_path/configs/$cf" ]; then
+            echo "Already properly symlinked to \"$pc_settings_path/configs\"."
+        else
+            echo "Already symlinked but NOT to the proper location. Aborting..."
+        fi
+    else
+        echo -n "Symlinking to $pc_settings_path/configs/$cf ... " && \
+        ln -s "$pc_settings_path/configs/$cf" "$HOME/$cf" && \
+        echo "Done."
+    fi
+    echo ""
+done