From db059d115b6249c5dd2ffa740b78f3dda6d32b84 Mon Sep 17 00:00:00 2001 From: Daniel Flanagan Date: Wed, 8 Feb 2017 11:54:30 -0600 Subject: [PATCH] x startup scripts, arch provisioning and scripts, setup script, more shell work, neovim config --- de/xinitrc | 5 +- de/xloadresources | 8 +- de/xprofile | 8 +- .../arch-linux/provisioning/0-adduser.bash | 10 + .../arch-linux/provisioning/1-pacaur.bash | 29 ++ .../arch-linux/provisioning/2-essentials.bash | 41 ++ .../arch-linux/provisioning/3-extras.bash | 18 + .../arch-linux/provisioning/nvidia.bash | 5 + .../arch-linux/provisioning/tmux-plugins.bash | 4 + .../arch-linux/scripts/get-colors.bash | 9 + os-specific/arch-linux/scripts/get-fonts.bash | 22 + setup | 25 +- shell/aliases | 3 + shell/bashrc | 6 + text-editor/neovim/init.vim | 444 ++++++++++++++++++ 15 files changed, 619 insertions(+), 18 deletions(-) mode change 100644 => 100755 de/xloadresources create mode 100755 os-specific/arch-linux/provisioning/0-adduser.bash create mode 100755 os-specific/arch-linux/provisioning/1-pacaur.bash create mode 100755 os-specific/arch-linux/provisioning/2-essentials.bash create mode 100755 os-specific/arch-linux/provisioning/3-extras.bash create mode 100755 os-specific/arch-linux/provisioning/nvidia.bash create mode 100755 os-specific/arch-linux/provisioning/tmux-plugins.bash create mode 100644 os-specific/arch-linux/scripts/get-colors.bash create mode 100644 os-specific/arch-linux/scripts/get-fonts.bash create mode 100644 text-editor/neovim/init.vim diff --git a/de/xinitrc b/de/xinitrc index 22d3334..603dfb0 100644 --- a/de/xinitrc +++ b/de/xinitrc @@ -3,6 +3,9 @@ # as far as I can tell, this file is only executed when you run startx from the # TTY +echo '' > "$HOME/.xstartup_log" +echo "xinitrc" >> "$HOME/.xstartup_log" + # load our xprofile if [ -f "$HOME/.xprofile" ]; then source "$HOME/.xprofile" @@ -27,4 +30,4 @@ if command -v compton >/dev/null 2>&1; then fi # fire up wm -exec "$DOTFILES_PATH/env/wm/wmstart" +exec "$DOTFILES_PATH/de/wmstart" diff --git a/de/xloadresources b/de/xloadresources old mode 100644 new mode 100755 index 08d28ac..6ddcf05 --- a/de/xloadresources +++ b/de/xloadresources @@ -1,13 +1,13 @@ #!/usr/bin/env bash +echo "xloadresources" >> "$HOME/.xstartup_log" + +sysresources="/etc/X11/xinit/.Xresources" +sysmodmap="/etc/X11/xinit/.Xmodmap" userresources="$HOME/.Xresources" usercolors="$HOME/.Xresources.colors" userenv="$HOME/.Xresources.env" usermodmap="$HOME/.Xmodmap" -sysresources="/etc/X11/xinit/.Xresources" -sysmodmap="/etc/X11/xinit/.Xmodmap" - -echo "xstartup: resources $userresources $userenv" >> "$HOME/.xstartup_log" if [ -f "$sysresources" ]; then xrdb -merge "$sysresources" >/dev/null 2>&1 diff --git a/de/xprofile b/de/xprofile index ae3c350..a534dac 100644 --- a/de/xprofile +++ b/de/xprofile @@ -7,12 +7,10 @@ if [[ -z "$DOTFILES_PATH" ]]; then export DOTFILES_PATH="$XDG_CONFIG_HOME/dotfiles" fi -if [ -f "$DOTFILES_PATH/env/x/xloadresources" ]; then - source "$DOTFILES_PATH/env/x/xloadresources" -fi +echo "xprofile ($DOTFILES_PATH)" >> "$HOME/.xstartup_log" -if [ -f "$DOTFILES_PATH/variables.bash" ]; then - source "$DOTFILES_PATH/variables.bash" +if [ -f "$DOTFILES_PATH/de/xloadresources" ]; then + source "$DOTFILES_PATH/de/xloadresources" fi # keyrepeat settings diff --git a/os-specific/arch-linux/provisioning/0-adduser.bash b/os-specific/arch-linux/provisioning/0-adduser.bash new file mode 100755 index 0000000..2eb7a10 --- /dev/null +++ b/os-specific/arch-linux/provisioning/0-adduser.bash @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +USERNAME=daniel + +groupadd admin 2>/dev/null +mkdir -p "/home/$USERNAME/usr" +useradd -m -d "/home/$USERNAME/usr" -G admin,users,wheel -s "/usr/bin/bash" "$USERNAME" +chown -R "$USERNAME:$USERNAME" "/home/$USERNAME" +echo "Setting password for user '$USERNAME'" +passwd "$USERNAME" diff --git a/os-specific/arch-linux/provisioning/1-pacaur.bash b/os-specific/arch-linux/provisioning/1-pacaur.bash new file mode 100755 index 0000000..2b5c932 --- /dev/null +++ b/os-specific/arch-linux/provisioning/1-pacaur.bash @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +# install the dependencies +sudo pacman -S git curl openssl perl expac yajl --noconfirm + +# receive cower's gpg key +gpg --recv-keys 1EB2638FF56C0C53 + +# setup a temporary place to install the packages from +REPOSITORY_PATH="/tmp/provisioning" +mkdir -p "$REPOSITORY_PATH" + +# clone the repositories +git clone https://aur.archlinux.org/cower.git "$REPOSITORY_PATH/cower" +git clone https://aur.archlinux.org/pacaur.git "$REPOSITORY_PATH/pacaur" + +# build and install cower +cd "$REPOSITORY_PATH/cower" +makepkg -i --noconfirm --noedit +cd - + +# build and install pacaur +cd "$REPOSITORY_PATH/pacaur" +makepkg -i --noconfirm --noedit +cd - + +# once installed, let the package manager manage itself and its dependencies +pacaur -S cower pacaur --noconfirm --noedit + diff --git a/os-specific/arch-linux/provisioning/2-essentials.bash b/os-specific/arch-linux/provisioning/2-essentials.bash new file mode 100755 index 0000000..924f79f --- /dev/null +++ b/os-specific/arch-linux/provisioning/2-essentials.bash @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +sudo pacman -S \ + tree \ + rofi \ + slock \ + the_silver_searcher \ + alsa-utils \ + htop \ + openssh \ + openssl \ + ruby \ + python python-pip \ + pass \ + qutebrowser \ + bash-completion \ + fzf \ + rsync \ + pavucontrol \ + neovim \ + vim \ + unzip \ + xsel \ + xclip \ + tmux \ + rxvt-unicode \ + xorg-xinit xorg-server xorg-xrdb \ + xcb-util xcb-util-keysyms xcb-util-wm xorg-xrandr xdotool feh \ + --noconfirm + +pacaur -S \ + urxvt-perls-git \ + samba \ + pulseaudio-ctl \ + alsa-plugins \ + unclutter-xfixes-git gtk-theme-arc gtk-engine-murrine xorg-server-devel \ + bspwm-git sxhkd-git xdo-git \ + --noconfirm --noedit + +# sudo ln -s /usr/bin/google-chrome-unstable /usr/bin/chrome + diff --git a/os-specific/arch-linux/provisioning/3-extras.bash b/os-specific/arch-linux/provisioning/3-extras.bash new file mode 100755 index 0000000..e842af4 --- /dev/null +++ b/os-specific/arch-linux/provisioning/3-extras.bash @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +pacaur -S \ + gtk-theme-arc \ + elementary-icon-theme \ + lemonbar-xft-git \ + thunar thunar-volman gvfs \ + thunar-shares-plugin \ + gvfs-smb \ + terminus-font ttf-monaco gohufont artwiz-fonts phallus-fonts-git \ + ttf-opensans ttf-dejavu \ + avr-libc avr-gcc dfu-programmer dfu-util \ + xorg-xbacklight \ + gimp \ + audacity + reptyr \ + cmake python2 python2-pip \ + --noconfirm --noedit diff --git a/os-specific/arch-linux/provisioning/nvidia.bash b/os-specific/arch-linux/provisioning/nvidia.bash new file mode 100755 index 0000000..b1cebc0 --- /dev/null +++ b/os-specific/arch-linux/provisioning/nvidia.bash @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +pacaur -S \ + nvidia-beta lib32-nvidia-beta \ + --noconfirm --noedit diff --git a/os-specific/arch-linux/provisioning/tmux-plugins.bash b/os-specific/arch-linux/provisioning/tmux-plugins.bash new file mode 100755 index 0000000..8cd10c3 --- /dev/null +++ b/os-specific/arch-linux/provisioning/tmux-plugins.bash @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +# tmux plugin manager +git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm diff --git a/os-specific/arch-linux/scripts/get-colors.bash b/os-specific/arch-linux/scripts/get-colors.bash new file mode 100644 index 0000000..0cd912f --- /dev/null +++ b/os-specific/arch-linux/scripts/get-colors.bash @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +get_color() +{ + XR_COLOR_DEF=$(grep "#define base$1 #" ~/.Xresources.colors) + echo ${XR_COLOR_DEF:16} +} +export -f get_color + diff --git a/os-specific/arch-linux/scripts/get-fonts.bash b/os-specific/arch-linux/scripts/get-fonts.bash new file mode 100644 index 0000000..daabe42 --- /dev/null +++ b/os-specific/arch-linux/scripts/get-fonts.bash @@ -0,0 +1,22 @@ +#!/usr/bin/env sh + +XRES_FILE="$HOME/.Xresources" +if [ -a "$HOME/.Xresources.env" ]; then + XRES_FILE="$HOME/.Xresources.env" +fi + +PRIMARY_FONT_XRESOURCES=$(grep "^\*font: xft:" "$XRES_FILE" | grep -v "/\*" | head -n 1) +export PRIMARY_FONT_FAMILY_WITH_SIZE=${PRIMARY_FONT_XRESOURCES:11} +export PRIMARY_FONT_FAMILY=$(echo $PRIMARY_FONT_FAMILY_WITH_SIZE | sed 's/\-.*//') +export PRIMARY_FONT_SIZE=$(echo $PRIMARY_FONT_FAMILY_WITH_SIZE | sed 's/.*\-//') + +SECONDARY_FONT_XRESOURCES=$(grep "^#define secondaryfont xft:" "$XRES_FILE" | grep -v "/\*" | head -n 1) +export SECONDARY_FONT_FAMILY_WITH_SIZE=${SECONDARY_FONT_XRESOURCES:26} +export SECONDARY_FONT_FAMILY=$(echo $SECONDARY_FONT_FAMILY_WITH_SIZE | sed 's/\-.*//') +export SECONDARY_FONT_SIZE=$(echo $SECONDARY_FONT_FAMILY_WITH_SIZE | sed 's/.*\-//') + +ICON_FONT_XRESOURCES=$(grep "^#define iconfont xft:" "$XRES_FILE" | grep -v "/\*" | head -n 1) +export ICON_FONT_FAMILY_WITH_SIZE=${ICON_FONT_XRESOURCES:21} +export ICON_FONT_FAMILY=$(echo $ICON_FONT_FAMILY_WITH_SIZE | sed 's/\-.*//') +export ICON_FONT_SIZE=$(echo $ICON_FONT_FAMILY_WITH_SIZE | sed 's/.*\-//') + diff --git a/setup b/setup index 49cca28..9b59f3f 100755 --- a/setup +++ b/setup @@ -28,16 +28,25 @@ else fi fi +# TODO: make sure we have an even number, here links=( - # desktop environment files - "$dfp/de/bspwmrc" "$XDG_CONFIG_HOME/bspwm/bspwmrc" - "$dfp/de/sxhkdrc" "$XDG_CONFIG_HOME/sxhkd/sxhkdrc" + # desktop environment files + "$dfp/de/bspwmrc" "$XDG_CONFIG_HOME/bspwm/bspwmrc" + "$dfp/de/sxhkdrc" "$XDG_CONFIG_HOME/sxhkd/sxhkdrc" + "$dfp/de/xresources" "$HOME/.Xresources" + "$dfp/de/xinitrc" "$HOME/.xinitrc" + "$dfp/de/xprofile" "$HOME/.xprofile" + "$dfp/common/colors/xresources" "$HOME/.Xresources.colors" - # shell files - "$dfp/shell/bashrc" "$HOME/.bashrc" - "$dfp/shell/bash_profile" "$HOME/.bash_profile" - "$dfp/shell/tmux.conf" "$HOME/.tmux.conf" - "$dfp/shell/tmux-layouts" "$HOME/.tmux/layouts" + # shell files + "$dfp/shell/bashrc" "$HOME/.bashrc" + "$dfp/shell/bash_profile" "$HOME/.bash_profile" + "$dfp/shell/tmux.conf" "$HOME/.tmux.conf" + "$dfp/shell/tmux-layouts" "$HOME/.tmux/layouts" + + # text editor files + "$dfp/text-editor/neovim" "$XDG_CONFIG_HOME/nvim" + "$dfp/common/colors/vim" "$XDG_CONFIG_HOME/nvim/colors/current.vim" ) source="" diff --git a/shell/aliases b/shell/aliases index 089e40d..c461847 100644 --- a/shell/aliases +++ b/shell/aliases @@ -57,6 +57,9 @@ alias gac="git add -A && git commit -m" # browser aliases alias qute="qutebrowser --backend webengine" +# TODO: use chrome-beta, then chrome, then chromium +alias chrome="google-chrome-beta" + # networking aliases alias p="ping 8.8.8.8" diff --git a/shell/bashrc b/shell/bashrc index 9af4e30..b14cbce 100644 --- a/shell/bashrc +++ b/shell/bashrc @@ -17,6 +17,12 @@ BASE16_SHELL="$DOTFILES_PATH/common/colors/shell" # disable ctrl-s terminal freeze [[ $- == *i* ]] && stty -ixon +# import the fonts we're using so we can pass them to other applications +source "$DOTFILES_PATH/common/scripts/get-fonts.bash" + +# import the functions that retrieve our theme colors +source "$DOTFILES_PATH/common/scripts/get-colors.bash" + # import our aliases source "$DOTFILES_PATH/shell/aliases" diff --git a/text-editor/neovim/init.vim b/text-editor/neovim/init.vim new file mode 100644 index 0000000..fcadd7d --- /dev/null +++ b/text-editor/neovim/init.vim @@ -0,0 +1,444 @@ +" initial plugin manager +if empty(glob('~/.config/nvim/autoload/plug.vim')) + silent !curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + autocmd VimEnter * PlugInstall +endif + +" tell vim to reload the init.vim file when it saves it +autocmd! BufWritePost init.vim source % + +" plugin build functions +function! BuildComposer(info) + if a:info.status != 'unchanged' || a:info.force + !cargo build --release + UpdateRemotePlugins + endif +endfunction + +function! DoRemote(arg) + UpdateRemotePlugins +endfunction + +" Initialize plugin manager +call plug#begin('~/.config/nvim/bundle') + +" let plugin manager manage itself +Plug 'junegunn/vim-plug' + + +" plugins + +" if vim is being launched to view man pages, don't do our magical session +" stuff! +if exists('asmanviewer') + let g:prosession_dir = '/dev/null' +else + Plug 'tpope/vim-obsession' " session ease-of-use + Plug 'dhruvasagar/vim-prosession' " more session ease-of-use + let g:prosession_dir = '~/.config/nvim/session/' +endif +Plug 'vim-airline/vim-airline' " statusline +" let g:airline_powerline_fonts = 0 +let g:airline#extensions#tabline#enabled = 1 " automatically displays all buffers when there's only one tab open +let g:airline#extensions#tabline#fnamemod = ':t' +" set laststatus=2 " always show statusline +" set noshowmode " hides default mode +let g:airline#extensions#tabline#left_sep = '' +let g:airline#extensions#tabline#left_alt_sep = '' +let g:airline_right_alt_sep = '' +let g:airline_right_sep = '' +let g:airline_left_alt_sep= '' +let g:airline_left_sep = '' +Plug 'vim-airline/vim-airline-themes' + +Plug 'scrooloose/nerdtree', {'on': ['NERDTreeToggle', 'NERDTree']} " nice sidebar for files +let g:NERDTreeDirArrowExpandable = ' ' +let g:NERDTreeDirArrowCollapsible = ' ' +autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif " close vim if last buffer is a NERD buffer + +Plug 'nathanaelkane/vim-indent-guides' " indentation guides (NOTE: doesn't seem to work with my colorscheme) +let g:indent_guides_start_level = 0 +let g:indent_guides_auto_color = 1 + +Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' } " autocomplete +let g:deoplete#enable_at_startup = 1 + +Plug 'scrooloose/syntastic' " syntax checker +Plug 'freitass/todo.txt-vim' " syntax checker +Plug 'bkad/CamelCaseMotion' " camel case and underscore word movements +Plug 'LargeFile' " gracefully handle very large files +Plug 'tpope/vim-commentary' " toggle comments in code easily +Plug 'tmux-plugins/vim-tmux-focus-events' " allow transitions within tmux +Plug 'christoomey/vim-tmux-navigator' " allow transitions within tmux +Plug 'tasklist.vim' " show tasks with leader,t +Plug 'godlygeek/tabular' " align text lines together +Plug 'dhruvasagar/vim-table-mode' " for creating and editing character tables +Plug 'lytedev/vim-superman' " view man pages with vim +Plug 'tpope/vim-surround' " quickly modify text surrounding objects +Plug 'tpope/vim-speeddating' " vim knows about date-like text objects +Plug 'michaeljsmith/vim-indent-object' " adds an indentation level text object +Plug 'wellle/targets.vim' " adds some more handy text objects +Plug 'ternjs/tern_for_vim', { 'do': 'npm install' } +Plug 'mikewest/vimroom' +Plug 'editorconfig/editorconfig-vim' " loads project-specific editor settings +let g:vimroom_sidebar_height = 0 + +Plug 'junegunn/fzf', {'dir': '~/.fzf', 'do': './install --all'} " fuzzy file finding +Plug 'junegunn/fzf.vim' " helpers for using fzf in vim +let g:fzf_layout = { 'window': 'enew' } + +" plugins for specific file types +Plug 'kchmck/vim-coffee-script', {'for': ['coffee', 'coffeescript', 'vue']} +Plug 'posva/vim-vue', {'for': ['vue']} +Plug 'elixir-lang/vim-elixir', {'for': ['elixir']} +Plug 'wavded/vim-stylus', {'for': ['styl', 'stylus', 'vue']} +Plug 'rust-lang/rust.vim', {'for': ['rs', 'rust']} +" Plug 'plasticboy/vim-markdown', {'for': ['md', 'markdown']} +" Plug 'euclio/vim-markdown-composer', { 'do': function('BuildComposer'), 'for': ['md', 'markdown'] } +Plug 'digitaltoad/vim-jade', {'for': ['pug', 'jade', 'vue']} +Plug 'freitass/todo.txt-vim', {'for': ['todo']} +Plug 'leafo/moonscript-vim', {'for': ['moon', 'moonscript']} +Plug 'evidens/vim-twig' +Plug 'leafgarland/typescript-vim', {'for': ['ts', 'typescript']} +Plug 'jwalton512/vim-blade', {'for': ['blade', 'blade.php']} + +call plug#end() + +filetype on +filetype indent on +filetype plugin on + +" language specific configuration + +" C +let c_space_errors = 1 +let c_comment_strings = 0 " dont highlight strings inside C comments + +" Python +let python_space_errors = 1 +" autocmd FileType python setl tabstop=4 expandtab shiftwidth=4 softtabstop=4 +" autocmd FileType js setl tabstop=2 expandtab shiftwidth=2 softtabstop=2 +" autocmd FileType vue setl tabstop=2 expandtab shiftwidth=2 softtabstop=2 +autocmd FileType php setl tabstop=4 expandtab shiftwidth=4 softtabstop=4 + +" Markdown +" autocmd BufNewFile,BufReadPost *.md setl filetype=markdown spell textwidth=0 wrapmargin=0 + +" Text +autocmd BufNewFile,BufReadPost *.txt setl spell textwidth=0 wrapmargin=0 + +" whitespace +set tabstop=2 +set shiftwidth=2 +set softtabstop=2 +set expandtab +set autoindent smartindent +set list +set nostartofline +set listchars=trail:ยท,tab:\ \ + +" look and feel + +set wrap +set linebreak +set breakindent +set textwidth=80 +set formatoptions=crql1j +" t autowrap to textwidth +" c autowrap comments to textwidth +" r autoinsert comment leader with +" q allow formatting of comments with gq +" l lines longer than 'textwidth' on insert do not get formatted +" 1 don't break a line after a one-letter word - break it before +" j where it makes sense, remove a comment leader when joining lines + +set title " handle window title +set synmaxcol=2048 +if exists('asmanviewer') + set nonumber " no line numbers when viewing a man page +else + set number " line numbers +endif +" set relativenumber +set cursorline " highlight the current line +" set cursorcolumn " highlight the current column +" let &colorcolumn=join(range(81,400),",") " colors columns past 80 +set showcmd +set nowildmenu +set wildmode=longest,list,full +set cpoptions-=$ +set showmatch +set mouse=a +set mousehide +set backspace=indent,eol,start +set ruler +set lazyredraw +set scrolloff=8 +set sidescrolloff=8 +set splitright +set splitbelow +set noerrorbells +set visualbell +set nobackup +set nowritebackup +set noswapfile +set timeout +set ttimeoutlen=200 +set isfname+=32 + +set vb t_vb= +if has('autocmd') + autocmd GUIEnter * set visualbell t_vb= +endif + +let base16colorspace=256 +set background=dark +colorscheme current + +fun! ShowSpaceIndentation() + hi WhiteSpaces ctermfg=black ctermbg=8 + match WhiteSpaces /^ \+/ +endfunction + +let s:distractionFreeMode = 0 +fun! DistractionFreeModeFunc() + AirlineToggle + VimroomToggle + if s:distractionFreeMode == 0 + let s:distractionFreeMode = 1 + set nocursorline + set laststatus=0 + set noshowmode + set noruler + set noshowcmd + set nonumber + hi NonText ctermfg=black guifg=black + else + let s:distractionFreeMode = 0 + set cursorline + set showmode + set ruler + set laststatus=2 + set showcmd + set number + hi NonText ctermfg=gray guifg=gray + endif +endfunction + +nnoremap mz :DistractionFreeMode + +:command! SpaceIndents call ShowSpaceIndentation() +:command! ShowSpaceIndents call ShowSpaceIndentation() +:command! DistractionFreeMode call DistractionFreeModeFunc() + +set hidden " allows buffer switching without saving +set shortmess=I +set history=1000 +set undofile +set undodir=$HOME/.config/nvim/undo +set undolevels=1000 +set undoreload=10000 + +set backupdir=$HOME/.config/nvim/backup +set directory=$HOME/.config/nvim/backup +set spellfile=$HOME/.config/nvim/spell/en.utf-8.add + +set ignorecase +set smartcase +set incsearch +set hlsearch +set wrapscan + +set foldmethod=syntax +set foldlevel=99 +set foldnestmax=10 +set nofoldenable +set foldlevelstart=1 + +if has('vim_starting') + set encoding=utf8 +endif +set autowrite +set autochdir +set autoread +set nomodeline + +" yank to OS clipboard +set clipboard+=unnamed + +" allows for manual and syntax folding... supposedly +augroup vimrc + au BufReadPre * setlocal foldmethod=indent + au BufWinEnter * if &fdm == 'indent' | setlocal foldmethod=manual | endif +augroup END + +" jump to last opened position in file +if has("autocmd") + au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif +endif + +" no empty buffer on startup +autocmd VimEnter * nested if bufname('')=='' && line('$') == 1 && col('$')==1 && !&modified | bd % | endif + +function! TerminalSplit() + let current_file = @% + echo current_file + if match(current_file, "term://*") != -1 + split + terminal + else + vsplit + vertical resize 80 + terminal + endif +endfunction + +" bindings + +" common typo fixes +command! WQ wq +command! Wq wq +command! Wqa wqa +command! W w +command! Q q + +" best leader +let mapleader = "\" + +" terminal mappings +" open a terminal split at 80 columns +nnoremap :call TerminalSplit() +tnoremap :call TerminalSplit() + +" close the terminal +tnoremap :q! + +" moving between terminal splits +tnoremap h +tnoremap j +tnoremap k +tnoremap l + +" enter insert mode when entering a terminal buffer +autocmd BufWinEnter,WinEnter term://* startinsert + +" change buffers with leader,tab +nnoremap :bnext +nnoremap :bprevious + +" don't kill vim +nnoremap K +nnoremap + +" nerdtree +nnoremap :NERDTree + +" run macro across visually selected lines +xnoremap @ :call ExecuteMacroOverVisualRange() +function! ExecuteMacroOverVisualRange() + echo "@".getcmdline() + execute ":'<,'>normal @".nr2char(getchar()) +endfunction + +" quick paragraph formatting +vmap Q gq +nmap Q gqap + +" launch fzf for the current git repo +nnoremap :GitFiles + +" launch fzf for files in the current directory +nnoremap :Files + +" launch fzf for files modified or not in git +nnoremap :GFiles? + +" launch fzf for open buffers (files) +nnoremap l :Buffers + +" switch to previous buffer +nnoremap h :b# + +" use leader j and k to switch buffers as well +nnoremap k :bnext +nnoremap j :bprevious +nnoremap :bnext +nnoremap :bprevious + +" fast word change +nnoremap c ciw +nnoremap C ciW + +" bash-like deletion +inoremap +inoremap + +" clear search higlight +nnoremap / :let @/ = "" + +" remap jk and kj to escape in insert mode +inoremap jj +inoremap Jj +inoremap Jj +inoremap JJ +inoremap jk +inoremap Jk +inoremap jK +inoremap JK + +" use hjkl-movement between rows when soft wrapping: +nnoremap j gj +nnoremap k gk +vnoremap j gj +vnoremap k gk + +" camel case movements +map ,w CamelCaseMotion_w +map ,b CamelCaseMotion_b +map ,e CamelCaseMotion_e +map ,ge CamelCaseMotion_ge + +" inner _ objects +omap ib CamelCaseMotion_ib +xmap ib CamelCaseMotion_ib +omap ie CamelCaseMotion_ie +xmap ie CamelCaseMotion_ie + +" a _ objects +omap aw CamelCaseMotion_aw +xmap aw CamelCaseMotion_aw +omap ab CamelCaseMotion_ab +xmap ab CamelCaseMotion_ab +omap ae CamelCaseMotion_ae +xmap ae CamelCaseMotion_ae + +" remove trailing whitespace: +map mw:%s/\s\+$//:let @/ = ""'w + +" close buffer: +nnoremap w :bd + +" toggle spell checking: +map :setlocal spell! + +" open urls, files, etc. example: http://google.com: +noremap o :!xdg-open + +" keep that dumb window from popping up +map q: :q +noremap qqq: q: + +" sane n/N behavior +nnoremap n 'Nn'[v:searchforward] +nnoremap N 'nN'[v:searchforward] + +" better command history navigation +cnoremap +cnoremap + +" keep selection after indenting visual selection +xnoremap < >gv + +" modify higlight colors +hi Search cterm=NONE ctermbg=blue ctermfg=black