From 072232016240986e9f68001393e4036bc6fc783e Mon Sep 17 00:00:00 2001 From: Dongsu Park Date: Fri, 21 Apr 2017 12:58:17 +0200 Subject: [PATCH] add dotfiles to be placed under home directories dotfiles like .bash*, .git*, .vim*, etc. --- .bash_gitprompt | 95 + .bash_profile | 44 + .bashrc | 181 + .git-completion.bash | 2921 +++++++++++++++++ .gitconfig | 47 + .muttrc | 119 + .offlineimaprc | 543 +++ .vim/autoload/pathogen.vim | 347 ++ .vim/autoload/plug.vim | 2037 ++++++++++++ .vim/bundle/rust.vim/LICENSE-APACHE | 201 ++ .vim/bundle/rust.vim/LICENSE-MIT | 25 + .vim/bundle/rust.vim/README.md | 87 + .vim/bundle/rust.vim/after/syntax/rust.vim | 34 + .vim/bundle/rust.vim/autoload/rust.vim | 414 +++ .vim/bundle/rust.vim/autoload/rustfmt.vim | 106 + .vim/bundle/rust.vim/compiler/cargo.vim | 28 + .vim/bundle/rust.vim/compiler/rustc.vim | 45 + .vim/bundle/rust.vim/doc/rust.txt | 237 ++ .vim/bundle/rust.vim/ftdetect/rust.vim | 1 + .vim/bundle/rust.vim/ftplugin/rust.vim | 207 ++ .vim/bundle/rust.vim/indent/rust.vim | 206 ++ .vim/bundle/rust.vim/plugin/rust.vim | 22 + .vim/bundle/rust.vim/syntax/rust.vim | 294 ++ .../rust.vim/syntax_checkers/rust/rustc.vim | 48 + .vim/bundle/vim-go/CHANGELOG.md | 349 ++ .vim/bundle/vim-go/LICENSE | 60 + .vim/bundle/vim-go/Makefile | 7 + .vim/bundle/vim-go/README.md | 339 ++ .vim/bundle/vim-go/addon-info.json | 6 + .vim/bundle/vim-go/assets/screenshot.png | Bin 0 -> 764721 bytes .vim/bundle/vim-go/assets/vim-go.png | Bin 0 -> 29252 bytes .vim/bundle/vim-go/assets/vim-go.svg | 821 +++++ .vim/bundle/vim-go/autoload/ctrlp/decls.vim | 159 + .vim/bundle/vim-go/autoload/go/alternate.vim | 32 + .vim/bundle/vim-go/autoload/go/asmfmt.vim | 69 + .vim/bundle/vim-go/autoload/go/cmd.vim | 467 +++ .vim/bundle/vim-go/autoload/go/complete.vim | 182 + .vim/bundle/vim-go/autoload/go/coverage.vim | 371 +++ .vim/bundle/vim-go/autoload/go/def.vim | 320 ++ .vim/bundle/vim-go/autoload/go/def_test.vim | 32 + .vim/bundle/vim-go/autoload/go/doc.vim | 218 ++ .vim/bundle/vim-go/autoload/go/fmt.vim | 243 ++ .vim/bundle/vim-go/autoload/go/fmt_test.vim | 31 + .vim/bundle/vim-go/autoload/go/guru.vim | 641 ++++ .vim/bundle/vim-go/autoload/go/impl.vim | 126 + .vim/bundle/vim-go/autoload/go/import.vim | 213 ++ .vim/bundle/vim-go/autoload/go/job.vim | 109 + .vim/bundle/vim-go/autoload/go/jobcontrol.vim | 161 + .vim/bundle/vim-go/autoload/go/lint.vim | 312 ++ .vim/bundle/vim-go/autoload/go/list.vim | 133 + .vim/bundle/vim-go/autoload/go/package.vim | 165 + .vim/bundle/vim-go/autoload/go/path.vim | 175 + .vim/bundle/vim-go/autoload/go/play.vim | 93 + .vim/bundle/vim-go/autoload/go/rename.vim | 146 + .vim/bundle/vim-go/autoload/go/statusline.vim | 112 + .vim/bundle/vim-go/autoload/go/template.vim | 50 + .vim/bundle/vim-go/autoload/go/term.vim | 139 + .../autoload/go/test-fixtures/def/jump.go | 7 + .../autoload/go/test-fixtures/fmt/hello.go | 7 + .../go/test-fixtures/fmt/hello_golden.go | 7 + .vim/bundle/vim-go/autoload/go/textobj.vim | 180 + .vim/bundle/vim-go/autoload/go/tool.vim | 209 ++ .vim/bundle/vim-go/autoload/go/ui.vim | 114 + .vim/bundle/vim-go/autoload/go/util.vim | 308 ++ .vim/bundle/vim-go/compiler/go.vim | 41 + .vim/bundle/vim-go/doc/vim-go.txt | 1557 +++++++++ .vim/bundle/vim-go/ftdetect/gofiletype.vim | 31 + .vim/bundle/vim-go/ftplugin/asm.vim | 19 + .vim/bundle/vim-go/ftplugin/go.vim | 131 + .vim/bundle/vim-go/ftplugin/go/commands.vim | 94 + .vim/bundle/vim-go/ftplugin/go/mappings.vim | 75 + .vim/bundle/vim-go/ftplugin/go/snippets.vim | 48 + .vim/bundle/vim-go/ftplugin/go/tagbar.vim | 57 + .vim/bundle/vim-go/ftplugin/gohtmltmpl.vim | 8 + .../vim-go/gosnippets/UltiSnips/go.snippets | 443 +++ .../bundle/vim-go/gosnippets/snippets/go.snip | 363 ++ .vim/bundle/vim-go/indent/go.vim | 78 + .vim/bundle/vim-go/indent/gohtmltmpl.vim | 46 + .vim/bundle/vim-go/plugin/go.vim | 213 ++ .vim/bundle/vim-go/scripts/runtest.vim | 81 + .vim/bundle/vim-go/scripts/test.sh | 30 + .vim/bundle/vim-go/syntax/go.vim | 397 +++ .vim/bundle/vim-go/syntax/godefstack.vim | 20 + .vim/bundle/vim-go/syntax/gohtmltmpl.vim | 15 + .vim/bundle/vim-go/syntax/gotexttmpl.vim | 85 + .vim/bundle/vim-go/syntax/vimgo.vim | 13 + .vim/bundle/vim-go/templates/hello_world.go | 7 + .vim/bundle/vim-racer/README.md | 60 + .vim/bundle/vim-racer/autoload/racer.vim | 265 ++ .vim/bundle/vim-racer/ftplugin/rust_racer.vim | 44 + .../rplugin/python3/deoplete/sources/racer.py | 111 + .vim/bundle/vim-racer/syntax/rustdoc.vim | 178 + .vim/plugin/EnhancedCommentify.vim | 1607 +++++++++ .vim/plugin/cscope_maps.vim | 165 + .vim/plugin/fugitive.vim | 2041 ++++++++++++ .vimrc | 285 ++ 96 files changed, 24010 insertions(+) create mode 100644 .bash_gitprompt create mode 100644 .bash_profile create mode 100644 .bashrc create mode 100644 .git-completion.bash create mode 100644 .gitconfig create mode 100644 .muttrc create mode 100644 .offlineimaprc create mode 100644 .vim/autoload/pathogen.vim create mode 100644 .vim/autoload/plug.vim create mode 100644 .vim/bundle/rust.vim/LICENSE-APACHE create mode 100644 .vim/bundle/rust.vim/LICENSE-MIT create mode 100644 .vim/bundle/rust.vim/README.md create mode 100644 .vim/bundle/rust.vim/after/syntax/rust.vim create mode 100644 .vim/bundle/rust.vim/autoload/rust.vim create mode 100644 .vim/bundle/rust.vim/autoload/rustfmt.vim create mode 100644 .vim/bundle/rust.vim/compiler/cargo.vim create mode 100644 .vim/bundle/rust.vim/compiler/rustc.vim create mode 100644 .vim/bundle/rust.vim/doc/rust.txt create mode 100644 .vim/bundle/rust.vim/ftdetect/rust.vim create mode 100644 .vim/bundle/rust.vim/ftplugin/rust.vim create mode 100644 .vim/bundle/rust.vim/indent/rust.vim create mode 100644 .vim/bundle/rust.vim/plugin/rust.vim create mode 100644 .vim/bundle/rust.vim/syntax/rust.vim create mode 100644 .vim/bundle/rust.vim/syntax_checkers/rust/rustc.vim create mode 100644 .vim/bundle/vim-go/CHANGELOG.md create mode 100644 .vim/bundle/vim-go/LICENSE create mode 100644 .vim/bundle/vim-go/Makefile create mode 100644 .vim/bundle/vim-go/README.md create mode 100644 .vim/bundle/vim-go/addon-info.json create mode 100644 .vim/bundle/vim-go/assets/screenshot.png create mode 100644 .vim/bundle/vim-go/assets/vim-go.png create mode 100644 .vim/bundle/vim-go/assets/vim-go.svg create mode 100644 .vim/bundle/vim-go/autoload/ctrlp/decls.vim create mode 100644 .vim/bundle/vim-go/autoload/go/alternate.vim create mode 100644 .vim/bundle/vim-go/autoload/go/asmfmt.vim create mode 100644 .vim/bundle/vim-go/autoload/go/cmd.vim create mode 100644 .vim/bundle/vim-go/autoload/go/complete.vim create mode 100644 .vim/bundle/vim-go/autoload/go/coverage.vim create mode 100644 .vim/bundle/vim-go/autoload/go/def.vim create mode 100644 .vim/bundle/vim-go/autoload/go/def_test.vim create mode 100644 .vim/bundle/vim-go/autoload/go/doc.vim create mode 100644 .vim/bundle/vim-go/autoload/go/fmt.vim create mode 100644 .vim/bundle/vim-go/autoload/go/fmt_test.vim create mode 100644 .vim/bundle/vim-go/autoload/go/guru.vim create mode 100644 .vim/bundle/vim-go/autoload/go/impl.vim create mode 100644 .vim/bundle/vim-go/autoload/go/import.vim create mode 100644 .vim/bundle/vim-go/autoload/go/job.vim create mode 100644 .vim/bundle/vim-go/autoload/go/jobcontrol.vim create mode 100644 .vim/bundle/vim-go/autoload/go/lint.vim create mode 100644 .vim/bundle/vim-go/autoload/go/list.vim create mode 100644 .vim/bundle/vim-go/autoload/go/package.vim create mode 100644 .vim/bundle/vim-go/autoload/go/path.vim create mode 100644 .vim/bundle/vim-go/autoload/go/play.vim create mode 100644 .vim/bundle/vim-go/autoload/go/rename.vim create mode 100644 .vim/bundle/vim-go/autoload/go/statusline.vim create mode 100644 .vim/bundle/vim-go/autoload/go/template.vim create mode 100644 .vim/bundle/vim-go/autoload/go/term.vim create mode 100644 .vim/bundle/vim-go/autoload/go/test-fixtures/def/jump.go create mode 100644 .vim/bundle/vim-go/autoload/go/test-fixtures/fmt/hello.go create mode 100644 .vim/bundle/vim-go/autoload/go/test-fixtures/fmt/hello_golden.go create mode 100644 .vim/bundle/vim-go/autoload/go/textobj.vim create mode 100644 .vim/bundle/vim-go/autoload/go/tool.vim create mode 100644 .vim/bundle/vim-go/autoload/go/ui.vim create mode 100644 .vim/bundle/vim-go/autoload/go/util.vim create mode 100644 .vim/bundle/vim-go/compiler/go.vim create mode 100644 .vim/bundle/vim-go/doc/vim-go.txt create mode 100644 .vim/bundle/vim-go/ftdetect/gofiletype.vim create mode 100644 .vim/bundle/vim-go/ftplugin/asm.vim create mode 100644 .vim/bundle/vim-go/ftplugin/go.vim create mode 100644 .vim/bundle/vim-go/ftplugin/go/commands.vim create mode 100644 .vim/bundle/vim-go/ftplugin/go/mappings.vim create mode 100644 .vim/bundle/vim-go/ftplugin/go/snippets.vim create mode 100644 .vim/bundle/vim-go/ftplugin/go/tagbar.vim create mode 100644 .vim/bundle/vim-go/ftplugin/gohtmltmpl.vim create mode 100644 .vim/bundle/vim-go/gosnippets/UltiSnips/go.snippets create mode 100644 .vim/bundle/vim-go/gosnippets/snippets/go.snip create mode 100644 .vim/bundle/vim-go/indent/go.vim create mode 100644 .vim/bundle/vim-go/indent/gohtmltmpl.vim create mode 100644 .vim/bundle/vim-go/plugin/go.vim create mode 100644 .vim/bundle/vim-go/scripts/runtest.vim create mode 100755 .vim/bundle/vim-go/scripts/test.sh create mode 100644 .vim/bundle/vim-go/syntax/go.vim create mode 100644 .vim/bundle/vim-go/syntax/godefstack.vim create mode 100644 .vim/bundle/vim-go/syntax/gohtmltmpl.vim create mode 100644 .vim/bundle/vim-go/syntax/gotexttmpl.vim create mode 100644 .vim/bundle/vim-go/syntax/vimgo.vim create mode 100644 .vim/bundle/vim-go/templates/hello_world.go create mode 100644 .vim/bundle/vim-racer/README.md create mode 100644 .vim/bundle/vim-racer/autoload/racer.vim create mode 100644 .vim/bundle/vim-racer/ftplugin/rust_racer.vim create mode 100644 .vim/bundle/vim-racer/rplugin/python3/deoplete/sources/racer.py create mode 100644 .vim/bundle/vim-racer/syntax/rustdoc.vim create mode 100644 .vim/plugin/EnhancedCommentify.vim create mode 100644 .vim/plugin/cscope_maps.vim create mode 100644 .vim/plugin/fugitive.vim create mode 100644 .vimrc diff --git a/.bash_gitprompt b/.bash_gitprompt new file mode 100644 index 0000000..be2572e --- /dev/null +++ b/.bash_gitprompt @@ -0,0 +1,95 @@ +# .bash_gitprompt +# Git Commands +# +# original sources - https://github.com/matthewmccullough/MatthewsShellConfig/ +# modified by Dongsu Park +# +# if $GITPROMPT_NOCOLOR is set to 1, prompt will be printed without colors. +# if $GITPROMPT_NOSTATUS is set to 1, only "git branch" will be executed +# instead of "git status" at every prompt. + +if [ "$GITPROMPT_NOCOLOR" = "1" ]; then + RED="" + YELLOW="" + GREEN="" + BLUE="" + LIGHT_RED="" +LIGHT_GREEN="" + WHITE="" + LIGHT_GRAY="" + COLOR_NONE="" +else + RED="\[\033[0;31m\]" + YELLOW="\[\033[0;33m\]" + GREEN="\[\033[0;32m\]" + BLUE="\[\033[0;34m\]" + LIGHT_RED="\[\033[1;31m\]" +LIGHT_GREEN="\[\033[1;32m\]" + WHITE="\[\033[1;37m\]" + LIGHT_GRAY="\[\033[0;37m\]" + COLOR_NONE="\[\e[0m\]" +fi + +function parse_git_branch { + if [ "$GITPROMPT_NOSTATUS" = "1" ]; then + git_branch=$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/') + [ -n "${git_branch}" ] && git_branch=" (${git_branch})" + echo "${git_branch}" + else + git rev-parse --git-dir &> /dev/null + git_status="$(git status 2> /dev/null)" + branch_pattern="^# On branch ([^${IFS}]*)" + remote_pattern="# Your branch is (.*) of" + diverge_pattern="# Your branch and (.*) have diverged" + + if [[ ! ${git_status}} =~ "working directory clean" ]]; then + state="${RED}⚡" + fi + # add an else if or two here if you want to get more specific + if [[ ${git_status} =~ ${remote_pattern} ]]; then + if [[ ${BASH_REMATCH[1]} == "ahead" ]]; then + remote="${YELLOW}↑" + else + remote="${YELLOW}↓" + fi + fi + if [[ ${git_status} =~ ${diverge_pattern} ]]; then + remote="${YELLOW}↕" + fi + if [[ ${git_status} =~ ${branch_pattern} ]]; then + branch=${BASH_REMATCH[1]} + echo " (${branch})${remote}${state}" + fi + fi +} + +function git_dirty_flag { + git status 2> /dev/null | grep -c : | awk '{if ($1 > 0) print "⚡"}' +} + +function prompt_func() { + previous_return_value=$?; + # The lowercase w is the full current working directory + #prompt="${TITLEBAR}${BLUE}[${RED}\w${GREEN}$(parse_git_branch)${BLUE}]${COLOR_NONE}" + + # Capital W is just the trailing part of the current working directory + # personalized by Dongsu Park + prompt="${TITLEBAR}${BLUE}${RED}\u@\h `dirs`${GREEN}$(parse_git_branch) ${BLUE}{\!}${COLOR_NONE}" + + if test $previous_return_value -eq 0 + then + # personalized by Dongsu Park + PS1="${prompt} " + #PS1="${prompt}> " + + # OLD_PROMPT should be set back again, to avoid confusions in branch names when typing ^C or so. + OLD_PROMPT=$PS1 + else + # don't change the prompt (use the default one) if it's not a git dir + PS1=$OLD_PROMPT + fi +} + +# Preserve current prompt +OLD_PROMPT=$PS1 +PROMPT_COMMAND=prompt_func diff --git a/.bash_profile b/.bash_profile new file mode 100644 index 0000000..f4a9a0d --- /dev/null +++ b/.bash_profile @@ -0,0 +1,44 @@ +# .bash_profile +# Dongsu Park + +# Get the aliases and functions +if [ -f ~/.bashrc ]; then + . ~/.bashrc +fi + +# User specific environment and startup programs + +if [ ! -z ${REMOTEHOST} ]; then + export DISPLAY=${REMOTEHOST}:0.0 +fi + +SYSDIR=`uname -m`-`uname -r` + +## Paths +export PATH=$HOME/bin:$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/usr/sbin:/opt/bin +export BASH_ENV=$HOME/.bashrc + +## Control history +export HISTSIZE=1000 +export HISTFILESIZE=200 + +## Control file name completion: ignore the following suffices +export FIGNORE=:.o:.bak:.old:.aux:.toc + +## Prompt +## ex) user1@host1 ~ {41} +export PS1="\u@\h `dirs` $(parse_git_branch) {\!} " + +unset USERNAME + +# Execute the subshell script +if [ -e ~/.bashrc ]; then + source ~/.bashrc +fi + +export PKGDIR=/usr/portage/packages + +xset b off +setxkbmap -model cherrycmexpert -layout us,de -variant nodeadkeys + +# end of ~/.bash_profile diff --git a/.bashrc b/.bashrc new file mode 100644 index 0000000..6af8a9f --- /dev/null +++ b/.bashrc @@ -0,0 +1,181 @@ +# .bashrc +# executed by login and subshells +# +# Dongsu Park + +## Source global definitions +if [ -f /etc/bashrc ]; then + . /etc/bashrc +fi + +setxkbmap -layout us + +## User permission mask for newly created files and directories +umask 002 + +## Some settings +ulimit -S -c 0 # Don't want any coredumps +set -o notify + +## Enable options +shopt -s cdspell +shopt -s cdable_vars +shopt -s checkhash +shopt -s checkwinsize +shopt -s mailwarn +shopt -s sourcepath +shopt -s no_empty_cmd_completion +shopt -s cmdhist +shopt -s histappend histreedit +shopt -s extglob # Necessary for programmable completion + +## Aliases + +psgrep() { ps aux | egrep ${1} | egrep -v egrep; } +copy(){ cp -v "$1" "$2"&watch -n 1 du -sh "$1" "$2" 2>/dev/null;} + +alias crb='makecscope ; find . -name \*.[ch] -o -name \*.cpp -o -name \*.cc | xargs ctags --extra=+f --c-kinds=+px --exclude=.git --exclude=.pc' +alias crbkernel='source ~/.bashrc; makecscope ${KERNEL_DIR}/; find ${KERNEL_DIR}/ -name \*.[ch] -o -name \*.cpp | xargs ctags --extra=+f --c-kinds=+px --exclude=.git --exclude=.pc --exclude=debian --exclude=*.mod.[ch]* --exclude=Documentation/* --exclude=*/arch/[a-u]* --exclude=*/arch/xtensa*' +alias =logout +alias =clear +alias d='date +"%a, %h %d, %r"' +alias dir='ls -l --color=auto --format=vertical' +alias vdir='ls -l --color=auto --format=long' +alias euc='export LANG=ko_KR.eucKR; export LC_ALL=ko_KR.eucKR; stty -istrip -parity' +alias fch=fetchmail +alias hi=history +alias jpdfbookmarks='java -jar /usr/local/lib/jpdfbookmarks/jpdfbookmarks.jar' +alias k9='kill -9' +alias ls='ls -sF' +alias la='ls -A' +alias ll='ls -l' +alias lld='ls -ld' +alias more='less' +alias p=pwd +alias pcrop='pdfcrop --margins 10' +alias psc=psgrep +alias screen='TERM=screen screen' +alias telnet="telnet -e ''" # or -L ? +alias up='cd ..' +alias vi=vim +alias w3m='w3m -I utf-8 -O utf-8' + +alias cp='cp -i' +alias mv='mv -i' +alias rm='rm -i' + +alias gs='git status ' +alias ga='git add ' +alias gb='git branch ' +alias gc='git commit ' +alias gd='git diff ' +alias gco='git checkout ' +alias gk='gitk --all &' +alias gx='gitk --all' + +## Environment variables + +## Set variables for a warm fuzzy environment +export PATH=$HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/lib64/qt5/bin:/usr/libexec/openssh:/root/bin + +export EDITOR=vim +export FIGNORE=".git:.o" +export HISTCONTROL=ignoredups +export HISTIGNORE="&:bg:fg:la:ll:dir:h:exit" +export PGPPATH= +export PAGER=less +export TERM=xterm-color +export TIMEFORMAT=$'\nreal %3R\tuser %3U\tsys %S\tpcpu %P\n' +export TZ="Europe/Berlin" +export VISUAL=vim + +export MAILDIR=$HOME/Maildir +export MAIL=$MAILDIR + +export HOSTNAME=`hostname` +export EMAIL=dpark@posteo.net +export GITPROMPT_NOCOLOR=1 +export GITPROMPT_NOSTATUS=1 +export GIT_COMMITTER_NAME="Dongsu Park" +export GIT_COMMITTER_EMAIL="dpark@posteo.net" +export CC="gcc" +export CXX="g++" + +# other environment settings + +############################################################################# +# LS_COLORS setting +############################################################################# +# +#no 0 Normal (non-filename) text +#fi 0 Regular file +#di 32 Directory +#ln 36 Symbolic link +#pi 31 Named pipe (FIFO) +#so 33 Socket +#bd 44;37 Block device +#cd 44;37 Character device +#ex 35 Executable file +#mi (none) Missing file (defaults to fi) +#or (none) Orphanned symbolic link (defaults to ln) +#lc \e[ Left code +#rc m Right code +#ec (none) End code (replaces lc+no+rc) +# +#0 to restore default color +#1 for brighter colors +#4 for underlined text +#5 for flashing text +#30 for black foreground +#31 for red foreground +#32 for green foreground +#33 for yellow (or brown) foreground +#34 for blue foreground +#35 for purple foreground +#36 for cyan foreground +#37 for white (or gray) foreground +#40 for black background +#41 for red background +#42 for green background +#43 for yellow (or brown) background +#44 for blue background +#45 for purple background +#46 for cyan background +#47 for white (or gray) background + +export LS_COLORS='*.tex=33:*.c=33:*.cc=33:*.C=33:*.java=33:*.flex=33:*.y=33:*.html=33:*.shtml=0;33:*.phtml=0;33:*.h=0;33:*.dvi=35:*.ps=35:*.jpg=35:*.gif=35:*.fig=35:*.eps=35:*.bmp=35:*.zip=31:*.Z=31:*.gz=31:*.tgz=31:*.tar=31:*.jar=31:*.rpm=31:*.o=31:*.py=1;32:*.class=31:*.log=31:*.aux=31:di=0;32:ex=1;32:ln=36:or=34' + +# Locales +export LANG=en_US.UTF-8 +export LC_CTYPE=en_US.UTF-8 +export LC_NUMERIC=en_US.UTF-8 +export LC_TIME=en_GB.UTF-8 +export LC_COLLATE=C +export LC_MESSAGES=en_US.UTF-8 +export LINGUAS="en" +export NOMHNPROC=1 + +# Go +export GOOS=linux +export GOROOT=/usr/local/golang +export GOPATH=$HOME/go +export GOBIN=$GOPATH/bin +export PATH=$GOBIN:$GOROOT/bin:$PATH +export CGO_ENABLED=1 +export CGO_CPPFLAGS="-Wno-deprecated-declarations" + +# Rust +export PATH=$HOME/.cargo/bin:$PATH +export RUST_SRC_PATH=$HOME/Dev/rust/rust-master/src + +# git prompt +if [ -f ~/.bash_gitprompt ]; then + . ~/.bash_gitprompt +fi + +# git completion must be added AFTER running "complete -r" +complete -r # I don't need enhanced auto-completion +if [ -f ~/.git-completion.bash ]; then + . ~/.git-completion.bash +fi + diff --git a/.git-completion.bash b/.git-completion.bash new file mode 100644 index 0000000..97d73ad --- /dev/null +++ b/.git-completion.bash @@ -0,0 +1,2921 @@ +# bash/zsh completion support for core Git. +# +# Copyright (C) 2006,2007 Shawn O. Pearce +# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/). +# Distributed under the GNU General Public License, version 2.0. +# +# The contained completion routines provide support for completing: +# +# *) local and remote branch names +# *) local and remote tag names +# *) .git/remotes file names +# *) git 'subcommands' +# *) git email aliases for git-send-email +# *) tree paths within 'ref:path/to/file' expressions +# *) file paths within current working directory and index +# *) common --long-options +# +# To use these routines: +# +# 1) Copy this file to somewhere (e.g. ~/.git-completion.bash). +# 2) Add the following line to your .bashrc/.zshrc: +# source ~/.git-completion.bash +# 3) Consider changing your PS1 to also show the current branch, +# see git-prompt.sh for details. +# +# If you use complex aliases of form '!f() { ... }; f', you can use the null +# command ':' as the first command in the function body to declare the desired +# completion style. For example '!f() { : git commit ; ... }; f' will +# tell the completion to use commit completion. This also works with aliases +# of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '". + +case "$COMP_WORDBREAKS" in +*:*) : great ;; +*) COMP_WORDBREAKS="$COMP_WORDBREAKS:" +esac + +# __gitdir accepts 0 or 1 arguments (i.e., location) +# returns location of .git repo +__gitdir () +{ + if [ -z "${1-}" ]; then + if [ -n "${__git_dir-}" ]; then + echo "$__git_dir" + elif [ -n "${GIT_DIR-}" ]; then + test -d "${GIT_DIR-}" || return 1 + echo "$GIT_DIR" + elif [ -d .git ]; then + echo .git + else + git rev-parse --git-dir 2>/dev/null + fi + elif [ -d "$1/.git" ]; then + echo "$1/.git" + else + echo "$1" + fi +} + +# The following function is based on code from: +# +# bash_completion - programmable completion functions for bash 3.2+ +# +# Copyright © 2006-2008, Ian Macdonald +# © 2009-2010, Bash Completion Maintainers +# +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The latest version of this software can be obtained here: +# +# http://bash-completion.alioth.debian.org/ +# +# RELEASE: 2.x + +# This function can be used to access a tokenized list of words +# on the command line: +# +# __git_reassemble_comp_words_by_ref '=:' +# if test "${words_[cword_-1]}" = -w +# then +# ... +# fi +# +# The argument should be a collection of characters from the list of +# word completion separators (COMP_WORDBREAKS) to treat as ordinary +# characters. +# +# This is roughly equivalent to going back in time and setting +# COMP_WORDBREAKS to exclude those characters. The intent is to +# make option types like --date= and : easy to +# recognize by treating each shell word as a single token. +# +# It is best not to set COMP_WORDBREAKS directly because the value is +# shared with other completion scripts. By the time the completion +# function gets called, COMP_WORDS has already been populated so local +# changes to COMP_WORDBREAKS have no effect. +# +# Output: words_, cword_, cur_. + +__git_reassemble_comp_words_by_ref() +{ + local exclude i j first + # Which word separators to exclude? + exclude="${1//[^$COMP_WORDBREAKS]}" + cword_=$COMP_CWORD + if [ -z "$exclude" ]; then + words_=("${COMP_WORDS[@]}") + return + fi + # List of word completion separators has shrunk; + # re-assemble words to complete. + for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do + # Append each nonempty word consisting of just + # word separator characters to the current word. + first=t + while + [ $i -gt 0 ] && + [ -n "${COMP_WORDS[$i]}" ] && + # word consists of excluded word separators + [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ] + do + # Attach to the previous token, + # unless the previous token is the command name. + if [ $j -ge 2 ] && [ -n "$first" ]; then + ((j--)) + fi + first= + words_[$j]=${words_[j]}${COMP_WORDS[i]} + if [ $i = $COMP_CWORD ]; then + cword_=$j + fi + if (($i < ${#COMP_WORDS[@]} - 1)); then + ((i++)) + else + # Done. + return + fi + done + words_[$j]=${words_[j]}${COMP_WORDS[i]} + if [ $i = $COMP_CWORD ]; then + cword_=$j + fi + done +} + +if ! type _get_comp_words_by_ref >/dev/null 2>&1; then +_get_comp_words_by_ref () +{ + local exclude cur_ words_ cword_ + if [ "$1" = "-n" ]; then + exclude=$2 + shift 2 + fi + __git_reassemble_comp_words_by_ref "$exclude" + cur_=${words_[cword_]} + while [ $# -gt 0 ]; do + case "$1" in + cur) + cur=$cur_ + ;; + prev) + prev=${words_[$cword_-1]} + ;; + words) + words=("${words_[@]}") + ;; + cword) + cword=$cword_ + ;; + esac + shift + done +} +fi + +__gitcompappend () +{ + local x i=${#COMPREPLY[@]} + for x in $1; do + if [[ "$x" == "$3"* ]]; then + COMPREPLY[i++]="$2$x$4" + fi + done +} + +__gitcompadd () +{ + COMPREPLY=() + __gitcompappend "$@" +} + +# Generates completion reply, appending a space to possible completion words, +# if necessary. +# It accepts 1 to 4 arguments: +# 1: List of possible completion words. +# 2: A prefix to be added to each possible completion word (optional). +# 3: Generate possible completion matches for this word (optional). +# 4: A suffix to be appended to each possible completion word (optional). +__gitcomp () +{ + local cur_="${3-$cur}" + + case "$cur_" in + --*=) + ;; + *) + local c i=0 IFS=$' \t\n' + for c in $1; do + c="$c${4-}" + if [[ $c == "$cur_"* ]]; then + case $c in + --*=*|*.) ;; + *) c="$c " ;; + esac + COMPREPLY[i++]="${2-}$c" + fi + done + ;; + esac +} + +# Variation of __gitcomp_nl () that appends to the existing list of +# completion candidates, COMPREPLY. +__gitcomp_nl_append () +{ + local IFS=$'\n' + __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }" +} + +# Generates completion reply from newline-separated possible completion words +# by appending a space to all of them. +# It accepts 1 to 4 arguments: +# 1: List of possible completion words, separated by a single newline. +# 2: A prefix to be added to each possible completion word (optional). +# 3: Generate possible completion matches for this word (optional). +# 4: A suffix to be appended to each possible completion word instead of +# the default space (optional). If specified but empty, nothing is +# appended. +__gitcomp_nl () +{ + COMPREPLY=() + __gitcomp_nl_append "$@" +} + +# Generates completion reply with compgen from newline-separated possible +# completion filenames. +# It accepts 1 to 3 arguments: +# 1: List of possible completion filenames, separated by a single newline. +# 2: A directory prefix to be added to each possible completion filename +# (optional). +# 3: Generate possible completion matches for this word (optional). +__gitcomp_file () +{ + local IFS=$'\n' + + # XXX does not work when the directory prefix contains a tilde, + # since tilde expansion is not applied. + # This means that COMPREPLY will be empty and Bash default + # completion will be used. + __gitcompadd "$1" "${2-}" "${3-$cur}" "" + + # use a hack to enable file mode in bash < 4 + compopt -o filenames +o nospace 2>/dev/null || + compgen -f /non-existing-dir/ > /dev/null +} + +# Execute 'git ls-files', unless the --committable option is specified, in +# which case it runs 'git diff-index' to find out the files that can be +# committed. It return paths relative to the directory specified in the first +# argument, and using the options specified in the second argument. +__git_ls_files_helper () +{ + if [ "$2" == "--committable" ]; then + git -C "$1" diff-index --name-only --relative HEAD + else + # NOTE: $2 is not quoted in order to support multiple options + git -C "$1" ls-files --exclude-standard $2 + fi 2>/dev/null +} + + +# __git_index_files accepts 1 or 2 arguments: +# 1: Options to pass to ls-files (required). +# 2: A directory path (optional). +# If provided, only files within the specified directory are listed. +# Sub directories are never recursed. Path must have a trailing +# slash. +__git_index_files () +{ + local dir="$(__gitdir)" root="${2-.}" file + + if [ -d "$dir" ]; then + __git_ls_files_helper "$root" "$1" | + while read -r file; do + case "$file" in + ?*/*) echo "${file%%/*}" ;; + *) echo "$file" ;; + esac + done | sort | uniq + fi +} + +__git_heads () +{ + local dir="$(__gitdir)" + if [ -d "$dir" ]; then + git --git-dir="$dir" for-each-ref --format='%(refname:short)' \ + refs/heads + return + fi +} + +__git_tags () +{ + local dir="$(__gitdir)" + if [ -d "$dir" ]; then + git --git-dir="$dir" for-each-ref --format='%(refname:short)' \ + refs/tags + return + fi +} + +# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments +# presence of 2nd argument means use the guess heuristic employed +# by checkout for tracking branches +__git_refs () +{ + local i hash dir="$(__gitdir "${1-}")" track="${2-}" + local format refs pfx + if [ -d "$dir" ]; then + case "$cur" in + refs|refs/*) + format="refname" + refs="${cur%/*}" + track="" + ;; + *) + [[ "$cur" == ^* ]] && pfx="^" + for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do + if [ -e "$dir/$i" ]; then echo $pfx$i; fi + done + format="refname:short" + refs="refs/tags refs/heads refs/remotes" + ;; + esac + git --git-dir="$dir" for-each-ref --format="$pfx%($format)" \ + $refs + if [ -n "$track" ]; then + # employ the heuristic used by git checkout + # Try to find a remote branch that matches the completion word + # but only output if the branch name is unique + local ref entry + git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \ + "refs/remotes/" | \ + while read -r entry; do + eval "$entry" + ref="${ref#*/}" + if [[ "$ref" == "$cur"* ]]; then + echo "$ref" + fi + done | sort | uniq -u + fi + return + fi + case "$cur" in + refs|refs/*) + git ls-remote "$dir" "$cur*" 2>/dev/null | \ + while read -r hash i; do + case "$i" in + *^{}) ;; + *) echo "$i" ;; + esac + done + ;; + *) + echo "HEAD" + git for-each-ref --format="%(refname:short)" -- \ + "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##" + ;; + esac +} + +# __git_refs2 requires 1 argument (to pass to __git_refs) +__git_refs2 () +{ + local i + for i in $(__git_refs "$1"); do + echo "$i:$i" + done +} + +# __git_refs_remotes requires 1 argument (to pass to ls-remote) +__git_refs_remotes () +{ + local i hash + git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \ + while read -r hash i; do + echo "$i:refs/remotes/$1/${i#refs/heads/}" + done +} + +__git_remotes () +{ + local d="$(__gitdir)" + test -d "$d/remotes" && ls -1 "$d/remotes" + git --git-dir="$d" remote +} + +__git_list_merge_strategies () +{ + git merge -s help 2>&1 | + sed -n -e '/[Aa]vailable strategies are: /,/^$/{ + s/\.$// + s/.*:// + s/^[ ]*// + s/[ ]*$// + p + }' +} + +__git_merge_strategies= +# 'git merge -s help' (and thus detection of the merge strategy +# list) fails, unfortunately, if run outside of any git working +# tree. __git_merge_strategies is set to the empty string in +# that case, and the detection will be repeated the next time it +# is needed. +__git_compute_merge_strategies () +{ + test -n "$__git_merge_strategies" || + __git_merge_strategies=$(__git_list_merge_strategies) +} + +__git_complete_revlist_file () +{ + local pfx ls ref cur_="$cur" + case "$cur_" in + *..?*:*) + return + ;; + ?*:*) + ref="${cur_%%:*}" + cur_="${cur_#*:}" + case "$cur_" in + ?*/*) + pfx="${cur_%/*}" + cur_="${cur_##*/}" + ls="$ref:$pfx" + pfx="$pfx/" + ;; + *) + ls="$ref" + ;; + esac + + case "$COMP_WORDBREAKS" in + *:*) : great ;; + *) pfx="$ref:$pfx" ;; + esac + + __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \ + | sed '/^100... blob /{ + s,^.* ,, + s,$, , + } + /^120000 blob /{ + s,^.* ,, + s,$, , + } + /^040000 tree /{ + s,^.* ,, + s,$,/, + } + s/^.* //')" \ + "$pfx" "$cur_" "" + ;; + *...*) + pfx="${cur_%...*}..." + cur_="${cur_#*...}" + __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" + ;; + *..*) + pfx="${cur_%..*}.." + cur_="${cur_#*..}" + __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" + ;; + *) + __gitcomp_nl "$(__git_refs)" + ;; + esac +} + + +# __git_complete_index_file requires 1 argument: +# 1: the options to pass to ls-file +# +# The exception is --committable, which finds the files appropriate commit. +__git_complete_index_file () +{ + local pfx="" cur_="$cur" + + case "$cur_" in + ?*/*) + pfx="${cur_%/*}" + cur_="${cur_##*/}" + pfx="${pfx}/" + ;; + esac + + __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_" +} + +__git_complete_file () +{ + __git_complete_revlist_file +} + +__git_complete_revlist () +{ + __git_complete_revlist_file +} + +__git_complete_remote_or_refspec () +{ + local cur_="$cur" cmd="${words[1]}" + local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0 + if [ "$cmd" = "remote" ]; then + ((c++)) + fi + while [ $c -lt $cword ]; do + i="${words[c]}" + case "$i" in + --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;; + --all) + case "$cmd" in + push) no_complete_refspec=1 ;; + fetch) + return + ;; + *) ;; + esac + ;; + -*) ;; + *) remote="$i"; break ;; + esac + ((c++)) + done + if [ -z "$remote" ]; then + __gitcomp_nl "$(__git_remotes)" + return + fi + if [ $no_complete_refspec = 1 ]; then + return + fi + [ "$remote" = "." ] && remote= + case "$cur_" in + *:*) + case "$COMP_WORDBREAKS" in + *:*) : great ;; + *) pfx="${cur_%%:*}:" ;; + esac + cur_="${cur_#*:}" + lhs=0 + ;; + +*) + pfx="+" + cur_="${cur_#+}" + ;; + esac + case "$cmd" in + fetch) + if [ $lhs = 1 ]; then + __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_" + else + __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" + fi + ;; + pull|remote) + if [ $lhs = 1 ]; then + __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_" + else + __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" + fi + ;; + push) + if [ $lhs = 1 ]; then + __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" + else + __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_" + fi + ;; + esac +} + +__git_complete_strategy () +{ + __git_compute_merge_strategies + case "$prev" in + -s|--strategy) + __gitcomp "$__git_merge_strategies" + return 0 + esac + case "$cur" in + --strategy=*) + __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}" + return 0 + ;; + esac + return 1 +} + +__git_commands () { + if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}" + then + printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}" + else + git help -a|egrep '^ [a-zA-Z0-9]' + fi +} + +__git_list_all_commands () +{ + local i IFS=" "$'\n' + for i in $(__git_commands) + do + case $i in + *--*) : helper pattern;; + *) echo $i;; + esac + done +} + +__git_all_commands= +__git_compute_all_commands () +{ + test -n "$__git_all_commands" || + __git_all_commands=$(__git_list_all_commands) +} + +__git_list_porcelain_commands () +{ + local i IFS=" "$'\n' + __git_compute_all_commands + for i in $__git_all_commands + do + case $i in + *--*) : helper pattern;; + applymbox) : ask gittus;; + applypatch) : ask gittus;; + archimport) : import;; + cat-file) : plumbing;; + check-attr) : plumbing;; + check-ignore) : plumbing;; + check-mailmap) : plumbing;; + check-ref-format) : plumbing;; + checkout-index) : plumbing;; + column) : internal helper;; + commit-tree) : plumbing;; + count-objects) : infrequent;; + credential) : credentials;; + credential-*) : credentials helper;; + cvsexportcommit) : export;; + cvsimport) : import;; + cvsserver) : daemon;; + daemon) : daemon;; + diff-files) : plumbing;; + diff-index) : plumbing;; + diff-tree) : plumbing;; + fast-import) : import;; + fast-export) : export;; + fsck-objects) : plumbing;; + fetch-pack) : plumbing;; + fmt-merge-msg) : plumbing;; + for-each-ref) : plumbing;; + hash-object) : plumbing;; + http-*) : transport;; + index-pack) : plumbing;; + init-db) : deprecated;; + local-fetch) : plumbing;; + ls-files) : plumbing;; + ls-remote) : plumbing;; + ls-tree) : plumbing;; + mailinfo) : plumbing;; + mailsplit) : plumbing;; + merge-*) : plumbing;; + mktree) : plumbing;; + mktag) : plumbing;; + pack-objects) : plumbing;; + pack-redundant) : plumbing;; + pack-refs) : plumbing;; + parse-remote) : plumbing;; + patch-id) : plumbing;; + prune) : plumbing;; + prune-packed) : plumbing;; + quiltimport) : import;; + read-tree) : plumbing;; + receive-pack) : plumbing;; + remote-*) : transport;; + rerere) : plumbing;; + rev-list) : plumbing;; + rev-parse) : plumbing;; + runstatus) : plumbing;; + sh-setup) : internal;; + shell) : daemon;; + show-ref) : plumbing;; + send-pack) : plumbing;; + show-index) : plumbing;; + ssh-*) : transport;; + stripspace) : plumbing;; + symbolic-ref) : plumbing;; + unpack-file) : plumbing;; + unpack-objects) : plumbing;; + update-index) : plumbing;; + update-ref) : plumbing;; + update-server-info) : daemon;; + upload-archive) : plumbing;; + upload-pack) : plumbing;; + write-tree) : plumbing;; + var) : infrequent;; + verify-pack) : infrequent;; + verify-tag) : plumbing;; + *) echo $i;; + esac + done +} + +__git_porcelain_commands= +__git_compute_porcelain_commands () +{ + test -n "$__git_porcelain_commands" || + __git_porcelain_commands=$(__git_list_porcelain_commands) +} + +# Lists all set config variables starting with the given section prefix, +# with the prefix removed. +__git_get_config_variables () +{ + local section="$1" i IFS=$'\n' + for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do + echo "${i#$section.}" + done +} + +__git_pretty_aliases () +{ + __git_get_config_variables "pretty" +} + +__git_aliases () +{ + __git_get_config_variables "alias" +} + +# __git_aliased_command requires 1 argument +__git_aliased_command () +{ + local word cmdline=$(git --git-dir="$(__gitdir)" \ + config --get "alias.$1") + for word in $cmdline; do + case "$word" in + \!gitk|gitk) + echo "gitk" + return + ;; + \!*) : shell command alias ;; + -*) : option ;; + *=*) : setting env ;; + git) : git itself ;; + \(\)) : skip parens of shell function definition ;; + {) : skip start of shell helper function ;; + :) : skip null command ;; + \'*) : skip opening quote after sh -c ;; + *) + echo "$word" + return + esac + done +} + +# __git_find_on_cmdline requires 1 argument +__git_find_on_cmdline () +{ + local word subcommand c=1 + while [ $c -lt $cword ]; do + word="${words[c]}" + for subcommand in $1; do + if [ "$subcommand" = "$word" ]; then + echo "$subcommand" + return + fi + done + ((c++)) + done +} + +# Echo the value of an option set on the command line or config +# +# $1: short option name +# $2: long option name including = +# $3: list of possible values +# $4: config string (optional) +# +# example: +# result="$(__git_get_option_value "-d" "--do-something=" \ +# "yes no" "core.doSomething")" +# +# result is then either empty (no option set) or "yes" or "no" +# +# __git_get_option_value requires 3 arguments +__git_get_option_value () +{ + local c short_opt long_opt val + local result= values config_key word + + short_opt="$1" + long_opt="$2" + values="$3" + config_key="$4" + + ((c = $cword - 1)) + while [ $c -ge 0 ]; do + word="${words[c]}" + for val in $values; do + if [ "$short_opt$val" = "$word" ] || + [ "$long_opt$val" = "$word" ]; then + result="$val" + break 2 + fi + done + ((c--)) + done + + if [ -n "$config_key" ] && [ -z "$result" ]; then + result="$(git --git-dir="$(__gitdir)" config "$config_key")" + fi + + echo "$result" +} + +__git_has_doubledash () +{ + local c=1 + while [ $c -lt $cword ]; do + if [ "--" = "${words[c]}" ]; then + return 0 + fi + ((c++)) + done + return 1 +} + +# Try to count non option arguments passed on the command line for the +# specified git command. +# When options are used, it is necessary to use the special -- option to +# tell the implementation were non option arguments begin. +# XXX this can not be improved, since options can appear everywhere, as +# an example: +# git mv x -n y +# +# __git_count_arguments requires 1 argument: the git command executed. +__git_count_arguments () +{ + local word i c=0 + + # Skip "git" (first argument) + for ((i=1; i < ${#words[@]}; i++)); do + word="${words[i]}" + + case "$word" in + --) + # Good; we can assume that the following are only non + # option arguments. + ((c = 0)) + ;; + "$1") + # Skip the specified git command and discard git + # main options + ((c = 0)) + ;; + ?*) + ((c++)) + ;; + esac + done + + printf "%d" $c +} + +__git_whitespacelist="nowarn warn error error-all fix" + +_git_am () +{ + local dir="$(__gitdir)" + if [ -d "$dir"/rebase-apply ]; then + __gitcomp "--skip --continue --resolved --abort" + return + fi + case "$cur" in + --whitespace=*) + __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" + return + ;; + --*) + __gitcomp " + --3way --committer-date-is-author-date --ignore-date + --ignore-whitespace --ignore-space-change + --interactive --keep --no-utf8 --signoff --utf8 + --whitespace= --scissors + " + return + esac +} + +_git_apply () +{ + case "$cur" in + --whitespace=*) + __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" + return + ;; + --*) + __gitcomp " + --stat --numstat --summary --check --index + --cached --index-info --reverse --reject --unidiff-zero + --apply --no-add --exclude= + --ignore-whitespace --ignore-space-change + --whitespace= --inaccurate-eof --verbose + " + return + esac +} + +_git_add () +{ + case "$cur" in + --*) + __gitcomp " + --interactive --refresh --patch --update --dry-run + --ignore-errors --intent-to-add + " + return + esac + + # XXX should we check for --update and --all options ? + __git_complete_index_file "--others --modified --directory --no-empty-directory" +} + +_git_archive () +{ + case "$cur" in + --format=*) + __gitcomp "$(git archive --list)" "" "${cur##--format=}" + return + ;; + --remote=*) + __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}" + return + ;; + --*) + __gitcomp " + --format= --list --verbose + --prefix= --remote= --exec= + " + return + ;; + esac + __git_complete_file +} + +_git_bisect () +{ + __git_has_doubledash && return + + local subcommands="start bad good skip reset visualize replay log run" + local subcommand="$(__git_find_on_cmdline "$subcommands")" + if [ -z "$subcommand" ]; then + if [ -f "$(__gitdir)"/BISECT_START ]; then + __gitcomp "$subcommands" + else + __gitcomp "replay start" + fi + return + fi + + case "$subcommand" in + bad|good|reset|skip|start) + __gitcomp_nl "$(__git_refs)" + ;; + *) + ;; + esac +} + +_git_branch () +{ + local i c=1 only_local_ref="n" has_r="n" + + while [ $c -lt $cword ]; do + i="${words[c]}" + case "$i" in + -d|--delete|-m|--move) only_local_ref="y" ;; + -r|--remotes) has_r="y" ;; + esac + ((c++)) + done + + case "$cur" in + --set-upstream-to=*) + __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}" + ;; + --*) + __gitcomp " + --color --no-color --verbose --abbrev= --no-abbrev + --track --no-track --contains --merged --no-merged + --set-upstream-to= --edit-description --list + --unset-upstream --delete --move --remotes + " + ;; + *) + if [ $only_local_ref = "y" -a $has_r = "n" ]; then + __gitcomp_nl "$(__git_heads)" + else + __gitcomp_nl "$(__git_refs)" + fi + ;; + esac +} + +_git_bundle () +{ + local cmd="${words[2]}" + case "$cword" in + 2) + __gitcomp "create list-heads verify unbundle" + ;; + 3) + # looking for a file + ;; + *) + case "$cmd" in + create) + __git_complete_revlist + ;; + esac + ;; + esac +} + +_git_checkout () +{ + __git_has_doubledash && return + + case "$cur" in + --conflict=*) + __gitcomp "diff3 merge" "" "${cur##--conflict=}" + ;; + --*) + __gitcomp " + --quiet --ours --theirs --track --no-track --merge + --conflict= --orphan --patch + " + ;; + *) + # check if --track, --no-track, or --no-guess was specified + # if so, disable DWIM mode + local flags="--track --no-track --no-guess" track=1 + if [ -n "$(__git_find_on_cmdline "$flags")" ]; then + track='' + fi + __gitcomp_nl "$(__git_refs '' $track)" + ;; + esac +} + +_git_cherry () +{ + __gitcomp_nl "$(__git_refs)" +} + +_git_cherry_pick () +{ + local dir="$(__gitdir)" + if [ -f "$dir"/CHERRY_PICK_HEAD ]; then + __gitcomp "--continue --quit --abort" + return + fi + case "$cur" in + --*) + __gitcomp "--edit --no-commit --signoff --strategy= --mainline" + ;; + *) + __gitcomp_nl "$(__git_refs)" + ;; + esac +} + +_git_clean () +{ + case "$cur" in + --*) + __gitcomp "--dry-run --quiet" + return + ;; + esac + + # XXX should we check for -x option ? + __git_complete_index_file "--others --directory" +} + +_git_clone () +{ + case "$cur" in + --*) + __gitcomp " + --local + --no-hardlinks + --shared + --reference + --quiet + --no-checkout + --bare + --mirror + --origin + --upload-pack + --template= + --depth + --single-branch + --branch + --recurse-submodules + " + return + ;; + esac +} + +__git_untracked_file_modes="all no normal" + +_git_commit () +{ + case "$prev" in + -c|-C) + __gitcomp_nl "$(__git_refs)" "" "${cur}" + return + ;; + esac + + case "$cur" in + --cleanup=*) + __gitcomp "default scissors strip verbatim whitespace + " "" "${cur##--cleanup=}" + return + ;; + --reuse-message=*|--reedit-message=*|\ + --fixup=*|--squash=*) + __gitcomp_nl "$(__git_refs)" "" "${cur#*=}" + return + ;; + --untracked-files=*) + __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}" + return + ;; + --*) + __gitcomp " + --all --author= --signoff --verify --no-verify + --edit --no-edit + --amend --include --only --interactive + --dry-run --reuse-message= --reedit-message= + --reset-author --file= --message= --template= + --cleanup= --untracked-files --untracked-files= + --verbose --quiet --fixup= --squash= + " + return + esac + + if git rev-parse --verify --quiet HEAD >/dev/null; then + __git_complete_index_file "--committable" + else + # This is the first commit + __git_complete_index_file "--cached" + fi +} + +_git_describe () +{ + case "$cur" in + --*) + __gitcomp " + --all --tags --contains --abbrev= --candidates= + --exact-match --debug --long --match --always + " + return + esac + __gitcomp_nl "$(__git_refs)" +} + +__git_diff_algorithms="myers minimal patience histogram" + +__git_diff_submodule_formats="diff log short" + +__git_diff_common_options="--stat --numstat --shortstat --summary + --patch-with-stat --name-only --name-status --color + --no-color --color-words --no-renames --check + --full-index --binary --abbrev --diff-filter= + --find-copies-harder + --text --ignore-space-at-eol --ignore-space-change + --ignore-all-space --ignore-blank-lines --exit-code + --quiet --ext-diff --no-ext-diff + --no-prefix --src-prefix= --dst-prefix= + --inter-hunk-context= + --patience --histogram --minimal + --raw --word-diff --word-diff-regex= + --dirstat --dirstat= --dirstat-by-file + --dirstat-by-file= --cumulative + --diff-algorithm= + --submodule --submodule= +" + +_git_diff () +{ + __git_has_doubledash && return + + case "$cur" in + --diff-algorithm=*) + __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}" + return + ;; + --submodule=*) + __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}" + return + ;; + --*) + __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex + --base --ours --theirs --no-index + $__git_diff_common_options + " + return + ;; + esac + __git_complete_revlist_file +} + +__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff + tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare +" + +_git_difftool () +{ + __git_has_doubledash && return + + case "$cur" in + --tool=*) + __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}" + return + ;; + --*) + __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex + --base --ours --theirs + --no-renames --diff-filter= --find-copies-harder + --relative --ignore-submodules + --tool=" + return + ;; + esac + __git_complete_revlist_file +} + +__git_fetch_recurse_submodules="yes on-demand no" + +__git_fetch_options=" + --quiet --verbose --append --upload-pack --force --keep --depth= + --tags --no-tags --all --prune --dry-run --recurse-submodules= +" + +_git_fetch () +{ + case "$cur" in + --recurse-submodules=*) + __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}" + return + ;; + --*) + __gitcomp "$__git_fetch_options" + return + ;; + esac + __git_complete_remote_or_refspec +} + +__git_format_patch_options=" + --stdout --attach --no-attach --thread --thread= --no-thread + --numbered --start-number --numbered-files --keep-subject --signoff + --signature --no-signature --in-reply-to= --cc= --full-index --binary + --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix= + --inline --suffix= --ignore-if-in-upstream --subject-prefix= + --output-directory --reroll-count --to= --quiet --notes +" + +_git_format_patch () +{ + case "$cur" in + --thread=*) + __gitcomp " + deep shallow + " "" "${cur##--thread=}" + return + ;; + --*) + __gitcomp "$__git_format_patch_options" + return + ;; + esac + __git_complete_revlist +} + +_git_fsck () +{ + case "$cur" in + --*) + __gitcomp " + --tags --root --unreachable --cache --no-reflogs --full + --strict --verbose --lost-found + " + return + ;; + esac +} + +_git_gc () +{ + case "$cur" in + --*) + __gitcomp "--prune --aggressive" + return + ;; + esac +} + +_git_gitk () +{ + _gitk +} + +__git_match_ctag() { + awk "/^${1//\//\\/}/ { print \$1 }" "$2" +} + +_git_grep () +{ + __git_has_doubledash && return + + case "$cur" in + --*) + __gitcomp " + --cached + --text --ignore-case --word-regexp --invert-match + --full-name --line-number + --extended-regexp --basic-regexp --fixed-strings + --perl-regexp + --threads + --files-with-matches --name-only + --files-without-match + --max-depth + --count + --and --or --not --all-match + " + return + ;; + esac + + case "$cword,$prev" in + 2,*|*,-*) + if test -r tags; then + __gitcomp_nl "$(__git_match_ctag "$cur" tags)" + return + fi + ;; + esac + + __gitcomp_nl "$(__git_refs)" +} + +_git_help () +{ + case "$cur" in + --*) + __gitcomp "--all --guides --info --man --web" + return + ;; + esac + __git_compute_all_commands + __gitcomp "$__git_all_commands $(__git_aliases) + attributes cli core-tutorial cvs-migration + diffcore everyday gitk glossary hooks ignore modules + namespaces repository-layout revisions tutorial tutorial-2 + workflows + " +} + +_git_init () +{ + case "$cur" in + --shared=*) + __gitcomp " + false true umask group all world everybody + " "" "${cur##--shared=}" + return + ;; + --*) + __gitcomp "--quiet --bare --template= --shared --shared=" + return + ;; + esac +} + +_git_ls_files () +{ + case "$cur" in + --*) + __gitcomp "--cached --deleted --modified --others --ignored + --stage --directory --no-empty-directory --unmerged + --killed --exclude= --exclude-from= + --exclude-per-directory= --exclude-standard + --error-unmatch --with-tree= --full-name + --abbrev --ignored --exclude-per-directory + " + return + ;; + esac + + # XXX ignore options like --modified and always suggest all cached + # files. + __git_complete_index_file "--cached" +} + +_git_ls_remote () +{ + __gitcomp_nl "$(__git_remotes)" +} + +_git_ls_tree () +{ + __git_complete_file +} + +# Options that go well for log, shortlog and gitk +__git_log_common_options=" + --not --all + --branches --tags --remotes + --first-parent --merges --no-merges + --max-count= + --max-age= --since= --after= + --min-age= --until= --before= + --min-parents= --max-parents= + --no-min-parents --no-max-parents +" +# Options that go well for log and gitk (not shortlog) +__git_log_gitk_options=" + --dense --sparse --full-history + --simplify-merges --simplify-by-decoration + --left-right --notes --no-notes +" +# Options that go well for log and shortlog (not gitk) +__git_log_shortlog_options=" + --author= --committer= --grep= + --all-match --invert-grep +" + +__git_log_pretty_formats="oneline short medium full fuller email raw format:" +__git_log_date_formats="relative iso8601 rfc2822 short local default raw" + +_git_log () +{ + __git_has_doubledash && return + + local g="$(git rev-parse --git-dir 2>/dev/null)" + local merge="" + if [ -f "$g/MERGE_HEAD" ]; then + merge="--merge" + fi + case "$cur" in + --pretty=*|--format=*) + __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) + " "" "${cur#*=}" + return + ;; + --date=*) + __gitcomp "$__git_log_date_formats" "" "${cur##--date=}" + return + ;; + --decorate=*) + __gitcomp "full short no" "" "${cur##--decorate=}" + return + ;; + --diff-algorithm=*) + __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}" + return + ;; + --submodule=*) + __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}" + return + ;; + --*) + __gitcomp " + $__git_log_common_options + $__git_log_shortlog_options + $__git_log_gitk_options + --root --topo-order --date-order --reverse + --follow --full-diff + --abbrev-commit --abbrev= + --relative-date --date= + --pretty= --format= --oneline + --show-signature + --cherry-mark + --cherry-pick + --graph + --decorate --decorate= + --walk-reflogs + --parents --children + $merge + $__git_diff_common_options + --pickaxe-all --pickaxe-regex + " + return + ;; + esac + __git_complete_revlist +} + +# Common merge options shared by git-merge(1) and git-pull(1). +__git_merge_options=" + --no-commit --no-stat --log --no-log --squash --strategy + --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit + --verify-signatures --no-verify-signatures --gpg-sign + --quiet --verbose --progress --no-progress +" + +_git_merge () +{ + __git_complete_strategy && return + + case "$cur" in + --*) + __gitcomp "$__git_merge_options + --rerere-autoupdate --no-rerere-autoupdate --abort --continue" + return + esac + __gitcomp_nl "$(__git_refs)" +} + +_git_mergetool () +{ + case "$cur" in + --tool=*) + __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}" + return + ;; + --*) + __gitcomp "--tool=" + return + ;; + esac +} + +_git_merge_base () +{ + case "$cur" in + --*) + __gitcomp "--octopus --independent --is-ancestor --fork-point" + return + ;; + esac + __gitcomp_nl "$(__git_refs)" +} + +_git_mv () +{ + case "$cur" in + --*) + __gitcomp "--dry-run" + return + ;; + esac + + if [ $(__git_count_arguments "mv") -gt 0 ]; then + # We need to show both cached and untracked files (including + # empty directories) since this may not be the last argument. + __git_complete_index_file "--cached --others --directory" + else + __git_complete_index_file "--cached" + fi +} + +_git_name_rev () +{ + __gitcomp "--tags --all --stdin" +} + +_git_notes () +{ + local subcommands='add append copy edit list prune remove show' + local subcommand="$(__git_find_on_cmdline "$subcommands")" + + case "$subcommand,$cur" in + ,--*) + __gitcomp '--ref' + ;; + ,*) + case "$prev" in + --ref) + __gitcomp_nl "$(__git_refs)" + ;; + *) + __gitcomp "$subcommands --ref" + ;; + esac + ;; + add,--reuse-message=*|append,--reuse-message=*|\ + add,--reedit-message=*|append,--reedit-message=*) + __gitcomp_nl "$(__git_refs)" "" "${cur#*=}" + ;; + add,--*|append,--*) + __gitcomp '--file= --message= --reedit-message= + --reuse-message=' + ;; + copy,--*) + __gitcomp '--stdin' + ;; + prune,--*) + __gitcomp '--dry-run --verbose' + ;; + prune,*) + ;; + *) + case "$prev" in + -m|-F) + ;; + *) + __gitcomp_nl "$(__git_refs)" + ;; + esac + ;; + esac +} + +_git_pull () +{ + __git_complete_strategy && return + + case "$cur" in + --recurse-submodules=*) + __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}" + return + ;; + --*) + __gitcomp " + --rebase --no-rebase + $__git_merge_options + $__git_fetch_options + " + return + ;; + esac + __git_complete_remote_or_refspec +} + +__git_push_recurse_submodules="check on-demand" + +__git_complete_force_with_lease () +{ + local cur_=$1 + + case "$cur_" in + --*=) + ;; + *:*) + __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}" + ;; + *) + __gitcomp_nl "$(__git_refs)" "" "$cur_" + ;; + esac +} + +_git_push () +{ + case "$prev" in + --repo) + __gitcomp_nl "$(__git_remotes)" + return + ;; + --recurse-submodules) + __gitcomp "$__git_push_recurse_submodules" + return + ;; + esac + case "$cur" in + --repo=*) + __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}" + return + ;; + --recurse-submodules=*) + __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}" + return + ;; + --force-with-lease=*) + __git_complete_force_with_lease "${cur##--force-with-lease=}" + return + ;; + --*) + __gitcomp " + --all --mirror --tags --dry-run --force --verbose + --quiet --prune --delete --follow-tags + --receive-pack= --repo= --set-upstream + --force-with-lease --force-with-lease= --recurse-submodules= + " + return + ;; + esac + __git_complete_remote_or_refspec +} + +_git_rebase () +{ + local dir="$(__gitdir)" + if [ -f "$dir"/rebase-merge/interactive ]; then + __gitcomp "--continue --skip --abort --quit --edit-todo" + return + elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then + __gitcomp "--continue --skip --abort --quit" + return + fi + __git_complete_strategy && return + case "$cur" in + --whitespace=*) + __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" + return + ;; + --*) + __gitcomp " + --onto --merge --strategy --interactive + --preserve-merges --stat --no-stat + --committer-date-is-author-date --ignore-date + --ignore-whitespace --whitespace= + --autosquash --no-autosquash + --fork-point --no-fork-point + --autostash --no-autostash + --verify --no-verify + --keep-empty --root --force-rebase --no-ff + --exec + " + + return + esac + __gitcomp_nl "$(__git_refs)" +} + +_git_reflog () +{ + local subcommands="show delete expire" + local subcommand="$(__git_find_on_cmdline "$subcommands")" + + if [ -z "$subcommand" ]; then + __gitcomp "$subcommands" + else + __gitcomp_nl "$(__git_refs)" + fi +} + +__git_send_email_confirm_options="always never auto cc compose" +__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all" + +_git_send_email () +{ + case "$prev" in + --to|--cc|--bcc|--from) + __gitcomp " + $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null) + " + return + ;; + esac + + case "$cur" in + --confirm=*) + __gitcomp " + $__git_send_email_confirm_options + " "" "${cur##--confirm=}" + return + ;; + --suppress-cc=*) + __gitcomp " + $__git_send_email_suppresscc_options + " "" "${cur##--suppress-cc=}" + + return + ;; + --smtp-encryption=*) + __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}" + return + ;; + --thread=*) + __gitcomp " + deep shallow + " "" "${cur##--thread=}" + return + ;; + --to=*|--cc=*|--bcc=*|--from=*) + __gitcomp " + $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null) + " "" "${cur#--*=}" + return + ;; + --*) + __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to + --compose --confirm= --dry-run --envelope-sender + --from --identity + --in-reply-to --no-chain-reply-to --no-signed-off-by-cc + --no-suppress-from --no-thread --quiet + --signed-off-by-cc --smtp-pass --smtp-server + --smtp-server-port --smtp-encryption= --smtp-user + --subject --suppress-cc= --suppress-from --thread --to + --validate --no-validate + $__git_format_patch_options" + return + ;; + esac + __git_complete_revlist +} + +_git_stage () +{ + _git_add +} + +_git_status () +{ + local complete_opt + local untracked_state + + case "$cur" in + --ignore-submodules=*) + __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}" + return + ;; + --untracked-files=*) + __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}" + return + ;; + --column=*) + __gitcomp " + always never auto column row plain dense nodense + " "" "${cur##--column=}" + return + ;; + --*) + __gitcomp " + --short --branch --porcelain --long --verbose + --untracked-files= --ignore-submodules= --ignored + --column= --no-column + " + return + ;; + esac + + untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \ + "$__git_untracked_file_modes" "status.showUntrackedFiles")" + + case "$untracked_state" in + no) + # --ignored option does not matter + complete_opt= + ;; + all|normal|*) + complete_opt="--cached --directory --no-empty-directory --others" + + if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then + complete_opt="$complete_opt --ignored --exclude=*" + fi + ;; + esac + + __git_complete_index_file "$complete_opt" +} + +__git_config_get_set_variables () +{ + local prevword word config_file= c=$cword + while [ $c -gt 1 ]; do + word="${words[c]}" + case "$word" in + --system|--global|--local|--file=*) + config_file="$word" + break + ;; + -f|--file) + config_file="$word $prevword" + break + ;; + esac + prevword=$word + c=$((--c)) + done + + git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null +} + +_git_config () +{ + case "$prev" in + branch.*.remote|branch.*.pushremote) + __gitcomp_nl "$(__git_remotes)" + return + ;; + branch.*.merge) + __gitcomp_nl "$(__git_refs)" + return + ;; + branch.*.rebase) + __gitcomp "false true preserve interactive" + return + ;; + remote.pushdefault) + __gitcomp_nl "$(__git_remotes)" + return + ;; + remote.*.fetch) + local remote="${prev#remote.}" + remote="${remote%.fetch}" + if [ -z "$cur" ]; then + __gitcomp_nl "refs/heads/" "" "" "" + return + fi + __gitcomp_nl "$(__git_refs_remotes "$remote")" + return + ;; + remote.*.push) + local remote="${prev#remote.}" + remote="${remote%.push}" + __gitcomp_nl "$(git --git-dir="$(__gitdir)" \ + for-each-ref --format='%(refname):%(refname)' \ + refs/heads)" + return + ;; + pull.twohead|pull.octopus) + __git_compute_merge_strategies + __gitcomp "$__git_merge_strategies" + return + ;; + color.branch|color.diff|color.interactive|\ + color.showbranch|color.status|color.ui) + __gitcomp "always never auto" + return + ;; + color.pager) + __gitcomp "false true" + return + ;; + color.*.*) + __gitcomp " + normal black red green yellow blue magenta cyan white + bold dim ul blink reverse + " + return + ;; + diff.submodule) + __gitcomp "log short" + return + ;; + help.format) + __gitcomp "man info web html" + return + ;; + log.date) + __gitcomp "$__git_log_date_formats" + return + ;; + sendemail.aliasesfiletype) + __gitcomp "mutt mailrc pine elm gnus" + return + ;; + sendemail.confirm) + __gitcomp "$__git_send_email_confirm_options" + return + ;; + sendemail.suppresscc) + __gitcomp "$__git_send_email_suppresscc_options" + return + ;; + sendemail.transferencoding) + __gitcomp "7bit 8bit quoted-printable base64" + return + ;; + --get|--get-all|--unset|--unset-all) + __gitcomp_nl "$(__git_config_get_set_variables)" + return + ;; + *.*) + return + ;; + esac + case "$cur" in + --*) + __gitcomp " + --system --global --local --file= + --list --replace-all + --get --get-all --get-regexp + --add --unset --unset-all + --remove-section --rename-section + --name-only + " + return + ;; + branch.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_" + return + ;; + branch.*) + local pfx="${cur%.*}." cur_="${cur#*.}" + __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "." + __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_" + return + ;; + guitool.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp " + argprompt cmd confirm needsfile noconsole norescan + prompt revprompt revunmerged title + " "$pfx" "$cur_" + return + ;; + difftool.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp "cmd path" "$pfx" "$cur_" + return + ;; + man.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp "cmd path" "$pfx" "$cur_" + return + ;; + mergetool.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp "cmd path trustExitCode" "$pfx" "$cur_" + return + ;; + pager.*) + local pfx="${cur%.*}." cur_="${cur#*.}" + __git_compute_all_commands + __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_" + return + ;; + remote.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp " + url proxy fetch push mirror skipDefaultUpdate + receivepack uploadpack tagopt pushurl + " "$pfx" "$cur_" + return + ;; + remote.*) + local pfx="${cur%.*}." cur_="${cur#*.}" + __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "." + __gitcomp_nl_append "pushdefault" "$pfx" "$cur_" + return + ;; + url.*.*) + local pfx="${cur%.*}." cur_="${cur##*.}" + __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_" + return + ;; + esac + __gitcomp " + add.ignoreErrors + advice.commitBeforeMerge + advice.detachedHead + advice.implicitIdentity + advice.pushNonFastForward + advice.resolveConflict + advice.statusHints + alias. + am.keepcr + apply.ignorewhitespace + apply.whitespace + branch.autosetupmerge + branch.autosetuprebase + browser. + clean.requireForce + color.branch + color.branch.current + color.branch.local + color.branch.plain + color.branch.remote + color.decorate.HEAD + color.decorate.branch + color.decorate.remoteBranch + color.decorate.stash + color.decorate.tag + color.diff + color.diff.commit + color.diff.frag + color.diff.func + color.diff.meta + color.diff.new + color.diff.old + color.diff.plain + color.diff.whitespace + color.grep + color.grep.context + color.grep.filename + color.grep.function + color.grep.linenumber + color.grep.match + color.grep.selected + color.grep.separator + color.interactive + color.interactive.error + color.interactive.header + color.interactive.help + color.interactive.prompt + color.pager + color.showbranch + color.status + color.status.added + color.status.changed + color.status.header + color.status.nobranch + color.status.unmerged + color.status.untracked + color.status.updated + color.ui + commit.status + commit.template + core.abbrev + core.askpass + core.attributesfile + core.autocrlf + core.bare + core.bigFileThreshold + core.compression + core.createObject + core.deltaBaseCacheLimit + core.editor + core.eol + core.excludesfile + core.fileMode + core.fsyncobjectfiles + core.gitProxy + core.ignoreStat + core.ignorecase + core.logAllRefUpdates + core.loosecompression + core.notesRef + core.packedGitLimit + core.packedGitWindowSize + core.pager + core.preferSymlinkRefs + core.preloadindex + core.quotepath + core.repositoryFormatVersion + core.safecrlf + core.sharedRepository + core.sparseCheckout + core.symlinks + core.trustctime + core.untrackedCache + core.warnAmbiguousRefs + core.whitespace + core.worktree + diff.autorefreshindex + diff.external + diff.ignoreSubmodules + diff.mnemonicprefix + diff.noprefix + diff.renameLimit + diff.renames + diff.statGraphWidth + diff.submodule + diff.suppressBlankEmpty + diff.tool + diff.wordRegex + diff.algorithm + difftool. + difftool.prompt + fetch.recurseSubmodules + fetch.unpackLimit + format.attach + format.cc + format.coverLetter + format.from + format.headers + format.numbered + format.pretty + format.signature + format.signoff + format.subjectprefix + format.suffix + format.thread + format.to + gc. + gc.aggressiveWindow + gc.auto + gc.autopacklimit + gc.packrefs + gc.pruneexpire + gc.reflogexpire + gc.reflogexpireunreachable + gc.rerereresolved + gc.rerereunresolved + gitcvs.allbinary + gitcvs.commitmsgannotation + gitcvs.dbTableNamePrefix + gitcvs.dbdriver + gitcvs.dbname + gitcvs.dbpass + gitcvs.dbuser + gitcvs.enabled + gitcvs.logfile + gitcvs.usecrlfattr + guitool. + gui.blamehistoryctx + gui.commitmsgwidth + gui.copyblamethreshold + gui.diffcontext + gui.encoding + gui.fastcopyblame + gui.matchtrackingbranch + gui.newbranchtemplate + gui.pruneduringfetch + gui.spellingdictionary + gui.trustmtime + help.autocorrect + help.browser + help.format + http.lowSpeedLimit + http.lowSpeedTime + http.maxRequests + http.minSessions + http.noEPSV + http.postBuffer + http.proxy + http.sslCipherList + http.sslVersion + http.sslCAInfo + http.sslCAPath + http.sslCert + http.sslCertPasswordProtected + http.sslKey + http.sslVerify + http.useragent + i18n.commitEncoding + i18n.logOutputEncoding + imap.authMethod + imap.folder + imap.host + imap.pass + imap.port + imap.preformattedHTML + imap.sslverify + imap.tunnel + imap.user + init.templatedir + instaweb.browser + instaweb.httpd + instaweb.local + instaweb.modulepath + instaweb.port + interactive.singlekey + log.date + log.decorate + log.showroot + mailmap.file + man. + man.viewer + merge. + merge.conflictstyle + merge.log + merge.renameLimit + merge.renormalize + merge.stat + merge.tool + merge.verbosity + mergetool. + mergetool.keepBackup + mergetool.keepTemporaries + mergetool.prompt + notes.displayRef + notes.rewrite. + notes.rewrite.amend + notes.rewrite.rebase + notes.rewriteMode + notes.rewriteRef + pack.compression + pack.deltaCacheLimit + pack.deltaCacheSize + pack.depth + pack.indexVersion + pack.packSizeLimit + pack.threads + pack.window + pack.windowMemory + pager. + pretty. + pull.octopus + pull.twohead + push.default + push.followTags + rebase.autosquash + rebase.stat + receive.autogc + receive.denyCurrentBranch + receive.denyDeleteCurrent + receive.denyDeletes + receive.denyNonFastForwards + receive.fsckObjects + receive.unpackLimit + receive.updateserverinfo + remote.pushdefault + remotes. + repack.usedeltabaseoffset + rerere.autoupdate + rerere.enabled + sendemail. + sendemail.aliasesfile + sendemail.aliasfiletype + sendemail.bcc + sendemail.cc + sendemail.cccmd + sendemail.chainreplyto + sendemail.confirm + sendemail.envelopesender + sendemail.from + sendemail.identity + sendemail.multiedit + sendemail.signedoffbycc + sendemail.smtpdomain + sendemail.smtpencryption + sendemail.smtppass + sendemail.smtpserver + sendemail.smtpserveroption + sendemail.smtpserverport + sendemail.smtpuser + sendemail.suppresscc + sendemail.suppressfrom + sendemail.thread + sendemail.to + sendemail.validate + showbranch.default + status.relativePaths + status.showUntrackedFiles + status.submodulesummary + submodule. + tar.umask + transfer.unpackLimit + url. + user.email + user.name + user.signingkey + web.browser + branch. remote. + " +} + +_git_remote () +{ + local subcommands="add rename remove set-head set-branches set-url show prune update" + local subcommand="$(__git_find_on_cmdline "$subcommands")" + if [ -z "$subcommand" ]; then + __gitcomp "$subcommands" + return + fi + + case "$subcommand" in + rename|remove|set-url|show|prune) + __gitcomp_nl "$(__git_remotes)" + ;; + set-head|set-branches) + __git_complete_remote_or_refspec + ;; + update) + __gitcomp "$(__git_get_config_variables "remotes")" + ;; + *) + ;; + esac +} + +_git_replace () +{ + __gitcomp_nl "$(__git_refs)" +} + +_git_reset () +{ + __git_has_doubledash && return + + case "$cur" in + --*) + __gitcomp "--merge --mixed --hard --soft --patch" + return + ;; + esac + __gitcomp_nl "$(__git_refs)" +} + +_git_revert () +{ + local dir="$(__gitdir)" + if [ -f "$dir"/REVERT_HEAD ]; then + __gitcomp "--continue --quit --abort" + return + fi + case "$cur" in + --*) + __gitcomp "--edit --mainline --no-edit --no-commit --signoff" + return + ;; + esac + __gitcomp_nl "$(__git_refs)" +} + +_git_rm () +{ + case "$cur" in + --*) + __gitcomp "--cached --dry-run --ignore-unmatch --quiet" + return + ;; + esac + + __git_complete_index_file "--cached" +} + +_git_shortlog () +{ + __git_has_doubledash && return + + case "$cur" in + --*) + __gitcomp " + $__git_log_common_options + $__git_log_shortlog_options + --numbered --summary + " + return + ;; + esac + __git_complete_revlist +} + +_git_show () +{ + __git_has_doubledash && return + + case "$cur" in + --pretty=*|--format=*) + __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) + " "" "${cur#*=}" + return + ;; + --diff-algorithm=*) + __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}" + return + ;; + --submodule=*) + __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}" + return + ;; + --*) + __gitcomp "--pretty= --format= --abbrev-commit --oneline + --show-signature + $__git_diff_common_options + " + return + ;; + esac + __git_complete_revlist_file +} + +_git_show_branch () +{ + case "$cur" in + --*) + __gitcomp " + --all --remotes --topo-order --date-order --current --more= + --list --independent --merge-base --no-name + --color --no-color + --sha1-name --sparse --topics --reflog + " + return + ;; + esac + __git_complete_revlist +} + +_git_stash () +{ + local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked' + local subcommands='save list show apply clear drop pop create branch' + local subcommand="$(__git_find_on_cmdline "$subcommands")" + if [ -z "$subcommand" ]; then + case "$cur" in + --*) + __gitcomp "$save_opts" + ;; + *) + if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then + __gitcomp "$subcommands" + fi + ;; + esac + else + case "$subcommand,$cur" in + save,--*) + __gitcomp "$save_opts" + ;; + apply,--*|pop,--*) + __gitcomp "--index --quiet" + ;; + drop,--*) + __gitcomp "--quiet" + ;; + show,--*|branch,--*) + ;; + branch,*) + if [ $cword -eq 3 ]; then + __gitcomp_nl "$(__git_refs)"; + else + __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \ + | sed -n -e 's/:.*//p')" + fi + ;; + show,*|apply,*|drop,*|pop,*) + __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \ + | sed -n -e 's/:.*//p')" + ;; + *) + ;; + esac + fi +} + +_git_submodule () +{ + __git_has_doubledash && return + + local subcommands="add status init deinit update summary foreach sync" + if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then + case "$cur" in + --*) + __gitcomp "--quiet --cached" + ;; + *) + __gitcomp "$subcommands" + ;; + esac + return + fi +} + +_git_svn () +{ + local subcommands=" + init fetch clone rebase dcommit log find-rev + set-tree commit-diff info create-ignore propget + proplist show-ignore show-externals branch tag blame + migrate mkdirs reset gc + " + local subcommand="$(__git_find_on_cmdline "$subcommands")" + if [ -z "$subcommand" ]; then + __gitcomp "$subcommands" + else + local remote_opts="--username= --config-dir= --no-auth-cache" + local fc_opts=" + --follow-parent --authors-file= --repack= + --no-metadata --use-svm-props --use-svnsync-props + --log-window-size= --no-checkout --quiet + --repack-flags --use-log-author --localtime + --ignore-paths= --include-paths= $remote_opts + " + local init_opts=" + --template= --shared= --trunk= --tags= + --branches= --stdlayout --minimize-url + --no-metadata --use-svm-props --use-svnsync-props + --rewrite-root= --prefix= --use-log-author + --add-author-from $remote_opts + " + local cmt_opts=" + --edit --rmdir --find-copies-harder --copy-similarity= + " + + case "$subcommand,$cur" in + fetch,--*) + __gitcomp "--revision= --fetch-all $fc_opts" + ;; + clone,--*) + __gitcomp "--revision= $fc_opts $init_opts" + ;; + init,--*) + __gitcomp "$init_opts" + ;; + dcommit,--*) + __gitcomp " + --merge --strategy= --verbose --dry-run + --fetch-all --no-rebase --commit-url + --revision --interactive $cmt_opts $fc_opts + " + ;; + set-tree,--*) + __gitcomp "--stdin $cmt_opts $fc_opts" + ;; + create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\ + show-externals,--*|mkdirs,--*) + __gitcomp "--revision=" + ;; + log,--*) + __gitcomp " + --limit= --revision= --verbose --incremental + --oneline --show-commit --non-recursive + --authors-file= --color + " + ;; + rebase,--*) + __gitcomp " + --merge --verbose --strategy= --local + --fetch-all --dry-run $fc_opts + " + ;; + commit-diff,--*) + __gitcomp "--message= --file= --revision= $cmt_opts" + ;; + info,--*) + __gitcomp "--url" + ;; + branch,--*) + __gitcomp "--dry-run --message --tag" + ;; + tag,--*) + __gitcomp "--dry-run --message" + ;; + blame,--*) + __gitcomp "--git-format" + ;; + migrate,--*) + __gitcomp " + --config-dir= --ignore-paths= --minimize + --no-auth-cache --username= + " + ;; + reset,--*) + __gitcomp "--revision= --parent" + ;; + *) + ;; + esac + fi +} + +_git_tag () +{ + local i c=1 f=0 + while [ $c -lt $cword ]; do + i="${words[c]}" + case "$i" in + -d|-v) + __gitcomp_nl "$(__git_tags)" + return + ;; + -f) + f=1 + ;; + esac + ((c++)) + done + + case "$prev" in + -m|-F) + ;; + -*|tag) + if [ $f = 1 ]; then + __gitcomp_nl "$(__git_tags)" + fi + ;; + *) + __gitcomp_nl "$(__git_refs)" + ;; + esac + + case "$cur" in + --*) + __gitcomp " + --list --delete --verify --annotate --message --file + --sign --cleanup --local-user --force --column --sort + --contains --points-at + " + ;; + esac +} + +_git_whatchanged () +{ + _git_log +} + +_git_worktree () +{ + local subcommands="add list lock prune unlock" + local subcommand="$(__git_find_on_cmdline "$subcommands")" + if [ -z "$subcommand" ]; then + __gitcomp "$subcommands" + else + case "$subcommand,$cur" in + add,--*) + __gitcomp "--detach" + ;; + list,--*) + __gitcomp "--porcelain" + ;; + lock,--*) + __gitcomp "--reason" + ;; + prune,--*) + __gitcomp "--dry-run --expire --verbose" + ;; + *) + ;; + esac + fi +} + +__git_main () +{ + local i c=1 command __git_dir + + while [ $c -lt $cword ]; do + i="${words[c]}" + case "$i" in + --git-dir=*) __git_dir="${i#--git-dir=}" ;; + --git-dir) ((c++)) ; __git_dir="${words[c]}" ;; + --bare) __git_dir="." ;; + --help) command="help"; break ;; + -c|--work-tree|--namespace) ((c++)) ;; + -*) ;; + *) command="$i"; break ;; + esac + ((c++)) + done + + if [ -z "$command" ]; then + case "$cur" in + --*) __gitcomp " + --paginate + --no-pager + --git-dir= + --bare + --version + --exec-path + --exec-path= + --html-path + --man-path + --info-path + --work-tree= + --namespace= + --no-replace-objects + --help + " + ;; + *) __git_compute_porcelain_commands + __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;; + esac + return + fi + + local completion_func="_git_${command//-/_}" + declare -f $completion_func >/dev/null && $completion_func && return + + local expansion=$(__git_aliased_command "$command") + if [ -n "$expansion" ]; then + words[1]=$expansion + completion_func="_git_${expansion//-/_}" + declare -f $completion_func >/dev/null && $completion_func + fi +} + +__gitk_main () +{ + __git_has_doubledash && return + + local g="$(__gitdir)" + local merge="" + if [ -f "$g/MERGE_HEAD" ]; then + merge="--merge" + fi + case "$cur" in + --*) + __gitcomp " + $__git_log_common_options + $__git_log_gitk_options + $merge + " + return + ;; + esac + __git_complete_revlist +} + +if [[ -n ${ZSH_VERSION-} ]]; then + echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2 + + autoload -U +X compinit && compinit + + __gitcomp () + { + emulate -L zsh + + local cur_="${3-$cur}" + + case "$cur_" in + --*=) + ;; + *) + local c IFS=$' \t\n' + local -a array + for c in ${=1}; do + c="$c${4-}" + case $c in + --*=*|*.) ;; + *) c="$c " ;; + esac + array[${#array[@]}+1]="$c" + done + compset -P '*[=:]' + compadd -Q -S '' -p "${2-}" -a -- array && _ret=0 + ;; + esac + } + + __gitcomp_nl () + { + emulate -L zsh + + local IFS=$'\n' + compset -P '*[=:]' + compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0 + } + + __gitcomp_file () + { + emulate -L zsh + + local IFS=$'\n' + compset -P '*[=:]' + compadd -Q -p "${2-}" -f -- ${=1} && _ret=0 + } + + _git () + { + local _ret=1 cur cword prev + cur=${words[CURRENT]} + prev=${words[CURRENT-1]} + let cword=CURRENT-1 + emulate ksh -c __${service}_main + let _ret && _default && _ret=0 + return _ret + } + + compdef _git git gitk + return +fi + +__git_func_wrap () +{ + local cur words cword prev + _get_comp_words_by_ref -n =: cur words cword prev + $1 +} + +# Setup completion for certain functions defined above by setting common +# variables and workarounds. +# This is NOT a public function; use at your own risk. +__git_complete () +{ + local wrapper="__git_wrap${2}" + eval "$wrapper () { __git_func_wrap $2 ; }" + complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \ + || complete -o default -o nospace -F $wrapper $1 +} + +# wrapper for backwards compatibility +_git () +{ + __git_wrap__git_main +} + +# wrapper for backwards compatibility +_gitk () +{ + __git_wrap__gitk_main +} + +__git_complete git __git_main +__git_complete gitk __gitk_main + +# The following are necessary only for Cygwin, and only are needed +# when the user has tab-completed the executable name and consequently +# included the '.exe' suffix. +# +if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then +__git_complete git.exe __git_main +fi diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 0000000..9b95c26 --- /dev/null +++ b/.gitconfig @@ -0,0 +1,47 @@ +[user] + name = Dongsu Park + email = dpark@posteo.net +[alias] + br = branch + co = checkout + ci = commit + cireset = commit --amend --no-edit --date=now + dump = cat-file -p + hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short + last = log -1 HEAD + st = status + type = cat-file -t + unstage = reset HEAD -- + visual = !gitk +[core] + abbrev = 8 +[sendemail] + smtpencryption = tls + smtpserver = posteo.de + smtpserverport = 587 + smtpuser = dpark@posteo.net + from = "Dongsu Park " + bcc = dpark@posteo.net +[color] + ui = true +[format] + suffix = .patch + numbered = auto + bcc = dpark@posteo.net + signoff = false + thread = true +[imap] + folder = "[Gmail]/Drafts" + host = imaps://posteo.de + user = dpark@posteo.net + port = 993 + sslverify = false +[merge] + tool = meld + renamelimit = 5000 +[color] + ui = true +[diff "odf"] + textconv=odt2txt +[diff "default"] + xfuncname = "^[[:alpha:]$_].*[^:]$" diff --git a/.muttrc b/.muttrc new file mode 100644 index 0000000..56dc830 --- /dev/null +++ b/.muttrc @@ -0,0 +1,119 @@ +# A basic .muttrc for multiple accounts +# Dongsu Park + +# Change the following six lines to your Gmail account details +set imap_user = "dpark@posteo.net" +set smtp_url = "smtp://hipporoll@posteo.de@posteo.de:587/" +set my_pass1 = "`awk '/posteo:/ {print $2}' ~/.secret/passwd`" +set my_pass2 = "`awk '/advance38:/ {print $2}' ~/.secret/passwd`" +set imap_pass = $my_pass1 +set smtp_pass = $my_pass1 + +set from = "dpark@posteo.net" +set realname = "Dongsu Park" + +# Change the following line to a different editor you prefer. +set editor = "vim +/^$" + +# Basic config, you can leave this as is +set folder = "$HOME/Maildir" + +set mbox = '~/Maildir' +set mbox_type = Maildir +set postponed = "+posteo/Drafts" +set record = "+posteo/Sent" +set spoolfile = "+posteo/INBOX" + +set certificate_file=~/.mutt/certificates +set header_cache=~/.mutt/cache/headers +set message_cachedir=~/.mutt/cache/bodies + +set hostname = posteo.de +set imap_keepalive = 300 +set mail_check = 30 +set timeout = 300 + +set date_format="%d.%m.%Y %H:%M" +set folder_format="%2C %t %8s %d %N %f" +set index_format="%4C %Z %D %-15.15L (%4l) %s" +set pager_format="%-10.10i %[!%d.%m.%Y %R]" + +set abort_nosubject = no +set auto_tag = yes +set beep = no +set delete = yes +set edit_headers = yes +set fast_reply = yes +set include = yes +set markers = no +set move = no +set menu_scroll +set pager_context = 1 +set pager_index_lines = 6 +set pgp_verify_sig = no +set imap_check_subscribed +set sort = 'threads' +set sort_aux = 'last-date-sent' +set sort_browser = 'unsorted' +set ssl_starttls = yes +set ssl_min_dh_prime_bits = 512 +set sendmail = '/usr/bin/ssmtp' +set assumed_charset="utf-8:euc-kr:iso-8859-1" +set charset="utf-8" +set config_charset="utf-8" +set send_charset="utf-8:euc-kr:iso-8859-1" + +alternates '(advance38|dpark1978)([-+].*)?@.*' + +ignore * +unignore From To Cc Date Subject Organization +hdr_order From To Cc Date +alternative_order text/plain text/html * +auto_view text/html + +account-hook 'imaps://hipporoll@posteo.de' \ + 'set imap_user="hipporoll@posteo.de" imap_pass="$my_pass1"' +account-hook 'imaps://advance38@imap.gmail.com' \ + 'set imap_user="advance38@gmail.com" imap_pass="$my_pass2"' + +folder-hook posteo/* 'set from="Dongsu Park " \ + smtp_url="smtp://hipporoll@posteo.de@posteo.de:587" smtp_pass="$my_pass1" \ + record="+posteo/Sent" postponed="+posteo/Drafts"' +folder-hook advance38/* 'set from="Dongsu Park " \ + smtp_url="smtp://advance38@smtp.gmail.com:587" smtp_pass="$my_pass2" \ + record="+advance38/[Gmail].Sent Mail" postponed = "+advance38/[Gmail].Drafts"' + +mailboxes ! +posteo/INBOX +posteo/sns +posteo/berlin +posteo/etc +posteo/github.coreos +posteo/github.coreos-kubernetes +posteo/github.fleet +posteo/github.etcd +posteo/github.rkt +posteo/github.rktlet +posteo/github.go-systemd +posteo/github.systemd +posteo/github.kubernetes +posteo/github.minikube +posteo/MailingLists.containers +posteo/MailingLists.linux-fsdevel +posteo/MailingLists.linux-kernel +advance38/systemd +advance38/util-linux +golang + +unset imap_passive + +bind browser \t noop +bind browser ,\t noop + +bind index R group-reply +bind index \t next-new-then-unread +bind index ,\t previous-new-then-unread +bind index p previous-page +bind index - previous-page + +bind pager R group-reply +bind pager \t next-new-then-unread +bind pager ,\t previous-new-then-unread +bind pager p previous-page +bind pager - previous-page + +# color +color quoted cyan black + +# Gmail-style keyboard shortcuts +macro index,pager y "set trash=\"imaps://imap.googlemail.com/[Gmail]/Trash\"\n " "Gmail archive message" + +macro index,pager l "?" "Listing mailboxes" + +macro index,pager gg "=posteo/INBOX" "Go to inbox advance38" +macro index,pager gi "=posteo/INBOX" "Go to inbox advance38" +macro index,pager ga "=[/All" "Go to all mail" +macro index,pager gs "=[Starred" "Go to starred messages" +macro index,pager gd "=[Drafts" "Go to drafts" + +set alias_file="~/.mutt/aliases" diff --git a/.offlineimaprc b/.offlineimaprc new file mode 100644 index 0000000..2e56339 --- /dev/null +++ b/.offlineimaprc @@ -0,0 +1,543 @@ +# Sample configuration file +# Copyright (C) 2002-2005 John Goerzen +# +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# Looking for a quick start? Take a look at offlineimap.conf.minimal. + + +################################################## +# General definitions +################################################## + +[general] + +# This specifies where offlineimap is to store its metadata. +# This directory will be created if it does not already exist. + +metadata = ~/.offlineimap + +# This variable specifies which accounts are defined. Separate them +# with commas. Account names should be alphanumeric only. +# You will need to specify one section per account below. You may +# not use "general" for an account name. +# + +accounts = posteo,advance38 + +# Offlineimap can synchronize more the one account at a time. If you +# want to enable this feature, set the below value to something +# greater than 1. To force it to synchronize only one account at a +# time, set it to 1. +# +# Note: if you are using autorefresh and have more than one account, +# you must set this number to be >= to the number of accounts you have; +# since any given sync run never "finishes" due to a timer, you will never +# sync your additional accounts if this is 1. + +maxsyncaccounts = 4 + +# You can specify one or more user interface modules for OfflineIMAP +# to use. OfflineIMAP will try the first in the list, and if it +# fails, the second, and so forth. +# +# The pre-defined options are: +# Blinkenlights -- A fancy (terminal) interface +# TTYUI -- a text-based (terminal) interface +# Basic -- Noninteractive interface suitable for cron'ing +# Quiet -- Noninteractive interface, generates no output +# except for errors. +# MachineUI -- Interactive interface suitable for machine +# parsing. +# +# You can override this with a command-line option -u. + +#ui = Blinkenlights,Basic +ui = Basic +#ui = quiet + +# If you try to synchronize messages to a read-only folder, +# OfflineIMAP will generate a warning. If you want to suppress these +# warnings, set ignore-readonly to yes. Read-only IMAP folders allow +# reading but not modification, so if you try to change messages in +# the local copy of such a folder, the IMAP server will prevent +# OfflineIMAP from propagating those changes to the IMAP server. + +ignore-readonly = no + +########## Advanced settings + +# You can give a Python source filename here and all config file +# python snippets will be evaluated in the context of that file. +# This allows you to e.g. define helper functions in the Python +# source file and call them from this config file. You can find +# an example of this in the manual. +# +# pythonfile = ~/.offlineimap.py +# + +# By default, OfflineIMAP will not exit due to a network error until +# the operating system returns an error code. Operating systems can sometimes +# take forever to notice this. Here you can activate a timeout on the +# socket. This timeout applies to individual socket reads and writes, +# not to an overall sync operation. You could perfectly well have a 30s +# timeout here and your sync still take minutes. +# +# Values in the 30-120 second range are reasonable. +# +# The default is to have no timeout beyond the OS. Times are given in seconds. +# +# socktimeout = 60 + +# By default, OfflineIMAP will use fsync() to force data out to disk at +# opportune times to ensure consistency. This can, however, reduce +# performance. Users where /home is on SSD (Flash) may also wish to reduce +# write cycles. Therefore, you can disable OfflineIMAP's use of fsync(). +# Doing so will come at the expense of greater risk of message duplication +# in the event of a system crash or power loss. Default is fsync = true. +# Set fsync = false ot disable fsync. +# +# fsync = true + +################################################## +# Mailbox name recorder +################################################## + +[mbnames] + +# offlineimap can record your mailbox names in a format you specify. +# You can define the header, each mailbox item, the separator, +# and the footer. Here is an example for Mutt. +# If enabled is yes, all six setting must be specified, even if they +# are just the empty string "". +# +# The header, peritem, sep, and footer are all Python expressions passed +# through eval, so you can (and must) use Python quoting. + +enabled = no +filename = ~/Mutt/muttrc.mailboxes +header = "mailboxes " +peritem = "+%(accountname)s/%(foldername)s" +sep = " " +footer = "\n" + +# You can also specify a folderfilter. It will apply to the +# *translated* folder name here, and it takes TWO arguments: +# accountname and foldername. In all other ways, it will +# behave identically to the folderfilter for accounts. Please see +# that section for more information and examples. +# +# Note that this filter can be used only to further restrict mbnames +# to a subset of folders that pass the account's folderfilter. + +[ui.Curses.Blinkenlights] +# Character used to indicate thread status. + +statuschar = . + +################################################## +# Accounts +################################################## + +# This is an account definition clause. You'll have one of these +# for each account listed in general/accounts above. + +[Account advance38] +########## Basic settings + +# These settings specify the two folders that you will be syncing. +# You'll need to have a "Repository ..." section for each one. + +localrepository = advance38-local +remoterepository = advance38-remote + +########## Advanced settings + +# You can have offlineimap continue running indefinitely, automatically +# syncing your mail periodically. If you want that, specify how +# frequently to do that (in minutes) here. You can also specify +# fractional minutes (ie, 3.25). + +# autorefresh = 5 + +# OfflineImap can replace a number of full updates by quick +# synchronizations. It only synchronizes a folder if 1) a Maildir +# folder has changed, or 2) if an IMAP folder has received new messages +# or had messages deleted, ie it does not update if only IMAP flags have +# changed. Full updates need to fetch ALL flags for all messages, so +# this makes quite a performance difference (especially if syncing +# between two IMAP servers). +# Specify 0 for never, -1 for always (works even in non-autorefresh +# mode), or a positive integer to do quick updates before doing +# another full synchronization (requires autorefresh). Updates are +# always performed after minutes, be they quick or full. + +# quick = 10 + +# You can specify a pre and post sync hook to execute a external command. +# in this case a call to imapfilter to filter mail before the sync process +# starts and a custom shell script after the sync completes. +# The pre sync script has to complete before a sync to the account will +# start. + +# presynchook = imapfilter +# postsynchook = notifysync.sh + +# You can also specify parameters to the commands +# presynchook = imapfilter -c someotherconfig.lua + +# If you have a limited amount of bandwidth available you can exclude larger +# messages (e.g. those with large attachments etc). If you do this it +# will appear to offlineimap that these messages do not exist at all. They +# will not be copied, have flags changed etc. For this to work on an IMAP +# server the server must have server side search enabled. This works with gmail +# and most imap servers (e.g. cyrus etc) +# The maximum size should be specified in bytes - e.g. 2000000 for approx 2MB + +# maxsize = 2000000 + + +# When you are starting to sync an already existing account yuo can tell offlineimap +# to sync messages from only the last x days. When you do this messages older than x +# days will be completely ignored. This can be useful for importing existing accounts +# when you do not want to download large amounts of archive email. + +# Messages older than maxage days will not be synced, their flags will +# not be changed, they will not be deleted etc. For offlineimap it will be like these +# messages do not exist. This will perform an IMAP search in the case of IMAP or Gmail +# and therefor requires that the server support server side searching. This will +# calculate the earliest day that would be included in the search and include all +# messages from that day until today. e.g. maxage = 3 to sync only the last 3 days mail + +# maxage = 3 + +[Repository advance38-local] + +# This is one of the two repositories that you'll work with given the +# above example. Each repository requires a "type" declaration. +# +# The types supported are Maildir and IMAP. +# + +type = Maildir + +# Specify local repository. Your IMAP folders will be synchronized +# to maildirs created under this path. OfflineIMAP will create the +# maildirs for you as needed. + +#localfolders = ~/Maildir +localfolders = ~/Maildir/advance38 + +# You can specify the "path separator character" used for your Maildir +# folders. This is inserted in-between the components of the tree. +# It defaults to ".". If you want your Maildir folders to be nested, +# set it to "/". + +sep = . + +# Some users on *nix platforms may not want the atime (last access +# time) to be modified by OfflineIMAP. In these cases, they would +# want to set restoreatime to yes. OfflineIMAP will make an effort +# to not touch the atime if you do that. +# +# In most cases, the default of no should be sufficient. + +restoreatime = no + +[Repository advance38-remote] + +# A repository using Gmail's IMAP interface. Any configuration +# parameter of `IMAP` type repositories can be used here. Only +# `remoteuser` (or `remoteusereval` ) is mandatory. Default values +# for other parameters are OK, and you should not need fiddle with +# those. +# +# The Gmail repository will use hard-coded values for `remotehost`, +# `remoteport`, `tunnel` and `ssl`. (See +# http://mail.google.com/support/bin/answer.py?answer=78799&topic=12814) +# Any attempt to set those parameters will be silently ignored. +# + +type = Gmail + +# Specify the Gmail user name. This is the only mandatory parameter. +remoteuser = advance38@gmail.com +remotepassfile = ~/.secret/passwd.advance38 + +# Deleting a message from a Gmail folder via the IMAP interface will +# just remove that folder's label from the message: the message will +# continue to exist in the '[Gmail]/All Mail' folder. If `realdelete` +# is set to `True`, then deleted messages will really be deleted +# during `offlineimap` sync, by moving them to the '[Gmail]/Trash' +# folder. BEWARE: this will delete a messages from *all folders* it +# belongs to! +# +# See http://mail.google.com/support/bin/answer.py?answer=77657&topic=12815 +realdelete = no + +# The trash folder name may be different from [Gmail]/Trash +# for example on german googlemail, this setting should be +# +# trashfolder = [Google Mail]/Papierkorb +# +# The same is valid for the spam folder +# +# spamfolder = [Google Mail]/Spam + +#[Repository advance38-remote] +# +## And this is the remote repository. We only support IMAP or Gmail here. +# +#type = IMAP +# +## The following can fetch the account credentials via a python expression that +## is parsed from the pythonfile parameter. For example, a function called +## "getcredentials" that parses a file "filename" and returns the account +## details for "hostname". +## remotehosteval = getcredentials("filename", "hostname", "hostname") +## remoteusereval = getcredentials("filename", "hostname", "user") +## remotepasseval = getcredentials("filename", "hostname", "passwd") +# +## Specify the remote hostname. +#remotehost = imap.gmail.com +# +## Whether or not to use SSL. +ssl = yes + +# +## SSL Client certificate (optional) +## sslclientcert = /path/to/file.crt +# +## SSL Client key (optional) +## sslclientkey = /path/to/file.key +# +## SSL CA Cert(s) to verify the server cert against (optional). +## No SSL verification is done without this option. If it is +## specified, the CA Cert(s) need to verify the Server cert AND +## match the hostname (* wildcard allowed on the left hand side) +## The certificate should be in PEM format. +## sslcacertfile = /path/to/cacertfile.crt +# +## Specify the port. If not specified, use a default port. +## remoteport = 993 +# +## Specify the remote user name. +#remoteuser = advance38@gmail.com + +# There are six ways to specify the password for the IMAP server: +# +# 1. No password at all specified in the config file. +# If a matching entry is found in ~/.netrc (see netrc (5) for +# information) this password will be used. Do note that netrc only +# allows one entry per hostname. If there is no ~/.netrc file but +# there is an /etc/netrc file, the password will instead be taken +# from there. Otherwise you will be prompted for the password when +# OfflineIMAP starts when using a UI that supports this. +# +# 2. The remote password stored in this file with the remotepass +# option. Example: +# remotepass = mypassword +# +# 3. The remote password stored as a single line in an external +# file, which is referenced by the remotefile option. Example: +# remotepassfile = ~/Password.IMAP.Account1 +# +# 4. With a preauth tunnel. With this method, you invoke an external +# program that is guaranteed *NOT* to ask for a password, but rather +# to read from stdin and write to stdout an IMAP procotol stream that +# begins life in the PREAUTH state. When you use a tunnel, you do +# NOT specify a user or password (if you do, they'll be ignored.) +# Instead, you specify a preauthtunnel, as this example illustrates +# for Courier IMAP on Debian: +# preauthtunnel = ssh -q imaphost '/usr/bin/imapd ./Maildir' +# +# 5. If you are using Kerberos and have the Python Kerberos package +# installed, you should not specify a remotepass. If the user has a +# valid Kerberos TGT, OfflineIMAP will figure out the rest all by +# itself, and fall back to password authentication if needed. +# +# 6. Using arbitrary python code. With this method, you invoke a +# function from your pythonfile. To use this method assign the name +# of the function to the variable 'remotepasseval'. Example: +# remotepasseval = get_password("imap.example.net") +# You can also query for the username: +# remoteusereval = get_username("imap.example.net") +# This method can be used to design more elaborate setups, e.g. by +# querying the gnome-keyring via its python bindings. + +########## Advanced settings + +# Some IMAP servers need a "reference" which often refers to the "folder +# root". This is most commonly needed with UW IMAP, where you might +# need to specify the directory in which your mail is stored. The +# 'reference' value will be prefixed to all folder paths refering to +# that repository. E.g. accessing folder 'INBOX' with reference = Mail +# will try to access Mail/INBOX. Note that the nametrans and +# folderfilter functions will still apply the full path including the +# reference prefix. Most users will not need this. +# +# reference = Mail + +# OfflineIMAP can use multiple connections to the server in order +# to perform multiple synchronization actions simultaneously. +# This may place a higher burden on the server. In most cases, +# setting this value to 2 or 3 will speed up the sync, but in some +# cases, it may slow things down. The safe answer is 1. You should +# probably never set it to a value more than 5. + +maxconnections = 2 + +# OfflineIMAP normally closes IMAP server connections between refreshes if +# the global option autorefresh is specified. If you wish it to keep the +# connection open, set this to true. If not specified, the default is +# false. Keeping the connection open means a faster sync start the +# next time and may use fewer server resources on connection, but uses +# more server memory. This setting has no effect if autorefresh is not set. + +holdconnectionopen = no + +# If you want to have "keepalives" sent while waiting between syncs, +# specify the amount of time IN SECONDS between keepalives here. Note that +# sometimes more than this amount of time might pass, so don't make it +# tight. This setting has no effect if autorefresh and holdconnectionopen +# are not both set. + +# keepalive = 60 + +# Normally, OfflineIMAP will expunge deleted messages from the server. +# You can disable that if you wish. This means that OfflineIMAP will +# mark them deleted on the server, but not actually delete them. +# You must use some other IMAP client to delete them if you use this +# setting; otherwise, the messgaes will just pile up there forever. +# Therefore, this setting is definately NOT recommended. +# +# expunge = no + +# Specify whether to process all mail folders on the server, or only +# those listed as "subscribed". +subscribedonly = no + +# You can specify a folder translator. This must be a eval-able +# Python expression that takes a foldername arg and returns the new +# value. I suggest a lambda. This example below will remove "INBOX." from +# the leading edge of folders (great for Courier IMAP users) +# +# WARNING: you MUST construct this such that it NEVER returns +# the same value for two folders, UNLESS the second values are +# filtered out by folderfilter below. Failure to follow this rule +# will result in undefined behavior +# +# nametrans = lambda foldername: re.sub('^INBOX\.', '', foldername) + +# Using Courier remotely and want to duplicate its mailbox naming +# locally? Try this: +# +# nametrans = lambda foldername: re.sub('^INBOX\.*', '.', foldername) + +# You can specify which folders to sync. You can do it several ways. +# I'll provide some examples. The folderfilter operates on the +# *UNTRANSLATED* name, if you specify nametrans. It should return +# true if the folder is to be included; false otherwise. +# +# Example 1: synchronizing only INBOX and Sent. +# +# folderfilter = lambda foldername: foldername in ['INBOX', 'Sent'] +# +# Example 2: synchronizing everything except Trash. +# +# folderfilter = lambda foldername: foldername not in ['Trash'] +# +# Example 3: Using a regular expression to exclude Trash and all folders +# containing the characters "Del". +# +# folderfilter = lambda foldername: not re.search('(^Trash$|Del)', foldername) +# +# If folderfilter is not specified, ALL remote folders will be +# synchronized. +# +# You can span multiple lines by indenting the others. (Use backslashes +# at the end when required by Python syntax) For instance: +# +# folderfilter = lambda foldername: foldername in +# ['INBOX', 'Sent Mail', 'Deleted Items', +# 'Received'] +# +# FYI, you could also include every folder with: +# +# folderfilter = lambda foldername: 1 +# +# And exclude every folder with: +# +# folderfilter = lambda foldername: 0 + +folderfilter = lambda foldername: foldername not in ['&ycS89MLgsvk-', '&ycS89MLgsvk- &xyC3,Q-', 'Drafts', 'Sent', 'Trash', '[Gmail]/All Mail', '[Gmail]/Drafts', '[Gmail]/Important', '[Gmail]/Sent', '[Gmail]/Sent Mail', '[Gmail]/Starred', '[Gmail]/Spam', '[Gmail]/Trash', '[Google Mail]/Bin', '[Google Mail]/Sent Mail', 'Boomerang-Outbox', 'Botnets', 'Bro', 'Firewalls', 'Focus-IDS', 'Friends', 'Mobile', 'Oreilly', 'PostechTimes', 'Priority', 'Privatmail', 'Queue', 'RWTH', 'SMS', 'Snort-inline', 'Xine', 'ZDNet', 'bcm43xx', 'bird-users', 'buildroot', 'flashcache', 'fosdem', 'gitflow', 'hipl', 'jobs', 'libvir-list', 'linkedin', 'btrfs', 'dm-devel', 'kvm', 'linux-fsdevel', 'linux-kernel', 'linux-mm', 'linux-raid', 'linux-scsi', 'linux-tip-commits', 'linux_fs_4', 'linux-virt', 'nilfs', 'parallel', 'pisa', 'postech-cse96', 'qemu', 'spring', 'sshuttle', 'suckless', 'tizen', 'ubuntu-touch', 'uclibc'] + +#cert_fingerprint = bc9fb09aeb065316c9561d0d91c68ae822261601 +sslcacertfile = /etc/pki/tls/certs/ca-bundle.crt + +# You can specify folderincludes to include additional folders. +# It should return a Python list. This might be used to include a +# folder that was excluded by your folderfilter rule, to include a +# folder that your server does not specify with its LIST option, or +# to include a folder that is outside your basic reference. Some examples: +# +# To include debian.user and debian.personal: +# +# folderincludes = ['debian.user', 'debian.personal'] +# +# To include your INBOX (UW IMAPd users will find this useful if they +# specify a reference): +# +# folderincludes = ['INBOX'] +# +# To specify a long list: +# +# folderincludes = ['box1', 'box2', 'box3', 'box4', +# 'box5', 'box6'] + +# You can specify foldersort to determine how folders are sorted. +# This affects order of synchronization and mbnames. The expression +# should return -1, 0, or 1, as the default Python cmp() does. The +# two arguments, x and y, are strings representing the names of the folders +# to be sorted. The sorting is applied *AFTER* nametrans, if any. +# +# To reverse the sort: +# +# foldersort = lambda x, y: -cmp(x, y) + +[Account posteo] +localrepository = posteo-local +remoterepository = posteo-remote + +[Repository posteo-local] +type = Maildir +localfolders = ~/Maildir/posteo +sep = . +restoreatime = no + +[Repository posteo-remote] +type = IMAP +remotehost = posteo.de +ssl = yes +remoteuser = hipporoll@posteo.de +remotepassfile = ~/.secret/passwd.posteo +realdelete = no +maxconnections = 1 +holdconnectionopen = no +subscribedonly = no + +sslcacertfile = /etc/pki/tls/certs/ca-bundle.crt + diff --git a/.vim/autoload/pathogen.vim b/.vim/autoload/pathogen.vim new file mode 100644 index 0000000..a13ae08 --- /dev/null +++ b/.vim/autoload/pathogen.vim @@ -0,0 +1,347 @@ +" pathogen.vim - path option manipulation +" Maintainer: Tim Pope +" Version: 2.3 + +" Install in ~/.vim/autoload (or ~\vimfiles\autoload). +" +" For management of individually installed plugins in ~/.vim/bundle (or +" ~\vimfiles\bundle), adding `execute pathogen#infect()` to the top of your +" .vimrc is the only other setup necessary. +" +" The API is documented inline below. + +if exists("g:loaded_pathogen") || &cp + finish +endif +let g:loaded_pathogen = 1 + +" Point of entry for basic default usage. Give a relative path to invoke +" pathogen#interpose() (defaults to "bundle/{}"), or an absolute path to invoke +" pathogen#surround(). Curly braces are expanded with pathogen#expand(): +" "bundle/{}" finds all subdirectories inside "bundle" inside all directories +" in the runtime path. +function! pathogen#infect(...) abort + for path in a:0 ? filter(reverse(copy(a:000)), 'type(v:val) == type("")') : ['bundle/{}'] + if path =~# '^\%({\=[$~\\/]\|{\=\w:[\\/]\).*[{}*]' + call pathogen#surround(path) + elseif path =~# '^\%([$~\\/]\|\w:[\\/]\)' + call s:warn('Change pathogen#infect('.string(path).') to pathogen#infect('.string(path.'/{}').')') + call pathogen#surround(path . '/{}') + elseif path =~# '[{}*]' + call pathogen#interpose(path) + else + call s:warn('Change pathogen#infect('.string(path).') to pathogen#infect('.string(path.'/{}').')') + call pathogen#interpose(path . '/{}') + endif + endfor + call pathogen#cycle_filetype() + if pathogen#is_disabled($MYVIMRC) + return 'finish' + endif + return '' +endfunction + +" Split a path into a list. +function! pathogen#split(path) abort + if type(a:path) == type([]) | return a:path | endif + if empty(a:path) | return [] | endif + let split = split(a:path,'\\\@]','\\&','') + endif +endfunction + +" Like findfile(), but hardcoded to use the runtimepath. +function! pathogen#runtime_findfile(file,count) abort "{{{1 + let rtp = pathogen#join(1,pathogen#split(&rtp)) + let file = findfile(a:file,rtp,a:count) + if file ==# '' + return '' + else + return fnamemodify(file,':p') + endif +endfunction + +" Section: Deprecated + +function! s:warn(msg) abort + echohl WarningMsg + echomsg a:msg + echohl NONE +endfunction + +" Prepend all subdirectories of path to the rtp, and append all 'after' +" directories in those subdirectories. Deprecated. +function! pathogen#runtime_prepend_subdirectories(path) abort + call s:warn('Change pathogen#runtime_prepend_subdirectories('.string(a:path).') to pathogen#infect('.string(a:path.'/{}').')') + return pathogen#surround(a:path . pathogen#slash() . '{}') +endfunction + +function! pathogen#incubate(...) abort + let name = a:0 ? a:1 : 'bundle/{}' + call s:warn('Change pathogen#incubate('.(a:0 ? string(a:1) : '').') to pathogen#infect('.string(name).')') + return pathogen#interpose(name) +endfunction + +" Deprecated alias for pathogen#interpose(). +function! pathogen#runtime_append_all_bundles(...) abort + if a:0 + call s:warn('Change pathogen#runtime_append_all_bundles('.string(a:1).') to pathogen#infect('.string(a:1.'/{}').')') + else + call s:warn('Change pathogen#runtime_append_all_bundles() to pathogen#infect()') + endif + return pathogen#interpose(a:0 ? a:1 . '/{}' : 'bundle/{}') +endfunction + +if exists(':Vedit') + finish +endif + +let s:vopen_warning = 0 + +function! s:find(count,cmd,file,lcd) + let rtp = pathogen#join(1,pathogen#split(&runtimepath)) + let file = pathogen#runtime_findfile(a:file,a:count) + if file ==# '' + return "echoerr 'E345: Can''t find file \"".a:file."\" in runtimepath'" + endif + if !s:vopen_warning + let s:vopen_warning = 1 + let warning = '|echohl WarningMsg|echo "Install scriptease.vim to continue using :V'.a:cmd.'"|echohl NONE' + else + let warning = '' + endif + if a:lcd + let path = file[0:-strlen(a:file)-2] + execute 'lcd `=path`' + return a:cmd.' '.pathogen#fnameescape(a:file) . warning + else + return a:cmd.' '.pathogen#fnameescape(file) . warning + endif +endfunction + +function! s:Findcomplete(A,L,P) + let sep = pathogen#slash() + let cheats = { + \'a': 'autoload', + \'d': 'doc', + \'f': 'ftplugin', + \'i': 'indent', + \'p': 'plugin', + \'s': 'syntax'} + if a:A =~# '^\w[\\/]' && has_key(cheats,a:A[0]) + let request = cheats[a:A[0]].a:A[1:-1] + else + let request = a:A + endif + let pattern = substitute(request,'/\|\'.sep,'*'.sep,'g').'*' + let found = {} + for path in pathogen#split(&runtimepath) + let path = expand(path, ':p') + let matches = split(glob(path.sep.pattern),"\n") + call map(matches,'isdirectory(v:val) ? v:val.sep : v:val') + call map(matches,'expand(v:val, ":p")[strlen(path)+1:-1]') + for match in matches + let found[match] = 1 + endfor + endfor + return sort(keys(found)) +endfunction + +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Ve :execute s:find(,'edit',,0) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vedit :execute s:find(,'edit',,0) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vopen :execute s:find(,'edit',,1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vsplit :execute s:find(,'split',,1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vvsplit :execute s:find(,'vsplit',,1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vtabedit :execute s:find(,'tabedit',,1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vpedit :execute s:find(,'pedit',,1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vread :execute s:find(,'read',,1) + +" vim:set et sw=2 foldmethod=expr foldexpr=getline(v\:lnum)=~'^\"\ Section\:'?'>1'\:getline(v\:lnum)=~#'^fu'?'a1'\:getline(v\:lnum)=~#'^endf'?'s1'\:'=': diff --git a/.vim/autoload/plug.vim b/.vim/autoload/plug.vim new file mode 100644 index 0000000..edf9552 --- /dev/null +++ b/.vim/autoload/plug.vim @@ -0,0 +1,2037 @@ +" vim-plug: Vim plugin manager +" ============================ +" +" Download plug.vim and put it in ~/.vim/autoload +" +" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ +" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim +" +" Edit your .vimrc +" +" call plug#begin('~/.vim/plugged') +" +" " Make sure you use single quotes +" Plug 'junegunn/seoul256.vim' +" Plug 'junegunn/vim-easy-align' +" +" " Group dependencies, vim-snippets depends on ultisnips +" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' +" +" " On-demand loading +" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } +" Plug 'tpope/vim-fireplace', { 'for': 'clojure' } +" +" " Using git URL +" Plug 'https://github.com/junegunn/vim-github-dashboard.git' +" +" " Plugin options +" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' } +" +" " Plugin outside ~/.vim/plugged with post-update hook +" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': 'yes \| ./install' } +" +" " Unmanaged plugin (manually installed and updated) +" Plug '~/my-prototype-plugin' +" +" " Add plugins to &runtimepath +" call plug#end() +" +" Then reload .vimrc and :PlugInstall to install plugins. +" Visit https://github.com/junegunn/vim-plug for more information. +" +" +" Copyright (c) 2015 Junegunn Choi +" +" MIT License +" +" 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 the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be +" included in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') || has('win64') +let s:nvim = has('nvim') && exists('*jobwait') && !s:is_win +let s:me = resolve(expand(':p')) +let s:base_spec = { 'branch': 'master', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(fnamemodify(expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call s:add() + if !executable('git') + return s:err('`git` executable not found. vim-plug requires git.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install('' == '!', []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update('' == '!', []) + command! -nargs=0 -bar -bang PlugClean call s:clean('' == '!') + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar PlugSnapshot call s:snapshot() +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:source(from, ...) + for pattern in a:000 + for vim in s:lines(globpath(a:from, pattern)) + execute 'source' s:esc(vim) + endfor + endfor +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('Call plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + filetype off + for name in g:plugs_order + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !has_key(plug, 'on') && !has_key(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~ '^[A-Z]' + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang %s call s:lod_cmd(%s, "", , , , %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap %s %s:call lod_map(%s, %s, "%s")', + \ mode, map, map_prefix, string(map), string(names), key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + syntax enable + else + call s:reload() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:reload() + for name in s:loaded_names() + call s:source(s:rtp(g:plugs[name]), 'plugin/**/*.vim', 'after/plugin/**/*.vim') + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + let s:git_version = get(s:, 'git_version', + \ map(split(split(s:system('git --version'))[-1], '\.'), 'str2nr(v:val)')) + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +if s:is_win + function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) + endfunction + + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction +else + function! s:rtp(spec) + return s:dirpath(a:spec.dir . get(a:spec, 'rtp', '')) + endfunction + + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom a:msg + echohl None + return 0 +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), 'isdirectory(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let unknowns = filter(copy(a:000), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + for name in a:000 + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + if exists('#BufRead') + doautocmd BufRead + endif + return 1 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if exists('#User#'.name) + execute 'doautocmd User' name + endif + endfor +endfunction + +function! s:lod_ft(pat, names) + call s:lod(a:names, ['plugin', 'after/plugin', 'syntax', 'after/syntax']) + execute 'autocmd! PlugLOD FileType' a:pat + if exists('#filetypeplugin#FileType') + doautocmd filetypeplugin FileType + endif + if exists('#filetypeindent#FileType') + doautocmd filetypeindent FileType + endif +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + call feedkeys(a:prefix . substitute(a:map, '^', "\", '') . extra) +endfunction + +function! s:add(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let name = fnamemodify(repo, ':t:s?\.git$??') + let spec = extend(s:infer_properties(name, repo), + \ a:0 == 1 ? s:parse_options(a:1) : s:base_spec) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + if type == s:TYPE.string + let opts.tag = a:arg + elseif type == s:TYPE.dict + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + let repo = 'vim-scripts/'. repo + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + let dir = s:dirpath( fnamemodify(join([g:plug_home, a:name], '/'), ':p') ) + return { 'dir': dir, 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([spec.dir, 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-/ + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ [0-9a-z]\{7} .*/ contains=plugRelDate,plugSha + syn match plugSha /\(^ \)\@<=[0-9a-z]\{7}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugRelDate Comment + hi def link plugSha Identifier + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:prepare() + call s:job_abort() + if s:switch_in() + silent %d _ + else + call s:new_window() + nnoremap q :if b:plug_preview==1pcendifechoq + nnoremap R :silent! call retry() + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + endif + silent! unmap + silent! unmap L + silent! unmap o + silent! unmap X + setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap cursorline modifiable + setf vim-plug + call s:syntax() +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', spec.dir))) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let type = type(spec.do) + if type == s:TYPE.string + try + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let g:_plug_do = '!'.escape(spec.do, '#!%') + execute "normal! :execute g:_plug_do\\" + finally + let result = v:shell_error ? ('Exit status: '.v:shell_error) : 'Done!' + unlet g:_plug_do + endtry + elseif type == s:TYPE.funcref + try + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + let result = 'Done!' + catch + let result = 'Error: ' . v:exception + endtry + else + let result = 'Error: Invalid type!' + endif + call setline(4, getline(4) . result) + cd - + endif + endfor +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && stridx(v:val, 'Already up-to-date') < 0")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:update_impl(pull, force, args) abort + let args = copy(a:args) + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', s:is_win ? 1 : 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + echohl WarningMsg + echo 'No plugin to '. (a:pull ? 'update' : 'install') . '.' + echohl None + return + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + echohl WarningMsg + echomsg 'vim-plug: update Neovim for parallel installer' + echohl None + endif + + let python = (has('python') || has('python3')) && !s:is_win && !has('win32unix') + \ && (!s:nvim || has('vim_starting')) + let ruby = has('ruby') && !s:nvim && (v:version >= 703 || v:version == 702 && has('patch374')) + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || s:nvim) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare() + call append(0, ['', '']) + normal! 2G + silent! redraw + + let s:clone_opt = get(g:, 'plug_shallow', 1) ? + \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !s:nvim && s:update.threads > 1 + redir => pyv + silent python import platform; print(platform.python_version()) + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + endif +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'has_key(v:val, "do")')) + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if !s:nvim || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + silent! call jobstop(j.jobid) + if j.new + call s:system('rm -rf ' . s:shellesc(g:plugs[name].dir)) + endif + endfor + let s:jobs = {} +endfunction + +" When a:event == 'stdout', data = list of strings +" When a:event == 'exit', data = returncode +function! s:job_handler(job_id, data, event) abort + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + + if a:event == 'stdout' + let self.result .= substitute(s:to_s(a:data), '[\r\n]', '', 'g') . "\n" + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if self.tick % len(s:jobs) == 0 + call s:log(self.new ? '+' : '*', self.name, self.result) + endif + elseif a:event == 'exit' + let self.running = 0 + if a:data != 0 + let self.error = 1 + endif + call s:reap(self.name) + call s:tick() + endif +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'result': '', + \ 'new': get(a:opts, 'new', 0), + \ 'on_stdout': function('s:job_handler'), + \ 'on_exit' : function('s:job_handler'), + \ } + let s:jobs[a:name] = job + + if s:nvim + let argv = [ 'sh', '-c', + \ (has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir) : a:cmd) ] + let jid = jobstart(argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.result = jid < 0 ? 'sh is not executable' : + \ 'Invalid arguments (or job table is full)' + endif + else + let params = has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd] + let job.result = call('s:system', params) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + call s:log(job.error ? 'x' : '-', a:name, job.result) + call s:bar() + + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + for i in range(1, line('$')) + if getline(i) =~# '^[-+x*] '.a:name.':' + return i + endif + endfor + return 0 +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let pos = s:logpos(a:name) + if pos > 0 + execute pos 'd _' + if pos > winheight('.') + let pos = 4 + endif + else + let pos = 4 + endif + call append(pos - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + let s:update.fin = 1 + call s:update_finish() + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = !isdirectory(spec.dir) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + let checkout = s:shellesc(has_tag ? spec.tag : spec.branch) + let merge = s:shellesc(has_tag ? spec.tag : 'origin/'.spec.branch) + + if !new + let [valid, msg] = s:git_valid(spec, 0) + if valid + if pull + let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' + call s:spawn(name, + \ printf('(git fetch %s %s 2>&1 && git checkout -q %s 2>&1 && git merge --ff-only %s 2>&1 && git submodule update --init --recursive 2>&1)', + \ fetch_opt, prog, checkout, merge), { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'result': 'Already installed', 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'result': msg, 'error': 1 } + endif + else + call s:spawn(name, + \ printf('git clone %s %s --recursive %s -b %s %s 2>&1', + \ has_tag ? '' : s:clone_opt, + \ prog, + \ s:shellesc(spec.uri), + \ checkout, + \ s:shellesc(s:trim(spec.dir))), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python3') ? 'python3' : 'python' +execute py_exe "<< EOF" +""" Due to use of signals this function is POSIX only. """ +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = vim.eval('s:clone_opt') +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_THREADS = {} + +class PlugError(Exception): + def __init__(self, msg): + self._msg = msg + @property + def msg(self): + return self._msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull, is_win): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.is_win = is_win + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + if not self.is_win: + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + self.cmd_dir = cmd_dir + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + self.proc = subprocess.Popen(self.cmd, cwd=self.cmd_dir, stdout=tfile, + stderr=subprocess.STDOUT, shell=True, + preexec_fn=os.setsid) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + tag = args.get('tag', 0) + self.checkout = esc(tag if tag else args['branch']) + self.merge = esc(tag if tag else 'origin/' + args['branch']) + self.tag = tag + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} --recursive {2} -b {3} {4} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + self.checkout, esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + match = re.compile(r'git::?@') + actual_uri = re.sub(match, '', self.repo_uri()) + expect_uri = re.sub(match, '', self.args['uri']) + if actual_uri != expect_uri: + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmds = ['git fetch {0} {1}'.format(fetch_opt, G_PROGRESS), + 'git checkout -q {0}'.format(self.checkout), + 'git merge --ff-only {0}'.format(self.merge), + 'git submodule update --init --recursive'] + cmd = ' 2>&1 && '.join(cmds) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + finally: + global G_THREADS + with lock: + del G_THREADS[thr.current_thread().name] + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + is_win = vim.eval('s:is_win') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL, is_win) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + global G_THREADS + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + G_THREADS[tname] = thread + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or len(G_THREADS) != 0: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') unless iswin + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, branch, tag = pair.last.values_at *%w[dir uri branch tag] + checkout = esc(tag ? tag : branch) + merge = esc(tag ? tag : "origin/#{branch}") + subm = "git submodule update --init --recursive 2>&1" + exists = File.directory? dir + ok, result = + if exists + dir = iswin ? dir : esc(dir) + ret, data = bt.call "#{cd} #{dir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif current_uri.sub(/git::?@/, '') != uri.sub(/git::?@/, '') + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{cd} #{dir} && git fetch #{fetch_opt} #{progress} 2>&1 && git checkout -q #{checkout} 2>&1 && git merge --ff-only #{merge} 2>&1 && #{subm}", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} --recursive #{uri} -b #{checkout} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc(arg) + return '"'.escape(a:arg, '"').'"' +endfunction + +function! s:glob_dir(path) + return map(filter(s:lines(globpath(a:path, '**')), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + let a = substitute(a:a, 'git:\{1,2}@', '', '') + let b = substitute(a:b, 'git:\{1,2}@', '', '') + return a ==# b +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir) + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', s:shellesc(a:dir), a:cmd) +endfunction + +function! s:system(cmd, ...) + try + let [sh, shrd] = [&shell, &shellredir] + if !s:is_win + set shell=sh shellredir=>%s\ 2>&1 + endif + let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd + return system(s:is_win ? '('.cmd.')' : cmd) + finally + let [&shell, &shellredir] = [sh, shrd] + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_valid(spec, check_branch) + let ret = 1 + let msg = 'OK' + if isdirectory(a:spec.dir) + let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config remote.origin.url', a:spec.dir)) + let remote = result[-1] + if v:shell_error + let msg = join([remote, 'PlugClean required.'], "\n") + let ret = 0 + elseif !s:compare_git_uri(remote, a:spec.uri) + let msg = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + let ret = 0 + elseif a:check_branch + let branch = result[0] + " Check tag + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag + let msg = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + let ret = 0 + endif + " Check branch + elseif a:spec.branch !=# branch + let msg = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ branch, a:spec.branch) + let ret = 0 + endif + endif + else + let msg = 'Not found' + let ret = 0 + endif + return [ret, msg] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . s:shellesc(a:dir)) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for unused plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) || s:git_valid(spec, 0)[0] + call add(dirs, spec.dir) + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + normal! G + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + call inputsave() + let yes = a:force || (input('Proceed? (y/N) ') =~? '^y') + call inputrestore() + if yes + for dir in todo + call s:rm_rf(dir) + endfor + call append(line('$'), 'Removed.') + else + call append(line('$'), 'Cancelled.') + endif + endif + normal! G +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(printf('git clone --depth 1 %s %s', s:plug_src, tmp)) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if has_key(spec, 'uri') + if isdirectory(spec.dir) + let [valid, msg] = s:git_valid(spec, 1) + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if isdirectory(spec.dir) + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if valid && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap L :call status_load(line('.')) + xnoremap L :call status_load(line('.')) + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif + return 0 +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '\(^ \)\@<=[0-9a-z]\{7}') + if empty(sha) + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + execute 'pedit' sha + wincmd P + setlocal filetype=git buftype=nofile nobuflisted modifiable + execute 'silent read !cd' s:shellesc(g:plugs[name].dir) '&& git show --pretty=medium' sha + normal! gg"_dd + setlocal nomodifiable + nnoremap q :q + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:diff() + call s:prepare() + call append(0, 'Collecting updated changes ...') + normal! gg + redraw + + let cnt = 0 + for [k, v] in items(g:plugs) + if !isdirectory(v.dir) || !s:is_managed(k) + continue + endif + + let diff = s:system_chomp('git log --pretty=format:"%h %s (%cr)" "HEAD...HEAD@{1}"', v.dir) + if !empty(diff) + call append(1, '') + call append(2, '- '.k.':') + call append(3, map(s:lines(diff), '" ". v:val')) + let cnt += 1 + normal! gg + redraw + endif + endfor + + call setline(1, cnt == 0 ? 'No updates.' : 'Last update:') + nnoremap :silent! call preview_commit() + nnoremap o :silent! call preview_commit() + nnoremap X :call revert() + normal! gg + setlocal nomodifiable + if cnt > 0 + echo "Press 'X' on each block to revert the update" + endif +endfunction + +function! s:revert() + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch), g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted.' +endfunction + +function! s:snapshot(...) abort + let home = get(s:, 'plug_home_org', g:plug_home) + let [type, var, header] = s:is_win ? + \ ['dosbatch', '%PLUG_HOME%', + \ ['@echo off', ':: Generated by vim-plug', ':: '.strftime("%c"), '', + \ ':: Make sure to PlugUpdate first', '', 'set PLUG_HOME='.home]] : + \ ['sh', '$PLUG_HOME', + \ ['#!/bin/sh', '# Generated by vim-plug', '# '.strftime("%c"), '', + \ 'vim +PlugUpdate +qa', '', 'PLUG_HOME='.s:esc(home)]] + + call s:prepare() + execute 'setf' type + call append(0, header) + call append('$', '') + 1 + redraw + + let dirs = sort(map(values(filter(copy(g:plugs), + \'has_key(v:val, "uri") && isdirectory(v:val.dir)')), 'v:val.dir')) + let anchor = line('$') - 1 + for dir in reverse(dirs) + let sha = s:system_chomp('git rev-parse --short HEAD', dir) + if !empty(sha) + call append(anchor, printf('cd %s && git reset --hard %s', + \ substitute(dir, '^\V'.escape(g:plug_home, '\'), var, ''), sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = expand(a:1) + let fne = s:esc(fn) + call writefile(getline(1, '$'), fn) + if !s:is_win | call s:system('chmod +x ' . fne) | endif + echo 'Saved to '.a:1 + silent execute 'e' fne + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@" conceal cchar=  +syn match rustRightArrowTail contained "-" conceal cchar=⟶ +syn match rustNiceOperator "->" contains=rustRightArrowHead,rustRightArrowTail + +syn match rustFatRightArrowHead contained ">" conceal cchar=  +syn match rustFatRightArrowTail contained "=" conceal cchar=⟹ +syn match rustNiceOperator "=>" contains=rustFatRightArrowHead,rustFatRightArrowTail + +syn match rustNiceOperator /\<\@!_\(_*\>\)\@=/ conceal cchar=′ + +" For those who don't want to see `pub`... +if exists('g:rust_conceal_pub') && g:rust_conceal_pub != 0 + syn match rustPublicSigil contained "pu" conceal cchar=* + syn match rustPublicRest contained "b" conceal cchar=  + syn match rustNiceOperator "pub " contains=rustPublicSigil,rustPublicRest +endif + +hi link rustNiceOperator Operator + +if !(exists('g:rust_conceal_mod_path') && g:rust_conceal_mod_path != 0) + hi! link Conceal Operator + + " And keep it after a colorscheme change + au ColorScheme hi! link Conceal Operator +endif diff --git a/.vim/bundle/rust.vim/autoload/rust.vim b/.vim/bundle/rust.vim/autoload/rust.vim new file mode 100644 index 0000000..477f3c4 --- /dev/null +++ b/.vim/bundle/rust.vim/autoload/rust.vim @@ -0,0 +1,414 @@ +" Author: Kevin Ballard +" Description: Helper functions for Rust commands/mappings +" Last Modified: May 27, 2014 + +" Jump {{{1 + +function! rust#Jump(mode, function) range + let cnt = v:count1 + normal! m' + if a:mode ==# 'v' + norm! gv + endif + let foldenable = &foldenable + set nofoldenable + while cnt > 0 + execute "call Jump_" . a:function . "()" + let cnt = cnt - 1 + endwhile + let &foldenable = foldenable +endfunction + +function! s:Jump_Back() + call search('{', 'b') + keepjumps normal! w99[{ +endfunction + +function! s:Jump_Forward() + normal! j0 + call search('{', 'b') + keepjumps normal! w99[{% + call search('{') +endfunction + +" Run {{{1 + +function! rust#Run(bang, args) + let args = s:ShellTokenize(a:args) + if a:bang + let idx = index(l:args, '--') + if idx != -1 + let rustc_args = idx == 0 ? [] : l:args[:idx-1] + let args = l:args[idx+1:] + else + let rustc_args = l:args + let args = [] + endif + else + let rustc_args = [] + endif + + let b:rust_last_rustc_args = l:rustc_args + let b:rust_last_args = l:args + + call s:WithPath(function("s:Run"), rustc_args, args) +endfunction + +function! s:Run(dict, rustc_args, args) + let exepath = a:dict.tmpdir.'/'.fnamemodify(a:dict.path, ':t:r') + if has('win32') + let exepath .= '.exe' + endif + + let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path) + let rustc_args = [relpath, '-o', exepath] + a:rustc_args + + let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc" + + let pwd = a:dict.istemp ? a:dict.tmpdir : '' + let output = s:system(pwd, shellescape(rustc) . " " . join(map(rustc_args, 'shellescape(v:val)'))) + if output != '' + echohl WarningMsg + echo output + echohl None + endif + if !v:shell_error + exe '!' . shellescape(exepath) . " " . join(map(a:args, 'shellescape(v:val)')) + endif +endfunction + +" Expand {{{1 + +function! rust#Expand(bang, args) + let args = s:ShellTokenize(a:args) + if a:bang && !empty(l:args) + let pretty = remove(l:args, 0) + else + let pretty = "expanded" + endif + call s:WithPath(function("s:Expand"), pretty, args) +endfunction + +function! s:Expand(dict, pretty, args) + try + let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc" + + if a:pretty =~? '^\%(everybody_loops$\|flowgraph=\)' + let flag = '--xpretty' + else + let flag = '--pretty' + endif + let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path) + let args = [relpath, '-Z', 'unstable-options', l:flag, a:pretty] + a:args + let pwd = a:dict.istemp ? a:dict.tmpdir : '' + let output = s:system(pwd, shellescape(rustc) . " " . join(map(args, 'shellescape(v:val)'))) + if v:shell_error + echohl WarningMsg + echo output + echohl None + else + new + silent put =output + 1 + d + setl filetype=rust + setl buftype=nofile + setl bufhidden=hide + setl noswapfile + " give the buffer a nice name + let suffix = 1 + let basename = fnamemodify(a:dict.path, ':t:r') + while 1 + let bufname = basename + if suffix > 1 | let bufname .= ' ('.suffix.')' | endif + let bufname .= '.pretty.rs' + if bufexists(bufname) + let suffix += 1 + continue + endif + exe 'silent noautocmd keepalt file' fnameescape(bufname) + break + endwhile + endif + endtry +endfunction + +function! rust#CompleteExpand(lead, line, pos) + if a:line[: a:pos-1] =~ '^RustExpand!\s*\S*$' + " first argument and it has a ! + let list = ["normal", "expanded", "typed", "expanded,identified", "flowgraph=", "everybody_loops"] + if !empty(a:lead) + call filter(list, "v:val[:len(a:lead)-1] == a:lead") + endif + return list + endif + + return glob(escape(a:lead, "*?[") . '*', 0, 1) +endfunction + +" Emit {{{1 + +function! rust#Emit(type, args) + let args = s:ShellTokenize(a:args) + call s:WithPath(function("s:Emit"), a:type, args) +endfunction + +function! s:Emit(dict, type, args) + try + let output_path = a:dict.tmpdir.'/output' + + let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc" + + let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path) + let args = [relpath, '--emit', a:type, '-o', output_path] + a:args + let pwd = a:dict.istemp ? a:dict.tmpdir : '' + let output = s:system(pwd, shellescape(rustc) . " " . join(map(args, 'shellescape(v:val)'))) + if output != '' + echohl WarningMsg + echo output + echohl None + endif + if !v:shell_error + new + exe 'silent keepalt read' fnameescape(output_path) + 1 + d + if a:type == "llvm-ir" + setl filetype=llvm + let extension = 'll' + elseif a:type == "asm" + setl filetype=asm + let extension = 's' + endif + setl buftype=nofile + setl bufhidden=hide + setl noswapfile + if exists('l:extension') + " give the buffer a nice name + let suffix = 1 + let basename = fnamemodify(a:dict.path, ':t:r') + while 1 + let bufname = basename + if suffix > 1 | let bufname .= ' ('.suffix.')' | endif + let bufname .= '.'.extension + if bufexists(bufname) + let suffix += 1 + continue + endif + exe 'silent noautocmd keepalt file' fnameescape(bufname) + break + endwhile + endif + endif + endtry +endfunction + +" Utility functions {{{1 + +" Invokes func(dict, ...) +" Where {dict} is a dictionary with the following keys: +" 'path' - The path to the file +" 'tmpdir' - The path to a temporary directory that will be deleted when the +" function returns. +" 'istemp' - 1 if the path is a file inside of {dict.tmpdir} or 0 otherwise. +" If {istemp} is 1 then an additional key is provided: +" 'tmpdir_relpath' - The {path} relative to the {tmpdir}. +" +" {dict.path} may be a path to a file inside of {dict.tmpdir} or it may be the +" existing path of the current buffer. If the path is inside of {dict.tmpdir} +" then it is guaranteed to have a '.rs' extension. +function! s:WithPath(func, ...) + let buf = bufnr('') + let saved = {} + let dict = {} + try + let saved.write = &write + set write + let dict.path = expand('%') + let pathisempty = empty(dict.path) + + " Always create a tmpdir in case the wrapped command wants it + let dict.tmpdir = tempname() + call mkdir(dict.tmpdir) + + if pathisempty || !saved.write + let dict.istemp = 1 + " if we're doing this because of nowrite, preserve the filename + if !pathisempty + let filename = expand('%:t:r').".rs" + else + let filename = 'unnamed.rs' + endif + let dict.tmpdir_relpath = filename + let dict.path = dict.tmpdir.'/'.filename + + let saved.mod = &mod + set nomod + + silent exe 'keepalt write! ' . fnameescape(dict.path) + if pathisempty + silent keepalt 0file + endif + else + let dict.istemp = 0 + update + endif + + call call(a:func, [dict] + a:000) + finally + if bufexists(buf) + for [opt, value] in items(saved) + silent call setbufvar(buf, '&'.opt, value) + unlet value " avoid variable type mismatches + endfor + endif + if has_key(dict, 'tmpdir') | silent call s:RmDir(dict.tmpdir) | endif + endtry +endfunction + +function! rust#AppendCmdLine(text) + call setcmdpos(getcmdpos()) + let cmd = getcmdline() . a:text + return cmd +endfunction + +" Tokenize the string according to sh parsing rules +function! s:ShellTokenize(text) + " states: + " 0: start of word + " 1: unquoted + " 2: unquoted backslash + " 3: double-quote + " 4: double-quoted backslash + " 5: single-quote + let l:state = 0 + let l:current = '' + let l:args = [] + for c in split(a:text, '\zs') + if l:state == 0 || l:state == 1 " unquoted + if l:c ==# ' ' + if l:state == 0 | continue | endif + call add(l:args, l:current) + let l:current = '' + let l:state = 0 + elseif l:c ==# '\' + let l:state = 2 + elseif l:c ==# '"' + let l:state = 3 + elseif l:c ==# "'" + let l:state = 5 + else + let l:current .= l:c + let l:state = 1 + endif + elseif l:state == 2 " unquoted backslash + if l:c !=# "\n" " can it even be \n? + let l:current .= l:c + endif + let l:state = 1 + elseif l:state == 3 " double-quote + if l:c ==# '\' + let l:state = 4 + elseif l:c ==# '"' + let l:state = 1 + else + let l:current .= l:c + endif + elseif l:state == 4 " double-quoted backslash + if stridx('$`"\', l:c) >= 0 + let l:current .= l:c + elseif l:c ==# "\n" " is this even possible? + " skip it + else + let l:current .= '\'.l:c + endif + let l:state = 3 + elseif l:state == 5 " single-quoted + if l:c == "'" + let l:state = 1 + else + let l:current .= l:c + endif + endif + endfor + if l:state != 0 + call add(l:args, l:current) + endif + return l:args +endfunction + +function! s:RmDir(path) + " sanity check; make sure it's not empty, /, or $HOME + if empty(a:path) + echoerr 'Attempted to delete empty path' + return 0 + elseif a:path == '/' || a:path == $HOME + echoerr 'Attempted to delete protected path: ' . a:path + return 0 + endif + return system("rm -rf " . shellescape(a:path)) +endfunction + +" Executes {cmd} with the cwd set to {pwd}, without changing Vim's cwd. +" If {pwd} is the empty string then it doesn't change the cwd. +function! s:system(pwd, cmd) + let cmd = a:cmd + if !empty(a:pwd) + let cmd = 'cd ' . shellescape(a:pwd) . ' && ' . cmd + endif + return system(cmd) +endfunction + +" Playpen Support {{{1 +" Parts of gist.vim by Yasuhiro Matsumoto reused +" gist.vim available under the BSD license, available at +" http://github.com/mattn/gist-vim +function! s:has_webapi() + if !exists("*webapi#http#post") + try + call webapi#http#post() + catch + endtry + endif + return exists("*webapi#http#post") +endfunction + +function! rust#Play(count, line1, line2, ...) abort + redraw + + let l:rust_playpen_url = get(g:, 'rust_playpen_url', 'https://play.rust-lang.org/') + let l:rust_shortener_url = get(g:, 'rust_shortener_url', 'https://is.gd/') + + if !s:has_webapi() + echohl ErrorMsg | echomsg ':RustPlay depends on webapi.vim (https://github.com/mattn/webapi-vim)' | echohl None + return + endif + + let bufname = bufname('%') + if a:count < 1 + let content = join(getline(a:line1, a:line2), "\n") + else + let save_regcont = @" + let save_regtype = getregtype('"') + silent! normal! gvy + let content = @" + call setreg('"', save_regcont, save_regtype) + endif + + let body = l:rust_playpen_url."?code=".webapi#http#encodeURI(content) + + if strlen(body) > 5000 + echohl ErrorMsg | echomsg 'Buffer too large, max 5000 encoded characters ('.strlen(body).')' | echohl None + return + endif + + let payload = "format=simple&url=".webapi#http#encodeURI(body) + let res = webapi#http#post(l:rust_shortener_url.'create.php', payload, {}) + let url = res.content + + redraw | echomsg 'Done: '.url +endfunction + +" }}}1 + +" vim: set noet sw=4 ts=4: diff --git a/.vim/bundle/rust.vim/autoload/rustfmt.vim b/.vim/bundle/rust.vim/autoload/rustfmt.vim new file mode 100644 index 0000000..e5f9830 --- /dev/null +++ b/.vim/bundle/rust.vim/autoload/rustfmt.vim @@ -0,0 +1,106 @@ +" Author: Stephen Sugden +" +" Adapted from https://github.com/fatih/vim-go + +if !exists("g:rustfmt_autosave") + let g:rustfmt_autosave = 0 +endif + +if !exists("g:rustfmt_command") + let g:rustfmt_command = "rustfmt" +endif + +if !exists("g:rustfmt_options") + let g:rustfmt_options = "" +endif + +if !exists("g:rustfmt_fail_silently") + let g:rustfmt_fail_silently = 0 +endif + +let s:got_fmt_error = 0 + +function! s:RustfmtCommandRange(filename, line1, line2) + let l:arg = {"file": shellescape(a:filename), "range": [a:line1, a:line2]} + return printf("%s %s --write-mode=overwrite --file-lines '[%s]'", g:rustfmt_command, g:rustfmt_options, json_encode(l:arg)) +endfunction + +function! s:RustfmtCommand(filename) + return g:rustfmt_command . " --write-mode=overwrite " . g:rustfmt_options . " " . shellescape(a:filename) +endfunction + +function! s:RunRustfmt(command, curw, tmpname) + if exists("*systemlist") + let out = systemlist(a:command) + else + let out = split(system(a:command), '\r\?\n') + endif + + if v:shell_error == 0 || v:shell_error == 3 + " remove undo point caused via BufWritePre + try | silent undojoin | catch | endtry + + " Replace current file with temp file, then reload buffer + call rename(a:tmpname, expand('%')) + silent edit! + let &syntax = &syntax + + " only clear location list if it was previously filled to prevent + " clobbering other additions + if s:got_fmt_error + let s:got_fmt_error = 0 + call setloclist(0, []) + lwindow + endif + elseif g:rustfmt_fail_silently == 0 + " otherwise get the errors and put them in the location list + let errors = [] + + for line in out + " src/lib.rs:13:5: 13:10 error: expected `,`, or `}`, found `value` + let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\):\s*\(\d\+:\d\+\s*\)\?\s*error: \(.*\)') + if !empty(tokens) + call add(errors, {"filename": @%, + \"lnum": tokens[2], + \"col": tokens[3], + \"text": tokens[5]}) + endif + endfor + + if empty(errors) + % | " Couldn't detect rustfmt error format, output errors + endif + + if !empty(errors) + call setloclist(0, errors, 'r') + echohl Error | echomsg "rustfmt returned error" | echohl None + endif + + let s:got_fmt_error = 1 + lwindow + " We didn't use the temp file, so clean up + call delete(a:tmpname) + endif + + call winrestview(a:curw) +endfunction + +function! rustfmt#FormatRange(line1, line2) + let l:curw = winsaveview() + let l:tmpname = expand("%:p:h") . "/." . expand("%:p:t") . ".rustfmt" + call writefile(getline(1, '$'), l:tmpname) + + let command = s:RustfmtCommandRange(l:tmpname, a:line1, a:line2) + + call s:RunRustfmt(command, l:curw, l:tmpname) +endfunction + +function! rustfmt#Format() + let l:curw = winsaveview() + let l:tmpname = expand("%:p:h") . "/." . expand("%:p:t") . ".rustfmt" + call writefile(getline(1, '$'), l:tmpname) + + let command = s:RustfmtCommand(l:tmpname) + + call s:RunRustfmt(command, l:curw, l:tmpname) +endfunction diff --git a/.vim/bundle/rust.vim/compiler/cargo.vim b/.vim/bundle/rust.vim/compiler/cargo.vim new file mode 100644 index 0000000..029c5c7 --- /dev/null +++ b/.vim/bundle/rust.vim/compiler/cargo.vim @@ -0,0 +1,28 @@ +" Vim compiler file +" Compiler: Cargo Compiler +" Maintainer: Damien Radtke +" Latest Revision: 2014 Sep 24 + +if exists('current_compiler') + finish +endif +runtime compiler/rustc.vim +let current_compiler = "cargo" + +if exists(':CompilerSet') != 2 + command -nargs=* CompilerSet setlocal +endif + +if exists('g:cargo_makeprg_params') + execute 'CompilerSet makeprg=cargo\ '.escape(g:cargo_makeprg_params, ' \|"').'\ $*' +else + CompilerSet makeprg=cargo\ $* +endif + +" Ignore general cargo progress messages +CompilerSet errorformat+= + \%-G%\\s%#Downloading%.%#, + \%-G%\\s%#Compiling%.%#, + \%-G%\\s%#Finished%.%#, + \%-G%\\s%#error:\ Could\ not\ compile\ %.%#, + \%-G%\\s%#To\ learn\ more\\,%.%# diff --git a/.vim/bundle/rust.vim/compiler/rustc.vim b/.vim/bundle/rust.vim/compiler/rustc.vim new file mode 100644 index 0000000..ba29133 --- /dev/null +++ b/.vim/bundle/rust.vim/compiler/rustc.vim @@ -0,0 +1,45 @@ +" Vim compiler file +" Compiler: Rust Compiler +" Maintainer: Chris Morgan +" Latest Revision: 2013 Jul 12 + +if exists("current_compiler") + finish +endif +let current_compiler = "rustc" + +let s:cpo_save = &cpo +set cpo&vim + +if exists(":CompilerSet") != 2 + command -nargs=* CompilerSet setlocal +endif + +if exists("g:rustc_makeprg_no_percent") && g:rustc_makeprg_no_percent != 0 + CompilerSet makeprg=rustc +else + CompilerSet makeprg=rustc\ \% +endif + +" Old errorformat (before nightly 2016/08/10) +CompilerSet errorformat= + \%f:%l:%c:\ %t%*[^:]:\ %m, + \%f:%l:%c:\ %*\\d:%*\\d\ %t%*[^:]:\ %m, + \%-G%f:%l\ %s, + \%-G%*[\ ]^, + \%-G%*[\ ]^%*[~], + \%-G%*[\ ]... + +" New errorformat (after nightly 2016/08/10) +CompilerSet errorformat+= + \%-G, + \%-Gerror:\ aborting\ %.%#, + \%-Gerror:\ Could\ not\ compile\ %.%#, + \%Eerror:\ %m, + \%Eerror[E%n]:\ %m, + \%Wwarning:\ %m, + \%Inote:\ %m, + \%C\ %#-->\ %f:%l:%c + +let &cpo = s:cpo_save +unlet s:cpo_save diff --git a/.vim/bundle/rust.vim/doc/rust.txt b/.vim/bundle/rust.vim/doc/rust.txt new file mode 100644 index 0000000..68fc1da --- /dev/null +++ b/.vim/bundle/rust.vim/doc/rust.txt @@ -0,0 +1,237 @@ +*rust.txt* Filetype plugin for Rust + +============================================================================== +CONTENTS *rust* *ft-rust* + +1. Introduction |rust-intro| +2. Settings |rust-settings| +3. Commands |rust-commands| +4. Mappings |rust-mappings| + +============================================================================== +INTRODUCTION *rust-intro* + +This plugin provides syntax and supporting functionality for the Rust +filetype. + +============================================================================== +SETTINGS *rust-settings* + +This plugin has a few variables you can define in your vimrc that change the +behavior of the plugin. + + *g:rustc_path* +g:rustc_path~ + Set this option to the path to rustc for use in the |:RustRun| and + |:RustExpand| commands. If unset, "rustc" will be located in $PATH: > + let g:rustc_path = $HOME."/bin/rustc" +< + + *g:rustc_makeprg_no_percent* +g:rustc_makeprg_no_percent~ + Set this option to 1 to have 'makeprg' default to "rustc" instead of + "rustc %": > + let g:rustc_makeprg_no_percent = 1 +< + + *g:rust_conceal* +g:rust_conceal~ + Set this option to turn on the basic |conceal| support: > + let g:rust_conceal = 1 +< + + *g:rust_conceal_mod_path* +g:rust_conceal_mod_path~ + Set this option to turn on |conceal| for the path connecting token + "::": > + let g:rust_conceal_mod_path = 1 +< + + *g:rust_conceal_pub* +g:rust_conceal_pub~ + Set this option to turn on |conceal| for the "pub" token: > + let g:rust_conceal_pub = 1 +< + + *g:rust_recommended_style* +g:rust_recommended_style~ + Set this option to enable vim indentation and textwidth settings to + conform to style conventions of the rust standard library (i.e. use 4 + spaces for indents and sets 'textwidth' to 99). This option is enabled + by default. To disable it: > + let g:rust_recommended_style = 0 +< + + *g:rust_fold* +g:rust_fold~ + Set this option to turn on |folding|: > + let g:rust_fold = 1 +< + Value Effect ~ + 0 No folding + 1 Braced blocks are folded. All folds are open by + default. + 2 Braced blocks are folded. 'foldlevel' is left at the + global value (all folds are closed by default). + + *g:rust_bang_comment_leader* +g:rust_bang_comment_leader~ + Set this option to 1 to preserve the leader on multi-line doc comments + using the /*! syntax: > + let g:rust_bang_comment_leader = 1 +< + + *g:ftplugin_rust_source_path* +g:ftplugin_rust_source_path~ + Set this option to a path that should be prepended to 'path' for Rust + source files: > + let g:ftplugin_rust_source_path = $HOME.'/dev/rust' +< + + *g:rustfmt_command* +g:rustfmt_command~ + Set this option to the name of the 'rustfmt' executable in your $PATH. If + not specified it defaults to 'rustfmt' : > + let g:rustfmt_command = 'rustfmt' +< + *g:rustfmt_autosave* +g:rustfmt_autosave~ + Set this option to 1 to run |:RustFmt| automatically when saving a + buffer. If not specified it defaults to 0 : > + let g:rustfmt_autosave = 0 +< + *g:rustfmt_fail_silently* +g:rustfmt_fail_silently~ + Set this option to 1 to prevent 'rustfmt' from populating the + |location-list| with errors. If not specified it defaults to 0: > + let g:rustfmt_fail_silently = 0 +< + *g:rustfmt_options* +g:rustfmt_options~ + Set this option to a string of options to pass to 'rustfmt'. The + write-mode is already set to 'overwrite'. If not specified it + defaults to '' : > + let g:rustfmt_options = '' +< + + *g:rust_playpen_url* +g:rust_playpen_url~ + Set this option to override the url for the playpen to use: > + let g:rust_playpen_url = 'https://play.rust-lang.org/' +< + + *g:rust_shortener_url* +g:rust_shortener_url~ + Set this option to override the url for the url shortener: > + let g:rust_shortener_url = 'https://is.gd/' +< + + +============================================================================== +COMMANDS *rust-commands* + +:RustRun [args] *:RustRun* +:RustRun! [rustc-args] [--] [args] + Compiles and runs the current file. If it has unsaved changes, + it will be saved first using |:update|. If the current file is + an unnamed buffer, it will be written to a temporary file + first. The compiled binary is always placed in a temporary + directory, but is run from the current directory. + + The arguments given to |:RustRun| will be passed to the + compiled binary. + + If ! is specified, the arguments are passed to rustc instead. + A "--" argument will separate the rustc arguments from the + arguments passed to the binary. + + If |g:rustc_path| is defined, it is used as the path to rustc. + Otherwise it is assumed rustc can be found in $PATH. + +:RustExpand [args] *:RustExpand* +:RustExpand! [TYPE] [args] + Expands the current file using --pretty and displays the + results in a new split. If the current file has unsaved + changes, it will be saved first using |:update|. If the + current file is an unnamed buffer, it will be written to a + temporary file first. + + The arguments given to |:RustExpand| will be passed to rustc. + This is largely intended for specifying various --cfg + configurations. + + If ! is specified, the first argument is the expansion type to + pass to rustc --pretty. Otherwise it will default to + "expanded". + + If |g:rustc_path| is defined, it is used as the path to rustc. + Otherwise it is assumed rustc can be found in $PATH. + +:RustEmitIr [args] *:RustEmitIr* + Compiles the current file to LLVM IR and displays the results + in a new split. If the current file has unsaved changes, it + will be saved first using |:update|. If the current file is an + unnamed buffer, it will be written to a temporary file first. + + The arguments given to |:RustEmitIr| will be passed to rustc. + + If |g:rustc_path| is defined, it is used as the path to rustc. + Otherwise it is assumed rustc can be found in $PATH. + +:RustEmitAsm [args] *:RustEmitAsm* + Compiles the current file to assembly and displays the results + in a new split. If the current file has unsaved changes, it + will be saved first using |:update|. If the current file is an + unnamed buffer, it will be written to a temporary file first. + + The arguments given to |:RustEmitAsm| will be passed to rustc. + + If |g:rustc_path| is defined, it is used as the path to rustc. + Otherwise it is assumed rustc can be found in $PATH. + +:RustPlay *:RustPlay* + This command will only work if you have web-api.vim installed + (available at https://github.com/mattn/webapi-vim). It sends the + current selection, or if nothing is selected, the entirety of the + current buffer to the Rust playpen, and emits a message with the + shortened URL to the playpen. + + |g:rust_playpen_url| is the base URL to the playpen, by default + "https://play.rust-lang.org/". + + |g:rust_shortener_url| is the base url for the shorterner, by + default "https://is.gd/" + +:RustFmt *:RustFmt* + Runs |g:rustfmt_command| on the current buffer. If + |g:rustfmt_options| is set then those will be passed to the + executable. + + If |g:rustfmt_fail_silently| is 0 (the default) then it + will populate the |location-list| with the errors from + |g:rustfmt_command|. If |g:rustfmt_fail_silently| is set to 1 + then it will not populate the |location-list|. + +:RustFmtRange *:RustFmtRange* + Runs |g:rustfmt_command| with selected range. See + |:RustFmt| for any other information. + +============================================================================== +MAPPINGS *rust-mappings* + +This plugin defines mappings for |[[| and |]]| to support hanging indents. + +It also has a few other mappings: + + *rust_* + Executes |:RustRun| with no arguments. + Note: This binding is only available in MacVim. + + *rust_* + Populates the command line with |:RustRun|! using the + arguments given to the last invocation, but does not + execute it. + Note: This binding is only available in MacVim. + +============================================================================== + vim:tw=78:sw=4:noet:ts=8:ft=help:norl: diff --git a/.vim/bundle/rust.vim/ftdetect/rust.vim b/.vim/bundle/rust.vim/ftdetect/rust.vim new file mode 100644 index 0000000..bf685d4 --- /dev/null +++ b/.vim/bundle/rust.vim/ftdetect/rust.vim @@ -0,0 +1 @@ +au BufRead,BufNewFile *.rs set filetype=rust diff --git a/.vim/bundle/rust.vim/ftplugin/rust.vim b/.vim/bundle/rust.vim/ftplugin/rust.vim new file mode 100644 index 0000000..4e3cd4f --- /dev/null +++ b/.vim/bundle/rust.vim/ftplugin/rust.vim @@ -0,0 +1,207 @@ +" Language: Rust +" Description: Vim syntax file for Rust +" Maintainer: Chris Morgan +" Maintainer: Kevin Ballard +" Last Change: June 08, 2016 + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +let s:save_cpo = &cpo +set cpo&vim + +augroup rust.vim +autocmd! + +" Variables {{{1 + +" The rust source code at present seems to typically omit a leader on /*! +" comments, so we'll use that as our default, but make it easy to switch. +" This does not affect indentation at all (I tested it with and without +" leader), merely whether a leader is inserted by default or not. +if exists("g:rust_bang_comment_leader") && g:rust_bang_comment_leader != 0 + " Why is the `,s0:/*,mb:\ ,ex:*/` there, you ask? I don't understand why, + " but without it, */ gets indented one space even if there were no + " leaders. I'm fairly sure that's a Vim bug. + setlocal comments=s1:/*,mb:*,ex:*/,s0:/*,mb:\ ,ex:*/,:///,://!,:// +else + setlocal comments=s0:/*!,m:\ ,ex:*/,s1:/*,mb:*,ex:*/,:///,://!,:// +endif +setlocal commentstring=//%s +setlocal formatoptions-=t formatoptions+=croqnl +" j was only added in 7.3.541, so stop complaints about its nonexistence +silent! setlocal formatoptions+=j + +" smartindent will be overridden by indentexpr if filetype indent is on, but +" otherwise it's better than nothing. +setlocal smartindent nocindent + +if !exists("g:rust_recommended_style") || g:rust_recommended_style != 0 + setlocal tabstop=4 shiftwidth=4 softtabstop=4 expandtab + setlocal textwidth=99 +endif + +" This includeexpr isn't perfect, but it's a good start +setlocal includeexpr=substitute(v:fname,'::','/','g') + +setlocal suffixesadd=.rs + +if exists("g:ftplugin_rust_source_path") + let &l:path=g:ftplugin_rust_source_path . ',' . &l:path +endif + +if exists("g:loaded_delimitMate") + if exists("b:delimitMate_excluded_regions") + let b:rust_original_delimitMate_excluded_regions = b:delimitMate_excluded_regions + endif + + let s:delimitMate_extra_excluded_regions = ',rustLifetimeCandidate,rustGenericLifetimeCandidate' + + " For this buffer, when delimitMate issues the `User delimitMate_map` + " event in the autocommand system, add the above-defined extra excluded + " regions to delimitMate's state, if they have not already been added. + autocmd User + \ if expand('') ==# 'delimitMate_map' && match( + \ delimitMate#Get("excluded_regions"), + \ s:delimitMate_extra_excluded_regions) == -1 + \| let b:delimitMate_excluded_regions = + \ delimitMate#Get("excluded_regions") + \ . s:delimitMate_extra_excluded_regions + \|endif + + " For this buffer, when delimitMate issues the `User delimitMate_unmap` + " event in the autocommand system, delete the above-defined extra excluded + " regions from delimitMate's state (the deletion being idempotent and + " having no effect if the extra excluded regions are not present in the + " targeted part of delimitMate's state). + autocmd User + \ if expand('') ==# 'delimitMate_unmap' + \| let b:delimitMate_excluded_regions = substitute( + \ delimitMate#Get("excluded_regions"), + \ '\C\V' . s:delimitMate_extra_excluded_regions, + \ '', 'g') + \|endif +endif + +if has("folding") && exists('g:rust_fold') && g:rust_fold != 0 + let b:rust_set_foldmethod=1 + setlocal foldmethod=syntax + if g:rust_fold == 2 + setlocal foldlevel< + else + setlocal foldlevel=99 + endif +endif + +if has('conceal') && exists('g:rust_conceal') && g:rust_conceal != 0 + let b:rust_set_conceallevel=1 + setlocal conceallevel=2 +endif + +" Motion Commands {{{1 + +" Bind motion commands to support hanging indents +nnoremap [[ :call rust#Jump('n', 'Back') +nnoremap ]] :call rust#Jump('n', 'Forward') +xnoremap [[ :call rust#Jump('v', 'Back') +xnoremap ]] :call rust#Jump('v', 'Forward') +onoremap [[ :call rust#Jump('o', 'Back') +onoremap ]] :call rust#Jump('o', 'Forward') + +" Commands {{{1 + +" See |:RustRun| for docs +command! -nargs=* -complete=file -bang -buffer RustRun call rust#Run(0, ) + +" See |:RustExpand| for docs +command! -nargs=* -complete=customlist,rust#CompleteExpand -bang -buffer RustExpand call rust#Expand(0, ) + +" See |:RustEmitIr| for docs +command! -nargs=* -buffer RustEmitIr call rust#Emit("llvm-ir", ) + +" See |:RustEmitAsm| for docs +command! -nargs=* -buffer RustEmitAsm call rust#Emit("asm", ) + +" See |:RustPlay| for docs +command! -range=% RustPlay :call rust#Play(, , , ) + +" See |:RustFmt| for docs +command! -buffer RustFmt call rustfmt#Format() + +" See |:RustFmtRange| for docs +command! -range -buffer RustFmtRange call rustfmt#FormatRange(, ) + +" Mappings {{{1 + +" Bind ⌘R in MacVim to :RustRun +nnoremap :RustRun +" Bind ⌘⇧R in MacVim to :RustRun! pre-filled with the last args +nnoremap :RustRun! =join(b:rust_last_rustc_args)erust#AppendCmdLine(' -- ' . join(b:rust_last_args)) + +if !exists("b:rust_last_rustc_args") || !exists("b:rust_last_args") + let b:rust_last_rustc_args = [] + let b:rust_last_args = [] +endif + +" Cleanup {{{1 + +let b:undo_ftplugin = " + \ setlocal formatoptions< comments< commentstring< includeexpr< suffixesadd< + \|setlocal tabstop< shiftwidth< softtabstop< expandtab< textwidth< + \|if exists('b:rust_original_delimitMate_excluded_regions') + \|let b:delimitMate_excluded_regions = b:rust_original_delimitMate_excluded_regions + \|unlet b:rust_original_delimitMate_excluded_regions + \|else + \|unlet! b:delimitMate_excluded_regions + \|endif + \|if exists('b:rust_set_foldmethod') + \|setlocal foldmethod< foldlevel< + \|unlet b:rust_set_foldmethod + \|endif + \|if exists('b:rust_set_conceallevel') + \|setlocal conceallevel< + \|unlet b:rust_set_conceallevel + \|endif + \|unlet! b:rust_last_rustc_args b:rust_last_args + \|delcommand RustRun + \|delcommand RustExpand + \|delcommand RustEmitIr + \|delcommand RustEmitAsm + \|delcommand RustPlay + \|nunmap + \|nunmap + \|nunmap [[ + \|nunmap ]] + \|xunmap [[ + \|xunmap ]] + \|ounmap [[ + \|ounmap ]] + \|set matchpairs-=<:> + \|unlet b:match_skip + \" + +" }}}1 + +" Code formatting on save +if get(g:, "rustfmt_autosave", 0) + autocmd BufWritePre *.rs silent! call rustfmt#Format() +endif + +augroup END + +" %-matching. <:> is handy for generics. +set matchpairs+=<:> +" There are two minor issues with it; (a) comparison operators in expressions, +" where a less-than may match a greater-than later on—this is deemed a trivial +" issue—and (b) `Fn() -> X` syntax. This latter issue is irremediable from the +" highlighting perspective (built into Vim), but the actual % functionality +" can be fixed by this use of matchit.vim. +let b:match_skip = 's:comment\|string\|rustArrow' +source $VIMRUNTIME/macros/matchit.vim + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set noet sw=4 ts=4: diff --git a/.vim/bundle/rust.vim/indent/rust.vim b/.vim/bundle/rust.vim/indent/rust.vim new file mode 100644 index 0000000..774133d --- /dev/null +++ b/.vim/bundle/rust.vim/indent/rust.vim @@ -0,0 +1,206 @@ +" Vim indent file +" Language: Rust +" Author: Chris Morgan +" Last Change: 2016 Jul 15 + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal cindent +setlocal cinoptions=L0,(0,Ws,J1,j1 +setlocal cinkeys=0{,0},!^F,o,O,0[,0] +" Don't think cinwords will actually do anything at all... never mind +setlocal cinwords=for,if,else,while,loop,impl,mod,unsafe,trait,struct,enum,fn,extern + +" Some preliminary settings +setlocal nolisp " Make sure lisp indenting doesn't supersede us +setlocal autoindent " indentexpr isn't much help otherwise +" Also do indentkeys, otherwise # gets shoved to column 0 :-/ +setlocal indentkeys=0{,0},!^F,o,O,0[,0] + +setlocal indentexpr=GetRustIndent(v:lnum) + +" Only define the function once. +if exists("*GetRustIndent") + finish +endif + +" Come here when loading the script the first time. + +function! s:get_line_trimmed(lnum) + " Get the line and remove a trailing comment. + " Use syntax highlighting attributes when possible. + " NOTE: this is not accurate; /* */ or a line continuation could trick it + let line = getline(a:lnum) + let line_len = strlen(line) + if has('syntax_items') + " If the last character in the line is a comment, do a binary search for + " the start of the comment. synID() is slow, a linear search would take + " too long on a long line. + if synIDattr(synID(a:lnum, line_len, 1), "name") =~ 'Comment\|Todo' + let min = 1 + let max = line_len + while min < max + let col = (min + max) / 2 + if synIDattr(synID(a:lnum, col, 1), "name") =~ 'Comment\|Todo' + let max = col + else + let min = col + 1 + endif + endwhile + let line = strpart(line, 0, min - 1) + endif + return substitute(line, "\s*$", "", "") + else + " Sorry, this is not complete, nor fully correct (e.g. string "//"). + " Such is life. + return substitute(line, "\s*//.*$", "", "") + endif +endfunction + +function! s:is_string_comment(lnum, col) + if has('syntax_items') + for id in synstack(a:lnum, a:col) + let synname = synIDattr(id, "name") + if synname == "rustString" || synname =~ "^rustComment" + return 1 + endif + endfor + else + " without syntax, let's not even try + return 0 + endif +endfunction + +function GetRustIndent(lnum) + + " Starting assumption: cindent (called at the end) will do it right + " normally. We just want to fix up a few cases. + + let line = getline(a:lnum) + + if has('syntax_items') + let synname = synIDattr(synID(a:lnum, 1, 1), "name") + if synname == "rustString" + " If the start of the line is in a string, don't change the indent + return -1 + elseif synname =~ '\(Comment\|Todo\)' + \ && line !~ '^\s*/\*' " not /* opening line + if synname =~ "CommentML" " multi-line + if line !~ '^\s*\*' && getline(a:lnum - 1) =~ '^\s*/\*' + " This is (hopefully) the line after a /*, and it has no + " leader, so the correct indentation is that of the + " previous line. + return GetRustIndent(a:lnum - 1) + endif + endif + " If it's in a comment, let cindent take care of it now. This is + " for cases like "/*" where the next line should start " * ", not + " "* " as the code below would otherwise cause for module scope + " Fun fact: " /*\n*\n*/" takes two calls to get right! + return cindent(a:lnum) + endif + endif + + " cindent gets second and subsequent match patterns/struct members wrong, + " as it treats the comma as indicating an unfinished statement:: + " + " match a { + " b => c, + " d => e, + " f => g, + " }; + + " Search backwards for the previous non-empty line. + let prevlinenum = prevnonblank(a:lnum - 1) + let prevline = s:get_line_trimmed(prevlinenum) + while prevlinenum > 1 && prevline !~ '[^[:blank:]]' + let prevlinenum = prevnonblank(prevlinenum - 1) + let prevline = s:get_line_trimmed(prevlinenum) + endwhile + + " Handle where clauses nicely: subsequent values should line up nicely. + if prevline[len(prevline) - 1] == "," + \ && prevline =~# '^\s*where\s' + return indent(prevlinenum) + 6 + endif + + if prevline[len(prevline) - 1] == "," + \ && s:get_line_trimmed(a:lnum) !~ '^\s*[\[\]{}]' + \ && prevline !~ '^\s*fn\s' + \ && prevline !~ '([^()]\+,$' + \ && s:get_line_trimmed(a:lnum) !~ '^\s*\S\+\s*=>' + " Oh ho! The previous line ended in a comma! I bet cindent will try to + " take this too far... For now, let's normally use the previous line's + " indent. + + " One case where this doesn't work out is where *this* line contains + " square or curly brackets; then we normally *do* want to be indenting + " further. + " + " Another case where we don't want to is one like a function + " definition with arguments spread over multiple lines: + " + " fn foo(baz: Baz, + " baz: Baz) // <-- cindent gets this right by itself + " + " Another case is similar to the previous, except calling a function + " instead of defining it, or any conditional expression that leaves + " an open paren: + " + " foo(baz, + " baz); + " + " if baz && (foo || + " bar) { + " + " Another case is when the current line is a new match arm. + " + " There are probably other cases where we don't want to do this as + " well. Add them as needed. + return indent(prevlinenum) + endif + + if !has("patch-7.4.355") + " cindent before 7.4.355 doesn't do the module scope well at all; e.g.:: + " + " static FOO : &'static [bool] = [ + " true, + " false, + " false, + " true, + " ]; + " + " uh oh, next statement is indented further! + + " Note that this does *not* apply the line continuation pattern properly; + " that's too hard to do correctly for my liking at present, so I'll just + " start with these two main cases (square brackets and not returning to + " column zero) + + call cursor(a:lnum, 1) + if searchpair('{\|(', '', '}\|)', 'nbW', + \ 's:is_string_comment(line("."), col("."))') == 0 + if searchpair('\[', '', '\]', 'nbW', + \ 's:is_string_comment(line("."), col("."))') == 0 + " Global scope, should be zero + return 0 + else + " At the module scope, inside square brackets only + "if getline(a:lnum)[0] == ']' || search('\[', '', '\]', 'nW') == a:lnum + if line =~ "^\\s*]" + " It's the closing line, dedent it + return 0 + else + return &shiftwidth + endif + endif + endif + endif + + " Fall back on cindent, which does it mostly right + return cindent(a:lnum) +endfunction diff --git a/.vim/bundle/rust.vim/plugin/rust.vim b/.vim/bundle/rust.vim/plugin/rust.vim new file mode 100644 index 0000000..4ec4f33 --- /dev/null +++ b/.vim/bundle/rust.vim/plugin/rust.vim @@ -0,0 +1,22 @@ +" Vim syntastic plugin helper +" Language: Rust +" Maintainer: Andrew Gallant + +if exists("g:loaded_syntastic_rust_filetype") + finish +endif +let g:loaded_syntastic_rust_filetype = 1 +let s:save_cpo = &cpo +set cpo&vim + +" This is to let Syntastic know about the Rust filetype. +" It enables tab completion for the 'SyntasticInfo' command. +" (This does not actually register the syntax checker.) +if exists('g:syntastic_extra_filetypes') + call add(g:syntastic_extra_filetypes, 'rust') +else + let g:syntastic_extra_filetypes = ['rust'] +endif + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/.vim/bundle/rust.vim/syntax/rust.vim b/.vim/bundle/rust.vim/syntax/rust.vim new file mode 100644 index 0000000..8c73462 --- /dev/null +++ b/.vim/bundle/rust.vim/syntax/rust.vim @@ -0,0 +1,294 @@ +" Vim syntax file +" Language: Rust +" Maintainer: Patrick Walton +" Maintainer: Ben Blum +" Maintainer: Chris Morgan +" Last Change: Feb 24, 2016 + +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +" Syntax definitions {{{1 +" Basic keywords {{{2 +syn keyword rustConditional match if else +syn keyword rustRepeat for loop while +syn keyword rustTypedef type nextgroup=rustIdentifier skipwhite skipempty +syn keyword rustStructure struct enum nextgroup=rustIdentifier skipwhite skipempty +syn keyword rustUnion union nextgroup=rustIdentifier skipwhite skipempty contained +syn match rustUnionContextual /\/ + +syn keyword rustInvalidBareKeyword crate + +syn keyword rustPubScopeCrate crate contained +syn match rustPubScopeDelim /[()]/ contained +syn match rustPubScope /([^()]*)/ contained contains=rustPubScopeDelim,rustPubScopeCrate,rustSuper,rustModPath,rustModPathSep,rustSelf transparent + +syn keyword rustExternCrate crate contained nextgroup=rustIdentifier,rustExternCrateString skipwhite skipempty +" This is to get the `bar` part of `extern crate "foo" as bar;` highlighting. +syn match rustExternCrateString /".*"\_s*as/ contained nextgroup=rustIdentifier skipwhite transparent skipempty contains=rustString,rustOperator +syn keyword rustObsoleteExternMod mod contained nextgroup=rustIdentifier skipwhite skipempty + +syn match rustIdentifier contains=rustIdentifierPrime "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained +syn match rustFuncName "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained + +syn region rustBoxPlacement matchgroup=rustBoxPlacementParens start="(" end=")" contains=TOP contained +" Ideally we'd have syntax rules set up to match arbitrary expressions. Since +" we don't, we'll just define temporary contained rules to handle balancing +" delimiters. +syn region rustBoxPlacementBalance start="(" end=")" containedin=rustBoxPlacement transparent +syn region rustBoxPlacementBalance start="\[" end="\]" containedin=rustBoxPlacement transparent +" {} are handled by rustFoldBraces + +syn region rustMacroRepeat matchgroup=rustMacroRepeatDelimiters start="$(" end=")" contains=TOP nextgroup=rustMacroRepeatCount +syn match rustMacroRepeatCount ".\?[*+]" contained +syn match rustMacroVariable "$\w\+" + +" Reserved (but not yet used) keywords {{{2 +syn keyword rustReservedKeyword alignof become do offsetof priv pure sizeof typeof unsized yield abstract virtual final override macro + +" Built-in types {{{2 +syn keyword rustType isize usize char bool u8 u16 u32 u64 u128 f32 +syn keyword rustType f64 i8 i16 i32 i64 i128 str Self + +" Things from the libstd v1 prelude (src/libstd/prelude/v1.rs) {{{2 +" This section is just straight transformation of the contents of the prelude, +" to make it easy to update. + +" Reexported core operators {{{3 +syn keyword rustTrait Copy Send Sized Sync +syn keyword rustTrait Drop Fn FnMut FnOnce + +" Reexported functions {{{3 +" There’s no point in highlighting these; when one writes drop( or drop::< it +" gets the same highlighting anyway, and if someone writes `let drop = …;` we +" don’t really want *that* drop to be highlighted. +"syn keyword rustFunction drop + +" Reexported types and traits {{{3 +syn keyword rustTrait Box +syn keyword rustTrait ToOwned +syn keyword rustTrait Clone +syn keyword rustTrait PartialEq PartialOrd Eq Ord +syn keyword rustTrait AsRef AsMut Into From +syn keyword rustTrait Default +syn keyword rustTrait Iterator Extend IntoIterator +syn keyword rustTrait DoubleEndedIterator ExactSizeIterator +syn keyword rustEnum Option +syn keyword rustEnumVariant Some None +syn keyword rustEnum Result +syn keyword rustEnumVariant Ok Err +syn keyword rustTrait SliceConcatExt +syn keyword rustTrait String ToString +syn keyword rustTrait Vec + +" Other syntax {{{2 +syn keyword rustSelf self +syn keyword rustBoolean true false + +" If foo::bar changes to foo.bar, change this ("::" to "\."). +" If foo::bar changes to Foo::bar, change this (first "\w" to "\u"). +syn match rustModPath "\w\(\w\)*::[^<]"he=e-3,me=e-3 +syn match rustModPathSep "::" + +syn match rustFuncCall "\w\(\w\)*("he=e-1,me=e-1 +syn match rustFuncCall "\w\(\w\)*::<"he=e-3,me=e-3 " foo::(); + +" This is merely a convention; note also the use of [A-Z], restricting it to +" latin identifiers rather than the full Unicode uppercase. I have not used +" [:upper:] as it depends upon 'noignorecase' +"syn match rustCapsIdent display "[A-Z]\w\(\w\)*" + +syn match rustOperator display "\%(+\|-\|/\|*\|=\|\^\|&\||\|!\|>\|<\|%\)=\?" +" This one isn't *quite* right, as we could have binary-& with a reference +syn match rustSigil display /&\s\+[&~@*][^)= \t\r\n]/he=e-1,me=e-1 +syn match rustSigil display /[&~@*][^)= \t\r\n]/he=e-1,me=e-1 +" This isn't actually correct; a closure with no arguments can be `|| { }`. +" Last, because the & in && isn't a sigil +syn match rustOperator display "&&\|||" +" This is rustArrowCharacter rather than rustArrow for the sake of matchparen, +" so it skips the ->; see http://stackoverflow.com/a/30309949 for details. +syn match rustArrowCharacter display "->" +syn match rustQuestionMark display "?\([a-zA-Z]\+\)\@!" + +syn match rustMacro '\w\(\w\)*!' contains=rustAssert,rustPanic +syn match rustMacro '#\w\(\w\)*' contains=rustAssert,rustPanic + +syn match rustEscapeError display contained /\\./ +syn match rustEscape display contained /\\\([nrt0\\'"]\|x\x\{2}\)/ +syn match rustEscapeUnicode display contained /\\u{\x\{1,6}}/ +syn match rustStringContinuation display contained /\\\n\s*/ +syn region rustString start=+b"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeError,rustStringContinuation +syn region rustString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustStringContinuation,@Spell +syn region rustString start='b\?r\z(#*\)"' end='"\z1' contains=@Spell + +syn region rustAttribute start="#!\?\[" end="\]" contains=rustString,rustDerive,rustCommentLine,rustCommentBlock,rustCommentLineDocError,rustCommentBlockDocError +syn region rustDerive start="derive(" end=")" contained contains=rustDeriveTrait +" This list comes from src/libsyntax/ext/deriving/mod.rs +" Some are deprecated (Encodable, Decodable) or to be removed after a new snapshot (Show). +syn keyword rustDeriveTrait contained Clone Hash RustcEncodable RustcDecodable Encodable Decodable PartialEq Eq PartialOrd Ord Rand Show Debug Default FromPrimitive Send Sync Copy + +" Number literals +syn match rustDecNumber display "\<[0-9][0-9_]*\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\=" +syn match rustHexNumber display "\<0x[a-fA-F0-9_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\=" +syn match rustOctNumber display "\<0o[0-7_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\=" +syn match rustBinNumber display "\<0b[01_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\=" + +" Special case for numbers of the form "1." which are float literals, unless followed by +" an identifier, which makes them integer literals with a method call or field access, +" or by another ".", which makes them integer literals followed by the ".." token. +" (This must go first so the others take precedence.) +syn match rustFloat display "\<[0-9][0-9_]*\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\|\.\)\@!" +" To mark a number as a normal float, it must have at least one of the three things integral values don't have: +" a decimal point and more numbers; an exponent; and a type suffix. +syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)\=" +syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\(f32\|f64\)\=" +syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)" + +" For the benefit of delimitMate +syn region rustLifetimeCandidate display start=/&'\%(\([^'\\]\|\\\(['nrt0\\\"]\|x\x\{2}\|u{\x\{1,6}}\)\)'\)\@!/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime +syn region rustGenericRegion display start=/<\%('\|[^[cntrl:][:space:][:punct:]]\)\@=')\S\@=/ end=/>/ contains=rustGenericLifetimeCandidate +syn region rustGenericLifetimeCandidate display start=/\%(<\|,\s*\)\@<='/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime + +"rustLifetime must appear before rustCharacter, or chars will get the lifetime highlighting +syn match rustLifetime display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" +syn match rustLabel display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*:" +syn match rustCharacterInvalid display contained /b\?'\zs[\n\r\t']\ze'/ +" The groups negated here add up to 0-255 but nothing else (they do not seem to go beyond ASCII). +syn match rustCharacterInvalidUnicode display contained /b'\zs[^[:cntrl:][:graph:][:alnum:][:space:]]\ze'/ +syn match rustCharacter /b'\([^\\]\|\\\(.\|x\x\{2}\)\)'/ contains=rustEscape,rustEscapeError,rustCharacterInvalid,rustCharacterInvalidUnicode +syn match rustCharacter /'\([^\\]\|\\\(.\|x\x\{2}\|u{\x\{1,6}}\)\)'/ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustCharacterInvalid + +syn match rustShebang /\%^#![^[].*/ +syn region rustCommentLine start="//" end="$" contains=rustTodo,@Spell +syn region rustCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell +syn region rustCommentLineDocError start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell contained +syn region rustCommentBlock matchgroup=rustCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell +syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell +syn region rustCommentBlockDocError matchgroup=rustCommentBlockDocError start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNestError,@Spell contained +syn region rustCommentBlockNest matchgroup=rustCommentBlock start="/\*" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell contained transparent +syn region rustCommentBlockDocNest matchgroup=rustCommentBlockDoc start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell contained transparent +syn region rustCommentBlockDocNestError matchgroup=rustCommentBlockDocError start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNestError,@Spell contained transparent +" FIXME: this is a really ugly and not fully correct implementation. Most +" importantly, a case like ``/* */*`` should have the final ``*`` not being in +" a comment, but in practice at present it leaves comments open two levels +" deep. But as long as you stay away from that particular case, I *believe* +" the highlighting is correct. Due to the way Vim's syntax engine works +" (greedy for start matches, unlike Rust's tokeniser which is searching for +" the earliest-starting match, start or end), I believe this cannot be solved. +" Oh you who would fix it, don't bother with things like duplicating the Block +" rules and putting ``\*\@ +" +" See for details on how to add an external Syntastic checker: +" https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide#external + +if exists("g:loaded_syntastic_rust_rustc_checker") + finish +endif +let g:loaded_syntastic_rust_rustc_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_rust_rustc_GetLocList() dict + let makeprg = self.makeprgBuild({}) + + " Old errorformat (before nightly 2016/08/10) + let errorformat = + \ '%E%f:%l:%c: %\d%#:%\d%# %.%\{-}error:%.%\{-} %m,' . + \ '%W%f:%l:%c: %\d%#:%\d%# %.%\{-}warning:%.%\{-} %m,' . + \ '%C%f:%l %m' + + " New errorformat (after nightly 2016/08/10) + let errorformat .= + \ ',' . + \ '%-G,' . + \ '%-Gerror: aborting %.%#,' . + \ '%-Gerror: Could not compile %.%#,' . + \ '%Eerror: %m,' . + \ '%Eerror[E%n]: %m,' . + \ '%-Gwarning: the option `Z` is unstable %.%#,' . + \ '%Wwarning: %m,' . + \ '%Inote: %m,' . + \ '%C %#--> %f:%l:%c' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'rust', + \ 'name': 'rustc'}) + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/.vim/bundle/vim-go/CHANGELOG.md b/.vim/bundle/vim-go/CHANGELOG.md new file mode 100644 index 0000000..e6962de --- /dev/null +++ b/.vim/bundle/vim-go/CHANGELOG.md @@ -0,0 +1,349 @@ +## 1.11 - (January 9, 2017) + +FEATURES: + +* Travis test integration has been added. Now any file that is added as `_test.vim` will be automatically tested in for every Pull Request (just like how we add tests to Go with `_test.go`). Going forward this will tremendously increase the stability and decrease the maintaince burden of vim-go. [gh-1157] +* Add new `g:go_updatetime` setting to change the default updatetime (which was hardcoded previously) [gh-1055] +* Add new `g:go_template_use_pkg` setting to enable to use cwd as package name instead of basic template file [gh-1124] + +IMPROVEMENTS: + +* Add `statusline` support for `:GoMetaLinter` [gh-1120] +* Quickfix and Location lists contain now a descriptive title (requires at least Vim `7.4.2200`)[gh-1004] +* Check `go env GOPATH` as well for `:GoInstallBinaries` as Go has now a default path for GOPATH ("~/go")starting with 1.8 [gh-1152] +* `:GoDocBrowser` now also works on import paths [gh-1174] + +BUG FIXES: + +* Always use full path to detect packages to be shown in statusline [gh-1121] +* Use `echom` to persist errors in case of multiple echos [gh-1122] +* Fix a race condition where a quickfix window was not closed if a job has succeeded [gh-1123] +* Do not expand coverage arguments for non job execution of `:GoCoverage` [gh-1127] +* `:GoCoverage` doesn't mess up custom syntax anymore [gh-1128] +* Disable autoformat for `asm` files as they might be non Go ASM format [gh-1141] +* Fix indentation broken when using a action with a minus sign like `{{-` [gh-1143] +* Fix breaking Neovim change of passing less arguments to callbacks [gh-1145] +* Fix `guru` commands if custom build tags were set [gh-1136] +* Fix referencing a non defined variable for async commands when bang (!) was used +* Fix `:GoDef` failing for a modified buffer if `hidden` was not set [gh-1132] +* Fix `:GoDefStack` to allow popping from jump list when buffer is modified [gh-1133] +* Improve internal defining of functions and referencing them for async operations [gh-1155] +* Fix `:GoMetaLinter` failing if `go_metalinter_command` is set. [gh-1160] +* Fix `:GoMetaLinter`'s `go_metalinter_deadline` setting for async mode [gh-1146] + +BACKWARDS INCOMPATIBILITIES: + +* The following syntax options are now disabled by default. If you're using them be sure to set them in your .vimrc [gh-1167] + +```viml +g:go_highlight_array_whitespace_error +g:go_highlight_chan_whitespace_error +g:go_highlight_extra_types +g:go_highlight_space_tab_error +g:go_highlight_trailing_whitespace_error +``` + + + +## 1.10 (November 24, 2016) + +FEATURES: + +* **Vim 8.0 support!** This is the initial version to add Vim 8.0 based support to + all basic commands (check out below for more information). With time we'll + going to extend it to other commands. All the features are only enabled if + you have at least Vim 8.0.0087. Backwards compatible with Vim 7.4.x. + If you see any problems, please open an issue. + +* We have now a [logo for vim-go](https://github.com/fatih/vim-go/blob/master/assets/vim-go.png)! Thanks to @egonelbre for his work on this. +* `:GoBuild`, `:GoTest`, `:GoTestCompile`, `:GoInstall` commands are now fully + async. Async means it doesn't block your UI anymore. If the command finished + it echoes the status. For a better experience use the statusline information + (more info below) + +* `:GoCoverage` and `:GoCoverageBrowser` commands are fully async. +* `:GoDef` is fully async if `guru` is used as command. +* `:GoRename` is fully async . + +* `:GoMetaLinter` is fully asnyc. Also works with the current autosave linting + feature. As a reminder, to enable auto linting on save either call + `:GoMetaLinterAutoSaveToggle` (temporary) or add `let + g:go_metalinter_autosave = 1` (persistent) to your virmc). + +* All `guru` commands run asynchronously if Vim 8.0 is being used. Current + Commands: + * GoImplements + * GoWhicherrs + * GoCallees + * GoDescribe + * GoCallers + * GoCallstack + * GoFreevars + * GoChannelPeers + * GoReferrers + +* `:GoSameIds` also runs asynchronously. This makes it useful especially for + auto sameids mode. In this mode it constantly evaluates the identifier under the + cursor whenever it's in hold position and then calls :GoSameIds. As a + reminder, to enable auto info either call `:GoSameIdsAutoToggle`(temporary) + or add `let g:go_auto_sameids = 1` (persistent) to your vimrc. + +* `:GoInfo` is now non blocking and works in async mode if `guru` is used in + `g:go_info_mode`. This makes it useful especially for autoinfo mode. In this + mode it constantly evaluates the identifier under the cursor whenever it's in + hold position and then calls :GoInfo. As a reminder, to enable auto info + either call `:GoAutoTypeInfoToggle`(temporary) or add `let + g:go_auto_type_info = 1` (persistent) to your vimrc. To use `guru` instead of + `gocode` add following to your vimrc: `let g:go_info_mode = 'guru'` + + The `guru` is more accurate and reliabed due the usage of `guru` describe. It + doesn't rely on `pkg/` folder like `gocode` does. However it's slower than + `gocode` as there is no caching mechanism in `guru` yet. + +* **New**: Statusline function: `go#statusline#Show()` which can be plugged into + the statusline bar. Works only with vim 8.0. It shows all asynchronously + called functions status real time. Checkout it in action: + https://twitter.com/fatih/status/800473735467847680. To enable it add the + following to your `vimrc`. If you use lightline, airline, .. check out their + respective documentation on how to add a custom function: + +```viml +" go command status (requires vim-go) +set statusline+=%#goStatuslineColor# +set statusline+=%{go#statusline#Show()} +set statusline+=%* +``` + +IMPROVEMENTS: + +* **:GoDocBrowser** is now capable to to understand the identifier under the cursor (just like :GoDoc) +* Function calls are now highlighted as well when `g:go_highlight_functions` is enabled [gh-1048] +* Add completion support for un-imported packages. This allows to complete even + if the package is not imported. By default it's disabled, enable by adding + `let g:go_gocode_unimported_packages = 1` [gh-1084] +* Tools that embeds GOROOT into their binaries do not work when people update + their Go version and the GOROOT contains the vesion as part of their path + (i.e: `/usr/local/Cellar/go/1.7.2/libexec`, [more + info](https://blog.filippo.io/stale-goroot-and-gorebuild/)) . This is now + fixed by introducing automatic GOROOT set/unset before each tool invoke. + [gh-954] +* Added new setting `g:go_echo_go_info` to enable/disable printing identifier + information when completion is done [gh-1101] +* Added new `go_echo_command_info` setting is added, which is enabled by + default. It's just a switch for disabling messages of commands, such as + `:GoBuild`, `:GoTest`, etc.. Useful to *disable* if `go#statusline#Show()` is + being used in Statusline, to prevent to see duplicates notifications. +* goSameId highlighting is now linked to `Search`, which is much more clear as + it changes according to the users colorscheme +* Add plug mapping `(go-lint)` for :GoLint [gh-1089] + + +BUG FIXES: + +* Change back nil and iota highlighting color to the old type [gh-1049] +* Fix passing arguments to `:GoBuild` while using NeoVim [gh-1062] +* Do not open a split if `:GoDef` is used on a modified file [gh-1083] +* Highlight nested structs correctly [gh-1075] +* Highlight builtin functions correctly if `g:go_highlight_functions` is enabled [gh-1070] +* Fix `:GoSameIds` highlighting if a new buffer is opened in the same window [gh-1067] +* Internal: add `abort` to all vim function to return in case of errors [gh-1100] +* Fix `:GoCoverage` to be executed if working dir is not inside the test dir [gh-1033] + +BACKWARDS INCOMPATIBILITIES: + +* remove vim-dispatch and vimproc.vim support. vim 8.0 has now the necessary + API to invoke async jobs and timers. Going forward we should use those. Also + this will remove the burden to maintain compatibility with those plugins. + +* `go#jobcontrol#Statusline()` is removed in favor of the new, global and + extensible `go#statusline#Show()` + +## 1.9 (September 13, 2016) + +IMPROVEMENTS: + +* **guru** uses now the `-modified` flag, which allows us use guru on modified + buffers as well. This affects all commands where `guru` is used. Such as + `:GoDef`, `:GoReferrers`, etc.. [gh-944] +* **:GoDoc** uses now the `-modified` flag under the hood (for `gogetdoc), which allows us to get documentation for the identifier under the cursor ina modified buffer. [gh-1014] +* Cleanup and improve documentation [gh-987] +* Add new `g:go_gocode_socket_type` setting to change the underlying socket type passed to `gocode`. Usefull to fallback to `tcp` on cases such as Bash on Windows [gh-1000] +* `:GoSameIds` is now automatically re-evaluated in cases of buffer reloads (such as `:GoRename`) [gh-998] +* Improve docs about `go_auto_sameids` [gh-1017] +* Improve error message by printing the full path if an incompatible `goimports` is being used [gh-1006] +* `iota` and `nil` are now highlighted correctly and are not treated as booleans [gh-1030] + +BUG FIXES: + +* Fix system calls on Windows [gh-988] +* Fix :GoSameIds and :GoCoverage for light background and after changing color schemes [gh-983] +* Fix TagBar and `GoCallers` for Windows user [gh-999] +* Set updatetime for for `auto_sameids` feature as well [gh-1016] +* Update docs about missing `go_highlight_generate_tags` setting [gh-1023] +* Fix updating the jumplist if `:GoDef` is used [gh-1029] +* Fix highlighting literal percent sign (`%%`) in strings [gh-1011] +* Fix highlighting of nested fields [gh-1007] +* Fix checking for `exepath` feature for the upcoming vim 8.0 release [gh-1046] + +BACKWARDS INCOMPATIBILITIES: + +* Rename `GoMetalinterAutoSaveToggle` to `GoMetaLinterAutoSaveToggle` to make it compatible with the existing `:GoMetaLinter` command [gh-1020] + +## 1.8 (July 31, 2016) + +FEATURES: +* New **`:GoAddTags`** command that adds field tags for the fields of a struct automatically based on the field names. Checkout the demo to see it in action: https://twitter.com/fatih/status/759822857773907968 [gh-971] +* The snippet expansion `json` is now much more smarter. It pre populates the placeholder according to the first word and it also applies `snake_case` or `camelCase` conversion. Together with `:GoAddTags` it gives `vim-go` users flexible ways of populating a field tag. Checkout the demo to see it in action: https://twitter.com/fatih/status/754477622042689536 [gh-927] +* New **`:GoSameIds`** command. When called highlights all same identifiers in the current file. Can be also enabled to highlight identifiers automatically (with `:GoSameIdsAutoToggle` or `g:go_auto_sameids`). Checkout the demo to see it in action: https://twitter.com/fatih/status/753673709278339072. [gh-936] +* New **`:GoWhicherrs`** command. It shows all possible values of the selected error variable. [gh-948] +* Add new `errp` snippet to expand an `if err != nil { panic() }` clause [gh-926] +* If you open a new buffer with a Go filename it get automatically populated based on the directory. If there are no Go files a simple main package is created, otherwise the file will include the package declaration line based on the package in the current directory. Checkout the demo to see it in action: https://twitter.com/fatih/status/748333086643994624. This is enabled by default. Can be disabled with `let g:go_template_autocreate = 0`. You can use your own template with `let g:go_template_file = "foo.go"` and putting the file under the `templates/` folder. [gh-918] +* Added new toggle commands to enable/disable feature that run for your + automatic. For example if you have `let g:go_auto_type_info = 1` enabled, you + can now easily enable/disable it on the fly. Support added with the following + commands: `:GoAutoTypeInfoToggle`, `:GoFmtAutoSaveToggle`, + `:GoAsmFmtAutoSaveToggle`, `:GoMetalinterAutoSaveToggle`, + `:GoTemplateAutoCreateToggle` [gh-945] + + +IMPROVEMENTS: +* `:GoDoc` accepts arguments now which are passed directly to `godoc`. So usages like `:GoDoc flag` works again (it was changed in previous versions [gh-894] +* `:GoDef` works now for modified files as well [gh-910] +* Internal: pass filename to the `--srcdir` flag to enable upcoming `goimports` features [gh-957] +* Internal: fix indentations on all files to **2-spaces/no tabs**. This is now the default vim-go style across all VimL files [gh-915] +* Internal: autocmd settings can be now dynamically enabled/disabled [gh-939] +* Internal: automatically detect `GOPATH` for :GoInstall [gh-980] +* Internal: shell executions uses now by default `sh` and then resets it back to the user preference. [gh-967] +* Syntax: improved syntax highglighting performance for methods, fields, structs and interface type declarations [gh-917] +* Syntax: moved `:GoCoverage` highlight definition into go's syntax file for more customizability [gh-962] + + +BUG FIXES: + +* Escape `#` characters when opening URL's, as it's handled as alternative file in vim [gh-895] +* Fix typos in `doc/vim-go.txt` about usages of syntax highglightings [gh-897] +* Fix `:GoCoverage` not running for Neovim [gh-899] +* Fix `:GoFmt` not picking up `-srcdir` if the command was set to use `goimports` [gh-904] +* Fix `:GoTestCompile` to not leave behind artifacts if the cwd and the test files's directory do not match [gh-909] +* Fix `:GoDocBrowser` to not fail if godoc doesn't exist [gh-920] +* Fix `:GoFmt` to not change the permissions of saved file. Now original file permissions are restored [gh-922] + +BACKWARDS INCOMPATIBILITIES: + +* `g:go_highlight_structs` and `g:go_highlight_interface` are removed in favor of `g:go_highlight_types` [gh-917] + + +## 1.7.1 (June 7, 2016) + +BUG FIXES: +* Fixed typo in `syntax/go.vim` file from `go:go_highlight_fields` to `g:go_highlight_fields` + +## 1.7 (June 7, 2016) + +FEATURES: + +* New **`:GoImpl`** command that generates method stubs for implementing an interface. Checkout the [demo](https://twitter.com/fatih/status/729991365581545472) to see how it works. [gh-846] +* `godef` support is added back as an optional setting. By default `:GoDef` still uses `guru`, but can be changed to `godef` by adding the option: `let g:go_def_mode = 'godef'` [gh-888] +* New `` and `]>` shortcuts to split current window and jumpt to the identifier under cursor. [gh-838] +* New syntax setting" `g:go_highlight_fields` that highlights struct field references [gh-854] + +IMPROVEMENTS: + +* Invoking `:GoRename` now reloads all files to reflect new changes automatically [gh-855] +* Calling `:GoTestCompile` does not create any temporary binary file anymore [gh-879] +* Enable passing the `-tags` flag to `:GoDef`. Now you can pass build tags to `:GoDef` via `:GoGuruTags` or `g:go_guru_tags` +* Internal refactoring to use custom `system()` function that wraps both the standard `system()` call and `vimproc`. Now all system calls will take advantage and will use `vimproc` if installed. [gh-801] +* Completion enables now `gocode`'s `autobuild` and `propose-builtins` flags automatically. With these settings packages will be automatically build to get the freshest completion candidates and builtin keywords will be showed as well. By defaults these settings are enabled. Settings can be disabled/enabled via `g:go_gocode_autobuild` and `g:go_gocode_propose_builtins`. [gh-815] +* Added new `http.HandlerFunc` snippets with `hf` and `hhf` shortcuts [gh-816] +* Added new `Example` and `Benchmark` snippets with `example` and `benchmark` shortcuts [gh-836] +* Search tool binaries first in `GOBIN` and then in `PATH` as most of vim-go users installs it to `GOBIN` mostly [gh-823] +* Improve `guru` based commands by providing automatically detected GOPATHS, such as `gb`, `godep` to be used if possible [gh-861] +* Add `(go-imports)` mapping to make it assignable to other keys [gh-878] +* Increase compatibility with tcsh [gh-869] +* Improve `:GoInstallBinaries` for GOPATH's which don't have packages that work well with `go get -u`. We have a new `g:go_get_update` setting to disable it. By default it's enabled. [gh-883] + + + +BUG FIXES: +* Fix `(go-freevars)` plug mapping to work as in visual mode instead of noncompatible normal mode [gh-832] +* Commands based on guru now shows a more meaningful error message instead of just showing the exit status (-1) +* Fix `:GoCoverage` accidently enabling syntax highlighting for users who don't use syntax (i.e syntax off) [gh-827] +* Fix `:GoCoverage` colors to work for xterm as well [gh-863] +* Fix commenting out block of texts for Go templates (filetype gothtmltmpl) [gh-813] +* Fix `:GoImplements` failing because of an empty scope definition. Now we default to current package to make it usable. +* Fix `:GoPlay` posting to non HTTPS url. [gh-847] +* Fix escaping the filenames for lint and motion commands [gh-862] +* Fix escaping the filename to `:GoDef` completely for tcsh [gh-868] +* Fix showing SUCCESS for `go test` related commands if no test files are available [gh-859] + + + +## 1.6 (April 25, 2016) + +FEATURES: + +* New `CHANGELOG.md` file (which you're reading now). This will make it easier + for me to track changes and release versions +* **`:GoCoverage`** is now highlighting the current source file for + covered/uncovered lines. If called again it runs the tests and updates the + annotation. Use `:GoCoverageClear` to clear the coverage annotation. + This is a pretty good addition to vim-go and I suggest to check out the gif + that shows it in action: https://twitter.com/fatih/status/716722650383564800 + [gh-786] +* **`:GoCoverageToggle`** just like `:GoCoverage` but acts as a toggle. If run + again it clears the annotation. +* **`:GoCoverageBrowser`** opens a new annotated HTML page. This is the old + `:GoCoverage` behavior [gh-786] +* **`:GoDoc`** uses now [gogetdoc](https://github.com/zmb3/gogetdoc) to + lookup and display the comment documentation for the identifier under the + cursor. This is more superior as it support looking up dot imports, named + imports and imports where package name and file name are different [gh-782] +* **`guru support`**: `oracle` is replaced by the new tool `guru`. `oracle.vim` + is therefore renamed to `guru.vim`. I've also refactored the code to make it + much more easier to maintain and add additional features in future (such as + upcoming JSON decoding). vim-go is now fully compatible with `guru`. Please + be sure you have installed `guru`. You can easily do it with + `:GoInstallBinaries`. +* **`:GoDef`** uses now `guru definition` under the hood instead of `godef`. + This fixes the following issues: 1. dot imports 2. vendor imports 3. folder + != package name imports. The tool `godef` is also deprecated and not used + anymore. +* **`:GoDef`** does have now history of the call stack. This means you can + easily jump back to your last entry. This can be done with the new command + `:GoDefPop` or the mapping `CTRL-t`. To see the stack and jump between entries + you can use the new command `:GoDefStack`, which shows the list of all stack + entries. To reset the stack list anytime you can call `:GoDefStackClear` + [gh-776] + +IMPROVEMENTS: + +* **`:GoCoverage`** is executed asynchronously when used within Neovim [gh-686] +* **`:GoTestFunc`** supports now testable examples [gh-794] +* **`:GoDef`** can jump to existing buffers instead of opening a new window + (split, vsplit or tab). By default it's disabled to not break the old + behavior, can be enabled with `let g:go_def_reuse_buffer = 1` + +BUG FIXES: + +* Fix not showing documentation for dot, named and package/file name being different imports [gh-332] +* Term mode: fix closing location list if result is successful after a failed attempt [gh-768] +* Syntax: fix gotexttmpl identifier highlighting [gh-778] +* Doc: fix wrong wording for `go-run` mapping. It's for the whole main package, + not for the current file + +BACKWARDS INCOMPATIBILITIES: + +* `:GoDef` doesn't accept any identifier as an argument. This is not suported + via `guru definition` and also was not widely used either. Also with this, we + significantly simplified the existing def.vim code +* `:GoOracleScope` and `:GoOracleTags` are deprecated in favor of + `:GoGuruScope` and `:GoGuruTags`. Also `g:go_oracle_scope` is renamed to + `g:go_guru_scope` +* `g:go_guru_scope` accepts a variable in type of `list` instead of `string`. + i.g: `let g:go_guru_scope = ["github.com/fatih/structs", "golang.org/x/tools/..."]` + + +## Previous releases + +Previous changelogs can be found here: https://github.com/fatih/vim-go/releases + diff --git a/.vim/bundle/vim-go/LICENSE b/.vim/bundle/vim-go/LICENSE new file mode 100644 index 0000000..fd538bd --- /dev/null +++ b/.vim/bundle/vim-go/LICENSE @@ -0,0 +1,60 @@ +Copyright (c) 2015, Fatih Arslan +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of vim-go nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +This software includes some portions from Go. Go is used under the terms of the +BSD like license. + +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The Go gopher was designed by Renee French. http://reneefrench.blogspot.com/ The design is licensed under the Creative Commons 3.0 Attributions license. Read this article for more details: https://blog.golang.org/gopher diff --git a/.vim/bundle/vim-go/Makefile b/.vim/bundle/vim-go/Makefile new file mode 100644 index 0000000..20b296d --- /dev/null +++ b/.vim/bundle/vim-go/Makefile @@ -0,0 +1,7 @@ +all: test + +test: + @echo "==> Running tests" + @./scripts/test.sh + +.PHONY: all test diff --git a/.vim/bundle/vim-go/README.md b/.vim/bundle/vim-go/README.md new file mode 100644 index 0000000..6c979ca --- /dev/null +++ b/.vim/bundle/vim-go/README.md @@ -0,0 +1,339 @@ +# vim-go [![Build Status](http://img.shields.io/travis/fatih/vim-go.svg?style=flat-square)](https://travis-ci.org/fatih/vim-go) + +

+ Vim-go logo +

+ +Go (golang) support for Vim, which comes with pre-defined sensible settings (like +auto gofmt on save), with autocomplete, snippet support, improved syntax +highlighting, go toolchain commands, and more. If needed vim-go installs all +necessary binaries for providing seamless Vim integration with current +commands. It's highly customizable and each individual feature can be +disabled/enabled easily. + +## Features + +* Improved Syntax highlighting with items such as Functions, Operators, Methods. +* Auto completion support via `gocode` +* Better `gofmt` on save, which keeps cursor position and doesn't break your undo + history +* Go to symbol/declaration with `:GoDef` +* Look up documentation with `:GoDoc` inside Vim or open it in browser +* Automatically import packages via `:GoImport` or plug it into autosave +* Compile your package with `:GoBuild`, install it with `:GoInstall` or test + them with `:GoTest` (also supports running single tests via `:GoTestFunc`) +* Quickly execute your current file/files with `:GoRun` +* Automatic `GOPATH` detection based on the directory structure (i.e. `gb` + projects, `godep` vendored projects) +* Change or display `GOPATH` with `:GoPath` +* Create a coverage profile and display annotated source code to see which + functions are covered with `:GoCoverage` +* Call `gometalinter` with `:GoMetaLinter`, which invokes all possible linters + (golint, vet, errcheck, deadcode, etc..) and shows the warnings/errors +* Lint your code with `:GoLint` +* Run your code through `:GoVet` to catch static errors +* Advanced source analysis tools utilizing guru, such as `:GoImplements`, + `:GoCallees`, and `:GoReferrers` +* Precise type-safe renaming of identifiers with `:GoRename` +* List all source files and dependencies +* Unchecked error checking with `:GoErrCheck` +* Integrated and improved snippets, supporting `ultisnips` or `neosnippet` +* Share your current code to [play.golang.org](http://play.golang.org) with `:GoPlay` +* On-the-fly type information about the word under the cursor. Plug it into + your custom vim function. +* Go asm formatting on save +* Tagbar support to show tags of the source code in a sidebar with `gotags` +* Custom vim text objects such as `a function` or `inner function` + list. +* Jump to function or type declarations with `:GoDecls` or `:GoDeclsDir` +* Vim 8.0 support. Async execution for most commands, various underlying improvements. +* NeoVim support (beta). Async execution for some commands. +* Alternate between implementation and test code with `:GoAlternate` + +Checkout the official [tutorial](https://github.com/fatih/vim-go-tutorial) +that goes literally over all features and shows many tips and tricks. It shows +how to install vim-go and explains many unknown use cases. Recommended for +beginners as well as advanced users: https://github.com/fatih/vim-go-tutorial + +## Install + +Master branch is supposed to be a development branch. So stuff here can break +and change. Please try use always the [latest +release](https://github.com/fatih/vim-go/releases/latest) + +Vim-go follows the standard runtime path structure, so I highly recommend to +use a common and well known plugin manager to install vim-go. Do not use vim-go +with other Go oriented vim plugins. For Pathogen just clone the repo. For other +plugin managers add the appropriate lines and execute the plugin's install +command. + +* [Pathogen](https://github.com/tpope/vim-pathogen) + * `git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go` +* [vim-plug](https://github.com/junegunn/vim-plug) + * `Plug 'fatih/vim-go'` +* [NeoBundle](https://github.com/Shougo/neobundle.vim) + * `NeoBundle 'fatih/vim-go'` +* [Vundle](https://github.com/gmarik/vundle) + * `Plugin 'fatih/vim-go'` +* [Vim packages](http://vimhelp.appspot.com/repeat.txt.html#packages) (since Vim 7.4.1528) + * `git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-go` + +Please be sure all necessary binaries are installed (such as `gocode`, `godef`, +`goimports`, etc.). You can easily install them with the included +`:GoInstallBinaries` command. If invoked, all necessary binaries will be +automatically downloaded and installed to your `$GOBIN` environment (if not set +it will use `$GOPATH/bin`). Note that this command requires `git` for fetching +the individual Go packages. Additionally, use `:GoUpdateBinaries` to update the +installed binaries. + +### Optional + +* Autocompletion is enabled by default via ``. To get real-time +completion (completion by type) install: +[neocomplete](https://github.com/Shougo/neocomplete.vim) for Vim or +[deoplete](https://github.com/Shougo/deoplete.nvim) and +[deoplete-go](https://github.com/zchee/deoplete-go) for NeoVim or +[SimpleAutoCmplPop](https://github.com/roxma/SimpleAutoComplPop) +* To display source code tag information on a sidebar install +[tagbar](https://github.com/majutsushi/tagbar). +* For snippet features install: +[neosnippet](https://github.com/Shougo/neosnippet.vim) or +[ultisnips](https://github.com/SirVer/ultisnips). +* Screenshot color scheme is a slightly modified molokai: + [fatih/molokai](https://github.com/fatih/molokai). +* For a better documentation viewer checkout: + [go-explorer](https://github.com/garyburd/go-explorer). + +## Usage + +Many of the plugin's [features](#features) are enabled by default. There are no +additional settings needed. All usages and commands are listed in +`doc/vim-go.txt`. Note that help tags needs to be populated. Check your plugin +manager settings to generate the documentation (some do it automatically). +After that just open the help page to see all commands: + + :help vim-go + +## Example Mappings + +vim-go has several `` mappings which can be used to create custom +mappings. Unless otherwise specified, none of these mappings are enabled +by default. Here some examples you might find useful: + +Run commands such as `go run` for the current file with `r` or `go +build` and `go test` for the current package with `b` and `t` +respectively. Display beautifully annotated source code to see which functions +are covered with `c`. + +```vim +au FileType go nmap r (go-run) +au FileType go nmap b (go-build) +au FileType go nmap t (go-test) +au FileType go nmap c (go-coverage) +``` + +By default the mapping `gd` is enabled, which opens the target identifier in +current buffer. You can also open the definition/declaration, in a new vertical, +horizontal, or tab, for the word under your cursor: + +```vim +au FileType go nmap ds (go-def-split) +au FileType go nmap dv (go-def-vertical) +au FileType go nmap dt (go-def-tab) +``` + +Open the relevant Godoc for the word under the cursor with `gd` or open +it vertically with `gv` + +```vim +au FileType go nmap gd (go-doc) +au FileType go nmap gv (go-doc-vertical) +``` + +Or open the Godoc in browser + +```vim +au FileType go nmap gb (go-doc-browser) +``` + +Show a list of interfaces which is implemented by the type under your cursor +with `s` + +```vim +au FileType go nmap s (go-implements) +``` + +Show type info for the word under your cursor with `i` (useful if you +have disabled auto showing type info via `g:go_auto_type_info`) + +```vim +au FileType go nmap i (go-info) +``` + +Rename the identifier under the cursor to a new name + +```vim +au FileType go nmap e (go-rename) +``` + +More `` mappings can be seen with `:he go-mappings`. Also these are just +recommendations, you are free to create more advanced mappings or functions +based on `:he go-commands`. + +## Settings +Below are some settings you might find useful. For the full list see `:he +go-settings`. + +By default syntax-highlighting for Functions, Methods and Structs is disabled. +To change it: +```vim +let g:go_highlight_functions = 1 +let g:go_highlight_methods = 1 +let g:go_highlight_fields = 1 +let g:go_highlight_types = 1 +let g:go_highlight_operators = 1 +let g:go_highlight_build_constraints = 1 +``` + +Enable goimports to automatically insert import paths instead of gofmt: + +```vim +let g:go_fmt_command = "goimports" +``` + +By default vim-go shows errors for the fmt command, to disable it: + +```vim +let g:go_fmt_fail_silently = 1 +``` + +Disable auto fmt on save: + +```vim +let g:go_fmt_autosave = 0 +``` + +Disable opening browser after posting your snippet to `play.golang.org`: + +```vim +let g:go_play_open_browser = 0 +``` + +By default when `:GoInstallBinaries` is called, the binaries are installed to +`$GOBIN` or `$GOPATH/bin`. To change it: + +```vim +let g:go_bin_path = expand("~/.gotools") +let g:go_bin_path = "/home/fatih/.mypath" "or give absolute path +``` + +Disable updating dependencies when installing/updating binaries: +```vim +let g:go_get_update = 0 +``` + +### Using with Neovim (beta) + +Note: Neovim currently is not a first class citizen for vim-go. You are free +to open bug, however I'm not using Neovim so it's hard for me to test it. +vim-go might not work well as good as in Vim. I'm happy to accept pull requests +or very detailed bug reports. If you're interested to improve the state of +Neovim in vim-go you're always welcome! + + +Run `:GoRun` in a new tab, horizontal split or vertical split terminal + +```vim +au FileType go nmap rt (go-run-tab) +au FileType go nmap rs (go-run-split) +au FileType go nmap rv (go-run-vertical) +``` + +By default new terminals are opened in a vertical split. To change it + +```vim +let g:go_term_mode = "split" +``` + +By default the testing commands run asynchronously in the background and +display results with `go#jobcontrol#Statusline()`. To make them run in a new +terminal + +```vim +let g:go_term_enabled = 1 +``` + +### Using with Syntastic +Sometimes when using both `vim-go` and `syntastic` Vim will start lagging while +saving and opening files. The following fixes this: + +```vim +let g:syntastic_go_checkers = ['golint', 'govet', 'errcheck'] +let g:syntastic_mode_map = { 'mode': 'active', 'passive_filetypes': ['go'] } +``` + +Another issue with `vim-go` and `syntastic` is that the location list window +that contains the output of commands such as `:GoBuild` and `:GoTest` might not appear. +To resolve this: + +```vim +let g:go_list_type = "quickfix" +``` + +## More info + +Check out the [Wiki](https://github.com/fatih/vim-go/wiki) page for more +information. It includes +[Screencasts](https://github.com/fatih/vim-go/wiki/Screencasts), an [FAQ +section](https://github.com/fatih/vim-go/wiki/FAQ-Troubleshooting), and many +other [various pieces](https://github.com/fatih/vim-go/wiki) of information. + +## Development & Testing + +vim-go supports now test files. Please check `autoload` folder for examples. If +you add a new feature be sure you also include the `_test.vim` file next to the +script. Test functions should be starting with `Test_`, example: + + +```viml +function Test_run_fmt() + call assert_equal(expected, actual) + ... +endfunction +``` + +You can locally test it by running: + +``` +make +``` + +This will run all tests and print either `PASS` or `FAIL` to indicate the final +status of all tests. + +Additionally, each new pull request will trigger a new Travis-ci job. + +## Donation + +People have asked for this for a long time, now you can be a fully supporter by +[being a patron](https://www.patreon.com/fatih)! + +By being a patron, you are enabling vim-go to grow and mature, helping me to +invest in bug fixes, new documentation, and improving both current and future +features. It's completely optional and is just a direct way to support Vim-go's +ongoing development. Thanks! + +[https://www.patreon.com/fatih](https://www.patreon.com/fatih) + +## Credits + +* Go Authors for official vim plugins +* Gocode, Godef, Golint, Guru, Goimports, Gotags, Errcheck projects and + authors of those projects. +* Other vim-plugins, thanks for inspiration (vim-golang, go.vim, vim-gocode, + vim-godef) +* [Contributors](https://github.com/fatih/vim-go/graphs/contributors) of vim-go + +## License + +The BSD 3-Clause License - see `LICENSE` for more details diff --git a/.vim/bundle/vim-go/addon-info.json b/.vim/bundle/vim-go/addon-info.json new file mode 100644 index 0000000..145d961 --- /dev/null +++ b/.vim/bundle/vim-go/addon-info.json @@ -0,0 +1,6 @@ +{ + "name": "vim-go", + "description": "Full featured Go (golang) support for Vim.", + "author": "Fatih Arslan ", + "repository" : {"type": "git", "url": "https://github.com/fatih/vim-go.git"} +} diff --git a/.vim/bundle/vim-go/assets/screenshot.png b/.vim/bundle/vim-go/assets/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2923d7f67ce76b4a294ce1fdda2091188be49d GIT binary patch literal 764721 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 z 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"`gi`Y9&bi*7=ub;2Aup7MFjYe?Cgk^9 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

WvhVj7 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

^1ZHn1Ck2S~l6I?pfB>6}dN=ykdpN6_N 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Ík6#$ipkQkxAu2TAe%G(^0-ESV(|q@n?`UaV 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 O>^XS>oM2DB|NKAUGDv;^ literal 0 HcmV?d00001 diff --git a/.vim/bundle/vim-go/assets/vim-go.png b/.vim/bundle/vim-go/assets/vim-go.png new file mode 100644 index 0000000000000000000000000000000000000000..cb26e2c073ecba2bf5f97686dc3b8184868ab12f GIT binary patch literal 29252 zcmb??1y@{Mv}EJ%5D4zU-95Ow1`h-Y?(XjH?!iNFhu|LE-QBg3x!;?4|6qEpUNpU$ zW}kDn)Tyc)p{yu{f{2d@0)bFuq{UT1AP5oQi4G47ywgiutq=Twb`q6QhX)?s@TTFw z?+EtNI!+)E9LIl82vqs-UEs~n&Jxum`>J6>ciw?gkO5LXUW|^+3LnwoFHYd$C@H#uY z`6L9&|BuHeg}04=XsDzXHA5>c4g8pRL?UDHc)WDdY4i-dV;<^y(|x5O^KErXACv-! zljGGNDOE48YRE&-9)^X81zw^qD^Tpzg|AbsqGD!Y4ZV~vhgwA9rVf3l4yAHK?^Jgz zj4KoL)8Z*UL#|ezviKF^xA-){%Fds`xiX~;9HKPNNjz+f81yosLRHz!ic#J_#x8vY zD3vaXS&Yg(eH4G6<|A?Fv%9=-#c==o|K2_0C5s9ezv9SRS!e{>9A9TD1KCR_QRY6! z__S@VtPLMB3#h93>{ulK7Xkfd$7UZjnj8nj+`lXG*4D8J=&>&tJBn&X_UF;3w%lck z<0ypEx~dw_S7?t~^C_Ps=vDRFeDAYJT30u=W2yb|@eRn`rf;rkIzrKloIV+-2w(45 z6*=?0<*!&**Y4+R`Y!G`^SRl5Yb0M(D9zWq8a~Bim2Pf@V{vnVY)j` zRrobOjZ!Psc|SYqdsLF$jqj5E)IS{}@w2`UQ4nPHnx6lx*zXodZlV;M-AGyU$nQBc zqdt{@lDFf$G}2)tR8YqhR@>DeEs-K=l*a$UoA(de9)26KC_YWL-x@+KpK-%uQ1&~z z%^s7E0U5N^*S*T$d_6yP8_g!#eNTz@nDmKhHCSOyn+k`mixcS*5JU*kk%Ch>j3B`} zj|*7x7m52I8-JMJ5R9T*A~Te|2pqB&=)ema-jx@y#R5x6nMM)8XN&F6tBQ5(iRi+?W#x%p3FV^n) zEGIJ;e^~!d$FLDwn8D+)aG%oVBo}(D?Q1kemXP^-vu`+W!>K^wtl4f%o=^Sswmso$ z!_R@@uP)BSg&zLCUg3&$Kh#U)2?!>F*t$hdXGXM%BV$n*DJIKa7c?sx=P z`zIdq1SxDDXmUeDSDWz(+U!)XD^25i`q#{VgEh? z;c90-!aC_(e0kwR`b@Z^u<^W)2~cI-vkrPQA{k-Pfu1Q5|3@O}fDyiZ7FSeAU`*xd z&0;MFk4=+NParm0*l8B=Z9n0+i^BcgX$PuA`ha=?te_Ej`4{OOwn6lqR0VBO!~^u^ z=udDVv&TIvbK#AR2y!MwsiB^krxg~}m8Fecp{XzUnO5`;D^tX=&9ji$P(@PFIcoy@ ze+Yv5c9QVIahFsL`vw<3WEY}gu+LYd#lPcQCOIL*C_w8)k=VVxHbpk2QZM64X7Yz# z91>)LUOuy@`Ut8!tO&v0kV~0zOm=Kf{_FWI-Q37bgc^IUx7YwqYPMggB9lfXZS~zP zqklkcI$uunW)yW=VzC#JUj z%%mH$_(fM%{wI2HlXZeW?qUIum#CN9hdjD0&rn7&<>^O0d|?~+qc91wRDrHY+>M$r|zDB}bP z>?O31ZTw>Bxe>YcE7jIshx?;Dow_CvQP?|KS(;tX2O=w@`p);J*!%50C?bc0zB!6Y zufGr|m9iCgh7oc|JcDRKoeo9148;^iSbxgJs%SYzSL{kzSlJ#q#sKT&azaKZ zqK@bBB;Q6DF>j>M_!72I{rzt3$NIzlb5z`?)Qinrrn|{I6q2{*;d8qK0TC<_VRF0U z8)4}YADP`!j;W6K8l&Pn3qMi#$VXet<%S&zsERqcr;Sn#`uCZ#ED~?!j8@|hM~F?h z8%1H9G|tqy2zD7f_Rm4I`L`{Fv&JkLD$a+CpYB4FO4L6cw7>JGDmmScFdd2&?nr0w z1SKP|hs#c!+}c0igY9bSbQq~tc7}SUq5mnRx8AkUidN{#_mbJ9tvz1lAAn!ve3n@c zahZiS4xE>QC~tZdDmPwSloqG-9M6A1KBKdA?WQZ1nTt=VOHSy^YOgI51AEYqZsgj1 zEf#-}DLaaGUa;5WI(qY%&!;%?1vXSFkD=WO&w=%g z-(Eb02>E&O?WWJ*o)V{S59YcIlgishti)+04g>u<;xxo5F76-F^f0PKSC~V6kWh?BjrKqjN4&oE*8yivXKB z10`w8>1C7sZCdrIp%<4jx!qdBNwrpo&7=KS;Bw@568B&G$Nx^1^Ly=Y)#yiB`j++l zR1SA?p1NSa)f7{y*#Vv7aYhWo_oX=cfYgzxBk-=g-YfebcP3QWo@f}e{fagA<>uh^ z`6&&53sTuEg#V-wsm+b`;AD5P)7QP-FTSce`l@*Q|B@Q+i*UXnRzU#kCW&v}%WS9I zS&qQfKON3(Tq>)}NDak*9#QMIaN#@il&GjL`KM2pAPf_|g@0l;WibAW7uPLglOH$p z35C$giakWPd+(}EgF`dLjW})sPhzm)+1m5gBLdydM(_EcQHaB7xCllR451pC0Uthz zcYNC&#>*f(-f@BY_M(-`SuR>tR8L6}J)H5kII33IT;w7H4{{v%Zb&sF7Lx=0zelaO zY7V9(Qe57n5rSFe3H#~gfR9W^IEAS`!r4MQfk7W6Wp$T_IL z8v4AlFuHJh`u~11Jy`Qbqj174xEweQdVq-&(kq+h7ljuEGBYPxZY5cV$42vnKJu$< zj)-1Dc1Aq|6?@t5maQIE!&N?PAVtxnCx=^+dc*6Gn8j3Hca<%Y}?KJ)MR9&ZAw;<{)WsWcxwamY~Q;Ld~RjO#=;N@SFB>tJs@yCZr0x;+xN>HrwiGN3jv~6XibL4gqQ?P5 z4Raa^Y`%PhJzEBs7?FX~gd9g*oSuUgsN}TfbjNDuCN?&u1s!;#SbIb=874()PJb3~ zN%)FwqE4ZJehM*?VR9Ihp3LJ38L&O=(=|1tt~5Ov11%w5$esR+me%Ow#ErM@*l8t` z06vN&pqJxnsl92CuOccIJvCiaTvWDpF>Cy5OVPhL$xUGLC9xU90u4u5%`v*E)Kh}g zOgilSV6Uofo(cxe6}%$pCj}%lDX+;IJTxv`a46@1S@dx|k_8J4dKPQu)src?WHIaa zGj+Do2?-j$$Vcn#txU8!op0fa6Ox}ro+Yg0uu8yg=sDRAny78;(*z1fZ$|Go-oX6L zJnN7M?(bLAa7PcD_yoB#x)+^|5OG{2L@$_XcifqBi=_a1^WQtGbLn}^`boDcInipN zTnXn{6p?N(aVd_(7UTM-$bB7C|Z)Fp`f=k??=@qpWJ5&&A7b9x-b+ z5sQ~_0v{3SG{$q&V}3cku-4NbRr})*u6BAsTgmz$T?k1-*%Z0RjQQ9>?vwur;SqNf z_aVQh38*~D43jud{JEf$hv)$vf}7er7Ui=ro6GrhkyK7+v*UZdV56_7teGN(z0D6} z-`U|c35f43PL`^FE@#~=DwxbK7=XoK#`op{=g*+*~O;*;5{mB?v=k6ezb*zp={ zY<;EOz1b|)%v5ysq~-J*K?#f0F}N{!yf3>mMQ~G-%PzV9bwOqC*~Vwu0gW_1>jmea zkvYPYM9zGK#-;zB4@;qFw{Yp}}?3GeG26QCL)q$wY5^*VQyuu|8sO-mV-zU)D3XgCJPBZ%My zg47A&@zDzv^NADerNe9=+tygUJg&aZ57}A%vw%Db+XLeK5x>b27QDdJavLD+R@(1| z%NGP;;&12bt&M*|Bit4@S_H?VWA6_Hw+BiZI*FDnRQnS?fhT7DVgZ~j3)zu31;@K;ruO$8etq6V{*C`lNRq|y2&HG(E(EFs0C6V#3r^Nxz7yHFN6${)o?wI8FO)p+{-p<>zA@VH zD&V2cB(iRm9 zL_mhmpZHl)UJ~;1A{iMu#-ph|-rEPm!P%U>QH3)SCVl;PP-#=|_@0{+9>@)~R7PF1 z3ODHP@GWZpp5Mcx*K)O}vZERJl-`7n-yVB8B($ZGv|0<5&{UWL3F(Q zMglq8Ixb7JOKqt^RzmsPrdr0b#0fneIN=B!^jL+7 z>>VeVo{rZ=rkk!!owrJvKNWFM5fM;#W=fD+-LD1MX1z9(1hlI(2?(0bwt`X&e_O8B zC{C%_A(EQ+{@7#a!py-9`v@wrSd{E~S)7%gAK61N@wj@w#KJm%_t?)|;WO|#h1z(t z$4TX)_ZJ^t)Ck+&n8@pN{nHHg383~D3*R40JC()XV?%F-Nc)%jkBg1A^DMB^HUcd| z=ISZ2s&LlBlxNBQPja>0N6t-O*(g>Sb=+2HCG(Gwzsu0+-dNW9?j7k`n=d4l-P&>M z+p;PopST0p2)e}NSB4EP9t0byhP0o{40nF(>Tvjd>VDeRx4q45-!;`h@q0NH)~UC3 z8Y-Y8Yx&VPibLYrunUoou!TwoEj8?fk*0}SAEdYJ)dpYJDqLE z1EM_j2lDTYCMRY;?+X$_eicX&>jS)l4R58qQE2z99FnfVuKCOObo3$NJdfb52OI~x znSV?DVt($iE?G@(gx^Y_wQF@gx<5EQ*3+G~NDOQ7p-MZh{2KvGbU32JYe$M#vSPCv z^=PYs*jyt)f-Yhq-?94B37%|CbG5mvBYl4AHFE`1D>1PuTAlb~LP@*B=#yvXhfrz+ zf`gvxwCK0h6(0K|8pcKq!p+uz;Dp`l`NFx@-yHL|^J7Y68YzaaM_#5s?y~>=RfA5K zXUG&rN}3*i&E(J~wr6Yid(z`D&9 zDVt?=TA>7*$#0h-;!J#e0FFViT2dffn2)k5Ik>OOj-pC7_lpv zBtRZ;pVd@U@speem#Q?zb9S*6krRT@jM9964aroZ%q)SA3eCxaN79M(Al_co1Peam z*sEhPMD;Zr(u+$rxQ+aQ@?W*p8Cs*UKvkzbf#{XhvV>va7hg zGrA13pa><$wOut5cjj;)WH%POrFM=YY;F90yZDaXxLpry5=*%(ApjL0*X`$DSM+Di zqQLH#oyE>jw`Z~s99j`~y0-J;RD=x4KD*bqQ!5W}uN~HBj6tv3*Lk~7iF{8#cQt(< zR=?=CJ3`YZiMIA@AyJ53T4@#OIxDUZ_Tby&5VJ@N+AB3JD9jI+XI` zW#~sE6<`Q1BYA_t8j9&PZoUCxDS9`Jm^v%x^M&`P#Tt6fd4d=p>GaRr0NX60C6<)L z+;DgOk-+LP4o+r(k^U@l=C><1lLfzToHE z!&3}Bc=WV=h)X+vCudYE0xJVg$o3MLPJ}E~PDsQha_-*Ppv)SCZyJhaX1q0i3#q8(5Oeiwabxx>v8?b0&VdYv~GbH&a zm{!dE@7VeE<;%xnLfsen!?`yi=2|(R)ytztwqcVpkbPFm2SXXa?LedwFZBWkLI~|P zd(@B1#DNR0F=iPhg^TRnmHS>RgFH0nr4@8hbev!X?D>eSeRm~l zQA2P#A#xP2PyKIZbv(BT52kV<{F8UkW|=!?tZFKO4Td5!A{VI&`^)@t3UTpr1zy&r*ob?)PaOkK1L| zYk!hfyB&zkoIoPMinSjh&DNj!czrn9s4jOZRf~h9{llR*mAsqhG@ML>=uy`0%CSbW zga(E_J%?`Pi(I@-az8(d`I#PqYZJM6r|7A~Q6S7H-;)G8pxXO-PwjkqbT55GHC$}c zoB&**=P(^|w&vw8CKb2N`S$lTclBnOAWYCE30Mxua#7)H3$eGFG#;@`&SsoM{99gE z)aCVsx&NP63r?G0pC_96*My&A}?i!Ne7 zN%H=AMgkp7WKJHPA?K~^qOJMfx_}6uUf(8@4Ra}f`3O7e`veVvPmp31Cf4qQ;HEHz za}E}*hecGlVmvr>{7bN49*l0cxJ%1SA#?Zl zjJWD+w85CqBhi*vmR7b~SDsVm;b;-g=MpvdSP=Ac z*xqH7R!b4Ku1JYU83vsomlk5 zT32va1~rmhp%3Nr@zo=y_X*%VZ^EJd-Wm4oN#W%6=2;ln7Lxb9slI}k+U%J;J7clhxeFdt^L>8zn?;j-*cV8FkC4pYs};){ z=l@RmfhifQ^_>bA7C5hx3?gY&TVEpK+UN!9!* z7YD)OQ~|z0uTZ@iPV(CiQtIM4d~R8?@O`}XVugDu{i){{4v%K?cWL@;sXp(du&>|D z-8Pnk$%=vh{gI@i!pbMpa&<`#rfnU3)B2w3)nYMCC`sAx(6Ys2ShMQ*g6R4RgUcMZ z`7#}uJ2VC*j@3gJD>4X~F4m`C=P863R4(KTU0wl-b~HH}L;7&<)V+pkxu}qPb=|ns zlh5M|Ao6-pbG1*Cf?=Vfg(~8We+!Fc5%vrndO41XzS|=X>)opO@;aLJar)5FJEAVY zfxHmfBSuJO%HvNqUer6#8Dk6~X_W$09hJ{y7 z{~_eJq$x+Da#=64YA3A)l0$#Cq?OhvDfly2llj;X?hR`WiWZ~7U*X5bp z&-dqga~9(@i$ye1Plg_i|27@{C$#@gsAG!YG;8-F(ZYcwC=e2k*%xGJv$jxnDx}ld zv}gsiE$!>cFF~9mHm1dGm?VoSIY;}Wy~c>BRD7IS6RQIJYZoyQyF*uF;O<3pjBGaA zFvHiU_Wr>J^MOQn2DJtN;}X$ALflcKA>}6vdIl(#LHXyCK4L2hI~UuL5gK|oMl_x_ zyLuUDXb}6Hz}%qWwp7GFLmZ#;lb(zT())vCc-59WeA0%%$1wv)X4il7d>2guT!VUh zs<{pNNc=w7#}7b%MMe1(J*sv(nh*u%5{@wPX>xHyv<&~OR>SIOvjT^w5KvLeZ9J}=!`LIB1UFva$wN6e;Q1^$ZiOQ03i%^Jjgu0hyR zmiih89emhlSgek*j*QO->1D&!uKS`2uFE%Z<8eP}^}D&LykznCs~s3Po}8Lv`q=f# zWRSNq#j^pC!WOVGuou3-$vT_z48`I;p60f_zzP|*UuPd;lZ6WmrP3Rs z&*T!VuFSkKA-E;-QN_(0Ry`s?oS~KZ7<-(p>H~oCWvSqi1;_2*?9jNU;s1I8M5RTf zX?k>4Ght=hvc4nmOUugk0L7IFWM zICy2zjR12(ufTW?Ny7;-cLWlcU(&pQC^;JZOV}gDqja z{5|fX{1TVwwm1^EvZ+KNW8j2&!K+%>O(=r}<^d z=~w+~89q^p$U;3@WwQ>4)r)9tME-KAlV1eqO$tok1{b=Zirb&nmEwgwJ`psZ7q<@F z8YW-th&@l;FkR6DSDe*jNfmrV!>uyN7RiK_wJLjmd;p>LkEsxdc06=2w>&7^bYk z%DVM!{aeDwp(1g+6g+Br_jP}?k?6nYu2^g+dLUsqJAv!Wye7$W?2Qc4^Upi-9M(#4jqyZei(09-7r(c`;!b2Sfs z4D9>U6_lRKa-uKFwbP*K?V~vf8Rzn2Na1AhnJJZhg=bc?bRJh2lvJ$4(-CX!13x+{ zA>RtC){11(m9``tkcd2y&aMZ7b~Y!g7ZJVxW<{k{W9h9DCd|yIARZM~fy1ls)7z^1 z_VK1eZ}K&bAiS}xBYAhnhnK)d*(L_jelPNJP<}_DK8T{QbETG+Cb+mR$>S2J&6P`$ zC6Axjb+)^MI2RGsd~oj=cqObx$gYPfmDBfvW|qGwc*qxu-efc+WIYt^7%X2onmWO3 zAS-U`?LZ-M@MBo^^z!TRw4t)rW)E-;2jUo^>(XR*6Vd;yCqUXXa6PgLX}6eklV-&K50eypTKmEsZXmA zi=yE?L(sm`>V$waH;lcC6r=YYZ7Z{fi%E2#PU%)e=J$*rapo#g75%9qo**{*VHmmuj zy7G+stT4^3YHl7CRY@N)ibzE%^+d2N+#OEA(SKLxqpN#n_dWt{G_#h=%{pkc(RY6p zEV!KZAB2Ty2jN$AsKIHvxH9`Mv*S8boBLdveB@c(aCtodtl01#va=+!=@l$rDFP8Km>8wP!|2A|)SZ~Y0D-`pT z%La~=+NOBQ8XgeDnE1oe-aG$ZcJ!=+QC$VtHNycgG>$#S6ZcSYPmg`emVMr z8FZbMtEQI~F$N+-RW)LOV^myhL_};xSZjl|?vnB81;{c0o}6Z_DHWJ3z*?X)j%g1& z9=vxdV|445&(g*Ih7*{|jJM6~0{U)gS0S{V7^7$zI^HJz4mw77*>mR5cU(JngufLWgLWH*2WP5A;x@;gO>#h4_bd zeGnnqh)?3hsY{&P-+rpk%cwZe;xgx6I%K`(lo>wZ{=i8wHDHM=c7Uq9bN@bN*5&!E zbf)wC31BT$wKT<@6sQ#DzmzlbN*=!x{l{@IOx*YXh?O{|hS3fS>#{m8lh0*I4R)Uj zRk{z^6nJN#`hg?8SDB^N{l;x~SB?@8hEV84{JUpY2BW7Db8Yrj#r{72N zS5m73Ncn)?*L{-O7jGu}*(QDK<3yP!4xz~t9d!Ox>SKfQ=5-TH%) zm|AnUj(9-tuRGoAsSGYOH<#R-60$Ptj?{IZ-=gNLn3)e|&Hco-n>OgTaugLD$oMxe zeaSTJSQ1ja$iQgC#`}kc_mwtoGc!N8r-eH~{vtvh7qd9IwV&nzOH&_o=bn?j2V$oO z{Ka3(%hva>4GVHWgvSt7*3cir@_QKlHF!xwTe)@Hm<1Ycy}A)v2ekFE3nk5~?y$@K zHz~iKk-q^{=`?F?O+($YOE76BEEygbC0gF8bf?FMh6koUID34H7?@^0LlO> z1P(uu-N_b`917@Am}X=NIiHQ%D0t{n0jB|gnSpa1bOb`3sd=%-8kgUWo05PWaNT>S z9mZP@nuyD27!**>UamN~I$juX!XCfdSc;Y{lFbL8sA$Z~$PdzpnoQ>CY1(mYJ1_Ax zxxsNZx{Oa`3FZ63j*d=s?S!Olf__&-dQQJ68QxkqKC%B3=-D1H2YrbABQQ?WZ)62!eNo$$`#B8B{i(bg zk~IF&=6%nmc4*Inc#DOc%E_7~+=@Zr9+2K1WdAA@%oZGZ`bJ~t#P&}o@id*&uYA*8 zZm_|P!X0rMBJasNUB?1cpASVbv)9#Y;5AEpL1W ziW6ikJ^jBLFsxVopesB5ZrhPcmGV0(QVRuj5hBCM*l5qIteice0x+html`8bbY0oL zxZz`L8^8H>zio@l@IJntk!5D-f(%w#PO1&v8~SVkV-{XQHg5%HG6{JJF#X7R=q7<` z^+XLj?g3O*2BC;TeF95s>+e9JFm&3ZdJ31%9U$a-UtC&mbPKc0$9W#7Dz_lc%++YoAI1zw%ynZqxoKrw3Vl2-y|PKwCsspo zB#$!FX25X8_>T`A$>7z3awzRF+L1zKNOJUxuZY~RIGK&-=io}n566>zuqmo2O)bRw zF`mTTO>Qn#nhnbw+cQHcnnWczGlLPuibnLV!WS^*0*2gJtV(}rC=?m;B7J?a%sG; z+Uy7_PjX!2B7EN*%DcV|%PlNv#Gxd~Jo~CurE^=MRLOyoSEdLBqTQ4A2Ye`iBdT-8 z+;10EYN|c`I;s}Z=sdJ~?W1xiRB!s?;#W=iZWo-dlA04zD2Uz3t_w~d&8aT6t%k}@ zOi;bM*o4QXzG0`q<<9aYuCSyzi+y2nwB7m}`^K}qiLA~c`YUKk`*hS@r?dB!Z2Ev z^qbf9}26x4{DXoCxFQ4#Wl1crx}+2 zE^3{ZwAQ3k-SKC~$M+d5>72P+3WsrVwz5Y9N+C+> z+=dYkbrNBDD>24;F$C`ytF&%=Q%t*&z|FLFT=hSF^pK#M-G4RHTfHtX~Z<##emcWyLI z5RC^3%Vq3)Gwi$2^@?pXfs!sSdC`8V$<%I9ki~dM_(gWK#O)<-UU7vMo0`OiuFpTI)jnq&OlE}fkD1jl@@STNqC2bfFt zo?`F+gAFk$P?4K!CDPYDFY|W3bKsH8ZL{AYOEpd1%y`MEXl_SYlYPbdgR}`{bp9ctt+%%$wvgZ zTp;@>054zh&Xs|B8I*=B*V$y*gqexy3H;qlfRDV5E8NHP5z;&OSQ2Rb9ko7b!75lU z^P%X0;r-Z>Q?22}+2zoo5=Mx~UrFNwb7kv%E2JGBL+9yz)%99FhW$7Eae;wmEDLyD zr2@vQJ|m?&A1?xZ0kEMi<{#xM=P0`R-0{J6xs#Mv1c!uPb*|cdU*7Q$O#OQYfK@e&If*AqB|JdmFt zqhlymI&W&y(P{S~A@ObvIeDQDB>z6#xxGpm?QECQg=(GpNxdwna6N1J&)>#PUBo)~ z*-`GdF6ux(K@EIclY>O7Je=Wn$iBjsJ*hZPs`Z2oi@!$rujG>YIv50oU?k3g5K#1} z?BNA}S8sAe?v&FKZqwz;5Xr|48e$wSRL#?1EBB^Ye|Up$qe*kqHcwwrqN-|ccNUc4 zYuwAt&g5<+dbB)2@2>_*wxrz%cob?58uS3UtCOs6JeuD|3JNhFhy(-rwtKJ%M~{}} zKDTeN-Pu01-%0kSGA~`77=qC4w?j4Pg&y6@f&hlicyxSVj2SoZ5ugko$pR?^^R85B z5Fx($+^Twtx$rH2Jbx@b9`olQL3_-WUES}eu>;gZ^WC)J=%~`oc+`jS#LGm^&>u5~ zt-wkS@`WAxC`;jc?up!caD$t@HvJ`MZz~^3gKqObJ$ZRG3zRk`Hh>W$}ZxDu6tI_p7NZ%~1 zA=PT1U}bor#?FxMzV*tD*vR)01 zmNvT!97Bkb5t%0VM-XjL%XcWiC|q1f=ZkSLLy!r_6P?j&`g{oai83}rdSkKcFhyvc z6Im$fV1@3%?}aI3b-@*tAP90|d@^V7FK_F3HrI5u#FCPxX1!~l=6`*xD=3UVj$r(& zytX4}(SgC7iNBK}kkeJw6M_cyZ#lRbc|-%}%^Nf4oZNn=uAy~W_JeK zZ^AjRwL-?HtA21IDk*FCd0llQm9WSlp!Wl)u_{@W>6bueoHHM~!7%Eq+Qe2bI^pNO zXe&GO(S2@5?;%fA-)Azwc&78btX1`TMn4WgJs3UuU3Ai7Fz)ln@R@TV`Csswugq{Hid$y}|5)wNW9v2zXIM%4lBr|Hm8m-OB2m zJdn{vV=g&u*O_lR$K*$6d3glx$2%H1=B$ddCvfLQttrH1ER)!?WT-fT2mn!eMThUD z0l#u#V?k)o>_MbJNb-!$Hp?MWq#^)B@Vs>CCm)#OTgC~Ss@!9(Y@hg+b##KE;f(7V zjNO*%8XD`&rwkZSQ$jYMC-U94TY_exm2KBrM6;mgt^}zoeUj!alp#tE#32H91)2S~ z@KK*%pm>2>j*K|qS|8w7tAYp097p2v3SPHdE3#4PY+QqB5#{sakd1DRU;szcSLNVC z69I7G#0u|8BdDvoVM7XF?hXJ@XX|sZv;Pb~xR8=V>e1mgN?g&2t+04RylAf(mz>x# zUe{k5C&bC|39^9Z$oWl4_`vckRT1s?Mw;s#KzmI=1sl}{*TsC1>sTlg9)|+xJM^xI zLjuw=lz>xjODVsr+FEp!xct8c{-H@5l|%F;XKE8hG220%)lTpNrUJmuO+jIkJwj;X zpH7Yn?Z`A3Up%Ha0==lYfj>FN>Z2mTA~ z!G9NHADl$a0p+iuy=S}%@v(-`R0tgm%B-#}kwE4(dayZ=F7y%v0G>;LHiV?(z0y48SVB%=N@ z9`9R-u=N}y2U_hogn*QufD&Nl@ge!G4&0j4_hFBaKhdts!HIVD+G8t7GOZT z%KPgu7pUCREvody*|UT^C)Dm3J^ICux1Uwpin?+pLt`)JtA@Y9 zGpX-DMcbFkzJJ~6z$p^d4G%K$xL4O%j9=o)i}rUgU>D=dVR3%AvqA=0IjIeebmhu(*cGn7((yeqc?I3QWp-iBf4xeTwRE{R zt5v6~sjSw*B_NFcBlEi8cO`C~iym{&FMo3QX$cnYJK0iLL+M{N;J^Gq67XL|>@6;F zei*{xE+uAE{pYCq3@&pdn?Ep7^&!BE zPmKdEdN#s`&N-*(?V9Ek6S1)BYuGItr7Oj;c(!Y6OW=VnfSlhRpY_NPU37(x=*jml zc$->ZR2C@_gFnU=_h-@Ph!}Lnj6SBsXP0Iv#VU!DVs5L20j#fpmlyTo4H>Jd0w%1% z#DU8sP4lcGh0B~C)w+RKx31iVr#MH`91GR5ucm3bv}s5AyrG=&{Bh~`F9q!!n}%|x zuU2Y4dXZYP_K>bP*_f8!F}Q8t#+xPYqd&p2M`J|p|1bsjXX(T6GqJKC>wRCy()u-8 zv)F+2J*XxT)(Z!YQMX->xEP5-9#^JCDAit{gRD&&(uE9~CLleTR5WKgJ%x0<%?Q%@ zD_(E}XrR52rX*6rC{xXBR&u@ zfBdsd>^I>|fI{QH1M30WbM3j*2cat9qddjc^*LlQd&x^959Y-ZP*MBx`>L|Zz9D{l|I-G;;r>OK7bBYz~| zulfGq@+OL8$sS@=gJ4UXSfM>JBoKHg^#|u7?S0^rA0GI`RqhyKKbhB`hSZmXqh4{A znXtoWeR0a(6x#@$>ZhjFoNmS!{{X(D%+8$4fO<(-Q4AWfHysnfRo<^+K!v6&?teU`pYgk?z{ybP9oIY8&+gR)}QjYcOkU zYuzFX`-v*@X#A7Fy=-mo)_S(^TUY%G&l_P`S1@0#)rXez^JDU_`;nSic<#aL90#TA zy^GafO|I?ti<>^CB0wDvQ3b1+QEv5_jUia|l3Ypr1n+__m_B2UtpmynMR35BO37st zw=07uGI~8za0vo;60Q#~Uk*ghhJWF#%e{7frCZT9`{2Oj57T9ARPJ-0(`@vcJ!N|c zKu>29V86Fi&p57sha>Za>`fk)(Bs-s6jhi$ilMeyT|)<)JbU>thu9(-8g$-9s@(un z!E?1XCl{Q&c{?)POtJUFA9WetiF&d4)jxTQ6;B=_^9qG^W?wp(E`IbgS{^wXc(Cxj z0MLC8H=QuW#l}{j$bWTGEZC7YBNE-3q}6k5XW_*J;K`fWX!AqYEpTHl85L9gUAYfd zMt%B!e|hlruCUJKi_wkeCZDGs^if2xzjKY;8>>tJ#q{z03h_3XJfIEq-kT%j=a~7# zv9i4f0@^wrhTsnZ)j^NO+1~McgpiQB#d^wZGiT8_bjYBQGXpS3hpfqu&#L+{4O}Eig(}qf{^VH7Q&o-PTrzXb2dEW?GQz1zG=XMXsISr=|mw-d~9U9 zEdbPOaY9D{+4_T~3KXP?WomJ=mV6kJ9M!pCDD@`@BGOQE*z|(nO%(Tf_W1q?rH`Uz znW&@tA?@{HAYzZ?@$^hZKVEf4T_a%U=*8%ls`mv&(n|~wdW?Cg5V`urmAf$HqClPj z@)IqF=yqYSZY%pOt0;T9f2`j(iimrIvcP~cNG8|Sm7*Vob%)_1VSD)UCugrXXcQmY3{*VhDFjp{f4G z+i${rSO>oH5^8!_wkn7f zU}U^@zm|E;59xeZLte&?r|kS~E1=JEcfhTt?9an5xiicnr5tR?gpBB6d02^mW;S~v zfmHFV|LX<#U^-mq6n2secrIO#MU-1ttNv4S2MtPP$*K(X&kyHsx^$M?H4yc}f6F*5 z-C!twL4)0WMp!#ocL@WoiqDA>9*I!<&?&NHHC=XcqLxrwQlEqssQ`3>gRN4=leBpF zXOAnMnV%-}gG02HD^rYV-OEuMY`dyVG7A z(?CryD<~k*n+j|(3KUH^;I1h8|8he5eq^#x63RG!S?5JGnKnUp#!s$;w|eOGPBN+K z3c|bLz1e!>kp!NDOtR$RbpYE`Qhr>Lm@Y8X?1AVlTGiF^;qyyX`5i9CZ| z*IPlx;9l-$i}lMMBa!F{kPiu4+UL9QY~;NNM4IyAiW>i+56-MCCXa*&irV}JM`oCT zQ(l9nfLD{eS<`YVPU;-q<@y$z7v^+MwzzBz6Nslba9m;{OH8>*D%wjYAXhhcCw?mb zKb2ioTO3`p9h|`(26uONcY+2DERxry# z@J);p{?1SIY`iePWU&*Bwc-=ziioGuaQnyH+wS2L5_lOBj?|@I#io|*tryI9>^{wX zq(&=cTGa(4WkM57$#3~zXA{$%TO^^j-&IvCwAb}OiYFMcuMFniD7Zxt(qVz_?Y4Zu zmp@RnjfO{vKYEj6)*JNlB!PJjt1*3mA`9J&1U#Sais~D+YN%9egz?S^TJx|n^y2ki zCpmFaeus#a+Y2ywiH8rbuRP9cY`ot}q9LG4mriQ|liUz<<2KSYSE7QgjMj`|hZA2D zd~o4A5&pV9-XeNfjttfMW|f#y$-2NzXD1n3v&Apc8#~*7`@$FSo_1@V%b~57N=2A8m_JBiE97T++izq}*yvS@AtOuPG-m-nF zAy%*BrR45we8ThGr@M~cSFKomRpDw^(;i<|B(7l9wH+^ElU;siE_sZ0)<6V#)kW+K z2u9f;_K=~z;D?{=?-q{AziL0$JveH()|m$vw}%t^)fku{4<-L)MaNLQrIME?kmny` z%zK*bx+~nE$pnToX68*~oOW9_bgJ5)N$oRE1n&h+`gMr8TzqeH@jr=V0sk?0Int|Y zy-n+)7X9)U0PxGm8YH`Wr;mDuDu~%AVdC$GZw*JYGC$bCAN`w*1RBkCS6ntQ|>)~U92s{r60Tnv`(H82CgPk{kt76X7W|Q)h(MM?aMPs}7L^33 zbMeW*-Z1ouQTWs!Y5IbfA7S`dgKY(Z^Id zszu?rLU+%dj`4He}aKGeqW6ryulj=gd_P=S9Al*&6!t?7B9}( z*a*%-uMj4>;3d3qeFItjL-WDU4%%1Q1B^WsfBSZlm?0NY;RF3}>?j-i#k*!ZZ^aM; z*UjFo{0TG<-G^1~RD7;uTtH0HWaRi^qqPbXHxJqTb1-GBid#v%Ojj$S(~@nPIaqgY zPliI>K;PsJhLpk~yygGbev$I;C>bvnX=)o@i}{@>H@N`PPHYO2inz4>9hcGHxMd1K^a6xU3AaMO)iDR zFf0GkAO*gptqnFT!bcdEVw>6MiDa$6fsGZAp0gJm`#K3&cX}HHHV{O-)MLySla)c6j<=vPv#zU zmg_5JDA|tH)Ahgyzg{h&bvLHY(EPN&AKLWDF%kIuVeT_}T5Q#$GeV5KIU&EKIA;({ z0iDX<8)V!15bdn%l+jm>0keCZEvxex9zN+Hk~cBa3ro~2xMzw>DZiiF08WEZg};eo zaqj8Ke^AWyTiN_BtJx=rJ_XorQ4Qk3kP3FZ*G1+;F>q5uK?+Gr_^Crfr7b*k$bZ}d z02Crmaa|*>at&Q~EVk)Uj+6M zEpww35z25vU@)}T<{&!d55~sQH8swBP6Uo7Ql2P=V{!R6U()A?Nfc3Vuxri&Hb6+_ zX^nft4)@l0VpwdhPDa#qUenL^8E#R-l#fEDVNoC$$-0P4V!tvji<=_qp>>J1Ds?25 z8$DQ^#4=nx(lC>ORaubDmRuzdYb}rZAfYITfE7U2$uwsqq&r z2UQ%6Cwvw$TJ-ftl;D}LqAK|B;ceVdQ<`s;UAMI|9OL4( z9T0KQMh*Tr`ZZ|cB^MxNVb&~g;6qZ5v#(8+I#6J!;(CTuS?AFhD8noxg%Ukw5#wx` zn^?kywUO7L!_;|cCoGZi9w)4W&7U~Ok~@^Bdk(ob*l=d4k1f<$XD(cixWpY!`1})& z>ffnp{ngY{!c^TVnWhLq9-X^Dn)~kS{@KJRg@7Ox7R6M@$=-}L_VRB>L^4c^ykLn> z-o$vy5U;|PPRcDlzs2%a;j2%=QWEs!MsZ&)llM`~1kV>1e;(6jhrK1gUe-^HYaicS zh#K(8ffK)kJc{@q6&JyN4OHgxKQoJVr8JJ{){sBEd@t)awn)7@4-#>lJbwtGfc{+< zg1)c#5hhm#Vm$XAdy-O-9@tnfiaBaWqHE~b8zk()a!L>bLaOUGW?{S8M% zvnVmomgfvgu9gm7Fum)Sk`!uHP-;NR%l)Gl-ahY({NjHne>z^ske1$ z^#{k2R81{oGa{b#haNee$AJWg>C(55EWAmu7$UzXtLh{#1kXPN=L`G+II0e&b4c3y z7aI2S5e_^p37DUgKn4u%fQWiXy`vmGATu^w|77shi!tsWM2Wdvf5R%AT73pH&DEVT zi3!j!d1WV2a^y?W;$ApIK?R|lL&W>Z5EC9Ng)!jCVgOz|QmoZBu{rLZ8*al?xKWNd zZpSfET0WNH272mLB(j41sI88=1gWgLHG9KA$K4YJiNeTahQi<2i_3PSEh!dB6)eRU z(~VN?!6%VWtRlQlb2;;Se1A&KP0_{+F@$%(0R7 z<-Pm`xH@MR7sk`O3%^-;?( z>aJF=Qi}}1U-h}HTK~t)6H*Im}1 z_)8^i&o7)o+>H}9jw#sPcow$^H{&6Xd)!VfozF}9r;jr-EJ}YAu4JGVl0q#P5nkV8 zt120DQz#oQI-9&Rv3lj@p2;5M+i5fb4DaRo_M@8W6xy4`inxmDtw}P#$8jvY%pM;m z_7fIv?_4IvYFZB_E#*ALHXDm09MxsFd+Bsb91hzpZKr0Yo^YaP1`s-AFegs0qJ&by zeo_8&nca%18H+V4!8+46)`z2}2!4!AIWBF|3xe4-hKwL64QU#6MKzh^M0=awbBD2r zAzq@Dl)0F89QJ;7?vVhCK_~&r02Lr~B3nqqFuFVUOogzw{!&kiev43}*H}w+!RrFs z9RcDkjC_|8K+U$j**Zb0>F#MXUBES6P+kC|v3i;(g=&t~LFAA@1%J(Q`(Ga0E1y~#5$Qc-D%RvrXksGs2I;Kp4ND42 ze(BrKjk~78oL>T7tB$pR4b0sPaFMF%AtW8(z zv!FY=Q6w&i*tKE#2^83SIQ*~4%j0xHCN_BEB11FWy~mlPha~Vj3?Uy7gND=>0dD~= z2J(7`9t>o*?l0pJk3NOseeAH^OExa(u=|CmUYHRsWU)-sjcvEEMl>W@ueE&PVS za-8M@NFk^BhKy8Z7ga`BR2|Ix3X+}uKR6L5tUg?Z35Q_pC%WY)&0|{-*6xIA< zmL5dnYKT#PMJFvi*0k!0^Po$cJBS-f#dOsa zem_xc%WdGv4zsR5U*qV{pIydwV4ZJLegxCfg4MQwrRr15h(U}8&L{roJbiTwCpC+S zBEsF+Q-gTNIPFZ03cH)=u^sj1NuQ7gj$4mDd{KGt1;eCcY_IeQM9&8l|Birr04x}! zg^@U;LaBn`mwu)SM6xb+c&n~Mn*0w|O$D@VMQN*Uamuz541-phA%lo!?YDd<(%&!| zb7egvi42&YSNFlqy-9q$!;>&mrmTgn`+}F4iL8_X6V`Ir{qfZ%RX+K<3w;yR70V-B zzqZTwg_&2GX$xeVqkBHj`4O_o`Z;i?MWky)K?JPE#!an$s3;l5aad`lh?hvzPe3S3 z>||f57p$e@ln%6;eO}c3Rux2EWWV?nt|_rD>oJBHwtlksCEKezWz%1p6TwBTz&SMF z;;(QL1uw?kM5n|-2v37~+|J~OMm|uHHUYX{dT{GWr{&f*98KQB@|U;)ib@NtpbKAq zor}$c(a%$(p&|@(GoofdcFqAffL+QdC=eeR_KU*7HdY6eDD~{WM#KBT3d+9f*W)7-d>HQ#v*``skO9sKSuK`&c})4d9P0T{ zE3@6!TY_L7f9G##lzP7F;eHB3-^`%LpSSIyr@b3+r2$#|%ywHm;+KUYMns0^h_4^{ zBJZ*>M&brGpgSM-Eq-aDBE#IrUGaKVvTgfR7J7GFFOAfI<$40gWq^!jR6A4U%^8!v zx1%!m7jJ|8;6bB=3aq~1aa4Vibi1+MNRfJUj@3$`U5OTCei=Yan6Fcsh5QDw?91&f zUq6`YLuxWWw%;&AR6^7rxVaWOf(mTt*P|$mr#|SS52hB$|4^GI$l3{weIDGNI*O3ige_NqbfQ#%eU+sj)LR1=h@ggi5#Z@&PO^Qy{ z2nY*%dP^qbZ8q&3_Whq9I4^*rY*)#&x;t#bL(6lQpSIvBoK(Abe;*3~$b*fu zj2ha zXDZ(D;-k}O9QjZCn428?7TC}p`d$>kcg4QE*hlGs>I|WwG>}c%HeP$M6PcomVuCjNw zpvofq4`Drl2p`wQ8}a2*xX5}_3=w@vne8m2P3@KD6IHV%7dt*zii}QjIp^F29OE9; z{I#->ks)k&^9v^Vp#pAqlkew20)80umhQ}8mnN}hG!Zfv%Wy5vbYOUI0Cxo4`O7t6a# zO=D*kGeIyvYcXM7YQ$+v%gMSSC>(^sdwqqc_01fgMf#;Xq8_@wi?c*7_F7ec;x%{} z(sI8^H2*J_e_5I?)kZY)bgE zUqp$PN@Sr1Pcd%y0X1jm$N~-br_K;1-T{jy;~w43QV_Cf+s5g7$p-E;NKm9Z^^3u& zih@==<&P*}xxU1x9NY*Sz1W2xBprtHR9o#NRr@VR@CfE*IHE&+1+U@TgJY0l&=pBD zE+v9QhPe((k4=u-6KbvY(Z7^YE9>UC6YMv6V9ZdjedP*lM=dtV_ed*2SkN&5jRm`z z%A%C7WGf86^_!lAblJs2FHUwiWb;fcF*QBUEUe0pF>dS4(0_X$W^j*=Po}tq^ z7V0cpF2hpJ0G;k2=QsOrKT1PuW^nS5uAm(O8@9o>oG(beq>E?e5bc<#rDJXi2xIc^ULzFY4bdTYHoLSB*}qbTXfQyzp2-io%3 zTQEY1F#~X|&A#K5q&7d|*&>xdH7AVxlwIUu$nr{O!7197=n>JC+b*YxPIN2Y9^m?B zzYHHkPJ7rzwNF7LB<2{SpcF$nW6hpoA#Rz^;`JFN2n#Y7H1|@ zEAu!Z7q2}}j@<)8Mcf7SGQR<6Pim(To*(WvJk)<8IgOo4PqAww7*fPkBoFY^2gz)M zNdeUjqA_chT-b2O%35&PVC1ddHVXtR%BwC20NwKc5RX{v#cN-E6ZHPZ2TMGM*?()B zPyKaQZ&YBj{L=NYQkmG(+m$wv_>PVA)|2l%-w)vZ8{)H6hxm29>OGNY0Mw?_%-5y5MK}#qmh|6IuV6uI z0FhxN>A9G}2?}q1{!UF>X#QgIU@~3sAbNq{OFA{h^rpLs@ZyTVig>qGsnu^KFs->B zV+Brg0yqJTi<1w+UM~4jEJSngg+aYU08&KNeZE*#AnHkfqtb}5n9^Wa|Bn5{8n zNTPaq!{wgv1XA=Q&W?0vvrP{vtcIuK&xVc#L?B_Eps2RvE-}c!c7)E3AIyq-&g+qN zfV9vtWrE^jL23*?K6DP`QDOk9cSy{-rjNZ8XR89j&6P zf$Y?B!oIb{_%1-VkXX?@*j!@j#E$l55R!hr^SQD~QpjOa=5!g&iUwk&t3PO}Oe0nj zK7k6xHckVaNXLE2v8I@d`|%cO(?ihaE{EpRX1heWbSnEVEBfRyk`9(n?j*gFoU*UL zi-CmnKtaL!P)rDg6`2rXWA0>U9N(*X15xS!(JA3Egwhi~PF{z5*5ADAjuNWh3%Hab?P-WcR%#faHG-ZSst9SOrmQJD5PGpE zdfuO1p&1D&kf)jDpv!G}blMTdq)d%$&TQQzVWSMO$T`GmYfPTWZ{BPMd@|>0EMtc~ z$nued-MMpabR%vCs2&2X0>r=t%X<&sX4Ok);#apwcN}yv{F<_nTyV$xdwYunK!6#S_Eh4r538+#<5 zuekZ-SU8r`h_;alQsFmi@DbVS$ra`@0DxcgUyXpU0e81RDjRrxbI@} zM$oKfyL!eKN8zAcem{%3$Xpa%noNP=;=z|re#)GrHUMf7u+BFWRUY}@u0>=gpBJC- zF@Ni-kAKL}Z`Q95>tT_)xct71c#Vk14QB23qZ-+LV_C|+T{l+Kxj?bTO_0$~%v2*0w}Vb?1g zw!gE(U^JTnX{&E!8_-s~h{Ux9%VkU>PbQr38>*fM`My|QQ!+YeFqMAHQ)~4&oXsu% zd8htRXh7&pP$DjpQ?q)LH0=!F$9|sJUB}RH6g(Xh&*n?#1yfG#WCVr9BIvqROdfmV zVSk?FIjL;z6wbXKdxmdnEw-PBbiV9HroGqp!jZ(4XFKcMqbd~HnvYxXyqtCmzM8+P zYU%352qJJ>YVoe&Sqyn1e#PN>`Fm)S)xCx3{*gn>fwWB>3q*((018l_k^WY8z_X#J z&BGUp5*yku#8;Z_IE}L)%6KG!GVz-AECBbQVP;5CLVl6)54iH2$bCn{@4S1g`uu0b z!JXp8F5&``9)EGdSnDQ>=Jhq2z##9}{>q2oK%0oN5`=`rzQt(TR)8$a6V^@yq7{$z zqAbv4=klOuNT#Kb>P3k=*JmdP`QJXkO105yZ>=YqNlI0ql$VYYEm90#j~YUpQ$_7w z--!+UEVwG<;Gvj8|7v@Mbzw*tc7;7)y>nk7ON_%Qw!lIPaiQ#?_9j>t7BbhtNdI3uZ_z&TM~4S@hJW3NW~qz zw(GMBXB{BhMbm3Uh@u5yA)#B3Vev+Sk+B@?dIaQ)q6pAL7lBMT5Mh9s5aHa8JuXLG zK&YQ6u%@EAI&LNPsqWKw2D$>>R~^zUZ6=G$!LA|Z8Q+F&Xii4JZa zK7u~NaM#bldy(PXdq}_1brk`aAqyOkN&W+qYm5Hd8NaasXrU8 zyitF3n|~!Dz5uQ3bxm*nxe8=HGQPh1IMxrX^S6PaEgo*;fBr}G@8wz;3nal-=IUXI zn;ef~@EA6jooW$TRYM0&QfgedWQOH(V-0J<6_iUNVr?{5iB&^gIMqG-ugqP)b5Onwtd4-4O9wqu|y*kY^QR0->g7%w+ZIcEc{y=xw~Z?!4fkC0ls7=xZb7 zJ3K0|R-;(0^zcDth(d3f3n3n2vEGQ$ZgPJbpEqbGM!oSN{TgCXmXb|f70BRo&X@dC z;XCp`nGuGSb2wOzh0H%aXOm?6J@L}o{Dnc@McNcusE)#8o5_KXI zx(_z|x{?GAn_Zm~iJiUvpBT`T{K_%tbB1Fkm=uFEAV2&S(MPQ9`i97YE?jamA_Z^G z0KW+&36%}9++Ii|q#yC9g9Z*q`g}RSQf@|CXKv@x{azEhf`a;PPK5h4GYC?b$@5rj ztgLux2NW1JOQ{_WFvApRFetQfjKIhSu4|gnBoHDG8m3 zMaYmYp=K_{Su6ACDbf&WMNudl zr(+1Ea5=XVnq2;eNG`tII5-#wqjupS5olJ|yGj~2P`61I^7)7leRsc+Hk~6~89DF` zA7h{3C-aZY^HA<$_U|J6F3qJ@q2@;j^&{}Lf6HDplZ2l+IRaJtla`U^GaN!3)cnbA zcf}tzY0_%dpXcO9M44hmltSMg4GJW=N5~hnrx@H* zPSn7&gxv6<;LOH{r607R5?}Yl-@$g@=+?4b6MSjEn@7d2c`)fEk$h0L&l!lMw|^Ap z&%;0#a(gwV5JSfih8m+;h-i@B^iWylaiu*qP?)!~Oo0Pv#1WwTbncSOR7F*}BCdq|lAbB@y0Ued}#`D{>LPZ&do@+ZjiJ z=f7g`KC|RV%&6MWcS^ap@pU&JLjvS7-h4#Hc^970ouVPuwt{jp&v6(gaLBbl2=)SQ zy(8CQ%OLe?;5yKO1FQz>-!VGah4anV>FwK%MK0T->3X@y)ZV@U-%f#Mw)``Pu@#)&KY3HJK=}>&F}$qVnX3H#2p|vOu+(SSVB|*h;K`aXHcA7* zx`q-upkYD9yA5RM=Wwh^VUN$p=v(JPM@qkv*xIPp9sD$mTdXNQuU)V*<{*hjHjOkd zc?%iO=orN0|0jjFjEliYpW_N{z_2kPg9}yUxkldS_6_iwjKpcf4gsN{FjuBC3us-PeSqsWeV-4KsVwx;X^Hh(AiTVrdC&PA9aW!Cy@hZ3l>hv>Z_*|99WpLpBmTIr zPs>F^?#$?y(Ru69tB*B3ce>f?OIfv5QaGRD+`@npm>l4UxR_9lX=QEwNr!G(&tK^< z4^5bSEv6VdUrlt9Un)$$BS^}`@Sv~@|K|Cnm(sUd37`XY+TMM`$OW= zv>PzbU?@n(+3Nsw@JqUNa?w4oEe5q=8OjB5pX#2P(3?fJq1Hm?Pt#dPlqUeiGN$w) zg5#|i)A4+j!$?p)m21i9Ci+-^>h-&n{-CxJ9F><=D5v4L>;XHEB7C=sAn zRwjABJ&=IiEI~uchlSxt;+yuz_ewW>pSw?$hj`ve7`7ww1X9dIV!&^S=)VDcm{sU= zN!F|I5hWXtkiI0l{?VhLqCSx_Ljk-oAU7Hcag{=k7iWwYFW$B;o>EkwjH5WAM-3M` zn~x}6VWR)_d-Ko8+9iYJh<}l+#KWbo(#QB(&2C1IWZJOD`low5ke_o>qIgarLXU!FBm-4iQImNJo(|E{$P1{8oD84->C5S9t> z`j=|0W*O5G6Ol&wcIGkF1e%et*{I2%uZ6#kwuzk3)tXvGMcn@(Rh|={LnxWVrAv_6%6L-J}f8=a82ujkfbv?+LiNu~OC5#c!c`49F2G(jao} z{FfoRl-mmm;Nj6g)!JiP-~8iM`&zTCAR{W>4~q9(070H@*T-vL{W>RkYK`MsM}k0^ z-npmz-CV;D^Oe;yh!j~#$xP0P&B(oGKO|d!(#Go&p($&XzF|KkSbHPoSTtP3Gjdob zT0^J$DlW&_@c_=9d`l}iqL{jkFID!Iup4^VAaI;vmE z{mzw`Yv}{u-+ki1Y2&qAIr4qA0v|{bU>w9$;uXk(78hk4x7hqW)fR z;QGFrO1n`Vl#=ST03LcY$tRcEH~%uPeJ%Kz!TCDFBnDRBj&_0*?6TM!R_UFxEv{b+ z!7=1J$}cI|m9aC2k0rcKXDVXMAamKrk4k4(^b(KJ3j+o9z&bk*Cj~ z>#d&ZdlZ$B!d_dEP@B${Fk+*ZiL7)%-Z|b~`Do|p^kGfDAxziln&O@0Cc+G5)*gdJ zY))npkn$t3Jn_fe8~!SG_D{8WIt)y;+IzX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.vim/bundle/vim-go/autoload/ctrlp/decls.vim b/.vim/bundle/vim-go/autoload/ctrlp/decls.vim new file mode 100644 index 0000000..e1465ad --- /dev/null +++ b/.vim/bundle/vim-go/autoload/ctrlp/decls.vim @@ -0,0 +1,159 @@ +let s:go_decls_var = { + \ 'init': 'ctrlp#decls#init()', + \ 'exit': 'ctrlp#decls#exit()', + \ 'enter': 'ctrlp#decls#enter()', + \ 'accept': 'ctrlp#decls#accept', + \ 'lname': 'declarations', + \ 'sname': 'decls', + \ 'type': 'tabs', + \} + +if exists('g:ctrlp_ext_vars') && !empty(g:ctrlp_ext_vars) + let g:ctrlp_ext_vars = add(g:ctrlp_ext_vars, s:go_decls_var) +else + let g:ctrlp_ext_vars = [s:go_decls_var] +endif + +function! ctrlp#decls#init() abort + cal s:enable_syntax() + return s:decls +endfunction + +function! ctrlp#decls#exit() abort + unlet! s:decls s:current_dir s:target +endfunction + +" The action to perform on the selected string +" Arguments: +" a:mode the mode that has been chosen by pressing or +" the values are 'e', 'v', 't' and 'h', respectively +" a:str the selected string +function! ctrlp#decls#accept(mode, str) abort + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + " we jump to the file directory so we can get the fullpath via fnamemodify + " below + execute cd . s:current_dir + + let vals = matchlist(a:str, '|\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)|') + + " i.e: main.go + let filename = vals[1] + let line = vals[2] + let col = vals[3] + + " i.e: /Users/fatih/vim-go/main.go + let filepath = fnamemodify(filename, ":p") + + " acceptile is a very versatile method, + call ctrlp#acceptfile(a:mode, filepath) + call cursor(line, col) + silent! norm! zvzz + finally + "jump back to old dir + execute cd . fnameescape(dir) + endtry +endfunction + +function! ctrlp#decls#enter() abort + let s:current_dir = fnameescape(expand('%:p:h')) + let s:decls = [] + + let bin_path = go#path#CheckBinPath('motion') + if empty(bin_path) + return + endif + let command = printf("%s -format vim -mode decls", bin_path) + let command .= " -include ". get(g:, "go_decls_includes", "func,type") + + call go#cmd#autowrite() + + if s:mode == 0 + " current file mode + let fname = expand("%:p") + if exists('s:target') + let fname = s:target + endif + + let command .= printf(" -file %s", fname) + else + " all functions mode + let dir = expand("%:p:h") + if exists('s:target') + let dir = s:target + endif + + let command .= printf(" -dir %s", dir) + endif + + let out = go#util#System(command) + if go#util#ShellError() != 0 + call go#util#EchoError(out) + return + endif + + if exists("l:tmpname") + call delete(l:tmpname) + endif + + let result = eval(out) + if type(result) != 4 || !has_key(result, 'decls') + return + endif + + let decls = result.decls + + " find the maximum function name + let max_len = 0 + for decl in decls + if len(decl.ident)> max_len + let max_len = len(decl.ident) + endif + endfor + + for decl in decls + " paddings + let space = " " + for i in range(max_len - len(decl.ident)) + let space .= " " + endfor + + call add(s:decls, printf("%s\t%s |%s:%s:%s|\t%s", + \ decl.ident . space, + \ decl.keyword, + \ fnamemodify(decl.filename, ":t"), + \ decl.line, + \ decl.col, + \ decl.full, + \)) + endfor +endfunc + +function! s:enable_syntax() abort + if !(has('syntax') && exists('g:syntax_on')) + return + endif + + syntax match CtrlPIdent '\zs\h\+\ze\s' + syntax match CtrlPKeyword '\zs[^\t|]\+\ze|[^|]\+:\d\+:\d\+|' + syntax match CtrlPFilename '|\zs[^|]\+:\d\+:\d\+\ze|' + syntax match CtrlPSignature '\zs\t.*\ze$' contains=CtrlPKeyWord,CtrlPFilename + + highlight link CtrlPIdent Function + highlight link CtrlPKeyword Keyword + highlight link CtrlPFilename SpecialComment + highlight link CtrlPSignature Comment +endfunction + +let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) + +function! ctrlp#decls#cmd(mode, ...) abort + let s:mode = a:mode + if a:0 && !empty(a:1) + let s:target = a:1 + endif + return s:id +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/alternate.vim b/.vim/bundle/vim-go/autoload/go/alternate.vim new file mode 100644 index 0000000..f2cb210 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/alternate.vim @@ -0,0 +1,32 @@ +" By default use edit (current buffer view) to switch +if !exists("g:go_alternate_mode") + let g:go_alternate_mode = "edit" +endif + +" Test alternates between the implementation of code and the test code. +function! go#alternate#Switch(bang, cmd) abort + let file = expand('%') + if empty(file) + call go#util#EchoError("no buffer name") + return + elseif file =~# '^\f\+_test\.go$' + let l:root = split(file, '_test.go$')[0] + let l:alt_file = l:root . ".go" + elseif file =~# '^\f\+\.go$' + let l:root = split(file, ".go$")[0] + let l:alt_file = l:root . '_test.go' + else + call go#util#EchoError("not a go file") + return + endif + if !filereadable(alt_file) && !bufexists(alt_file) && !a:bang + call go#util#EchoError("couldn't find ".alt_file) + return + elseif empty(a:cmd) + execute ":" . g:go_alternate_mode . " " . alt_file + else + execute ":" . a:cmd . " " . alt_file + endif +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/asmfmt.vim b/.vim/bundle/vim-go/autoload/go/asmfmt.vim new file mode 100644 index 0000000..07779b5 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/asmfmt.vim @@ -0,0 +1,69 @@ +" asmfmt.vim: Vim command to format Go asm files with asmfmt +" (github.com/klauspost/asmfmt). +" +" This filetype plugin adds new commands for asm buffers: +" +" :Fmt +" +" Filter the current asm buffer through asmfmt. +" It tries to preserve cursor position and avoids +" replacing the buffer with stderr output. +" +" Options: +" +" g:go_asmfmt_autosave [default=0] +" +" Flag to automatically call :Fmt when file is saved. + +let s:got_fmt_error = 0 + +" This is a trimmed-down version of the logic in fmt.vim. + +function! go#asmfmt#Format() abort + " Save state. + let l:curw = winsaveview() + + " Write the current buffer to a tempfile. + let l:tmpname = tempname() + call writefile(getline(1, '$'), l:tmpname) + + " Run asmfmt. + let path = go#path#CheckBinPath("asmfmt") + if empty(path) + return + endif + let out = go#util#System(path . ' -w ' . l:tmpname) + + " If there's no error, replace the current file with the output. + if go#util#ShellError() == 0 + " Remove undo point caused by BufWritePre. + try | silent undojoin | catch | endtry + + " Replace the current file with the temp file; then reload the buffer. + let old_fileformat = &fileformat + " save old file permissions + let original_fperm = getfperm(expand('%')) + call rename(l:tmpname, expand('%')) + " restore old file permissions + call setfperm(expand('%'), original_fperm) + silent edit! + let &fileformat = old_fileformat + let &syntax = &syntax + endif + + " Restore the cursor/window positions. + call winrestview(l:curw) +endfunction + +function! go#asmfmt#ToggleAsmFmtAutoSave() abort + if get(g:, "go_asmfmt_autosave", 0) + let g:go_asmfmt_autosave = 1 + call go#util#EchoProgress("auto asmfmt enabled") + return + end + + let g:go_asmfmt_autosave = 0 + call go#util#EchoProgress("auto asmfmt disabled") +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/cmd.vim b/.vim/bundle/vim-go/autoload/go/cmd.vim new file mode 100644 index 0000000..35f6e71 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/cmd.vim @@ -0,0 +1,467 @@ +function! go#cmd#autowrite() abort + if &autowrite == 1 + silent! wall + endif +endfunction + +" Build builds the source code without producting any output binary. We live in +" an editor so the best is to build it to catch errors and fix them. By +" default it tries to call simply 'go build', but it first tries to get all +" dependent files for the current folder and passes it to go build. +function! go#cmd#Build(bang, ...) abort + " expand all wildcards(i.e: '%' to the current file name) + let goargs = map(copy(a:000), "expand(v:val)") + + " escape all shell arguments before we pass it to make + if !has('nvim') + let goargs = go#util#Shelllist(goargs, 1) + endif + " create our command arguments. go build discards any results when it + " compiles multiple packages. So we pass the `errors` package just as an + " placeholder with the current folder (indicated with '.') + let args = ["build"] + goargs + [".", "errors"] + + if go#util#has_job() + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoProgress("building dispatched ...") + endif + + call s:cmd_job({ + \ 'cmd': ['go'] + args, + \ 'bang': a:bang, + \}) + return + elseif has('nvim') + " if we have nvim, call it asynchronously and return early ;) + call go#util#EchoProgress("building dispatched ...") + call go#jobcontrol#Spawn(a:bang, "build", args) + return + endif + + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + let default_makeprg = &makeprg + let &makeprg = "go " . join(args, ' ') + + let l:listtype = go#list#Type("quickfix") + " execute make inside the source folder so we can parse the errors + " correctly + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + execute cd . fnameescape(expand("%:p:h")) + if l:listtype == "locationlist" + silent! exe 'lmake!' + else + silent! exe 'make!' + endif + redraw! + finally + execute cd . fnameescape(dir) + endtry + + let errors = go#list#Get(l:listtype) + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) + else + call go#util#EchoSuccess("[build] SUCCESS") + endif + + let &makeprg = default_makeprg + let $GOPATH = old_gopath +endfunction + + +" Run runs the current file (and their dependencies if any) in a new terminal. +function! go#cmd#RunTerm(bang, mode, files) abort + if empty(a:files) + let cmd = "go run ". go#util#Shelljoin(go#tool#Files()) + else + let cmd = "go run ". go#util#Shelljoin(map(copy(a:files), "expand(v:val)"), 1) + endif + call go#term#newmode(a:bang, cmd, a:mode) +endfunction + +" Run runs the current file (and their dependencies if any) and outputs it. +" This is intented to test small programs and play with them. It's not +" suitable for long running apps, because vim is blocking by default and +" calling long running apps will block the whole UI. +function! go#cmd#Run(bang, ...) abort + if has('nvim') + call go#cmd#RunTerm(a:bang, '', a:000) + return + endif + + if go#util#has_job() + " NOTE(arslan): 'term': 'open' case is not implement for +jobs. This means + " executions waiting for stdin will not work. That's why we don't do + " anything. Once this is implemented we're going to make :GoRun async + endif + + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + + if go#util#IsWin() + exec '!go run ' . go#util#Shelljoin(go#tool#Files()) + if v:shell_error + redraws! | echon "vim-go: [run] " | echohl ErrorMsg | echon "FAILED"| echohl None + else + redraws! | echon "vim-go: [run] " | echohl Function | echon "SUCCESS"| echohl None + endif + + let $GOPATH = old_gopath + return + endif + + " :make expands '%' and '#' wildcards, so they must also be escaped + let default_makeprg = &makeprg + if a:0 == 0 + let &makeprg = 'go run ' . go#util#Shelljoin(go#tool#Files(), 1) + else + let &makeprg = "go run " . go#util#Shelljoin(map(copy(a:000), "expand(v:val)"), 1) + endif + + let l:listtype = go#list#Type("quickfix") + + if l:listtype == "locationlist" + exe 'lmake!' + else + exe 'make!' + endif + + let items = go#list#Get(l:listtype) + let errors = go#tool#FilterValids(items) + + call go#list#Populate(l:listtype, errors, &makeprg) + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) + endif + + let $GOPATH = old_gopath + let &makeprg = default_makeprg +endfunction + +" Install installs the package by simple calling 'go install'. If any argument +" is given(which are passed directly to 'go install') it tries to install +" those packages. Errors are populated in the location window. +function! go#cmd#Install(bang, ...) abort + " use vim's job functionality to call it asynchronously + if go#util#has_job() + " expand all wildcards(i.e: '%' to the current file name) + let goargs = map(copy(a:000), "expand(v:val)") + + " escape all shell arguments before we pass it to make + let goargs = go#util#Shelllist(goargs, 1) + + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoProgress("installing dispatched ...") + endif + + call s:cmd_job({ + \ 'cmd': ['go', 'install'] + goargs, + \ 'bang': a:bang, + \}) + return + endif + + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + let default_makeprg = &makeprg + + " :make expands '%' and '#' wildcards, so they must also be escaped + let goargs = go#util#Shelljoin(map(copy(a:000), "expand(v:val)"), 1) + let &makeprg = "go install " . goargs + + let l:listtype = go#list#Type("quickfix") + " execute make inside the source folder so we can parse the errors + " correctly + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + execute cd . fnameescape(expand("%:p:h")) + if l:listtype == "locationlist" + silent! exe 'lmake!' + else + silent! exe 'make!' + endif + redraw! + finally + execute cd . fnameescape(dir) + endtry + + let errors = go#list#Get(l:listtype) + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) + else + call go#util#EchoSuccess("installed to ". $GOPATH) + endif + + let $GOPATH = old_gopath + let &makeprg = default_makeprg +endfunction + +" Test runs `go test` in the current directory. If compile is true, it'll +" compile the tests instead of running them (useful to catch errors in the +" test files). Any other argument is appendend to the final `go test` command +function! go#cmd#Test(bang, compile, ...) abort + let args = ["test"] + + " don't run the test, only compile it. Useful to capture and fix errors. + if a:compile + let compile_file = "vim-go-test-compile" + call extend(args, ["-c", "-o", compile_file]) + endif + + if a:0 + let goargs = a:000 + + " do not expand for coverage mode as we're passing the arg ourself + if a:1 != '-coverprofile' + " expand all wildcards(i.e: '%' to the current file name) + let goargs = map(copy(a:000), "expand(v:val)") + endif + + if !(has('nvim') || go#util#has_job()) + let goargs = go#util#Shelllist(goargs, 1) + endif + + call extend(args, goargs, 1) + else + " only add this if no custom flags are passed + let timeout = get(g:, 'go_test_timeout', '10s') + call add(args, printf("-timeout=%s", timeout)) + endif + + if get(g:, 'go_echo_command_info', 1) + if a:compile + echon "vim-go: " | echohl Identifier | echon "compiling tests ..." | echohl None + else + echon "vim-go: " | echohl Identifier | echon "testing ..." | echohl None + endif + endif + + if go#util#has_job() + " use vim's job functionality to call it asynchronously + let job_args = { + \ 'cmd': ['go'] + args, + \ 'bang': a:bang, + \ } + + if a:compile + let job_args['custom_cb'] = function('s:test_compile', [compile_file]) + endif + + call s:cmd_job(job_args) + return + elseif has('nvim') + " use nvims's job functionality + if get(g:, 'go_term_enabled', 0) + let id = go#term#new(a:bang, ["go"] + args) + else + let id = go#jobcontrol#Spawn(a:bang, "test", args) + endif + + if a:compile + call go#jobcontrol#AddHandler(function('s:test_compile_handler')) + let s:test_compile_handlers[id] = compile_file + endif + return id + endif + + call go#cmd#autowrite() + redraw + + let command = "go " . join(args, ' ') + let out = go#tool#ExecuteInDir(command) + + let l:listtype = "quickfix" + + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + execute cd fnameescape(expand("%:p:h")) + + if a:compile + call delete(compile_file) + endif + + if go#util#ShellError() != 0 + let errors = go#tool#ParseErrors(split(out, '\n')) + let errors = go#tool#FilterValids(errors) + + call go#list#Populate(l:listtype, errors, command) + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) + elseif empty(errors) + " failed to parse errors, output the original content + call go#util#EchoError(out) + endif + echon "vim-go: " | echohl ErrorMsg | echon "[test] FAIL" | echohl None + else + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + + if a:compile + echon "vim-go: " | echohl Function | echon "[test] SUCCESS" | echohl None + else + echon "vim-go: " | echohl Function | echon "[test] PASS" | echohl None + endif + endif + execute cd . fnameescape(dir) +endfunction + +" Testfunc runs a single test that surrounds the current cursor position. +" Arguments are passed to the `go test` command. +function! go#cmd#TestFunc(bang, ...) abort + " search flags legend (used only) + " 'b' search backward instead of forward + " 'c' accept a match at the cursor position + " 'n' do Not move the cursor + " 'W' don't wrap around the end of the file + " + " for the full list + " :help search + let test = search('func \(Test\|Example\)', "bcnW") + + if test == 0 + echo "vim-go: [test] no test found immediate to cursor" + return + end + + let line = getline(test) + let name = split(split(line, " ")[1], "(")[0] + let args = [a:bang, 0, "-run", name . "$"] + + if a:0 + call extend(args, a:000) + endif + + call call('go#cmd#Test', args) +endfunction + +" Generate runs 'go generate' in similar fashion to go#cmd#Build() +function! go#cmd#Generate(bang, ...) abort + let default_makeprg = &makeprg + + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + + " :make expands '%' and '#' wildcards, so they must also be escaped + let goargs = go#util#Shelljoin(map(copy(a:000), "expand(v:val)"), 1) + if go#util#ShellError() != 0 + let &makeprg = "go generate " . goargs + else + let gofiles = go#util#Shelljoin(go#tool#Files(), 1) + let &makeprg = "go generate " . goargs . ' ' . gofiles + endif + + let l:listtype = go#list#Type("quickfix") + + echon "vim-go: " | echohl Identifier | echon "generating ..."| echohl None + if l:listtype == "locationlist" + silent! exe 'lmake!' + else + silent! exe 'make!' + endif + redraw! + + let errors = go#list#Get(l:listtype) + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) + if !a:bang + call go#list#JumpToFirst(l:listtype) + endif + else + redraws! | echon "vim-go: " | echohl Function | echon "[generate] SUCCESS"| echohl None + endif + + let &makeprg = default_makeprg + let $GOPATH = old_gopath +endfunction + + +" --------------------- +" | Vim job callbacks | +" --------------------- + +function s:cmd_job(args) abort + let status_dir = expand('%:p:h') + let started_at = reltime() + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': a:args.cmd[1], + \ 'state': "started", + \}) + + " autowrite is not enabled for jobs + call go#cmd#autowrite() + + function! s:error_info_cb(job, exit_status, data) closure abort + let status = { + \ 'desc': 'last status', + \ 'type': a:args.cmd[1], + \ 'state': "success", + \ } + + if a:exit_status + let status.state = "failed" + endif + + let elapsed_time = reltimestr(reltime(started_at)) + " strip whitespace + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + let status.state .= printf(" (%ss)", elapsed_time) + + call go#statusline#Update(status_dir, status) + endfunction + + let a:args.error_info_cb = funcref('s:error_info_cb') + let callbacks = go#job#Spawn(a:args) + + let start_options = { + \ 'callback': callbacks.callback, + \ 'close_cb': callbacks.close_cb, + \ } + + " modify GOPATH if needed + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + + " pre start + let dir = getcwd() + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let jobdir = fnameescape(expand("%:p:h")) + execute cd . jobdir + + call job_start(a:args.cmd, start_options) + + " post start + execute cd . fnameescape(dir) + let $GOPATH = old_gopath +endfunction + + +" test_compile is called when a GoTestCompile call is finished +function! s:test_compile(test_file, job, exit_status, data) abort + call delete(a:test_file) +endfunction + +" ----------------------- +" | Neovim job handlers | +" ----------------------- +let s:test_compile_handlers = {} + +function! s:test_compile_handler(job, exit_status, data) abort + if !has_key(s:test_compile_handlers, a:job.id) + return + endif + let l:compile_file = s:test_compile_handlers[a:job.id] + call delete(l:compile_file) + unlet s:test_compile_handlers[a:job.id] +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/complete.vim b/.vim/bundle/vim-go/autoload/go/complete.vim new file mode 100644 index 0000000..2663afb --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/complete.vim @@ -0,0 +1,182 @@ +let s:sock_type = (has('win32') || has('win64')) ? 'tcp' : 'unix' + +function! s:gocodeCurrentBuffer() abort + let buf = getline(1, '$') + if &encoding != 'utf-8' + let buf = map(buf, 'iconv(v:val, &encoding, "utf-8")') + endif + if &l:fileformat == 'dos' + " XXX: line2byte() depend on 'fileformat' option. + " so if fileformat is 'dos', 'buf' must include '\r'. + let buf = map(buf, 'v:val."\r"') + endif + let file = tempname() + call writefile(buf, file) + + return file +endfunction + +function! s:gocodeCommand(cmd, preargs, args) abort + for i in range(0, len(a:args) - 1) + let a:args[i] = go#util#Shellescape(a:args[i]) + endfor + for i in range(0, len(a:preargs) - 1) + let a:preargs[i] = go#util#Shellescape(a:preargs[i]) + endfor + + let bin_path = go#path#CheckBinPath("gocode") + if empty(bin_path) + return + endif + + " we might hit cache problems, as gocode doesn't handle well different + " GOPATHS: https://github.com/nsf/gocode/issues/239 + let old_gopath = $GOPATH + let old_goroot = $GOROOT + let $GOPATH = go#path#Detect() + let $GOROOT = go#util#env("goroot") + + let socket_type = get(g:, 'go_gocode_socket_type', s:sock_type) + let cmd = printf('%s -sock %s %s %s %s', + \ go#util#Shellescape(bin_path), + \ socket_type, + \ join(a:preargs), + \ go#util#Shellescape(a:cmd), + \ join(a:args) + \ ) + + let result = go#util#System(cmd) + let $GOPATH = old_gopath + let $GOROOT = old_goroot + + if go#util#ShellError() != 0 + return "[\"0\", []]" + else + if &encoding != 'utf-8' + let result = iconv(result, 'utf-8', &encoding) + endif + return result + endif +endfunction + +function! s:gocodeCurrentBufferOpt(filename) abort + return '-in=' . a:filename +endfunction + +let s:optionsEnabled = 0 +function! s:gocodeEnableOptions() abort + if s:optionsEnabled + return + endif + + let bin_path = go#path#CheckBinPath("gocode") + if empty(bin_path) + return + endif + + let s:optionsEnabled = 1 + + call go#util#System(printf('%s set propose-builtins %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_propose_builtins', 1)))) + call go#util#System(printf('%s set autobuild %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_autobuild', 1)))) + call go#util#System(printf('%s set unimported-packages %s', go#util#Shellescape(bin_path), s:toBool(get(g:, 'go_gocode_unimported_packages', 0)))) +endfunction + +function! s:toBool(val) abort + if a:val | return 'true ' | else | return 'false' | endif +endfunction + +function! s:gocodeAutocomplete() abort + call s:gocodeEnableOptions() + + let filename = s:gocodeCurrentBuffer() + let result = s:gocodeCommand('autocomplete', + \ [s:gocodeCurrentBufferOpt(filename), '-f=vim'], + \ [expand('%:p'), go#util#OffsetCursor()]) + call delete(filename) + return result +endfunction + +function! go#complete#GetInfo() abort + let offset = go#util#OffsetCursor()+1 + let filename = s:gocodeCurrentBuffer() + let result = s:gocodeCommand('autocomplete', + \ [s:gocodeCurrentBufferOpt(filename), '-f=godit'], + \ [expand('%:p'), offset]) + call delete(filename) + + " first line is: Charcount,,NumberOfCandidates, i.e: 8,,1 + " following lines are candiates, i.e: func foo(name string),,foo( + let out = split(result, '\n') + + " no candidates are found + if len(out) == 1 + return "" + endif + + " only one candiate is found + if len(out) == 2 + return split(out[1], ',,')[0] + endif + + " to many candidates are available, pick one that maches the word under the + " cursor + let infos = [] + for info in out[1:] + call add(infos, split(info, ',,')[0]) + endfor + + let wordMatch = '\<' . expand("") . '\>' + " escape single quotes in wordMatch before passing it to filter + let wordMatch = substitute(wordMatch, "'", "''", "g") + let filtered = filter(infos, "v:val =~ '".wordMatch."'") + + if len(filtered) == 1 + return filtered[0] + endif + + return "" +endfunction + +function! go#complete#Info(auto) abort + " auto is true if we were called by g:go_auto_type_info's autocmd + let result = go#complete#GetInfo() + if !empty(result) + " if auto, and the result is a PANIC by gocode, hide it + if a:auto && result ==# 'PANIC PANIC PANIC' | return | endif + echo "vim-go: " | echohl Function | echon result | echohl None + endif +endfunction + +function! s:trim_bracket(val) abort + let a:val.word = substitute(a:val.word, '[(){}\[\]]\+$', '', '') + return a:val +endfunction + +function! go#complete#Complete(findstart, base) abort + "findstart = 1 when we need to get the text length + if a:findstart == 1 + execute "silent let g:gocomplete_completions = " . s:gocodeAutocomplete() + return col('.') - g:gocomplete_completions[0] - 1 + "findstart = 0 when we need to return the list of completions + else + let s = getline(".")[col('.') - 1] + if s =~ '[(){}\{\}]' + return map(copy(g:gocomplete_completions[1]), 's:trim_bracket(v:val)') + endif + return g:gocomplete_completions[1] + endif +endf + +function! go#complete#ToggleAutoTypeInfo() abort + if get(g:, "go_auto_type_info", 0) + let g:go_auto_type_info = 0 + call go#util#EchoProgress("auto type info disabled") + return + end + + let g:go_auto_type_info = 1 + call go#util#EchoProgress("auto type info enabled") +endfunction + + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/coverage.vim b/.vim/bundle/vim-go/autoload/go/coverage.vim new file mode 100644 index 0000000..56113b9 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/coverage.vim @@ -0,0 +1,371 @@ +let s:toggle = 0 + +" Buffer creates a new cover profile with 'go test -coverprofile' and changes +" the current buffers highlighting to show covered and uncovered sections of +" the code. If run again it clears the annotation. +function! go#coverage#BufferToggle(bang, ...) abort + if s:toggle + call go#coverage#Clear() + return + endif + + if a:0 == 0 + return call(function('go#coverage#Buffer'), [a:bang]) + endif + + return call(function('go#coverage#Buffer'), [a:bang] + a:000) +endfunction + +" Buffer creates a new cover profile with 'go test -coverprofile' and changes +" teh current buffers highlighting to show covered and uncovered sections of +" the code. Calling it again reruns the tests and shows the last updated +" coverage. +function! go#coverage#Buffer(bang, ...) abort + " we use matchaddpos() which was introduce with 7.4.330, be sure we have + " it: http://ftp.vim.org/vim/patches/7.4/7.4.330 + if !exists("*matchaddpos") + call go#util#EchoError("GoCoverage is supported with Vim version 7.4-330 or later") + return -1 + endif + + " check if there is any test file, if not we just return + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + execute cd . fnameescape(expand("%:p:h")) + if empty(glob("*_test.go")) + call go#util#EchoError("no tests files available") + return + endif + finally + execute cd . fnameescape(dir) + endtry + + let s:toggle = 1 + let l:tmpname = tempname() + + if go#util#has_job() + call s:coverage_job({ + \ 'cmd': ['go', 'test', '-coverprofile', l:tmpname], + \ 'custom_cb': function('s:coverage_callback', [l:tmpname]), + \ 'bang': a:bang, + \ }) + return + endif + + let args = [a:bang, 0, "-coverprofile", l:tmpname] + if a:0 + call extend(args, a:000) + endif + + let disabled_term = 0 + if get(g:, 'go_term_enabled') + let disabled_term = 1 + let g:go_term_enabled = 0 + endif + + let id = call('go#cmd#Test', args) + + if disabled_term + let g:go_term_enabled = 1 + endif + + if has('nvim') + call go#jobcontrol#AddHandler(function('s:coverage_handler')) + let s:coverage_handler_jobs[id] = l:tmpname + return + endif + + if go#util#ShellError() == 0 + call go#coverage#overlay(l:tmpname) + endif + + call delete(l:tmpname) +endfunction + +" Clear clears and resets the buffer annotation matches +function! go#coverage#Clear() abort + call clearmatches() + + if exists("s:toggle") | let s:toggle = 0 | endif + + " remove the autocmd we defined + if exists("#BufWinLeave#") + autocmd! BufWinLeave + endif +endfunction + +" Browser creates a new cover profile with 'go test -coverprofile' and opens +" a new HTML coverage page from that profile in a new browser +function! go#coverage#Browser(bang, ...) abort + let l:tmpname = tempname() + if go#util#has_job() + call s:coverage_job({ + \ 'cmd': ['go', 'test', '-coverprofile', l:tmpname], + \ 'custom_cb': function('s:coverage_browser_callback', [l:tmpname]), + \ 'bang': a:bang, + \ }) + return + endif + + let args = [a:bang, 0, "-coverprofile", l:tmpname] + if a:0 + call extend(args, a:000) + endif + + let id = call('go#cmd#Test', args) + if has('nvim') + call go#jobcontrol#AddHandler(function('s:coverage_browser_handler')) + let s:coverage_browser_handler_jobs[id] = l:tmpname + return + endif + + + if go#util#ShellError() == 0 + let openHTML = 'go tool cover -html='.l:tmpname + call go#tool#ExecuteInDir(openHTML) + endif + + call delete(l:tmpname) +endfunction + +" Parses a single line from the cover file generated via go test -coverprofile +" and returns a single coverage profile block. +function! go#coverage#parsegocoverline(line) abort + " file:startline.col,endline.col numstmt count + let mx = '\([^:]\+\):\(\d\+\)\.\(\d\+\),\(\d\+\)\.\(\d\+\)\s\(\d\+\)\s\(\d\+\)' + let tokens = matchlist(a:line, mx) + let ret = {} + let ret.file = tokens[1] + let ret.startline = str2nr(tokens[2]) + let ret.startcol = str2nr(tokens[3]) + let ret.endline = str2nr(tokens[4]) + let ret.endcol = str2nr(tokens[5]) + let ret.numstmt = tokens[6] + let ret.cnt = tokens[7] + return ret +endfunction + +" Generates matches to be added to matchaddpos for the given coverage profile +" block +function! go#coverage#genmatch(cov) abort + let color = 'goCoverageCovered' + if a:cov.cnt == 0 + let color = 'goCoverageUncover' + endif + + let matches = [] + + " if start and end are the same, also specify the byte length + " example: foo.go:92.2,92.65 1 0 + if a:cov.startline == a:cov.endline + call add(matches, { + \ 'group': color, + \ 'pos': [[a:cov.startline, a:cov.startcol, a:cov.endcol - a:cov.startcol]], + \ 'priority': 2, + \ }) + return matches + endif + + " add start columns. Because we don't know the length of the of + " the line, we assume it is at maximum 200 bytes. I know this is hacky, + " but that's only way of fixing the issue + call add(matches, { + \ 'group': color, + \ 'pos': [[a:cov.startline, a:cov.startcol, 200]], + \ 'priority': 2, + \ }) + + " and then the remaining lines + let start_line = a:cov.startline + while start_line < a:cov.endline + let start_line += 1 + call add(matches, { + \ 'group': color, + \ 'pos': [[start_line]], + \ 'priority': 2, + \ }) + endwhile + + " finally end columns + call add(matches, { + \ 'group': color, + \ 'pos': [[a:cov.endline, a:cov.endcol-1]], + \ 'priority': 2, + \ }) + + return matches +endfunction + +" Reads the given coverprofile file and annotates the current buffer +function! go#coverage#overlay(file) abort + if !filereadable(a:file) + return + endif + let lines = readfile(a:file) + + " cover mode, by default it's 'set'. Just here for debugging purposes + let mode = lines[0] + + " contains matches for matchaddpos() + let matches = [] + + " first mark all lines as goCoverageNormalText. We use a custom group to not + " interfere with other buffers highlightings. Because the priority is + " lower than the cover and uncover matches, it'll be overriden. + let cnt = 1 + while cnt <= line('$') + call add(matches, {'group': 'goCoverageNormalText', 'pos': [cnt], 'priority': 1}) + let cnt += 1 + endwhile + + let fname = expand('%') + + " when called for a _test.go file, run the coverage for the actuall file + " file + if fname =~# '^\f\+_test\.go$' + let l:root = split(fname, '_test.go$')[0] + let fname = l:root . ".go" + + if !filereadable(fname) + call go#util#EchoError("couldn't find ".fname) + return + endif + + " open the alternate file to show the coverage + exe ":edit ". fnamemodify(fname, ":p") + endif + + " cov.file includes only the filename itself, without full path + let fname = fnamemodify(fname, ":t") + + for line in lines[1:] + let cov = go#coverage#parsegocoverline(line) + + " TODO(arslan): for now only include the coverage for the current + " buffer + if fname != fnamemodify(cov.file, ':t') + continue + endif + + call extend(matches, go#coverage#genmatch(cov)) + endfor + + " clear the matches if we leave the buffer + autocmd BufWinLeave call go#coverage#Clear() + + for m in matches + call matchaddpos(m.group, m.pos) + endfor +endfunction + + +" --------------------- +" | Vim job callbacks | +" --------------------- +" +function s:coverage_job(args) + " autowrite is not enabled for jobs + call go#cmd#autowrite() + + let status_dir = expand('%:p:h') + function! s:error_info_cb(job, exit_status, data) closure + let status = { + \ 'desc': 'last status', + \ 'type': "coverage", + \ 'state': "finished", + \ } + + if a:exit_status + let status.state = "failed" + endif + + call go#statusline#Update(status_dir, status) + endfunction + + let a:args.error_info_cb = funcref('s:error_info_cb') + let callbacks = go#job#Spawn(a:args) + + let start_options = { + \ 'callback': callbacks.callback, + \ 'close_cb': callbacks.close_cb, + \ } + + " modify GOPATH if needed + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + + " pre start + let dir = getcwd() + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let jobdir = fnameescape(expand("%:p:h")) + execute cd . jobdir + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': "coverage", + \ 'state': "started", + \}) + + call job_start(a:args.cmd, start_options) + + " post start + execute cd . fnameescape(dir) + let $GOPATH = old_gopath +endfunction + +" coverage_callback is called when the coverage execution is finished +function! s:coverage_callback(coverfile, job, exit_status, data) + if a:exit_status == 0 + call go#coverage#overlay(a:coverfile) + endif + + call delete(a:coverfile) +endfunction + +function! s:coverage_browser_callback(coverfile, job, exit_status, data) + if a:exit_status == 0 + let openHTML = 'go tool cover -html='.a:coverfile + call go#tool#ExecuteInDir(openHTML) + endif + + call delete(a:coverfile) +endfunction + +" ----------------------- +" | Neovim job handlers | +" ----------------------- + +let s:coverage_handler_jobs = {} +let s:coverage_browser_handler_jobs = {} + +function! s:coverage_handler(job, exit_status, data) abort + if !has_key(s:coverage_handler_jobs, a:job.id) + return + endif + let l:tmpname = s:coverage_handler_jobs[a:job.id] + if a:exit_status == 0 + call go#coverage#overlay(l:tmpname) + endif + + call delete(l:tmpname) + unlet s:coverage_handler_jobs[a:job.id] +endfunction + +function! s:coverage_browser_handler(job, exit_status, data) abort + if !has_key(s:coverage_browser_handler_jobs, a:job.id) + return + endif + + let l:tmpname = s:coverage_browser_handler_jobs[a:job.id] + if a:exit_status == 0 + let openHTML = 'go tool cover -html='.l:tmpname + call go#tool#ExecuteInDir(openHTML) + endif + + call delete(l:tmpname) + unlet s:coverage_browser_handler_jobs[a:job.id] +endfunction + + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/def.vim b/.vim/bundle/vim-go/autoload/go/def.vim new file mode 100644 index 0000000..63835b7 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/def.vim @@ -0,0 +1,320 @@ +let s:go_stack = [] +let s:go_stack_level = 0 + +function! go#def#Jump(mode) abort + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + + let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') + + " so guru right now is slow for some people. previously we were using + " godef which also has it's own quirks. But this issue come up so many + " times I've decided to support both. By default we still use guru as it + " covers all edge cases, but now anyone can switch to godef if they wish + let bin_name = get(g:, 'go_def_mode', 'guru') + if bin_name == 'godef' + if &modified + " Write current unsaved buffer to a temp file and use the modified content + let l:tmpname = tempname() + call writefile(getline(1, '$'), l:tmpname) + let fname = l:tmpname + endif + + let bin_path = go#path#CheckBinPath("godef") + if empty(bin_path) + let $GOPATH = old_gopath + return + endif + let command = printf("%s -f=%s -o=%s -t", bin_path, fname, go#util#OffsetCursor()) + let out = go#util#System(command) + if exists("l:tmpname") + call delete(l:tmpname) + endif + elseif bin_name == 'guru' + let bin_path = go#path#CheckBinPath("guru") + if empty(bin_path) + let $GOPATH = old_gopath + return + endif + + let cmd = [bin_path] + let stdin_content = "" + + if &modified + let sep = go#util#LineEnding() + let content = join(getline(1, '$'), sep) + let stdin_content = fname . "\n" . strlen(content) . "\n" . content + call add(cmd, "-modified") + endif + + if exists('g:go_guru_tags') + let tags = get(g:, 'go_guru_tags') + call extend(cmd, ["-tags", tags]) + endif + + let fname = fname.':#'.go#util#OffsetCursor() + call extend(cmd, ["definition", fname]) + + if go#util#has_job() + let l:spawn_args = { + \ 'cmd': cmd, + \ 'custom_cb': function('s:jump_to_declaration_cb', [a:mode, bin_name]), + \ } + + if &modified + let l:spawn_args.input = stdin_content + endif + + call go#util#EchoProgress("searching declaration ...") + + call s:def_job(spawn_args) + return + endif + + let command = join(cmd, " ") + if &modified + let out = go#util#System(command, stdin_content) + else + let out = go#util#System(command) + endif + else + call go#util#EchoError('go_def_mode value: '. bin_name .' is not valid. Valid values are: [godef, guru]') + return + endif + + if go#util#ShellError() != 0 + call go#util#EchoError(out) + return + endif + + call go#def#jump_to_declaration(out, a:mode, bin_name) + let $GOPATH = old_gopath +endfunction + +function! s:jump_to_declaration_cb(mode, bin_name, job, exit_status, data) abort + if a:exit_status != 0 + return + endif + + call go#def#jump_to_declaration(a:data[0], a:mode, a:bin_name) +endfunction + +function! go#def#jump_to_declaration(out, mode, bin_name) abort + let final_out = a:out + if a:bin_name == "godef" + " append the type information to the same line so our we can parse it. + " This makes it compatible with guru output. + let final_out = join(split(a:out, '\n'), ':') + endif + + " strip line ending + let out = split(final_out, go#util#LineEnding())[0] + if go#util#IsWin() + let parts = split(out, '\(^[a-zA-Z]\)\@,:navigate :jump ,q:exit'] + + let i = 0 + while i < len(s:go_stack) + let entry = s:go_stack[i] + let prefix = "" + + if i == s:go_stack_level + let prefix = ">" + else + let prefix = " " + endif + + call add(stackOut, printf("%s %d %s|%d col %d|%s", + \ prefix, i+1, entry["file"], entry["line"], entry["col"], entry["ident"])) + let i += 1 + endwhile + + if s:go_stack_level == i + call add(stackOut, "> ") + endif + + call go#ui#OpenWindow("GoDef Stack", stackOut, "godefstack") + + noremap :call go#def#SelectStackEntry() + noremap :call go#ui#CloseWindow() + noremap q :call go#ui#CloseWindow() +endfunction + +function! go#def#StackClear(...) abort + let s:go_stack = [] + let s:go_stack_level = 0 +endfunction + +function! go#def#StackPop(...) abort + if len(s:go_stack) == 0 + call go#util#EchoError("godef stack empty") + return + endif + + if s:go_stack_level == 0 + call go#util#EchoError("at bottom of the godef stack") + return + endif + + if !len(a:000) + let numPop = 1 + else + let numPop = a:1 + endif + + let newLevel = str2nr(s:go_stack_level) - str2nr(numPop) + call go#def#Stack(newLevel + 1) +endfunction + +function! go#def#Stack(...) abort + if len(s:go_stack) == 0 + call go#util#EchoError("godef stack empty") + return + endif + + if !len(a:000) + " Display interactive stack + call go#def#StackUI() + return + else + let jumpTarget = a:1 + endif + + if jumpTarget !~ '^\d\+$' + if jumpTarget !~ '^\s*$' + call go#util#EchoError("location must be a number") + endif + return + endif + + let jumpTarget = str2nr(jumpTarget) - 1 + + if jumpTarget >= 0 && jumpTarget < len(s:go_stack) + let s:go_stack_level = jumpTarget + let target = s:go_stack[s:go_stack_level] + + " jump + if expand('%:p') != target["file"] + if &modified + exec 'hide edit' target["file"] + else + exec 'edit' target["file"] + endif + endif + call cursor(target["line"], target["col"]) + normal! zz + else + call go#util#EchoError("invalid location. Try :GoDefStack to see the list of valid entries") + endif +endfunction + +function s:def_job(args) abort + function! s:error_info_cb(job, exit_status, data) closure + " do not print anything during async definition search&jump + endfunction + + let a:args.error_info_cb = funcref('s:error_info_cb') + let callbacks = go#job#Spawn(a:args) + + let start_options = { + \ 'callback': callbacks.callback, + \ 'close_cb': callbacks.close_cb, + \ } + + if &modified + let l:tmpname = tempname() + call writefile(split(a:args.input, "\n"), l:tmpname, "b") + let l:start_options.in_io = "file" + let l:start_options.in_name = l:tmpname + endif + + call job_start(a:args.cmd, start_options) +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/def_test.vim b/.vim/bundle/vim-go/autoload/go/def_test.vim new file mode 100644 index 0000000..a5ed24f --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/def_test.vim @@ -0,0 +1,32 @@ +func Test_jump_to_declaration_guru() + let file_name = "test-fixtures/def/jump.go" + let lnum = 5 + let col = 6 + + let out = printf("%s:%d:%d: defined here as func main", file_name, lnum, col) + let bin_name = "guru" + + call go#def#jump_to_declaration(out, "", bin_name) + + call assert_equal(file_name, bufname("%")) + call assert_equal(lnum, getcurpos()[1]) + call assert_equal(col, getcurpos()[2]) +endfunc + +func Test_jump_to_declaration_godef() + let file_name = "test-fixtures/def/jump.go" + let lnum = 5 + let col = 6 + + " note that the output of godef has two lines + let out = printf("%s:%d:%d\ndefined here as func main", file_name, lnum, col) + let bin_name = "godef" + + call go#def#jump_to_declaration(out, "", bin_name) + + call assert_equal(file_name, bufname("%")) + call assert_equal(lnum, getcurpos()[1]) + call assert_equal(col, getcurpos()[2]) +endfunc + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/doc.vim b/.vim/bundle/vim-go/autoload/go/doc.vim new file mode 100644 index 0000000..867355c --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/doc.vim @@ -0,0 +1,218 @@ +" Copyright 2011 The Go Authors. All rights reserved. +" Use of this source code is governed by a BSD-style +" license that can be found in the LICENSE file. + +let s:buf_nr = -1 + +if !exists("g:go_doc_command") + let g:go_doc_command = "godoc" +endif + +if !exists("g:go_doc_options") + let g:go_doc_options = "" +endif + +function! go#doc#OpenBrowser(...) abort + " check if we have gogetdoc as it gives us more and accurate information. + " Only supported if we have json_decode as it's not worth to parse the plain + " non-json output of gogetdoc + let bin_path = go#path#CheckBinPath('gogetdoc') + if !empty(bin_path) && exists('*json_decode') + let json_out = s:gogetdoc(1) + if go#util#ShellError() != 0 + call go#util#EchoError(json_out) + return + endif + + let out = json_decode(json_out) + if type(out) != type({}) + call go#util#EchoError("gogetdoc output is malformed") + endif + + let import = out["import"] + let name = out["name"] + let decl = out["decl"] + + let godoc_url = "https://godoc.org/" . import + if decl !~ "^package" + let godoc_url .= "#" . name + endif + + echo godoc_url + + call go#tool#OpenBrowser(godoc_url) + return + endif + + let pkgs = s:godocWord(a:000) + if empty(pkgs) + return + endif + + let pkg = pkgs[0] + let exported_name = pkgs[1] + + " example url: https://godoc.org/github.com/fatih/set#Set + let godoc_url = "https://godoc.org/" . pkg . "#" . exported_name + call go#tool#OpenBrowser(godoc_url) +endfunction + +function! go#doc#Open(newmode, mode, ...) abort + if len(a:000) + " check if we have 'godoc' and use it automatically + let bin_path = go#path#CheckBinPath('godoc') + if empty(bin_path) + return + endif + + let command = printf("%s %s", bin_path, join(a:000, ' ')) + let out = go#util#System(command) + else + let out = s:gogetdoc(0) + endif + + if go#util#ShellError() != 0 + call go#util#EchoError(out) + return + endif + + call s:GodocView(a:newmode, a:mode, out) +endfunction + +function! s:GodocView(newposition, position, content) abort + " reuse existing buffer window if it exists otherwise create a new one + if !bufexists(s:buf_nr) + execute a:newposition + sil file `="[Godoc]"` + let s:buf_nr = bufnr('%') + elseif bufwinnr(s:buf_nr) == -1 + execute a:position + execute s:buf_nr . 'buffer' + elseif bufwinnr(s:buf_nr) != bufwinnr('%') + execute bufwinnr(s:buf_nr) . 'wincmd w' + endif + + " cap buffer height to 20, but resize it for smaller contents + let max_height = 20 + let content_height = len(split(a:content, "\n")) + if content_height > max_height + exe 'resize ' . max_height + else + exe 'resize ' . content_height + endif + + setlocal filetype=godoc + setlocal bufhidden=delete + setlocal buftype=nofile + setlocal noswapfile + setlocal nobuflisted + setlocal nocursorline + setlocal nocursorcolumn + setlocal iskeyword+=: + setlocal iskeyword-=- + + setlocal modifiable + %delete _ + call append(0, split(a:content, "\n")) + sil $delete _ + setlocal nomodifiable + sil normal! gg + + " close easily with or enter + noremap :close + noremap :close +endfunction + +function! s:gogetdoc(json) abort + " check if we have 'gogetdoc' and use it automatically + let bin_path = go#path#CheckBinPath('gogetdoc') + if empty(bin_path) + return -1 + endif + + let cmd = [bin_path] + + let offset = go#util#OffsetCursor() + let fname = expand("%:p:gs!\\!/!") + let pos = shellescape(fname.':#'.offset) + + let cmd += ["-pos", pos] + if a:json + let cmd += ["-json"] + endif + + let command = join(cmd, " ") + + if &modified + " gogetdoc supports the same archive format as guru for dealing with + " modified buffers. + " use the -modified flag + " write each archive entry on stdin as: + " filename followed by newline + " file size followed by newline + " file contents + let in = "" + let sep = go#util#LineEnding() + let content = join(getline(1, '$'), sep) + let in = fname . "\n" . strlen(content) . "\n" . content + let command .= " -modified" + let out = go#util#System(command, in) + else + let out = go#util#System(command) + endif + + return out +endfunction + +" returns the package and exported name. exported name might be empty. +" ie: fmt and Println +" ie: github.com/fatih/set and New +function! s:godocWord(args) abort + if !executable('godoc') + let msg = "godoc command not found." + let msg .= " install with: go get golang.org/x/tools/cmd/godoc" + call go#util#EchoWarning(msg) + return [] + endif + + if !len(a:args) + let oldiskeyword = &iskeyword + setlocal iskeyword+=. + let word = expand('') + let &iskeyword = oldiskeyword + let word = substitute(word, '[^a-zA-Z0-9\\/._~-]', '', 'g') + let words = split(word, '\.\ze[^./]\+$') + else + let words = a:args + endif + + if !len(words) + return [] + endif + + let pkg = words[0] + if len(words) == 1 + let exported_name = "" + else + let exported_name = words[1] + endif + + let packages = go#tool#Imports() + + if has_key(packages, pkg) + let pkg = packages[pkg] + endif + + return [pkg, exported_name] +endfunction + +function! s:godocNotFound(content) abort + if len(a:content) == 0 + return 1 + endif + + return a:content =~# '^.*: no such file or directory\n$' +endfunction + + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/fmt.vim b/.vim/bundle/vim-go/autoload/go/fmt.vim new file mode 100644 index 0000000..e337c87 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/fmt.vim @@ -0,0 +1,243 @@ +" Copyright 2011 The Go Authors. All rights reserved. +" Use of this source code is governed by a BSD-style +" license that can be found in the LICENSE file. +" +" fmt.vim: Vim command to format Go files with gofmt (and gofmt compatible +" toorls, such as goimports). + +if !exists("g:go_fmt_command") + let g:go_fmt_command = "gofmt" +endif + +if !exists("g:go_goimports_bin") + let g:go_goimports_bin = "goimports" +endif + +if !exists('g:go_fmt_fail_silently') + let g:go_fmt_fail_silently = 0 +endif + +if !exists('g:go_fmt_options') + let g:go_fmt_options = '' +endif + +if !exists("g:go_fmt_experimental") + let g:go_fmt_experimental = 0 +endif + +" we have those problems : +" http://stackoverflow.com/questions/12741977/prevent-vim-from-updating-its-undo-tree +" http://stackoverflow.com/questions/18532692/golang-formatter-and-vim-how-to-destroy-history-record?rq=1 +" +" The below function is an improved version that aims to fix all problems. +" it doesn't undo changes and break undo history. If you are here reading +" this and have VimL experience, please look at the function for +" improvements, patches are welcome :) +function! go#fmt#Format(withGoimport) abort + if g:go_fmt_experimental == 1 + " Using winsaveview to save/restore cursor state has the problem of + " closing folds on save: + " https://github.com/fatih/vim-go/issues/502 + " One fix is to use mkview instead. Unfortunately, this sometimes causes + " other bad side effects: + " https://github.com/fatih/vim-go/issues/728 + " and still closes all folds if foldlevel>0: + " https://github.com/fatih/vim-go/issues/732 + let l:curw = {} + try + mkview! + catch + let l:curw = winsaveview() + endtry + + " save our undo file to be restored after we are done. This is needed to + " prevent an additional undo jump due to BufWritePre auto command and also + " restore 'redo' history because it's getting being destroyed every + " BufWritePre + let tmpundofile = tempname() + exe 'wundo! ' . tmpundofile + else + " Save cursor position and many other things. + let l:curw = winsaveview() + endif + + " Write current unsaved buffer to a temp file + let l:tmpname = tempname() + call writefile(getline(1, '$'), l:tmpname) + if go#util#IsWin() + let l:tmpname = tr(l:tmpname, '\', '/') + endif + + let bin_name = g:go_fmt_command + if a:withGoimport == 1 + let bin_name = g:go_goimports_bin + endif + + let out = go#fmt#run(bin_name, l:tmpname, expand('%')) + if go#util#ShellError() == 0 + call go#fmt#update_file(l:tmpname, expand('%')) + elseif g:go_fmt_fail_silently == 0 + let errors = s:parse_errors(out) + call s:show_errors(errors) + endif + + " We didn't use the temp file, so clean up + call delete(l:tmpname) + + if g:go_fmt_experimental == 1 + " restore our undo history + silent! exe 'rundo ' . tmpundofile + call delete(tmpundofile) + + " Restore our cursor/windows positions, folds, etc. + if empty(l:curw) + silent! loadview + else + call winrestview(l:curw) + endif + else + " Restore our cursor/windows positions. + call winrestview(l:curw) + endif +endfunction + +" update_file updates the target file with the given formatted source +function! go#fmt#update_file(source, target) + " remove undo point caused via BufWritePre + try | silent undojoin | catch | endtry + + let old_fileformat = &fileformat + if exists("*getfperm") + " save file permissions + let original_fperm = getfperm(a:target) + endif + + call rename(a:source, a:target) + + " restore file permissions + if exists("*setfperm") && original_fperm != '' + call setfperm(a:target , original_fperm) + endif + + " reload buffer to reflect latest changes + silent! edit! + + let &fileformat = old_fileformat + let &syntax = &syntax + + " clean up previous location list + let l:listtype = "locationlist" + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) +endfunction + +" run runs the gofmt/goimport command for the given source file and returns +" the the output of the executed command. Target is the real file to be +" formated. +function! go#fmt#run(bin_name, source, target) + let cmd = s:fmt_cmd(a:bin_name, a:source, a:target) + if cmd[0] == "goimports" + " change GOPATH too, so goimports can pick up the correct library + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + endif + + let command = join(cmd, " ") + + " execute our command... + let out = go#util#System(command) + + if cmd[0] == "goimports" + let $GOPATH = old_gopath + endif + + return out +endfunction + +" fmt_cmd returns a dict that contains the command to execute gofmt (or +" goimports). args is dict with +function! s:fmt_cmd(bin_name, source, target) + " check if the user has installed command binary. + " For example if it's goimports, let us check if it's installed, + " if not the user get's a warning via go#path#CheckBinPath() + let bin_path = go#path#CheckBinPath(a:bin_name) + if empty(bin_path) + return + endif + + " start constructing the command + let cmd = [bin_path] + call add(cmd, "-w") + + if a:bin_name != "goimports" + call extend(cmd, split(g:go_fmt_options, " ")) + else + " lazy check if goimports support `-srcdir`. We should eventually remove + " this in the future + if !exists('b:goimports_vendor_compatible') + let out = go#util#System(bin_path . " --help") + if out !~ "-srcdir" + call go#util#EchoWarning(printf("vim-go: goimports (%s) does not support srcdir. Update with: :GoUpdateBinaries", bin_path)) + else + let b:goimports_vendor_compatible = 1 + endif + endif + + if exists('b:goimports_vendor_compatible') && b:goimports_vendor_compatible + let ssl_save = &shellslash + set noshellslash + call extend(cmd, ["-srcdir", shellescape(fnamemodify(a:target, ":p"))]) + let &shellslash = ssl_save + endif + endif + + call add(cmd, a:source) + return cmd +endfunction + +" parse_errors parses the given errors and returns a list of parsed errors +function! s:parse_errors(content) abort + let splitted = split(a:content, '\n') + + " list of errors to be put into location list + let errors = [] + for line in splitted + let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)') + if !empty(tokens) + call add(errors,{ + \"lnum": tokens[2], + \"col": tokens[3], + \"text": tokens[4], + \ }) + endif + endfor + + return errors +endfunction + +" show_errors opens a location list and shows the given errors. If the given +" errors is empty, it closes the the location list +function! s:show_errors(errors) abort + let l:listtype = "locationlist" + if !empty(a:errors) + call go#list#Populate(l:listtype, a:errors, 'Format') + echohl Error | echomsg "Gofmt returned error" | echohl None + endif + + " this closes the window if there are no errors or it opens + " it if there is any + call go#list#Window(l:listtype, len(a:errors)) +endfunction + +function! go#fmt#ToggleFmtAutoSave() abort + if get(g:, "go_fmt_autosave", 1) + let g:go_fmt_autosave = 0 + call go#util#EchoProgress("auto fmt disabled") + return + end + + let g:go_fmt_autosave = 1 + call go#util#EchoProgress("auto fmt enabled") +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/fmt_test.vim b/.vim/bundle/vim-go/autoload/go/fmt_test.vim new file mode 100644 index 0000000..0de2933 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/fmt_test.vim @@ -0,0 +1,31 @@ +func Test_run_fmt() + let actual_file = tempname() + call writefile(readfile("test-fixtures/fmt/hello.go"), actual_file) + + let expected = join(readfile("test-fixtures/fmt/hello_golden.go"), "\n") + + " run our code + call go#fmt#run("gofmt", actual_file, "test-fixtures/fmt/hello.go") + + " this should now contain the formatted code + let actual = join(readfile(actual_file), "\n") + + call assert_equal(expected, actual) +endfunc + +func Test_update_file() + let expected = join(readfile("test-fixtures/fmt/hello_golden.go"), "\n") + let source_file = tempname() + call writefile(readfile("test-fixtures/fmt/hello_golden.go"), source_file) + + let target_file = tempname() + call writefile([""], target_file) + + " update_file now + call go#fmt#update_file(source_file, target_file) + + " this should now contain the formatted code + let actual = join(readfile(target_file), "\n") + + call assert_equal(expected, actual) +endfunc diff --git a/.vim/bundle/vim-go/autoload/go/guru.vim b/.vim/bundle/vim-go/autoload/go/guru.vim new file mode 100644 index 0000000..82db4ec --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/guru.vim @@ -0,0 +1,641 @@ +" guru.vim -- Vim integration for the Go guru. + +" guru_cmd returns a dict that contains the command to execute guru. args +" is dict with following options: +" mode : guru mode, such as 'implements' +" format : output format, either 'plain' or 'json' +" needs_scope : if 1, adds the current package to the scope +" selected : if 1, means it's a range of selection, otherwise it picks up the +" offset under the cursor +" example output: +" {'cmd' : ['guru', '-json', 'implements', 'demo/demo.go:#66']} +function! s:guru_cmd(args) range abort + let mode = a:args.mode + let format = a:args.format + let needs_scope = a:args.needs_scope + let selected = a:args.selected + + let result = {} + let dirname = expand('%:p:h') + let pkg = go#package#ImportPath(dirname) + + " this is important, check it! + if pkg == -1 && needs_scope + return {'err': "current directory is not inside of a valid GOPATH"} + endif + + "return with a warning if the binary doesn't exist + let bin_path = go#path#CheckBinPath("guru") + if empty(bin_path) + return {'err': "bin path not found"} + endif + + " start constructing the command + let cmd = [bin_path] + + let filename = fnamemodify(expand("%"), ':p:gs?\\?/?') + if &modified + let sep = go#util#LineEnding() + let content = join(getline(1, '$'), sep ) + let result.stdin_content = filename . "\n" . strlen(content) . "\n" . content + call add(cmd, "-modified") + endif + + " enable outputting in json format + if format == "json" + call add(cmd, "-json") + endif + + " check for any tags + if exists('g:go_guru_tags') + let tags = get(g:, 'go_guru_tags') + call extend(cmd, ["-tags", tags]) + let result.tags = tags + endif + + " some modes require scope to be defined (such as callers). For these we + " choose a sensible setting, which is using the current file's package + let scopes = [] + if needs_scope + let scopes = [pkg] + endif + + " check for any user defined scope setting. users can define the scope, + " in package pattern form. examples: + " golang.org/x/tools/cmd/guru # a single package + " golang.org/x/tools/... # all packages beneath dir + " ... # the entire workspace. + if exists('g:go_guru_scope') + " check that the setting is of type list + if type(get(g:, 'go_guru_scope')) != type([]) + return {'err' : "go_guru_scope should of type list"} + endif + + let scopes = get(g:, 'go_guru_scope') + endif + + " now add the scope to our command if there is any + if !empty(scopes) + " strip trailing slashes for each path in scoped. bug: + " https://github.com/golang/go/issues/14584 + let scopes = go#util#StripTrailingSlash(scopes) + + " create shell-safe entries of the list + if !go#util#has_job() | let scopes = go#util#Shelllist(scopes) | endif + + " guru expect a comma-separated list of patterns, construct it + let l:scope = join(scopes, ",") + let result.scope = l:scope + call extend(cmd, ["-scope", l:scope]) + endif + + let pos = printf("#%s", go#util#OffsetCursor()) + if selected != -1 + " means we have a range, get it + let pos1 = go#util#Offset(line("'<"), col("'<")) + let pos2 = go#util#Offset(line("'>"), col("'>")) + let pos = printf("#%s,#%s", pos1, pos2) + endif + + let filename .= ':'.pos + call extend(cmd, [mode, filename]) + + let result.cmd = cmd + return result +endfunction + +" sync_guru runs guru in sync mode with the given arguments +function! s:sync_guru(args) abort + let result = s:guru_cmd(a:args) + if has_key(result, 'err') + call go#util#EchoError(result.err) + return -1 + endif + + if !has_key(a:args, 'disable_progress') + if a:args.needs_scope + call go#util#EchoProgress("analysing with scope ". result.scope . " ...") + elseif a:args.mode !=# 'what' + " the query might take time, let us give some feedback + call go#util#EchoProgress("analysing ...") + endif + endif + + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + + " run, forrest run!!! + let command = join(result.cmd, " ") + if has_key(result, 'stdin_content') + let out = go#util#System(command, result.stdin_content) + else + let out = go#util#System(command) + endif + + let $GOPATH = old_gopath + + if has_key(a:args, 'custom_parse') + call a:args.custom_parse(go#util#ShellError(), out) + else + call s:parse_guru_output(go#util#ShellError(), out, a:args.mode) + endif + + return out +endfunc + +" async_guru runs guru in async mode with the given arguments +function! s:async_guru(args) abort + let result = s:guru_cmd(a:args) + if has_key(result, 'err') + call go#util#EchoError(result.err) + return + endif + + let status_dir = expand('%:p:h') + let statusline_type = printf("%s", a:args.mode) + + if !has_key(a:args, 'disable_progress') + if a:args.needs_scope + call go#util#EchoProgress("analysing with scope ". result.scope . " ...") + endif + endif + + function! s:close_cb(chan) closure + let messages = [] + while ch_status(a:chan, {'part': 'out'}) == 'buffered' + let msg = ch_read(a:chan, {'part': 'out'}) + call add(messages, msg) + endwhile + + while ch_status(a:chan, {'part': 'err'}) == 'buffered' + let msg = ch_read(a:chan, {'part': 'err'}) + call add(messages, msg) + endwhile + + let l:job = ch_getjob(a:chan) + let l:info = job_info(l:job) + + let out = join(messages, "\n") + + let status = { + \ 'desc': 'last status', + \ 'type': statusline_type, + \ 'state': "finished", + \ } + + if l:info.exitval + let status.state = "failed" + endif + + call go#statusline#Update(status_dir, status) + + if has_key(a:args, 'custom_parse') + call a:args.custom_parse(l:info.exitval, out) + else + call s:parse_guru_output(l:info.exitval, out, a:args.mode) + endif + endfunction + + let start_options = { + \ 'close_cb': funcref("s:close_cb"), + \ } + + if has_key(result, 'stdin_content') + let l:tmpname = tempname() + call writefile(split(result.stdin_content, "\n"), l:tmpname, "b") + let l:start_options.in_io = "file" + let l:start_options.in_name = l:tmpname + endif + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': statusline_type, + \ 'state': "analysing", + \}) + + return job_start(result.cmd, start_options) +endfunc + +" run_guru runs the given guru argument +function! s:run_guru(args) abort + if go#util#has_job() + return s:async_guru(a:args) + endif + + return s:sync_guru(a:args) +endfunction + +" Show 'implements' relation for selected package +function! go#guru#Implements(selected) abort + let args = { + \ 'mode': 'implements', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +" Report the possible constants, global variables, and concrete types that may +" appear in a value of type error +function! go#guru#Whicherrs(selected) abort + let args = { + \ 'mode': 'whicherrs', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + + " TODO(arslan): handle empty case for both sync/async + " if empty(out.out) + " call go#util#EchoSuccess("no error variables found. Try to change the scope with :GoGuruScope") + " return + " endif + call s:run_guru(args) +endfunction + +" Describe selected syntax: definition, methods, etc +function! go#guru#Describe(selected) abort + let args = { + \ 'mode': 'describe', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +function! go#guru#DescribeInfo() abort + " json_encode() and friends are introduced with this patch (7.4.1304) + " vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ + " nvim: https://github.com/neovim/neovim/pull/4131 + if !exists("*json_decode") + call go#util#EchoError("requires 'json_decode'. Update your Vim/Neovim version.") + return + endif + + function! s:info(exit_val, output) + if a:exit_val != 0 + return + endif + + if a:output[0] !=# '{' + return + endif + + if empty(a:output) || type(a:output) != type("") + return + endif + + let result = json_decode(a:output) + if type(result) != type({}) + call go#util#EchoError(printf("malformed output from guru: %s", a:output)) + return + endif + + if !has_key(result, 'detail') + " if there is no detail check if there is a description and print it + if has_key(result, "desc") + call go#util#EchoInfo(result["desc"]) + return + endif + + call go#util#EchoError("detail key is missing. Please open a bug report on vim-go repo.") + return + endif + + let detail = result['detail'] + let info = "" + + " guru gives different information based on the detail mode. Let try to + " extract the most useful information + + if detail == "value" + if !has_key(result, 'value') + call go#util#EchoError("value key is missing. Please open a bug report on vim-go repo.") + return + endif + + let val = result["value"] + if !has_key(val, 'type') + call go#util#EchoError("type key is missing (value.type). Please open a bug report on vim-go repo.") + return + endif + + let info = val["type"] + elseif detail == "type" + if !has_key(result, 'type') + call go#util#EchoError("type key is missing. Please open a bug report on vim-go repo.") + return + endif + + let type = result["type"] + if !has_key(type, 'type') + call go#util#EchoError("type key is missing (type.type). Please open a bug report on vim-go repo.") + return + endif + + let info = type["type"] + elseif detail == "package" + if !has_key(result, 'package') + call go#util#EchoError("package key is missing. Please open a bug report on vim-go repo.") + return + endif + + let package = result["package"] + if !has_key(package, 'path') + call go#util#EchoError("path key is missing (package.path). Please open a bug report on vim-go repo.") + return + endif + + let info = printf("package %s", package["path"]) + elseif detail == "unknown" + let info = result["desc"] + else + call go#util#EchoError(printf("unknown detail mode found '%s'. Please open a bug report on vim-go repo", detail)) + return + endif + + call go#util#EchoInfo(info) + endfunction + + let args = { + \ 'mode': 'describe', + \ 'format': 'json', + \ 'selected': -1, + \ 'needs_scope': 1, + \ 'custom_parse': function('s:info'), + \ 'disable_progress': 1, + \ } + + call s:run_guru(args) +endfunction + +" Show possible targets of selected function call +function! go#guru#Callees(selected) abort + let args = { + \ 'mode': 'callees', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +" Show possible callers of selected function +function! go#guru#Callers(selected) abort + let args = { + \ 'mode': 'callers', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +" Show path from callgraph root to selected function +function! go#guru#Callstack(selected) abort + let args = { + \ 'mode': 'callstack', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +" Show free variables of selection +function! go#guru#Freevars(selected) abort + " Freevars requires a selection + if a:selected == -1 + call go#util#EchoError("GoFreevars requires a selection (range) of code") + return + endif + + let args = { + \ 'mode': 'freevars', + \ 'format': 'plain', + \ 'selected': 1, + \ 'needs_scope': 0, + \ } + + call s:run_guru(args) +endfunction + +" Show send/receive corresponding to selected channel op +function! go#guru#ChannelPeers(selected) abort + let args = { + \ 'mode': 'peers', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 1, + \ } + + call s:run_guru(args) +endfunction + +" Show all refs to entity denoted by selected identifier +function! go#guru#Referrers(selected) abort + let args = { + \ 'mode': 'referrers', + \ 'format': 'plain', + \ 'selected': a:selected, + \ 'needs_scope': 0, + \ } + + call s:run_guru(args) +endfunction + +function! go#guru#SameIdsTimer() abort + call timer_start(200, function('go#guru#SameIds'), {'repeat': -1}) +endfunction + +function! go#guru#SameIds() abort + " we use matchaddpos() which was introduce with 7.4.330, be sure we have + " it: http://ftp.vim.org/vim/patches/7.4/7.4.330 + if !exists("*matchaddpos") + call go#util#EchoError("GoSameIds requires 'matchaddpos'. Update your Vim/Neovim version.") + return + endif + + " json_encode() and friends are introduced with this patch (7.4.1304) + " vim: https://groups.google.com/d/msg/vim_dev/vLupTNhQhZ8/cDGIk0JEDgAJ + " nvim: https://github.com/neovim/neovim/pull/4131 + if !exists("*json_decode") + call go#util#EchoError("GoSameIds requires 'json_decode'. Update your Vim/Neovim version.") + return + endif + + let args = { + \ 'mode': 'what', + \ 'format': 'json', + \ 'selected': -1, + \ 'needs_scope': 0, + \ 'custom_parse': function('s:same_ids_highlight'), + \ } + + call s:run_guru(args) +endfunction + +function! s:same_ids_highlight(exit_val, output) abort + call go#guru#ClearSameIds() " run after calling guru to reduce flicker. + + if a:output[0] !=# '{' + if !get(g:, 'go_auto_sameids', 0) + call go#util#EchoError(a:output) + endif + return + endif + + let result = json_decode(a:output) + if type(result) != type({}) && !get(g:, 'go_auto_sameids', 0) + call go#util#EchoError("malformed output from guru") + return + endif + + if !has_key(result, 'sameids') + if !get(g:, 'go_auto_sameids', 0) + call go#util#EchoError("no same_ids founds for the given identifier") + endif + return + endif + + let poslen = 0 + for enclosing in result['enclosing'] + if enclosing['desc'] == 'identifier' + let poslen = enclosing['end'] - enclosing['start'] + break + endif + endfor + + " return when there's no identifier to highlight. + if poslen == 0 + return + endif + + let same_ids = result['sameids'] + " highlight the lines + for item in same_ids + let pos = split(item, ':') + call matchaddpos('goSameId', [[str2nr(pos[-2]), str2nr(pos[-1]), str2nr(poslen)]]) + endfor + + if get(g:, "go_auto_sameids", 0) + " re-apply SameIds at the current cursor position at the time the buffer + " is redisplayed: e.g. :edit, :GoRename, etc. + autocmd BufWinEnter nested call go#guru#SameIds() + endif +endfunction + +function! go#guru#ClearSameIds() abort + let m = getmatches() + for item in m + if item['group'] == 'goSameId' + call matchdelete(item['id']) + endif + endfor + + " remove the autocmds we defined + if exists("#BufWinEnter#") + autocmd! BufWinEnter + endif +endfunction + +function! go#guru#ToggleSameIds() abort + if len(getmatches()) != 0 + call go#guru#ClearSameIds() + else + call go#guru#SameIds() + endif +endfunction + +function! go#guru#AutoToogleSameIds() abort + if get(g:, "go_auto_sameids", 0) + call go#util#EchoProgress("sameids auto highlighting disabled") + call go#guru#ClearSameIds() + let g:go_auto_sameids = 0 + return + endif + + call go#util#EchoSuccess("sameids auto highlighting enabled") + let g:go_auto_sameids = 1 +endfunction + + +"""""""""""""""""""""""""""""""""""""""" +"" HELPER FUNCTIONS +"""""""""""""""""""""""""""""""""""""""" + +" This uses Vim's errorformat to parse the output from Guru's 'plain output +" and put it into location list. I believe using errorformat is much more +" easier to use. If we need more power we can always switch back to parse it +" via regex. Match two possible styles of errorformats: +" +" 'file:line.col-line2.col2: message' +" 'file:line:col: message' +" +" We discard line2 and col2 for the first errorformat, because it's not +" useful and location only has the ability to show one line and column +" number +function! s:parse_guru_output(exit_val, output, title) abort + if a:exit_val + call go#util#EchoError(a:output) + return + endif + + let old_errorformat = &errorformat + let errformat = "%f:%l.%c-%[%^:]%#:\ %m,%f:%l:%c:\ %m" + call go#list#ParseFormat("locationlist", errformat, a:output, a:title) + let &errorformat = old_errorformat + + let errors = go#list#Get("locationlist") + call go#list#Window("locationlist", len(errors)) +endfun + +function! go#guru#Scope(...) abort + if a:0 + if a:0 == 1 && a:1 == '""' + unlet g:go_guru_scope + call go#util#EchoSuccess("guru scope is cleared") + else + let g:go_guru_scope = a:000 + call go#util#EchoSuccess("guru scope changed to: ". join(a:000, ",")) + endif + + return + endif + + if !exists('g:go_guru_scope') + call go#util#EchoError("guru scope is not set") + else + call go#util#EchoSuccess("current guru scope: ". join(g:go_guru_scope, ",")) + endif +endfunction + +function! go#guru#Tags(...) abort + if a:0 + if a:0 == 1 && a:1 == '""' + unlet g:go_guru_tags + call go#util#EchoSuccess("guru tags is cleared") + else + let g:go_guru_tags = a:1 + call go#util#EchoSuccess("guru tags changed to: ". a:1) + endif + + return + endif + + if !exists('g:go_guru_tags') + call go#util#EchoSuccess("guru tags is not set") + else + call go#util#EchoSuccess("current guru tags: ". a:1) + endif +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/impl.vim b/.vim/bundle/vim-go/autoload/go/impl.vim new file mode 100644 index 0000000..139dba7 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/impl.vim @@ -0,0 +1,126 @@ +function! go#impl#Impl(...) abort + let binpath = go#path#CheckBinPath('impl') + if empty(binpath) + return + endif + + let recv = "" + let iface = "" + + if a:0 == 0 + " user didn't passed anything, just called ':GoImpl' + let receiveType = expand("") + let recv = printf("%s *%s", tolower(receiveType)[0], receiveType) + let iface = input("vim-go: generating method stubs for interface: ") + redraw! + if empty(iface) + call go#util#EchoError('usage: interface type is not provided') + return + endif + elseif a:0 == 1 + " we assume the user only passed the interface type, + " i.e: ':GoImpl io.Writer' + let receiveType = expand("") + let recv = printf("%s *%s", tolower(receiveType)[0], receiveType) + let iface = a:1 + elseif a:0 > 2 + " user passed receiver and interface type both, + " i.e: 'GoImpl f *Foo io.Writer' + let recv = join(a:000[:-2], ' ') + let iface = a:000[-1] + else + call go#util#EchoError('usage: GoImpl {receiver} {interface}') + return + endif + + let result = go#util#System(printf("%s '%s' '%s'", binpath, recv, iface)) + if go#util#ShellError() != 0 + call go#util#EchoError(result) + return + endif + + if result ==# '' + return + end + + let pos = getpos('.') + put ='' + put =result + call setpos('.', pos) +endfunction + +if exists('*uniq') + function! s:uniq(list) + return uniq(a:list) + endfunction +else + " Note: Believe that the list is sorted + function! s:uniq(list) + let i = len(a:list) - 1 + while 0 < i + if a:list[i-1] ==# a:list[i] + call remove(a:list, i) + let i -= 2 + else + let i -= 1 + endif + endwhile + return a:list + endfunction +endif + +function! s:root_dirs() abort + let dirs = [] + let root = go#util#goroot() + if root !=# '' && isdirectory(root) + call add(dirs, root) + endif + + let paths = map(split(go#util#gopath(), go#util#PathListSep()), "substitute(v:val, '\\\\', '/', 'g')") + if go#util#ShellError() + return [] + endif + + if !empty(filter(paths, 'isdirectory(v:val)')) + call extend(dirs, paths) + endif + + return dirs +endfunction + +function! s:go_packages(dirs) abort + let pkgs = [] + for d in a:dirs + let pkg_root = expand(d . '/pkg/' . go#util#osarch()) + call extend(pkgs, split(globpath(pkg_root, '**/*.a', 1), "\n")) + endfor + return map(pkgs, "fnamemodify(v:val, ':t:r')") +endfunction + +function! s:interface_list(pkg) abort + let contents = split(go#util#System('go doc ' . a:pkg), "\n") + if go#util#ShellError() + return [] + endif + + call filter(contents, 'v:val =~# ''^type\s\+\h\w*\s\+interface''') + return map(contents, 'a:pkg . "." . matchstr(v:val, ''^type\s\+\zs\h\w*\ze\s\+interface'')') +endfunction + +" Complete package and interface for {interface} +function! go#impl#Complete(arglead, cmdline, cursorpos) abort + let words = split(a:cmdline, '\s\+', 1) + if words[-1] ==# '' + return s:uniq(sort(s:go_packages(s:root_dirs()))) + elseif words[-1] =~# '^\h\w*$' + return s:uniq(sort(filter(s:go_packages(s:root_dirs()), 'stridx(v:val, words[-1]) == 0'))) + elseif words[-1] =~# '^\h\w*\.\%(\h\w*\)\=$' + let [pkg, interface] = split(words[-1], '\.', 1) + echomsg pkg + return s:uniq(sort(filter(s:interface_list(pkg), 'v:val =~? words[-1]'))) + else + return [] + endif +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/import.vim b/.vim/bundle/vim-go/autoload/go/import.vim new file mode 100644 index 0000000..8d9e8d4 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/import.vim @@ -0,0 +1,213 @@ +" Copyright 2011 The Go Authors. All rights reserved. +" Use of this source code is governed by a BSD-style +" license that can be found in the LICENSE file. +" +" Check out the docs for more information at /doc/vim-go.txt +" +function! go#import#SwitchImport(enabled, localname, path, bang) abort + let view = winsaveview() + let path = substitute(a:path, '^\s*\(.\{-}\)\s*$', '\1', '') + + " Quotes are not necessary, so remove them if provided. + if path[0] == '"' + let path = strpart(path, 1) + endif + if path[len(path)-1] == '"' + let path = strpart(path, 0, len(path) - 1) + endif + + " if given a trailing slash, eg. `github.com/user/pkg/`, remove it + if path[len(path)-1] == '/' + let path = strpart(path, 0, len(path) - 1) + endif + + if path == '' + call s:Error('Import path not provided') + return + endif + + if a:bang == "!" + let out = go#util#System("go get -u -v ".shellescape(path)) + if go#util#ShellError() != 0 + call s:Error("Can't find import: " . path . ":" . out) + endif + endif + let exists = go#tool#Exists(path) + if exists == -1 + call s:Error("Can't find import: " . path) + return + endif + + " Extract any site prefix (e.g. github.com/). + " If other imports with the same prefix are grouped separately, + " we will add this new import with them. + " Only up to and including the first slash is used. + let siteprefix = matchstr(path, "^[^/]*/") + + let qpath = '"' . path . '"' + if a:localname != '' + let qlocalpath = a:localname . ' ' . qpath + else + let qlocalpath = qpath + endif + let indentstr = 0 + let packageline = -1 " Position of package name statement + let appendline = -1 " Position to introduce new import + let deleteline = -1 " Position of line with existing import + let linesdelta = 0 " Lines added/removed + + " Find proper place to add/remove import. + let line = 0 + while line <= line('$') + let linestr = getline(line) + + if linestr =~# '^package\s' + let packageline = line + let appendline = line + + elseif linestr =~# '^import\s\+(' + let appendstr = qlocalpath + let indentstr = 1 + let appendline = line + let firstblank = -1 + let lastprefix = "" + while line <= line("$") + let line = line + 1 + let linestr = getline(line) + let m = matchlist(getline(line), '^\()\|\(\s\+\)\(\S*\s*\)"\(.\+\)"\)') + if empty(m) + if siteprefix == "" && a:enabled + " must be in the first group + break + endif + " record this position, but keep looking + if firstblank < 0 + let firstblank = line + endif + continue + endif + if m[1] == ')' + " if there's no match, add it to the first group + if appendline < 0 && firstblank >= 0 + let appendline = firstblank + endif + break + endif + let lastprefix = matchstr(m[4], "^[^/]*/") + if a:localname != '' && m[3] != '' + let qlocalpath = printf('%-' . (len(m[3])-1) . 's %s', a:localname, qpath) + endif + let appendstr = m[2] . qlocalpath + let indentstr = 0 + if m[4] == path + let appendline = -1 + let deleteline = line + break + elseif m[4] < path + " don't set candidate position if we have a site prefix, + " we've passed a blank line, and this doesn't share the same + " site prefix. + if siteprefix == "" || firstblank < 0 || match(m[4], "^" . siteprefix) >= 0 + let appendline = line + endif + elseif siteprefix != "" && match(m[4], "^" . siteprefix) >= 0 + " first entry of site group + let appendline = line - 1 + break + endif + endwhile + break + + elseif linestr =~# '^import ' + if appendline == packageline + let appendstr = 'import ' . qlocalpath + let appendline = line - 1 + endif + let m = matchlist(linestr, '^import\(\s\+\)\(\S*\s*\)"\(.\+\)"') + if !empty(m) + if m[3] == path + let appendline = -1 + let deleteline = line + break + endif + if m[3] < path + let appendline = line + endif + if a:localname != '' && m[2] != '' + let qlocalpath = printf("%s %" . len(m[2])-1 . "s", a:localname, qpath) + endif + let appendstr = 'import' . m[1] . qlocalpath + endif + + elseif linestr =~# '^\(var\|const\|type\|func\)\>' + break + + endif + let line = line + 1 + endwhile + + " Append or remove the package import, as requested. + if a:enabled + if deleteline != -1 + call s:Error(qpath . ' already being imported') + elseif appendline == -1 + call s:Error('No package line found') + else + if appendline == packageline + call append(appendline + 0, '') + call append(appendline + 1, 'import (') + call append(appendline + 2, ')') + let appendline += 2 + let linesdelta += 3 + let appendstr = qlocalpath + let indentstr = 1 + endif + call append(appendline, appendstr) + execute appendline + 1 + if indentstr + execute 'normal! >>' + endif + let linesdelta += 1 + endif + else + if deleteline == -1 + call s:Error(qpath . ' not being imported') + else + execute deleteline . 'd' + let linesdelta -= 1 + + if getline(deleteline-1) =~# '^import\s\+(' && getline(deleteline) =~# '^)' + " Delete empty import block + let deleteline -= 1 + execute deleteline . "d" + execute deleteline . "d" + let linesdelta -= 2 + endif + + if getline(deleteline) == '' && getline(deleteline - 1) == '' + " Delete spacing for removed line too. + execute deleteline . "d" + let linesdelta -= 1 + endif + endif + endif + + " Adjust view for any changes. + let view.lnum += linesdelta + let view.topline += linesdelta + if view.topline < 0 + let view.topline = 0 + endif + + " Put buffer back where it was. + call winrestview(view) + +endfunction + + +function! s:Error(s) abort + echohl Error | echo a:s | echohl None +endfunction + + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/job.vim b/.vim/bundle/vim-go/autoload/go/job.vim new file mode 100644 index 0000000..e60b2b4 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/job.vim @@ -0,0 +1,109 @@ +" Spawn returns callbacks to be used with job_start. It's abstracted to be +" used with various go command, such as build, test, install, etc.. This avoid +" us to write the same callback over and over for some commands. It's fully +" customizable so each command can change it to it's own logic. +function go#job#Spawn(args) + let cbs = { + \ 'winnr': winnr(), + \ 'dir': getcwd(), + \ 'jobdir': fnameescape(expand("%:p:h")), + \ 'messages': [], + \ 'args': a:args.cmd, + \ 'bang': 0, + \ } + + if has_key(a:args, 'bang') + let cbs.bang = a:args.bang + endif + + " add final callback to be called if async job is finished + " The signature should be in form: func(job, exit_status, messages) + if has_key(a:args, 'custom_cb') + let cbs.custom_cb = a:args.custom_cb + endif + + if has_key(a:args, 'error_info_cb') + let cbs.error_info_cb = a:args.error_info_cb + endif + + function cbs.callback(chan, msg) dict + call add(self.messages, a:msg) + endfunction + + function cbs.close_cb(chan) dict + let l:job = ch_getjob(a:chan) + let l:status = job_status(l:job) + + " the job might be in fail status, we assume by default it's failed. + " However if it's dead, we can use the real exitval + let exitval = 1 + if l:status == "dead" + let l:info = job_info(l:job) + let exitval = l:info.exitval + endif + + if has_key(self, 'custom_cb') + call self.custom_cb(l:job, exitval, self.messages) + endif + + if has_key(self, 'error_info_cb') + call self.error_info_cb(l:job, exitval, self.messages) + endif + + if get(g:, 'go_echo_command_info', 1) + if exitval == 0 + call go#util#EchoSuccess("SUCCESS") + else + call go#util#EchoError("FAILED") + endif + endif + + let l:listtype = go#list#Type("quickfix") + if exitval == 0 + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + return + endif + + call self.show_errors(l:listtype) + endfunction + + function cbs.show_errors(listtype) dict + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + try + execute cd self.jobdir + let errors = go#tool#ParseErrors(self.messages) + let errors = go#tool#FilterValids(errors) + finally + execute cd . fnameescape(self.dir) + endtry + + if !len(errors) + " failed to parse errors, output the original content + call go#util#EchoError(join(self.messages, " ")) + call go#util#EchoError(self.dir) + return + endif + + if self.winnr == winnr() + call go#list#Populate(a:listtype, errors, join(self.args)) + call go#list#Window(a:listtype, len(errors)) + if !empty(errors) && !self.bang + call go#list#JumpToFirst(a:listtype) + endif + endif + endfunction + + " override callback handler if user provided it + if has_key(a:args, 'callback') + let cbs.callback = a:args.callback + endif + + " override close callback handler if user provided it + if has_key(a:args, 'close_cb') + let cbs.close_cb = a:args.close_cb + endif + + return cbs +endfunction +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/jobcontrol.vim b/.vim/bundle/vim-go/autoload/go/jobcontrol.vim new file mode 100644 index 0000000..189ed5f --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/jobcontrol.vim @@ -0,0 +1,161 @@ +" s:jobs is a global reference to all jobs started with Spawn() or with the +" internal function s:spawn +let s:jobs = {} + +" s:handlers is a global event handlers for all jobs started with Spawn() or +" with the internal function s:spawn +let s:handlers = {} + +" Spawn is a wrapper around s:spawn. It can be executed by other files and +" scripts if needed. Desc defines the description for printing the status +" during the job execution (useful for statusline integration). +function! go#jobcontrol#Spawn(bang, desc, args) abort + " autowrite is not enabled for jobs + call go#cmd#autowrite() + + let job = s:spawn(a:bang, a:desc, a:args) + return job.id +endfunction + +" AddHandler adds a on_exit callback handler and returns the id. +function! go#jobcontrol#AddHandler(handler) abort + let i = len(s:handlers) + while has_key(s:handlers, string(i)) + let i += 1 + break + endwhile + let s:handlers[string(i)] = a:handler + return string(i) +endfunction + +" RemoveHandler removes a callback handler by id. +function! go#jobcontrol#RemoveHandler(id) abort + unlet s:handlers[a:id] +endfunction + +" spawn spawns a go subcommand with the name and arguments with jobstart. Once +" a job is started a reference will be stored inside s:jobs. spawn changes the +" GOPATH when g:go_autodetect_gopath is enabled. The job is started inside the +" current files folder. +function! s:spawn(bang, desc, args) abort + let job = { + \ 'desc': a:desc, + \ 'bang': a:bang, + \ 'winnr': winnr(), + \ 'importpath': go#package#ImportPath(expand('%:p:h')), + \ 'state': "RUNNING", + \ 'stderr' : [], + \ 'stdout' : [], + \ 'on_stdout': function('s:on_stdout'), + \ 'on_stderr': function('s:on_stderr'), + \ 'on_exit' : function('s:on_exit'), + \ } + + " modify GOPATH if needed + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + + " execute go build in the files directory + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + + " cleanup previous jobs for this file + for jb in values(s:jobs) + if jb.importpath == job.importpath + unlet s:jobs[jb.id] + endif + endfor + + let dir = getcwd() + let jobdir = fnameescape(expand("%:p:h")) + execute cd . jobdir + + " append the subcommand, such as 'build' + let argv = ['go'] + a:args + + " run, forrest, run! + let id = jobstart(argv, job) + let job.id = id + let job.dir = jobdir + let s:jobs[id] = job + + execute cd . fnameescape(dir) + + " restore back GOPATH + let $GOPATH = old_gopath + + return job +endfunction + +" on_exit is the exit handler for jobstart(). It handles cleaning up the job +" references and also displaying errors in the quickfix window collected by +" on_stderr handler. If there are no errors and a quickfix window is open, +" it'll be closed. +function! s:on_exit(job_id, exit_status, event) dict abort + let std_combined = self.stderr + self.stdout + + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + execute cd self.dir + + call s:callback_handlers_on_exit(s:jobs[a:job_id], a:exit_status, std_combined) + + let l:listtype = go#list#Type("quickfix") + if a:exit_status == 0 + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + + let self.state = "SUCCESS" + call go#util#EchoSuccess("SUCCESS") + + execute cd . fnameescape(dir) + return + endif + + let self.state = "FAILED" + call go#util#EchoError("FAILED") + + let errors = go#tool#ParseErrors(std_combined) + let errors = go#tool#FilterValids(errors) + + execute cd . fnameescape(dir) + + if !len(errors) + " failed to parse errors, output the original content + call go#util#EchoError(std_combined[0]) + return + endif + + " if we are still in the same windows show the list + if self.winnr == winnr() + call go#list#Populate(l:listtype, errors, self.desc) + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !self.bang + call go#list#JumpToFirst(l:listtype) + endif + endif +endfunction + +" callback_handlers_on_exit runs all handlers for job on exit event. +function! s:callback_handlers_on_exit(job, exit_status, data) abort + if empty(s:handlers) + return + endif + + for s:handler in values(s:handlers) + call s:handler(a:job, a:exit_status, a:data) + endfor +endfunction + +" on_stdout is the stdout handler for jobstart(). It collects the output of +" stderr and stores them to the jobs internal stdout list. +function! s:on_stdout(job_id, data) dict abort + call extend(self.stdout, a:data) +endfunction + +" on_stderr is the stderr handler for jobstart(). It collects the output of +" stderr and stores them to the jobs internal stderr list. +function! s:on_stderr(job_id, data) dict abort + call extend(self.stderr, a:data) +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/lint.vim b/.vim/bundle/vim-go/autoload/go/lint.vim new file mode 100644 index 0000000..c62f252 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/lint.vim @@ -0,0 +1,312 @@ +if !exists("g:go_metalinter_command") + let g:go_metalinter_command = "" +endif + +if !exists("g:go_metalinter_autosave_enabled") + let g:go_metalinter_autosave_enabled = ['vet', 'golint'] +endif + +if !exists("g:go_metalinter_enabled") + let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck'] +endif + +if !exists("g:go_golint_bin") + let g:go_golint_bin = "golint" +endif + +if !exists("g:go_errcheck_bin") + let g:go_errcheck_bin = "errcheck" +endif + +function! go#lint#Gometa(autosave, ...) abort + if a:0 == 0 + let goargs = shellescape(expand('%:p:h')) + else + let goargs = go#util#Shelljoin(a:000) + endif + + let bin_path = go#path#CheckBinPath("gometalinter") + if empty(bin_path) + return + endif + + let cmd = [bin_path] + let cmd += ["--disable-all"] + + if a:autosave || empty(g:go_metalinter_command) + " linters + let linters = a:autosave ? g:go_metalinter_autosave_enabled : g:go_metalinter_enabled + for linter in linters + let cmd += ["--enable=".linter] + endfor + + " path + let cmd += [expand('%:p:h')] + else + " the user wants something else, let us use it. + let cmd += split(g:go_metalinter_command, " ") + endif + + " gometalinter has a default deadline of 5 seconds. + " + " For async mode (s:lint_job), we want to override the default deadline only + " if we have a deadline configured. + " + " For sync mode (go#tool#ExecuteInDir), always explicitly pass the 5 seconds + " deadline if there is no other deadline configured. If a deadline is + " configured, then use it. + + " Call gometalinter asynchronously. + if go#util#has_job() && has('lambda') + let deadline = get(g:, 'go_metalinter_deadline', 0) + if deadline != 0 + let cmd += ["--deadline=" . deadline] + endif + + call s:lint_job({'cmd': cmd}) + return + endif + + " We're calling gometalinter synchronously. + + let cmd += ["--deadline=" . get(g:, 'go_metalinter_deadline', "5s")] + + if a:autosave + " include only messages for the active buffer + let cmd += ["--include='^" . expand('%:p') . ".*$'"] + endif + + + let meta_command = join(cmd, " ") + + let out = go#tool#ExecuteInDir(meta_command) + + let l:listtype = "quickfix" + if go#util#ShellError() == 0 + redraw | echo + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + echon "vim-go: " | echohl Function | echon "[metalinter] PASS" | echohl None + else + " GoMetaLinter can output one of the two, so we look for both: + " ::[]: () + " ::: () + " This can be defined by the following errorformat: + let errformat = "%f:%l:%c:%t%*[^:]:\ %m,%f:%l::%t%*[^:]:\ %m" + + " Parse and populate our location list + call go#list#ParseFormat(l:listtype, errformat, split(out, "\n"), 'GoMetaLinter') + + let errors = go#list#Get(l:listtype) + call go#list#Window(l:listtype, len(errors)) + + if !a:autosave + call go#list#JumpToFirst(l:listtype) + endif + endif +endfunction + +" Golint calls 'golint' on the current directory. Any warnings are populated in +" the location list +function! go#lint#Golint(...) abort + let bin_path = go#path#CheckBinPath(g:go_golint_bin) + if empty(bin_path) + return + endif + + if a:0 == 0 + let goargs = shellescape(expand('%')) + else + let goargs = go#util#Shelljoin(a:000) + endif + + let out = go#util#System(bin_path . " " . goargs) + if empty(out) + echon "vim-go: " | echohl Function | echon "[lint] PASS" | echohl None + return + endif + + let l:listtype = "quickfix" + call go#list#Parse(l:listtype, out) + let errors = go#list#Get(l:listtype) + call go#list#Window(l:listtype, len(errors)) + call go#list#JumpToFirst(l:listtype) +endfunction + +" Vet calls 'go vet' on the current directory. Any warnings are populated in +" the location list +function! go#lint#Vet(bang, ...) abort + call go#cmd#autowrite() + echon "vim-go: " | echohl Identifier | echon "calling vet..." | echohl None + if a:0 == 0 + let out = go#tool#ExecuteInDir('go vet') + else + let out = go#tool#ExecuteInDir('go tool vet ' . go#util#Shelljoin(a:000)) + endif + + let l:listtype = "quickfix" + if go#util#ShellError() != 0 + let errors = go#tool#ParseErrors(split(out, '\n')) + call go#list#Populate(l:listtype, errors, 'Vet') + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) + endif + echon "vim-go: " | echohl ErrorMsg | echon "[vet] FAIL" | echohl None + else + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + redraw | echon "vim-go: " | echohl Function | echon "[vet] PASS" | echohl None + endif +endfunction + +" ErrCheck calls 'errcheck' for the given packages. Any warnings are populated in +" the location list +function! go#lint#Errcheck(...) abort + if a:0 == 0 + let goargs = go#package#ImportPath(expand('%:p:h')) + if goargs == -1 + echohl Error | echomsg "vim-go: package is not inside GOPATH src" | echohl None + return + endif + else + let goargs = go#util#Shelljoin(a:000) + endif + + let bin_path = go#path#CheckBinPath(g:go_errcheck_bin) + if empty(bin_path) + return + endif + + echon "vim-go: " | echohl Identifier | echon "errcheck analysing ..." | echohl None + redraw + + let command = bin_path . ' -abspath ' . goargs + let out = go#tool#ExecuteInDir(command) + + let l:listtype = "quickfix" + if go#util#ShellError() != 0 + let errformat = "%f:%l:%c:\ %m, %f:%l:%c\ %#%m" + + " Parse and populate our location list + call go#list#ParseFormat(l:listtype, errformat, split(out, "\n"), 'Errcheck') + + let errors = go#list#Get(l:listtype) + + if empty(errors) + echohl Error | echomsg "GoErrCheck returned error" | echohl None + echo out + return + endif + + if !empty(errors) + call go#list#Populate(l:listtype, errors, 'Errcheck') + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) + call go#list#JumpToFirst(l:listtype) + endif + endif + else + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + echon "vim-go: " | echohl Function | echon "[errcheck] PASS" | echohl None + endif + +endfunction + +function! go#lint#ToggleMetaLinterAutoSave() abort + if get(g:, "go_metalinter_autosave", 0) + let g:go_metalinter_autosave = 0 + call go#util#EchoProgress("auto metalinter disabled") + return + end + + let g:go_metalinter_autosave = 1 + call go#util#EchoProgress("auto metalinter enabled") +endfunction + +function s:lint_job(args) + let status_dir = expand('%:p:h') + let started_at = reltime() + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': "gometalinter", + \ 'state': "analysing", + \}) + + " autowrite is not enabled for jobs + call go#cmd#autowrite() + + let l:listtype = go#list#Type("quickfix") + let l:errformat = '%f:%l:%c:%t%*[^:]:\ %m,%f:%l::%t%*[^:]:\ %m' + + function! s:callback(chan, msg) closure + let old_errorformat = &errorformat + let &errorformat = l:errformat + caddexpr a:msg + let &errorformat = old_errorformat + + " TODO(arslan): cursor still jumps to first error even If I don't want + " it. Seems like there is a regression somewhere, but not sure where. + copen + endfunction + + function! s:close_cb(chan) closure + let l:job = ch_getjob(a:chan) + let l:status = job_status(l:job) + + let exitval = 1 + if l:status == "dead" + let l:info = job_info(l:job) + let exitval = l:info.exitval + endif + + let status = { + \ 'desc': 'last status', + \ 'type': "gometaliner", + \ 'state': "finished", + \ } + + if exitval + let status.state = "failed" + endif + + let elapsed_time = reltimestr(reltime(started_at)) + " strip whitespace + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + let status.state .= printf(" (%ss)", elapsed_time) + + call go#statusline#Update(status_dir, status) + + let errors = go#list#Get(l:listtype) + if empty(errors) + call go#list#Window(l:listtype, len(errors)) + elseif has("patch-7.4.2200") + if l:listtype == 'quickfix' + call setqflist([], 'a', {'title': 'GoMetaLinter'}) + else + call setloclist(0, [], 'a', {'title': 'GoMetaLinter'}) + endif + endif + + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoSuccess("linting finished") + endif + endfunction + + let start_options = { + \ 'callback': funcref("s:callback"), + \ 'close_cb': funcref("s:close_cb"), + \ } + + call job_start(a:args.cmd, start_options) + + call go#list#Clean(l:listtype) + + if get(g:, 'go_echo_command_info', 1) + call go#util#EchoProgress("linting started ...") + endif +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/list.vim b/.vim/bundle/vim-go/autoload/go/list.vim new file mode 100644 index 0000000..56d6115 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/list.vim @@ -0,0 +1,133 @@ +if !exists("g:go_list_type") + let g:go_list_type = "" +endif + +" Window opens the list with the given height up to 10 lines maximum. +" Otherwise g:go_loclist_height is used. If no or zero height is given it +" closes the window +function! go#list#Window(listtype, ...) abort + let l:listtype = go#list#Type(a:listtype) + " we don't use lwindow to close the location list as we need also the + " ability to resize the window. So, we are going to use lopen and lclose + " for a better user experience. If the number of errors in a current + " location list increases/decreases, cwindow will not resize when a new + " updated height is passed. lopen in the other hand resizes the screen. + if !a:0 || a:1 == 0 + if l:listtype == "locationlist" + lclose + else + cclose + endif + return + endif + + let height = get(g:, "go_list_height", 0) + if height == 0 + " prevent creating a large location height for a large set of numbers + if a:1 > 10 + let height = 10 + else + let height = a:1 + endif + endif + + if l:listtype == "locationlist" + exe 'lopen ' . height + else + exe 'copen ' . height + endif +endfunction + + +" Get returns the current list of items from the location list +function! go#list#Get(listtype) abort + let l:listtype = go#list#Type(a:listtype) + if l:listtype == "locationlist" + return getloclist(0) + else + return getqflist() + endif +endfunction + +" Populate populate the location list with the given items +function! go#list#Populate(listtype, items, title) abort + let l:listtype = go#list#Type(a:listtype) + if l:listtype == "locationlist" + call setloclist(0, a:items, 'r') + + " The last argument ({what}) is introduced with 7.4.2200: + " https://github.com/vim/vim/commit/d823fa910cca43fec3c31c030ee908a14c272640 + if has("patch-7.4.2200") | call setloclist(0, [], 'a', {'title': a:title}) | endif + else + call setqflist(a:items, 'r') + if has("patch-7.4.2200") | call setqflist([], 'a', {'title': a:title}) | endif + endif +endfunction + +function! go#list#PopulateWin(winnr, items) abort + call setloclist(a:winnr, a:items, 'r') +endfunction + +" Parse parses the given items based on the specified errorformat nad +" populates the location list. +function! go#list#ParseFormat(listtype, errformat, items, title) abort + let l:listtype = go#list#Type(a:listtype) + " backup users errorformat, will be restored once we are finished + let old_errorformat = &errorformat + + " parse and populate the location list + let &errorformat = a:errformat + if l:listtype == "locationlist" + lgetexpr a:items + if has("patch-7.4.2200") | call setloclist(0, [], 'a', {'title': a:title}) | endif + else + cgetexpr a:items + if has("patch-7.4.2200") | call setqflist([], 'a', {'title': a:title}) | endif + endif + + "restore back + let &errorformat = old_errorformat +endfunction + +" Parse parses the given items based on the global errorformat and +" populates the location list. +function! go#list#Parse(listtype, items) abort + let l:listtype = go#list#Type(a:listtype) + if l:listtype == "locationlist" + lgetexpr a:items + else + cgetexpr a:items + endif +endfunction + +" JumpToFirst jumps to the first item in the location list +function! go#list#JumpToFirst(listtype) abort + let l:listtype = go#list#Type(a:listtype) + if l:listtype == "locationlist" + ll 1 + else + cc 1 + endif +endfunction + +" Clean cleans the location list +function! go#list#Clean(listtype) abort + let l:listtype = go#list#Type(a:listtype) + if l:listtype == "locationlist" + lex [] + else + cex [] + endif +endfunction + +function! go#list#Type(listtype) abort + if g:go_list_type == "locationlist" + return "locationlist" + elseif g:go_list_type == "quickfix" + return "quickfix" + else + return a:listtype + endif +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/package.vim b/.vim/bundle/vim-go/autoload/go/package.vim new file mode 100644 index 0000000..b12c7b7 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/package.vim @@ -0,0 +1,165 @@ +" Copyright 2011 The Go Authors. All rights reserved. +" Use of this source code is governed by a BSD-style +" license that can be found in the LICENSE file. +" +" This file provides a utility function that performs auto-completion of +" package names, for use by other commands. + +let s:goos = $GOOS +let s:goarch = $GOARCH + +if len(s:goos) == 0 + if exists('g:golang_goos') + let s:goos = g:golang_goos + elseif has('win32') || has('win64') + let s:goos = 'windows' + elseif has('macunix') + let s:goos = 'darwin' + else + let s:goos = '*' + endif +endif + +if len(s:goarch) == 0 + if exists('g:golang_goarch') + let s:goarch = g:golang_goarch + else + let s:goarch = '*' + endif +endif + +function! go#package#Paths() abort + let dirs = [] + + if !exists("s:goroot") + if executable('go') + let s:goroot = go#util#goroot() + if go#util#ShellError() != 0 + echomsg '''go env GOROOT'' failed' + endif + else + let s:goroot = $GOROOT + endif + endif + + if len(s:goroot) != 0 && isdirectory(s:goroot) + let dirs += [s:goroot] + endif + + let workspaces = split(go#path#Detect(), go#util#PathListSep()) + if workspaces != [] + let dirs += workspaces + endif + + return dirs +endfunction + +function! go#package#ImportPath(arg) abort + let path = fnamemodify(resolve(a:arg), ':p') + let dirs = go#package#Paths() + + for dir in dirs + if len(dir) && matchstr(escape(path, '\/'), escape(dir, '\/')) == 0 + let workspace = dir + endif + endfor + + if !exists('workspace') + return -1 + endif + + if go#util#IsWin() + let srcdir = substitute(workspace . '\src\', '//', '/', '') + return path[len(srcdir):] + else + let srcdir = substitute(workspace . '/src/', '//', '/', '') + return substitute(path, srcdir, '', '') + endif +endfunction + +function! go#package#FromPath(arg) abort + let path = fnamemodify(resolve(a:arg), ':p') + let dirs = go#package#Paths() + + for dir in dirs + if len(dir) && match(path, dir) == 0 + let workspace = dir + endif + endfor + + if !exists('workspace') + return -1 + endif + + if isdirectory(path) + return substitute(path, workspace . 'src/', '', '') + else + return substitute(substitute(path, workspace . 'src/', '', ''), + \ '/' . fnamemodify(path, ':t'), '', '') + endif +endfunction + +function! go#package#CompleteMembers(package, member) abort + silent! let content = go#util#System('godoc ' . a:package) + if go#util#ShellError() || !len(content) + return [] + endif + let lines = filter(split(content, "\n"),"v:val !~ '^\\s\\+$'") + try + let mx1 = '^\s\+\(\S+\)\s\+=\s\+.*' + let mx2 = '^\%(const\|var\|type\|func\) \([A-Z][^ (]\+\).*' + let candidates = map(filter(copy(lines), 'v:val =~ mx1'), + \ 'substitute(v:val, mx1, "\\1", "")') + \ + map(filter(copy(lines), 'v:val =~ mx2'), + \ 'substitute(v:val, mx2, "\\1", "")') + return filter(candidates, '!stridx(v:val, a:member)') + catch + return [] + endtry +endfunction + +function! go#package#Complete(ArgLead, CmdLine, CursorPos) abort + let words = split(a:CmdLine, '\s\+', 1) + + " do not complete package members for these commands + let neglect_commands = ["GoImportAs", "GoGuruScope"] + + if len(words) > 2 && index(neglect_commands, words[0]) == -1 + " Complete package members + return go#package#CompleteMembers(words[1], words[2]) + endif + + let dirs = go#package#Paths() + + if len(dirs) == 0 + " should not happen + return [] + endif + + let ret = {} + for dir in dirs + " this may expand to multiple lines + let root = split(expand(dir . '/pkg/' . s:goos . '_' . s:goarch), "\n") + call add(root, expand(dir . '/src')) + for r in root + for i in split(globpath(r, a:ArgLead.'*'), "\n") + if isdirectory(i) + let i .= '/' + elseif i !~ '\.a$' + continue + endif + let i = substitute(substitute(i[len(r)+1:], '[\\]', '/', 'g'), + \ '\.a$', '', 'g') + + " without this the result can have duplicates in form of + " 'encoding/json' and '/encoding/json/' + let i = go#util#StripPathSep(i) + + let ret[i] = i + endfor + endfor + endfor + return sort(keys(ret)) +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/path.vim b/.vim/bundle/vim-go/autoload/go/path.vim new file mode 100644 index 0000000..a9b74e9 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/path.vim @@ -0,0 +1,175 @@ +" initial_go_path is used to store the initial GOPATH that was set when Vim +" was started. It's used with :GoPathClear to restore the GOPATH when the user +" changed it explicitly via :GoPath. Initially it's empty. It's being set when +" :GoPath is used +let s:initial_go_path = "" + +" GoPath sets or returns the current GOPATH. If no arguments are passed it +" echoes the current GOPATH, if an argument is passed it replaces the current +" GOPATH with it. If two double quotes are passed (the empty string in go), +" it'll clear the GOPATH and will restore to the initial GOPATH. +function! go#path#GoPath(...) abort + " we have an argument, replace GOPATH + if len(a:000) + " clears the current manually set GOPATH and restores it to the + " initial GOPATH, which was set when Vim was started. + if len(a:000) == 1 && a:1 == '""' + if !empty(s:initial_go_path) + let $GOPATH = s:initial_go_path + let s:initial_go_path = "" + endif + + echon "vim-go: " | echohl Function | echon "GOPATH restored to ". $GOPATH | echohl None + return + endif + + echon "vim-go: " | echohl Function | echon "GOPATH changed to ". a:1 | echohl None + let s:initial_go_path = $GOPATH + let $GOPATH = a:1 + return + endif + + echo go#path#Detect() +endfunction + +" Default returns the default GOPATH. If there is a single GOPATH it returns +" it. For multiple GOPATHS separated with a the OS specific separator, only +" the first one is returned +function! go#path#Default() abort + let go_paths = split($GOPATH, go#util#PathListSep()) + + if len(go_paths) == 1 + return $GOPATH + endif + + return go_paths[0] +endfunction + +" HasPath checks whether the given path exists in GOPATH environment variable +" or not +function! go#path#HasPath(path) abort + let go_paths = split($GOPATH, go#util#PathListSep()) + let last_char = strlen(a:path) - 1 + + " check cases of '/foo/bar/' and '/foo/bar' + if a:path[last_char] == go#util#PathSep() + let withSep = a:path + let noSep = strpart(a:path, 0, last_char) + else + let withSep = a:path . go#util#PathSep() + let noSep = a:path + endif + + let hasA = index(go_paths, withSep) != -1 + let hasB = index(go_paths, noSep) != -1 + return hasA || hasB +endfunction + +" Detect returns the current GOPATH. If a package manager is used, such as +" Godeps, GB, it will modify the GOPATH so those directories take precedence +" over the current GOPATH. It also detects diretories whose are outside +" GOPATH. +function! go#path#Detect() abort + let gopath = $GOPATH + + " don't lookup for godeps if autodetect is disabled. + if !get(g:, "go_autodetect_gopath", 1) + return gopath + endif + + let current_dir = fnameescape(expand('%:p:h')) + + " TODO(arslan): this should be changed so folders or files should be + " fetched from a customizable list. The user should define any new package + " management tool by it's own. + + " src folder outside $GOPATH + let src_root = finddir("src", current_dir .";") + if !empty(src_root) + let src_path = fnamemodify(src_root, ':p:h:h') . go#util#PathSep() + + " gb vendor plugin + " (https://github.com/constabulary/gb/tree/master/cmd/gb-vendor) + let gb_vendor_root = src_path . "vendor" . go#util#PathSep() + if isdirectory(gb_vendor_root) && !go#path#HasPath(gb_vendor_root) + let gopath = gb_vendor_root . go#util#PathListSep() . gopath + endif + + if !go#path#HasPath(src_path) + let gopath = src_path . go#util#PathListSep() . gopath + endif + endif + + " Godeps + let godeps_root = finddir("Godeps", current_dir .";") + if !empty(godeps_root) + let godeps_path = join([fnamemodify(godeps_root, ':p:h:h'), "Godeps", "_workspace" ], go#util#PathSep()) + + if !go#path#HasPath(godeps_path) + let gopath = godeps_path . go#util#PathListSep() . gopath + endif + endif + + return gopath +endfunction + + +" BinPath returns the binary path of installed go tools. +function! go#path#BinPath() abort + let bin_path = "" + + " check if our global custom path is set, if not check if $GOBIN is set so + " we can use it, otherwise use $GOPATH + '/bin' + if exists("g:go_bin_path") + let bin_path = g:go_bin_path + elseif $GOBIN != "" + let bin_path = $GOBIN + elseif $GOPATH != "" + let bin_path = expand(go#path#Default() . "/bin/") + else + " could not find anything + endif + + return bin_path +endfunction + +" CheckBinPath checks whether the given binary exists or not and returns the +" path of the binary. It returns an empty string doesn't exists. +function! go#path#CheckBinPath(binpath) abort + " remove whitespaces if user applied something like 'goimports ' + let binpath = substitute(a:binpath, '^\s*\(.\{-}\)\s*$', '\1', '') + " save off original path + let old_path = $PATH + + " check if we have an appropriate bin_path + let go_bin_path = go#path#BinPath() + if !empty(go_bin_path) + " append our GOBIN and GOPATH paths and be sure they can be found there... + " let us search in our GOBIN and GOPATH paths + let $PATH = go_bin_path . go#util#PathListSep() . $PATH + endif + + " if it's in PATH just return it + if executable(binpath) + if exists('*exepath') + let binpath = exepath(binpath) + endif + let $PATH = old_path + return binpath + endif + + " just get the basename + let basename = fnamemodify(binpath, ":t") + if !executable(basename) + echom "vim-go: could not find '" . basename . "'. Run :GoInstallBinaries to fix it." + " restore back! + let $PATH = old_path + return "" + endif + + let $PATH = old_path + + return go_bin_path . go#util#PathSep() . basename +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/play.vim b/.vim/bundle/vim-go/autoload/go/play.vim new file mode 100644 index 0000000..ac5bba4 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/play.vim @@ -0,0 +1,93 @@ +if !exists("g:go_play_open_browser") + let g:go_play_open_browser = 1 +endif + + +function! go#play#Share(count, line1, line2) abort + if !executable('curl') + echohl ErrorMsg | echomsg "vim-go: require 'curl' command" | echohl None + return + endif + + let content = join(getline(a:line1, a:line2), "\n") + let share_file = tempname() + call writefile(split(content, "\n"), share_file, "b") + + let command = "curl -s -X POST https://play.golang.org/share --data-binary '@".share_file."'" + let snippet_id = go#util#System(command) + + " we can remove the temp file because it's now posted. + call delete(share_file) + + if go#util#ShellError() != 0 + echo 'A error has occured. Run this command to see what the problem is:' + echo command + return + endif + + let url = "http://play.golang.org/p/".snippet_id + + " copy to clipboard + if has('unix') && !has('xterm_clipboard') && !has('clipboard') + let @" = url + else + let @+ = url + endif + + if g:go_play_open_browser != 0 + call go#tool#OpenBrowser(url) + endif + + echo "vim-go: snippet uploaded: ".url +endfunction + + +function! s:get_visual_content() abort + let save_regcont = @" + let save_regtype = getregtype('"') + silent! normal! gvy + let content = @" + call setreg('"', save_regcont, save_regtype) + return content +endfunction + +" modified version of +" http://stackoverflow.com/questions/1533565/how-to-get-visually-selected-text-in-vimscript +" another function that returns the content of visual selection, it's not used +" but might be useful in the future +function! s:get_visual_selection() abort + let [lnum1, col1] = getpos("'<")[1:2] + let [lnum2, col2] = getpos("'>")[1:2] + + " check if the the visual mode is used before + if lnum1 == 0 || lnum2 == 0 || col1 == 0 || col2 == 0 + return + endif + + let lines = getline(lnum1, lnum2) + let lines[-1] = lines[-1][: col2 - (&selection == 'inclusive' ? 1 : 2)] + let lines[0] = lines[0][col1 - 1:] + return join(lines, "\n") +endfunction + +" following two functions are from: https://github.com/mattn/gist-vim +" thanks @mattn +function! s:get_browser_command() abort + let go_play_browser_command = get(g:, 'go_play_browser_command', '') + if go_play_browser_command == '' + if has('win32') || has('win64') + let go_play_browser_command = '!start rundll32 url.dll,FileProtocolHandler %URL%' + elseif has('mac') || has('macunix') || has('gui_macvim') || go#util#System('uname') =~? '^darwin' + let go_play_browser_command = 'open %URL%' + elseif executable('xdg-open') + let go_play_browser_command = 'xdg-open %URL%' + elseif executable('firefox') + let go_play_browser_command = 'firefox %URL% &' + else + let go_play_browser_command = '' + endif + endif + return go_play_browser_command +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/rename.vim b/.vim/bundle/vim-go/autoload/go/rename.vim new file mode 100644 index 0000000..7d5579d --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/rename.vim @@ -0,0 +1,146 @@ +if !exists("g:go_gorename_bin") + let g:go_gorename_bin = "gorename" +endif + +if !exists("g:go_gorename_prefill") + let g:go_gorename_prefill = 1 +endif + +function! go#rename#Rename(bang, ...) abort + let to_identifier = "" + if a:0 == 0 + let from = expand("") + let ask = printf("vim-go: rename '%s' to: ", from) + if g:go_gorename_prefill + let to_identifier = input(ask, from) + else + let to_identifier = input(ask) + endif + redraw! + if empty(to_identifier) + return + endif + else + let to_identifier = a:1 + endif + + "return with a warning if the bin doesn't exist + let bin_path = go#path#CheckBinPath(g:go_gorename_bin) + if empty(bin_path) + return + endif + + let fname = expand('%:p') + let pos = go#util#OffsetCursor() + let offset = printf('%s:#%d', fname, pos) + + " no need to escape for job call + let bin_path = go#util#has_job() ? bin_path : shellescape(bin_path) + let offset = go#util#has_job() ? offset : shellescape(offset) + let to_identifier = go#util#has_job() ? to_identifier : shellescape(to_identifier) + + let cmd = [bin_path, "-offset", offset, "-to", to_identifier] + + if go#util#has_job() + call go#util#EchoProgress(printf("renaming to '%s' ...", to_identifier)) + call s:rename_job({ + \ 'cmd': cmd, + \ 'bang': a:bang, + \}) + return + endif + + let command = join(cmd, " ") + let out = go#tool#ExecuteInDir(command) + + let splitted = split(out, '\n') + call s:parse_errors(go#util#ShellError(), a:bang, splitted) +endfunction + +function s:rename_job(args) + let messages = [] + function! s:callback(chan, msg) closure + call add(messages, a:msg) + endfunction + + let status_dir = expand('%:p:h') + + function! s:close_cb(chan) closure + let l:job = ch_getjob(a:chan) + let l:info = job_info(l:job) + + let status = { + \ 'desc': 'last status', + \ 'type': "gorename", + \ 'state': "finished", + \ } + + if l:info.exitval + let status.state = "failed" + endif + + call go#statusline#Update(status_dir, status) + + call s:parse_errors(l:info.exitval, a:args.bang, messages) + endfunction + + let start_options = { + \ 'callback': funcref("s:callback"), + \ 'close_cb': funcref("s:close_cb"), + \ } + + " modify GOPATH if needed + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + + call go#statusline#Update(status_dir, { + \ 'desc': "current status", + \ 'type': "gorename", + \ 'state': "started", + \}) + + call job_start(a:args.cmd, start_options) + + let $GOPATH = old_gopath +endfunction + +function s:parse_errors(exit_val, bang, out) + " reload all files to reflect the new changes. We explicitly call + " checktime to trigger a reload of all files. See + " http://www.mail-archive.com/vim@vim.org/msg05900.html for more info + " about the autoread bug + let current_autoread = &autoread + set autoread + silent! checktime + let &autoread = current_autoread + + let l:listtype = "quickfix" + if a:exit_val != 0 + call go#util#EchoError("FAILED") + let errors = go#tool#ParseErrors(a:out) + call go#list#Populate(l:listtype, errors, 'Rename') + call go#list#Window(l:listtype, len(errors)) + if !empty(errors) && !a:bang + call go#list#JumpToFirst(l:listtype) + elseif empty(errors) + " failed to parse errors, output the original content + call go#util#EchoError(join(a:out, "")) + endif + + return + endif + + " strip out newline on the end that gorename puts. If we don't remove, it + " will trigger the 'Hit ENTER to continue' prompt + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + call go#util#EchoSuccess(a:out[0]) + + " refresh the buffer so we can see the new content + " TODO(arslan): also find all other buffers and refresh them too. For this + " we need a way to get the list of changes from gorename upon an success + " change. + silent execute ":e" +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/statusline.vim b/.vim/bundle/vim-go/autoload/go/statusline.vim new file mode 100644 index 0000000..c832797 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/statusline.vim @@ -0,0 +1,112 @@ +" Statusline +"""""""""""""""""""""""""""""""" + +" s:statuses is a global reference to all statuses. It stores the statuses per +" import paths (map[string]status), where each status is unique per its +" type. Current status dict is in form: +" { +" 'desc' : 'Job description', +" 'state' : 'Job state, such as success, failure, etc..', +" 'type' : 'Job type, such as build, test, etc..' +" 'created_at' : 'Time it was created as seconds since 1st Jan 1970' +" } +let s:statuses = {} + +" timer_id for cleaner +let s:timer_id = 0 + +" last_status stores the last generated text per status +let s:last_status = "" + +" Show returns the current status of the job for 20 seconds (configurable). It +" displays it in form of 'desc: [type|state]' if there is any state available, +" if not it returns an empty string. This function should be plugged directly +" into the statusline. +function! go#statusline#Show() abort + " lazy initialiation of the cleaner + if !s:timer_id + " clean every 60 seconds all statuses + let interval = get(g:, 'go_statusline_duration', 60000) + let s:timer_id = timer_start(interval, function('go#statusline#Clear'), {'repeat': -1}) + endif + + " nothing to show + if empty(s:statuses) + return '' + endif + + let status_dir = expand('%:p:h') + + if !has_key(s:statuses, status_dir) + return '' + endif + + let status = s:statuses[status_dir] + if !has_key(status, 'desc') || !has_key(status, 'state') || !has_key(status, 'type') + return '' + endif + + let status_text = printf("[%s|%s]", status.type, status.state) + if empty(status_text) + return '' + endif + + " only update highlight if status has changed. + if status_text != s:last_status + if status.state =~ "success" || status.state =~ "finished" + hi goStatusLineColor cterm=bold ctermbg=76 ctermfg=22 + elseif status.state =~ "started" || status.state =~ "analysing" + hi goStatusLineColor cterm=bold ctermbg=208 ctermfg=88 + elseif status.state =~ "failed" + hi goStatusLineColor cterm=bold ctermbg=196 ctermfg=52 + endif + endif + + let s:last_status = status_text + return status_text +endfunction + +" Update updates (adds) the statusline for the given status_dir with the +" given status dict. It overrides any previously set status. +function! go#statusline#Update(status_dir, status) abort + let a:status.created_at = reltime() + let s:statuses[a:status_dir] = a:status + + " force to update the statusline, otherwise the user needs to move the + " cursor + exe 'let &ro = &ro' + + " before we stop the timer, check if we have any previous jobs to be cleaned + " up. Otherwise every job will reset the timer when this function is called + " and thus old jobs will never be cleaned + call go#statusline#Clear(0) + + " also reset the timer, so the user has time to see it in the statusline. + " Setting the timer_id to 0 will trigger a new cleaner routine. + call timer_stop(s:timer_id) + let s:timer_id = 0 +endfunction + +" Clear clears all currently stored statusline data. The timer_id argument is +" just a placeholder so we can pass it to a timer_start() function if needed. +function! go#statusline#Clear(timer_id) abort + for [status_dir, status] in items(s:statuses) + let elapsed_time = reltimestr(reltime(status.created_at)) + " strip whitespace + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + + if str2nr(elapsed_time) > 10 + call remove(s:statuses, status_dir) + endif + endfor + + if len(s:statuses) == 0 + let s:statuses = {} + endif + + " force to update the statusline, otherwise the user needs to move the + " cursor + exe 'let &ro = &ro' +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/template.vim b/.vim/bundle/vim-go/autoload/go/template.vim new file mode 100644 index 0000000..0a92988 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/template.vim @@ -0,0 +1,50 @@ +let s:current_file = expand("") + +function! go#template#create() abort + let l:go_template_use_pkg = get(g:, 'go_template_use_pkg', 0) + let l:root_dir = fnamemodify(s:current_file, ':h:h:h') + + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + execute cd . fnameescape(expand("%:p:h")) + + let l:package_name = go#tool#PackageName() + + " if we can't figure out any package name(no Go files or non Go package + " files) from the directory create the template or use the cwd + " as the name + if l:package_name == -1 && l:go_template_use_pkg != 1 + let l:template_file = get(g:, 'go_template_file', "hello_world.go") + let l:template_path = go#util#Join(l:root_dir, "templates", l:template_file) + exe '0r ' . fnameescape(l:template_path) + $delete _ + elseif l:package_name == -1 && l:go_template_use_pkg == 1 + " cwd is now the dir of the package + let l:path = fnamemodify(getcwd(), ':t') + let l:content = printf("package %s", l:path) + call append(0, l:content) + $delete _ + else + let l:content = printf("package %s", l:package_name) + call append(0, l:content) + $delete _ + endif + + " Remove the '... [New File]' message line from the command line + echon + + execute cd . fnameescape(dir) +endfunction + +function! go#template#ToggleAutoCreate() abort + if get(g:, "go_template_autocreate", 1) + let g:go_template_autocreate = 0 + call go#util#EchoProgress("auto template create disabled") + return + end + + let g:go_template_autocreate = 1 + call go#util#EchoProgress("auto template create enabled") +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/term.vim b/.vim/bundle/vim-go/autoload/go/term.vim new file mode 100644 index 0000000..9404ca9 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/term.vim @@ -0,0 +1,139 @@ +if has('nvim') && !exists("g:go_term_mode") + let g:go_term_mode = 'vsplit' +endif + +" s:jobs is a global reference to all jobs started with new() +let s:jobs = {} + +" new creates a new terminal with the given command. Mode is set based on the +" global variable g:go_term_mode, which is by default set to :vsplit +function! go#term#new(bang, cmd) abort + return go#term#newmode(a:bang, a:cmd, g:go_term_mode) +endfunction + +" new creates a new terminal with the given command and window mode. +function! go#term#newmode(bang, cmd, mode) abort + let mode = a:mode + if empty(mode) + let mode = g:go_term_mode + endif + + " modify GOPATH if needed + let old_gopath = $GOPATH + let $GOPATH = go#path#Detect() + + " execute go build in the files directory + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + + execute cd . fnameescape(expand("%:p:h")) + + execute mode.' __go_term__' + + setlocal filetype=goterm + setlocal bufhidden=delete + setlocal winfixheight + setlocal noswapfile + setlocal nobuflisted + + let job = { + \ 'stderr' : [], + \ 'stdout' : [], + \ 'bang' : a:bang, + \ 'on_stdout': function('s:on_stdout'), + \ 'on_stderr': function('s:on_stderr'), + \ 'on_exit' : function('s:on_exit'), + \ } + + let id = termopen(a:cmd, job) + + execute cd . fnameescape(dir) + + " restore back GOPATH + let $GOPATH = old_gopath + + let job.id = id + let job.cmd = a:cmd + startinsert + + " resize new term if needed. + let height = get(g:, 'go_term_height', winheight(0)) + let width = get(g:, 'go_term_width', winwidth(0)) + + " we are careful how to resize. for example it's vertical we don't change + " the height. The below command resizes the buffer + if a:mode == "split" + exe 'resize ' . height + elseif a:mode == "vertical" + exe 'vertical resize ' . width + endif + + " we also need to resize the pty, so there you go... + call jobresize(id, width, height) + + let s:jobs[id] = job + return id +endfunction + +function! s:on_stdout(job_id, data, event) dict abort + if !has_key(s:jobs, a:job_id) + return + endif + let job = s:jobs[a:job_id] + + call extend(job.stdout, a:data) +endfunction + +function! s:on_stderr(job_id, data, event) dict abort + if !has_key(s:jobs, a:job_id) + return + endif + let job = s:jobs[a:job_id] + + call extend(job.stderr, a:data) +endfunction + +function! s:on_exit(job_id, exit_status, event) dict abort + if !has_key(s:jobs, a:job_id) + return + endif + let job = s:jobs[a:job_id] + + let l:listtype = "locationlist" + + " usually there is always output so never branch into this clause + if empty(job.stdout) + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + unlet s:jobs[a:job_id] + return + endif + + let errors = go#tool#ParseErrors(job.stdout) + let errors = go#tool#FilterValids(errors) + + if !empty(errors) + " close terminal we don't need it anymore + close + + call go#list#Populate(l:listtype, errors, job.cmd) + call go#list#Window(l:listtype, len(errors)) + if !self.bang + call go#list#JumpToFirst(l:listtype) + endif + unlet s:jobs[a:job_id] + return + endif + + " tests are passing clean the list and close the list. But we only can + " close them from a normal view, so jump back, close the list and then + " again jump back to the terminal + wincmd p + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + wincmd p + + unlet s:jobs[a:job_id] +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/test-fixtures/def/jump.go b/.vim/bundle/vim-go/autoload/go/test-fixtures/def/jump.go new file mode 100644 index 0000000..50e8d8d --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/test-fixtures/def/jump.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("vim-go") +} diff --git a/.vim/bundle/vim-go/autoload/go/test-fixtures/fmt/hello.go b/.vim/bundle/vim-go/autoload/go/test-fixtures/fmt/hello.go new file mode 100644 index 0000000..3be42f6 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/test-fixtures/fmt/hello.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + + func main() { +fmt.Println("vim-go") +} diff --git a/.vim/bundle/vim-go/autoload/go/test-fixtures/fmt/hello_golden.go b/.vim/bundle/vim-go/autoload/go/test-fixtures/fmt/hello_golden.go new file mode 100644 index 0000000..50e8d8d --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/test-fixtures/fmt/hello_golden.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("vim-go") +} diff --git a/.vim/bundle/vim-go/autoload/go/textobj.vim b/.vim/bundle/vim-go/autoload/go/textobj.vim new file mode 100644 index 0000000..be0c771 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/textobj.vim @@ -0,0 +1,180 @@ +if !exists("g:go_textobj_enabled") + let g:go_textobj_enabled = 1 +endif + +if !exists("g:go_textobj_include_function_doc") + let g:go_textobj_include_function_doc = 1 +endif + +" ( ) motions +" { } motions +" s for sentence +" p for parapgrah +" < > +" t for tag + +function! go#textobj#Function(mode) abort + let offset = go#util#OffsetCursor() + + let fname = shellescape(expand("%:p")) + if &modified + " Write current unsaved buffer to a temp file and use the modified content + let l:tmpname = tempname() + call writefile(getline(1, '$'), l:tmpname) + let fname = l:tmpname + endif + + let bin_path = go#path#CheckBinPath('motion') + if empty(bin_path) + return + endif + + let command = printf("%s -format vim -file %s -offset %s", bin_path, fname, offset) + let command .= " -mode enclosing" + + if g:go_textobj_include_function_doc + let command .= " -parse-comments" + endif + + let out = go#util#System(command) + if go#util#ShellError() != 0 + call go#util#EchoError(out) + return + endif + + " if exists, delete it as we don't need it anymore + if exists("l:tmpname") + call delete(l:tmpname) + endif + + " convert our string dict representation into native Vim dictionary type + let result = eval(out) + if type(result) != 4 || !has_key(result, 'fn') + return + endif + + let info = result.fn + + if a:mode == 'a' + " anonymous functions doesn't have associated doc. Also check if the user + " want's to include doc comments for function declarations + if has_key(info, 'doc') && g:go_textobj_include_function_doc + call cursor(info.doc.line, info.doc.col) + else + call cursor(info.func.line, info.func.col) + endif + + normal! v + call cursor(info.rbrace.line, info.rbrace.col) + return + endif + + " rest is inner mode, a:mode == 'i' + + " if the function is a one liner we need to select only that portion + if info.lbrace.line == info.rbrace.line + call cursor(info.lbrace.line, info.lbrace.col+1) + normal! v + call cursor(info.rbrace.line, info.rbrace.col-1) + return + endif + + call cursor(info.lbrace.line+1, 1) + normal! V + call cursor(info.rbrace.line-1, 1) +endfunction + +function! go#textobj#FunctionJump(mode, direction) abort + " get count of the motion. This should be done before all the normal + " expressions below as those reset this value(because they have zero + " count!). We abstract -1 because the index starts from 0 in motion. + let l:cnt = v:count1 - 1 + + " set context mark so we can jump back with '' or `` + normal! m' + + " select already previously selected visual content and continue from there. + " If it's the first time starts with the visual mode. This is needed so + " after selecting something in visual mode, every consecutive motion + " continues. + if a:mode == 'v' + normal! gv + endif + + let offset = go#util#OffsetCursor() + + let fname = shellescape(expand("%:p")) + if &modified + " Write current unsaved buffer to a temp file and use the modified content + let l:tmpname = tempname() + call writefile(getline(1, '$'), l:tmpname) + let fname = l:tmpname + endif + + let bin_path = go#path#CheckBinPath('motion') + if empty(bin_path) + return + endif + + let command = printf("%s -format vim -file %s -offset %s", bin_path, fname, offset) + let command .= ' -shift ' . l:cnt + + if a:direction == 'next' + let command .= ' -mode next' + else " 'prev' + let command .= ' -mode prev' + endif + + if g:go_textobj_include_function_doc + let command .= " -parse-comments" + endif + + let out = go#util#System(command) + if go#util#ShellError() != 0 + call go#util#EchoError(out) + return + endif + + " if exists, delete it as we don't need it anymore + if exists("l:tmpname") + call delete(l:tmpname) + endif + + " convert our string dict representation into native Vim dictionary type + let result = eval(out) + if type(result) != 4 || !has_key(result, 'fn') + return + endif + + " we reached the end and there are no functions. The usual [[ or ]] jumps to + " the top or bottom, we'll do the same. + if type(result) == 4 && has_key(result, 'err') && result.err == "no functions found" + if a:direction == 'next' + keepjumps normal! G + else " 'prev' + keepjumps normal! gg + endif + return + endif + + let info = result.fn + + " if we select something ,select all function + if a:mode == 'v' && a:direction == 'next' + keepjumps call cursor(info.rbrace.line, 1) + return + endif + + if a:mode == 'v' && a:direction == 'prev' + if has_key(info, 'doc') && g:go_textobj_include_function_doc + keepjumps call cursor(info.doc.line, 1) + else + keepjumps call cursor(info.func.line, 1) + endif + return + endif + + keepjumps call cursor(info.func.line, 1) +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/tool.vim b/.vim/bundle/vim-go/autoload/go/tool.vim new file mode 100644 index 0000000..7b7e1af --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/tool.vim @@ -0,0 +1,209 @@ +function! go#tool#Files() abort + if go#util#IsWin() + let format = '{{range $f := .GoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}' + else + let format = "{{range $f := .GoFiles}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}" + endif + let command = 'go list -f '.shellescape(format) + let out = go#tool#ExecuteInDir(command) + return split(out, '\n') +endfunction + +function! go#tool#Deps() abort + if go#util#IsWin() + let format = '{{range $f := .Deps}}{{$f}}{{printf \"\n\"}}{{end}}' + else + let format = "{{range $f := .Deps}}{{$f}}\n{{end}}" + endif + let command = 'go list -f '.shellescape(format) + let out = go#tool#ExecuteInDir(command) + return split(out, '\n') +endfunction + +function! go#tool#Imports() abort + let imports = {} + if go#util#IsWin() + let format = '{{range $f := .Imports}}{{$f}}{{printf \"\n\"}}{{end}}' + else + let format = "{{range $f := .Imports}}{{$f}}{{printf \"\\n\"}}{{end}}" + endif + let command = 'go list -f '.shellescape(format) + let out = go#tool#ExecuteInDir(command) + if go#util#ShellError() != 0 + echo out + return imports + endif + + for package_path in split(out, '\n') + let cmd = "go list -f '{{.Name}}' " . shellescape(package_path) + let package_name = substitute(go#tool#ExecuteInDir(cmd), '\n$', '', '') + let imports[package_name] = package_path + endfor + + return imports +endfunction + +function! go#tool#Info(auto) abort + let l:mode = get(g:, 'go_info_mode', 'gocode') + if l:mode == 'gocode' + call go#complete#Info(a:auto) + elseif l:mode == 'guru' + call go#guru#DescribeInfo() + else + call go#util#EchoError('go_info_mode value: '. l:mode .' is not valid. Valid values are: [gocode, guru]') + endif +endfunction + +function! go#tool#PackageName() abort + let command = "go list -f \"{{.Name}}\"" + let out = go#tool#ExecuteInDir(command) + if go#util#ShellError() != 0 + return -1 + endif + + return split(out, '\n')[0] +endfunction + +function! go#tool#ParseErrors(lines) abort + let errors = [] + + for line in a:lines + let fatalerrors = matchlist(line, '^\(fatal error:.*\)$') + let tokens = matchlist(line, '^\s*\(.\{-}\):\(\d\+\):\s*\(.*\)') + + if !empty(fatalerrors) + call add(errors, {"text": fatalerrors[1]}) + elseif !empty(tokens) + " strip endlines of form ^M + let out = substitute(tokens[3], '\r$', '', '') + + call add(errors, { + \ "filename" : fnamemodify(tokens[1], ':p'), + \ "lnum" : tokens[2], + \ "text" : out, + \ }) + elseif !empty(errors) + " Preserve indented lines. + " This comes up especially with multi-line test output. + if match(line, '^\s') >= 0 + call add(errors, {"text": line}) + endif + endif + endfor + + return errors +endfunction + +"FilterValids filters the given items with only items that have a valid +"filename. Any non valid filename is filtered out. +function! go#tool#FilterValids(items) abort + " Remove any nonvalid filename from the location list to avoid opening an + " empty buffer. See https://github.com/fatih/vim-go/issues/287 for + " details. + let filtered = [] + let is_readable = {} + + for item in a:items + if has_key(item, 'bufnr') + let filename = bufname(item.bufnr) + elseif has_key(item, 'filename') + let filename = item.filename + else + " nothing to do, add item back to the list + call add(filtered, item) + continue + endif + + if !has_key(is_readable, filename) + let is_readable[filename] = filereadable(filename) + endif + if is_readable[filename] + call add(filtered, item) + endif + endfor + + for k in keys(filter(is_readable, '!v:val')) + echo "vim-go: " | echohl Identifier | echon "[run] Dropped " | echohl Constant | echon '"' . k . '"' + echohl Identifier | echon " from location list (nonvalid filename)" | echohl None + endfor + + return filtered +endfunction + +function! go#tool#ExecuteInDir(cmd) abort + let old_gopath = $GOPATH + let old_goroot = $GOROOT + let $GOPATH = go#path#Detect() + let $GOROOT = go#util#env("goroot") + + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + execute cd . fnameescape(expand("%:p:h")) + let out = go#util#System(a:cmd) + finally + execute cd . fnameescape(dir) + endtry + + let $GOROOT = old_goroot + let $GOPATH = old_gopath + return out +endfunction + +" Exists checks whether the given importpath exists or not. It returns 0 if +" the importpath exists under GOPATH. +function! go#tool#Exists(importpath) abort + let command = "go list ". a:importpath + let out = go#tool#ExecuteInDir(command) + + if go#util#ShellError() != 0 + return -1 + endif + + return 0 +endfunction + + +" following two functions are from: https://github.com/mattn/gist-vim +" thanks @mattn +function! s:get_browser_command() abort + let go_play_browser_command = get(g:, 'go_play_browser_command', '') + if go_play_browser_command == '' + if go#util#IsWin() + let go_play_browser_command = '!start rundll32 url.dll,FileProtocolHandler %URL%' + elseif has('mac') || has('macunix') || has('gui_macvim') || go#util#System('uname') =~? '^darwin' + let go_play_browser_command = 'open %URL%' + elseif executable('xdg-open') + let go_play_browser_command = 'xdg-open %URL%' + elseif executable('firefox') + let go_play_browser_command = 'firefox %URL% &' + else + let go_play_browser_command = '' + endif + endif + return go_play_browser_command +endfunction + +function! go#tool#OpenBrowser(url) abort + let cmd = s:get_browser_command() + if len(cmd) == 0 + redraw + echohl WarningMsg + echo "It seems that you don't have general web browser. Open URL below." + echohl None + echo a:url + return + endif + if cmd =~ '^!' + let cmd = substitute(cmd, '%URL%', '\=escape(shellescape(a:url),"#")', 'g') + silent! exec cmd + elseif cmd =~ '^:[A-Z]' + let cmd = substitute(cmd, '%URL%', '\=escape(a:url,"#")', 'g') + exec cmd + else + let cmd = substitute(cmd, '%URL%', '\=shellescape(a:url)', 'g') + call go#util#System(cmd) + endif +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/ui.vim b/.vim/bundle/vim-go/autoload/go/ui.vim new file mode 100644 index 0000000..3f61257 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/ui.vim @@ -0,0 +1,114 @@ +let s:buf_nr = -1 + +"OpenWindow opens a new scratch window and put's the content into the window +function! go#ui#OpenWindow(title, content, filetype) abort + " Ensure there's only one return window in this session/tabpage + call go#util#Windo("unlet! w:vim_go_return_window") + " Mark the window we're leaving as such + let w:vim_go_return_window = 1 + + " reuse existing buffer window if it exists otherwise create a new one + if !bufexists(s:buf_nr) + execute 'botright new' + file `="[" . a:title . "]"` + let s:buf_nr = bufnr('%') + elseif bufwinnr(s:buf_nr) == -1 + execute 'botright new' + execute s:buf_nr . 'buffer' + elseif bufwinnr(s:buf_nr) != bufwinnr('%') + execute bufwinnr(s:buf_nr) . 'wincmd w' + endif + + " Resize window to content length + exe 'resize' . len(a:content) + + execute "setlocal filetype=".a:filetype + + " some sane default values for a readonly buffer + setlocal bufhidden=delete + setlocal buftype=nofile + setlocal noswapfile + setlocal nobuflisted + setlocal winfixheight + setlocal cursorline " make it easy to distinguish + setlocal nonumber + setlocal norelativenumber + setlocal showbreak="" + + " we need this to purge the buffer content + setlocal modifiable + + "delete everything first from the buffer + %delete _ + + " add the content + call append(0, a:content) + + " delete last line that comes from the append call + $delete _ + + " set it back to non modifiable + setlocal nomodifiable + + " Remove the '... [New File]' message line from the command line + echon +endfunction + +function! go#ui#GetReturnWindow() abort + for l:wn in range(1, winnr("$")) + if !empty(getwinvar(l:wn, "vim_go_return_window")) + return l:wn + endif + endfor +endfunction + +" CloseWindow closes the current window +function! go#ui#CloseWindow() abort + " Close any window associated with the ui buffer, if it's there + if bufexists(s:buf_nr) + let ui_window_number = bufwinnr(s:buf_nr) + if ui_window_number != -1 + execute ui_window_number . 'close' + endif + endif + + "return to original window, if it's there + let l:rw = go#ui#GetReturnWindow() + if !empty(l:rw) + execute l:rw . 'wincmd w' + unlet! w:vim_go_return_window + endif +endfunction + +" OpenDefinition parses the current line and jumps to it by openening a new +" tab +function! go#ui#OpenDefinition(filter) abort + let curline = getline('.') + + " don't touch our first line or any blank line + if curline =~ a:filter || curline =~ "^$" + " suppress information about calling this function + echo "" + return + endif + + " format: 'interface file:lnum:coln' + let mx = '^\(^\S*\)\s*\(.\{-}\):\(\d\+\):\(\d\+\)' + + " parse it now into the list + let tokens = matchlist(curline, mx) + + " convert to: 'file:lnum:coln' + let expr = tokens[2] . ":" . tokens[3] . ":" . tokens[4] + + " jump to it in a new tab, we use explicit lgetexpr so we can later change + " the behaviour via settings (like opening in vsplit instead of tab) + lgetexpr expr + tab split + ll 1 + + " center the word + norm! zz +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/autoload/go/util.vim b/.vim/bundle/vim-go/autoload/go/util.vim new file mode 100644 index 0000000..aaf7273 --- /dev/null +++ b/.vim/bundle/vim-go/autoload/go/util.vim @@ -0,0 +1,308 @@ +" PathSep returns the appropriate OS specific path separator. +function! go#util#PathSep() abort + if go#util#IsWin() + return '\' + endif + return '/' +endfunction + +" PathListSep returns the appropriate OS specific path list separator. +function! go#util#PathListSep() abort + if go#util#IsWin() + return ";" + endif + return ":" +endfunction + +" LineEnding returns the correct line ending, based on the current fileformat +function! go#util#LineEnding() abort + if &fileformat == 'dos' + return "\r\n" + elseif &fileformat == 'mac' + return "\r" + endif + + return "\n" +endfunction + +" Join joins any number of path elements into a single path, adding a +" Separator if necessary and returns the result +function! go#util#Join(...) abort + return join(a:000, go#util#PathSep()) +endfunction + +" IsWin returns 1 if current OS is Windows or 0 otherwise +function! go#util#IsWin() abort + let win = ['win16', 'win32', 'win64', 'win95'] + for w in win + if (has(w)) + return 1 + endif + endfor + + return 0 +endfunction + +function! go#util#has_job() abort + " job was introduced in 7.4.xxx however there are multiple bug fixes and one + " of the latest is 8.0.0087 which is required for a stable async API. + return has('job') && has("patch-8.0.0087") +endfunction + +let s:env_cache = {} + +" env returns the go environment variable for the given key. Where key can be +" GOARCH, GOOS, GOROOT, etc... It caches the result and returns the cached +" version. +function! go#util#env(key) abort + let l:key = tolower(a:key) + if has_key(s:env_cache, l:key) + return s:env_cache[l:key] + endif + + if executable('go') + let l:var = call('go#util#'.l:key, []) + if go#util#ShellError() != 0 + call go#util#EchoError(printf("'go env %s' failed", toupper(l:key))) + return '' + endif + else + let l:var = eval("$".toupper(a:key)) + endif + + let s:env_cache[l:key] = l:var + return l:var +endfunction + +function! go#util#goarch() abort + return substitute(go#util#System('go env GOARCH'), '\n', '', 'g') +endfunction + +function! go#util#goos() abort + return substitute(go#util#System('go env GOOS'), '\n', '', 'g') +endfunction + +function! go#util#goroot() abort + return substitute(go#util#System('go env GOROOT'), '\n', '', 'g') +endfunction + +function! go#util#gopath() abort + return substitute(go#util#System('go env GOPATH'), '\n', '', 'g') +endfunction + +function! go#util#osarch() abort + return go#util#goos() . '_' . go#util#goarch() +endfunction + +" System runs a shell command. It will reset the shell to /bin/sh for Unix-like +" systems if it is executable. +function! go#util#System(str, ...) abort + let l:shell = &shell + if !go#util#IsWin() && executable('/bin/sh') + let &shell = '/bin/sh' + endif + + try + let l:output = call('system', [a:str] + a:000) + return l:output + finally + let &shell = l:shell + endtry +endfunction + +function! go#util#ShellError() abort + return v:shell_error +endfunction + +" StripPath strips the path's last character if it's a path separator. +" example: '/foo/bar/' -> '/foo/bar' +function! go#util#StripPathSep(path) abort + let last_char = strlen(a:path) - 1 + if a:path[last_char] == go#util#PathSep() + return strpart(a:path, 0, last_char) + endif + + return a:path +endfunction + +" StripTrailingSlash strips the trailing slash from the given path list. +" example: ['/foo/bar/'] -> ['/foo/bar'] +function! go#util#StripTrailingSlash(paths) abort + return map(copy(a:paths), 'go#util#StripPathSep(v:val)') +endfunction + +" Shelljoin returns a shell-safe string representation of arglist. The +" {special} argument of shellescape() may optionally be passed. +function! go#util#Shelljoin(arglist, ...) abort + try + let ssl_save = &shellslash + set noshellslash + if a:0 + return join(map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')'), ' ') + endif + + return join(map(copy(a:arglist), 'shellescape(v:val)'), ' ') + finally + let &shellslash = ssl_save + endtry +endfunction + +fu! go#util#Shellescape(arg) + try + let ssl_save = &shellslash + set noshellslash + return shellescape(a:arg) + finally + let &shellslash = ssl_save + endtry +endf + +" Shelllist returns a shell-safe representation of the items in the given +" arglist. The {special} argument of shellescape() may optionally be passed. +function! go#util#Shelllist(arglist, ...) abort + try + let ssl_save = &shellslash + set noshellslash + if a:0 + return map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')') + endif + return map(copy(a:arglist), 'shellescape(v:val)') + finally + let &shellslash = ssl_save + endtry +endfunction + +" Returns the byte offset for line and column +function! go#util#Offset(line, col) abort + if &encoding != 'utf-8' + let sep = go#util#LineEnding() + let buf = a:line == 1 ? '' : (join(getline(1, a:line-1), sep) . sep) + let buf .= a:col == 1 ? '' : getline('.')[:a:col-2] + return len(iconv(buf, &encoding, 'utf-8')) + endif + return line2byte(a:line) + (a:col-2) +endfunction +" +" Returns the byte offset for the cursor +function! go#util#OffsetCursor() abort + return go#util#Offset(line('.'), col('.')) +endfunction + +" Windo is like the built-in :windo, only it returns to the window the command +" was issued from +function! go#util#Windo(command) abort + let s:currentWindow = winnr() + try + execute "windo " . a:command + finally + execute s:currentWindow. "wincmd w" + unlet s:currentWindow + endtry +endfunction + +" snippetcase converts the given word to given preferred snippet setting type +" case. +function! go#util#snippetcase(word) abort + let l:snippet_case = get(g:, 'go_snippet_case_type', "snakecase") + if l:snippet_case == "snakecase" + return go#util#snakecase(a:word) + elseif l:snippet_case == "camelcase" + return go#util#camelcase(a:word) + else + return a:word " do nothing + endif +endfunction + +" snakecase converts a string to snake case. i.e: FooBar -> foo_bar +" Copied from tpope/vim-abolish +function! go#util#snakecase(word) abort + let word = substitute(a:word,'::','/','g') + let word = substitute(word,'\(\u\+\)\(\u\l\)','\1_\2','g') + let word = substitute(word,'\(\l\|\d\)\(\u\)','\1_\2','g') + let word = substitute(word,'[.-]','_','g') + let word = tolower(word) + return word +endfunction + +" camelcase converts a string to camel case. i.e: FooBar -> fooBar +" Copied from tpope/vim-abolish +function! go#util#camelcase(word) abort + let word = substitute(a:word, '-', '_', 'g') + if word !~# '_' && word =~# '\l' + return substitute(word,'^.','\l&','') + else + return substitute(word,'\C\(_\)\=\(.\)','\=submatch(1)==""?tolower(submatch(2)) : toupper(submatch(2))','g') + endif +endfunction + +function! go#util#AddTags(line1, line2, ...) abort + " default is json + let l:keys = ["json"] + if a:0 + let l:keys = a:000 + endif + + let l:line1 = a:line1 + let l:line2 = a:line2 + + " If we're inside a struct and just call this function let us add the tags + " to all fields + " TODO(arslan): I don't like using patterns. Check if we can move it to + " `motion` and do it via AST based position + let ln1 = searchpair('struct {', '', '}', 'bcnW') + if ln1 == 0 + echon "vim-go: " | echohl ErrorMsg | echon "cursor is outside the struct" | echohl None + return + endif + + " searchpair only returns a single position + let ln2 = search('}', "cnW") + + " if no range is given we apply for the whole struct + if l:line1 == l:line2 + let l:line1 = ln1 + 1 + let l:line2 = ln2 - 1 + endif + + for line in range(l:line1, l:line2) + " get the field name (word) that are not part of a commented line + let l:matched = matchstr(getline(line), '\(\/\/.*\)\@ +endif + +let s:save_cpo = &cpo +set cpo-=C +if filereadable("makefile") || filereadable("Makefile") + CompilerSet makeprg=make +else + CompilerSet makeprg=go\ build +endif + +" Define the patterns that will be recognized by QuickFix when parsing the +" output of Go command that use this errorforamt (when called make, cexpr or +" lmake, lexpr). This is the global errorformat, however some command might +" use a different output, for those we define them directly and modify the +" errorformat ourselves. More information at: +" http://vimdoc.sourceforge.net/htmldoc/quickfix.html#errorformat +CompilerSet errorformat =%-G#\ %.%# " Ignore lines beginning with '#' ('# command-line-arguments' line sometimes appears?) +CompilerSet errorformat+=%-G%.%#panic:\ %m " Ignore lines containing 'panic: message' +CompilerSet errorformat+=%Ecan\'t\ load\ package:\ %m " Start of multiline error string is 'can\'t load package' +CompilerSet errorformat+=%A%f:%l:%c:\ %m " Start of multiline unspecified string is 'filename:linenumber:columnnumber:' +CompilerSet errorformat+=%A%f:%l:\ %m " Start of multiline unspecified string is 'filename:linenumber:' +CompilerSet errorformat+=%C%*\\s%m " Continuation of multiline error message is indented +CompilerSet errorformat+=%-G%.%# " All lines not matching any of the above patterns are ignored + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/doc/vim-go.txt b/.vim/bundle/vim-go/doc/vim-go.txt new file mode 100644 index 0000000..2d7a03b --- /dev/null +++ b/.vim/bundle/vim-go/doc/vim-go.txt @@ -0,0 +1,1557 @@ +*vim-go.txt* Go development plugin +*vim-go* + +============================================================================== +# # +# ## ## #### ## ## ###### ####### # +# ## ## ## ### ### ## ## ## ## # +# ## ## ## #### #### ## ## ## # +# ## ## ## ## ### ## ####### ## #### ## ## # +# ## ## ## ## ## ## ## ## ## # +# ## ## ## ## ## ## ## ## ## # +# ### #### ## ## ###### ####### # +# # +============================================================================== +CONTENTS *go-contents* + + 1. Intro........................................|go-intro| + 2. Install......................................|go-install| + 3. Commands.....................................|go-commands| + 4. Mappings.....................................|go-mappings| + 5. Text Objects.................................|go-text-objects| + 6. Functions....................................|go-functions| + 7. Settings.....................................|go-settings| + 8. Troubleshooting..............................|go-troubleshooting| + 9. Credits......................................|go-credits| + +============================================================================== +INTRO *go-intro* + +Go (golang) support for Vim. vim-go installs automatically all necessary +binaries for providing seamless Vim integration. It comes with pre-defined +sensible settings (like auto gofmt on save), has autocomplete, snippet +support, improved syntax highlighting, go toolchain commands, etc... It's +highly customizable and each individual feature can be disabled/enabled +easily. + + * Improved Syntax highlighting with items such as Functions, Operators, + Methods. + * Auto completion support via `gocode`. + * Better `gofmt` on save, which keeps cursor position and doesn't break your + undo history. + * Go to symbol/declaration with `:GoDef`. + * Look up documentation with `:GoDoc` inside Vim or open it in browser. + * Automatically import packages via `:GoImport` or plug it into autosave. + * Compile your package with `:GoBuild`, install them with `:GoInstall` or + test them with `:GoTest` (also supports running single tests with + `:GoTestFunc`). + * Quickly execute your current file/files with `:GoRun`. + * Automatic `GOPATH` detection based on the directory structure (e.g. `gb` + projects, `godep` vendored projects). + * Change or display `GOPATH` with `:GoPath`. + * Create a coverage profile and display annotated source code in to see + which functions are covered with `:GoCoverage`. + * Call `gometalinter` with `:GoMetaLinter`, which invokes all possible + linters (golint, vet, errcheck, deadcode, etc..) and shows the + warnings/errors. + * Lint your code with `:GoLint`. + * Run your code through `:GoVet` to catch static errors. + * Advanced source analysis tools utilizing guru, such as `:GoImplements`, + `:GoCallees`, and `:GoReferrers`. + * Precise type-safe renaming of identifiers with `:GoRename`. + * List all source files and dependencies. + * Unchecked error checking with `:GoErrCheck`. + * Integrated and improved snippets, supporting `ultisnips` or `neosnippet`. + * Share your current code to [play.golang.org](http://play.golang.org) with + `:GoPlay` + * On-the-fly type information about the word under the cursor. Plug it into + your custom Vim function. + * Go asm formatting on save. + * Tagbar support to show tags of the source code in a sidebar with `gotags`. + * Custom vim text objects such as `a function` or `inner function`. + * A async launcher for the go command is implemented for neovim, fully async + building and testing. + * Integrated with the neovim terminal, launch `:GoRun` and other go commands + in their own new terminal. + * Alternate between implementation and test code with `:GoAlternate`. + +============================================================================== +INSTALL *go-install* + +Vim-go follows the standard runtime path structure, so I highly recommend to +use a common and well known plugin manager to install vim-go. Do not use +vim-go with other Go plugins. For Pathogen just clone the repo, for other +plugin managers add the appropriate lines and execute the plugin's install +command. + +* https://github.com/tpope/vim-pathogen > + + git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go +< +* https://github.com/junegunn/vim-plug > + + Plug 'fatih/vim-go' + +* https://github.com/Shougo/neobundle.vim > + + NeoBundle 'fatih/vim-go' +< +* https://github.com/gmarik/vundle > + + Plugin 'fatih/vim-go' + +* Vim |packages| (since Vim 7.4.1528) +> + git clone https://github.com/fatih/vim-go.git \ + ~/.vim/pack/plugins/start/vim-go +< +* Manual > + + Copy all of the files into your `~/.vim` directory +< + +Please be sure all necessary binaries are installed (such as `gocode`, +`godef`, `goimports`, etc.). You can easily install them with the included +|:GoInstallBinaries| command. If you invoke it, all necessary binaries will be +automatically downloaded and installed to your `$GOBIN` environment (if not +set it will use `$GOPATH/bin`). It requires `git` for fetching the individual +Go packages. + +* Autocompletion is enabled by default via ``, to get real-time +completion (completion by type) install: +https://github.com/Shougo/neocomplete.vim for Vim or +https://github.com/Shougo/deoplete.nvim and +https://github.com/zchee/deoplete-go for Neovim +* To get displayed source code tag informations on a sidebar install +https://github.com/majutsushi/tagbar. +* For snippet feature install: +https://github.com/Shougo/neosnippet.vim or +https://github.com/SirVer/ultisnips. +* For a better documentation viewer check out: + https://github.com/garyburd/go-explorer + +============================================================================== +COMMANDS *go-commands* + + *:GoPath* +:GoPath [path] + + GoPath sets and overrides GOPATH with the given {path}. If no {path} is + given it shows the current GOPATH. If `""` is given as path, it clears + current `GOPATH` which was set with |:GoPath| and restores `GOPATH` back + to the initial value which was sourced when Vim was started. + + *:GoImport* +:GoImport[!] [path] + + Import ensures that the provided package {path} is imported in the current + Go buffer, using proper style and ordering. If {path} is already being + imported, an error will be displayed and the buffer will be untouched. + + If [!] is given it will download the package with `go get` + + *:GoImportAs* +:GoImportAs [localname] [path] + + Same as Import, but uses a custom local name for the package. + + *:GoDrop* +:GoDrop [path] + + Remove the import line for the provided package {path}, if present in the + current Go buffer. If {path} is not being imported, an error will be + displayed and the buffer will be untouched. + + *:GoLint* +:GoLint [packages] + + Run golint for the current Go file, or for given packages. + + *:GoDoc* +:GoDoc [word] + + Open the relevant GoDoc in split window for either the word[s] passed to + the command or by default, the word under the cursor. + + *:GoDocBrowser* +:GoDocBrowser [word] + + Open the relevant GoDoc in browser for either the word[s] passed to the + command or by default, the word under the cursor. + + *:GoFmt* +:GoFmt + + Filter the current Go buffer through gofmt. It tries to preserve cursor + position and avoids replacing the buffer with stderr output. + + *:GoImports* +:GoImports + + Filter the current Go buffer through goimports (needs to be installed). + `goimports` automatically discards/add import path based on the code. Like + |:GoFmt|, It tries to preserve cursor position and avoids replacing the + buffer with stderr output. + + *:GoPlay* +:[range]GoPlay + + Share snippet to play.golang.org. If no [range] is given it shares + the whole file, otherwise the selected lines are shared. Snippet URL + is copied to system clipboard if Vim is compiled with 'clipboard' or + 'xterm-clipboard' otherwise it's get yanked into the `""` register. + + *:GoVet* +:GoVet[!] [options] + + Run `go vet` for the directory under your current file. Vet examines Go + source code and reports suspicious constructs, such as Printf calls whose + arguments do not align with the format string. Vet uses heuristics that do + not guarantee all reports are genuine problems, but it can find errors not + caught by the compilers. + + You may optionally pass any valid go tool vet flags/options. In this case, + `go tool vet` is run in place of `go vet`. For a full list please see + `go tool vet -h`. + + If [!] is not given the first error is jumped to. + + *:GoDef* +:GoDef [identifier] +gd +CTRL-] + + Goto declaration/definition for the given [identifier]. If no argument is + given, it will jump to the declaration under the cursor. By default the + CTRL-] key and the mapping `gd` are enabled to invoke :GoDef for the + identifier under the cursor. See |'g:go_def_mapping_enabled'| to disable + them. + + vim-go also keeps a per-window location stack, roughly analogous to how + Vim's internal |tags| functionality works. This is pushed to every time a + jump is made using the GoDef functionality. In essence, this is a LIFO + list of file locations you have visited with :GoDef that is retained to + help you navigate software. + + *:GoDefStack* +:GoDefStack [number] + + This command Jumps to a given location in the jumpstack, retaining all + other entries. Jumps to non-existent entries will print an informative + message, but are otherwise a noop. + + If no argument is given, it will print out an interactive list of all + items in the stack. Its output looks like this: + + 1 /path/first/file.go|1187 col 16|AddThing func(t *Thing) + > 2 /path/thing/thing.go|624 col 19|String() string + 3 /path/thing/thing.go|744 col 6|func Sprintln(a ...interface{}) string + + This list shows the identifiers that you jumped to and the file and cursor + position before that jump. The older jumps are at the top, the newer at + the bottom. + + The '>' points to the active entry. This entry and any newer entries + below it will be replaced if |:GoDef| is done from this location. The + CTRL-t and |:GoDefPop| command will jump to the position above the active + entry. + + Jumps to non-existent entries will print an informative message, but are + otherwise a noop. + + *:GoDefStackClear* +:GoDefStackClear + + Clears the current stack list and resets it. + + *:GoDefPop* +:GoDefPop [count] +CTRL-t + + Navigate to the [count] earlier entry in the jump stack, retaining the + newer entries. If no argument is given, it will jump to the next most + recent entry (`:GoDefPop 1`). If [count] is greater than the number of + prior entries, an error will be printed and no jump will be performed. + + If you have used :GoDefPop to jump to an earlier location, and you issue + another :GoDef command, the current entry will be replaced, and all newer + entries will be removed, effectively resuming the stack at that location. + + By default [count]CTRL-t is enabled to invoke :GoDefPop. Similarly, + hitting CTRL-t without a prior count is equivalent to `:GoDefPop 1`. See + |'g:go_def_mapping_enabled'| to disable this. + + *:GoRun* +:GoRun[!] [expand] + + Build and run your current main package. By default all main files for the + current file is used. If an argument is passed, [expand] is used as file + selector. For example use `:GoRun %` to select the current file only. + + You may optionally pass any valid go run flags/options. For a full list + please see `go help run`. + + If [!] is not given the first error is jumped to. + + If using neovim then `:GoRun` will run in a new terminal according to + |'g:go_term_mode'|. + + *:GoBuild* +:GoBuild[!] [expand] + + Build your package with `go build`. Errors are populated in the quickfix + window. It automatically builds only the files that depends on the current + file. `:GoBuild` doesn't produce a result file. + Use |:make| to create a result file. + + You may optionally pass any valid go build flags/options. For a full list + please see `go help build`. Options are expanded with [expand]. + + If [!] is not given the first error is jumped to. + + If using neovim then this command is fully async, it does not block the + UI. + + *:GoGenerate* +:GoGenerate[!] [expand] + + Creates or updates your auto-generated source files by running `go + generate`. + + You may optionally pass any valid go generate flags/options. For a full + list please see `go help generate`. Options are expanded with [expand]. + + If [!] is not given the first error is jumped to. + + *:GoInfo* +:GoInfo + Show type information about the identifier under the cursor. For example + putting it above a function call is going to show the full function + signature. By default it uses `gocode` to get the type informations. To + change the underlying tool from `gocode` to another tool, see + |g:go_info_mode|. + + + *:GoInstall* +:GoInstall[!] [options] + + Install your package with `go install`. + + You may optionally pass any valid go install flags/options. For a full + list please see `go help install`. + + If [!] is not given the first error is jumped to. + + *:GoTest* +:GoTest[!] [expand] + + Run the tests on your _test.go files via in your current directory. Errors + are populated in the quickfix window. If an argument is passed, [expand] + is used as file selector (useful for cases like `:GoTest ./...`). + + You may optionally pass any valid go test flags/options. For a full list + please see `go help test`. + + GoTest timesout automatically after 10 seconds. To customize the timeout + use |'g:go_test_timeout'|. This feature is disabled if any arguments are + passed to the `:GoTest` command. + + If [!] is not given the first error is jumped to. + + If using neovim `:GoTest` will run in a new terminal or run asynchronously + in the background according to |'g:go_term_enabled'|. You can set the mode + of the new terminal with |'g:go_term_mode'|. + + *:GoTestFunc* +:GoTestFunc[!] [expand] + + Runs :GoTest, but only on the single test function immediate to your + cursor using 'go test's '-run' flag. + + Lookup is done starting at the cursor (including that line) moving up till + a matching `func Test` pattern is found or top of file is reached. Search + will not wrap around when at the top of the file. + + If [!] is not given the first error is jumped to. + + If using neovim `:GoTestFunc` will run in a new terminal or run + asynchronously in the background according to |'g:go_term_enabled'|. You + can set the mode of the new terminal with |'g:go_term_mode'|. + + *:GoTestCompile* +:GoTestCompile[!] [expand] + + Compile your _test.go files via in your current directory. Errors are + populated in the quickfix window. If an argument is passed, [expand] is + used as file selector (useful for cases like `:GoTest ./...`). Useful to + not run the tests and capture/fix errors before running the tests or to + create test binary. + + If [!] is not given the first error is jumped to. + + If using neovim `:GoTestCompile` will run in a new terminal or run + asynchronously in the background according to |'g:go_term_enabled'|. You + can set the mode of the new terminal with |'g:go_term_mode'|. + + *:GoCoverage* +:GoCoverage[!] [options] + + Create a coverage profile and annotates the current file's source code. If + called again it rerurns the tests. + + If [!] is not given the first error is jumped to. + + *:GoCoverageToggle* +:GoCoverageToggle[!] [options] + + Create a coverage profile and annotates the current file's source code. If + called again clears the annotation (works as a toggle). + + If [!] is not given the first error is jumped to. + + *:GoCoverageClear* +:GoCoverageClear [options] + + Clears the coverage annotation. + + + *:GoCoverageBrowser* +:GoCoverageBrowser[!] [options] + + Create a coverage profile and open a browser to display the annotated + source code of the current package. + + You may optionally pass any valid go test flags/options, such as + `-covermode set,count,atomic`. For a full list please see `go help test`. + + If [!] is not given the first error is jumped to. + + *:GoErrCheck* +:GoErrCheck [options] + + Check for unchecked errors in you current package. Errors are populated in + the quickfix window. + + You may optionally pass any valid errcheck flags/options. For a full list + please see `errcheck -h`. + + *:GoFiles* +:GoFiles + + Show source files that depends for the current package + + *:GoDeps* +:GoDeps + + Show dependencies for the current package + + *:GoInstallBinaries* +:GoInstallBinaries + + Download and Install all necessary Go tool binaries such as `godef`, + `goimports`, `gocode`, etc. under `g:go_bin_path`. Set + |'g:go_get_update'| to disable updating dependencies. + + *:GoUpdateBinaries* +:GoUpdateBinaries + + Download and Update previously installed Go tool binaries such as `godef`, + `goimports`, `gocode`, etc.. under `g:go_bin_path`. This can be used to + update the necessary Go binaries. + + *:GoImplements* +:GoImplements + + Show "implements" relation for a selected package. A list of interfaces + for the type that implements an interface under the cursor (or selected + package) is shown in a location list. + *:GoRename* +:GoRename[!] [to] + + Rename the identifier under the cursor to the desired new name. If no + argument is given a prompt will ask for the desired identifier. + + If [!] is not given the first error is jumped to. + + + *:GoGuruScope* +:GoGuruScope [pattern] [pattern2] ... [patternN] + + Changes the custom |'g:go_guru_scope'| setting and overrides it with the + given package patterns. The custom scope is cleared (unset) if `""` is + given as the only path. If no arguments is given it prints the current + custom scope. Example patterns are: +> + golang.org/x/tools/cmd/guru # a single package + golang.org/x/tools/... # all packages beneath dir + ... # the entire workspace. +< + Example usage, the following sets the scope to a `github.com/fatih/color` + and to all packages under `golang.org/x/tools/`: +> + :GoGuruScope github.com/fatih/color golang.org/x/tools/... +< + The following sets it to the entire workspace: +> + :GoGuruScope ... +< + Under the hood, the patterns are all joined to a comma-separated list and + passed to `guru`'s `-scope` flag. + + *:GoCallees* +:GoCallees + + Show "callees" relation for a selected package. A list of possible call + targets for the type under the cursor (or selected package) is shown in a + location list. + + *:GoCallers* +:GoCallers + + Show "callers" relation for a selected function. A list of possible + callers for the selected function under the cursor is shown in a location + list. + + *:GoDescribe* +:GoDescribe + + Shows various properties of the selected syntax: its syntactic kind, its + type (for an expression), its value (for a constant expression), its size, + alignment, method set and interfaces (for a type), its declaration (for an + identifier), etc. Almost any piece of syntax may be described, and the + guru will try to print all the useful information it can. + + *:GoCallstack* +:GoCallstack + + Shows "callstack" relation for the selected function. An arbitrary path + from the root of the callgraph to the selected function is shown in a + location list. This may be useful to understand how the function is + reached in a given program. + + *:GoFreevars* +:GoFreevars + + Enumerates the free variables of the selection. “Free variables” is a + technical term meaning the set of variables that are referenced but not + defined within the selection, or loosely speaking, its inputs. + + This information is useful if you’re considering whether to refactor the + selection into a function of its own, as the free variables would be the + necessary parameters of that function. It’s also useful when you want to + understand what the inputs are to a complex block of code even if you + don’t plan to change it. + + *:GoChannelPeers* +:GoChannelPeers + + Shows the set of possible sends/receives on the channel operand of the + selected send or receive operation; the selection must be a `<-` token. + + For example, visually select a channel operand in the form of: +> + done <- true +< + And call |:GoChannelPeers| on it. It will show where it was allocated, and + the sending and receiving endings. + + *:GoReferrers* +:GoReferrers + + The referrers query shows the set of identifiers that refer to the same + object as does the selected identifier, within any package in the analysis + scope. + + *:GoSameIds* +:GoSameIds + + Highlights all identifiers that are equivalent to the identifier under the + cursor. + + *:GoSameIdsClear* +:GoSameIdsClear + + Clears all SameIds highlights from a |:GoSameIds| call. + + *:GoSameIdsToggle* +:GoSameIdsToggle + + Toggle between |:GoSameIds| and |:GoSameIdsClear|. + + *:GoSameIdsAutoToggle* +:GoSameIdsAutoToggle + + Enables or disables automatic highlighting of |:GoSameIds| while moving + the cursor. This basically toggles the option |'g:go_auto_sameids'| + on/off. + If enabled it starts highlighting whenever your cursor is staying at the + same position for a configurable period of time (see 'updatetime'). If + disabled it clears and stops automatic highlighting. + + *:GoMetaLinter* +:GoMetaLinter [path] + + Calls the underlying `gometalinter` tool and displays all warnings and + errors in the |quickfix| window. By default the following linters are + enabled: `vet`, `golint`, and `errcheck`. This can be changed with the + |'g:go_metalinter_enabled'| variable. To override the command completely + use the variable |'g:go_metalinter_command'|. To override the maximum + linters execution time use |'g:go_metalinter_deadline'| variable. + + *:GoGuruTags* +:GoGuruTags [tags] + + Changes the custom |'g:go_guru_tags'| setting and overrides it with the + given build tags. This command cooperate with GoReferrers command when + there exist mulitiple build tags in your project, then you can set one of + the build tags for GoReferrers to find more accurate. + The custom build tags is cleared (unset) if `""` is given. If no arguments + is given it prints the current custom build tags. + + *:AsmFmt* +:AsmFmt + + Filter the current Go asm buffer through asmfmt. It tries to preserve + cursor position and avoids replacing the buffer with stderr output. + + *:GoAlternate* +:GoAlternate[!] + + Alternates between the implementation and test code. For example if in + main.go, switch to main_test.go. Uses the |'g:go_alternate_mode'| setting + as the command to open the file. + + If [!] is given then it switches to the new file even if it does not + exist. + + If you would like to override the traditional commands for alternating, + add the following to your .vimrc: +> + augroup go + autocmd! + autocmd Filetype go + \ command! -bang A call go#alternate#Switch(0, 'edit') + \| command! -bang AV call go#alternate#Switch(0, 'vsplit') + \| command! -bang AS call go#alternate#Switch(0, 'split') + augroup END +< + *:GoWhicherrs* +:GoWhicherrs + + Show the list of possible constants, global variables, and concrete types + for the error type under the cursor in a location list. + + *:GoDecls* +:GoDecls [file] + + Only enabled if `ctrlp.vim` is installed. If run shows all function and + type declarations for the current file. If [file] is non empty it parses + the given file. + By default `type` and `func` declarations are shown. This can be changed + via |'g:go_decls_includes'|. + + *:GoDeclsDir* +:GoDeclsDir [dir] + + Only enabled if `ctrlp.vim` is installed. If run shows all function and + type declarations for the current directory. If [dir] is given it parses + the given directory. + + *:GoImpl* +:GoImpl [receiver] [interface] + + Generates method stubs for implementing an interface. If no arguments is + passed it takes the identifier under the cursor to be the receiver and + asks for the interface type to be generated. If used with arguments, the + receiver and the interface needs to be specified. Example usages: +> + :GoImpl f *Foo io.Writer + :GoImpl T io.ReadWriteCloser +< + *:GoAddTags* +:[range]GoAddTags [key] [key1] ... + + Adds field tags for the fields of a struct. If called inside a struct it + automatically add field tags with the `json` key and the value + automatically generated based on the field name. An error message is given + if it's called outside a struct definition. + + If [range] is given, only the selected fields will be changed. + + The default `json` can be changed by providing one or more [key] + arguments. An example of adding `xml` and `db` would be: +> + :GoAddTags xml db +< + *:GoAutoTypeInfoToggle* +:GoAutoTypeInfoToggle + + Toggles |'g:go_auto_type_info'|. + + *:GoFmtAutoSaveToggle* +:GoFmtAutoSaveToggle + + Toggles |'g:go_fmt_autosave'|. + + *:GoAsmFmtAutoSaveToggle* +:GoAsmFmtAutoSaveToggle + + Toggles |'g:go_asmfmt_autosave'|. + + *:GoMetaLinterAutoSaveToggle* +:GoMetaLinterAutoSaveToggle + + Toggles |'g:go_metalinter_autosave'|. + + *:GoTemplateAutoCreateToggle* +:GoTemplateAutoCreateToggle + + Toggles |'g:go_template_autocreate'|. + + +============================================================================== +MAPPINGS *go-mappings* + +vim-go has several keys which can be used to create custom mappings +For example, to create a mapping that `go run` for the current package, create +a mapping for the `(go-run)`: > + + au FileType go nmap r (go-run) + +As always one is free to create more advanced mappings or functions based with +|go-commands|. For more information please check out the mappings command +documentation in the |go-commands| section. Available keys are: + + *(go-run)* + +Calls `go run` for the current main package + + *(go-run-tab)* + +Calls `go run` for the current file in a new terminal tab +This option is neovim only. + + *(go-run-split)* + +Calls `go run` for the current file in a new terminal horizontal split +This option is neovim only. + + *(go-run-vertical)* + +Calls `go run` for the current file in a new terminal vertical split +This option is neovim only. + + *(go-build)* + +Calls `go build` for the current package + + *(go-generate)* + +Calls `go generate` for the current package + + *(go-info)* + +Shows type information for the word under the cursor + + *(go-install)* + +Calls `go install` for the current package + + *(go-test)* + +Calls `go test` for the current package + + *(go-test-func)* + +Calls `go test -run '...'` for the test function immediate to cursor + + *(go-test-compile)* + +Calls `go test -c` for the current package + + *(go-coverage)* + +Calls `go test -coverprofile-temp.out` for the current package and shows the +coverage annotation. + + *(go-coverage-clear)* + +Clears the coverage annotation + + *(go-coverage-toggle)* + +Calls `go test -coverprofile-temp.out` for the current package and shows the +coverage annotation. If run agains it acts as a toggle and clears the +annotation. + + *(go-imports)* + +Calls `goimports` for the current package + + *(go-lint)* + +Calls `golint` for the current package + + *(go-vet)* + +Calls `go vet` for the current package + + + *(go-files)* + +Show source files that depends for the current package + + + *(go-deps)* + +Show dependencies for the current package + + *(go-doc)* + +Show the relevant GoDoc for the word under the cursor in a split window +leftabove (default mode). + + *(go-doc-split)* + +Show the relevant GoDoc for the word under the cursor in a split window. + + + *(go-doc-vertical)* + +Show the relevant GoDoc for the word under the cursor in a vertical split +window. + + *(go-doc-tab)* + +Show the relevant GoDoc for the word under the cursor in a tab window. + + + *(go-doc-browser)* + +Show the relevant GoDoc for the word under in browser + + *(go-def)* + +Goto declaration/definition. Results are shown in the current buffer. + + *(go-def-split)* + +Goto declaration/definition. Results are shown in a split window. +Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled. + + *(go-def-vertical)* + +Goto declaration/definition. Results are shown in a vertical split window. +Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled. + + *(go-def-tab)* + +Goto declaration/definition. Results are shown in a tab window. +Jumps to an existing buffer if |'g:go_def_reuse_buffer'| is enabled. + + *(go-def-stack)* + +Shows the godef tag stack + + *(go-def-stack-clear)* + +Resets and clears the tag stack + + *(go-def-pop)* + +Jump to previous entry in the tag stack + + *(go-implements)* + +Show the interfaces that the type under the cursor implements. + + *(go-rename)* + +Rename the identifier under the cursor to the desired new name + + *(go-callees)* + +Show the call targets for the type under the cursor + + *(go-callers)* + +Show possible callers of selected function + + *(go-describe)* + +Describe selected syntax: definition, methods, etc + + *(go-callstack)* + +Show path from callgraph root to selected function + + *(go-freevars)* + +Show free variables of selection + + *(go-channelpeers)* + +Show send/receive corresponding to selected channel op + + *(go-referrers)* + +Show all refs to entity denoted by selected identifier + + *(go-metalinter)* + +Calls `go-metalinter` for the current directory + + *(go-alternate-edit)* + +Alternates between the implementation and test code in the current window + + *(go-alternate-split)* + +Alternates between the implementation and test code in a new horizontal split + + *(go-alternate-vertical)* + +Alternates between the implementation and test code in a new vertical split + + *(go-import)* + +Calls `:GoImport` for the current package + + +============================================================================== +TEXT OBJECTS *go-text-objects* + +vim-go comes with several custom |text-objects| that can be used to operate +upon regions of text. vim-go currently defines the following text objects: + + *go-v_af* *go-af* +af "a function", select contents from a function definition to the + closing bracket. If |'g:go_textobj_include_function_doc'| is + enabled it also includes the comment doc for a function + declaration. This text-object also supports literal functions. + + *go-v_if* *go-if* +if "inside a function", select contents of a function, + excluding the function definition and the closing bracket. This + text-object also supports literal functions + + +vim-go also defines the following text motion objects: + + *go-v_]]* *go-]]* +]] [count] forward to next function declaration. If + |'g:go_textobj_include_function_doc'| is enabled and if your + on a comment, it skips the function which the comment + belongs and forwards to the next function declaration. + + *go-v_[[* *go-[[* +[[ [count] backward to previous function declaration. + + + +============================================================================== +FUNCTIONS *go-functions* + + *go#statusline#Show()* + +Shows the status of a job running asynchronously. Can be used to plug into the +statusline. It works to show the status per package instead of per +file. Assume you have three files open, all belonging to the same package, if +the package build (`:GoBuild`) is successful, all statusline's will show +`success`, if you it fails all file's statusline will show `failed`. + +To avoid always showing old status information, the status information is +cleaned for each package after `60` seconds. This can be changed with the +|g:go_statusline_duration| setting. + + *go#complete#GetInfo()* + +Returns the description of the identifer under the cursor. Can be used to plug +into the statusline. This function is also used for |'g:go_auto_type_info'|. + +============================================================================== +SETTINGS *go-settings* + + *'g:go_test_timeout'* + +Use this option to change the test timeout of |:GoTest|. By default it is +set to 10 seconds . > + + let g:go_test_timeout= '10s' +< + *'g:go_play_browser_command'* + +Use this option to change the browser that is used to open the snippet url +posted to play.golang.org with |:GoPlay| or for the relevant documentation +used with |:GoDocBrowser|. By default it tries to find it automatically for +the current OS. > + + let g:go_play_browser_command = '' +< + *'g:go_play_open_browser'* + +Use this option to open browser after posting the snippet to play.golang.org +with |:GoPlay|. By default it's enabled. > + + let g:go_play_open_browser = 1 +< + *'g:go_auto_type_info'* + +Use this option to show the type info (|:GoInfo|) for the word under the +cursor automatically. Whenever the cursor changes the type info will be +updated. By default it's disabled. The delay can be configured with the +'g:go_updatetime' setting. +> + let g:go_auto_type_info = 0 +< + + *'g:go_info_mode'* + +Use this option to define the command to be used for |:GoInfo|. By default +`gocode` is being used as it's the fastest option. But one might also use +`guru` as it's covers more cases and is more accurate. Current valid options +are: `[gocode, guru]` > + + let g:go_info_mode = 'gocode' +< + *'g:go_auto_sameids'* + +Use this option to highlight all uses of the identifier under the cursor +(:GoSameIds) automatically. By default it's disabled. The delay can be +configured with the 'g:go_updatetime' setting. +> + let g:go_auto_sameids = 0 +< + *'g:go_updatetime'* + +Use this option to configure the a custom 'updatetime' for Go source files. If +set to 0, no custom time will be configured. By default it's set to 800ms. +> + let g:go_updatetime = 800 +< + *'g:go_jump_to_error'* + +Use this option to enable/disable passing the bang attribute to the mappings +|(go-build)|, |(go-run)|, etc.. When enabled it will jump to the first error +automatically (means it will NOT pass the bang attribute to the appropriate +command, i.e: (go-run) -> :GoRun ). Note, that calling this doesn't have any +affect on calling the commands manually. This setting is only useful for +changing the behaviour of our custom static mappings. By default it's enabled. +> + let g:go_jump_to_error = 1 +< + *'g:go_fmt_autosave'* + +Use this option to auto |:GoFmt| on save. By default it's enabled > + + let g:go_fmt_autosave = 1 +< + *'g:go_fmt_command'* + +Use this option to define which tool is used to gofmt. By default `gofmt` is +used > + + let g:go_fmt_command = "gofmt" +< + *'g:go_fmt_options'* + +Use this option to add additional options to the |'g:go_fmt_command'|. Default +is empty. > + + let g:go_fmt_options = '' +< + *'g:go_fmt_fail_silently'* + +Use this option to disable showing a location list when |'g:go_fmt_command'| +fails. By default the location list is shown. > + + let g:go_fmt_fail_silently = 0 +< + *'g:go_fmt_experimental'* + +Use this option to enable fmt's experimental mode. This experimental mode is +superior to the current mode as it fully saves the undo history, so undo/redo +doesn't break. However it's slows (creates/deletes a file for every save) and +it's causing problems on some Vim versions. By default it's disabled. > + + let g:go_fmt_experimental = 0 +< + *'g:go_doc_keywordprg_enabled'* + +Use this option to run `godoc` on words under the cursor with the default K , +keywordprg shortcut. Usually this shortcut is set to use the program `man`. In +Go, using `godoc` is more idiomatic. Default is enabled. > + + let g:go_doc_keywordprg_enabled = 1 +< + *'g:go_def_mode'* + +Use this option to define the command to be used for |:GoDef|. By default +`guru` is being used as it covers all edge cases. But one might also use +`godef` as it's more faster. Current valid options are: `[guru, godef]` > + + let g:go_def_mode = 'guru' +< + *'g:go_def_mapping_enabled'* + +Use this option to enable/disable the default mapping of CTRL-] and (`gd`) for +GoDef and CTRL-t for :GoDefPop. Disabling it allows you to map something else +to these keys or mappings. Default is enabled. > + + let g:go_def_mapping_enabled = 1 +< + *'g:go_def_reuse_buffer'* + +Use this option to jump to an existing buffer for the split, vsplit and tab +mappings of |:GoDef|. By default it's disabled. > + + let g:go_def_reuse_buffer = 0 +< + *'g:go_doc_command'* + +Use this option to define which tool is used to godoc. By default `godoc` is +used > + + let g:go_doc_command = "godoc" +< + *'g:go_doc_options'* + +Use this option to add additional options to the |'g:go_doc_command'|. Default +is empty. > + + let g:go_doc_options = '' + +< *'g:go_bin_path'* + +Use this option to change default path for vim-go tools when using +|:GoInstallBinaries| and |:GoUpdateBinaries|. If not set `$GOBIN` or +`$GOPATH/bin` is used. > + + let g:go_bin_path = "" +< + *'g:go_snippet_engine'* + +Use this option to define the default snippet engine. By default "ultisnips" +is used. Use "neosnippet" for neosnippet.vim: > + + let g:go_snippet_engine = "ultisnips" +< + *'g:go_snippet_case_type'* + +Use this option to define the default conversion type of snippet expansion for +field tags. For the following case, if `snakecase` is used the `json` snippet +will expand to: +> + type T struct { + FooBarQuz string `json:"foo_bar_quz" + } +< + +If "camelcase" is used: +> + type T struct { + FooBarQuz string `json:"fooBarQuz" + } +< +By default "snakecase" is used. Current values are: ["snakecase", +"camelcase"]. +> + let g:go_snippet_case_type = "snakecase" +< + *'g:go_get_update'* + +Use this option to disable updating dependencies with |:GoInstallBinaries|. By +default this is enabled. +> + let g:go_get_update = 1 +< + *'g:go_guru_scope'* + +Use this option to define the scope of the analysis to be passed for guru +related commands, such as |:GoImplements|, |:GoCallers|, etc. You can change +it on-the-fly with |:GoGuruScope|. The input should be a a list of package +pattern. An example input might be: +`["github.com/fatih/color","github.com/fatih/structs"]` By default it's not +set, so the relevant commands defaults are being used. +> + let g:go_guru_scope = [] +< + *'g:go_guru_tags'* + +These options that will be automatically passed to the `-tags` option of +`go guru` when it's invoked with |:GoDef|. You can use |:GoGuruTags| to set +this. By default it's not set. +> + let g:go_guru_tags = '' +< + + *'g:go_highlight_array_whitespace_error'* + +Highlights white space after "[]". > + + let g:go_highlight_array_whitespace_error = 1 +< + *'g:go_highlight_chan_whitespace_error'* + +Highlights white space around the communications operator (`<-`) that doesn't +follow the standard style. > + + let g:go_highlight_chan_whitespace_error = 1 +< + *'g:go_highlight_extra_types'* + +Highlights commonly used library types (io.Reader, etc.). > + + let g:go_highlight_extra_types = 1 +< + *'g:go_highlight_space_tab_error'* + +Highlights instances of tabs following spaces. > + + let g:go_highlight_space_tab_error = 1 +< + *'g:go_highlight_trailing_whitespace_error'* + +Highlights trailing white space. > + + let g:go_highlight_trailing_whitespace_error = 1 +< + *'g:go_highlight_operators'* + +Highlights operators such as `:=` , `==`, `-=`, etc. By default it's +disabled. > + + let g:go_highlight_operators = 0 +< + *'g:go_highlight_functions'* + +Highlights function names. By default it's disabled. > + + let g:go_highlight_functions = 0 +< + *'g:go_highlight_methods'* + +Highlights method names. By default it's disabled. > + + let g:go_highlight_methods = 0 +< + *'g:go_highlight_types'* + +Highlights struct and interface names. By default it's disabled. > + + let g:go_highlight_types = 0 +< + *'g:go_highlight_fields'* + +Highlights field names. By default it's disabled. > + + let g:go_highlight_fields = 0 +< + *'g:go_highlight_build_constraints'* + +Highlights build constraints. By default it's disabled. > + + let g:go_highlight_build_constraints = 0 +< + *'g:go_highlight_generate_tags'* + +Highlights go:generate directives. By default it's disabled. > + + let g:go_highlight_generate_tags = 0 +< + *'g:go_highlight_string_spellcheck'* + +Use this option to highlight spelling errors in strings when |spell| is +also enabled. By default it's enabled. > + + let g:go_highlight_string_spellcheck = 1 +< + *'g:go_highlight_format_strings'* + +Use this option to highlight printf-style operators inside string literals. +By default it's enabled. > + + let g:go_highlight_format_strings = 1 +< + *'g:go_autodetect_gopath'* + +Automatically modifies GOPATH for certain directory structures, such as for +the tool `godep` which has his own dependencies via the `Godeps` folder. What +this means is that all tools are now working with the newly modified GOPATH. +So |:GoDef| for example jumps to the source inside the `Godeps` (vendored) +source. Currently `godep` and `gb` is supported, in the near future more tool +supports will be added. By default it's enabled. > + + let g:go_autodetect_gopath = 1 +< + *'g:go_textobj_enabled'* + +Adds custom text objects. By default it's enabled. > + + let g:go_textobj_enabled = 1 +< + *'g:go_textobj_include_function_doc'* + +Consider the comment above a function to be part of the function when using +the `af` text object and `[[` motion. By default it's enabled. > + + let g:go_textobj_include_function_doc = 1 +< + *'g:go_metalinter_autosave'* + +Use this option to auto |:GoMetaLinter| on save. Only linter messages for +the active buffer will be shown. By default it's disabled > + + let g:go_metalinter_autosave = 0 +< + *'g:go_metalinter_autosave_enabled'* + +Specifies the enabled linters for auto |:GoMetaLinter| on save. By +default it's using `vet` and `golint`. +> + let g:go_metalinter_autosave_enabled = ['vet', 'golint'] +< + *'g:go_metalinter_enabled'* + +Specifies the currently enabled linters for the |:GoMetaLinter| command. By +default it's using `vet`, `golint` and `errcheck`. +> + let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck'] +< + *'g:go_metalinter_command'* + +Overrides the command to be executed when |:GoMetaLinter| is called. This is +an advanced settings and is for users who want to have a complete control +over how `gometalinter` should be executed. By default it's empty. +> + let g:go_metalinter_command = "" +< + *'g:go_metalinter_deadline'* + +Overrides the maximum time the linters have to complete. By default it's 5 +seconds. +> + let g:go_metalinter_deadline = "5s" +< + *'g:go_list_height'* + +Specifies the window height for the quickfix and location list windows. The +default value (empty) automatically sets the height to the number of items +(maximum up to 10 items to prevent large heights). Setting the value +explicitly overrides this behavior. For standard Vim behavior, set it to 10. +> + let g:go_list_height = 0 +< + *'g:go_list_type'* + +Specifies the type of list to use. The default value (empty) will use the +appropriate kind of list for the command that was called. Supported values are +"", "quickfix", and "locationlist". > + + let g:go_list_type = "" +< + *'g:go_asmfmt_autosave'* + +Use this option to auto |:AsmFmt| on save. By default it's disabled. > + + let g:go_asmfmt_autosave = 0 +< + *'g:go_term_mode'* + +This option is Neovim only. Use it to change the default command used to +open a new terminal for go commands such as |:GoRun|. +The default is vsplit. +> + let g:go_term_mode = "vsplit" +< + *'g:go_term_height'* + *'g:go_term_width'* + +These options are Neovim only. Use them to control the height and width of +a terminal split. By default these are not set, meaning that the height and +width are set automatically by Neovim. The height only applies to a +horizontal split and width only applies to a vertical split. + +For example here is how to set each to 30. +> + let g:go_term_height = 30 + let g:go_term_width = 30 +< + *'g:go_term_enabled'* + +This option is Neovim only. Use it to change the behavior of the test +commands. If set to 1 it opens the test commands inside a new terminal +according to |'g:go_term_mode'|, otherwise it will run them in the background +just like `:GoBuild`. By default it is disabled. +> + let g:go_term_enabled = 0 +< + *'g:go_alternate_mode'* + +Specifies the command that |:GoAlternate| uses to open the alternate file. +By default it is set to edit. +> + let g:go_alternate_mode = "edit" +< + *'g:go_gorename_prefill'* + +Specifies whether |:GoRename| prefills the new identifier name with the +word under the cursor. By default it is enabled. +> + let g:go_gorename_prefill = 1 +< + *'g:go_gocode_autobuild'* + +Specifies whether `gocode` should automatically build out-of-date packages +when their source fields are modified, in order to obtain the freshest +autocomplete results for them. By default it is enabled. +> + let g:go_gocode_autobuild = 1 +< + *'g:go_gocode_propose_builtins'* + +Specifies whether `gocode` should add built-in types, functions and constants +to an autocompletion proposals. By default it is enabled. +> + let g:go_gocode_propose_builtins = 1 +< + *'g:go_gocode_unimported_packages'* + +Specifies whether `gocode` should include suggestions from unimported packages. +By default it is disabled. +> + let g:go_gocode_unimported_packages = 0 +< + + *'g:go_gocode_socket_type'* + +Specifies whether `gocode` should use a different socket type. By default +`unix` is enabled. Possible values: `unix`, `tcp` +> + let g:go_gocode_socket_type = 'unix' +< + *'g:go_template_autocreate'* + +When a new Go file is created, vim-go automatically fills the buffer content +with a Go code template. By default the template under +`templates/hello_world.go` is used. This can be changed with the +|'g:go_template_file'| setting. + +If the new file is created in an already prepopulated package (with other Go +files), in this case a Go code template with only the Go package declaration +(which is automatically determined according to the current package) is added. + +To always use the package name instead of the template, enable the +|`g:go_template_use_pkg`| setting. + +By default it is enabled. +> + let g:go_template_autocreate = 1 +< + *'g:go_template_file'* + +Specifies the file under the `templates` folder that is used if a new Go file +is created. Checkout |'g:go_template_autocreate'| for more info. By default +the `hello_world.go` file is used. +> + let g:go_template_file = "hello_world.go" +< + *'g:go_template_use_pkg'* + +Specifies that, rather than using a template, the package name is used if a new +Go file is created. Checkout |'g:go_template_autocreate'| for more info. By +default the template file specified by |'g:go_template_file'| is used. + +> + let g:go_template_use_pkg = 0 +< + *'g:go_decls_includes'* + +Only useful if `ctrlp.vim` is installed. This sets which declarations to show +for |:GoDecls|. It is a Comma delimited list Possible options are: +{func,type}. The default is: > + + let g:go_decls_includes = 'func,type' +< + *'g:go_echo_command_info'* + +Echoes information about various Go commands, such as `:GoBuild`, `:GoTest`, +`:GoCoverage`, etc... Useful to disable if you use the statusline integration, +i.e: |go#statusline#Show()|. By default it's enabled +> + let g:go_echo_command_info = 1 +< + *'g:go_echo_go_info'* + +Use this option to show the identifier information when completion is done. By +default it's enabled > + + let g:go_echo_go_info = 1 +< + *'g:go_statusline_duration'* + +Specifices the duration of statusline information being showed per package. By +default it's 60 seconds. Must be in milliseconds. +> + let g:go_statusline_duration = 60000 +< +============================================================================== +TROUBLESHOOTING *go-troubleshooting* + +I get "not an editor command" error when I invoke :GoXXX~ + +This happens if vim-go is not installed properly. Be sure you have added this +line into your vimrc: +> + filetype plugin indent on +< + +I get a "command not found" error when I invoke :GoXXX~ + +If you try to call |:GoDef|, |:GoInfo| and get a command not found, check that +you have the binaries installed by using |:GoInstallBinaries|. + +Before opening vim, check your current $PATH: +> + echo $PATH +< +After opening vim, run `:echo $PATH`, the output must be your current `$PATH` +plus `$GOPATH/bin` (the location where |:GoInstallBinaries| installed the +binaries). + + +Vim becomes slow while editing Go files~ + +Don't enable these options: +> + let g:go_highlight_types = 0 + let g:go_highlight_operators = 0 +< + +I get errors when using GoInstallBinaries~ + +If you see errors like this: +> + Error installing golang.org/x/tools/cmd/goimports +< +that means your local Go setup is broken or the remote website is down. For +example sometimes code.google.com times out. To test, just execute a simple +`go get`: + + go get golang.org/x/tools/cmd/goimports +< +You'll see a more detailed error. If this works, vim-go will work too. + + +============================================================================== +CREDITS *go-credits* + +* Go Authors for official Vim plugins. +* Gocode, Godef, Golint, Guru, Goimports, Errcheck projects and authors of + those projects. +* Other vim-plugins, thanks for inspiration (vim-golang, go.vim, vim-gocode, + vim-godef). +* vim-go contributors: https://github.com/fatih/vim-go/graphs/contributors. + + +vim:ft=help:et:ts=2:sw=2:sts=2:norl diff --git a/.vim/bundle/vim-go/ftdetect/gofiletype.vim b/.vim/bundle/vim-go/ftdetect/gofiletype.vim new file mode 100644 index 0000000..267d2cc --- /dev/null +++ b/.vim/bundle/vim-go/ftdetect/gofiletype.vim @@ -0,0 +1,31 @@ +" We take care to preserve the user's fileencodings and fileformats, +" because those settings are global (not buffer local), yet we want +" to override them for loading Go files, which are defined to be UTF-8. +let s:current_fileformats = '' +let s:current_fileencodings = '' + +" define fileencodings to open as utf-8 encoding even if it's ascii. +function! s:gofiletype_pre(type) + let s:current_fileformats = &g:fileformats + let s:current_fileencodings = &g:fileencodings + set fileencodings=utf-8 fileformats=unix + let &l:filetype = a:type +endfunction + +" restore fileencodings as others +function! s:gofiletype_post() + let &g:fileformats = s:current_fileformats + let &g:fileencodings = s:current_fileencodings +endfunction + +au BufNewFile *.go setfiletype go | setlocal fileencoding=utf-8 fileformat=unix +au BufRead *.go call s:gofiletype_pre("go") +au BufReadPost *.go call s:gofiletype_post() + +au BufNewFile *.s setfiletype asm | setlocal fileencoding=utf-8 fileformat=unix +au BufRead *.s call s:gofiletype_pre("asm") +au BufReadPost *.s call s:gofiletype_post() + +au BufRead,BufNewFile *.tmpl set filetype=gohtmltmpl + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/ftplugin/asm.vim b/.vim/bundle/vim-go/ftplugin/asm.vim new file mode 100644 index 0000000..99996aa --- /dev/null +++ b/.vim/bundle/vim-go/ftplugin/asm.vim @@ -0,0 +1,19 @@ +" asm.vim: Vim filetype plugin for Go assembler. + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +let b:undo_ftplugin = "setl fo< com< cms<" + +setlocal formatoptions-=t + +setlocal comments=s1:/*,mb:*,ex:*/,:// +setlocal commentstring=//\ %s + +setlocal noexpandtab + +command! -nargs=0 AsmFmt call go#asmfmt#Format() + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/ftplugin/go.vim b/.vim/bundle/vim-go/ftplugin/go.vim new file mode 100644 index 0000000..de830f9 --- /dev/null +++ b/.vim/bundle/vim-go/ftplugin/go.vim @@ -0,0 +1,131 @@ +" Copyright 2013 The Go Authors. All rights reserved. +" Use of this source code is governed by a BSD-style +" license that can be found in the LICENSE file. +" +" go.vim: Vim filetype plugin for Go. + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +let b:undo_ftplugin = "setl fo< com< cms<" + +setlocal formatoptions-=t + +setlocal comments=s1:/*,mb:*,ex:*/,:// +setlocal commentstring=//\ %s + +setlocal noexpandtab + +compiler go + +" Set gocode completion +setlocal omnifunc=go#complete#Complete + +if get(g:, "go_doc_keywordprg_enabled", 1) + " keywordprg doesn't allow to use vim commands, override it + nnoremap K :GoDoc +endif + +if get(g:, "go_def_mapping_enabled", 1) + " these are default Vim mappings, we're overriding them to make them + " useful again for Go source code + nnoremap gd :GoDef + nnoremap :GoDef + nnoremap :call go#def#Jump("split") + nnoremap ] :call go#def#Jump("split") + nnoremap :call go#def#StackPop(v:count1) +endif + +if get(g:, "go_textobj_enabled", 1) + onoremap af :call go#textobj#Function('a') + onoremap if :call go#textobj#Function('i') + + xnoremap af :call go#textobj#Function('a') + xnoremap if :call go#textobj#Function('i') + + " Remap ]] and [[ to jump betweeen functions as they are useless in Go + nnoremap ]] :call go#textobj#FunctionJump('n', 'next') + nnoremap [[ :call go#textobj#FunctionJump('n', 'prev') + + onoremap ]] :call go#textobj#FunctionJump('o', 'next') + onoremap [[ :call go#textobj#FunctionJump('o', 'prev') + + xnoremap ]] :call go#textobj#FunctionJump('v', 'next') + xnoremap [[ :call go#textobj#FunctionJump('v', 'prev') +endif + +if get(g:, "go_auto_type_info", 0) || get(g:, "go_auto_sameids", 0) + let &l:updatetime= get(g:, "go_updatetime", 800) +endif + +" NOTE(arslan): experimental, disabled by default, doesn't work well. No +" documentation as well. If anyone feels adventerous, enable the following and +" try to search for Go identifiers ;) +" +" if get(g:, "go_sameid_search_enabled", 0) +" autocmd FileType go nnoremap * :call Sameids_search(0) +" autocmd FileType go nnoremap # :call Sameids_search(1) +" autocmd FileType go nnoremap n :call Sameids_repeat(0) +" autocmd FileType go nnoremap N :call Sameids_repeat(1) +" autocmd FileType go cabbrev nohlsearch =Sameids_nohlsearch() +" endif + +" " mode 0: next 1: prev +" function! Sameids_repeat(mode) +" let matches = getmatches() +" if empty(matches) +" return +" endif +" let cur_offset = go#util#OffsetCursor() + +" " reverse list to make it easy to find the prev occurence +" if a:mode +" call reverse(matches) +" endif + +" for m in matches +" if !has_key(m, "group") +" return +" endif + +" if m.group != "goSameId" +" return +" endif + +" let offset = go#util#Offset(m.pos1[0], m.pos1[1]) + +" if a:mode && cur_offset > offset +" call cursor(m.pos1[0], m.pos1[1]) +" return +" elseif !a:mode && cur_offset < offset +" call cursor(m.pos1[0], m.pos1[1]) +" return +" endif +" endfor + +" " reached start/end, jump to the end/start +" let initial_match = matches[0] +" if !has_key(initial_match, "group") +" return +" endif + +" if initial_match.group != "goSameId" +" return +" endif + +" call cursor(initial_match.pos1[0], initial_match.pos1[1]) +" endfunction + +" function! Sameids_search(mode) +" call go#guru#SameIds() +" call Sameids_repeat(a:mode) +" endfunction + +" function! Sameids_nohlsearch() +" call go#guru#ClearSameIds() +" return "nohlsearch" +" endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/ftplugin/go/commands.vim b/.vim/bundle/vim-go/ftplugin/go/commands.vim new file mode 100644 index 0000000..d8bff66 --- /dev/null +++ b/.vim/bundle/vim-go/ftplugin/go/commands.vim @@ -0,0 +1,94 @@ +" -- gorename +command! -nargs=? GoRename call go#rename#Rename(0,) + +" -- guru +command! -nargs=* -complete=customlist,go#package#Complete GoGuruScope call go#guru#Scope() +command! -range=% GoImplements call go#guru#Implements() +command! -range=% GoWhicherrs call go#guru#Whicherrs() +command! -range=% GoCallees call go#guru#Callees() +command! -range=% GoDescribe call go#guru#Describe() +command! -range=% GoCallers call go#guru#Callers() +command! -range=% GoCallstack call go#guru#Callstack() +command! -range=% GoFreevars call go#guru#Freevars() +command! -range=% GoChannelPeers call go#guru#ChannelPeers() +command! -range=% GoReferrers call go#guru#Referrers() +command! -nargs=? GoGuruTags call go#guru#Tags() + + +command! -nargs=* -range GoAddTags call go#util#AddTags(, , ) + +command! -range=0 GoSameIds call go#guru#SameIds() +command! -range=0 GoSameIdsClear call go#guru#ClearSameIds() +command! -range=0 GoSameIdsToggle call go#guru#ToggleSameIds() +command! -range=0 GoSameIdsAutoToggle call go#guru#AutoToogleSameIds() + +" -- tool +command! -nargs=0 GoFiles echo go#tool#Files() +command! -nargs=0 GoDeps echo go#tool#Deps() +command! -nargs=* GoInfo call go#tool#Info(0) +command! -nargs=0 GoAutoTypeInfoToggle call go#complete#ToggleAutoTypeInfo() + +" -- cmd +command! -nargs=* -bang GoBuild call go#cmd#Build(0,) +command! -nargs=* -bang GoGenerate call go#cmd#Generate(0,) +command! -nargs=* -bang -complete=file GoRun call go#cmd#Run(0,) +command! -nargs=* -bang GoInstall call go#cmd#Install(0, ) +command! -nargs=* -bang GoTest call go#cmd#Test(0, 0, ) +command! -nargs=* -bang GoTestFunc call go#cmd#TestFunc(0, ) +command! -nargs=* -bang GoTestCompile call go#cmd#Test(0, 1, ) + +" -- cover +command! -nargs=* -bang GoCoverage call go#coverage#Buffer(0, ) +command! -nargs=* -bang GoCoverageClear call go#coverage#Clear() +command! -nargs=* -bang GoCoverageToggle call go#coverage#BufferToggle(0, ) +command! -nargs=* -bang GoCoverageBrowser call go#coverage#Browser(0, ) + +" -- play +command! -nargs=0 -range=% GoPlay call go#play#Share(, , ) + +" -- def +command! -nargs=* -range GoDef :call go#def#Jump('') +command! -nargs=? GoDefPop :call go#def#StackPop() +command! -nargs=? GoDefStack :call go#def#Stack() +command! -nargs=? GoDefStackClear :call go#def#StackClear() + +" -- doc +command! -nargs=* -range -complete=customlist,go#package#Complete GoDoc call go#doc#Open('new', 'split', ) +command! -nargs=* -range -complete=customlist,go#package#Complete GoDocBrowser call go#doc#OpenBrowser() + +" -- fmt +command! -nargs=0 GoFmt call go#fmt#Format(-1) +command! -nargs=0 GoFmtAutoSaveToggle call go#fmt#ToggleFmtAutoSave() +command! -nargs=0 GoImports call go#fmt#Format(1) + +" -- asmfmt +command! -nargs=0 GoAsmFmtAutoSaveToggle call go#asmfmt#ToggleAsmFmtAutoSave() + +" -- import +command! -nargs=? -complete=customlist,go#package#Complete GoDrop call go#import#SwitchImport(0, '', , '') +command! -nargs=1 -bang -complete=customlist,go#package#Complete GoImport call go#import#SwitchImport(1, '', , '') +command! -nargs=* -bang -complete=customlist,go#package#Complete GoImportAs call go#import#SwitchImport(1, , '') + +" -- linters +command! -nargs=* GoMetaLinter call go#lint#Gometa(0, ) +command! -nargs=0 GoMetaLinterAutoSaveToggle call go#lint#ToggleMetaLinterAutoSave() +command! -nargs=* GoLint call go#lint#Golint() +command! -nargs=* -bang GoVet call go#lint#Vet(0, ) +command! -nargs=* -complete=customlist,go#package#Complete GoErrCheck call go#lint#Errcheck() + +" -- alternate +command! -bang GoAlternate call go#alternate#Switch(0, '') + +" -- ctrlp +if globpath(&rtp, 'plugin/ctrlp.vim') != "" + command! -nargs=? -complete=file GoDecls call ctrlp#init(ctrlp#decls#cmd(0, )) + command! -nargs=? -complete=dir GoDeclsDir call ctrlp#init(ctrlp#decls#cmd(1, )) +endif + +" -- impl +command! -nargs=* -buffer -complete=customlist,go#impl#Complete GoImpl call go#impl#Impl() + +" -- template +command! -nargs=0 GoTemplateAutoCreateToggle call go#template#ToggleAutoCreate() + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/ftplugin/go/mappings.vim b/.vim/bundle/vim-go/ftplugin/go/mappings.vim new file mode 100644 index 0000000..e1bbe46 --- /dev/null +++ b/.vim/bundle/vim-go/ftplugin/go/mappings.vim @@ -0,0 +1,75 @@ +" go_jump_to_error defines whether we should pass the bang attribute to the +" command or not. This is only used for mappings, because the user can't pass +" the bang attribute to the plug mappings below. So instead of hardcoding it +" as 0 (no '!' attribute) or 1 (with '!' attribute) we pass the user setting, +" which by default is enabled. For commands the user has the ability to pass +" the '!', such as :GoBuild or :GoBuild! +if !exists("g:go_jump_to_error") + let g:go_jump_to_error = 1 +endif + +" Some handy plug mappings +nnoremap (go-run) :call go#cmd#Run(!g:go_jump_to_error) + +if has("nvim") + nnoremap (go-run-vertical) :call go#cmd#RunTerm(!g:go_jump_to_error, 'vsplit', []) + nnoremap (go-run-split) :call go#cmd#RunTerm(!g:go_jump_to_error, 'split', []) + nnoremap (go-run-tab) :call go#cmd#RunTerm(!g:go_jump_to_error, 'tabe', []) +endif + +nnoremap (go-build) :call go#cmd#Build(!g:go_jump_to_error) +nnoremap (go-generate) :call go#cmd#Generate(!g:go_jump_to_error) +nnoremap (go-install) :call go#cmd#Install(!g:go_jump_to_error) +nnoremap (go-test) :call go#cmd#Test(!g:go_jump_to_error, 0) +nnoremap (go-test-func) :call go#cmd#TestFunc(!g:go_jump_to_error) +nnoremap (go-test-compile) :call go#cmd#Test(!g:go_jump_to_error, 1) + +nnoremap (go-coverage) :call go#coverage#Buffer(!g:go_jump_to_error) +nnoremap (go-coverage-clear) :call go#coverage#Clear() +nnoremap (go-coverage-toggle) :call go#coverage#BufferToggle(!g:go_jump_to_error) +nnoremap (go-coverage-browser) :call go#coverage#Browser(!g:go_jump_to_error) + +nnoremap (go-files) :call go#tool#Files() +nnoremap (go-deps) :call go#tool#Deps() +nnoremap (go-info) :call go#tool#Info(0) +nnoremap (go-import) :call go#import#SwitchImport(1, '', expand(''), '') +nnoremap (go-imports) :call go#fmt#Format(1) + +nnoremap (go-implements) :call go#guru#Implements(-1) +nnoremap (go-callees) :call go#guru#Callees(-1) +nnoremap (go-callers) :call go#guru#Callers(-1) +nnoremap (go-describe) :call go#guru#Describe(-1) +nnoremap (go-callstack) :call go#guru#Callstack(-1) +xnoremap (go-freevars) :call go#guru#Freevars(0) +nnoremap (go-channelpeers) :call go#guru#ChannelPeers(-1) +nnoremap (go-referrers) :call go#guru#Referrers(-1) +nnoremap (go-sameids) :call go#guru#SameIds() +nnoremap (go-whicherrs) :call go#guru#Whicherrs(-1) +nnoremap (go-sameids-toggle) :call go#guru#ToggleSameIds() + +nnoremap (go-rename) :call go#rename#Rename(!g:go_jump_to_error) + +nnoremap (go-def) :call go#def#Jump('') +nnoremap (go-def-vertical) :call go#def#Jump("vsplit") +nnoremap (go-def-split) :call go#def#Jump("split") +nnoremap (go-def-tab) :call go#def#Jump("tab") + +nnoremap (go-def-pop) :call go#def#StackPop() +nnoremap (go-def-stack) :call go#def#Stack() +nnoremap (go-def-stack-clear) :call go#def#StackClear() + +nnoremap (go-doc) :call go#doc#Open("new", "split") +nnoremap (go-doc-tab) :call go#doc#Open("tabnew", "tabe") +nnoremap (go-doc-vertical) :call go#doc#Open("vnew", "vsplit") +nnoremap (go-doc-split) :call go#doc#Open("new", "split") +nnoremap (go-doc-browser) :call go#doc#OpenBrowser() + +nnoremap (go-metalinter) :call go#lint#Gometa(0) +nnoremap (go-lint) :call go#lint#Golint() +nnoremap (go-vet) :call go#lint#Vet(!g:go_jump_to_error) + +nnoremap (go-alternate-edit) :call go#alternate#Switch(0, "edit") +nnoremap (go-alternate-vertical) :call go#alternate#Switch(0, "vsplit") +nnoremap (go-alternate-split) :call go#alternate#Switch(0, "split") + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/ftplugin/go/snippets.vim b/.vim/bundle/vim-go/ftplugin/go/snippets.vim new file mode 100644 index 0000000..56c0811 --- /dev/null +++ b/.vim/bundle/vim-go/ftplugin/go/snippets.vim @@ -0,0 +1,48 @@ +if exists("g:go_loaded_gosnippets") + finish +endif +let g:go_loaded_gosnippets = 1 + +" by default UltiSnips +if !exists("g:go_snippet_engine") + let g:go_snippet_engine = "ultisnips" +endif + +function! s:GoUltiSnips() + if globpath(&rtp, 'plugin/UltiSnips.vim') == "" + return + endif + + if !exists("g:UltiSnipsSnippetDirectories") + let g:UltiSnipsSnippetDirectories = ["gosnippets/UltiSnips"] + else + let g:UltiSnipsSnippetDirectories += ["gosnippets/UltiSnips"] + endif +endfunction + +function! s:GoNeosnippet() + if globpath(&rtp, 'plugin/neosnippet.vim') == "" + return + endif + + let g:neosnippet#enable_snipmate_compatibility = 1 + + let gosnippets_dir = globpath(&rtp, 'gosnippets/snippets') + if type(g:neosnippet#snippets_directory) == type([]) + let g:neosnippet#snippets_directory += [gosnippets_dir] + elseif type(g:neosnippet#snippets_directory) == type("") + if strlen(g:neosnippet#snippets_directory) > 0 + let g:neosnippet#snippets_directory = g:neosnippet#snippets_directory . "," . gosnippets_dir + else + let g:neosnippet#snippets_directory = gosnippets_dir + endif + endif +endfunction + +if g:go_snippet_engine == "ultisnips" + call s:GoUltiSnips() +elseif g:go_snippet_engine == "neosnippet" + call s:GoNeosnippet() +endif + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/ftplugin/go/tagbar.vim b/.vim/bundle/vim-go/ftplugin/go/tagbar.vim new file mode 100644 index 0000000..efdc397 --- /dev/null +++ b/.vim/bundle/vim-go/ftplugin/go/tagbar.vim @@ -0,0 +1,57 @@ +" Check if tagbar is installed under plugins or is directly under rtp +" this covers pathogen + Vundle/Bundle +" +" Also make sure the ctags command exists +" +if !executable('ctags') + finish +elseif globpath(&rtp, 'plugin/tagbar.vim') == "" + finish +endif + +if !exists("g:go_gotags_bin") + let g:go_gotags_bin = "gotags" +endif + + +function! s:SetTagbar() + let bin_path = go#path#CheckBinPath(g:go_gotags_bin) + if empty(bin_path) + return + endif + + if !exists("g:tagbar_type_go") + let g:tagbar_type_go = { + \ 'ctagstype' : 'go', + \ 'kinds' : [ + \ 'p:package', + \ 'i:imports', + \ 'c:constants', + \ 'v:variables', + \ 't:types', + \ 'n:interfaces', + \ 'w:fields', + \ 'e:embedded', + \ 'm:methods', + \ 'r:constructor', + \ 'f:functions' + \ ], + \ 'sro' : '.', + \ 'kind2scope' : { + \ 't' : 'ctype', + \ 'n' : 'ntype' + \ }, + \ 'scope2kind' : { + \ 'ctype' : 't', + \ 'ntype' : 'n' + \ }, + \ 'ctagsbin' : bin_path, + \ 'ctagsargs' : '-sort -silent' + \ } + endif +endfunction + + +call s:SetTagbar() + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/ftplugin/gohtmltmpl.vim b/.vim/bundle/vim-go/ftplugin/gohtmltmpl.vim new file mode 100644 index 0000000..132e3fa --- /dev/null +++ b/.vim/bundle/vim-go/ftplugin/gohtmltmpl.vim @@ -0,0 +1,8 @@ +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +setlocal commentstring= + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/gosnippets/UltiSnips/go.snippets b/.vim/bundle/vim-go/gosnippets/UltiSnips/go.snippets new file mode 100644 index 0000000..fcb8298 --- /dev/null +++ b/.vim/bundle/vim-go/gosnippets/UltiSnips/go.snippets @@ -0,0 +1,443 @@ +# Snippets for Go + +priority -10 + +# shorthand variable declaration +snippet : "v := value" +${1} := ${0} +endsnippet + +# anonymous function +snippet anon "fn := func() { ... }" +${1:fn} := func() { + ${2:${VISUAL}} +} +${0} +endsnippet + +# append +snippet ap "append(slice, value)" +append(${1:slice}, ${0:value}) +endsnippet + +# append assignment +snippet ap= "a = append(a, value)" +${1:slice} = append($1, ${0:value}) +endsnippet + +# break +snippet br "break" +break +endsnippet + +# channel +snippet ch "chan Type" +chan ${0:int} +endsnippet + +# case +snippet case "case ...:" +case ${1:value}: + ${0:${VISUAL}} +endsnippet + +# constant +snippet con "const XXX Type = ..." +const ${1:NAME} ${2:Type} = ${0:0} +endsnippet + +# constants +snippet cons "const ( ... )" +const ( + ${1:NAME} ${2:Type} = ${3:value} + ${0} +) +endsnippet + +# constants with iota +snippet iota "const ( ... = iota )" +const ( + ${1:NAME} ${2:Type} = iota + ${0} +) +endsnippet + +# continue +snippet cn "continue" +continue +endsnippet + +# default case +snippet default "default: ..." +default: + ${0:${VISUAL}} +endsnippet + +# defer +snippet df "defer someFunction()" +defer ${1:func}(${2}) +${0} +endsnippet + +snippet def "defer func() { ... }" +defer func() { + ${0:${VISUAL}} +}() +endsnippet + +# defer recover +snippet defr +defer func() { + if err := recover(); err != nil { + ${0:${VISUAL}} + } +}() +endsnippet + +# gpl +snippet gpl +/* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, see . +* +* Copyright (C) ${1:Author}, `strftime("%Y")` +*/ +${0} +endsnippet + +# import +snippet import "import ( ... )" +import ( + "${1:package}" +) +endsnippet + +# full interface snippet +snippet interface "interface I { ... }" +type ${1:Interface} interface { + ${2:/* TODO: add methods */} +} +endsnippet + +# if condition +snippet if "if ... { ... }" +if ${1:condition} { + ${0:${VISUAL}} +} +endsnippet + +# else snippet +snippet else +else { + ${0:${VISUAL}} +} +endsnippet + +# error snippet +snippet errn "Error return " !b +if err != nil { + return err +} +${0} +endsnippet + +# error multiple return +snippet errn, "Error return with two return values" !b +if err != nil { + return ${1:nil}, err +} +${0} +endsnippet + +# error panic +snippet errp "Error panic" !b +if err != nil { + panic(${1}) +} +${0} +endsnippet + +# error test +snippet errt "Error test fatal " !b +if err != nil { + t.Fatal(err) +} +${0} +endsnippet + +# error handle +snippet errh "Error handle and return" !b +if err != nil { + ${1} + return +} +${0} +endsnippet + +# json field tag +snippet json "\`json:key\`" +\`json:"${1:`!v go#util#snippetcase(matchstr(getline("."), '\w\+'))`}"\` +endsnippet + +# yaml field tag +snippet yaml "\`yaml:key\`" +\`yaml:"${1:`!v go#util#snippetcase(matchstr(getline("."), '\w\+'))`}"\` +endsnippet + +# fallthrough +snippet ft "fallthrough" +fallthrough +endsnippet + +# for loop +snippet for "for ... { ... }" +for ${1} { + ${0:${VISUAL}} +} +endsnippet + +# for integer loop +snippet fori "for 0..N-1 { ... }" +for ${1:i} := 0; $1 < ${2:N}; $1++ { + ${0:${VISUAL}} +} +endsnippet + +# for range loop +snippet forr "for k, v := range items { ... }" +for ${2:k}, ${3:v} := range ${1} { + ${0:${VISUAL}} +} +endsnippet + +# function +snippet func "func Function(...) [error] { ... }" +func ${1:name}(${2:params})${3/(.+)/ /}`!p opening_par(snip, 3)`$3`!p closing_par(snip, 3)` { + ${0:${VISUAL}} +} +endsnippet + +# Fmt Printf debug +snippet ff "fmt.Printf(...)" +fmt.Printf("${1:${VISUAL}} = %+v\n", $1) +endsnippet + +# Fmt Println debug +snippet fn "fmt.Println(...)" +fmt.Println("${1:${VISUAL}}") +endsnippet + +# log printf +snippet lf "log.Printf(...)" +log.Printf("${1:${VISUAL}} = %+v\n", $1) +endsnippet + +# log println +snippet ln "log.Println(...)" +log.Println("${1:${VISUAL}}") +endsnippet + +# make +snippet make "make(Type, size)" +make(${1:[]string}, ${2:0})${0} +endsnippet + +# map +snippet map "map[Type]Type" +map[${1:string}]${0:int} +endsnippet + +# main() +snippet main "func main() { ... }" +func main() { + ${0:${VISUAL}} +} +endsnippet + +# method +snippet meth "func (self Type) Method(...) [error] { ... }" +func (${1:receiver} ${2:type}) ${3:name}(${4:params})${5/(.+)/ /}`!p opening_par(snip, 5)`$5`!p closing_par(snip, 5)` { + ${0:${VISUAL}} +} +endsnippet + +# ok +snippet ok "if !ok { ... }" +if !ok { + ${0:${VISUAL}} +} +endsnippet + +# package +snippet package "package ..." +// Package $1 provides ${2:...} +package ${1:main} +${0} +endsnippet + +# panic +snippet pn "panic()" +panic("${0:msg}") +endsnippet + +# return +snippet rt "return" +return ${0:${VISUAL}} +endsnippet + +# select +snippet select "select { case a := <-chan: ... }" +select { +case ${1:v1} := <-${2:chan1} + ${0} +} +endsnippet + +# struct +snippet st "type T struct { ... }" +type ${1:Type} struct { +${0} +} +endsnippet + +# switch +snippet switch "switch x { ... }" +switch ${1:var} { +case ${2:value1}: + ${0} +} +endsnippet + +# sprintf +snippet sp "fmt.Sprintf(...)" +fmt.Sprintf("%${1:s}", ${2:var}) +endsnippet + +# goroutine named function +snippet go "go someFunc(...)" +go ${1:funcName}(${0}) +endsnippet + +# goroutine anonymous function +snippet gof "go func() { ... }()" +go func() { + ${1:${VISUAL}} +}() +${0} +endsnippet + +# test function +snippet test "func TestXYZ(t *testing.T) { ... }" +func Test${1:Function}(t *testing.T) { + ${0:${VISUAL}} +} +endsnippet + +snippet hf "http.HandlerFunc" !b +func ${1:handler}(w http.ResponseWriter, r *http.Request) { + ${0:fmt.Fprintf(w, "hello world")} +} +endsnippet + +snippet hhf "mux.HandleFunc" !b +${1:http}.HandleFunc("${2:/}", func(w http.ResponseWriter, r *http.Request) { + ${0:fmt.Fprintf(w, "hello world")} +}) +endsnippet + +# quick test server +snippet tsrv "httptest.NewServer" +ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, ${1:`response`}) +})) +defer ts.Close() + +${0:someUrl} = ts.URL +endsnippet + +# test error handling +snippet ter "if err != nil { t.Errorf(...) }" +if err != nil { + t.Errorf("${0:message}") +} +endsnippet + +# test fatal error +snippet terf "if err != nil { t.Fatalf(...) }" +if err != nil { + t.Fatalf("${0:message}") +} +endsnippet + +snippet example "func ExampleXYZ() { ... }" +func Example${1:Method}() { + ${0:${VISUAL}} + // Output: +} +endsnippet + +snippet benchmark "func BenchmarkXYZ(b *testing.B) { ... }" +func Benchmark${1:Method}(b *testing.B) { + for i := 0; i < b.N; i++ { + ${0:${VISUAL}} + } +} +endsnippet + +# variable declaration +snippet var "var x Type [= ...]" +var ${1:x} ${2:Type}${3: = ${0:value}} +endsnippet + +# variables declaration +snippet vars "var ( ... )" +var ( + ${1:x} ${2:Type}${3: = ${0:value}} +) +endsnippet + +# equals fails the test if exp is not equal to act. +snippet eq "equals: test two identifiers with DeepEqual" +if !reflect.DeepEqual(${1:expected}, ${2:actual}) { + _, file, line, _ := runtime.Caller(0) + fmt.Printf("%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\n\n", filepath.Base(file), line, $1, $2) + t.FailNow() +} +endsnippet + +global !p + +import re + +# Automatically wrap return types with parentheses + +def return_values(s): + # remove everything wrapped in parentheses + s = re.sub("\(.*?\)|\([^)]*$", "", s) + return len(s.split(",")) + +def opening_par(snip, pos): + if return_values(t[pos]) > 1 and not t[pos].startswith("("): + snip.rv = "(" + else: + snip.rv = "" + +def closing_par(snip, pos): + if return_values(t[pos]) > 1: + snip.rv = ")" + else: + snip.rv = "" + +endglobal + +# vim:ft=snippets: diff --git a/.vim/bundle/vim-go/gosnippets/snippets/go.snip b/.vim/bundle/vim-go/gosnippets/snippets/go.snip new file mode 100644 index 0000000..942a82e --- /dev/null +++ b/.vim/bundle/vim-go/gosnippets/snippets/go.snip @@ -0,0 +1,363 @@ +# shorthand variable declaration +snippet : +abbr v := value + ${1} := ${0} +# anonymous function +snippet anon +abbr fn := func() { ... } + ${1:fn} := func() { + ${0} + } +# append +snippet ap +abbr append(slice, value) + append(${1:slice}, ${0:value}) +# append assign +snippet ap= +abbr slice = append(slice, value) + ${1:slice} = append($1, ${0:value}) +# break +snippet br +abbr break + break +# channel +snippet ch +abbr chan Type + chan ${0:int} +# case +snippet case +abbr case ...: + case ${1:value}: + ${0} +# constant +snippet con +abbr const XXX Type = ... + const ${1:NAME} ${2:Type} = ${0:0} +# constants +snippet cons +abbr const ( ... ) + const ( + ${1:NAME} ${2:Type} = ${3:value} + ${0} + ) +# constants with iota +snippet iota +abbr const ( ... = iota ) + const ( + ${1:NAME} ${2:Type} = iota + ${0} + ) +# continue +snippet cn +abbr continue + continue +# default case +snippet default +abbr default: ... + default: + ${0} + +# defer +snippet df +abbr defer someFunction() + defer ${1:func}(${2}) + ${0} +snippet def +abbr defer func() { ... } + defer func() { + ${0} + }() +# defer recover +snippet defr + defer func() { + if err := recover(); err != nil { + ${0} + } + }() +# gpl +snippet gpl + /* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Copyright (C) ${1:Author}, `strftime("%Y")` + */ + + ${0} +# import +snippet import +abbr import ( ... ) + import ( + "${1:package}" + ) +# full interface snippet +snippet interface +abbr interface I { ... } + type ${1:Interface} interface { + ${2:/* TODO: add methods */} + } +# if condition +snippet if +abbr if ... { ... } + if ${1:condition} { + ${0} + } +# else snippet +abbr else { ... } +snippet else + else { + ${0} + } +# error snippet +snippet errn +abbr if err != nil { ... } + if err != nil { + return err + } + ${0} +# error snippet in TestFunc +snippet errt +abbr if err != nil { ... } + if err != nil { + t.Fatal(err) + } + +# error snippet with two return values +snippet errn, +abbr if err != nil { return [...], err } + if err != nil { + return ${1:nil}, err + } + ${0} + +# error snippet handle and return +snippet errh +abbr if err != nil { return } + if err != nil { + ${1} + return + } + ${0} + +# error snippet with panic +snippet errp +abbr if err != nil { ... } + if err != nil { + panic(${1}) + } + ${0} + +# json snippet +snippet json +abbr \`json:key\` + \`json:"${1:keyName}"\` + +# yaml snippet +snippet yaml +abbr \`yaml:key\` + \`yaml:"${1:keyName}"\` + +# fallthrough +snippet ft +abbr fallthrough + fallthrough +# for loop +snippet for +abbr for ... { ... } + for ${1} { + ${0} + } +# for integer loop +snippet fori +abbr for 0..N-1 { ... } + for ${1:i} := 0; $1 < ${2:N}; $1++ { + ${0} + } +# for range loop +snippet forr +abbr for k, v := range items { ... } + for ${2:k}, ${3:v} := range ${1} { + ${0} + } +# function +snippet func +abbr func function(...) [error] { ... } + func ${1:function}(${2}) ${3:error }{ + ${0} + } +# Fmt Printf debug +snippet ff +abbr fmt.Printf(...) + fmt.Printf("${1} = %+v\n", $1) + ${0} +# Fmt Println debug +snippet fn +abbr fmt.Println(...) + fmt.Println("${1}") +# log printf +snippet lf +abbr log.Printf(...) + log.Printf("${1} = %+v\n", $1) +# log println +snippet ln +abbr log.Println(...) + log.Println("${1}") +# make +snippet make +abbr make(Type, size) + make(${1:[]string}, ${2:0})${0} +# map +snippet map +abbr map[Type]Type + map[${1:string}]${0:int} +# main() +snippet main +abbr func main() { ... } +options head + func main() { + ${0} + } +# method +snippet meth +abbr func (self Type) Method(...) [error] { ... } +regexp /^meth/ + func (${1:self} ${2:Type}) ${3:Do}(${4}) ${5:error }{ + ${0} + } +# ok +snippet ok +abbr if !ok { ... } + if !ok { + ${0} + } +# package +snippet package +abbr package ... + // Package $1 provides ${2:...} + package ${1:main} + ${0} +# panic +snippet panic +alias pn +abbr panic("...") + panic("${0}") +# return +snippet return +alias rt +abbr return ... + return ${0} +# select +snippet select +abbr select { case a := <-chan: ... } + select { + case ${1:v1} := <-${2:chan1} + ${0} + } +# struct +snippet st +abbr type T struct { ... } + type ${1:Type} struct { + ${0} + } +# switch +snippet switch +abbr switch x { ... } + switch ${1:var} { + case ${2:value1}: + ${0} + } +# sprintf +snippet sp +abbr fmt.Sprintf(...) + fmt.Sprintf("%${1:s}", ${2:var}) +# goroutine named function +snippet go +abbr go someFunc(...) + go ${1:funcName}(${0}) +# goroutine anonymous function +snippet gof +abbr go func(...) { ... }(...) + go func(${1}) { + ${3:/* TODO */} + }(${2}) +# test function +snippet test +abbr func TestXYZ(t *testing.T) { ... } + func Test${1:Function}(t *testing.T) { + ${0} + } +# test server +snippet tsrv +abbr ts := httptest.NewServer(...) + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, ${1:`response`}) + })) + defer ts.Close() + + //Use testing server url (type string) somewhere + ${0:someUrl} = ts.URL +# test error +snippet ter +abbr if err != nil { t.Errorf(...) } + if err != nil { + t.Errorf("${1}") + } +# test fatal error +snippet terf +abbr if err != nil { t.Fatalf(...) } + if err != nil { + t.Fatalf("${1}") + } +# test example +snippet example + func Example${1:Method}() { + ${0} + // Output: + } +# test benchmark +snippet benchmark + func Benchmark${1:Method}(b *testing.B) { + for i := 0; i < b.N; i++ { + ${0} + } + } +# variable declaration +snippet var +abbr var x Type [= ...] + var ${1:x} ${2:Type}${3: = ${0:value\}} +# variables declaration +snippet vars +abbr var ( ... ) + var ( + ${1:x} ${2:Type}${3: = ${0:value\}} + ) +# equals fails the test if exp is not equal to act. +snippet eq +abbr equals: test two identifiers with DeepEqual + if !reflect.DeepEqual(${1:expected}, ${2:actual}) { + _, file, line, _ := runtime.Caller(0) + fmt.Printf("%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\n\n", filepath.Base(file), line, $1, $2) + t.FailNow() + } + +snippet hf +abbr http.HandlerFunc + func ${1:handler}(w http.ResponseWriter, r *http.Request) { + ${0:fmt.Fprintf(w, "hello world")} + } + +snippet hhf +abbr mux.HandleFunc(...) + ${1:http}.HandleFunc("${2:/}", func(w http.ResponseWriter, r *http.Request) { + ${0:fmt.Fprintf(w, "hello world")} + }) diff --git a/.vim/bundle/vim-go/indent/go.vim b/.vim/bundle/vim-go/indent/go.vim new file mode 100644 index 0000000..ba99d54 --- /dev/null +++ b/.vim/bundle/vim-go/indent/go.vim @@ -0,0 +1,78 @@ +" Copyright 2011 The Go Authors. All rights reserved. +" Use of this source code is governed by a BSD-style +" license that can be found in the LICENSE file. +" +" indent/go.vim: Vim indent file for Go. +" +" TODO: +" - function invocations split across lines +" - general line splits (line ends in an operator) + +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +" C indentation is too far off useful, mainly due to Go's := operator. +" Let's just define our own. +setlocal nolisp +setlocal autoindent +setlocal indentexpr=GoIndent(v:lnum) +setlocal indentkeys+=<:>,0=},0=) + +if exists("*GoIndent") + finish +endif + +" use shiftwidth function only if it's available +if exists('*shiftwidth') + func s:sw() + return shiftwidth() + endfunc +else + func s:sw() + return &sw + endfunc +endif + +function! GoIndent(lnum) + let prevlnum = prevnonblank(a:lnum-1) + if prevlnum == 0 + " top of file + return 0 + endif + + " grab the previous and current line, stripping comments. + let prevl = substitute(getline(prevlnum), '//.*$', '', '') + let thisl = substitute(getline(a:lnum), '//.*$', '', '') + let previ = indent(prevlnum) + + let ind = previ + + if prevl =~ '[({]\s*$' + " previous line opened a block + let ind += s:sw() + endif + if prevl =~# '^\s*\(case .*\|default\):$' + " previous line is part of a switch statement + let ind += s:sw() + endif + " TODO: handle if the previous line is a label. + + if thisl =~ '^\s*[)}]' + " this line closed a block + let ind -= s:sw() + endif + + " Colons are tricky. + " We want to outdent if it's part of a switch ("case foo:" or "default:"). + " We ignore trying to deal with jump labels because (a) they're rare, and + " (b) they're hard to disambiguate from a composite literal key. + if thisl =~# '^\s*\(case .*\|default\):$' + let ind -= s:sw() + endif + + return ind +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/indent/gohtmltmpl.vim b/.vim/bundle/vim-go/indent/gohtmltmpl.vim new file mode 100644 index 0000000..864913d --- /dev/null +++ b/.vim/bundle/vim-go/indent/gohtmltmpl.vim @@ -0,0 +1,46 @@ +if exists("b:did_indent") + finish +endif + +runtime! indent/html.vim + +" Indent Golang HTML templates +setlocal indentexpr=GetGoHTMLTmplIndent(v:lnum) +setlocal indentkeys+==else,=end + +" Only define the function once. +if exists("*GetGoHTMLTmplIndent") + finish +endif + +function! GetGoHTMLTmplIndent(lnum) + " Get HTML indent + if exists('*HtmlIndent') + let ind = HtmlIndent() + else + let ind = HtmlIndentGet(a:lnum) + endif + + " The value of a single shift-width + if exists('*shiftwidth') + let sw = shiftwidth() + else + let sw = &sw + endif + + " If need to indent based on last line + let last_line = getline(a:lnum-1) + if last_line =~ '^\s*{{-\=\s*\%(if\|else\|range\|with\|define\|block\).*}}' + let ind += sw + endif + + " End of FuncMap block + let current_line = getline(a:lnum) + if current_line =~ '^\s*{{-\=\s*\%(else\|end\).*}}' + let ind -= sw + endif + + return ind +endfunction + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/plugin/go.vim b/.vim/bundle/vim-go/plugin/go.vim new file mode 100644 index 0000000..2654731 --- /dev/null +++ b/.vim/bundle/vim-go/plugin/go.vim @@ -0,0 +1,213 @@ +" install necessary Go tools +if exists("g:go_loaded_install") + finish +endif +let g:go_loaded_install = 1 + +" these packages are used by vim-go and can be automatically installed if +" needed by the user with GoInstallBinaries +let s:packages = [ + \ "github.com/nsf/gocode", + \ "github.com/alecthomas/gometalinter", + \ "golang.org/x/tools/cmd/goimports", + \ "golang.org/x/tools/cmd/guru", + \ "golang.org/x/tools/cmd/gorename", + \ "github.com/golang/lint/golint", + \ "github.com/rogpeppe/godef", + \ "github.com/kisielk/errcheck", + \ "github.com/jstemmer/gotags", + \ "github.com/klauspost/asmfmt/cmd/asmfmt", + \ "github.com/fatih/motion", + \ "github.com/zmb3/gogetdoc", + \ "github.com/josharian/impl", + \ ] + +" These commands are available on any filetypes +command! GoInstallBinaries call s:GoInstallBinaries(-1) +command! GoUpdateBinaries call s:GoInstallBinaries(1) +command! -nargs=? -complete=dir GoPath call go#path#GoPath() + +" GoInstallBinaries downloads and install all necessary binaries stated in the +" packages variable. It uses by default $GOBIN or $GOPATH/bin as the binary +" target install directory. GoInstallBinaries doesn't install binaries if they +" exist, to update current binaries pass 1 to the argument. +function! s:GoInstallBinaries(updateBinaries) + if $GOPATH == "" && go#util#gopath() == "" + echohl Error + echomsg "vim.go: $GOPATH is not set" + echohl None + return + endif + + let err = s:CheckBinaries() + if err != 0 + return + endif + + let go_bin_path = go#path#BinPath() + + " change $GOBIN so go get can automatically install to it + let $GOBIN = go_bin_path + + " old_path is used to restore users own path + let old_path = $PATH + + " vim's executable path is looking in PATH so add our go_bin path to it + let $PATH = go_bin_path . go#util#PathListSep() . $PATH + + " when shellslash is set on MS-* systems, shellescape puts single quotes + " around the output string. cmd on Windows does not handle single quotes + " correctly. Unsetting shellslash forces shellescape to use double quotes + " instead. + let resetshellslash = 0 + if has('win32') && &shellslash + let resetshellslash = 1 + set noshellslash + endif + + let cmd = "go get -v " + if get(g:, "go_get_update", 1) != 0 + let cmd .= "-u " + endif + + let s:go_version = matchstr(go#util#System("go version"), '\d.\d.\d') + + " https://github.com/golang/go/issues/10791 + if s:go_version > "1.4.0" && s:go_version < "1.5.0" + let cmd .= "-f " + endif + + for pkg in s:packages + let basename = fnamemodify(pkg, ":t") + let binname = "go_" . basename . "_bin" + + let bin = basename + if exists("g:{binname}") + let bin = g:{binname} + endif + + if !executable(bin) || a:updateBinaries == 1 + if a:updateBinaries == 1 + echo "vim-go: Updating ". basename .". Reinstalling ". pkg . " to folder " . go_bin_path + else + echo "vim-go: ". basename ." not found. Installing ". pkg . " to folder " . go_bin_path + endif + + + let out = go#util#System(cmd . shellescape(pkg)) + if go#util#ShellError() != 0 + echo "Error installing ". pkg . ": " . out + endif + endif + endfor + + " restore back! + let $PATH = old_path + if resetshellslash + set shellslash + endif +endfunction + +" CheckBinaries checks if the necessary binaries to install the Go tool +" commands are available. +function! s:CheckBinaries() + if !executable('go') + echohl Error | echomsg "vim-go: go executable not found." | echohl None + return -1 + endif + + if !executable('git') + echohl Error | echomsg "vim-go: git executable not found." | echohl None + return -1 + endif +endfunction + +" Autocommands +" ============================================================================ +" +function! s:echo_go_info() + if !get(g:, "go_echo_go_info", 1) + return + endif + + if !exists('v:completed_item') || empty(v:completed_item) + return + endif + let item = v:completed_item + + if !has_key(item, "info") + return + endif + + if empty(item.info) + return + endif + + redraws! | echo "vim-go: " | echohl Function | echon item.info | echohl None +endfunction + +function! s:auto_type_info() + " GoInfo automatic update + if get(g:, "go_auto_type_info", 0) + call go#tool#Info(1) + endif +endfunction + +function! s:auto_sameids() + " GoSameId automatic update + if get(g:, "go_auto_sameids", 0) + call go#guru#SameIds() + endif +endfunction + +function! s:fmt_autosave() + " Go code formatting on save + if get(g:, "go_fmt_autosave", 1) + call go#fmt#Format(-1) + endif +endfunction + +function! s:asmfmt_autosave() + " Go asm formatting on save + if get(g:, "go_asmfmt_autosave", 0) + call go#asmfmt#Format() + endif +endfunction + +function! s:metalinter_autosave() + " run gometalinter on save + if get(g:, "go_metalinter_autosave", 0) + call go#lint#Gometa(1) + endif +endfunction + +function! s:template_autocreate() + " create new template from scratch + if get(g:, "go_template_autocreate", 1) + call go#template#create() + endif +endfunction + +augroup vim-go + autocmd! + + autocmd CursorHold *.go call s:auto_type_info() + autocmd CursorHold *.go call s:auto_sameids() + + " Echo the identifier information when completion is done. Useful to see + " the signature of a function, etc... + if exists('##CompleteDone') + autocmd CompleteDone *.go call s:echo_go_info() + endif + + autocmd BufWritePre *.go call s:fmt_autosave() + autocmd BufWritePre *.s call s:asmfmt_autosave() + autocmd BufWritePost *.go call s:metalinter_autosave() + autocmd BufNewFile *.go call s:template_autocreate() + " clear SameIds when the buffer is unloaded so that loading another buffer + " in the same window doesn't highlight the most recently matched + " identifier's positions. + autocmd BufWinEnter *.go call go#guru#ClearSameIds() +augroup END + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/scripts/runtest.vim b/.vim/bundle/vim-go/scripts/runtest.vim new file mode 100644 index 0000000..a096036 --- /dev/null +++ b/.vim/bundle/vim-go/scripts/runtest.vim @@ -0,0 +1,81 @@ +let total_started = reltime() + +" add vim-go the only plugin inside the runtimepath +let git_root_path = system("git rev-parse --show-toplevel | tr -d '\\n'") +exe 'set rtp=' . git_root_path + +" source the passed test file +source % + +" cd into the folder of the test file +let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' +let dir = getcwd() +execute cd . expand('%:p:h') + +" initialize variables +let g:testname = expand('%') +let s:fail = 0 +let s:done = 0 +let s:logs = [] + +" get a list of all Test_ functions for the given file +set nomore +redir @q +silent function /^Test_ +redir END +let s:tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g')) + +" Iterate over all tests and execute them +for s:test in sort(s:tests) + let started = reltime() + + call add(s:logs, printf("=== RUN %s", s:test[:-3])) + exe 'call ' . s:test + + let elapsed_time = reltimestr(reltime(started)) + let elapsed_time = substitute(elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + + let s:done += 1 + + if len(v:errors) > 0 + let s:fail += 1 + call add(s:logs, printf("--- FAIL: %s (%ss)", s:test[:-3], elapsed_time)) + call extend(s:logs, map(v:errors, '" ". v:val')) + + " reset so we can capture failures of next test + let v:errors = [] + else + call add(s:logs, printf("--- PASS: %s (%ss)", s:test[:-3], elapsed_time)) + endif +endfor + +" pop out into the scripts folder +execute cd . fnameescape(dir) + +" create an empty fail to indicate that the test failed +if s:fail > 0 + split FAILED + write +endif + +let total_elapsed_time = reltimestr(reltime(total_started)) +let total_elapsed_time = substitute(total_elapsed_time, '^\s*\(.\{-}\)\s*$', '\1', '') + +let message = 'Executed ' . s:done . (s:done > 1 ? ' tests' : ' test') . '. Total test time: '. total_elapsed_time .'s' +call add(s:logs, "") +call add(s:logs, message) + +" store all error messages from within vim into test.log +redir > test.log +silent messages +redir END + +" also store all internal messages from s:logs: as well +split test.log +call append(line('$'), '') +call append(line('$'), 'From ' . g:testname . ':') +call append(line('$'), s:logs) +write + +" bye, bye! +qall! diff --git a/.vim/bundle/vim-go/scripts/test.sh b/.vim/bundle/vim-go/scripts/test.sh new file mode 100755 index 0000000..cda3350 --- /dev/null +++ b/.vim/bundle/vim-go/scripts/test.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +set -e + +cd $(dirname $0) + +# cleanup test.log +if [ -f "test.log" ]; then + rm test.log +fi + +if [ -f "FAILED" ]; then + rm FAILED +fi + +for test_file in ../autoload/go/*_test.vim +do + vim -u NONE -S runtest.vim $test_file +done + +if [ -f "test.log" ]; then + cat test.log +fi + +# if Failed exists, test failed +if [ -f "FAILED" ]; then + echo 2>&1 "FAIL" + exit 1 +fi +echo 2>&1 "PASS" diff --git a/.vim/bundle/vim-go/syntax/go.vim b/.vim/bundle/vim-go/syntax/go.vim new file mode 100644 index 0000000..8d7560f --- /dev/null +++ b/.vim/bundle/vim-go/syntax/go.vim @@ -0,0 +1,397 @@ +" Copyright 2009 The Go Authors. All rights reserved. +" Use of this source code is governed by a BSD-style +" license that can be found in the LICENSE file. +" +" go.vim: Vim syntax file for Go. +" +" Options: +" There are some options for customizing the highlighting; the recommended +" settings are the default values, but you can write: +" let OPTION_NAME = 0 +" in your ~/.vimrc file to disable particular options. You can also write: +" let OPTION_NAME = 1 +" to enable particular options. At present, all options default to off: +" +" - go_highlight_array_whitespace_error +" Highlights white space after "[]". +" - go_highlight_chan_whitespace_error +" Highlights white space around the communications operator that don't follow +" the standard style. +" - go_highlight_extra_types +" Highlights commonly used library types (io.Reader, etc.). +" - go_highlight_space_tab_error +" Highlights instances of tabs following spaces. +" - go_highlight_trailing_whitespace_error +" Highlights trailing white space. +" - go_highlight_string_spellcheck +" Specifies that strings should be spell checked +" - go_highlight_format_strings +" Highlights printf-style operators inside string literals. + +" Quit when a (custom) syntax file was already loaded +if exists("b:current_syntax") + finish +endif + +if !exists("g:go_highlight_array_whitespace_error") + let g:go_highlight_array_whitespace_error = 0 +endif + +if !exists("g:go_highlight_chan_whitespace_error") + let g:go_highlight_chan_whitespace_error = 0 +endif + +if !exists("g:go_highlight_extra_types") + let g:go_highlight_extra_types = 0 +endif + +if !exists("g:go_highlight_space_tab_error") + let g:go_highlight_space_tab_error = 0 +endif + +if !exists("g:go_highlight_trailing_whitespace_error") + let g:go_highlight_trailing_whitespace_error = 0 +endif + +if !exists("g:go_highlight_operators") + let g:go_highlight_operators = 0 +endif + +if !exists("g:go_highlight_functions") + let g:go_highlight_functions = 0 +endif + +if !exists("g:go_highlight_methods") + let g:go_highlight_methods = 0 +endif + +if !exists("g:go_highlight_fields") + let g:go_highlight_fields = 0 +endif + +if !exists("g:go_highlight_types") + let g:go_highlight_types = 0 +endif + +if !exists("g:go_highlight_build_constraints") + let g:go_highlight_build_constraints = 0 +endif + +if !exists("g:go_highlight_string_spellcheck") + let g:go_highlight_string_spellcheck = 1 +endif + +if !exists("g:go_highlight_format_strings") + let g:go_highlight_format_strings = 1 +endif + +if !exists("g:go_highlight_generate_tags") + let g:go_highlight_generate_tags = 0 +endif + +syn case match + +syn keyword goDirective package import +syn keyword goDeclaration var const + +hi def link goDirective Statement +hi def link goDeclaration Keyword + +" Keywords within functions +syn keyword goStatement defer go goto return break continue fallthrough +syn keyword goConditional if else switch select +syn keyword goLabel case default +syn keyword goRepeat for range + +hi def link goStatement Statement +hi def link goConditional Conditional +hi def link goLabel Label +hi def link goRepeat Repeat + +" Predefined types +syn keyword goType chan map bool string error +syn keyword goSignedInts int int8 int16 int32 int64 rune +syn keyword goUnsignedInts byte uint uint8 uint16 uint32 uint64 uintptr +syn keyword goFloats float32 float64 +syn keyword goComplexes complex64 complex128 + +hi def link goType Type +hi def link goSignedInts Type +hi def link goUnsignedInts Type +hi def link goFloats Type +hi def link goComplexes Type + + +" Predefined functions and values +syn match goBuiltins /\<\v(append|cap|close|complex|copy|delete|imag|len)\ze\(/ +syn match goBuiltins /\<\v(make|new|panic|print|println|real|recover)\ze\(/ +syn keyword goBoolean true false +syn keyword goPredefinedIdentifiers nil iota + +hi def link goBuiltins Keyword +hi def link goBoolean Boolean +hi def link goPredefinedIdentifiers goBoolean + +" Comments; their contents +syn keyword goTodo contained TODO FIXME XXX BUG +syn cluster goCommentGroup contains=goTodo +syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell +syn region goComment start="//" end="$" contains=goGenerate,@goCommentGroup,@Spell + +hi def link goComment Comment +hi def link goTodo Todo + +if g:go_highlight_generate_tags != 0 + syn match goGenerateVariables contained /\(\$GOARCH\|\$GOOS\|\$GOFILE\|\$GOLINE\|\$GOPACKAGE\|\$DOLLAR\)\>/ + syn region goGenerate start="^\s*//go:generate" end="$" contains=goGenerateVariables + hi def link goGenerate PreProc + hi def link goGenerateVariables Special +endif + +" Go escapes +syn match goEscapeOctal display contained "\\[0-7]\{3}" +syn match goEscapeC display contained +\\[abfnrtv\\'"]+ +syn match goEscapeX display contained "\\x\x\{2}" +syn match goEscapeU display contained "\\u\x\{4}" +syn match goEscapeBigU display contained "\\U\x\{8}" +syn match goEscapeError display contained +\\[^0-7xuUabfnrtv\\'"]+ + +hi def link goEscapeOctal goSpecialString +hi def link goEscapeC goSpecialString +hi def link goEscapeX goSpecialString +hi def link goEscapeU goSpecialString +hi def link goEscapeBigU goSpecialString +hi def link goSpecialString Special +hi def link goEscapeError Error + +" Strings and their contents +syn cluster goStringGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU,goEscapeError +if g:go_highlight_string_spellcheck != 0 + syn region goString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup,@Spell + syn region goRawString start=+`+ end=+`+ contains=@Spell +else + syn region goString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup + syn region goRawString start=+`+ end=+`+ +endif + +if g:go_highlight_format_strings != 0 + syn match goFormatSpecifier /\([^%]\(%%\)*\)\@<=%[-#0 +]*\%(\*\|\d\+\)\=\%(\.\%(\*\|\d\+\)\)*[vTtbcdoqxXUeEfgGsp]/ contained containedin=goString + hi def link goFormatSpecifier goSpecialString +endif + +hi def link goString String +hi def link goRawString String + +" Characters; their contents +syn cluster goCharacterGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU +syn region goCharacter start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@goCharacterGroup + +hi def link goCharacter Character + +" Regions +syn region goBlock start="{" end="}" transparent fold +syn region goParen start='(' end=')' transparent + +" Integers +syn match goDecimalInt "\<-\=\d\+\%([Ee][-+]\=\d\+\)\=\>" +syn match goHexadecimalInt "\<-\=0[xX]\x\+\>" +syn match goOctalInt "\<-\=0\o\+\>" +syn match goOctalError "\<-\=0\o*[89]\d*\>" + +hi def link goDecimalInt Integer +hi def link goHexadecimalInt Integer +hi def link goOctalInt Integer +hi def link goOctalError Error +hi def link Integer Number + +" Floating point +syn match goFloat "\<-\=\d\+\.\d*\%([Ee][-+]\=\d\+\)\=\>" +syn match goFloat "\<-\=\.\d\+\%([Ee][-+]\=\d\+\)\=\>" + +hi def link goFloat Float + +" Imaginary literals +syn match goImaginary "\<-\=\d\+i\>" +syn match goImaginary "\<-\=\d\+[Ee][-+]\=\d\+i\>" +syn match goImaginaryFloat "\<-\=\d\+\.\d*\%([Ee][-+]\=\d\+\)\=i\>" +syn match goImaginaryFloat "\<-\=\.\d\+\%([Ee][-+]\=\d\+\)\=i\>" + +hi def link goImaginary Number +hi def link goImaginaryFloat Float + +" Spaces after "[]" +if g:go_highlight_array_whitespace_error != 0 + syn match goSpaceError display "\(\[\]\)\@<=\s\+" +endif + +" Spacing errors around the 'chan' keyword +if g:go_highlight_chan_whitespace_error != 0 + " receive-only annotation on chan type + " + " \(\\)\@\)\@\)\@=" + + " send-only annotation on chan type + " + " \(<-\)\@ (only pick chan when it doesn't come after an arrow) + " this prevents picking up '<-chan <-chan' but not 'chan <-' + syn match goSpaceError display "\(\(<-\)\@\)\@<=\s\+\(<-\)\@=" + + " value-ignoring receives in a few contexts + syn match goSpaceError display "\(\(^\|[={(,;]\)\s*<-\)\@<=\s\+" +endif + +" Extra types commonly seen +if g:go_highlight_extra_types != 0 + syn match goExtraType /\/ + syn match goExtraType /\/ + syn match goExtraType /\/ + syn match goExtraType /\/ +endif + +" Space-tab error +if g:go_highlight_space_tab_error != 0 + syn match goSpaceError display " \+\t"me=e-1 +endif + +" Trailing white space error +if g:go_highlight_trailing_whitespace_error != 0 + syn match goSpaceError display excludenl "\s\+$" +endif + +hi def link goExtraType Type +hi def link goSpaceError Error + + + +" included from: https://github.com/athom/more-colorful.vim/blob/master/after/syntax/go.vim +" +" Comments; their contents +syn keyword goTodo contained NOTE +hi def link goTodo Todo + +syn match goVarArgs /\.\.\./ + +" Operators; +if g:go_highlight_operators != 0 + " match single-char operators: - + % < > ! & | ^ * = + " and corresponding two-char operators: -= += %= <= >= != &= |= ^= *= == + syn match goOperator /[-+%<>!&|^*=]=\?/ + " match / and /= + syn match goOperator /\/\%(=\|\ze[^/*]\)/ + " match two-char operators: << >> &^ + " and corresponding three-char operators: <<= >>= &^= + syn match goOperator /\%(<<\|>>\|&^\)=\?/ + " match remaining two-char operators: := && || <- ++ -- + syn match goOperator /:=\|||\|<-\|++\|--/ + " match ... + + hi def link goPointerOperator goOperator + hi def link goVarArgs goOperator +endif +hi def link goOperator Operator + +" Functions; +if g:go_highlight_functions != 0 + syn match goDeclaration /\/ nextgroup=goReceiver,goFunction skipwhite skipnl + syn match goReceiver /(\(\w\|[ *]\)\+)/ contained nextgroup=goFunction contains=goReceiverVar skipwhite skipnl + syn match goReceiverVar /\w\+/ nextgroup=goPointerOperator,goReceiverType skipwhite skipnl contained + syn match goPointerOperator /\*/ nextgroup=goReceiverType contained skipwhite skipnl + syn match goReceiverType /\w\+/ contained + syn match goFunction /\w\+/ contained + syn match goFunctionCall /\w\+\ze(/ contains=GoBuiltins,goDeclaration +else + syn keyword goDeclaration func +endif +hi def link goFunction Function +hi def link goFunctionCall Type + +" Methods; +if g:go_highlight_methods != 0 + syn match goMethodCall /\.\w\+\ze(/hs=s+1 +endif +hi def link goMethodCall Type + +" Fields; +if g:go_highlight_fields != 0 + syn match goField /\.\w\+\([.\ \n\r\:\)\[,]\)\@=/hs=s+1 +endif +hi def link goField Identifier + +" Structs & Interfaces; +if g:go_highlight_types != 0 + syn match goTypeConstructor /\<\w\+{/he=e-1 + syn match goTypeDecl /\/ nextgroup=goTypeName skipwhite skipnl + syn match goTypeName /\w\+/ contained nextgroup=goDeclType skipwhite skipnl + syn match goDeclType /\/ skipwhite skipnl + hi def link goReceiverType Type +else + syn keyword goDeclType struct interface + syn keyword goDeclaration type +endif +hi def link goTypeConstructor Type +hi def link goTypeName Type +hi def link goTypeDecl Keyword +hi def link goDeclType Keyword + +" Build Constraints +if g:go_highlight_build_constraints != 0 + syn match goBuildKeyword display contained "+build" + " Highlight the known values of GOOS, GOARCH, and other +build options. + syn keyword goBuildDirectives contained + \ android darwin dragonfly freebsd linux nacl netbsd openbsd plan9 + \ solaris windows 386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 + \ ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc + \ s390 s390x sparc sparc64 cgo ignore race + + " Other words in the build directive are build tags not listed above, so + " avoid highlighting them as comments by using a matchgroup just for the + " start of the comment. + " The rs=s+2 option lets the \s*+build portion be part of the inner region + " instead of the matchgroup so it will be highlighted as a goBuildKeyword. + syn region goBuildComment matchgroup=goBuildCommentStart + \ start="//\s*+build\s"rs=s+2 end="$" + \ contains=goBuildKeyword,goBuildDirectives + hi def link goBuildCommentStart Comment + hi def link goBuildDirectives Type + hi def link goBuildKeyword PreProc + + " One or more line comments that are followed immediately by a "package" + " declaration are treated like package documentation, so these must be + " matched as comments to avoid looking like working build constraints. + " The he, me, and re options let the "package" itself be highlighted by + " the usual rules. + syn region goPackageComment start=/\v(\/\/.*\n)+\s*package/ + \ end=/\v\n\s*package/he=e-7,me=e-7,re=e-7 + \ contains=@goCommentGroup,@Spell + hi def link goPackageComment Comment +endif + +" :GoCoverage commands +hi def link goCoverageNormalText Comment + +function! s:hi() + hi def link goSameId Search + + " :GoCoverage commands + hi def goCoverageCovered ctermfg=green guifg=#A6E22E + hi def goCoverageUncover ctermfg=red guifg=#F92672 +endfunction + +augroup vim-go-hi + autocmd! + autocmd ColorScheme * call s:hi() +augroup end +call s:hi() + +" Search backwards for a global declaration to start processing the syntax. +"syn sync match goSync grouphere NONE /^\(const\|var\|type\|func\)\>/ + +" There's a bug in the implementation of grouphere. For now, use the +" following as a more expensive/less precise workaround. +syn sync minlines=500 + +let b:current_syntax = "go" + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/syntax/godefstack.vim b/.vim/bundle/vim-go/syntax/godefstack.vim new file mode 100644 index 0000000..e4eefff --- /dev/null +++ b/.vim/bundle/vim-go/syntax/godefstack.vim @@ -0,0 +1,20 @@ +if exists("b:current_syntax") + finish +endif + +syn match godefStackComment '^".*' +syn match godefLinePrefix '^[>\s]\s' nextgroup=godefStackEntryNumber contains=godefStackCurrentPosition +syn match godefStackEntryNumber '\d\+' nextgroup=godefStackFilename skipwhite +syn match godefStackCurrentPosition '>' contained +syn match godefStackFilename '[^|]\+' contained nextgroup=godefStackEntryLocation +syn region godefStackEntryLocation oneline start='|' end='|' contained contains=godefStackEntryLocationNumber +syn match godefStackEntryLocationNumber '\d\+' contained display + +let b:current_syntax = "godefstack" + +hi def link godefStackComment Comment +hi def link godefStackCurrentPosition Special +hi def link godefStackFilename Directory +hi def link godefStackEntryLocationNumber LineNr + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/syntax/gohtmltmpl.vim b/.vim/bundle/vim-go/syntax/gohtmltmpl.vim new file mode 100644 index 0000000..f53fbc6 --- /dev/null +++ b/.vim/bundle/vim-go/syntax/gohtmltmpl.vim @@ -0,0 +1,15 @@ +if exists("b:current_syntax") + finish +endif + +if !exists("main_syntax") + let main_syntax = 'html' +endif + +runtime! syntax/gotexttmpl.vim +runtime! syntax/html.vim +unlet b:current_syntax + +let b:current_syntax = "gohtmltmpl" + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/syntax/gotexttmpl.vim b/.vim/bundle/vim-go/syntax/gotexttmpl.vim new file mode 100644 index 0000000..de21d7f --- /dev/null +++ b/.vim/bundle/vim-go/syntax/gotexttmpl.vim @@ -0,0 +1,85 @@ +" Copyright 2011 The Go Authors. All rights reserved. +" Use of this source code is governed by a BSD-style +" license that can be found in the LICENSE file. +" +" gotexttmpl.vim: Vim syntax file for Go templates. + +" Quit when a (custom) syntax file was already loaded +if exists("b:current_syntax") + finish +endif + +syn case match + +" Go escapes +syn match goEscapeOctal display contained "\\[0-7]\{3}" +syn match goEscapeC display contained +\\[abfnrtv\\'"]+ +syn match goEscapeX display contained "\\x\x\{2}" +syn match goEscapeU display contained "\\u\x\{4}" +syn match goEscapeBigU display contained "\\U\x\{8}" +syn match goEscapeError display contained +\\[^0-7xuUabfnrtv\\'"]+ + +hi def link goEscapeOctal goSpecialString +hi def link goEscapeC goSpecialString +hi def link goEscapeX goSpecialString +hi def link goEscapeU goSpecialString +hi def link goEscapeBigU goSpecialString +hi def link goSpecialString Special +hi def link goEscapeError Error + +" Strings and their contents +syn cluster goStringGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU,goEscapeError +syn region goString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup +syn region goRawString contained start=+`+ end=+`+ + +hi def link goString String +hi def link goRawString String + +" Characters; their contents +syn cluster goCharacterGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU +syn region goCharacter contained start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@goCharacterGroup + +hi def link goCharacter Character + +" Integers +syn match goDecimalInt contained "\<\d\+\([Ee]\d\+\)\?\>" +syn match goHexadecimalInt contained "\<0x\x\+\>" +syn match goOctalInt contained "\<0\o\+\>" +syn match goOctalError contained "\<0\o*[89]\d*\>" +syn cluster goInt contains=goDecimalInt,goHexadecimalInt,goOctalInt +" Floating point +syn match goFloat contained "\<\d\+\.\d*\([Ee][-+]\d\+\)\?\>" +syn match goFloat contained "\<\.\d\+\([Ee][-+]\d\+\)\?\>" +syn match goFloat contained "\<\d\+[Ee][-+]\d\+\>" +" Imaginary literals +syn match goImaginary contained "\<\d\+i\>" +syn match goImaginary contained "\<\d\+\.\d*\([Ee][-+]\d\+\)\?i\>" +syn match goImaginary contained "\<\.\d\+\([Ee][-+]\d\+\)\?i\>" +syn match goImaginary contained "\<\d\+[Ee][-+]\d\+i\>" + +hi def link goInt Number +hi def link goFloat Number +hi def link goImaginary Number + +" Token groups +syn cluster gotplLiteral contains=goString,goRawString,goCharacter,@goInt,goFloat,goImaginary +syn keyword gotplControl contained if else end range with template +syn keyword gotplFunctions contained and html index js len not or print printf println urlquery eq ne lt le gt ge +syn match gotplVariable contained /\$[a-zA-Z0-9_]*\>/ +syn match goTplIdentifier contained /\.[^\s}]+\>/ + +hi def link gotplControl Keyword +hi def link gotplFunctions Function +hi def link goTplVariable Special + +syn region gotplAction start="{{" end="}}" contains=@gotplLiteral,gotplControl,gotplFunctions,gotplVariable,goTplIdentifier display +syn region gotplAction start="\[\[" end="\]\]" contains=@gotplLiteral,gotplControl,gotplFunctions,gotplVariable display +syn region goTplComment start="{{/\*" end="\*/}}" display +syn region goTplComment start="\[\[/\*" end="\*/\]\]" display + +hi def link gotplAction PreProc +hi def link goTplComment Comment + +let b:current_syntax = "gotexttmpl" + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/syntax/vimgo.vim b/.vim/bundle/vim-go/syntax/vimgo.vim new file mode 100644 index 0000000..3a2204c --- /dev/null +++ b/.vim/bundle/vim-go/syntax/vimgo.vim @@ -0,0 +1,13 @@ +if exists("b:current_syntax") + finish +endif + +let b:current_syntax = "vimgo" + +syn match goInterface /^\S*/ +syn region goTitle start="\%1l" end=":" + +hi def link goInterface Type +hi def link goTitle Label + +" vim: sw=2 ts=2 et diff --git a/.vim/bundle/vim-go/templates/hello_world.go b/.vim/bundle/vim-go/templates/hello_world.go new file mode 100644 index 0000000..50e8d8d --- /dev/null +++ b/.vim/bundle/vim-go/templates/hello_world.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("vim-go") +} diff --git a/.vim/bundle/vim-racer/README.md b/.vim/bundle/vim-racer/README.md new file mode 100644 index 0000000..b56655d --- /dev/null +++ b/.vim/bundle/vim-racer/README.md @@ -0,0 +1,60 @@ +# Vim Racer Plugin + +This plugin allows vim to use [Racer](http://github.com/phildawes/racer) for Rust code completion and navigation. + +## Installation + +1. Build / Install [Racer](http://github.com/phildawes/racer) + +2. Install using Pathogen, Vundle or NeoBundle. Or, copy `plugin/racer.vim` into your `~/.vim/plugin` directory. + + Vundle users: + ``` + Plugin 'racer-rust/vim-racer' + ``` + + NeoBundle users: + ``` + NeoBundle 'racer-rust/vim-racer' + ``` + + vim-plug users: + ``` + Plug 'racer-rust/vim-racer' + ``` + + Pathogen users: + ``` + git clone --depth=1 https://github.com/racer-rust/vim-racer.git ~/.vim/bundle/vim-racer + ``` + +3. Add `g:racer_cmd` to your `.vimrc`. Also it's worth turning on 'hidden' mode for buffers otherwise you need to save the current buffer every time you do a goto-definition. E.g.: + + ``` + set hidden + let g:racer_cmd = "/path/to/racer/bin" + ``` + +4. If you want completions to show the complete function definition (e.g. its arguments and return type), enable the experimental completer: + + ``` + let g:racer_experimental_completer = 1 + ``` + +## Example Mappings + +vim-racer enables `C-x-C-o` to search for completions and provides several +`` mappings for source code navigation. These mappings are not enabled by +default but you can easily use them by adding the following lines to your +`.vimrc` (Or `init.vim` in case of Neovim). + +For example, with the following mappings you can navigate to the identifier under +the cursor and open it on the current buffer, on an horizontal or vertical split, +or go straight to the documentation: + +``` +au FileType rust nmap gd (rust-def) +au FileType rust nmap gs (rust-def-split) +au FileType rust nmap gx (rust-def-vertical) +au FileType rust nmap gd (rust-doc) +``` diff --git a/.vim/bundle/vim-racer/autoload/racer.vim b/.vim/bundle/vim-racer/autoload/racer.vim new file mode 100644 index 0000000..5cb80d7 --- /dev/null +++ b/.vim/bundle/vim-racer/autoload/racer.vim @@ -0,0 +1,265 @@ +function! s:RacerGetPrefixCol(base) + let col = col('.') - 1 + let b:racer_col = col + let b:tmpfname = tempname() + call writefile(s:RacerGetBufferContents(a:base), b:tmpfname) + let cmd = g:racer_cmd . ' prefix ' . line('.') . ' ' . col . ' ' . b:tmpfname + let res = system(cmd) + let prefixline = split(res, '\n')[0] + let startbyte = split(prefixline[7:], ',')[0] + return startbyte - line2byte(byte2line(startbyte)) + 1 +endfunction + +function! s:RacerGetExpCompletions(base) + let col = col('.')-1 + let b:tmpfname = tempname() + call writefile(s:RacerGetBufferContents(a:base), b:tmpfname) + let fname = expand('%:p') + let cmd = g:racer_cmd . ' complete ' . line('.') . ' ' . col . ' "' . fname . '" "' . b:tmpfname . '"' + let res = system(cmd) + + let typeMap = { + \ 'Struct' : 's', 'Module' : 'M', 'Function' : 'f', + \ 'Crate' : 'C', 'Let' : 'v', 'StructField' : 'm', + \ 'Impl' : 'i', 'Enum' : 'e', 'EnumVariant' : 'E', + \ 'Type' : 't', 'FnArg' : 'v', 'Trait' : 'T' + \ } + + let lines = split(res, '\n') + let out = [] + + for line in lines + if line !~# '^MATCH' + continue + endif + + let completions = split(line[6:], ',') + let kind = get(typeMap, completions[4]) + let completion = { 'kind' : kind, 'word' : completions[0], 'dup' : 1 } + let info = join(completions[5:], ',') + + if kind ==# 'f' + " function + let completion['menu'] = substitute( + \ substitute( + \ substitute(info, '\(pub\|fn\) ', '', 'g'), + \ '{*$', '', '' + \ ), + \ ' where\s\?.*$', '', '' + \ ) + if g:racer_insert_paren == 1 + let completion['abbr'] = completions[0] + let completion['word'] .= '(' + endif + let completion['info'] = info + elseif kind ==# 's' " struct + let completion['menu'] = substitute( + \ substitute(info, '\(pub\|struct\) ', '', 'g'), + \ '{*$', '', '' + \ ) + endif + + if stridx(tolower(completions[0]), tolower(a:base)) == 0 + let out = add(out, completion) + endif + endfor + call delete(b:tmpfname) + return out +endfunction + +function! s:RacerSplitLine(line) + let separator = ';' + let placeholder = '{PLACEHOLDER}' + let line = substitute(a:line, '\\;', placeholder, 'g') + let parts = split(line, separator) + let docs = substitute( + \ substitute( + \ substitute( + \ substitute(get(parts, 7, ''), '^\"\(.*\)\"$', '\1', ''), + \ '\\\"', '\"', 'g' + \ ), + \ '\\''', '''', 'g' + \ ), + \ '\\n', '\n', 'g' + \ ) + let parts = add(parts[:6], docs) + let parts = map(copy(parts), 'substitute(v:val, ''{PLACEHOLDER}'', '';'', ''g'')') + + return parts +endfunction + +function! racer#ShowDocumentation() + let winview = winsaveview() " Save the current cursor position + " Move to the end of the word for the entire token to search. + " Move one char back to avoid moving to the end of the *next* word. + execute 'normal he' + let col = col('.') + let b:tmpfname = tempname() + " Create temporary file with the buffer's current state + call writefile(getline(1, '$'), b:tmpfname) + let fname = expand('%:p') + let cmd = g:racer_cmd . ' complete-with-snippet ' . line('.') . ' ' . col . ' ' . fname . ' ' . b:tmpfname + let res = system(cmd) + " Restore de cursor position + call winrestview(winview) + " Delete the temporary file + call delete(b:tmpfname) + let lines = split(res, '\n') + for line in lines + if line !~# '^MATCH' + continue + endif + + let docs = s:RacerSplitLine(line[6:])[7] + if len(docs) == 0 + break + endif + + " Only open doc buffer if there're docs to show + let bn = bufnr('__doc__') + if bn > 0 + let wi = index(tabpagebuflist(tabpagenr()), bn) + if wi >= 0 + " If the __doc__ buffer is open in the current tab, jump to it + silent execute (wi+1) . 'wincmd w' + else + silent execute 'sbuffer ' . bn + endif + else + split '__doc__' + endif + + setlocal nobuflisted + setlocal modifiable + setlocal noswapfile + setlocal buftype=nofile + silent normal! ggdG + silent $put=docs + silent normal! 1Gdd + setlocal nomodifiable + setlocal nomodified + setlocal filetype=rustdoc + break + endfor +endfunction + +function! s:RacerGetCompletions(base) + let col = col('.') - 1 + let b:tmpfname = tempname() + " HACK: Special case to offer autocompletion on a string literal + if getline('.')[:col-1] =~# '".*"\.$' + call writefile(['fn main() {', ' let x: &str = "";', ' x.', '}'], b:tmpfname) + let fname = expand('%:p') + let cmd = g:racer_cmd . ' complete 3 6 "' . fname . '" "' . b:tmpfname . '"' + else + call writefile(s:RacerGetBufferContents(a:base), b:tmpfname) + let fname = expand('%:p') + let cmd = g:racer_cmd . ' complete ' . line('.') . ' ' . col . ' "' . fname . '" "' . b:tmpfname . '"' + endif + let res = system(cmd) + let lines = split(res, '\n') + let out = [] + for line in lines + if line !~# '^MATCH' + continue + endif + let completion = split(line[6:], ',')[0] + if stridx(tolower(completion), tolower(a:base)) == 0 + let out = add(out, completion) + endif + endfor + call delete(b:tmpfname) + + return out +endfunction + +function! racer#GoToDefinition() + if s:ErrorCheck() + return + endif + + let col = col('.') - 1 + let b:racer_col = col + let fname = expand('%:p') + let tmpfname = tempname() + call writefile(getline(1, '$'), tmpfname) + let cmd = g:racer_cmd . ' find-definition ' . line('.') . ' ' . col . ' ' . fname . ' ' . tmpfname + let res = system(cmd) + let lines = split(res, '\n') + for line in lines + if res =~# ' error: ' && line !=# 'END' + call s:Warn(line) + elseif line =~# '^MATCH' + let linenum = split(line[6:], ',')[1] + let colnum = split(line[6:], ',')[2] + let fname = split(line[6:], ',')[3] + call s:RacerJumpToLocation(fname, linenum, colnum) + break + endif + endfor + call delete(tmpfname) +endfunction + +function! s:RacerGetBufferContents(base) + " Re-combine the completion base word from omnicomplete with the current + " line contents. Since the base word gets remove from the buffer before + " this function is invoked we have to put it back in to out tmpfile. + let col = col('.') - 1 + let buf_lines = getline(1, '$') + let line_contents = getline('.') + let buf_lines[line('.') - 1] = + \ strpart(line_contents, 0, col) . + \ a:base . + \ strpart(line_contents, col, len(line_contents)) + return buf_lines +endfunction + +function! s:RacerJumpToLocation(filename, linenum, colnum) + if a:filename == '' + return + endif + + " Record jump mark + normal! m` + if a:filename != bufname('%') + try + exec 'keepjumps e ' . fnameescape(a:filename) + catch /^Vim\%((\a\+)\)\=:E37/ + " When the buffer is not saved, E37 is thrown. We can ignore it. + endtry + endif + call cursor(a:linenum, a:colnum + 1) + " Center definition on screen + normal! zz +endfunction + +function! racer#RacerComplete(findstart, base) + if a:findstart + if s:ErrorCheck() + return -1 + endif + + return s:RacerGetPrefixCol(a:base) + else + if s:ErrorCheck() + return [] + endif + + if g:racer_experimental_completer == 1 + return s:RacerGetExpCompletions(a:base) + else + return s:RacerGetCompletions(a:base) + endif + endif +endfunction + +function! s:Warn(msg) + echohl WarningMsg | echomsg a:msg | echohl NONE +endfunction + +function! s:ErrorCheck() + if !executable(g:racer_cmd) + call s:Warn('No racer executable found in $PATH (' . $PATH . ')') + return 1 + endif +endfunction diff --git a/.vim/bundle/vim-racer/ftplugin/rust_racer.vim b/.vim/bundle/vim-racer/ftplugin/rust_racer.vim new file mode 100644 index 0000000..a76fc3b --- /dev/null +++ b/.vim/bundle/vim-racer/ftplugin/rust_racer.vim @@ -0,0 +1,44 @@ +let s:save_cpo = &cpo +set cpo&vim + +let s:is_win = has('win32') || has('win64') + +if !exists('g:racer_cmd') + let s:sep = s:is_win ? '\' : '/' + let s:path = join([ + \ escape(expand(':p:h'), '\'), + \ '..', + \ 'target', + \ 'release', + \ ], s:sep) + if isdirectory(s:path) + let s:pathsep = s:is_win ? ';' : ':' + let $PATH .= s:pathsep . s:path + endif + let g:racer_cmd = 'racer' +endif + +" Expand '~' and environment variables +let g:racer_cmd = expand(g:racer_cmd) + +if !exists('g:racer_experimental_completer') + let g:racer_experimental_completer = 0 +endif + +if !exists('g:racer_insert_paren') + let g:racer_insert_paren = 1 +endif + +nnoremap (rust-def) + \ :call racer#GoToDefinition() +nnoremap (rust-def-split) + \ :split:call racer#GoToDefinition() +nnoremap (rust-def-vertical) + \ :vsplit:call racer#GoToDefinition() +nnoremap (rust-doc) + \ :call racer#ShowDocumentation() + +setlocal omnifunc=racer#RacerComplete + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/.vim/bundle/vim-racer/rplugin/python3/deoplete/sources/racer.py b/.vim/bundle/vim-racer/rplugin/python3/deoplete/sources/racer.py new file mode 100644 index 0000000..f041530 --- /dev/null +++ b/.vim/bundle/vim-racer/rplugin/python3/deoplete/sources/racer.py @@ -0,0 +1,111 @@ +#============================================================================= +# FILE: racer.py +# AUTHOR: Shougo Matsushita +# License: MIT license {{{ +# 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 the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# }}} +#============================================================================= + +import re +import os +import subprocess +import tempfile +from .base import Base + +class Source(Base): + def __init__(self, vim): + Base.__init__(self, vim) + + self.name = 'racer' + self.mark = '[racer]' + self.filetypes = ['rust'] + self.input_pattern = r'(\.|::)\w*' + self.rank = 500 + + def on_init(self, context): + self.__executable_racer = self.vim.funcs.executable( + self.vim.eval('g:racer_cmd')) + self.__racer = self.vim.eval('g:racer_cmd') + + def get_complete_position(self, context): + if not self.__executable_racer: + return -1 + + m = re.search('\w*$', context['input']) + return m.start() if m else -1 + + + def gather_candidates(self, context): + typeMap = { + 'Struct': 's', 'Module': 'M', 'Function': 'f', + 'Crate': 'C', 'Let': 'v', 'StructField': 'm', + 'Impl': 'i', 'Enum': 'e', 'EnumVariant': 'E', + 'Type': 't', 'FnArg': 'v', 'Trait': 'T', + 'Const': 'c' + } + + candidates = [] + insert_paren = int(self.vim.eval('g:racer_insert_paren')) + for line in [l[6:] for l + in self.get_results(context, 'complete', + context['complete_position'] + 1) + if l.startswith('MATCH')]: + completions = line.split(',') + kind = typeMap.get(completions[4], '') + completion = { 'kind': kind, 'word': completions[0], 'dup': 1 } + if kind == 'f': # function + completion['menu'] = ','.join(completions[5:]).replace( + 'pub ', '').replace('fn ', '').rstrip('{') + if ' where ' in completion['menu'] or completion[ + 'menu'].endswith(' where') : + where = completion['menu'].rindex(' where') + completion['menu'] = completion['menu'][: where] + if insert_paren: + completion['abbr'] = completions[0] + completion['word'] += '(' + elif kind == 's' : # struct + completion['menu'] = ','.join(completions[5:]).replace( + 'pub ', '').replace( 'struct ', '').rstrip('{') + candidates.append(completion) + return candidates + + def get_results(self, context, command, col): + with tempfile.NamedTemporaryFile(mode='w') as tf: + tf.write("\n".join(self.vim.current.buffer)) + tf.flush() + + args = [ + self.__racer, command, + str(self.vim.funcs.line('.')), + str(col - 1), + tf.name + ] if command == 'prefix' else [ + self.__racer, command, + str(self.vim.funcs.line('.')), + str(col - 1), + self.vim.current.buffer.name, + tf.name + ] + try: + results = subprocess.check_output(args).decode( + context['encoding']).splitlines() + except subprocess.CalledProcessError: + return [] + return results diff --git a/.vim/bundle/vim-racer/syntax/rustdoc.vim b/.vim/bundle/vim-racer/syntax/rustdoc.vim new file mode 100644 index 0000000..d527c9b --- /dev/null +++ b/.vim/bundle/vim-racer/syntax/rustdoc.vim @@ -0,0 +1,178 @@ +" Vim syntax file +" Language: Rust Documentation (Markdown) +" Maintainer: Esteban Kuber +" Remark: Uses HTML and Rust syntax files. +" Based off plasticboy's Markdown Vim Mode: +" https://github.com/plasticboy/vim-markdown. +" TODO: Handle stuff contained within stuff (e.g. headings within blockquotes) + + +" Read the HTML syntax to start with +if version < 600 + so :p:h/html.vim +else + runtime! syntax/html.vim + + if exists('b:current_syntax') + unlet b:current_syntax + endif +endif + +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +" don't use standard HiLink, it will not work with included syntax files +if version < 508 + command! -nargs=+ HtmlHiLink hi link +else + command! -nargs=+ HtmlHiLink hi def link +endif + +syn spell toplevel +syn case ignore +syn sync linebreaks=1 + +let s:conceal = '' +let s:concealends = '' +if has('conceal') && get(g:, 'vim_markdown_conceal', 1) + let s:conceal = ' conceal' + let s:concealends = ' concealends' +endif + +" additions to HTML groups +if get(g:, 'vim_markdown_emphasis_multiline', 1) + let s:oneline = '' +else + let s:oneline = ' oneline' +endif +execute 'syn region htmlItalic start="\%(^\|\s\)\zs\*\ze[^\\\*\t ]\%(\%([^*]\|\\\*\|\n\)*[^\\\*\t ]\)\?\*\_W" end="[^\\\*\t ]\zs\*\ze\_W" keepend' . s:oneline +execute 'syn region htmlItalic start="\%(^\|\s\)\zs_\ze[^\\_\t ]" end="[^\\_\t ]\zs_\ze\_W" keepend' . s:oneline +execute 'syn region htmlBold start="\%(^\|\s\)\*\*\ze\S" end="\S\zs\*\*" keepend' . s:oneline +execute 'syn region htmlBold start="\%(^\|\s\)\zs__\ze\S" end="\S\zs__" keepend' . s:oneline +execute 'syn region htmlBoldItalic start="\%(^\|\s\)\zs\*\*\*\ze\S" end="\S\zs\*\*\*" keepend' . s:oneline +execute 'syn region htmlBoldItalic start="\%(^\|\s\)\zs___\ze\S" end="\S\zs___" keepend' . s:oneline + +" [link](URL) | [link][id] | [link][] | ![image](URL) +syn region mkdFootnotes matchgroup=mkdDelimiter start="\[^" end="\]" +execute 'syn region mkdID matchgroup=mkdDelimiter start="\[" end="\]" contained oneline' . s:conceal +execute 'syn region mkdURL matchgroup=mkdDelimiter start="(" end=")" contained oneline' . s:conceal +execute 'syn region mkdLink matchgroup=mkdDelimiter start="\\\@ ]*>" end=">" + +" Link definitions: [id]: URL (Optional Title) +syn region mkdLinkDef matchgroup=mkdDelimiter start="^ \{,3}\zs\[" end="]:" oneline nextgroup=mkdLinkDefTarget skipwhite +syn region mkdLinkDefTarget start="<\?\zs\S" excludenl end="\ze[>[:space:]\n]" contained nextgroup=mkdLinkTitle,mkdLinkDef skipwhite skipnl oneline +syn region mkdLinkTitle matchgroup=mkdDelimiter start=+"+ end=+"+ contained +syn region mkdLinkTitle matchgroup=mkdDelimiter start=+'+ end=+'+ contained +syn region mkdLinkTitle matchgroup=mkdDelimiter start=+(+ end=+)+ contained + +"HTML headings +syn region htmlH1 start="^\s*#" end="$" contains=@Spell +syn region htmlH2 start="^\s*##" end="$" contains=@Spell +syn region htmlH3 start="^\s*###" end="$" contains=@Spell +syn region htmlH4 start="^\s*####" end="$" contains=@Spell +syn region htmlH5 start="^\s*#####" end="$" contains=@Spell +syn region htmlH6 start="^\s*######" end="$" contains=@Spell +syn match htmlH1 /^.\+\n=\+$/ contains=@Spell +syn match htmlH2 /^.\+\n-\+$/ contains=@Spell + +"define Markdown groups +syn match mkdLineBreak / \+$/ +syn region mkdBlockquote start=/^\s*>/ end=/$/ contains=mkdLineBreak,@Spell +syn region mkdCode start=/\(\([^\\]\|^\)\\\)\@]*\\\@" end="" +syn region mkdCode start="]*\\\@" end="" +syn region mkdFootnote start="\[^" end="\]" +syn match mkdCode /^\s*\n\(\(\s\{8,}[^ ]\|\t\t\+[^\t]\).*\n\)\+/ +syn match mkdCode /\%^\(\(\s\{4,}[^ ]\|\t\+[^\t]\).*\n\)\+/ +syn match mkdCode /^\s*\n\(\(\s\{4,}[^ ]\|\t\+[^\t]\).*\n\)\+/ contained +syn match mkdListItem /^\s*\%([-*+]\|\d\+\.\)\s\+/ contained +syn region mkdListItemLine start="^\s*\%([-*+]\|\d\+\.\)\s\+" end="$" oneline contains=@mkdNonListItem,mkdListItem,@Spell +syn region mkdNonListItemBlock start="\(\%^\(\s*\([-*+]\|\d\+\.\)\s\+\)\@!\|\n\(\_^\_$\|\s\{4,}[^ ]\|\t+[^\t]\)\@!\)" end="^\(\s*\([-*+]\|\d\+\.\)\s\+\)\@=" contains=@mkdNonListItem,@Spell +syn match mkdRule /^\s*\*\s\{0,1}\*\s\{0,1}\*$/ +syn match mkdRule /^\s*-\s\{0,1}-\s\{0,1}-$/ +syn match mkdRule /^\s*_\s\{0,1}_\s\{0,1}_$/ +syn match mkdRule /^\s*-\{3,}$/ +syn match mkdRule /^\s*\*\{3,5}$/ + +" YAML frontmatter +if get(g:, 'vim_markdown_frontmatter', 0) + syn include @yamlTop syntax/yaml.vim + syn region Comment matchgroup=mkdDelimiter start="\%^---$" end="^---$" contains=@yamlTop keepend + unlet! b:current_syntax +endif + +if get(g:, 'vim_markdown_toml_frontmatter', 0) + try + syn include @tomlTop syntax/toml.vim + syn region Comment matchgroup=mkdDelimiter start="\%^+++$" end="^+++$" transparent contains=@tomlTop keepend + unlet! b:current_syntax + catch /E484/ + syn region Comment matchgroup=mkdDelimiter start="\%^+++$" end="^+++$" + endtry +endif + +if get(g:, 'vim_markdown_json_frontmatter', 0) + try + syn include @jsonTop syntax/json.vim + syn region Comment matchgroup=mkdDelimiter start="\%^{$" end="^}$" contains=@jsonTop keepend + unlet! b:current_syntax + catch /E484/ + syn region Comment matchgroup=mkdDelimiter start="\%^{$" end="^}$" + endtry +endif + +if get(g:, 'vim_markdown_math', 0) + syn include @tex syntax/tex.vim + syn region mkdMath start="\\\@ +" Version: 2.3 +" Last Change: Wednesday, February 20th, 2008 + +" License: +" Copyright (c) 2008 Meikel Brandmeyer, Frankfurt am Main +" All rights reserved. +" +" Redistribution and use in source and binary form are permitted provided +" that the following conditions are met: +" +" 1. Redistribition of source code must retain the above copyright +" notice, this list of conditions and the following disclaimer. +" +" 2. Redistributions in binary form must reproduce the above copyright +" notice, this list of conditions and the following disclaimer in the +" documentation and/or other materials provided with the distribution. +" +" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS "AS IS" AND +" ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE +" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +" SUCH DAMAGE. + +" Description: +" This is a (well... more or less) simple script to comment lines in a program. +" Currently supported languages are C, C++, PHP, the vim scripting +" language, python, HTML, Perl, LISP, Tex, Shell, CAOS and others. + +" Bugfixes: +" 2.3 +" Fixed type 'apacha' -> 'apache' (thanks to Brian Neu) +" Fixed nested comment escapes strings. (thanks to Samuel Ferencik) +" Fixed broken keyboard mappings when wcm was set to . +" (thanks to xpatriotx) +" 2.2 +" Fixed problem with UseSyntax (thanks to Pieter Naaijkens) +" Fixed typo in ParseCommentsOp (commstr -> commStr). +" Fixed support for ocaml (thanks to Zhang Le) +" 2.1 +" Fixed problems with alignement when a line contains tabs +" Fixed (resp. cleaned up) issues with overrideEL (thanks to Steve Hall) +" Fixed problems with javascript detection (thanks to Brian Neu) +" Changed Buffer init to BufWinEnter in order to use the modelines. +" 2.0 +" Fixed invalid expression '\'' -> "'" (thanks to Zak Beck) +" Setting AltOpen/AltClose to '' (ie. disabling it) would +" insert '/*' resp. '*/' for character in a line (thanks to Ben Kibbey) +" 1.8 +" Backslashes in comment symbols should not be escaped. +" typo (commensSymbol -> commentSymbol) (thanks to Steve Butts) +" typo (== -> =) +" Fixed hardwired '|+'-'+|' pair. +" 1.7 +" Lines were not correctly decommentified, when there was whitespace +" at the beginning of the line. (thanks to Xiangjiang Ma) +" Fixed error detecting '*sh' filetypes. +" 1.3 +" hlsearch was set unconditionally (thanks to Mary Ellen Foster) +" made function silent (thanks to Mare Ellen Foster) + +" Changelog: +" 2.3 +" Added support for viki/deplate (thanks to Thomas Link) +" Added support for xslt/xsd/mail (thanks to Stefano Zacchiroli) +" Added callback-functionality to enable extensions without the +" need of modification directly in the script. +" 2.2 +" Added possibility to override the modes, in which keybindings are +" defined. +" Keybindings may be defined local to every buffer now. +" If a filetype is unknown, one can turn off the keybindings now. +" 2.1 +" Removed any cursor movement. The script should now be free of +" side-effects. +" The script now uses &commentstring to determine the right +" comment strings. Fallback is still the ugly if-thingy. +" Script can now interpret &comments in order to add a middle +" string in blocks. +" Added EnhancedCommentifySet for use by other scripts. (Necessary?) +" Added MultiPartBlocks for languages with multipart-comments. +" Added parsing for comments option if using MultiPartBlocks. +" 2.0 +" IMPORTANT: EnhancedCommentify is now licensed under BSD license +" for distribution with Cream! However this shouldn't +" change anything... +" useBlockIndent does no longer depend on respectIndent. +" Added code to cope with 'C' in '&cpo'. (thanks to Luc Hermitte +" for pointing this out!) +" Added EnhCommentifyIdentFrontOnly option. +" All options are now handled on a per buffer basis. So options +" can be overriden for different buffers. +" 1.9 +" Filetype is now recognized via regular expressions. +" All known filetypes are (more or less) supported. +" Decomments multipart-block comments. +" Added RespectIndent, AlignRight and synID-guessing. +" Switched to buffer variables. +" 1.8 +" Added Ada support. (thanks to Preben Randhol) +" Added Latte support. +" Added blocksupport and possibility to specify action (comment or +" decomment). It's also possible to guess the action line by line or +" using the first line of a block. +" Thanks to Xiangjiang Ma and John Orr for the rich feedback on these +" issues. +" Decomments /*foo();*/, when PrettyComments is set. +" Added 'vhdl' and 'verilog'. (thanks to Steve Butts) +" 1.7 +" Added different options to control behaviour of the plugin. +" Changed default Keybindings to proper plugin settings. +" 1.6 +" Now supports 'm4', 'config', 'automake' +" 'vb', 'aspvbs', 'plsql' (thanks to Zak Beck) +" 1.5 +" Now supports 'java', 'xml', 'jproperties'. (thanks to Scott Stirling) +" 1.4 +" Lines containing only whitespace are now considered empty. +" Added Tcl support. +" Multipart comments are now escaped with configurable alternative +" strings. Prevents nesting errors (eg. /**/*/ in C) +" 1.3 +" Doesn't break lines like +" foo(); /* bar */ +" when doing commentify. + +" Install Details: +" Simply drop this file into your $HOME/.vim/plugin directory. + +if exists("DidEnhancedCommentify") + finish +endif +let DidEnhancedCommentify = 1 + +let s:savedCpo = &cpo +set cpo-=C + +" Note: These must be defined here, since they are used during +" initialisation. +" +" InitBooleanVariable(confVar, scriptVar, defaultVal) +" confVar -- name of the configuration variable +" scriptVar -- name of the variable to set +" defaultVal -- default value +" +" Tests on existence of configuration variable and sets scriptVar +" according to its contents. +" +function s:InitBooleanVariable(confVar, scriptVar, defaultVal) + let regex = a:defaultVal ? 'no*' : 'ye*s*' + + if exists(a:confVar) && {a:confVar} =~? regex + let {a:scriptVar} = !a:defaultVal + else + let {a:scriptVar} = a:defaultVal + endif +endfunction + +" +" InitStringVariable(confVar, scriptVar, defaultVal) +" confVar -- name of the configuration variable +" scriptVar -- name of the variable to set +" defaultVal -- default value +" +" Tests on existence of configuration variable and sets scriptVar +" to its contents. +" +function s:InitStringVariable(confVar, scriptVar, defaultVal) + if exists(a:confVar) + execute "let ". a:scriptVar ." = ". a:confVar + else + let {a:scriptVar} = a:defaultVal + endif +endfunction + +" +" InitScriptVariables(nameSpace) +" nameSpace -- may be "g" for global or "b" for local +" +" Initialises the script variables. +" +function s:InitScriptVariables(nameSpace) + let ns = a:nameSpace " just for abbreviation + let lns = (ns == "g") ? "s" : "b" " 'local namespace' + + " Comment escape strings... + call s:InitStringVariable(ns .":EnhCommentifyAltOpen", lns .":ECaltOpen", + \ s:ECaltOpen) + call s:InitStringVariable(ns .":EnhCommentifyAltClose", lns .":ECaltClose", + \ s:ECaltClose) + + call s:InitBooleanVariable(ns .":EnhCommentifyIgnoreWS", lns .":ECignoreWS", + \ s:ECignoreWS) + + " Adding a space between comment strings and code... + if exists(ns .":EnhCommentifyPretty") + if {ns}:EnhCommentifyPretty =~? 'ye*s*' + let {lns}:ECprettyComments = ' ' + let {lns}:ECprettyUnComments = ' \=' + else + let {lns}:ECprettyComments = '' + let {lns}:ECprettyUnComments = '' + endif + else + let {lns}:ECprettyComments = s:ECprettyComments + let {lns}:ECprettyUnComments = s:ECprettyUnComments + endif + + " Identification string settings... + call s:InitStringVariable(ns .":EnhCommentifyIdentString", + \ lns .":ECidentFront", s:ECidentFront) + let {lns}:ECidentBack = + \ (exists(ns .":EnhCommentifyIdentFrontOnly") + \ && {ns}:EnhCommentifyIdentFrontOnly =~? 'ye*s*') + \ ? '' + \ : {lns}:ECidentFront + + " Wether to use syntax items... + call s:InitBooleanVariable(ns .":EnhCommentifyUseSyntax", + \ lns .":ECuseSyntax", s:ECuseSyntax) + + " Should the script respect line indentation, when inserting strings? + call s:InitBooleanVariable(ns .":EnhCommentifyRespectIndent", + \ lns .":ECrespectIndent", s:ECrespectIndent) + + " Keybindings... + call s:InitBooleanVariable(ns .":EnhCommentifyUseAltKeys", + \ lns .":ECuseAltKeys", s:ECuseAltKeys) + call s:InitBooleanVariable(ns .":EnhCommentifyBindPerBuffer", + \ lns .":ECbindPerBuffer", s:ECbindPerBuffer) + call s:InitBooleanVariable(ns .":EnhCommentifyBindInNormal", + \ lns .":ECbindInNormal", s:ECbindInNormal) + call s:InitBooleanVariable(ns .":EnhCommentifyBindInInsert", + \ lns .":ECbindInInsert", s:ECbindInInsert) + call s:InitBooleanVariable(ns .":EnhCommentifyBindInVisual", + \ lns .":ECbindInVisual", s:ECbindInVisual) + call s:InitBooleanVariable(ns .":EnhCommentifyUserBindings", + \ lns .":ECuserBindings", s:ECuserBindings) + call s:InitBooleanVariable(ns .":EnhCommentifyTraditionalMode", + \ lns .":ECtraditionalMode", s:ECtraditionalMode) + call s:InitBooleanVariable(ns .":EnhCommentifyFirstLineMode", + \ lns .":ECfirstLineMode", s:ECfirstLineMode) + call s:InitBooleanVariable(ns .":EnhCommentifyUserMode", + \ lns .":ECuserMode", s:ECuserMode) + call s:InitBooleanVariable(ns .":EnhCommentifyBindUnknown", + \ lns .":ECbindUnknown", s:ECbindUnknown) + + " Block stuff... + call s:InitBooleanVariable(ns .":EnhCommentifyAlignRight", + \ lns .":ECalignRight", s:ECalignRight) + call s:InitBooleanVariable(ns .":EnhCommentifyUseBlockIndent", + \ lns .":ECuseBlockIndent", s:ECuseBlockIndent) + call s:InitBooleanVariable(ns .":EnhCommentifyMultiPartBlocks", + \ lns .":ECuseMPBlock", s:ECuseMPBlock) + call s:InitBooleanVariable(ns .":EnhCommentifyCommentsOp", + \ lns .":ECuseCommentsOp", s:ECuseCommentsOp) + + let {lns}:ECsaveWhite = ({lns}:ECrespectIndent + \ || {lns}:ECignoreWS || {lns}:ECuseBlockIndent) + \ ? '\(\s*\)' + \ : '' + + if !{lns}:ECrespectIndent + let {lns}:ECuseBlockIndent = 0 + endif + + if {lns}:ECrespectIndent + let {lns}:ECrespectWhite = '\1' + let {lns}:ECignoreWhite = '' + elseif {lns}:ECignoreWS + let {lns}:ECrespectWhite = '' + let {lns}:ECignoreWhite = '\1' + else + let {lns}:ECrespectWhite = '' + let {lns}:ECignoreWhite = '' + endif + + " Using comments option, doesn't make sense without useMPBlock + "if lns == 'b' && b:ECuseCommentsOp + " let b:ECuseMPBlock = 1 + "endif +endfunction + +" +" EnhancedCommentifySet(option, value, ...) +" option -- which option +" value -- value which will be asigned to the option +" +" The purpose of this function is mainly to act as an interface to the +" outer world. It hides the internally used variables. +" +function EnhancedCommentifySet(option, value) + if a:option == 'AltOpen' + let oldval = b:ECaltOpen + let b:ECaltOpen = a:value + elseif a:option == 'AltClose' + let oldval = b:ECaltClose + let b:ECaltClose = a:value + elseif a:option == 'IdentString' + let oldval = b:ECidentFront + let b:ECidentFront = a:value + elseif a:option == 'IdentFrontOnly' + let oldval = (b:ECidentBack == '') ? 'Yes' : 'No' + let b:ECidentBack = (a:value =~? 'ye*s*') ? '' : b:ECidentFront + elseif a:option == 'RespectIndent' + let oldval = b:ECrespectIndent + let b:ECrespectIndent = (a:value =~? 'ye*s*') ? 1 : 0 + elseif a:option == 'IgnoreWS' + let oldval = b:ECignoreWS + let b:ECignoreWS = (a:value =~? 'ye*s*') ? 1 : 0 + elseif a:option == 'Pretty' + let oldval = (b:ECprettyComments == ' ') ? 'Yes' : 'No' + if a:value =~? 'ye*s*' + let b:ECprettyComments = ' ' + let b:ECprettyUnComments = ' \=' + else + let b:ECprettyComments = '' + let b:ECprettyUnComments = '' + endif + elseif a:option == 'MultiPartBlocks' + let oldval = b:ECuseMPBlock + let b:ECuseMPBlock = (a:value =~? 'ye*s*') ? 1 : 0 + elseif a:option == 'CommentsOp' + let oldval = b:ECuseCommentsOp + let b:ECuseCommentsOp = (a:value =~? 'ye*s*') ? 1 : 0 + elseif a:option == 'UseBlockIndent' + let oldval = b:ECuseBlockIndent + let b:ECuseBlockIndent = (a:value =~? 'ye*s*') ? 1 : 0 + elseif a:option == 'AlignRight' + let oldval = b:ECalignRight + let b:ECalignRight = (a:value =~? 'ye*s*') ? 1 : 0 + elseif a:option == 'UseSyntax' + let oldval = b:ECuseSyntax + let b:ECuseSyntax = (a:value =~? 'ye*s*') ? 1 : 0 + else + if (has("dialog_gui") && has("gui_running")) + call confirm("EnhancedCommentifySet: Unknwon option '" + \ . option . "'") + else + echohl ErrorMsg + echo "EnhancedCommentifySet: Unknown option '". option ."'" + echohl None + endif + endif + + if oldval == 1 + let oldval = 'Yes' + elseif oldval == 0 + let oldval = 'No' + endif + + return oldval +endfunction + +" Initial settings. +" +" Setting the default options resp. taking user preferences. +if !exists("g:EnhCommentifyUserMode") + \ && !exists("g:EnhCommentifyFirstLineMode") + \ && !exists("g:EnhCommentifyTraditionalMode") + \ && !exists("g:EnhCommentifyUserBindings") + let g:EnhCommentifyTraditionalMode = 'Yes' +endif + +" These will be the default settings for the script: +let s:ECaltOpen = "|+" +let s:ECaltClose = "+|" +let s:ECignoreWS = 1 +let s:ECprettyComments = '' +let s:ECprettyUnComments = '' +let s:ECidentFront = '' +let s:ECuseSyntax = 0 +let s:ECrespectIndent = 0 +let s:ECalignRight = 0 +let s:ECuseBlockIndent = 0 +let s:ECuseMPBlock = 0 +let s:ECuseCommentsOp = 0 +let s:ECuseAltKeys = 0 +let s:ECbindPerBuffer = 0 +let s:ECbindInNormal = 1 +let s:ECbindInInsert = 1 +let s:ECbindInVisual = 1 +let s:ECuserBindings = 0 +let s:ECtraditionalMode = 0 +let s:ECfirstLineMode = 0 +let s:ECuserMode = 1 +let s:ECbindUnknown = 1 + +" Now initialise the global defaults with the preferences set +" by the user in his .vimrc. Settings local to a buffer will be +" done later on, when the script is first called in a buffer. +" +call s:InitScriptVariables("g") + +" Globally used variables with some initialisation. +" FIXME: explain what they are good for +" +let s:Action = 'guess' +let s:firstOfBlock = 1 +let s:blockAction = 'comment' +let s:blockIndentRegex = '' +let s:blockIndent = 0 +let s:inBlock = 0 +let s:tabConvert = '' +let s:overrideEmptyLines = 0 +let s:emptyLines = 'no' +let s:maxLen = 0 + +function EnhancedCommentifyInitBuffer() + if !exists("b:ECdidBufferInit") + call s:InitScriptVariables("b") + + if !exists("b:EnhCommentifyFallbackTest") + let b:EnhCommentifyFallbackTest = 0 + endif + + call s:GetFileTypeSettings(&ft) + call s:CheckPossibleEmbedding(&ft) + + " + " If the filetype is not supported and the user wants us to, we do not + " add keybindings. + " + if s:ECbindPerBuffer + if b:ECcommentOpen != "" || b:ECbindUnknown + call s:SetKeybindings("l") + endif + endif + + let b:ECdidBufferInit = 1 + let b:ECsyntax = &ft + endif +endfunction + +autocmd BufWinEnter,BufNewFile * call EnhancedCommentifyInitBuffer() + +" +" EnhancedCommentify(emptyLines, action, ...) +" overrideEL -- commentify empty lines +" may be 'yes', 'no' or '' for guessing +" action -- action which should be executed: +" * guess: +" toggle commetification (old behaviour) +" * comment: +" comment lines +" * decomment: +" decomment lines +" * first: +" use first line of block to determine action +" a:1, a:2 -- first and last line of block, which should be +" processed. +" +" Commentifies the current line. +" +function EnhancedCommentify(overrideEL, action, ...) + if a:overrideEL != '' + let s:overrideEmptyLines = 1 + endif + + " Now do the buffer initialisation. Every buffer will get + " it's pendant to a global variable (eg. s:ECalignRight -> b:ECalignRight). + " The local variable is actually used, whereas the global variable + " holds the defaults from the user's .vimrc. In this way the settings + " can be overriden for single buffers. + " + " NOTE: Buffer init is done by autocommands now. + " + + let b:ECemptyLines = a:overrideEL + + " The language is not supported. + if b:ECcommentOpen == '' + if (has("dialog_gui") && has("gui_running")) + call confirm("This filetype is currently _not_ supported!\n" + \ ."Please consider contacting the author in order" + \ ." to add this filetype.", "", 1, "Error") + else + echohl ErrorMsg + echo "This filetype is currently _not_ supported!" + echo "Please consider contacting the author in order to add" + echo "this filetype in future releases!" + echohl None + endif + return + endif + + let lnum = line(".") + + " Now some initialisations... + let s:Action = a:action + + " FIXME: Is there really _no_ function to simplify this??? + " (Maybe something like 'let foo = 8x" "'?) + if s:tabConvert == '' && strlen(s:tabConvert) != &tabstop + let s:tabConvert = '' + let i = 0 + while i < &tabstop + let s:tabConvert = s:tabConvert .' ' + let i = i + 1 + endwhile + endif + + if a:0 == 2 + let s:startBlock = a:1 + let s:i = a:1 + let s:endBlock = a:2 + + let s:inBlock = 1 + else + let s:startBlock = lnum + let s:i = lnum + let s:endBlock = lnum + + let s:inBlock = 0 + endif + + if b:ECuseSyntax && b:ECpossibleEmbedding + let column = indent(s:startBlock) + 1 + if !&expandtab + let rem = column % &tabstop + let column = ((column - rem) / &tabstop) + rem + endif + call s:CheckSyntax(s:startBlock, column) + endif + + " Get the indent of the less indented line of the block. + if s:inBlock && (b:ECuseBlockIndent || b:ECalignRight) + call s:DoBlockComputations(s:startBlock, s:endBlock) + endif + + while s:i <= s:endBlock + let lineString = getline(s:i) + let lineString = s:TabsToSpaces(lineString) + + " If we should comment "empty" lines, we have to add + " the correct indent, if we use blockIndent. + if b:ECemptyLines =~? 'ye*s*' + \ && b:ECuseBlockIndent + \ && lineString =~ "^\s*$" + let i = 0 + while i < s:blockIndent + let lineString = " " . lineString + let i = i + 1 + endwhile + endif + + " Don't comment empty lines. + if lineString !~ "^\s*$" + \ || b:ECemptyLines =~? 'ye*s*' + if b:ECcommentClose != '' + let lineString = s:CommentifyMultiPart(lineString, + \ b:ECcommentOpen, + \ b:ECcommentClose, + \ b:ECcommentMiddle) + else + let lineString = s:CommentifySinglePart(lineString, + \ b:ECcommentOpen) + endif + endif + + " Revert the above: If the line is "empty" and we + " used blockIndent, we remove the spaces. + " FIXME: Why does "^\s*$" not work? + if b:ECemptyLines =~? 'ye*s*' + \ && b:ECuseBlockIndent + \ && lineString =~ "^" . s:blockIndentRegex ."\s*$" + let lineString = + \ substitute(lineString, s:blockIndentRegex, + \ '', '') + endif + + let lineString = s:SpacesToTabs(lineString) + call setline(s:i, lineString) + + let s:i = s:i + 1 + let s:firstOfBlock = 0 + endwhile + + let s:firstOfBlock = 1 +endfunction + +" +" DoBlockComputations(start, end) +" start -- number of first line +" end -- number of last line +" +" This function does some computations which are necessary for useBlockIndent +" and alignRight. ie. find smallest indent and longest line. +" +function s:DoBlockComputations(start, end) + let i = a:start + let len = 0 + let amount = 100000 " this should be enough ... + + while i <= a:end + if b:ECuseBlockIndent && getline(i) !~ '^\s*$' + let cur = indent(i) + if cur < amount + let amount = cur + endif + endif + + if b:ECalignRight + let cur = s:GetLineLen(s:TabsToSpaces(getline(i)), + \ s:GetLineLen(b:ECcommentOpen, 0) + \ + strlen(b:ECprettyComments)) + if b:ECuseMPBlock + let cur = cur + s:GetLineLen(b:ECcommentOpen, 0) + \ + strlen(b:ECprettyComments) + endif + + if len < cur + let len = cur + endif + endif + + let i = i + 1 + endwhile + + if b:ECuseBlockIndent + if amount > 0 + let regex = '\( \{'. amount .'}\)' + else + let regex = '' + endif + let s:blockIndentRegex = regex + let s:blockIndent = amount + endif + + if b:ECalignRight + let s:maxLen = len + endif +endfunction + +" +" CheckSyntax(line, column) +" line -- line of line +" column -- column of line +" Check what syntax is active during call of main function. First hit +" wins. If the filetype changes during the block, we ignore that. +" Adjust the filetype if necessary. +" +function s:CheckSyntax(line, column) + let ft = "" + let synFiletype = synIDattr(synID(a:line, a:column, 1), "name") + + " FIXME: This feature currently relies on a certain format + " of the names of syntax items: the filetype must be prepended + " in lowwer case letters, followed by at least one upper case + " letter. + if match(synFiletype, '\l\+\u') == 0 + let ft = substitute(synFiletype, '^\(\l\+\)\u.*$', '\1', "") + endif + + if ft == "" + execute "let specialCase = ". b:EnhCommentifyFallbackTest + + if specialCase + let ft = b:EnhCommentifyFallbackValue + else + " Fallback: If nothing holds, use normal filetype! + let ft = &ft + endif + endif + + " Nothing changed! + if ft == b:ECsyntax + return + endif + + let b:ECsyntax = ft + call s:GetFileTypeSettings(ft) +endfunction + +" +" GetFileTypeSettings(ft) +" ft -- filetype +" +" This functions sets some buffer-variables, which control the comment +" strings and 'empty lines'-handling. +" +function s:GetFileTypeSettings(ft) + let fileType = a:ft + + " If we find nothing appropriate this is the default. + let b:ECcommentOpen = '' + let b:ECcommentClose = '' + + if exists("g:EnhCommentifyCallbackExists") + call EnhCommentifyCallback(fileType) + + " Check whether the callback did yield a result. + " If so we use it. The user nows, what he's doing. + if b:ECcommentOpen != '' + return + endif + endif + + " I learned about the commentstring option. Let's use it. + " For now we ignore it, if it is "/*%s*/". This is the + " default. We cannot check wether this is default or C or + " something other like CSS, etc. We have to wait, until the + " filetypes adopt this option. + if &commentstring != "/*%s*/" && !b:ECuseSyntax + let b:ECcommentOpen = + \ substitute(&commentstring, '%s.*', "", "") + let b:ECcommentClose = + \ substitute(&commentstring, '.*%s', "", "") + " Multipart comments: + elseif fileType =~ '^\(c\|b\|css\|csc\|cupl\|indent\|jam\|lex\|lifelines\|'. + \ 'lite\|nqc\|phtml\|progress\|rexx\|rpl\|sas\|sdl\|sl\|'. + \ 'strace\|xpm\|yacc\)$' + let b:ECcommentOpen = '/*' + let b:ECcommentClose = '*/' + elseif fileType =~ '^\(html\|xhtml\|xml\|xslt\|xsd\|dtd\|sgmllnx\)$' + let b:ECcommentOpen = '' + elseif fileType =~ '^\(sgml\|smil\)$' + let b:ECcommentOpen = '' + elseif fileType == 'atlas' + let b:ECcommentOpen = 'C' + let b:ECcommentClose = '$' + elseif fileType =~ '^\(catalog\|sgmldecl\)$' + let b:ECcommentOpen = '--' + let b:ECcommentClose = '--' + elseif fileType == 'dtml' + let b:ECcommentOpen = '' + let b:ECcommentClose = '' + elseif fileType == 'htmlos' + let b:ECcommentOpen = '#' + let b:ECcommentClose = '/#' + elseif fileType =~ '^\(jgraph\|lotos\|mma\|modula2\|modula3\|pascal\|'. + \ 'ocaml\|sml\)$' + let b:ECcommentOpen = '(*' + let b:ECcommentClose = '*)' + elseif fileType == 'jsp' + let b:ECcommentOpen = '<%--' + let b:ECcommentClose = '--%>' + elseif fileType == 'model' + let b:ECcommentOpen = '$' + let b:ECcommentClose = '$' + elseif fileType == 'st' + let b:ECcommentOpen = '"' + let b:ECcommentClose = '"' + elseif fileType =~ '^\(tssgm\|tssop\)$' + let b:ECcommentOpen = 'comment = "' + let b:ECcommentClose = '"' + " Singlepart comments: + elseif fileType =~ '^\(ox\|cpp\|php\|java\|verilog\|acedb\|ch\|clean\|'. + \ 'clipper\|cs\|dot\|dylan\|hercules\|idl\|ishd\|javascript\|'. + \ 'kscript\|mel\|named\|openroad\|pccts\|pfmain\|pike\|'. + \ 'pilrc\|plm\|pov\|rc\|scilab\|specman\|tads\|tsalt\|uc\|'. + \ 'xkb\)$' + let b:ECcommentOpen = '//' + let b:ECcommentClose = '' + elseif fileType =~ '^\(vim\|abel\)$' + let b:ECcommentOpen = '"' + let b:ECcommentClose = '' + elseif fileType =~ '^\(lisp\|scheme\|scsh\|amiga\|asm\|asm68k\|bindzone\|'. + \ 'def\|dns\|dosini\|dracula\|dsl\|idlang\|iss\|jess\|kix\|'. + \ 'masm\|monk\|nasm\|ncf\|omnimark\|pic\|povini\|rebol\|'. + \ 'registry\|samba\|skill\|smith\|tags\|tasm\|tf\|winbatch\|'. + \ 'wvdial\|z8a\)$' + let b:ECcommentOpen = ';' + let b:ECcommentClose = '' + elseif fileType =~ '^\(python\|perl\|[^w]*sh$\|tcl\|jproperties\|make\|'. + \ 'robots\|apache\|apachestyle\|awk\|bc\|cfg\|cl\|conf\|'. + \ 'crontab\|diff\|ecd\|elmfilt\|eterm\|expect\|exports\|'. + \ 'fgl\|fvwm\|gdb\|gnuplot\|gtkrc\|hb\|hog\|ia64\|icon\|'. + \ 'inittab\|lftp\|lilo\|lout\|lss\|lynx\|maple\|mush\|'. + \ 'muttrc\|nsis\|ora\|pcap\|pine\|po\|procmail\|'. + \ 'psf\|ptcap\|r\|radiance\|ratpoison\|readline\remind\|'. + \ 'ruby\|screen\|sed\|sm\|snnsnet\|snnspat\|snnsres\|spec\|'. + \ 'squid\|terminfo\|tidy\|tli\|tsscl\|vgrindefs\|vrml\|'. + \ 'wget\|wml\|xf86conf\|xmath\)$' + let b:ECcommentOpen = '#' + let b:ECcommentClose = '' + elseif fileType == 'webmacro' + let b:ECcommentOpen = '##' + let b:ECcommentClose = '' + elseif fileType == 'ppwiz' + let b:ECcommentOpen = ';;' + let b:ECcommentClose = '' + elseif fileType == 'latte' + let b:ECcommentOpen = '\\;' + let b:ECcommentClose = '' + elseif fileType =~ '^\(tex\|abc\|erlang\|ist\|lprolog\|matlab\|mf\|'. + \ 'postscr\|ppd\|prolog\|simula\|slang\|slrnrc\|slrnsc\|'. + \ 'texmf\|viki\|virata\)$' + let b:ECcommentOpen = '%' + let b:ECcommentClose = '' + elseif fileType =~ '^\(caos\|cterm\|form\|foxpro\|sicad\|snobol4\)$' + let b:ECcommentOpen = '*' + let b:ECcommentClose = '' + elseif fileType =~ '^\(m4\|config\|automake\)$' + let b:ECcommentOpen = 'dnl ' + let b:ECcommentClose = '' + elseif fileType =~ '^\(vb\|aspvbs\|ave\|basic\|elf\|lscript\)$' + let b:ECcommentOpen = "'" + let b:ECcommentClose = '' + elseif fileType =~ '^\(plsql\|vhdl\|ahdl\|ada\|asn\|csp\|eiffel\|gdmo\|'. + \ 'haskell\|lace\|lua\|mib\|sather\|sql\|sqlforms\|sqlj\|'. + \ 'stp\)$' + let b:ECcommentOpen = '--' + let b:ECcommentClose = '' + elseif fileType == 'abaqus' + let b:ECcommentOpen = '**' + let b:ECcommentClose = '' + elseif fileType =~ '^\(aml\|natural\|vsejcl\)$' + let b:ECcommentOpen = '/*' + let b:ECcommentClose = '' + elseif fileType == 'ampl' + let b:ECcommentOpen = '\\#' + let b:ECcommentClose = '' + elseif fileType == 'bdf' + let b:ECcommentOpen = 'COMMENT ' + let b:ECcommentClose = '' + elseif fileType == 'btm' + let b:ECcommentOpen = '::' + let b:ECcommentClose = '' + elseif fileType == 'dcl' + let b:ECcommentOpen = '$!' + let b:ECcommentClose = '' + elseif fileType == 'dosbatch' + let b:ECcommentOpen = 'rem ' + let b:ECcommentClose = '' + elseif fileType == 'focexec' + let b:ECcommentOpen = '-*' + let b:ECcommentClose = '' + elseif fileType == 'forth' + let b:ECcommentOpen = '\\ ' + let b:ECcommentClose = '' + elseif fileType =~ '^\(fortran\|inform\|sqr\|uil\|xdefaults\|'. + \ 'xmodmap\|xpm2\)$' + let b:ECcommentOpen = '!' + let b:ECcommentClose = '' + elseif fileType == 'gp' + let b:ECcommentOpen = '\\\\' + let b:ECcommentClose = '' + elseif fileType =~ '^\(master\|nastran\|sinda\|spice\|tak\|trasys\)$' + let b:ECcommentOpen = '$' + let b:ECcommentClose = '' + elseif fileType == 'nroff' || fileType == 'groff' + let b:ECcommentOpen = ".\\\\\"" + let b:ECcommentClose = '' + elseif fileType == 'opl' + let b:ECcommentOpen = 'REM ' + let b:ECcommentClose = '' + elseif fileType == 'texinfo' + let b:ECcommentOpen = '@c ' + let b:ECcommentClose = '' + elseif fileType == 'mail' + let b:ECcommentOpen = '>' + let b:ECcommentClose = '' + endif + + if b:ECuseCommentsOp + let b:ECcommentMiddle = + \ s:ParseCommentsOp(b:ECcommentOpen, b:ECcommentClose) + if b:ECcommentMiddle == '' + let b:ECuseCommentsOp = 0 + endif + else + let b:ECcommentMiddle = '' + endif + + if !s:overrideEmptyLines + call s:CommentEmptyLines(fileType) + endif +endfunction + +" +" ParseCommentsOp(commentOpen, commentClose) +" commentOpen -- comment-open string +" commentClose-- comment-close string +" +" Try to extract the middle comment string from &comments. First hit wins. +" If nothing is found '' is returned. +" +function s:ParseCommentsOp(commentOpen, commentClose) + let commStr = &comments + let offset = 0 + let commentMiddle = '' + + while commStr != '' + " + " First decompose &omments into consecutive s-, m- and e-parts. + " + let s = stridx(commStr, 's') + if s == -1 + return '' + endif + + let commStr = strpart(commStr, s) + let comma = stridx(commStr, ',') + if comma == -1 + return '' + endif + let sPart = strpart(commStr, 0, comma) + + let commStr = strpart(commStr, comma) + let m = stridx(commStr, 'm') + if m == -1 + return '' + endif + + let commStr = strpart(commStr, m) + let comma = stridx(commStr, ',') + if comma == -1 + return '' + endif + let mPart = strpart(commStr, 0, comma) + + let commStr = strpart(commStr, comma) + let e = stridx(commStr, 'e') + if e == -1 + return '' + endif + + let commStr = strpart(commStr, e) + let comma = stridx(commStr, ',') + if comma == -1 + let comma = strlen(commStr) + endif + let ePart = strpart(commStr, 0, comma) + + let commStr = strpart(commStr, comma) + + " + " Now check wether this is what we want: + " Are the comment string the same? + " + let sColon = stridx(sPart, ':') + let eColon = stridx(ePart, ':') + if sColon == -1 || eColon == -1 + return '' + endif + if strpart(sPart, sColon + 1) != a:commentOpen + \ || strpart(ePart, eColon + 1) != a:commentClose + continue + endif + + let mColon = stridx(mPart, ':') + if mColon == -1 + return '' + endif + let commentMiddle = strpart(mPart, mColon + 1) + + " + " Check for any alignement. + " + let i = 1 + while sPart[i] != ':' + if sPart[i] == 'r' + let offset = strlen(a:commentOpen) - strlen(commentMiddle) + break + elseif sPart[i] == 'l' + let offset = 0 + break + elseif s:isDigit(sPart[i]) + let j = 1 + while s:isDigit(sPart[i + j]) + let j = j + 1 + endwhile + let offset = 1 * strpart(sPart, i, j) + break + endif + let i = i + 1 + endwhile + + if offset == 0 + let i = 1 + while ePart[i] != ':' + if ePart[i] == 'r' + let offset = strlen(a:commentClose) - strlen(commentMiddle) + break + elseif ePart[i] == 'l' + let offset = 0 + break + elseif s:isDigit(ePart[i]) + let j = 1 + while s:isDigit(ePart[i + j]) + let j = j + 1 + endwhile + let offset = 1 * strpart(ePart, i, j) + break + endif + + let i = i + 1 + endwhile + endif + + while offset > 0 + let commentMiddle = " " . commentMiddle + let offset = offset - 1 + endwhile + + break + endwhile + + return commentMiddle +endfunction + +" +" isDigit(char) +" +" Nomen est Omen. +" +function s:isDigit(char) + let r = 0 + + let charVal = char2nr(a:char) + + if charVal >= 48 && charVal <= 57 + let r = 1 + endif + + return r +endfunction + +" +" CommentEmptyLines(ft) +" ft -- filetype of current buffer +" +" Decides, if empty lines should be commentified or not. Add the filetype, +" you want to change, to the apropriate if-clause. +" +function s:CommentEmptyLines(ft) + " FIXME: Quick hack (tm)! + if 0 + " Add special filetypes here. + elseif b:ECcommentClose == '' + let b:ECemptyLines = 'yes' + else + let b:ECemptyLines = 'no' + endif +endfunction + +" +" CheckPossibleEmbedding(ft) +" ft -- the filetype of current buffer +" +" Check wether it makes sense to allow checking for the synIDs. +" Eg. C will never have embedded code... +" +function s:CheckPossibleEmbedding(ft) + if a:ft =~ '^\(php\|vim\|latte\|html\)$' + let b:ECpossibleEmbedding = 1 + else + " Since getting the synID is slow, we set the default to 'no'! + " There are also some 'broken' languages like the filetype for + " autoconf's configure.in's ('config'). + let b:ECpossibleEmbedding = 0 + endif +endfunction + +" +" CommentifyMultiPart(lineString, commentStart, commentEnd, action) +" lineString -- line to commentify +" commentStart -- comment-start string, eg '/*' +" commentEnd -- comment-end string, eg. '*/' +" commentMiddle -- comment-middle string, eg. ' *' +" +" This function commentifies code of languages, which have multipart +" comment strings, eg. '/*' - '*/' of C. +" +function s:CommentifyMultiPart(lineString, commentStart, + \ commentEnd, commentMiddle) + if s:Action == 'guess' || s:Action == 'first' || b:ECuseMPBlock + let todo = s:DecideWhatToDo(a:lineString, a:commentStart, a:commentEnd) + else + let todo = s:Action + endif + + if todo == 'decomment' + return s:UnCommentify(a:lineString, a:commentStart, + \ a:commentEnd, a:commentMiddle) + else + return s:Commentify(a:lineString, a:commentStart, + \ a:commentEnd, a:commentMiddle) + endif +endfunction + +" +" CommentifySinglePart(lineString, commentSymbol) +" lineString -- line to commentify +" commentSymbol -- comment string, eg '#' +" +" This function is used for all languages, whose comment strings +" consist only of one string at the beginning of a line. +" +function s:CommentifySinglePart(lineString, commentSymbol) + if s:Action == 'guess' || s:Action == 'first' + let todo = s:DecideWhatToDo(a:lineString, a:commentSymbol) + else + let todo = s:Action + endif + + if todo == 'decomment' + return s:UnCommentify(a:lineString, a:commentSymbol) + else + return s:Commentify(a:lineString, a:commentSymbol) + endif +endfunction + +" +" Escape(lineString, commentStart, commentEnd) +" +" Escape already present symbols. +" +function s:Escape(lineString, commentStart, commentEnd) + let line = a:lineString + + if b:ECaltOpen != '' + let line = substitute(line, s:EscapeString(a:commentStart), + \ b:ECaltOpen, "g") + endif + if b:ECaltClose != '' + let line = substitute(line, s:EscapeString(a:commentEnd), + \ b:ECaltClose, "g") + endif + + return line +endfunction + +" +" UnEscape(lineString, commentStart, commentEnd) +" +" Unescape already present escape symbols. +" +function s:UnEscape(lineString, commentStart, commentEnd) + let line = a:lineString + + " We translate only the first and the last occurrence + " of this resp. escape string. Commenting a line several + " times and decommenting it again breaks things. + if b:ECaltOpen != '' + let line = substitute(line, s:EscapeString(b:ECaltOpen), + \ a:commentStart, "") + endif + if b:ECaltClose != '' + let esAltClose = s:EscapeString(b:ECaltClose) + let line = substitute(line, esAltClose + \ . "\\(.*" . esAltClose . "\\)\\@!", + \ a:commentEnd, "") + endif + + return line +endfunction + +" +" Commentify(lineString, commentSymbol, [commentEnd]) +" lineString -- the line in work +" commentSymbol -- string to insert at the beginning of the line +" commentEnd -- string to insert at the end of the line +" may be omitted +" +" This function inserts the start- (and if given the end-) string of the +" comment in the current line. +" +function s:Commentify(lineString, commentSymbol, ...) + let line = a:lineString + let j = 0 + + " If a end string is present, insert it too. + if a:0 > 0 + " First we have to escape any comment already contained in the line, + " since (at least for C) comments are not allowed to nest. + let line = s:Escape(line, a:commentSymbol, a:1) + + if b:ECuseCommentsOp && b:ECuseMPBlock + \ && a:0 > 1 + \ && s:i > s:startBlock + let line = substitute(line, s:LookFor('commentmiddle'), + \ s:SubstituteWith('commentmiddle', a:2), "") + endif + + if !b:ECuseMPBlock || (b:ECuseMPBlock && s:i == s:endBlock) + " Align the closing part to the right. + if b:ECalignRight && s:inBlock + let len = s:GetLineLen(line, strlen(a:commentSymbol) + \ + strlen(b:ECprettyComments)) + while j < s:maxLen - len + let line = line .' ' + let j = j + 1 + endwhile + endif + + let line = substitute(line, s:LookFor('commentend'), + \ s:SubstituteWith('commentend', a:1), "") + endif + endif + + " insert the comment symbol + if !b:ECuseMPBlock || a:0 == 0 || (b:ECuseMPBlock && s:i == s:startBlock) + let line = substitute(line, s:LookFor('commentstart'), + \ s:SubstituteWith('commentstart', a:commentSymbol), "") + endif + + return line +endfunction + +" +" UnCommentify(lineString, commentSymbol, [commentEnd]) +" lineString -- the line in work +" commentSymbol -- string to remove at the beginning of the line +" commentEnd -- string to remove at the end of the line +" may be omitted +" +" This function removes the start- (and if given the end-) string of the +" comment in the current line. +" +function s:UnCommentify(lineString, commentSymbol, ...) + let line = a:lineString + + " remove the first comment symbol found on a line + if a:0 == 0 || !b:ECuseMPBlock || (b:ECuseMPBlock && s:i == s:startBlock) + let line = substitute(line, s:LookFor('decommentstart', + \ a:commentSymbol), + \ s:SubstituteWith('decommentstart'), "") + endif + + " If a end string is present, we have to remove it, too. + if a:0 > 0 + " First, we remove the trailing comment symbol. + if !b:ECuseMPBlock || (b:ECuseMPBlock && s:i == s:endBlock) + let line = substitute(line, s:LookFor('decommentend', a:1), + \ s:SubstituteWith('decommentend'), "") + + " Remove any trailing whitespace, if we used alignRight. + if b:ECalignRight + let line = substitute(line, ' *$', '', "") + endif + endif + + " Maybe we added a middle string. Remove it here. + if b:ECuseCommentsOp && b:ECuseMPBlock + \ && a:0 > 1 + \ && s:i > s:startBlock + let line = substitute(line, s:LookFor('decommentmiddle', a:2), + \ s:SubstituteWith('decommentmiddle'), "") + endif + + " Remove escaped inner comments. + let line = s:UnEscape(line, a:commentSymbol, a:1) + endif + + return line +endfunction + +" +" GetLineLen(line, offset) +" line -- line of which length should be computed +" offset -- maybe a shift of the line to the right +" +" Expands '\t' to it's tabstop value. +" +function s:GetLineLen(line, offset) + let len = a:offset + let i = 0 + + while a:line[i] != "" + if a:line[i] == "\t" + let len = (((len / &tabstop) + 1) * &tabstop) + else + let len = len + 1 + endif + let i = i + 1 + endwhile + + return len +endfunction + +" +" EscapeString(string) +" string -- string to process +" +" Escapes characters in 'string', which have some function in +" regular expressions, with a '\'. +" +" Returns the escaped string. +" +function s:EscapeString(string) + return escape(a:string, "*{}[]$^-") +endfunction + +" +" LookFor(what, ...) +" what -- what type of regular expression +" * checkstart: +" * checkend: +" check for comment at start/end of line +" * commentstart: +" * commentend: +" insert comment strings +" * decommentstart: +" * decommentend: +" remove comment strings +" a:1 -- comment string +" +function s:LookFor(what, ...) + if b:ECuseBlockIndent && s:inBlock + let handleWhitespace = s:blockIndentRegex + else + let handleWhitespace = b:ECsaveWhite + endif + + if a:what == 'checkstart' + let regex = '^'. b:ECsaveWhite . s:EscapeString(a:1) + \ . s:EscapeString(b:ECidentFront) + elseif a:what == 'checkend' + let regex = s:EscapeString(b:ECidentBack) + \ . s:EscapeString(a:1) . b:ECsaveWhite . '$' + elseif a:what == 'commentstart' + let regex = '^'. handleWhitespace + elseif a:what == 'commentmiddle' + let regex = '^'. handleWhitespace + elseif a:what == 'commentend' + let regex = '$' + elseif a:what == 'decommentstart' + let regex = '^'. b:ECsaveWhite . s:EscapeString(a:1) + \ . s:EscapeString(b:ECidentFront) . b:ECprettyUnComments + elseif a:what == 'decommentmiddle' + let regex = '^'. b:ECsaveWhite . s:EscapeString(a:1) + \ . s:EscapeString(b:ECidentFront) . b:ECprettyUnComments + elseif a:what == 'decommentend' + let regex = b:ECprettyUnComments . s:EscapeString(b:ECidentBack) + \ . s:EscapeString(a:1) . b:ECsaveWhite .'$' + endif + + return regex +endfunction + +" +" SubstituteWith(what, ...) +" what -- what type of regular expression +" * commentstart: +" * commentend: +" insert comment strings +" * decommentstart: +" * decommentend: +" remove comment strings +" a:1 -- comment string +" +function s:SubstituteWith(what, ...) + if a:what == 'commentstart' + \ || a:what == 'commentmiddle' + \ || a:what == 'commentend' + let commentSymbol = a:1 + else + let commentSymbol = '' + endif + + if b:ECuseBlockIndent && s:inBlock + let handleWhitespace = '\1' . commentSymbol + else + let handleWhitespace = b:ECrespectWhite . commentSymbol + \ . b:ECignoreWhite + endif + + if a:what == 'commentstart' + let regex = handleWhitespace . b:ECidentFront + \ . b:ECprettyComments + elseif a:what == 'commentmiddle' + let regex = handleWhitespace . b:ECidentFront + \ . b:ECprettyComments + elseif a:what == 'commentend' + let regex = b:ECprettyComments . b:ECidentBack . a:1 + elseif a:what == 'decommentstart' + \ || a:what == 'decommentmiddle' + \ || a:what == 'decommentend' + let regex = handleWhitespace + endif + + return regex +endfunction + +" +" +" DecideWhatToDo(lineString, commentStart, ...) +" lineString -- first line of block +" commentStart -- comment start symbol +" a:1 -- comment end symbol +" +function s:DecideWhatToDo(lineString, commentStart, ...) + " If we checked already, we return our previous result. + if !s:firstOfBlock + \ && (s:Action == 'first' + \ || (b:ECuseMPBlock && s:inBlock && a:0)) + return s:blockAction + endif + + let s:blockAction = 'comment' + + if s:inBlock && a:0 && b:ECuseMPBlock + let first = getline(s:startBlock) + let last = getline(s:endBlock) + + if first =~ s:LookFor('checkstart', a:commentStart) + \ && first !~ s:LookFor('checkend', a:1) + \ && last !~ s:LookFor('checkstart', a:commentStart) + \ && last =~ s:LookFor('checkend', a:1) + let s:blockAction = 'decomment' + endif + + return s:blockAction + endif + + if a:lineString =~ s:LookFor('checkstart', a:commentStart) + let s:blockAction = 'decomment' + endif + + if a:0 + if a:lineString !~ s:LookFor('checkend', a:1) + let s:blockAction = 'comment' + endif + endif + + let s:firstOfBlock = 0 + return s:blockAction +endfunction + +" +" TabsToSpaces(str) +" str -- string to convert +" +" Convert leading tabs of given string to spaces. +" +function s:TabsToSpaces(str) + let string = a:str + + " FIXME: Can we use something like retab? I don't think so, + " because retab changes every whitespace in the line, but we + " wan't to modify only the leading spaces. Is this a problem? + while string =~ '^\( *\)\t' + let string = substitute(string, '^\( *\)\t', '\1'. s:tabConvert, "") + endwhile + + return string +endfunction + +" +" SpacesToTabs(str) +" str -- string to convert +" +" Convert leading spaces of given string to tabs. +" +function s:SpacesToTabs(str) + let string = a:str + + if !&expandtab + while string =~ '^\(\t*\)'. s:tabConvert + let string = substitute(string, '^\(\t*\)'. s:tabConvert, + \ '\1\t', "") + endwhile + endif + + return string +endfunction + +" +" EnhCommentifyFallback4Embedded(test, fallback) +" test -- test for the special case +" fallback -- filetype instead of normal fallback +" +" This function is global. It should be called from filetype +" plugins like php, where the normal fallback behaviour may +" not work. One may use 'synFiletype' to reference the guessed +" filetype via synID. +" +function EnhCommentifyFallback4Embedded(test, fallback) + let b:EnhCommentifyFallbackTest = a:test + let b:EnhCommentifyFallbackValue = a:fallback +endfunction + +" +" Keyboard mappings. +" +noremap Comment + \ :call EnhancedCommentify('', 'comment') +noremap DeComment + \ :call EnhancedCommentify('', 'decomment') +noremap Traditional + \ :call EnhancedCommentify('', 'guess') +noremap FirstLine + \ :call EnhancedCommentify('', 'first') + +noremap VisualComment + \ :call EnhancedCommentify('', 'comment', + \ line("'<"), line("'>")) +noremap VisualDeComment + \ :call EnhancedCommentify('', 'decomment', + \ line("'<"), line("'>")) +noremap VisualTraditional + \ :call EnhancedCommentify('', 'guess', + \ line("'<"), line("'>")) +noremap VisualFirstLine + \ :call EnhancedCommentify('', 'first', + \ line("'<"), line("'>")) +" +" Finally set keybindings. +" +" SetKeybindings(where) +" where -- "l" for local to the buffer, "g" for global +" +function s:SetKeybindings(where) + if a:where == "l" + let where = "" + let ns = "b" + else + let where = "" + let ns = "s" + endif + + execute "let userBindings = ". ns .":ECuserBindings" + execute "let useAltKeys = ". ns .":ECuseAltKeys" + execute "let traditionalMode = ". ns .":ECtraditionalMode" + execute "let firstLineMode = ". ns .":ECfirstLineMode" + execute "let bindInNormal = ". ns .":ECbindInNormal" + execute "let bindInInsert = ". ns .":ECbindInInsert" + execute "let bindInVisual = ". ns .":ECbindInVisual" + + if userBindings + " + " *** Put your personal bindings here! *** + " + else + if useAltKeys + let s:c = '' + let s:x = '' + let s:C = '' + let s:X = '' + else + let s:c = 'c' + let s:x = 'x' + let s:C = 'C' + let s:X = 'X' + endif + + if traditionalMode + let s:Method = 'Traditional' + elseif firstLineMode + let s:Method = 'FirstLine' + else + let s:Method = 'Comment' + + " Decomment must be defined here. Everything else is mapped below. + if bindInNormal + execute 'nmap '. where .' '. s:C + \ .' DeCommentj' + execute 'nmap '. where .' '. s:X + \ .' DeComment' + endif + + if bindInInsert + execute 'imap '. where .' '. s:C + \ .' DeCommentji' + execute 'imap '. where .' '. s:X + \ .' DeCommenti' + endif + + if bindInVisual + execute 'vmap '. where .' '. s:C + \ .' VisualDeCommentj' + execute 'vmap '. where .' '. s:X + \ .' VisualDeComment' + endif + endif + + if bindInNormal + execute 'nmap '. where .' '. s:c + \ .' '. s:Method .'j' + execute 'nmap '. where .' '. s:x + \ .' '. s:Method + endif + + if bindInInsert + execute 'imap '. where .' '. s:c + \ .' '. s:Method .'ji' + execute 'imap '. where .' '. s:x + \ .' '. s:Method + endif + + if bindInVisual + execute 'vmap '. s:c + \ .' Visual'. s:Method .'j' + execute 'vmap '. where .' '. s:x + \ .' Visual'. s:Method + endif + endif +endfunction + +if !s:ECbindPerBuffer + call s:SetKeybindings("g") +endif + +let &cpo = s:savedCpo + +" vim: set sts=4 sw=4 ts=8 : diff --git a/.vim/plugin/cscope_maps.vim b/.vim/plugin/cscope_maps.vim new file mode 100644 index 0000000..675aad6 --- /dev/null +++ b/.vim/plugin/cscope_maps.vim @@ -0,0 +1,165 @@ +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" CSCOPE settings for vim +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" +" This file contains some boilerplate settings for vim's cscope interface, +" plus some keyboard mappings that I've found useful. +" +" USAGE: +" -- vim 6: Stick this file in your ~/.vim/plugin directory (or in a +" 'plugin' directory in some other directory that is in your +" 'runtimepath'. +" +" -- vim 5: Stick this file somewhere and 'source cscope.vim' it from +" your ~/.vimrc file (or cut and paste it into your .vimrc). +" +" NOTE: +" These key maps use multiple keystrokes (2 or 3 keys). If you find that vim +" keeps timing you out before you can complete them, try changing your timeout +" settings, as explained below. +" +" Happy cscoping, +" +" Jason Duell jduell@alumni.princeton.edu 2002/3/7 +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + + +" This tests to see if vim was configured with the '--enable-cscope' option +" when it was compiled. If it wasn't, time to recompile vim... +if has("cscope") + + """"""""""""" Standard cscope/vim boilerplate + + " use both cscope and ctag for 'ctrl-]', ':ta', and 'vim -t' + set cscopetag + + " check cscope for definition of a symbol before checking ctags: set to 1 + " if you want the reverse search order. + set csto=0 + + " add any cscope database in current directory + if filereadable("cscope.out") + "cs add cscope.out + " else add the database pointed to by environment variable + "elseif $CSCOPE_DB != "" + " cs add $CSCOPE_DB + endif + + " show msg when any other cscope db added + set cscopeverbose + + + """"""""""""" My cscope/vim key mappings + " + " The following maps all invoke one of the following cscope search types: + " + " 's' symbol: find all references to the token under cursor + " 'g' global: find global definition(s) of the token under cursor + " 'c' calls: find all calls to the function name under cursor + " 't' text: find all instances of the text under cursor + " 'e' egrep: egrep search for the word under cursor + " 'f' file: open the filename under cursor + " 'i' includes: find files that include the filename under cursor + " 'd' called: find functions that function under cursor calls + " + " Below are three sets of the maps: one set that just jumps to your + " search result, one that splits the existing vim window horizontally and + " diplays your search result in the new window, and one that does the same + " thing, but does a vertical split instead (vim 6 only). + " + " I've used CTRL-\ and CTRL-@ as the starting keys for these maps, as it's + " unlikely that you need their default mappings (CTRL-\'s default use is + " as part of CTRL-\ CTRL-N typemap, which basically just does the same + " thing as hitting 'escape': CTRL-@ doesn't seem to have any default use). + " If you don't like using 'CTRL-@' or CTRL-\, , you can change some or all + " of these maps to use other keys. One likely candidate is 'CTRL-_' + " (which also maps to CTRL-/, which is easier to type). By default it is + " used to switch between Hebrew and English keyboard mode. + " + " All of the maps involving the macro use '^$': this is so + " that searches over '#include " return only references to + " 'time.h', and not 'sys/time.h', etc. (by default cscope will return all + " files that contain 'time.h' as part of their name). + + + " To do the first type of search, hit 'CTRL-\', followed by one of the + " cscope search types above (s,g,c,t,e,f,i,d). The result of your cscope + " search will be displayed in the current window. You can use CTRL-T to + " go back to where you were before the search. + " + + nmap s :cs find s =expand("") + nmap g :cs find g =expand("") + nmap c :cs find c =expand("") + nmap t :cs find t =expand("") + nmap e :cs find e =expand("") + nmap f :cs find f =expand("") + nmap i :cs find i ^=expand("")$ + nmap d :cs find d =expand("") + + + " Using 'CTRL-spacebar' (intepreted as CTRL-@ by vim) then a search type + " makes the vim window split horizontally, with search result displayed in + " the new window. + " + " (Note: earlier versions of vim may not have the :scs command, but it + " can be simulated roughly via: + " nmap s :cs find s =expand("") + + nmap s :scs find s =expand("") + nmap g :scs find g =expand("") + nmap c :scs find c =expand("") + nmap t :scs find t =expand("") + nmap e :scs find e =expand("") + nmap f :scs find f =expand("") + nmap i :scs find i ^=expand("")$ + nmap d :scs find d =expand("") + + + " Hitting CTRL-space *twice* before the search type does a vertical + " split instead of a horizontal one (vim 6 and up only) + " + " (Note: you may wish to put a 'set splitright' in your .vimrc + " if you prefer the new window on the right instead of the left + + nmap s :vert scs find s =expand("") + nmap g :vert scs find g =expand("") + nmap c :vert scs find c =expand("") + nmap t :vert scs find t =expand("") + nmap e :vert scs find e =expand("") + nmap f :vert scs find f =expand("") + nmap i :vert scs find i ^=expand("")$ + nmap d :vert scs find d =expand("") + + + """"""""""""" key map timeouts + " + " By default Vim will only wait 1 second for each keystroke in a mapping. + " You may find that too short with the above typemaps. If so, you should + " either turn off mapping timeouts via 'notimeout'. + " + "set notimeout + " + " Or, you can keep timeouts, by uncommenting the timeoutlen line below, + " with your own personal favorite value (in milliseconds): + " + "set timeoutlen=4000 + " + " Either way, since mapping timeout settings by default also set the + " timeouts for multicharacter 'keys codes' (like ), you should also + " set ttimeout and ttimeoutlen: otherwise, you will experience strange + " delays as vim waits for a keystroke after you hit ESC (it will be + " waiting to see if the ESC is actually part of a key code like ). + " + "set ttimeout + " + " personally, I find a tenth of a second to work well for key code + " timeouts. If you experience problems and have a slow terminal or network + " connection, set it higher. If you don't set ttimeoutlen, the value for + " timeoutlent (default: 1000 = 1 second, which is sluggish) is used. + " + "set ttimeoutlen=100 + +endif + + diff --git a/.vim/plugin/fugitive.vim b/.vim/plugin/fugitive.vim new file mode 100644 index 0000000..048089e --- /dev/null +++ b/.vim/plugin/fugitive.vim @@ -0,0 +1,2041 @@ +" fugitive.vim - A Git wrapper so awesome, it should be illegal +" Maintainer: Tim Pope +" Version: 1.2 +" GetLatestVimScripts: 2975 1 :AutoInstall: fugitive.vim + +if exists('g:loaded_fugitive') || &cp + finish +endif +let g:loaded_fugitive = 1 + +if !exists('g:fugitive_git_executable') + let g:fugitive_git_executable = 'git' +endif + +" Utility {{{1 + +function! s:function(name) abort + return function(substitute(a:name,'^s:',matchstr(expand(''), '\d\+_'),'')) +endfunction + +function! s:sub(str,pat,rep) abort + return substitute(a:str,'\v\C'.a:pat,a:rep,'') +endfunction + +function! s:gsub(str,pat,rep) abort + return substitute(a:str,'\v\C'.a:pat,a:rep,'g') +endfunction + +function! s:shellesc(arg) abort + if a:arg =~ '^[A-Za-z0-9_/.-]\+$' + return a:arg + elseif &shell =~# 'cmd' && a:arg !~# '"' + return '"'.a:arg.'"' + else + return shellescape(a:arg) + endif +endfunction + +function! s:fnameescape(file) abort + if exists('*fnameescape') + return fnameescape(a:file) + else + return escape(a:file," \t\n*?[{`$\\%#'\"|!<") + endif +endfunction + +function! s:throw(string) abort + let v:errmsg = 'fugitive: '.a:string + throw v:errmsg +endfunction + +function! s:warn(str) + echohl WarningMsg + echomsg a:str + echohl None + let v:warningmsg = a:str +endfunction + +function! s:shellslash(path) + if exists('+shellslash') && !&shellslash + return s:gsub(a:path,'\\','/') + else + return a:path + endif +endfunction + +function! s:add_methods(namespace, method_names) abort + for name in a:method_names + let s:{a:namespace}_prototype[name] = s:function('s:'.a:namespace.'_'.name) + endfor +endfunction + +let s:commands = [] +function! s:command(definition) abort + let s:commands += [a:definition] +endfunction + +function! s:define_commands() + for command in s:commands + exe 'command! -buffer '.command + endfor +endfunction + +function! s:compatibility_check() + if exists('b:git_dir') && exists('*GitBranchInfoCheckGitDir') && !exists('g:fugitive_did_compatibility_warning') + let g:fugitive_did_compatibility_warning = 1 + call s:warn("See http://github.com/tpope/vim-fugitive/issues#issue/1 for why you should remove git-branch-info.vim") + endif +endfunction + +augroup fugitive_utility + autocmd! + autocmd User Fugitive call s:define_commands() + autocmd VimEnter * call s:compatibility_check() +augroup END + +let s:abstract_prototype = {} + +" }}}1 +" Initialization {{{1 + +function! s:ExtractGitDir(path) abort + let path = s:shellslash(a:path) + if path =~? '^fugitive://.*//' + return matchstr(path,'fugitive://\zs.\{-\}\ze//') + endif + let fn = fnamemodify(path,':s?[\/]$??') + let ofn = "" + let nfn = fn + while fn != ofn + if filereadable(fn . '/.git/HEAD') + return s:sub(simplify(fnamemodify(fn . '/.git',':p')),'\W$','') + elseif fn =~ '\.git$' && filereadable(fn . '/HEAD') + return s:sub(simplify(fnamemodify(fn,':p')),'\W$','') + endif + let ofn = fn + let fn = fnamemodify(ofn,':h') + endwhile + return '' +endfunction + +function! s:Detect(path) + if exists('b:git_dir') && b:git_dir ==# '' + unlet b:git_dir + endif + if !exists('b:git_dir') + let dir = s:ExtractGitDir(a:path) + if dir != '' + let b:git_dir = dir + endif + endif + if exists('b:git_dir') + silent doautocmd User Fugitive + cnoremap fugitive#buffer().rev() + let buffer = fugitive#buffer() + if expand('%:p') =~# '//' + call buffer.setvar('&path',s:sub(buffer.getvar('&path'),'^\.%(,|$)','')) + endif + if b:git_dir !~# ',' && stridx(buffer.getvar('&tags'),b:git_dir.'/tags') == -1 + if &filetype != '' + call buffer.setvar('&tags',buffer.getvar('&tags').','.b:git_dir.'/'.&filetype.'.tags') + endif + call buffer.setvar('&tags',buffer.getvar('&tags').','.b:git_dir.'/tags') + endif + endif +endfunction + +augroup fugitive + autocmd! + autocmd BufNewFile,BufReadPost * call s:Detect(expand(':p')) + autocmd FileType netrw call s:Detect(expand(':p')) + autocmd VimEnter * if expand('')==''|call s:Detect(getcwd())|endif + autocmd BufWinLeave * execute getwinvar(+winnr(), 'fugitive_restore') +augroup END + +" }}}1 +" Repository {{{1 + +let s:repo_prototype = {} +let s:repos = {} + +function! s:repo(...) abort + let dir = a:0 ? a:1 : (exists('b:git_dir') && b:git_dir !=# '' ? b:git_dir : s:ExtractGitDir(expand('%:p'))) + if dir !=# '' + if has_key(s:repos,dir) + let repo = get(s:repos,dir) + else + let repo = {'git_dir': dir} + let s:repos[dir] = repo + endif + return extend(extend(repo,s:repo_prototype,'keep'),s:abstract_prototype,'keep') + endif + call s:throw('not a git repository: '.expand('%:p')) +endfunction + +function! s:repo_dir(...) dict abort + return join([self.git_dir]+a:000,'/') +endfunction + +function! s:repo_tree(...) dict abort + if !self.bare() + let dir = fnamemodify(self.git_dir,':h') + return join([dir]+a:000,'/') + endif + call s:throw('no work tree') +endfunction + +function! s:repo_bare() dict abort + return self.dir() !~# '/\.git$' +endfunction + +function! s:repo_translate(spec) dict abort + if a:spec ==# '.' || a:spec ==# '/.' + return self.bare() ? self.dir() : self.tree() + elseif a:spec =~# '^/' + return fnamemodify(self.dir(),':h').a:spec + elseif a:spec =~# '^:[0-3]:' + return 'fugitive://'.self.dir().'//'.a:spec[1].'/'.a:spec[3:-1] + elseif a:spec ==# ':' + if $GIT_INDEX_FILE =~# '/[^/]*index[^/]*\.lock$' && fnamemodify($GIT_INDEX_FILE,':p')[0:strlen(s:repo().dir())] ==# s:repo().dir('') && filereadable($GIT_INDEX_FILE) + return fnamemodify($GIT_INDEX_FILE,':p') + else + return self.dir('index') + endif + elseif a:spec =~# '^:/' + let ref = self.rev_parse(matchstr(a:spec,'.[^:]*')) + return 'fugitive://'.self.dir().'//'.ref + elseif a:spec =~# '^:' + return 'fugitive://'.self.dir().'//0/'.a:spec[1:-1] + elseif a:spec =~# 'HEAD\|^refs/' && a:spec !~ ':' && filereadable(self.dir(a:spec)) + return self.dir(a:spec) + elseif filereadable(s:repo().dir('refs/'.a:spec)) + return self.dir('refs/'.a:spec) + elseif filereadable(s:repo().dir('refs/tags/'.a:spec)) + return self.dir('refs/tags/'.a:spec) + elseif filereadable(s:repo().dir('refs/heads/'.a:spec)) + return self.dir('refs/heads/'.a:spec) + elseif filereadable(s:repo().dir('refs/remotes/'.a:spec)) + return self.dir('refs/remotes/'.a:spec) + elseif filereadable(s:repo().dir('refs/remotes/'.a:spec.'/HEAD')) + return self.dir('refs/remotes/'.a:spec,'/HEAD') + else + try + let ref = self.rev_parse(matchstr(a:spec,'[^:]*')) + let path = s:sub(matchstr(a:spec,':.*'),'^:','/') + return 'fugitive://'.self.dir().'//'.ref.path + catch /^fugitive:/ + return self.tree(a:spec) + endtry + endif +endfunction + +call s:add_methods('repo',['dir','tree','bare','translate']) + +function! s:repo_git_command(...) dict abort + let git = g:fugitive_git_executable . ' --git-dir='.s:shellesc(self.git_dir) + return git.join(map(copy(a:000),'" ".s:shellesc(v:val)'),'') +endfunction + +function! s:repo_git_chomp(...) dict abort + return s:sub(system(call(self.git_command,a:000,self)),'\n$','') +endfunction + +function! s:repo_git_chomp_in_tree(...) dict abort + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + execute cd.'`=s:repo().tree()`' + return call(s:repo().git_chomp, a:000, s:repo()) + finally + execute cd.'`=dir`' + endtry +endfunction + +function! s:repo_rev_parse(rev) dict abort + let hash = self.git_chomp('rev-parse','--verify',a:rev) + if hash =~ '\<\x\{40\}$' + return matchstr(hash,'\<\x\{40\}$') + endif + call s:throw('rev-parse '.a:rev.': '.hash) +endfunction + +call s:add_methods('repo',['git_command','git_chomp','git_chomp_in_tree','rev_parse']) + +function! s:repo_dirglob(base) dict abort + let base = s:sub(a:base,'^/','') + let matches = split(glob(self.tree(s:gsub(base,'/','*&').'*/')),"\n") + call map(matches,'v:val[ strlen(self.tree())+(a:base !~ "^/") : -1 ]') + return matches +endfunction + +function! s:repo_superglob(base) dict abort + if a:base =~# '^/' || a:base !~# ':' + let results = [] + if a:base !~# '^/' + let heads = ["HEAD","ORIG_HEAD","FETCH_HEAD","MERGE_HEAD"] + let heads += sort(split(s:repo().git_chomp("rev-parse","--symbolic","--branches","--tags","--remotes"),"\n")) + call filter(heads,'v:val[ 0 : strlen(a:base)-1 ] ==# a:base') + let results += heads + endif + if !self.bare() + let base = s:sub(a:base,'^/','') + let matches = split(glob(self.tree(s:gsub(base,'/','*&').'*')),"\n") + call map(matches,'s:shellslash(v:val)') + call map(matches,'v:val !~ "/$" && isdirectory(v:val) ? v:val."/" : v:val') + call map(matches,'v:val[ strlen(self.tree())+(a:base !~ "^/") : -1 ]') + let results += matches + endif + return results + + elseif a:base =~# '^:' + let entries = split(self.git_chomp('ls-files','--stage'),"\n") + call map(entries,'s:sub(v:val,".*(\\d)\\t(.*)",":\\1:\\2")') + if a:base !~# '^:[0-3]\%(:\|$\)' + call filter(entries,'v:val[1] == "0"') + call map(entries,'v:val[2:-1]') + endif + call filter(entries,'v:val[ 0 : strlen(a:base)-1 ] ==# a:base') + return entries + + else + let tree = matchstr(a:base,'.*[:/]') + let entries = split(self.git_chomp('ls-tree',tree),"\n") + call map(entries,'s:sub(v:val,"^04.*\\zs$","/")') + call map(entries,'tree.s:sub(v:val,".*\t","")') + return filter(entries,'v:val[ 0 : strlen(a:base)-1 ] ==# a:base') + endif +endfunction + +call s:add_methods('repo',['dirglob','superglob']) + +function! s:repo_keywordprg() dict abort + let args = ' --git-dir='.escape(self.dir(),"\\\"' ").' show' + if has('gui_running') && !has('win32') + return g:fugitive_git_executable . ' --no-pager' . args + else + return g:fugitive_git_executable . args + endif +endfunction + +call s:add_methods('repo',['keywordprg']) + +" }}}1 +" Buffer {{{1 + +let s:buffer_prototype = {} + +function! s:buffer(...) abort + let buffer = {'#': bufnr(a:0 ? a:1 : '%')} + call extend(extend(buffer,s:buffer_prototype,'keep'),s:abstract_prototype,'keep') + if buffer.getvar('git_dir') !=# '' + return buffer + endif + call s:throw('not a git repository: '.expand('%:p')) +endfunction + +function! fugitive#buffer(...) abort + return s:buffer(a:0 ? a:1 : '%') +endfunction + +function! s:buffer_getvar(var) dict abort + return getbufvar(self['#'],a:var) +endfunction + +function! s:buffer_setvar(var,value) dict abort + return setbufvar(self['#'],a:var,a:value) +endfunction + +function! s:buffer_getline(lnum) dict abort + return getbufline(self['#'],a:lnum)[0] +endfunction + +function! s:buffer_repo() dict abort + return s:repo(self.getvar('git_dir')) +endfunction + +function! s:buffer_type(...) dict abort + if self.getvar('fugitive_type') != '' + let type = self.getvar('fugitive_type') + elseif fnamemodify(self.spec(),':p') =~# '.\git/refs/\|\.git/\w*HEAD$' + let type = 'head' + elseif self.getline(1) =~ '^tree \x\{40\}$' && self.getline(2) == '' + let type = 'tree' + elseif self.getline(1) =~ '^\d\{6\} \w\{4\} \x\{40\}\>\t' + let type = 'tree' + elseif self.getline(1) =~ '^\d\{6\} \x\{40\}\> \d\t' + let type = 'index' + elseif isdirectory(self.spec()) + let type = 'directory' + elseif self.spec() == '' + let type = 'null' + elseif filereadable(self.spec()) + let type = 'file' + else + let type = '' + endif + if a:0 + return !empty(filter(copy(a:000),'v:val ==# type')) + else + return type + endif +endfunction + +if has('win32') + + function! s:buffer_spec() dict abort + let bufname = bufname(self['#']) + let retval = '' + for i in split(bufname,'[^:]\zs\\') + let retval = fnamemodify((retval==''?'':retval.'\').i,':.') + endfor + return s:shellslash(fnamemodify(retval,':p')) + endfunction + +else + + function! s:buffer_spec() dict abort + let bufname = bufname(self['#']) + return s:shellslash(bufname == '' ? '' : fnamemodify(bufname,':p')) + endfunction + +endif + +function! s:buffer_name() dict abort + return self.spec() +endfunction + +function! s:buffer_commit() dict abort + return matchstr(self.spec(),'^fugitive://.\{-\}//\zs\w*') +endfunction + +function! s:buffer_path(...) dict abort + let rev = matchstr(self.spec(),'^fugitive://.\{-\}//\zs.*') + if rev != '' + let rev = s:sub(rev,'\w*','') + else + let rev = self.spec()[strlen(self.repo().tree()) : -1] + endif + return s:sub(s:sub(rev,'.\zs/$',''),'^/',a:0 ? a:1 : '') +endfunction + +function! s:buffer_rev() dict abort + let rev = matchstr(self.spec(),'^fugitive://.\{-\}//\zs.*') + if rev =~ '^\x/' + return ':'.rev[0].':'.rev[2:-1] + elseif rev =~ '.' + return s:sub(rev,'/',':') + elseif self.spec() =~ '\.git/index$' + return ':' + elseif self.spec() =~ '\.git/refs/\|\.git/.*HEAD$' + return self.spec()[strlen(self.repo().dir())+1 : -1] + else + return self.path() + endif +endfunction + +function! s:buffer_sha1() dict abort + if self.spec() =~ '^fugitive://' || self.spec() =~ '\.git/refs/\|\.git/.*HEAD$' + return self.repo().rev_parse(self.rev()) + else + return '' + endif +endfunction + +function! s:buffer_expand(rev) dict abort + if a:rev =~# '^:[0-3]$' + let file = a:rev.self.path(':') + elseif a:rev =~# '^[-:]/$' + let file = '/'.self.path() + elseif a:rev =~# '^-' + let file = 'HEAD^{}'.a:rev[1:-1].self.path(':') + elseif a:rev =~# '^@{' + let file = 'HEAD'.a:rev.self.path(':') + elseif a:rev =~# '^[~^]' + let commit = s:sub(self.commit(),'^\d=$','HEAD') + let file = commit.a:rev.self.path(':') + else + let file = a:rev + endif + return s:sub(s:sub(file,'\%$',self.path()),'\.\@<=/$','') +endfunction + +function! s:buffer_containing_commit() dict abort + if self.commit() =~# '^\d$' + return ':' + elseif self.commit() =~# '.' + return self.commit() + else + return 'HEAD' + endif +endfunction + +call s:add_methods('buffer',['getvar','setvar','getline','repo','type','spec','name','commit','path','rev','sha1','expand','containing_commit']) + +" }}}1 +" Git {{{1 + +call s:command("-bang -nargs=? -complete=customlist,s:GitComplete Git :execute s:Git(0,)") + +function! s:ExecuteInTree(cmd) abort + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + execute cd.'`=s:repo().tree()`' + execute a:cmd + finally + execute cd.'`=dir`' + endtry +endfunction + +function! s:Git(bang,cmd) abort + let git = s:repo().git_command() + if has('gui_running') && !has('win32') + let git .= ' --no-pager' + endif + let cmd = matchstr(a:cmd,'\v\C.{-}%($|\\@ `=s:repo().bare() ? s:repo().dir() : s:repo().tree()`") +call s:command("-bar -bang -nargs=? -complete=customlist,s:DirComplete Glcd :lcd `=s:repo().bare() ? s:repo().dir() : s:repo().tree()`") + +" }}}1 +" Gstatus {{{1 + +call s:command("-bar Gstatus :execute s:Status()") + +function! s:Status() abort + try + Gpedit : + wincmd P + nnoremap q :bdelete + catch /^fugitive:/ + return 'echoerr v:errmsg' + endtry + return '' +endfunction + +function! fugitive#reload_status() abort + let mytab = tabpagenr() + for tab in [mytab] + range(1,tabpagenr('$')) + for winnr in range(1,tabpagewinnr(tab,'$')) + if getbufvar(tabpagebuflist(tab)[winnr-1],'fugitive_type') ==# 'index' + execute 'tabnext '.tab + if winnr != winnr() + execute winnr.'wincmd w' + let restorewinnr = 1 + endif + try + if !&modified + call s:BufReadIndex() + endif + finally + if exists('restorewinnr') + wincmd p + endif + execute 'tabnext '.mytab + endtry + endif + endfor + endfor +endfunction + +function! s:StageDiff(...) abort + let cmd = a:0 ? a:1 : 'Gdiff' + let section = getline(search('^# .*:$','bnW')) + let line = getline('.') + let filename = matchstr(line,'^#\t\%([[:alpha:] ]\+: *\)\=\zs.\{-\}\ze\%( (new commits)\)\=$') + if filename ==# '' && section == '# Changes to be committed:' + return 'Git diff --cached' + elseif filename ==# '' + return 'Git diff' + elseif line =~# '^#\trenamed:' && filename =~ ' -> ' + let [old, new] = split(filename,' -> ') + execute 'Gedit '.s:fnameescape(':0:'.new) + return cmd.' HEAD:'.s:fnameescape(old) + elseif section == '# Changes to be committed:' + execute 'Gedit '.s:fnameescape(':0:'.filename) + return cmd.' -' + else + execute 'Gedit '.s:fnameescape('/'.filename) + return cmd + endif +endfunction + +function! s:StageToggle(lnum1,lnum2) abort + try + let output = '' + for lnum in range(a:lnum1,a:lnum2) + let line = getline(lnum) + let repo = s:repo() + if line ==# '# Changes to be committed:' + call repo.git_chomp_in_tree('reset','-q') + silent! edit! + 1 + if !search('^# Untracked files:$','W') + call search('^# Change','W') + endif + return '' + elseif line =~# '^# Change\%(d but not updated\|s not staged for commit\):$' + call repo.git_chomp_in_tree('add','-u') + silent! edit! + 1 + if !search('^# Untracked files:$','W') + call search('^# Change','W') + endif + return '' + elseif line ==# '# Untracked files:' + " Work around Vim parser idiosyncrasy + call repo.git_chomp_in_tree('add','-N','.') + silent! edit! + 1 + if !search('^# Change\%(d but not updated\|s not staged for commit\):$','W') + call search('^# Change','W') + endif + return '' + endif + let filename = matchstr(line,'^#\t\%([[:alpha:] ]\+: *\)\=\zs.\{-\}\ze\%( (\a\+ [[:alpha:], ]\+)\)\=$') + if filename ==# '' + continue + endif + if !exists('first_filename') + let first_filename = filename + endif + execute lnum + let section = getline(search('^# .*:$','bnW')) + if line =~# '^#\trenamed:' && filename =~ ' -> ' + let cmd = ['mv','--'] + reverse(split(filename,' -> ')) + let filename = cmd[-1] + elseif section =~? ' to be ' + let cmd = ['reset','-q','--',filename] + elseif line =~# '^#\tdeleted:' + let cmd = ['rm','--',filename] + else + let cmd = ['add','--',filename] + endif + let output .= call(repo.git_chomp_in_tree,cmd,s:repo())."\n" + endfor + if exists('first_filename') + let jump = first_filename + let f = matchstr(getline(a:lnum1-1),'^#\t\%([[:alpha:] ]\+: *\)\=\zs.*') + if f !=# '' | let jump = f | endif + let f = matchstr(getline(a:lnum2+1),'^#\t\%([[:alpha:] ]\+: *\)\=\zs.*') + if f !=# '' | let jump = f | endif + silent! edit! + 1 + redraw + call search('^#\t\%([[:alpha:] ]\+: *\)\=\V'.jump.'\%( (new commits)\)\=\$','W') + endif + echo s:sub(s:gsub(output,'\n+','\n'),'\n$','') + catch /^fugitive:/ + return 'echoerr v:errmsg' + endtry + return 'checktime' +endfunction + +function! s:StagePatch(lnum1,lnum2) abort + let add = [] + let reset = [] + + for lnum in range(a:lnum1,a:lnum2) + let line = getline(lnum) + if line ==# '# Changes to be committed:' + return 'Git reset --patch' + elseif line =~# '^# Change\%(d but not updated\|s not staged for commit\):$' + return 'Git add --patch' + endif + let filename = matchstr(line,'^#\t\%([[:alpha:] ]\+: *\)\=\zs.\{-\}\ze\%( (new commits)\)\=$') + if filename ==# '' + continue + endif + if !exists('first_filename') + let first_filename = filename + endif + execute lnum + let section = getline(search('^# .*:$','bnW')) + if line =~# '^#\trenamed:' && filename =~ ' -> ' + let reset += [split(filename,' -> ')[1]] + elseif section =~? ' to be ' + let reset += [filename] + elseif line !~# '^#\tdeleted:' + let add += [filename] + endif + endfor + try + if !empty(add) + execute "Git add --patch -- ".join(map(add,'s:shellesc(v:val)')) + endif + if !empty(reset) + execute "Git reset --patch -- ".join(map(add,'s:shellesc(v:val)')) + endif + if exists('first_filename') + silent! edit! + 1 + redraw + call search('^#\t\%([[:alpha:] ]\+: *\)\=\V'.first_filename.'\%( (new commits)\)\=\$','W') + endif + catch /^fugitive:/ + return 'echoerr v:errmsg' + endtry + return 'checktime' +endfunction + +" }}}1 +" Gcommit {{{1 + +call s:command("-nargs=? -complete=customlist,s:CommitComplete Gcommit :execute s:Commit()") + +function! s:Commit(args) abort + let old_type = s:buffer().type() + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + let msgfile = s:repo().dir('COMMIT_EDITMSG') + let outfile = tempname() + let errorfile = tempname() + try + execute cd.'`=s:repo().tree()`' + if &shell =~# 'cmd' + let command = '' + let old_editor = $GIT_EDITOR + let $GIT_EDITOR = 'false' + else + let command = 'env GIT_EDITOR=false ' + endif + let command .= s:repo().git_command('commit').' '.a:args + if &shell =~# 'csh' + silent execute '!('.command.' > '.outfile.') >& '.errorfile + elseif a:args =~# '\%(^\| \)--interactive\>' + execute '!'.command.' 2> '.errorfile + else + silent execute '!'.command.' > '.outfile.' 2> '.errorfile + endif + if !v:shell_error + if filereadable(outfile) + for line in readfile(outfile) + echo line + endfor + endif + return '' + else + let errors = readfile(errorfile) + let error = get(errors,-2,get(errors,-1,'!')) + if error =~# '\' + let args = '--cleanup=strip '.args + endif + let old_nr = bufnr('') + if bufname('%') == '' && line('$') == 1 && getline(1) == '' && !&mod + edit `=msgfile` + else + keepalt split `=msgfile` + endif + if old_type ==# 'index' + execute 'bdelete '.old_nr + endif + let b:fugitive_commit_arguments = args + setlocal bufhidden=delete filetype=gitcommit + return '1' + elseif error ==# '!' + return s:Status() + else + call s:throw(error) + endif + endif + catch /^fugitive:/ + return 'echoerr v:errmsg' + finally + if exists('old_editor') + let $GIT_EDITOR = old_editor + endif + call delete(outfile) + call delete(errorfile) + execute cd.'`=dir`' + call fugitive#reload_status() + endtry +endfunction + +function! s:CommitComplete(A,L,P) abort + if a:A =~ '^-' || type(a:A) == type(0) " a:A is 0 on :Gcommit - + let args = ['-C', '-F', '-a', '-c', '-e', '-i', '-m', '-n', '-o', '-q', '-s', '-t', '-u', '-v', '--all', '--allow-empty', '--amend', '--author=', '--cleanup=', '--dry-run', '--edit', '--file=', '--include', '--interactive', '--message=', '--no-verify', '--only', '--quiet', '--reedit-message=', '--reuse-message=', '--signoff', '--template=', '--untracked-files', '--verbose'] + return filter(args,'v:val[0 : strlen(a:A)-1] ==# a:A') + else + return s:repo().superglob(a:A) + endif +endfunction + +function! s:FinishCommit() + let args = getbufvar(+expand(''),'fugitive_commit_arguments') + if !empty(args) + call setbufvar(+expand(''),'fugitive_commit_arguments','') + return s:Commit(args) + endif + return '' +endfunction + +augroup fugitive_commit + autocmd! + autocmd VimLeavePre,BufDelete *.git/COMMIT_EDITMSG execute s:sub(s:FinishCommit(), '^echoerr (.*)', 'echohl ErrorMsg|echo \1|echohl NONE') +augroup END + +" }}}1 +" Ggrep, Glog {{{1 + +if !exists('g:fugitive_summary_format') + let g:fugitive_summary_format = '%s' +endif + +call s:command("-bang -nargs=? -complete=customlist,s:EditComplete Ggrep :execute s:Grep(0,)") +call s:command("-bar -bang -nargs=* -complete=customlist,s:EditComplete Glog :execute s:Log('grep',)") + +function! s:Grep(bang,arg) abort + let grepprg = &grepprg + let grepformat = &grepformat + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + execute cd.'`=s:repo().tree()`' + let &grepprg = s:repo().git_command('--no-pager', 'grep', '-n') + let &grepformat = '%f:%l:%m' + exe 'grep! '.escape(matchstr(a:arg,'\v\C.{-}%($|[''" ]\@=\|)@='),'|') + let list = getqflist() + for entry in list + if bufname(entry.bufnr) =~ ':' + let entry.filename = s:repo().translate(bufname(entry.bufnr)) + unlet! entry.bufnr + elseif a:arg =~# '\%(^\| \)--cached\>' + let entry.filename = s:repo().translate(':0:'.bufname(entry.bufnr)) + unlet! entry.bufnr + endif + endfor + call setqflist(list,'r') + if !a:bang && !empty(list) + return 'cfirst'.matchstr(a:arg,'\v\C[''" ]\zs\|.*') + else + return matchstr(a:arg,'\v\C[''" ]\|\zs.*') + endif + finally + let &grepprg = grepprg + let &grepformat = grepformat + execute cd.'`=dir`' + endtry +endfunction + +function! s:Log(cmd,...) + let path = s:buffer().path('/') + if path =~# '^/\.git\%(/\|$\)' || index(a:000,'--') != -1 + let path = '' + endif + let cmd = ['--no-pager', 'log', '--no-color'] + let cmd += [escape('--pretty=format:fugitive://'.s:repo().dir().'//%H'.path.'::'.g:fugitive_summary_format,'%')] + if empty(filter(a:000[0 : index(a:000,'--')],'v:val !~# "^-"')) + if s:buffer().commit() =~# '\x\{40\}' + let cmd += [s:buffer().commit()] + elseif s:buffer().path() =~# '^\.git/refs/\|^\.git/.*HEAD$' + let cmd += [s:buffer().path()[5:-1]] + endif + end + let cmd += map(copy(a:000),'s:sub(v:val,"^\\%(%(:\\w)*)","\\=fnamemodify(s:buffer().path(),submatch(1))")') + if path =~# '/.' + let cmd += ['--',path[1:-1]] + endif + let grepformat = &grepformat + let grepprg = &grepprg + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + execute cd.'`=s:repo().tree()`' + let &grepprg = call(s:repo().git_command,cmd,s:repo()) + let &grepformat = '%f::%m' + exe a:cmd + finally + let &grepformat = grepformat + let &grepprg = grepprg + execute cd.'`=dir`' + endtry +endfunction + +" }}}1 +" Gedit, Gpedit, Gsplit, Gvsplit, Gtabedit, Gread {{{1 + +function! s:Edit(cmd,...) abort + if a:0 && a:1 == '' + return '' + elseif a:0 + let file = s:buffer().expand(a:1) + elseif s:buffer().commit() ==# '' && s:buffer().path('/') !~# '^/.git\>' + let file = s:buffer().path(':') + else + let file = s:buffer().path('/') + endif + try + let file = s:repo().translate(file) + catch /^fugitive:/ + return 'echoerr v:errmsg' + endtry + if a:cmd ==# 'read' + return 'silent %delete_|read '.s:fnameescape(file).'|silent 1delete_|diffupdate|'.line('.') + else + if &previewwindow && getbufvar('','fugitive_type') ==# 'index' + wincmd p + endif + return a:cmd.' '.s:fnameescape(file) + endif +endfunction + +function! s:EditComplete(A,L,P) abort + return s:repo().superglob(a:A) +endfunction + +call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Ge :execute s:Edit('edit',)") +call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gedit :execute s:Edit('edit',)") +call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gpedit :execute s:Edit('pedit',)") +call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gsplit :execute s:Edit('split',)") +call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gvsplit :execute s:Edit('vsplit',)") +call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gtabedit :execute s:Edit('tabedit',)") +call s:command("-bar -bang -nargs=? -count -complete=customlist,s:EditComplete Gread :execute s:Edit((! && ? '' : ).'read',)") + +" }}}1 +" Gwrite, Gwq {{{1 + +call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gwrite :execute s:Write(0,)") +call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gw :execute s:Write(0,)") +call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gwq :execute s:Wq(0,)") + +function! s:Write(force,...) abort + if exists('b:fugitive_commit_arguments') + return 'write|bdelete' + elseif expand('%:t') == 'COMMIT_EDITMSG' && $GIT_INDEX_FILE != '' + return 'wq' + elseif s:buffer().type() == 'index' + return 'Gcommit' + endif + let mytab = tabpagenr() + let mybufnr = bufnr('') + let path = a:0 ? a:1 : s:buffer().path() + if path =~# '^:\d\>' + return 'write'.(a:force ? '! ' : ' ').s:fnameescape(s:repo().translate(s:buffer().expand(path))) + endif + let always_permitted = (s:buffer().path() ==# path && s:buffer().commit() =~# '^0\=$') + if !always_permitted && !a:force && s:repo().git_chomp_in_tree('diff','--name-status','HEAD','--',path) . s:repo().git_chomp_in_tree('ls-files','--others','--',path) !=# '' + let v:errmsg = 'fugitive: file has uncommitted changes (use ! to override)' + return 'echoerr v:errmsg' + endif + let file = s:repo().translate(path) + let treebufnr = 0 + for nr in range(1,bufnr('$')) + if fnamemodify(bufname(nr),':p') ==# file + let treebufnr = nr + endif + endfor + + if treebufnr > 0 && treebufnr != bufnr('') + let temp = tempname() + silent execute '%write '.temp + for tab in [mytab] + range(1,tabpagenr('$')) + for winnr in range(1,tabpagewinnr(tab,'$')) + if tabpagebuflist(tab)[winnr-1] == treebufnr + execute 'tabnext '.tab + if winnr != winnr() + execute winnr.'wincmd w' + let restorewinnr = 1 + endif + try + let lnum = line('.') + let last = line('$') + silent execute '$read '.temp + silent execute '1,'.last.'delete_' + silent write! + silent execute lnum + let did = 1 + finally + if exists('restorewinnr') + wincmd p + endif + execute 'tabnext '.mytab + endtry + endif + endfor + endfor + if !exists('did') + call writefile(readfile(temp,'b'),file,'b') + endif + else + execute 'write! '.s:fnameescape(s:repo().translate(path)) + endif + + if a:force + let error = s:repo().git_chomp_in_tree('add', '--force', file) + else + let error = s:repo().git_chomp_in_tree('add', file) + endif + if v:shell_error + let v:errmsg = 'fugitive: '.error + return 'echoerr v:errmsg' + endif + if s:buffer().path() ==# path && s:buffer().commit() =~# '^\d$' + set nomodified + endif + + let one = s:repo().translate(':1:'.path) + let two = s:repo().translate(':2:'.path) + let three = s:repo().translate(':3:'.path) + for nr in range(1,bufnr('$')) + if bufloaded(nr) && !getbufvar(nr,'&modified') && (bufname(nr) == one || bufname(nr) == two || bufname(nr) == three) + execute nr.'bdelete' + endif + endfor + + unlet! restorewinnr + let zero = s:repo().translate(':0:'.path) + for tab in range(1,tabpagenr('$')) + for winnr in range(1,tabpagewinnr(tab,'$')) + let bufnr = tabpagebuflist(tab)[winnr-1] + let bufname = bufname(bufnr) + if bufname ==# zero && bufnr != mybufnr + execute 'tabnext '.tab + if winnr != winnr() + execute winnr.'wincmd w' + let restorewinnr = 1 + endif + try + let lnum = line('.') + let last = line('$') + silent $read `=file` + silent execute '1,'.last.'delete_' + silent execute lnum + set nomodified + diffupdate + finally + if exists('restorewinnr') + wincmd p + endif + execute 'tabnext '.mytab + endtry + break + endif + endfor + endfor + call fugitive#reload_status() + return 'checktime' +endfunction + +function! s:Wq(force,...) abort + let bang = a:force ? '!' : '' + if exists('b:fugitive_commit_arguments') + return 'wq'.bang + endif + let result = call(s:function('s:Write'),[a:force]+a:000) + if result =~# '^\%(write\|wq\|echoerr\)' + return s:sub(result,'^write','wq') + else + return result.'|quit'.bang + endif +endfunction + +" }}}1 +" Gdiff {{{1 + +call s:command("-bang -bar -nargs=? -complete=customlist,s:EditComplete Gdiff :execute s:Diff(0,)") +call s:command("-bar -nargs=? -complete=customlist,s:EditComplete Gvdiff :execute s:Diff(0,)") +call s:command("-bar -nargs=? -complete=customlist,s:EditComplete Gsdiff :execute s:Diff(1,)") + +augroup fugitive_diff + autocmd! + autocmd BufWinLeave * if s:diff_window_count() == 2 && &diff && getbufvar(+expand(''), 'git_dir') !=# '' | call s:diff_off_all(getbufvar(+expand(''), 'git_dir')) | endif + autocmd BufWinEnter * if s:diff_window_count() == 1 && &diff && getbufvar(+expand(''), 'git_dir') !=# '' | diffoff | endif +augroup END + +function! s:diff_window_count() + let c = 0 + for nr in range(1,winnr('$')) + let c += getwinvar(nr,'&diff') + endfor + return c +endfunction + +function! s:diff_off_all(dir) + for nr in range(1,winnr('$')) + if getwinvar(nr,'&diff') + if nr != winnr() + execute nr.'wincmd w' + let restorewinnr = 1 + endif + if exists('b:git_dir') && b:git_dir ==# a:dir + diffoff + endif + if exists('restorewinnr') + wincmd p + endif + endif + endfor +endfunction + +function! s:buffer_compare_age(commit) dict abort + let scores = {':0': 1, ':1': 2, ':2': 3, ':': 4, ':3': 5} + let my_score = get(scores,':'.self.commit(),0) + let their_score = get(scores,':'.a:commit,0) + if my_score || their_score + return my_score < their_score ? -1 : my_score != their_score + elseif self.commit() ==# a:commit + return 0 + endif + let base = self.repo().git_chomp('merge-base',self.commit(),a:commit) + if base ==# self.commit() + return -1 + elseif base ==# a:commit + return 1 + endif + let my_time = +self.repo().git_chomp('log','--max-count=1','--pretty=format:%at',self.commit()) + let their_time = +self.repo().git_chomp('log','--max-count=1','--pretty=format:%at',a:commit) + return my_time < their_time ? -1 : my_time != their_time +endfunction + +call s:add_methods('buffer',['compare_age']) + +function! s:Diff(bang,...) abort + let split = a:bang ? 'split' : 'vsplit' + if exists(':DiffGitCached') + return 'DiffGitCached' + elseif (!a:0 || a:1 == ':') && s:buffer().commit() =~# '^[0-1]\=$' && s:repo().git_chomp_in_tree('ls-files', '--unmerged', '--', s:buffer().path()) !=# '' + let nr = bufnr('') + execute 'leftabove '.split.' `=fugitive#buffer().repo().translate(s:buffer().expand('':2''))`' + execute 'nnoremap dp :diffput '.nr.'diffupdate' + diffthis + wincmd p + execute 'rightbelow '.split.' `=fugitive#buffer().repo().translate(s:buffer().expand('':3''))`' + execute 'nnoremap dp :diffput '.nr.'diffupdate' + diffthis + wincmd p + diffthis + return '' + elseif a:0 + if a:1 ==# '' + return '' + elseif a:1 ==# '/' + let file = s:buffer().path('/') + elseif a:1 ==# ':' + let file = s:buffer().path(':0:') + elseif a:1 =~# '^:/.' + try + let file = s:repo().rev_parse(a:1).s:buffer().path(':') + catch /^fugitive:/ + return 'echoerr v:errmsg' + endtry + else + let file = s:buffer().expand(a:1) + endif + if file !~# ':' && file !~# '^/' && s:repo().git_chomp('cat-file','-t',file) =~# '^\%(tag\|commit\)$' + let file = file.s:buffer().path(':') + endif + else + let file = s:buffer().path(s:buffer().commit() == '' ? ':0:' : '/') + endif + try + let spec = s:repo().translate(file) + let commit = matchstr(spec,'\C[^:/]//\zs\x\+') + if s:buffer().compare_age(commit) < 0 + execute 'rightbelow '.split.' `=spec`' + else + execute 'leftabove '.split.' `=spec`' + endif + diffthis + wincmd p + diffthis + return '' + catch /^fugitive:/ + return 'echoerr v:errmsg' + endtry +endfunction + +" }}}1 +" Gmove, Gremove {{{1 + +function! s:Move(force,destination) + if a:destination =~# '^/' + let destination = a:destination[1:-1] + else + let destination = fnamemodify(s:sub(a:destination,'[%#]%(:\w)*','\=expand(submatch(0))'),':p') + if destination[0:strlen(s:repo().tree())] ==# s:repo().tree('') + let destination = destination[strlen(s:repo().tree('')):-1] + endif + endif + if isdirectory(s:buffer().name()) + " Work around Vim parser idiosyncrasy + let discarded = s:buffer().setvar('&swapfile',0) + endif + let message = call(s:repo().git_chomp_in_tree,['mv']+(a:force ? ['-f'] : [])+['--', s:buffer().path(), destination], s:repo()) + if v:shell_error + let v:errmsg = 'fugitive: '.message + return 'echoerr v:errmsg' + endif + let destination = s:repo().tree(destination) + if isdirectory(destination) + let destination = fnamemodify(s:sub(destination,'/$','').'/'.expand('%:t'),':.') + endif + call fugitive#reload_status() + if s:buffer().commit() == '' + if isdirectory(destination) + return 'edit '.s:fnameescape(destination) + else + return 'saveas! '.s:fnameescape(destination) + endif + else + return 'file '.s:fnameescape(s:repo().translate(':0:'.destination) + endif +endfunction + +function! s:MoveComplete(A,L,P) + if a:A =~ '^/' + return s:repo().superglob(a:A) + else + let matches = split(glob(a:A.'*'),"\n") + call map(matches,'v:val !~ "/$" && isdirectory(v:val) ? v:val."/" : v:val') + return matches + endif +endfunction + +function! s:Remove(force) + if s:buffer().commit() ==# '' + let cmd = ['rm'] + elseif s:buffer().commit() ==# '0' + let cmd = ['rm','--cached'] + else + let v:errmsg = 'fugitive: rm not supported here' + return 'echoerr v:errmsg' + endif + if a:force + let cmd += ['--force'] + endif + let message = call(s:repo().git_chomp_in_tree,cmd+['--',s:buffer().path()],s:repo()) + if v:shell_error + let v:errmsg = 'fugitive: '.s:sub(message,'error:.*\zs\n\(.*-f.*',' (add ! to force)') + return 'echoerr '.string(v:errmsg) + else + call fugitive#reload_status() + return 'bdelete'.(a:force ? '!' : '') + endif +endfunction + +augroup fugitive_remove + autocmd! + autocmd User Fugitive if s:buffer().commit() =~# '^0\=$' | + \ exe "command! -buffer -bar -bang -nargs=1 -complete=customlist,s:MoveComplete Gmove :execute s:Move(0,)" | + \ exe "command! -buffer -bar -bang Gremove :execute s:Remove(0)" | + \ endif +augroup END + +" }}}1 +" Gblame {{{1 + +augroup fugitive_blame + autocmd! + autocmd BufReadPost *.fugitiveblame setfiletype fugitiveblame + autocmd FileType fugitiveblame setlocal nomodeline | if exists('b:git_dir') | let &l:keywordprg = s:repo().keywordprg() | endif + autocmd Syntax fugitiveblame call s:BlameSyntax() + autocmd User Fugitive if s:buffer().type('file', 'blob') | exe "command! -buffer -bar -bang -range=0 -nargs=* Gblame :execute s:Blame(0,,,,[])" | endif +augroup END + +function! s:Blame(bang,line1,line2,count,args) abort + try + if s:buffer().path() == '' + call s:throw('file or blob required') + endif + if filter(copy(a:args),'v:val !~# "^\\%(--root\|--show-name\\|-\\=\\%([ltwfs]\\|[MC]\\d*\\)\\+\\)$"') != [] + call s:throw('unsupported option') + endif + call map(a:args,'s:sub(v:val,"^\\ze[^-]","-")') + let git_dir = s:repo().dir() + let cmd = ['--no-pager', 'blame', '--show-number'] + a:args + if s:buffer().commit() =~# '\D\|..' + let cmd += [s:buffer().commit()] + else + let cmd += ['--contents', '-'] + endif + let basecmd = call(s:repo().git_command,cmd+['--',s:buffer().path()],s:repo()) + try + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + if !s:repo().bare() + let dir = getcwd() + execute cd.'`=s:repo().tree()`' + endif + if a:count + execute 'write !'.substitute(basecmd,' blame ',' blame -L '.a:line1.','.a:line2.' ','g') + else + let error = tempname() + let temp = error.'.fugitiveblame' + if &shell =~# 'csh' + silent! execute '%write !('.basecmd.' > '.temp.') >& '.error + else + silent! execute '%write !'.basecmd.' > '.temp.' 2> '.error + endif + if exists('l:dir') + execute cd.'`=dir`' + unlet dir + endif + if v:shell_error + call s:throw(join(readfile(error),"\n")) + endif + let bufnr = bufnr('') + let restore = 'call setwinvar(bufwinnr('.bufnr.'),"&scrollbind",0)' + if &l:wrap + let restore .= '|call setwinvar(bufwinnr('.bufnr.'),"&wrap",1)' + endif + if &l:foldenable + let restore .= '|call setwinvar(bufwinnr('.bufnr.'),"&foldenable",1)' + endif + let winnr = winnr() + windo set noscrollbind + exe winnr.'wincmd w' + setlocal scrollbind nowrap nofoldenable + let top = line('w0') + &scrolloff + let current = line('.') + exe 'leftabove vsplit '.temp + let b:git_dir = git_dir + let b:fugitive_type = 'blame' + let b:fugitive_blamed_bufnr = bufnr + let w:fugitive_restore = restore + let b:fugitive_blame_arguments = join(a:args,' ') + call s:Detect(expand('%:p')) + execute top + normal! zt + execute current + execute "vertical resize ".(match(getline('.'),'\s\+\d\+)')+1) + setlocal nomodified nomodifiable bufhidden=delete nonumber scrollbind nowrap foldcolumn=0 nofoldenable filetype=fugitiveblame + nnoremap q :bdelete + nnoremap :exe BlameJump('') + nnoremap P :exe BlameJump('^'.v:count1) + nnoremap ~ :exe BlameJump('~'.v:count1) + nnoremap o :exe Edit((&splitbelow ? "botright" : "topleft")." split", matchstr(getline('.'),'\x\+')) + nnoremap O :exe Edit("tabedit", matchstr(getline('.'),'\x\+')) + syncbind + endif + finally + if exists('l:dir') + execute cd.'`=dir`' + endif + endtry + return '' + catch /^fugitive:/ + return 'echoerr v:errmsg' + endtry +endfunction + +function! s:BlameJump(suffix) abort + let commit = matchstr(getline('.'),'^\^\=\zs\x\+') + if commit =~# '^0\+$' + let commit = ':0' + endif + let lnum = matchstr(getline('.'),'\d\+\ze\s\+[([:digit:]]') + let path = matchstr(getline('.'),'^\^\=\zs\x\+\s\+\zs.\{-\}\ze\s*\d\+ ') + if path ==# '' + let path = s:buffer(b:fugitive_blamed_bufnr).path() + endif + let args = b:fugitive_blame_arguments + let offset = line('.') - line('w0') + let bufnr = bufnr('%') + let winnr = bufwinnr(b:fugitive_blamed_bufnr) + if winnr > 0 + exe winnr.'wincmd w' + endif + execute s:Edit('edit',commit.a:suffix.':'.path) + if winnr > 0 + exe bufnr.'bdelete' + endif + execute 'Gblame '.args + execute lnum + let delta = line('.') - line('w0') - offset + if delta > 0 + execute 'norm! 'delta."\" + elseif delta < 0 + execute 'norm! '(-delta)."\" + endif + syncbind + return '' +endfunction + +function! s:BlameSyntax() abort + let b:current_syntax = 'fugitiveblame' + syn match FugitiveblameBoundary "^\^" + syn match FugitiveblameBlank "^\s\+\s\@=" nextgroup=FugitiveblameAnnotation,fugitiveblameOriginalFile,FugitiveblameOriginalLineNumber skipwhite + syn match FugitiveblameHash "\%(^\^\=\)\@<=\x\{7,40\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameOriginalLineNumber,fugitiveblameOriginalFile skipwhite + syn match FugitiveblameUncommitted "\%(^\^\=\)\@<=0\{7,40\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameOriginalLineNumber,fugitiveblameOriginalFile skipwhite + syn region FugitiveblameAnnotation matchgroup=FugitiveblameDelimiter start="(" end="\%( \d\+\)\@<=)" contained keepend oneline + syn match FugitiveblameTime "[0-9:/+-][0-9:/+ -]*[0-9:/+-]\%( \+\d\+)\)\@=" contained containedin=FugitiveblameAnnotation + syn match FugitiveblameLineNumber " \@<=\d\+)\@=" contained containedin=FugitiveblameAnnotation + syn match FugitiveblameOriginalFile " \%(\f\+\D\@<=\|\D\@=\f\+\)\%(\%(\s\+\d\+\)\=\s\%((\|\s*\d\+)\)\)\@=" contained nextgroup=FugitiveblameOriginalLineNumber,FugitiveblameAnnotation skipwhite + syn match FugitiveblameOriginalLineNumber " \@<=\d\+\%(\s(\)\@=" contained nextgroup=FugitiveblameAnnotation skipwhite + syn match FugitiveblameOriginalLineNumber " \@<=\d\+\%(\s\+\d\+)\)\@=" contained nextgroup=FugitiveblameShort skipwhite + syn match FugitiveblameShort "\d\+)" contained contains=FugitiveblameLineNumber + syn match FugitiveblameNotCommittedYet "(\@<=Not Committed Yet\>" contained containedin=FugitiveblameAnnotation + hi def link FugitiveblameBoundary Keyword + hi def link FugitiveblameHash Identifier + hi def link FugitiveblameUncommitted Function + hi def link FugitiveblameTime PreProc + hi def link FugitiveblameLineNumber Number + hi def link FugitiveblameOriginalFile String + hi def link FugitiveblameOriginalLineNumber Float + hi def link FugitiveblameShort FugitiveblameDelimiter + hi def link FugitiveblameDelimiter Delimiter + hi def link FugitiveblameNotCommittedYet Comment +endfunction + +" }}}1 +" Gbrowse {{{1 + +call s:command("-bar -bang -count=0 -nargs=? -complete=customlist,s:EditComplete Gbrowse :execute s:Browse(0,,,)") + +function! s:Browse(bang,line1,count,...) abort + try + let rev = a:0 ? substitute(a:1,'@[[:alnum:]_-]*\%(://.\{-\}\)\=$','','') : '' + if rev ==# '' + let expanded = s:buffer().rev() + elseif rev ==# ':' + let expanded = s:buffer().path('/') + else + let expanded = s:buffer().expand(rev) + endif + let full = s:repo().translate(expanded) + let commit = '' + if full =~# '^fugitive://' + let commit = matchstr(full,'://.*//\zs\w\+') + let path = matchstr(full,'://.*//\w\+\zs/.*') + if commit =~ '..' + let type = s:repo().git_chomp('cat-file','-t',commit.s:sub(path,'^/',':')) + else + let type = 'blob' + endif + let path = path[1:-1] + elseif s:repo().bare() + let path = '.git/' . full[strlen(s:repo().dir())+1:-1] + let type = '' + else + let path = full[strlen(s:repo().tree())+1:-1] + if path =~# '^\.git/' + let type = '' + elseif isdirectory(full) + let type = 'tree' + else + let type = 'blob' + endif + endif + if path =~# '^\.git/.*HEAD' && filereadable(s:repo().dir(path[5:-1])) + let body = readfile(s:repo().dir(path[5:-1]))[0] + if body =~# '^\x\{40\}$' + let commit = body + let type = 'commit' + let path = '' + elseif body =~# '^ref: refs/' + let path = '.git/' . matchstr(body,'ref: \zs.*') + endif + endif + + if a:0 && a:1 =~# '@[[:alnum:]_-]*\%(://.\{-\}\)\=$' + let remote = matchstr(a:1,'@\zs[[:alnum:]_-]\+\%(://.\{-\}\)\=$') + elseif path =~# '^\.git/refs/remotes/.' + let remote = matchstr(path,'^\.git/refs/remotes/\zs[^/]\+') + else + let remote = 'origin' + let branch = matchstr(rev,'^[[:alnum:]/._-]\+\ze[:^~@]') + if branch ==# '' && path =~# '^\.git/refs/\w\+/' + let branch = s:sub(path,'^\.git/refs/\w+/','') + endif + if filereadable(s:repo().dir('refs/remotes/'.branch)) + let remote = matchstr(branch,'[^/]\+') + let rev = rev[strlen(remote)+1:-1] + else + if branch ==# '' + let branch = matchstr(s:repo().head_ref(),'\\)' + return root . '/admin' + elseif path =~# '^\.git\>' + return root + endif + if a:rev =~# '^[[:alnum:]._-]\+:' + let commit = matchstr(a:rev,'^[^:]*') + elseif a:commit =~# '^\d\=$' + let local = matchstr(a:repo.head_ref(),'\' + return root + endif + let url = root + if a:commit =~# '^\x\{40\}$' + if a:type ==# 'commit' + let url .= ';a=commit' + endif + let url .= ';h=' . a:repo.rev_parse(a:commit . (a:path == '' ? '' : ':' . a:path)) + else + if a:type ==# 'blob' + let tmp = tempname() + silent execute 'write !'.a:repo.git_command('hash-object','-w','--stdin').' > '.tmp + let url .= ';h=' . readfile(tmp)[0] + else + try + let url .= ';h=' . a:repo.rev_parse((a:commit == '' ? 'HEAD' : ':' . a:commit) . ':' . a:path) + catch /^fugitive:/ + call s:throw('fugitive: cannot browse uncommitted file') + endtry + endif + let root .= ';hb=' . matchstr(a:repo.head_ref(),'[^ ]\+$') + endif + if a:path !=# '' + let url .= ';f=' . a:path + endif + if a:0 && a:1 + let url .= '#l' . a:1 + endif + return url +endfunction + +" }}}1 +" File access {{{1 + +function! s:ReplaceCmd(cmd,...) abort + let fn = bufname('') + let tmp = tempname() + let aw = &autowrite + let prefix = '' + try + if a:0 && a:1 != '' + if &shell =~# 'cmd' + let old_index = $GIT_INDEX_FILE + let $GIT_INDEX_FILE = a:1 + else + let prefix = 'env GIT_INDEX_FILE='.s:shellesc(a:1).' ' + endif + endif + set noautowrite + silent exe '!'.escape(prefix.a:cmd,'%#').' > '.tmp + finally + let &autowrite = aw + if exists('old_index') + let $GIT_INDEX_FILE = old_index + endif + endtry + silent exe 'keepalt file '.tmp + silent edit! + silent exe 'keepalt file '.s:fnameescape(fn) + call delete(tmp) + silent exe 'doau BufReadPost '.s:fnameescape(fn) +endfunction + +function! s:BufReadIndex() + if !exists('b:fugitive_display_format') + let b:fugitive_display_format = filereadable(expand('%').'.lock') + endif + let b:fugitive_display_format = b:fugitive_display_format % 2 + let b:fugitive_type = 'index' + try + let b:git_dir = s:repo().dir() + setlocal noro ma + if fnamemodify($GIT_INDEX_FILE !=# '' ? $GIT_INDEX_FILE : b:git_dir . '/index', ':p') ==# expand('%:p') + let index = '' + else + let index = expand('%:p') + endif + if b:fugitive_display_format + call s:ReplaceCmd(s:repo().git_command('ls-files','--stage'),index) + set ft=git nospell + else + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' + let dir = getcwd() + try + execute cd.'`=s:repo().tree()`' + call s:ReplaceCmd(s:repo().git_command('status'),index) + finally + execute cd.'`=dir`' + endtry + set ft=gitcommit + endif + setlocal ro noma nomod nomodeline bufhidden=delete + nnoremap a :let b:fugitive_display_format += 1exe BufReadIndex() + nnoremap i :let b:fugitive_display_format -= 1exe BufReadIndex() + nnoremap D :execute StageDiff() + nnoremap dd :execute StageDiff() + nnoremap dh :execute StageDiff('Gsdiff') + nnoremap ds :execute StageDiff('Gsdiff') + nnoremap dv :execute StageDiff() + nnoremap - :execute StageToggle(line('.'),line('.')+v:count1-1) + xnoremap - :execute StageToggle(line("'<"),line("'>")) + nnoremap p :execute StagePatch(line('.'),line('.')+v:count1-1) + xnoremap p :execute StagePatch(line("'<"),line("'>")) + nnoremap :call search('^#\t.*','W'). + nnoremap :call search('^#\t.*','Wbe'). + call s:JumpInit() + nunmap P + nunmap ~ + nnoremap C :Gcommit + catch /^fugitive:/ + return 'echoerr v:errmsg' + endtry +endfunction + +function! s:FileRead() + try + let repo = s:repo(s:ExtractGitDir(expand(''))) + let path = s:sub(s:sub(matchstr(expand(''),'fugitive://.\{-\}//\zs.*'),'/',':'),'^\d:',':&') + let hash = repo.rev_parse(path) + if path =~ '^:' + let type = 'blob' + else + let type = repo.git_chomp('cat-file','-t',hash) + endif + " TODO: use count, if possible + return "read !".escape(repo.git_command('cat-file',type,hash),'%#\') + catch /^fugitive:/ + return 'echoerr v:errmsg' + endtry +endfunction + +function! s:BufReadIndexFile() + try + let b:fugitive_type = 'blob' + let b:git_dir = s:repo().dir() + call s:ReplaceCmd(s:repo().git_command('cat-file','blob',s:buffer().sha1())) + return '' + catch /^fugitive: rev-parse/ + silent exe 'doau BufNewFile '.s:fnameescape(bufname('')) + return '' + catch /^fugitive:/ + return 'echoerr v:errmsg' + endtry +endfunction + +function! s:BufWriteIndexFile() + let tmp = tempname() + try + let path = matchstr(expand(''),'//\d/\zs.*') + let stage = matchstr(expand(''),'//\zs\d') + silent execute 'write !'.s:repo().git_command('hash-object','-w','--stdin').' > '.tmp + let sha1 = readfile(tmp)[0] + let old_mode = matchstr(s:repo().git_chomp('ls-files','--stage',path),'^\d\+') + if old_mode == '' + let old_mode = executable(s:repo().tree(path)) ? '100755' : '100644' + endif + let info = old_mode.' '.sha1.' '.stage."\t".path + call writefile([info],tmp) + if has('win32') + let error = system('type '.tmp.'|'.s:repo().git_command('update-index','--index-info')) + else + let error = system(s:repo().git_command('update-index','--index-info').' < '.tmp) + endif + if v:shell_error == 0 + setlocal nomodified + silent execute 'doautocmd BufWritePost '.s:fnameescape(expand('%:p')) + call fugitive#reload_status() + return '' + else + return 'echoerr '.string('fugitive: '.error) + endif + finally + call delete(tmp) + endtry +endfunction + +function! s:BufReadObject() + try + setlocal noro ma + let b:git_dir = s:repo().dir() + let hash = s:buffer().sha1() + if !exists("b:fugitive_type") + let b:fugitive_type = s:repo().git_chomp('cat-file','-t',hash) + endif + if b:fugitive_type !~# '^\%(tag\|commit\|tree\|blob\)$' + return "echoerr 'fugitive: unrecognized git type'" + endif + let firstline = getline('.') + if !exists('b:fugitive_display_format') && b:fugitive_type != 'blob' + let b:fugitive_display_format = +getbufvar('#','fugitive_display_format') + endif + + let pos = getpos('.') + silent %delete + setlocal endofline + + if b:fugitive_type == 'tree' + let b:fugitive_display_format = b:fugitive_display_format % 2 + if b:fugitive_display_format + call s:ReplaceCmd(s:repo().git_command('ls-tree',hash)) + else + call s:ReplaceCmd(s:repo().git_command('show',hash)) + endif + elseif b:fugitive_type == 'tag' + let b:fugitive_display_format = b:fugitive_display_format % 2 + if b:fugitive_display_format + call s:ReplaceCmd(s:repo().git_command('cat-file',b:fugitive_type,hash)) + else + call s:ReplaceCmd(s:repo().git_command('cat-file','-p',hash)) + endif + elseif b:fugitive_type == 'commit' + let b:fugitive_display_format = b:fugitive_display_format % 2 + if b:fugitive_display_format + call s:ReplaceCmd(s:repo().git_command('cat-file',b:fugitive_type,hash)) + else + call s:ReplaceCmd(s:repo().git_command('show','--pretty=format:tree %T%nparent %P%nauthor %an <%ae> %ad%ncommitter %cn <%ce> %cd%nencoding %e%n%n%s%n%n%b',hash)) + call search('^parent ') + if getline('.') ==# 'parent ' + silent delete_ + else + silent s/\%(^parent\)\@\)\=$','W',line('.')+3) + silent delete_ + end + 1 + endif + elseif b:fugitive_type ==# 'blob' + call s:ReplaceCmd(s:repo().git_command('cat-file',b:fugitive_type,hash)) + endif + call setpos('.',pos) + setlocal ro noma nomod nomodeline + if b:fugitive_type !=# 'blob' + set filetype=git + nnoremap a :let b:fugitive_display_format += v:count1exe BufReadObject() + nnoremap i :let b:fugitive_display_format -= v:count1exe BufReadObject() + else + call s:JumpInit() + endif + + return '' + catch /^fugitive:/ + return 'echoerr v:errmsg' + endtry +endfunction + +augroup fugitive_files + autocmd! + autocmd BufReadCmd *.git/index exe s:BufReadIndex() + autocmd BufReadCmd *.git/*index*.lock exe s:BufReadIndex() + autocmd FileReadCmd fugitive://**//[0-3]/** exe s:FileRead() + autocmd BufReadCmd fugitive://**//[0-3]/** exe s:BufReadIndexFile() + autocmd BufWriteCmd fugitive://**//[0-3]/** exe s:BufWriteIndexFile() + autocmd BufReadCmd fugitive://**//[0-9a-f][0-9a-f]* exe s:BufReadObject() + autocmd FileReadCmd fugitive://**//[0-9a-f][0-9a-f]* exe s:FileRead() + autocmd FileType git call s:JumpInit() +augroup END + +" }}}1 +" Go to file {{{1 + +function! s:JumpInit() abort + nnoremap :exe GF("edit") + if !&modifiable + nnoremap o :exe GF("split") + nnoremap O :exe GF("tabedit") + nnoremap P :exe Edit('edit',buffer().commit().'^'.v:count1.buffer().path(':')) + nnoremap ~ :exe Edit('edit',buffer().commit().'~'.v:count1.buffer().path(':')) + nnoremap C :exe Edit('edit',buffer().containing_commit()) + nnoremap cc :exe Edit('edit',buffer().containing_commit()) + nnoremap co :exe Edit('split',buffer().containing_commit()) + nnoremap cO :exe Edit('tabedit',buffer().containing_commit()) + nnoremap cp :exe Edit('pedit',buffer().containing_commit()) + endif +endfunction + +function! s:GF(mode) abort + try + let buffer = s:buffer() + let myhash = buffer.sha1() + + if buffer.type('tree') + let showtree = (getline(1) =~# '^tree ' && getline(2) == "") + if showtree && line('.') == 1 + return "" + elseif showtree && line('.') > 2 + return s:Edit(a:mode,buffer.commit().':'.s:buffer().path().(buffer.path() =~# '^$\|/$' ? '' : '/').s:sub(getline('.'),'/$','')) + elseif getline('.') =~# '^\d\{6\} \l\{3,8\} \x\{40\}\t' + return s:Edit(a:mode,buffer.commit().':'.s:buffer().path().(buffer.path() =~# '^$\|/$' ? '' : '/').s:sub(matchstr(getline('.'),'\t\zs.*'),'/$','')) + endif + + elseif buffer.type('blob') + let ref = expand("") + try + let sha1 = buffer.repo().rev_parse(ref) + catch /^fugitive:/ + endtry + if exists('sha1') + return s:Edit(a:mode,ref) + endif + + else + + " Index + if getline('.') =~# '^\d\{6\} \x\{40\} \d\t' + let ref = matchstr(getline('.'),'\x\{40\}') + let file = ':'.s:sub(matchstr(getline('.'),'\d\t.*'),'\t',':') + return s:Edit(a:mode,file) + + elseif getline('.') =~# '^#\trenamed:.* -> ' + let file = '/'.matchstr(getline('.'),' -> \zs.*') + return s:Edit(a:mode,file) + elseif getline('.') =~# '^#\t[[:alpha:] ]\+: *.' + let file = '/'.matchstr(getline('.'),': *\zs.\{-\}\ze\%( (new commits)\)\=$') + return s:Edit(a:mode,file) + elseif getline('.') =~# '^#\t.' + let file = '/'.matchstr(getline('.'),'#\t\zs.*') + return s:Edit(a:mode,file) + elseif getline('.') =~# ': needs merge$' + let file = '/'.matchstr(getline('.'),'.*\ze: needs merge$') + return s:Edit(a:mode,file).'|Gdiff' + + elseif getline('.') ==# '# Not currently on any branch.' + return s:Edit(a:mode,'HEAD') + elseif getline('.') =~# '^# On branch ' + let file = 'refs/heads/'.getline('.')[12:] + return s:Edit(a:mode,file) + elseif getline('.') =~# "^# Your branch .*'" + let file = matchstr(getline('.'),"'\\zs\\S\\+\\ze'") + return s:Edit(a:mode,file) + endif + + let showtree = (getline(1) =~# '^tree ' && getline(2) == "") + + if getline('.') =~# '^ref: ' + let ref = strpart(getline('.'),5) + + elseif getline('.') =~# '^parent \x\{40\}\>' + let ref = matchstr(getline('.'),'\x\{40\}') + let line = line('.') + let parent = 0 + while getline(line) =~# '^parent ' + let parent += 1 + let line -= 1 + endwhile + return s:Edit(a:mode,ref) + + elseif getline('.') =~ '^tree \x\{40\}$' + let ref = matchstr(getline('.'),'\x\{40\}') + if s:repo().rev_parse(myhash.':') == ref + let ref = myhash.':' + endif + return s:Edit(a:mode,ref) + + elseif getline('.') =~# '^object \x\{40\}$' && getline(line('.')+1) =~ '^type \%(commit\|tree\|blob\)$' + let ref = matchstr(getline('.'),'\x\{40\}') + let type = matchstr(getline(line('.')+1),'type \zs.*') + + elseif getline('.') =~# '^\l\{3,8\} '.myhash.'$' + return '' + + elseif getline('.') =~# '^\l\{3,8\} \x\{40\}\>' + let ref = matchstr(getline('.'),'\x\{40\}') + echoerr "warning: unknown context ".matchstr(getline('.'),'^\l*') + + elseif getline('.') =~# '^[+-]\{3\} [ab/]' + let ref = getline('.')[4:] + + elseif getline('.') =~# '^rename from ' + let ref = 'a/'.getline('.')[12:] + elseif getline('.') =~# '^rename to ' + let ref = 'b/'.getline('.')[10:] + + elseif getline('.') =~# '^diff --git \%(a/.*\|/dev/null\) \%(b/.*\|/dev/null\)' + let dref = matchstr(getline('.'),'\Cdiff --git \zs\%(a/.*\|/dev/null\)\ze \%(b/.*\|/dev/null\)') + let ref = matchstr(getline('.'),'\Cdiff --git \%(a/.*\|/dev/null\) \zs\%(b/.*\|/dev/null\)') + let dcmd = 'Gdiff' + + elseif getline('.') =~# '^index ' && getline(line('.')-1) =~# '^diff --git \%(a/.*\|/dev/null\) \%(b/.*\|/dev/null\)' + let line = getline(line('.')-1) + let dref = matchstr(line,'\Cdiff --git \zs\%(a/.*\|/dev/null\)\ze \%(b/.*\|/dev/null\)') + let ref = matchstr(line,'\Cdiff --git \%(a/.*\|/dev/null\) \zs\%(b/.*\|/dev/null\)') + let dcmd = 'Gdiff!' + + elseif line('$') == 1 && getline('.') =~ '^\x\{40\}$' + let ref = getline('.') + else + let ref = '' + endif + + if myhash ==# '' + let ref = s:sub(ref,'^a/','HEAD:') + let ref = s:sub(ref,'^b/',':0:') + if exists('dref') + let dref = s:sub(dref,'^a/','HEAD:') + endif + else + let ref = s:sub(ref,'^a/',myhash.'^:') + let ref = s:sub(ref,'^b/',myhash.':') + if exists('dref') + let dref = s:sub(dref,'^a/',myhash.'^:') + endif + endif + + if ref ==# '/dev/null' + " Empty blob + let ref = 'e69de29bb2d1d6434b8b29ae775ad8c2e48c5391' + endif + + if exists('dref') + return s:Edit(a:mode,ref) . '|'.dcmd.' '.s:fnameescape(dref) + elseif ref != "" + return s:Edit(a:mode,ref) + endif + + endif + return '' + catch /^fugitive:/ + return 'echoerr v:errmsg' + endtry +endfunction + +" }}}1 +" Statusline {{{1 + +function! s:repo_head_ref() dict abort + return readfile(s:repo().dir('HEAD'))[0] +endfunction + +call s:add_methods('repo',['head_ref']) + +function! fugitive#statusline(...) + if !exists('b:git_dir') + return '' + endif + let status = '' + if s:buffer().commit() != '' + let status .= ':' . s:buffer().commit()[0:7] + endif + let head = s:repo().head_ref() + if head =~# '^ref: ' + let status .= s:sub(head,'^ref: %(refs/%(heads/|remotes/|tags/)=)=','(').')' + elseif head =~# '^\x\{40\}$' + let status .= '('.head[0:7].')' + endif + if &statusline =~# '%[MRHWY]' && &statusline !~# '%[mrhwy]' + return ',GIT'.status + else + return '[Git'.status.']' + endif +endfunction + +function! s:repo_config(conf) dict abort + return matchstr(system(s:repo().git_command('config').' '.a:conf),"[^\r\n]*") +endfun + +function! s:repo_user() dict abort + let username = s:repo().config('user.name') + let useremail = s:repo().config('user.email') + return username.' <'.useremail.'>' +endfun + +call s:add_methods('repo',['config', 'user']) + +" }}}1 + +" vim:set ft=vim ts=8 sw=2 sts=2: diff --git a/.vimrc b/.vimrc new file mode 100644 index 0000000..6efc2bd --- /dev/null +++ b/.vimrc @@ -0,0 +1,285 @@ +" ================================================================== +" $HOME/.vimrc +" Author: Dongsu Park +" ================================================================== +version 7.0 + +" ============================ +" Loading general setup files +" ============================ + +if has("unix") + " Source the setup file for all users: + let FILE=expand("~/.vimrc.foralls") + if filereadable(FILE) + exe "source " . FILE + endif +endif + +" ============== +" General settings +" ============== + +colorscheme desert +filetype on +filetype plugin on +filetype indent on +syntax on + +:if &term == "xterm" +: set t_kb= +: fixdel +:endif + +" =================== +" Setting of Options +" =================== + +set noautoindent +set background=dark +set backspace=indent,eol,start +set nocindent +set nocp +set cinoptions=:0,#0 +set expandtab +set fileencodings=utf-8,iso-8859-1 +set hlsearch +set indentkeys=0{,0},0),:,!^F,o,O,e +set nojoinspaces +set linebreak +set magic +set ruler +set shiftwidth=4 +set nosmartindent +set smarttab +set noshowcmd +set noshowmatch +set tabstop=4 +set wildmenu +set wrap + +" this mapping is very very crucial. otherwise, the buffer and file +" explorer area will keep jumping all over the place. very very annoying +" if that happens. +if has(":vsplit") + set ea + set eadirection=ver +end + +" ============== +" Autocommands +" ============== + +autocmd FileType sh set noexpandtab|set tabstop=8|set shiftwidth=8|set autoindent|set smartindent +augroup dotconfig + autocmd BufRead,BufNewFile .* set noexpandtab|set tabstop=8|set shiftwidth=8|set autoindent|set smartindent +augroup END + +augroup cfile + " default settings + autocmd BufRead,BufNewFile *.{c,h,cpp,hx} set expandtab|set tabstop=4|set shiftwidth=4|set textwidth=78|set cindent + " kernel source files + autocmd BufRead,BufNewFile */linux*/*.{c,h,cpp,hx} set noexpandtab|set tabstop=8|set shiftwidth=8 + " systemd source files + autocmd BufRead,BufNewFile */systemd*/*.{c,h,cpp,hx} set tabstop=8|set shiftwidth=8 + " qemu source files + autocmd BufRead,BufNewFile */qemu*/*.{c,h,cpp,hx} set tabstop=4|set shiftwidth=4 + " dbndns source files + autocmd BufRead,BufNewFile */dbndns*/*.{c,h,cpp,hx} set tabstop=8|set shiftwidth=2 +augroup END + +autocmd FileType html set isk+=:,/,~ +autocmd FileType java set expandtab|set autoindent|set smartindent +autocmd FileType make set noexpandtab|set tabstop=8|set shiftwidth=8|set autoindent|set smartindent +autocmd FileType perl set expandtab|set autoindent|set nosmartindent +autocmd FileType python set expandtab|set autoindent|set nosmartindent +autocmd FileType ruby set expandtab|set autoindent|set nosmartindent +autocmd FileType diff set noexpandtab|set tabstop=8|set shiftwidth=8|set autoindent|set smartindent + +" ============== +" Autocommands Group +" ============== + +augroup Binary + au! + au BufReadPre *.bin let &bin=1 + au BufReadPost *.bin if &bin | %!xxd + au BufReadPost *.bin set ft=xxd | endif + au BufWritePre *.bin if &bin | %!xxd -r + au BufWritePre *.bin endif + au BufWritePost *.bin if &bin | %!xxd + au BufWritePost *.bin set nomod | endif +augroup END + +" =================== +" Functions +" =================== + +function s:FindFile(file) + let curdir = getcwd() + let found = curdir + while !filereadable(a:file) && found != "/" + cd .. + let found = getcwd() + endwhile + execute "cd " . fnameescape(curdir) + return found +endfunction + +" =================== +" Cscope +" =================== + +map g :cs find 0 =expand("") +map s :cs find 0 =expand("") + +map :GotoBufExplorerWindow +map :GotoFileExplorerWindow + +"I've installed the Enhanced Commentify Plugin of vim! +let g:EnhCommentifyUseAltKeys = 'Yes' + +" =================== +" Ctags +" =================== + +let $CTAGS_DIR = s:FindFile("tags") +let $CTAGS_DB = $CTAGS_DIR."/tags" +if filereadable($CTAGS_DB) + set tags+=$CTAGS_DB +endif + +command -nargs=0 Ctags !ctags -R & + +" =================== +" EnhancedCommentify +" =================== + +let ECFILE="~/.vim/plugin/EnhancedCommentify.vim" +if filereadable(ECFILE) + source ECFILE +endif + +nmap Traditionalj +imap Traditionalji +vmap Traditional + +nmap Traditionalj +imap Traditionalji +vmap Traditional + +map a/**/ +imap a/**/i + +map i +imap i + +nmap :TagBarToggle + + +inoremap :set imdisable +nnoremap i :set noimdi +nnoremap I :set noimdI +nnoremap a :set noimda +nnoremap A :set noimdA +nnoremap o :set noimdo +nnoremap O :set noimdO + +" pathogen +source ~/.vim/autoload/pathogen.vim +execute pathogen#infect() + +" =================== +" Fugitive +" =================== + +let FTFILE="~/.vim/plugin/fugitive.vim" +if filereadable(FTFILE) + source FTFILE +endif + +" ====================== +" Universal Text Linking +" ====================== + +let UTLFILE="~/.vim/plugin/utl.vim" +if filereadable(UTLFILE) + source UTLFILE +endif + +" ====================== +" VimIM +" ====================== + +let VIMIMFILE="~/.vim/plugin/vimim.vim" +if filereadable(VIMIMFILE) + source VIMIMFILE +endif + +" ====================== +" Vim plug +" ====================== + +call plug#begin('~/.vim/plugged') + +" plug vim-go +Plug 'ctrlpvim/ctrlp.vim' +Plug 'fatih/vim-go' +Plug 'jodosha/vim-godebug' + +call plug#end() + +" ====================== +" vim-go mappings +" ====================== + +au FileType go nmap r (go-run) +au FileType go nmap b (go-build) +au FileType go nmap t (go-test) +au FileType go nmap c (go-coverage) + +au FileType go nmap ds (go-def-split) +au FileType go nmap dv (go-def-vertical) +au FileType go nmap dt (go-def-tab) + +au FileType go nmap gd (go-doc) +au FileType go nmap gv (go-doc-vertical) +au FileType go nmap gb (go-doc-browser) + +au FileType go nmap s (go-implements) +au FileType go nmap i (go-info) +au FileType go nmap e (go-rename) + +au FileType go nmap (go-def) +au FileType go nmap s (go-callers) + +au FileType qf call AdjustWindowHeight(5, 10) +function! AdjustWindowHeight(minheight, maxheight) + exe max([min([line("$"), a:maxheight]), a:minheight]) . "wincmd _" +endfunction + +let g:mapleader="," + +let g:go_fmt_autosave = 1 +let g:go_def_mode = 'godef' + +let g:go_list_type = 'quickfix' + +let g:syntastic_go_checkers = 1 + +" ====================== +" rust +" ====================== +let g:rustfmt_autosave = 0 + +set hidden +let g:racer_cmd = '/home/advance/.cargo/bin/racer' + +au FileType rust nmap r (RustRun) +au FileType rust nmap b (RustBuild) +au FileType rust nmap gd (rust-def) +au FileType rust nmap gs (rust-def-split) +au FileType rust nmap gx (rust-def-vertical) +au FileType rust nmap gd (rust-doc) + +au FileType rust nmap (rust-def)

_j>}dzs0ip;WJ?y~*BOf2u4#C57fol~wP*+^r)YAi8guu% zxXF6$7(84)34Q{9E{*O#ZtAx;zz(?_-)~x#yt!VmC^hp=K?X-{q;PyzW|DQvJ3n<| z#?BvW61J=S?QT_+CdJ!+-&*YK&a=6v_(g}Jr_~Ui0!8-z^AlbovU8lP5ZyxKMBmTs z<|oaq)%r%vl>mLToV8Z=U1$2eu5;zg0I}A3#al0eb4&dyM1@k`g63>pX$;meLYov^$2{;woJB8y`=ZRATx@pkJA5mjxR--J5 zUQ(tg=_n>5xzKTP(I@Z&18jED`2?~%c-BsLmvO4>>^)@^Alj}xlVXEY&yb(Ef6s$_JOgEol6A?THleWY=@}sg+W0f zMdKoTdQ5z{kbfW*l|ju2;Om+McoBM@&KS24xY-Z40suC9bBdvBP1wPN2ZZ_Lg$&qs3) zEQz#b7LPX8;jk_pk1cSL#5qd6}NnQ5BzT5az#&KcaUu(cPL zAxjcOP`V4(l$d+-Ztd5+3OffmcEaSa)?E3V-jGD^7e&Z>UBt{OSyB@sI58Aupuejq zOb8_LZh$g4@n`asoO&(rR9ilRymCoRTo1(S3Hiuf2X%Jz=-ZSq z3Jz|Ut%P3b?&C+Z1zze6_pzvc=R)F`X$D$=`%P2Q*3_P(bJ~r`+5#u{89#a{r#I4Bq=<+exZ$FCSc7)sn0@FW6J<32HG_j4udG#p~jf>=5JUvjL4KCgh$YiR{#kj zxI->s?sYN4>rQrZ!+Sy5B7As8co^(2gWGXanpj)+EP*8hW!ecQUB^F~%3Uwyjnfxj z(f%(`$sP)^D|}|_j?W8|7s=glbX`)pkriU2$o9A0@f$Jw$S;-TzC|niv+3dFsOf!SSAJ3kae7DT^XIz1ersusW5%8QRJZl7)hM4S z3S37v3G4(8a8X12Gae8vY?goa|9^(0DF*}pfMDpui+ORe<2%4e$pl#)lGayy)r~t- z-GlmDw+TLjrQUT}g6Ru|BX{RyTZ$S0tZ;;bJxtjZ54?p~tmiW;!mwYxA=|Z>?wgYL z;fjY%&2Y1jhM#s4SS;I**I5tyglJQ*w^gxtuNqAY&Uj;BYe(C z!%W3D-etHjTO3*UO!pVgbI2ySJ{O~WsYxps?2nlYMv$N$5|Dphd0G*M`?2>&-j$%> zonOzP*Y@@qFw`%=uv`zcf!o7`%>=P&jtN-=y}t)bRs;p#a6UYz3{~k-(J>cxXsqSm zXZ$;phF|O8$N$G4)8a5+Qsh#v76ZWfn)LtErT_gfVlmKAR&Ft3i&xGy+$ip-S5DL~ zq05O2DI~Ipk}PB}-#mU8U~`aw2e(iIts)%KI91`R{K$opAUV^u>-eHWafU-NqbG8XV&Y=Zn@a_*{0Mo$3qdb0^s3UzY~8qPy_Q$ zl#@Oo%xC2tQI@dq-aOK}N1=!teVt?!QmDf6m3%b*eeyG0B~P%ghnM5Z=}0#zUDCwJoa(SjECz31I07LE1D-0P~Vlh?zpd)E5l4D zsx(!A)xxJhy3HyBSSmOs4!;2yC&rn@JBsC?_HDg2t70FmzN%cTGm}&S)_ROIn8@w% z0>pE{KL{)H@kRtG%>-_|uZMcwpXDwM_gk61d)clChv`&T0Oo$pnUT&A9HwarY4AJx zCA<^d_s92gysrZ$m;VZ9K5+mJDP$2A$H&KB5uLZtT&{S2jU7LK-?M42I8C`Z%3My`Bz<+`ny zo|Bw=9n+Za4=ZioszW40Sp&-<%*2Z&?%|8-v$WzvRkyGE#Ds3Ez;Z$bRB5`egJB)f z-#iEljeK#JyAH}3TKea_@ZWeXknuPO3a1)Kd1!E*OohAH2UPYXnSNd$OqO7^Q-oU3 z+6p!drNbLh@ss7|w#~M6YBdSroaNi>3+Hv+E#-~1>%h`b*1g5(g*SS!@L<^g236ej zG)xuIKN=hqiNU(tv7#wnD*B`k@xccCqxKD@w%?O}wEl^1DbrB``jX5Nbshe>?(>g~ zG_*kTd)gq{Ioa@SJH2$+`8*plwW7y%XQ4QfXB4sXqX&@L0gqN3HRrv4kqnX=#D_)k z#LXwAF5?>t2fK|VJm!{5ns^aRxTF<jR$;jF=9#p(vUzqsa~=*} zUyq*T+#V{FKOy#rsEiSg_2l?Gk9y%!h_831k7v|yMF+=NHg`!JILS{R>6dPE3ibW9KF(;qQA%V2`P5hvzQ9E*7W?OG=CPMhQ}_8nK}}0B-R7h=Vf7cbVBPg zLbKT(2bOIw#2M-jHXiQKxJitqOR%bTJs=Fc#^+@oI7O|kACfrF9^zI0Jx|m!toz{S z-FT*R?i9`7a*CCs0;-~Pz2QZpFFPVd`_1)K^zQYgS5xc@c6g-ZFJ9+L5ogn-0qMGj zhL)*(wX@J45|whpyp%tz-!atGi#nLUR~6-2-RB9!Fk;|84vo50!pKN< zN;uV%@Bky|>EvW&BFpkZ2%$57Ql~S5wTm2ghY68(X%((-AO=ShSpo4hIF>Iu#vnYd z$K~AmNwQeme{mZg}o5OcgLkAb%rNG*}Bi?5$=nYqVLDM-gW@M z2R0IX{!$zZ9aFAT29pJ3^1mA;rVJ>hTq$se;ks{;$z}3jHQHNHPg>0TChE+-Zx3uY z`y46G2h$%Ie1jUatN8v+(Qi-W{PU}5m(5JxE!*+hGx6rjlbxl{uKk~n6%^nC=U!g# z4TNrEJuD7qsk39jTi@jK+Lk}ugKf@*Ug#CzjeGgw9b_hZ?Z=x{_b>Ocj!?Yob*QTm zlg`lhHmzcy7GgD=F1KHP$YtPfnJ$;Hm&ctll?k51on)?Ro^QW-DY)Z=2cSFV(k+}9 z=5c$u598S(Z>w)sfgP}wut_NLtM^lKgC~yz_+|k%br|bUG*^j;6TCAq>RQ*^@%{K4 zzrP695Nh4rI5Kb7eN~CUa9mVPdYJ1+)~Mkb(zyr(91&1cD4ooYNW&eghH`X@4ZZaI zXe#)+(;{1E6cl-x+7@#&JZ?g43R3arN~MH6csLqeK0YsI?j3OvF9FWlnI{TqF?AVw z{z*}3bNEniuUS6UAj>c8&sOWwC3PB1RL6Cq!pX^v(ROa(*!Dtfy|3wq$7Cw2@Tx>6 zE^iYxZp$CmDhl!Idt{n?0)=!FG-Y4m_AM4~8k&ZR3{s#u=mr5;dIVaE_AS7A0Tg&W z=5&gJ4tZ(E4P2zq;p+sIGC5x39 z+WCa>8q@Fxo{qeqv0a!(wDhGWP~OM16so9cpqrHND;NsUaU{Gabu!Z*gEvo1$`hfM zme*#WzY>&X3CIkOkWwBai|2OT^<6KrT)3l9lRTt9VvkD7*4~I9`8}Ujbm&?}G=rZZ zDQ?V8q&?@BA>2NgXxl+;pNu|R-W>e;@lP)9AInDO2c;ZIYR}~oUftAT$lX4jpSUA6 z(yuoKXWFK-KD*C|a}aw3aRQO+wVDWLvoKwEBkuT@&SYhW5`f3W zv>{i0yhte=&AJ19pBVK1B1v~6hrw_3G#G71TRkzXe_sOwM#<8a3DQp`WwDEJa(Rjg zeYvjyy55L=Tye0dbptVvfTXn4W$rPyu>CBX5+*9q&|TAXD#*Fnl^7UpjS(&BT2>y! z(Kc0*G8gYEJxr9{oKvx*V3;`?E2(JapCI;9hCii+YBsd2yBI+H5*>N8#4^X{8$QtA zZqX`M7NUm5l8=Vxzx|FGVFt^V3W1Wy$Ww)iGosQc;z)Me5MxzX&4^)*-6AA0;rX;vsj$TMij@@`Q1Qtb-0s!Hd!u=fQ#*1fS~PR3xx1mz;q z(7BJsqA`P}p)BRBAgW9tOeRz*6eiOx_jcMDFOorOy65nW*yh>;Z{CSvso>`!81M-g zi5#aWPx^(sm85Sn6(i6Ovi^KZJj{>F6;EPL?c$Mdx6|GTu?W< z!>a$(8$}FwXb?Z+%%@xkPDQe$OZ~eC?cX^&?Tv-&1*@Et6LY#Rv4vU7{`yULnQ4&_ zFIYgcQ}4Q&sS)wPGg)BDGd{su6tWr4f!3u6WT-?%P&Sogys2o2jrV*@xlmuJBfRArrG~aOf*Fq4EviYNIN^%^+_%3&|xJ2AwWS?sM zv4fK(;yu8uwTHVW1~|PC8LEaIT#aLqs{js|4Fb*o^%8PKW6at-L?z)8E53;y+3(_QmUAOY@eC!!1 ze#f5Jvm-pKVPN8+T6!F7dKer-DwD(<;;WPi{2AduA__ai|6x-@VJd&8=(2$h!tiht zWr8UEhZR3uMQcwrqYTz%)#=>#3fjw((cAW0o0BLaqz;miLzt;)afTb?w_gp0>Zd3W zSZm&+%4+ybKJVBMwcklajKATbYNDbtC->71D>Yv1l}p_YIKA_qU+PnfGc$~_xg-c5 zhh=sQAUZ~i6Jn=S#TTvyMBJ0wR!xd{Iok?V%R}LgrFc5>vCy9_Dm+Cev2vrFXqkpk zPGd>URl@HP$cY5jJvJ1$PeK&0vJT3wClu{vfDRJmPo}%Y?G`JdOxc&2uR!BPnW_Lh zhK5w5@m=npAa&`Lys+>Lhnfk}DM~OI91=MRCA{ZEv&F|kJ#+P+AclX7acv?r=7dTL zeEKkf3i@f&9&Acu!d_H=Xy#@@yshzm^|;Z)`?~3lrU~(t>wL+HyY`u0L;s+0$t02)Y?yNg1vD*n;_ey9ZiF@Dh9>; z5^sD@_5>N3f@wvi*Qk}kU`}D3;c_DAX3d>~vJ{W(ToD^ls)~jv@Uv|)Z{Fj+1Rq+f z{IX{L^kA8f9XkWB#iLJ<26aj^M{8|T<1tzv=b?zUA#|^O6huA(B52!^=;E%bfzkMF z`nM~!+i9>tIwFuX?M~==?b`*!7{@rLJ3J4OaoWwZKBP0G_Ol97vVBD7h^4&n(@>cn z(*D5(#zjNYlhMWNa???u*}tL;ktQ_q=5#HgvqN$frkD0e{B!}IK3Zf5%d^eMlJqMw zd2lbTJG}E$Ajsy*H$J&vaJ1r0P&~D(uf`(pnu@ixEB3LYcCYoXFO9nTzK|Nq!r2W@ z19%F}b~e>bXIe&}whyO}3qG(>DO0hg%V)xnNh_w|e$eDJltkvs>wR;q_T+x*$g-$8 zNV9x~egY%~sgv)eo#H3j=u38PmMeK%TIgiQL`zT)X=d~YxlYmmX1^M<3t)m&JN0|< zz%29Bd?zI~`|)M&D1Ajj3?Xiob-npGSNC?#SHlE*Hp;)1%~p z%-;2l^;w8d{;rn9Xl%;K5b@CA>)?e-XfvjmXny2s%cv&xJ#b+YuU3Sk10;Nm8_E?+ zVXDqzl2KW;YNEc%^GS@Yc|am&6lQd%>w$C!rf9p$CC4v{>kOxWB2`;vaS~FzTTHre z@x&tl1rQv6k>!1Ba-KR{7hz1TWX-;ph#)%Y)^2A@|9J`7_3nk0T3tsbxDnbkWxLbr zQ;tx3DS#nVq$Af(cuFz&t#YD?G=;5M2BrEsC$h-Z=VDRZj%VJ-D$R;Gtf2mwI%zhw zdtfxTPv@!0Qr{@X2u+Bgw=BTbC35_BdOmApZ5CiU>g*hqq{v66;v43{=^AgWSAc|A zGD#=Oe|k6DM-4dOEZ#Ru(t+ag$_g9%t&IzNw-AhED;hM_EKWRC)&;70h_#mzCnesl zckSFSIP%qf8OH-NiAX{=uA^h|RMFH;RBJb3cgG4#hB@KULGV1|pA8>?&pPp$1%M!Yjt1m~xnZv>?$7yFlZs*Ps0lmwUKBWNlq0f$L}YKkc#0Z6iwDDwh3r=jI>7g0IGJu zwQR(~U2w`Jl0J_MUMcU06U51gtX9gQmq_;WyJm7KKtb~3d=vLH3{(Z*N~qmpFNMAw zHrTYh?lneaHiuBXZbaon=rH92i23=Cw^u;dK<;IdS~gs{A?^k7j}B7Pq});$rhe+} ze@mj_w#%@}S3UHJD>`PTSzSgU)CK^_3tfLvSUlRC!(iLl^u?OEu!v(M$iE<3+{RzaTlmLUGJk0B&y*l=ep1DHQsuoaxNJh%`Of**`N$zh?L6IA3W263gCUU%K_0 zRhc`UiiracV_DrED_WFEnrC;)!2G;X`#(plZI3~@OXi^ZU3&Z>Zc%5*kx zJJ{hb$v6d5mVB`;_HoI=HTqi*G&nWX_sPz<<(p7K`t|szgXZr|F8xsvEvsQ370W~l zIH$^a@YTtZyBoEN>Ye4vW zUAZ;O!>sSxd)xJw;F!2$ErtCG&mWH?tM`2LCdT`)+>7{Z+9~tYbaoZT1tw}e>~01` z?MOKr=OD-8R5&V$LcWfCjbkkN=LbJo-OzAhZzaL#sm?p&%s%w|WQCHBh*!p?`8ju$ zPfH>|o_N{-Gk|@qzL-1H-#c^`uRl`_uM)&a%J7DQd6dxe24^YA_^~3UTrRHv-W7kI z`bhadR2Nk8|4wyH$hkAe!TlH2RcI6RAF2yluDL8G%wO4_ZW2s2qN$nHA!7#&N$xp$ zUUd!>Nm=@K3Di#Sh#pBu3)Y$D{?p^qgN7UDnbEF34K?gz8{UyJmcbRwmCRd zoq#$Gbdne?VHNjaS4PAyp?#N07E69n;E<=AlBDHf#=Y%DTUmN8Qaz@VO+XjFWVWqR zJ828bHY=BQHZpI6l2nZ9satVbSb-in338U{AUI3)oa3|>QHVtdib1g4+ra#VtPHKb z6*Uv=Px$iOxAcNjOrUolCB-PVA;ZL*bEB!AOF?)q=?TpsD((laFK*^%nfdLvRvSK%?qO3Jic6m|JgR1u*Bu_(iccfo^hNJC6+O#IX z4Nzp}j4=V`^U9~<-Mf=HrX zm7aR>0=kTRp4kqFeL(d*$)Dq*6D)uKapC|}s3}r4nJx?>=CbGrQ>6sHmKXQ)!eg$G z5=NMXkWh1ihe>%t$;Gq|sV5SV74=aqs@#N4xtlj>S0UQJ39hV2!!RQs+Ps#5y1E8+C-|>% zbYA)BWdOD1j+M);>n3T;E$DIkKQ)Qx86?DpshPTGW z7AkeP=B-HnI&_#FM-K3r8Ae|8E?LGbPG#t?Bt1nm#epD;b^9iX819 zW~dkt#l-Vz5}%P5LyucmjGUGkOX@zYT7zL%hBOX|0QE?4Ih?wrHAcr&W)d}oEVv>8 zTQSC-%a~THL|)iX+2TWP=;nu*gmFOebx|GGLJNyE3s?@f*>q_fM1h%-^Sdppvu zrU?^mRD+V3GYu*o62=%iZyX0~7`znzo!-*zuqu*O?v!$#Cva}M6HVLM{e^zK?3h^+ zHL{jpnd>qawPhxwOib1_U>Ux-75tzDU%F>;LXGc=5#Q_YH+r}4b!CS}7rZQAkXQ^q zUly2e6w=&1`??PCSy?j-xbXG9p4_&`$Bq8VZ?k^B`6A|awMs$Px^nZ4*-C*Vh==l| zH9P`L9&$gmQkt(TAmQEbUcXe$OZ01C5S}~L_M6?QyOi2JuC{H z2okLN!F!@!rC5Tf0=XTu{h^(V-LHeHTmuK>_gdsY;93Z)oask8Ywj#Q_S3&hhMNsl z3dr1*Vt22zHN>%nJ*c|XhC`8MKLjTCTeje%Xlu_#kY9$ys(LxB_Wf2*_hC%EO~+u= zQ&Ri>pg@p;-d~Wr2l9SAJzfS+O1|6Fn)3s>eoZS6!qo+A)7I zOIlrI62^2z9(;1tCG$((8FjfBuXym0;4i19%$!!>umqlo{QQ)rS*%G&4#Cas>kQ-& zFC;N=k=!moVI%*F*7xm~}Yh4q+VH?>6-cO_laFq)qT9y zPP{GOXOiagoH-AD9TtI>l5eU6lJy_khMM|7!vRY8H|A7C;=%wguk5OceS-~bN5E-K zIfeMvH+}y-Z2Ix>;?Ufo_@MT%cu=Hh@W~nhuS=Y0o`JXK6j8ciw1_lK6}Ja8#DjeK zD5SU$Q`6ycy>Jx1w*ou5Ywnp@T_xgVby}Kjx?jF@?p>`yBUQpp{E7f ztCOlU!{2X9l1-Og_#LN2c;5o1oy{No+;viu^oo5@q}5Bu)k-g6PJ_ThTC$No_Ov}` zw6&sQ_VIeowxOQu$W|_S)A1N^th%x8Y7Bf45ABVvn(j(Be&21+l3@w(^4=@^?1f;? zyxt5NXfy-0&!4o-Y9Dgb47#r^7j(}3I zes62if}O(@FQ3mU(Tlbn&^S&`#}2+2P?;9~<-L~)ST`SMk=K_<4t;_GE?(}KU6XYu z&huL}BW(X&3*htdYP2TE7Hau@;5Nq1b*w4FWV2Mx;^y_MyU@2gqQU3i@^@t=^m?&e zsr0&jW)M}PW!Gz$`kHpd&mQuFS(?$ZzYhk^xI@xBS|CVh%Qt?ko#Xgix5gbBVh<^a zt6&Nj2ieo}V6>St;3RObg^#KVUqxrRsDf^J9UHB6%R?DzSDW^Kxil*Q7xaw14Z!2> zaj~Pr=iJ6hSEk<3kyZY;dg9@Or+F8UJ}5NCnnyXW(VAi_mVu1KAKj!`=Uaa)Z7!)W z&HX{ld~W)#@2-Ys^DTL>8DqkHPf8-KOR9NA5#1}!&ila7q)HT+zLgQ;QRp|d8d)yv z4vKyzNTYNCg|i%dfjcEdphwPy1|^@zgBIT=rxw9!;K82mqJHj2;nfpzbBCYMTc}?x z4U!&2r5l>9)#_wa97T2`r#hmJ1)J9)DB z6~K>G6X^x|0?GGO$m@1oMtbct1*@;|9R->-rGE?c+XgJLhA1Br&Y{Nb+Ggb=WMn7e z70w;59aKu8;3LdPJ>h@RA}jBAw&V0@=>6ucV0<1esME|3ISH(RBms?5Upf9~c+6!X z9X{M~80$$*pg6Nh43tDIefsK-EeRA;$nIePjJ(O8f3x+5<5GRvKj1X5pwSfKT)@Bb zm__`^Bf<9L$#MNsLZA|Q2x9}`{{jZvwy8o*ZOddP4UGc8$g2U59sgx@?w>o@Dug=f%ViDrtZEMS~_ox3ID2QMowI{2Bgl2BBHBd*dK`S zW@M~nN|TYfh}M}piW(bBXaZl%`$eL%M!smTGLL5F>l~ba7>BR(`~jz?22in&KiR%g zg|Puo7vKUuPolUhdbE)!gxLCCklFv{ex`qbmulC4bn6#-O9Vvuvawqap)Yrsh@h8j0xN)L%ovRVgjz-u%?(q6~R? z9k>|`$vEBk?3U=>OH2WAU6$%og3RL(Z@!M6p50Mp!!-pOvMXWNBK%A1NKi2INKlF6 z_Q&^W5rY)f;1NO+gU;izNB|jWxb>J>Zuv0#dPDPjE$J4VLUOx z>-Oz28yL=%HPW*CTum*V_Sv4?>*L+X)S{!L>5^L>KmM4N$E^SO4|yUFI^O(y=Mw62 zkm@XQsV~|?RvL8EtXwOnCmcT{D-I$_kn5aDvkwCqV(FbtiJ{B zlNuL)5h&qvIeaklF3u>5^BKoyLqFKMknjl8$H)^S7;xR%78&f$I#kUPXoFu^s$h?fc59nMS-`S@va+tsBe*gd^T|9BqQiU&O$(uy$5jvRv2!<Cld8B0{)&I$`oi%Z0;H@!*3%4TCm zGE}=Q=0A3k<^SSaFkk987)I1KJ2kd`)av?^INSDZpMU{((`E_{%G{!1wL&y9p7*;w z@+qk>(l18}xbg-XJ6DYK;m`p#H=9aAHy-czyzu-4K>OTA+8E z-vp1W&)@OrW_o!3f-dqqAf*2NgxMzt8C3k>M+Eo-LBi?flaDf3xzQ>))e6h|6jDti z(obHH|K1$M1a9C#QR`ud1RDsXncRb+^pw(55IT)Y7>?M?B`?NS>7F&CVaCltu zKAFg4b(V?6tdq@E^{$T@o1(-^5kcKaT&=3}`UISDR)y{`oINOTEl zd+#*Fi(5bn{B)kKEf@M;;a_)cwiLA!E79fcXz!b_NLXB%_@111cSPs$pe>AYZpnYH z0nXM{6T7!!rxO%Y;@Rf<3tGSSN`tc1(qZwgIo{4wz|C!L$ORIHA=Ib%kytONu`}Jx zgvAQt$hpTO@x1uV=LYBGAFUED1j?2R{bL4j{69F&*#85kfg^fA_a|g}Kl-37^0DJ4-{#pwg_Q!W$@*98S|zU7+Gua!~MYo`3xaS`LE%b5Sa7<;Gi z%C>F&yMjtmv2EM7ZQH5Xwry2xJE@>z+qP|+-&||&bDp#Je_ec+b6(6b=IDL2-tcR0 z^O6RhH{GN%(2A;fRWG9hf1OPj6hA4atC50Ro6Wp)91f>;Px;8%!moOx@Vf5UvL}`Y zXLws}dl|PnR5i5$+R9cN)vu`n1q?5MKfA$qdYLpnk1p$pPEjUYWSaNRKt{EC^(LYqxMNL8}`j&0L?9%o_gnf(=H?>89uT4oKJ`*{b-L+YfXO1Id zP*D0S{RDZ-AHAID5<~qWxwLVp@83X<)UTdP^PdY?W}CFM4AS~fSZ(lPiP<9*s^Dmh z)TlI_tvzHp!AYUmYB%BQuv zkF)bH{izo4NCLbnm%6{#^h86W!MK!+1|;P#GcKhAyy?KSnr$Pn^AODMd!6ps2l7Qh z8IUFOyy5B_RO0%yQ{L7U{8mGhSX8IKJTQFJvGtOf3&H!kJ9Yi_^-khuQ9aP{rj$oJK0C;?8Hi@dYyJm&eRH_6syqce0DLCGQ~pG1Jw;p$H#DXPqLR zhsP`@-;kvD(R*6+`)|yK&KJ(~-qZSf3TL;-czrq2jx5+!tvMjve36!k2RVx0TggUhPjIE_N(A#0BKmChMTxv zp9#sz;YNRJeb*Qne9m-a(cMc+QSlUdCe~9m9}Oju{p=HlD9&Qz#rV#{3x)zScN9s< zx!xpmYK!6WR==j!wqv4j^qMwm$n{NUG;v^t=M*ugwv zHr(tq1?)|oSXDHQHit*7RqFWnGG8p*3}j=zQ}hA;B$y?Y5<-To_G{P}$Kj#T88D8~ zq(7g}j4JKap{u{4hTs~e6R#rxBac@V8XDn)$L{QnV{c=U?HqpZCz+=N+bWc;b~fK0 z?D-YYRK&_aPkEhLFtXZI33Io2BD$2zV^LB`k}mP+9Ah{VxgKE7AEw$l4e>TeYcvkw z#IUM&ehMPbR2D5IM&ysP=P_$+Z2dVS_wb^Xa?@A8R2d5ZqE7dU!9NLTJT*$3bQT)U zp3RwTXgH|s7r(v>7*$bMNsThI=*>Go0n@7U-pc*CWjI1HbiiVM%+rqd z=51q${#{D*N0V-9biC2SbN3OWWR__RFJ-Fp-sE4tCKDwP66whIfIr-s-xj{vwXKg z2FWf5H)3)8*{qp9U$FGLS+FYN42&!h(OTi!qiQ}r{>V=)t{9KJWtrj)wPy2erzv6C z@m2jv^H^e8_uJxiW5ZozA>NKbndHUj_2m14ImO_!<&E|{0ZcbbJ-CkSYJ)LHr5dh; zENuq4YWJoRp{~^gyV>_v+o=mQR+YZ@c^uuN|N3NlcHUjO_PuO{py*XBgX;S1H*u>p zC+U>?HIQN=YA{OTt%=+3yHN)d%kqXip2^L`YV$Fv)a<)vQCrzI7(y={!irh}qZIlD zqPBHs2}TIo_>#KVuBLfpF=ah}bPC|2UJk7^9TBVR7~eCM62!L4=UOEkv-0P-*N2*4 zo3U54Iq@Uu8LECmBnn^5cpbh2wWmGLZ0YtSwp*qPTCO-VZEE;2G*FL)A=yw8fnmBQvN~;zVb*YH$69P?j&P@6t()`x|hc5v^ zT}^zi%4%qhLbEjDR3)6iRAxZqwz@y!mVk*!w zQ6mWf6ECDaLodX+5eFCr1w&X&baC-`<%Qd`z0oQMNQshFH}3C*tW1ahfvji(8t*36 z{|{!BjPY;GYOb56Ox*oCsk%ahMG16DI=9W}8fUQo)FA^Pz8;8EZ2f+d(ueNK`2%;z{h) zky4Q*HW0xTlz6xNxhpR0zh&`P8TTuu{)bKTE0 zaV`X=wjqB&{9M#vtS^^{)c-wjh)9OIVINR1cN=9+@ERaWdDW7BC>VI^p=KBBY%7y> zl1+urN(kw%{Wc2sG8$0gZGR|LUjx!GNct<|Wl3e#UD#8~8pFJ|*_?_}#94$vb@gQL zTX5yP@a>swXVLeRb4};Ko63bvr1)e+s;DE9GzRp`6M?JYDETKg08)q5=C1EHYRGV~ zw}YN>Ux6jKQ~G%V0Jj)Oyg9tp$z?;_4dG#;H&Sy=6tHmwt+KI0jn*YvW-hg~`|b~- z9)(w>paLB9wBsY$9c&l2q^>B;?#AcDzQ@zs{1phY?;+;;Gxg6db$EdMT4}e-_8O>x zfHkRi-;x+tSG2!4>Vm&Ny>r!xgx2K4-Xdt#Z{M2{vwuUWFu>vTcimi$>C>^la520gUnNhs;;|I6nlt^v-tou?m z$nj}TKeLi-MhL^Q%w2XTEy2gOF?N* zdsa!SXfyPJ!G5nbQI45bS320oa1gx(kqm`wV@d$eJ!=boHE^W zudWo23_!I?hhm%v$Bk{+Bib2^+Z~O=;68uXh+%V17?q{6y{J3floHRR0X?)H&$i=a z?5#)GsL<=>gJfEQ3BGgGkhhmQq*|hiQNXgqsGC&n@9N&j&qE~k z)d|U(5TjPFY`S_so{7+N4bSo=K}+3 zRrxp}+jZ_iE0T30||MkhYw$|wzW(Oj9-x#az^^ZFkO^>eB*{QB&v%d6n9*;#iXTm4gxocNip7N{ zc;lASMCi**G-Vk`AVa-UooU6e=1chQ8EonZ{9UM{oS)3CH0|;_T(Lz4ZhC>~@&j+& zMgw?1%wuJ^Ke)xTiaBd|SZ^Akd~ZUdqY@Yw1EZ9&7)z(_iy2c$`L!vddzA4K%)#SK zotC>m#J$&n8rJZ=YmoC(4A@^ebq3jWUz+I) z7iihvq%VAQtx5z1C_YX^BZVd-?z;646@yz@VmhvH1mG5`j6k}hu^i}^Js>=}`Uj$Z zZZR(S7yAn;7nv6Hib_I?X1tyw-UeT~IK8+)+>95n590Xh;bg-7%f%T;{2wF^f%!j> zxcmovC~uhwL*ntSmWQw1w5*(-lr!2sK$7C-x*F7NgKhWKS%SW?(=UgfN*nT@ptv}$ zDgYFhye%7G|Kp<<|MPYN>t=e4NU+s*+MSmzCBbsYiS0oS(5lfxSHO8j*6ghVMB8~H zb^it|d-;jf={f}m3T5Otru6*Qkk#YAf3Jy+dvox@6Ex+H!NO@$&J)MkT}6ZX(A#wBhhCbCVRV#8AG}8jc`8#+6*k zduLa!#l832Foeh}PXo1+1%hwYef))l@DRuCu#2}_ttokD9&1V->qv`8YGj2a`*6xi z>S0*#>pM+NxcAVFF{7>%^AG*Q>aD$LG+()k4_T|%Gw<5WPpC(4naxcQ<}{rc4ko0@ zkFLSXFFNF6IP0wz9BW|Jaw5DhoF<=Y?P-M<+$=OSA&g4Jah5gSm{1`)k0&yj zcZ7b3twl)Hu~ED<)Tr$1Z_GYzTxqB8$UV?u$aqq8S+Jpw1>5fn21(lEw2DLIkOd zb`XWsS3ArqT5~~7)8+>?$*$#<=|MJH7`UTVI?xz)Z9B-$8Eavm2E0PhaDXRg&%(UX z8;VGX)Zyv>v;dU>hmFJ=@{(KF2goHvk~c!_G)ktqNG|eVzuYD~;A@q`#G3n#W1vw( zC+e%jIg@|oJy`$*mug;b%=e}0X_T@|#{?SdMz|(c0BCA(>^+=x90HQJu#6NjRUo-^ z3_C(fs$eX4?@j}tlVSf?(PAZ5rZv3HX^P2c(;UxUA+)Tp2dZ}_`^BEp_d%}GjinQo zK@mbciQe)H!))iiEf-=#izWBjSx0Gv6=EtUi*X)fcr;U^QD{YT^_BIQmeL=vl8oFd z%b_SI9ORT!f*?4kX}Y4SJxL8!EkgY83S0*O{h1ZUzniwyg?|{g{#QUX5aV}~O z%yjAxTU5!r5g1&GK!g83@`A@mOc}Rz3+m7M1bd`S-XDN`mdH0o++M#mfWqKTEZ7uu z4%?4M##OFG?BH9(9{=wNjOE7zxO^;|FR8QbDV7^F=r?xbY++Q592worSDC^_mG@Bm zB>8Kt;bvx&jmBQ&(aFFNOXx#tBk1;jjk|kLP`OTQ<;810YDO2E%;-l+lCnFO;!}{=K^&1Sw$A*E0V*p^^su zm~2TR7)fzz;Z}nYXkwv{%P?x(`M|lP0C>WWlL0jhQF83j_H4mEi~@Z9w|LNH5d z=yqN-P(nGN)N2N7pWYIr9MNB{vl$8XGj=U|JxJD(h_{#dRcBIE<8mR?bV?gAZZ8kC z)LI5&yg18oztU*lf5A2GENqlGO9*w1rX7RrTpnH+u7Q-wmP%G z5!R1FrNC>6*X7WeZ}fah$wzb0)F&0G7V~b`i5o%+EPc^M@9$hpwEXf1#7@1cwz=30 zT;!QoyUaE`itd0h8ZW3)&EMeuFlMBU&bS7uaPQIfh zG8g_UC(AAbU<=~BA&XH6vbv@pbkP8+PLH?_e%MvW@#%Ur=Qby5>M5c)pA4T~`*Y9Z zr)TzwPh_Q}DG+vey@^u|iWc_c?%OvP&5k%#_Cu|;XSP!YLuYOBZc{|fY39*^f==ja z%2wHk+&K}P&uCt6y07tidw3o1M%w0j;WQOl%kFXBox5;K^G6g1k$91uQ*@p01ecYa z5UyY5aMhL=p&i7b`*T5jJQL@6AXFFPhekVY0Fgp^oIvFHLoCE7-%0GBpWH_r65lvn zrE8oMh2!Y15F2JyyrbqUwN>+JeLLYz@}@HNCQbJ3pB}%Waqt#ogh(iY^1U2&FLAYy zyXo&=kKX(nu*Ae62-L-gfs_8`p&EsZOkGm9uXOM?ILQ?VzNT?v0=LWx#e{>eX23;a zLw4U`gi4WUG-nqr3-ye|Xm-tqund-%GJy<93mx~xVZL2IO5;v5(%W=^UsWGftvO$# z{fOsB8n_6E3EYN%5GxU{G0vG$wHhZQiG*qef6XRIfp=Bri7c6Efw*92goam9w?Uyq zH^mnr;ApzuUMplGhY>@9;~f;uE-G45SqmN32x)SkN=P-@m@)Kj-X(Ft;RftXq;O8{ zzcEEq1bE)0uwlL@r7>lQ2Sip>(~?$+H!p#!>P!M*o?axK@>~cwC~olxeU6$Uzg>Up z434osh^+iEC?S?A!27FFP!W594en)Yt}gn`Ty*-cB$*gDS1%K5i&+n{1Rifj#B)D0 zdk}*ht>Ufu%~2Y^m?d07O5%YD!$^V|G&I9^8o3+{0W9Y4Pe3G2y^L6np~qg|PQ8!C z1Ykl+sGDD5;*(apd~OlS#{bxq-eA7kYy#c`Y)R!E-f$P4S~!;f0v*MX6N25(`)}rm zhAYHHA4VAq=U{7R4x74R$#C3Zh1T7S0oBZIj5xnPepNDNC1%4w4u^{+*FH;C%fCEP zJ|AMp?4OXt-q$z&&1XJo?fQJ(u-T2tHSOT}JYaD;4n|(8Wj}R+P*_>2&1%}cThCj4 z{>B?(yA0QUusdVJ6M6K%+9vzjbF>xEn)!q05XZ>A3>mQg0@;HS55>i2*(zF21qrc5 zeCo=A&r1gLaK#&{$9JuhASeDwlo}gs6lZGF$F>C#%5#tLm1(?bL=wMfx`CV?8r%_U ztSw7dA!z;MB%?K>ZqLp)DC#CfggERW_0Bf{R`z{#p@{uswV?Sx%QqsZ{hOt36Xsze z*UTsR$1)P9eD!X44*s8a2jnAPxT?;+jdtnAeqB2MM_LC5m(S39aZ^)Lx0XrWMug-O zhScns0wl2!9vcsirui8IJqB9li`8gWQ$|+b+pF3H*}b2UrPV%Ev>oq|_E?X`a4zTE z!jYfEu;{um%X!%D`pzv?jZzEY%$fe7Yryt7M#BA!a1r?Ah}meIs7Hq)c+ z6oUW#H#MA>9jqkFA1rV4vL%=p&OxP1ZH$8{!0RU+E==$ra)dvR37E{6s9gbCc4AW7 zp`QUN3bRVB4l|HTTf=ta6qHBexM=ZZV;Z|+T`rs%fy0bN8pXU$UN7m_FO3s_!H!Q% zTp0z_`?InNY!`$WSs#o6WVh>My9f<*4_@{SCYmcsaB5?p5Fx|QY$Ku%X1xNa z;sxmWwgnW#QgK-EpYUh)X~KeWqSIg#%)Tw9h%o!JLqAIxQfMN~-;sv2@ibM?W9k(D zG-0QC2?jBqxokQcp^6@W-xZ?>WT_nrdI5yvlHccIcpF?iPV@zDC3I4QOM3+FV_!~V zP!YG@>WW#TlGF&svL)n5r^OxFx`6!?O*eTX5=lVD|H@H+Px5Qoj1EBi?e{p1PztB_ z(L>donbeMj=LSZn{YS1JU(4 z;XA8xTeZy;5v~&xdi6nknl)zkQN?CJa~DazG6vsJ7#4=MNHx1I#ZUL{9?=!{X4?wg zltDX4g6E54>pLGZKT6YlXt=xK1UUhIOjJRa_Oeaj6!$Q9yYOclO)smbV&bP&alJ1r z->1m?XKufm-%meDV+NXR4A!QOG&l~$w#JuM`fB)pV^AOWVwNyOENWL<*_Q~Hpu>IpXP+uz{DNH z+c^lpPDL-%(+L?{x9OlRG9}u;3r%vlms(TbdEq6Dm8*4^E}FN+ zzJh|nQJp$&7+>LXfNxLZQiUO80@2SPl1%4E`cm;33M-p2R9q)>-x_|LoKZ16o_`6d z1?n%-%0m{)6L{fvCA`+(34(qA_sCA`#>!yoJ^4k2LJVBy18#wvW^wOrhcd9n&z1A!R{vKo4qnHZWc2$tI#CZ& zi3=LAo&RC|0E)6K1LJP3Np?2G-`7x1&-g;@t#ziR^-~U$;e9YX&HvKCTMZE=;V0wIW;C4xX64Tb#Y1QVd4qkLRn7Yv z+H~y}v)BIey>dD&(UliL@&6`)Ki89LVbt9bY{+E;gpEaZv&G}GyKH|OiL@4e=la%W zSbN7r%+O@tqaOi-m`doO@cp4$iB9d)*2T8wWHcKR!u{~BWo>1J&34nv)y3uTB7-fS zSgBlslur{(c~vswYoxSoIQ0Hd(_W*{$;RDjq9lvD28!NQ6B3wcmqEcy)7s4JsRU-< zV;FZliU`1I3XTTIr`MiwaZOt|PyAM1vagyUY+V~<0Ux8l6B=`{qDjNDE6)Wx`4PXb zM4#*X*c4Uq>!kT^RRFD!Dl znxRl|BUU&=7$C9t+Bs%kaXXq|arL|suk@>5WV5a<<3Y3IP2)u4xDclPc!crM`aXTm z8PWzJ$+*K3cGB)wr(Ls$Y}v;utAQhsD#OsTdOU`l2a~h690{+(smLY)nLlz_`u1RsLQAC*)upyDA{2c!>v$LTyfkc;++kb&flVDXBdkQLXg6WhIvBg0)Pm zP7z$`d2l;VPDD;TWNLJKe%NTf4Q`oE_KIAJ7>86NhuaI3361Y`AgtDTV6HCG)=4I_ z+qNPkC84)5Jl5~y2wq$bt<~SaFTYG8`Rb40E4`W3yp`ZSu^`4cN?u(gZ2ubHSQgKy zmk`KXk2un8#kA$-M5|Yu7Ihqiig#ZrgytoP&zqxh^_it!Ny=LHS6B}pkGhp+h-Rw~ zpnt0tlW_>c#ufN1CbPS{(+e-Tr!(a~G+UP{z{4=YQc{3DYPlV>VjLnCw4dBeo<(1y zR=Zl}pU4%{q$_nSGp$`x#(y#o4d*Uavf@|{c-Az z>5$D{IlJdY5@&E|uH2Oop4;-2N*Y;~2y%gqe4QJJ0_uqHbQS#Alz53H?{ROba-)s> z&(8fCS6oNLI}{R)Qd{k`6K7;n&(HwU>ypOAhx7<6VMmTDcu*gyhC%LjCF>)tR`E)t zl=(UNhdPF$Hs`5CxCvIu?6Sfu113c^(U+@YCQgy#7*V9FO9J0SIpzCKOG%c>RlY7$ zDN^0N!)kEnJFz#3RV`H{Hf9?J4yngnG3)*B#fMxKqb=<%73lj^@Z`z(Et%peP z$iiELZ3<%OT(Fd_XuM|DW{u3JPSU)f)wQ1G#h#<9as_j(4|>b~G-D4ujx;y?*YG(| z?&zFUQ*PGZvT>HI9|V6LywXB*2Qy`An5S$yQX1};>l*VgS%XI9_2R@I zOeO-!nhhE#Je7$eJ$udZe*M>DS9%Bgz0jdjV5>VPWy#P`g?5e z{Y&9T6;~8CRpjz!VYOlcqbVWBI@*QvK!3$FLyPiHF`8S)+e#Gi7)O|86ro|9XOAIU zcozpARJygOWok{3bxp9oRK2|pv|s!wUj)VLw`>)+nbAX)5LubS7;Ee!mxCmGp8Sj0 zg9TIQXx-nzf5$6az%TEhEyqIb&j&vT8)J4$eseHh5N6~_xuAZ+C z=kEPKd)R29BVaZ4T<=SXEv^a(P)^N>zPG~WW0^T$GRg6YQB9hINUvfI_Vo!p*TIZv ztltjrHXT8JZ&70@t}g%>_J-(s$44W92(4_X6JY=NLEUwYbf;(>iHg3y0YQ9TYtWUZ z6SJX1PQ;$i-R~UCmm^!jgJ4o;>`x9EWsPPtW>He17rrB>CstxvFM*jH705(*bj~1z zk^R#u8`?T4&&`~zhem^g7<9Ks;t|_Y6t$kK$LHCw`X*pa)Jsp}jmIE8f$bc_gVP%B zlhrNN;UvLlO&$bezmv`d2Xq#$W<6y^_O%xxsns0h@C^mP@|jBX1zllVUJxe4R1hcv z2-VBx^shD%4NbdZ@s_#v|Fzjt{$sNZiB4U@!7zFcOLxR?jy(ooV>8{wt9G^#_AioU1Ojf>M$~8vDUJBG< zgQ=RV#!JA)`b?t-5c0PT(U<%QgW?NpFWA?|cOtxO;nt9EH#=Qv-{NG)jMY%$;7ep` zvY!;VRB_z|xtw05^VL6;d31*}E6=z(IG({Mgm?_3;m`BwkC7{T(pq#E6)$R8uiaAfR1C>pVr2=cW3x} zKDZwdeI@+#c4!t^JPR+n3e9+92)o@JD{FqcYVc|M+{bGIsQo12HSnV$89ZdTfcHllNAUXSLu|eY$uW7Q) zNK?EP8F?#wF&`UbP<{R3Q&ytb3gcS4!zs z`Qx8%^K^2Pz9yI&!a1`c#N^71X7X#5|Je>>a)pUu{1Tq+ zV?;BY8CM9qCe%BpVPXG$2Xaoc>*Ch;@i^v9_g3C9J;SM9;TFO*idOBjF4G^}m!8u9 z?}73EzR_(kV4emJ(O4)C4rW^Q>oFmC|7=wl>mk(?@+b{O;r)p>tlwE}u@yqcQRQX=v3(FYkBw z+(#5&-adV_pdR3eyMw=f_&z zJ0mayfYDz~Z0f5_`CC2yI?h=69^f8+V(Qz)A-*Y~u@8hi{})6N0tj za%{5a%b|ju8sR?>aCiRS`(y`31SZ&-fp~xmP`#iafq5}HOz^b7NCGXDm_4oMy1os$ z3TYqD_oFl(Z-bDN%Fd^`aYJVZeWy3sGzq(9 z&3)_#+RwbgW?vLaN~C1{fi%~b7yHo1<{6=V2|!~jdIny95L_cEfr;T8S#Tom?w(NT zfAc8!?f3lRF>`JcnycwvNGT!eHfE|4v;Ne5_k6QQ($OB|)@ERV0YW`?oFO!(C5lZBOv$SL?5twwMQTdB3#Zf2BGw97Pe>m#Wf*%rKs@?^TSzbNE#`{#{^Qp zixL~K`&;@#|~V=-I}g4gnvK=YuA%738h$DyMKAjaXG z!FW4TxMW%U){<0j#w)T^h|>ycU4)%iN#1jksMlG|i$4y`<(GSY)rM%C;QzG{vu@4t z>>>vHm;~)xpt9hjfceYDS;*aM4xzmEr{LTScsxE`rNIDTyOcw z*$xbB%|6PsqMyeD4U8Kh#^H#cNd}hZm?U;B8iO*pP ziPh~+32q4|^Nv_0?+cs6OmcPmYO&kGAr=v97^;uP)3 zbdbTAC<(?q?@u*bAr2oGZcN(@?^~XxgzBl-s=E_dM>~y#w*DTc8&i8HT&M)P&7~p> z@l|e*lS5UNky*3!R0q+vMv4z&%XT)DJ`#=&O%bYVPN-Mhb&xd&%$fr6?39qWg~vSJ zg{iYu$tCt_E5i_E1Uw=DJx(-fk#yZ3$-l8m9N}_nRSK`JuphPUC=X-cMAX3Hr5!J` z7d?_1p9v{e;a;;*v8N`4B&a4HRDjT#SP^dG_v@DvCq7`zDr&kvKL+xXf6Fl+j)#@J z)PaLC2O`=pw7cc$HZf}X>pu~H!$=f0Fb=}o=?j3ZiiR2HQ}I)TNpl&Y9b0(c0M{@c zz&@(*Q>CL2^pvlCiW^wp#KK@A#n1oXzFiY!;AH_lk2!ABv^(8qKu#c3fwVut7)Hkc zm1|{r&9-qmftL3u&9x@)c@&CKQ^AjKfxM#@(lCmn_9&1&0!;Ra+Jx*Gwm1hqR@nVwh{j zz!IP(Q zulV*qcF(^)zD9kUXiim}B_v*F1wnAqeP4J}h17yVWU!DYA}5AWQtga{sW26k8C}WD zBr2^uzxO6yma}n<$Y(g`LrT6}0r|{XhhXf`$k$<$id2DH$ zK@s#%=5UXH{e%4X5`%{v-%x;Ot3b{t4DJb(=`!GSqqj5{7&D0*MhgXfe0iLI z2ixH6RG>w*OAqg;j_1p#cMn?r6%bwsaY@=C99;}0 zdG#%-je4QsMRWQ1M_~#?!0!$qQ>gN3Si0Xaq&Tu-Sj^T5650LrzG6#Hy)vI!D5Yj< z-AwFBs)=_1PpTE7neiICH9-%41eoC~qOK77Qh0^qQDvwSfwi<`+s1?9hu-P2q?!mU z>qW&$fijSIG=XfE3VH3_En*tLt|+&&k(v&~-+L%$vWI~rfIJoW>~pR7K|TU2ix`bV z+D`UYE^r{VGx}Ej;_5HiRq$Orm5&Q$9Yr{tnFt@$^h-OH+{ren-oyI9$#Pp!V9IzZC>ZdeEk- zdj<(-eyd8|iRB#IDIavkRH$~DEBr=-ex z0Xl}fniCjVMe2&mkA)?yY|R42h3MazQ(GgHZ_@~w#Q=Gq=<)tt`_GPbNk-i3W5E%B z5Oz(fbpPlq4yZDJi=eo8P4JDBIQYZK0vPa4K7Wf=zLHb_vtrS_ynS@oq$d|!LgeKk zzLcllo^tD<0dob_xsV`Xz91!UP3enqdsv@fB0C0nfImrAYD&|BYwizbChHr!PFYWw zYNFtzwzGc%90V3ZNJ)yk$)HpgSUz;^9U}lBuP>w z6c@OCM!2Khn~MK%KmUEKZ`B(R^5R(Q@j7wv%Zv2L zhNRL1_m$8$pg8Phi;CLHU=`vcMWw3|C>2||%$5U%yi6c<(qp-jJxn>ac?Dz?&Ytk_ zIC9~D(dp)X*qDTe|&%)&xYV}>J%dHFhC;TPAPD<12TE3y;KFdJn6hJ-1c zQiLZ_*rinPNoQ$pafYT0ZK(Hx;oki%LUMo1@*{=LWrtm$dxm}oHUwUV%OMz)>?i`d z6KFHzGEl#UT224G8=sR3UhfbWl!uaY&QNF8?vgUPqTR;^6hc;fbgg&Mq7A9X(Rp%0 zYQKx+g|LDF6;732F=8DyX87Wag4~!9_IEkB;OpOv5IA*dl1nr`RrfcBIJK5XSC_Xl z@j@g+ifISie+AY5kC)JmaEt}~DM#;2aiTEdYIE?E4B?gD(Cd8IVycm5=8l!Zkya|Z z`;7I6DAK8eNX<8FO06Van;$~@xTZc2+1cf=8Zv#Bv611;*367Rgj_@-blvNac%{oi ze!e^)09sII27)?>PmXKsqEYphyx|-h0s@AxPi@IjmC2TYmEBQ&=2T_=9&>LnK#5GI zXBi@0Zw{ANrO2eT(u}`5^+p^AvlLnb~ z3jF7%>}R@XvN62|LP|2LzLhxp;6zqT&`+9q|9O`OYjW-*b-mfhtnr|pX0)B1dn*Pt zymd3d($M_=G;9ncIjw|2=q{Ic3 zSA{D9stRF;)l>*Ys+e8LtH$;onEpZZaL1Ta1?!Vz%Hx!wgXRSKV+=_R{@UrU*pr&g z`TBY*oSJQU)+eY*zdv^hQ+fM1H5mG%^l{QqA6WLkZ)JP2;%Mi*ppVtNhLIlKAnkt4 zD0-msW&ZvMGN%KV+xw@`2^&ZY6xx2=P-(>yq-9Vh!~Sq24V}lD&G0WPx4_TJi^9>Qq2=+`p=9_Q`qlg_0 z@0!b^@L;CWDp;VsEnbJY5UUpC(owcWZ(%aEeQb_!CqFK})jlo~Bd|Fy3Hus_4?KF< zZ*3`}Si(3}8YUA99cLz{pK($DqXnScxmj94-B;Fb$hNt=@w z5}JY<%+W%A0ohxbVblE#q1Q^K=@4)g$Z>}jhIhwVe$%&UG+i>)_ij$)U+I*|ZjY*B zO-VeX)^6-T=6@*KhLcpURVf<|r1a<4FM2xB$3Se%H;$rtmrPn4L1Rt$L2X_X|L+F@ zN_Pl1bzyKfy)Pi1@oHNBzYpWZA)|(R&2iavmIJ1fh>1Zd@@%Vw>tw`8%V&7v5_lkS zL~tNtZv+NrfHenqaC0_mxFvp`p!*^3(dOq786gP52A+3-5?lD}|MPObL6F}$g}pH& zlGkU4QzU8Ky!u`aQvHePDR<@=UTwyB)9M4XNS*YTirHQ1kIcjq3d}Uap1IWY@70^` zW>{n0oQUOY*OEdwR(GJ(i(&Wt7KzQ3hlN2QP2M51LN#qNY)TS}`cqJ>5o`CGG+GTM zZ+=j}jIBdv)NjfF!&l0SW^Z>?%MFx}hynV+g9TA(7h%%ridE_-O4WoJQNiwZt(!Ea z3BP$Hu!4dGGjgU#*+^D^j83I25yRUp^Yc?&j^QduS$QW8ZbKQ)1qB_lsONfG!1`}$ zOT*D~(I8$ShOAN4pY=DnW89g3M0Ps}aj#2Idbc9v474nPtP=It zA7?oJ_GwmA^Rx{(<2~+E4Co|)x}zN>aV(Z4feGR2txbCDQYu=Yq zn}yZ^v5H1rMkD00-D!W+*9L4!teR8vp(Rx;4r&PZq<{9iweh#Vg1n(tap>NmxFmPZ$<0D9Jdw@j1*WtXkxaG)@}ZFZwBcXAzeR69ztz6KBz#buHLM#&FQsp{$`^x^s=( zjgHV8L#A2dm+c8z#WX6zN3!YddG}7=??Ukx6 zWW9^OW#?^mq{DWsYexiB4w)aRDE~+w+Q)Rq3Go9eMADR=DKvBE14Ya(Nj{a(6tp-i z4&ZCeNrN%7u`}ZKS+b@P^~@)KCFirU_I*prA${F0%}p21hFI`|M1s3xUmsm$zMq~@ zWwrI>%J$EW?M-X=Ag;x(y87aW4t6-G{BLoHrq?E`>4j&6!4qCZdTCRXD^1hKy}pRJ zOIko+|Fi=OQ^t0y>+%@s=8c~f9g(g9s34jd?W|C71;?W47rgsaEgX+eb}_Sh_{5QS7;KL5w)3K1XK zY@8H?Br(`%oW;ikQMn9(j3NpJcPBg_>OTzijVV2{tKAa@7xaH5Z;Lr-(~e!{GS@~| z7b1q;3=0R}%o1=K(Osw>DU`f+U&g^H>gG(5;${t%`f=65&Pz$S8&3pXGZRfbW*hF#^NiU9}Y2>Jb}0_k>TN=veY zpoSIX>IOn=ns$ft>L&W8{!bSE|Ag-P5ct~^m>+Qr7;u3xeqem(+~JisJ*5@~RN5_q zHq!)n$H1IZd&&*kEpk{%hB)D%(@cqD7$n%-`2+I%|m~&PqIbz%!!LEk~~`JKz^hWPy-u`ltI8b z&MtzVadgOAFT_E1DH!~ci5Lo{0uEeI4W-g;*ZuoWw}FY^lRD5V7B^!veiG|$C%D@O zMttk=t!Jd$S0BR)4@bCmRxI-ivm=g);+Gc2_fi32Uvf}9l)Fk`1D@wA+Q9EX$U#47 z*!Z|#?Y=H$c)~c}<_!@M>5H8oQTy6dvP8wRq) z?oDnC|66$bDW`e}Mq)E{_MJ!7nw<~AWZ0-|tQ{3jj|oG;B6sHxE1-Bf_FTgKe_gQe?9@$v+CT<{1T7hXtv%BEkOPL2fi3iedsW(`LDX@q}i3yH0BFHl_^lAXq7eJ*692=!vKIObM1 zRF*4=tOlA=i1SmJW;QgpRdXg7BSH})jh1x;{%q(T>1Ii$M&Cd)?whpQXK1R!*jCW< zX$tG!Cp8~IHN^{Rtlk&>WAAGVM(NS~YqfT6lf`iF@xv7%CA^uYD_P9@TXQ4&yOlZt z{kHYONIg@f-(K>+iXmta{&Cl4L9gHf6_4%wB#&LG<0MbJs}w(S%TUUvF1yD7a$kIN z0tfK^8H?-Dm8I~xZIDBqTA|S#R!lVlkoVPI-cN6-2v*%azLnh@SJ~)=0mM!JQ7mzf zb?R}u@9R&~2!m^oS3EtfGdiPaSeCz?`^4W4rMRONO8NuTNCu04eF`DYd?ok3#Q|o zIFc2Hk2U|o<BE6$%t*+wr$(C%@Nxkv2EM7&5CW~WUe{a+WYK-A5it7_ou42-r99v4H=Tuq;^G^ zzfUiEWLr&EQ^hSeTS=-It-gvf zTIbLFgd#B8zOe@P*>`vFY`M$o^T)fb@j)RProX>!#dLNSv<{mt?ti_oqoYDTz-)IK z_TCa$t(ft7f~>?gG`e?zPo!M-*QD^So&#S0r0zh3ybZqJoc8#JBjY(8o!h>0Tuu3) zQK^1!S-T6lyq}lY5p`YYP<0_x()(xFYxc;bahz z2X$jk0o>eDN)WrOWx?{HdUNG-@o;y6fvKL7aH*eW8JMa9hSsb zWdE@kV@PAl!`L}m`t6Yp2K1^ueCWei#;v0W3j+MVMoh!t(v_KgRM0Cr0uj5}o|&Ut z!IvGd`T4)Y&{?1(7e2j+^wFbpbR;5nx79W!K5j6sd@YOJ+U?01odCRf!3e>@< z*k3O{du32^OSkV_)Tjz=Jl}Iy)gWEzx)?CSj+OU41vbj}A!TW_f->K0^4~VT<0!@s zZ_LGm{Jh~ih2F|#Tu0OOeg?YW^;MjHuHXXh)BpWEqa_CpQ6`x_&IIZAqGC|%x{t|) zyej`dpsQ{}xVQEG=iF(0c7cs65n8c^WoG;5y-CjYi|Z=0=bx7EBfC|t^^iaGrYqL4 z;6jKAi2?8k%R6gax5~J~T@9$aAy{a;F)Nk7p(aUSr6=K&{#>Zron%PWohv8m6dUYW z4`rZ&wTYBkUGnRwaLA@IZxrERhVw!~Jp|Rn9=>?j5@U_lug7=LKWM_F=tK_~EB) zc3?BGW+HEi)xKt+l1D(xs5+ZTp|skWuzG)_Gp;IHpoMu*9T6z6g@l;m1w~NB*sybQ zJr3kBKqo%pLNb&WBhf=_JVL!ta@OJQ?6VN>85t7-si+sQZ|}2FH<``NrMgm^e}T5m@SqJ zAm}zXbtfy%+p@lj$eN*z$9$4AF}h9vSY7>#DaokAneIpxsd@xz<;=?JmdXK~90hy=IOmP+Xa zNO)}6%ed8y?9e1>*gyAAlQbp(pBuu zxlw6&Pr{D)Ziw&NM7dFX+CZLRL8?Ks z;i`x=@78hU2MrSXT0hS7+YLmvf+?E*Yz+m^=jpn?b zqf^Y!Q-BcJ2z;v0pXUVCkC#<~9MzMn$l@I;n(h;U(kG5O5#ZDoYN3FX?VT`&4ph9Z2R6E1DU{c#NBtOgy-ME`w?T}U9?&!B)_N3 z6h2n;@*l)O9_F5R>wBm}W5>lV1QM@$AK>f?CMn%ZF&)0#R(3x$B1yu40bidoUGE;; zJ|l#KkvPmeC0e%^S+N-#A(_4^u+h>CpSJF(Mt0hu-~3OR54q<*9Wd_?31+EJ@V&IB zX|0=&2i$}AZ>Y7FseqP$BuFBz^{Dr0LPJ_Z`EI`BIO((|YpeoHM?4R@EN^WS#zIwW za@Q%1xw$I2asRvjuPDOr59?^BAGRQ*VCGwbC3rPJlW5Mm=!)Lc{)P+iY7I;3m%7cD zSFzwGuCmT~H`lIFbOktH0UJUE;J=xvQ5JJ-s(v0RR4jIJr_@may_q}vIhBLW84 z57PtE3kF0qo%aW0@EmB_QJh9X^COFi`~0_0EULsbBIy$HKXb1w`ffM5ljw!0RsI={ zk`eYMex-gg4$%N_TvF5j{xY1CTqDDDG95&+gPY5xB}Y)3iX>~_X3P+FLjT1-T&RGK zu_yLYn=52x1ac>blB+CaWUyw!QR8J$0#`p8!7;4{L^HK8I2#zy6)L|aE@i)n;Z>i$X z5u97 zYm}9A{faGyRo38uC4oXw@F~%?Z(}{UsE6SlJ74h+MOgPz>=38`LM4$&Vs?^eg;mvrLLNUo^7IDB!XHyW1eOweCsP7V$+d5x91 ziFI|2de{z134cz{c6q!|u#Q%J3pyM$vhFx%(gFRqR`^2x@hJjzr%>4LsjN}HTrnjO zEJb=voOMfQ^U9UHHr?1|TDTVokJVN?{6oh|+`NTA`>AM7=PZ&Ur+5hNfKG<%Utnc8 z8XL^HLPq=@qTcY%2R&)GR;1n0&KKsXx=FN@LX2%cY2g78uFm(O)LKUYQg6%|{gviR zcHJ@|E*%SC%nljNh~82UvarO zcevyat^MIHnO>)S#Q4RGAJyUg8<$AL9{MpIVtQE!B{O8n?q1&#l$YfRg zkr!EsUa}BC5%aH9)rVi&$9>Vwvz_o%^NfN=J?{2tr2Se3UE20iE?d2sKD=O!AI?JR zOaNLNei@H5D9-P!#RADb7MVe&9sNzgx7AIRs570Nyfzwi0chObhn;UhLqV|>Z{mF* zi;6+%s|KRviP-=2C+sN*`Nt_TRFZzROy%AZ%KzXSM{xB|<)nZts^ibA1koe(vR&+k zl;3^jG+ei5O2#DA(Rjpb7T?iF!=lX05h`rb(?Cpb^yadu2XMFBC8P*&u_33a5_O72>qk;fzA=+ZNP5 z#rP9sJ_p71F9d{nS^57&K#Vjvo!#a_pJ*Kh3;#`k5Tp&5KLj}w#}l?{Da8ilGb%48 zPK?C;bjeVzOf{y@r;jFdaI%6dLh-FqW02Rjw~cR%IfkEdUHLsTPLQREMeN;-cr4AS zs~%u~&=y4tQqqvxIiwR^P=U4WKMi0i=41=ddU*3PE{y^UrW_S+>Naa=+B?u|mBRh9 zmha3Z&oHnee=;;=4&LU%iho2t=s!!9WJ*XvNGVI=b9cUAi6jszsiucsYrX=@m6jSU zo({#k9x;u0+ng|7jjT(6b^6iPxYHm)AwdnlP>dvIHp1(jF3v+&?S&eu`zk^CoUChj2kL6t+v;IN>#@W5Z6zl zbQ^QU_g#@BqnU13@kgRjn2fyO8&NL+yY1ch2{*w`6cBlE6QRsvoA*=6)!QX0Mj~w7 zKapt>l=XMoJ`zmq;}+zn9ioB&fb3{sKie>J{6^f_0OKt}3_gWyqTp@?d5s`=n-k`r zw>PSk*O}mUpX2j}o9v^AYaE|$8mfuxwGQjBWkGJ)K2S7c5VaN^<{B2Wdg0OU-vM(4 zC2_&!+pqX5WkG>13TH^dUp=hUeLCQ`R6Qo)^IJ|Io!6qIE)q=i5OybHUjiC|OO2Af z#+OtNG!!pQ=4?MFb;BVxz=j4PJQjtCVH!UAa8Wed$Td&VZ-AF@4x~lkmgg&UT@7{Z zH1*eK2ysKAZ&U~eUE)RtuA=G}!aikCQN)_NfZXx~GpM=&yQH_tgMx7pwUlYOg!&zI z<%dTKiM1<$Sr@H8N$cwm2FbO7okA8)`xjqH^*ZG_Q<}+`nVe4O4{;8S} z<^A#A-pdqC*EEF_`QV|#(Y%tRmSceqKXTW4-Tep@cE_<}46*gY-_K~ip9(&;SSWms z^6y@0R2cut9$Wmo*ZT{50YmAvz_`htJoC}+&#G$tYOefP+JbE_GzKKQfzeeqY1FOh z7xk6gZyS}X1|uC>zW>bT{iT5XojS1QF!C58$_LkGW}qEvRCy9e$reszvF(^!BF0B& zE#P*8SrVfosDF36yZ&ZH4L4FUyVmBoe*PEc!~;HxwDVm(EUw3UOBEIAjX^~=Wbi}- zH+PLTI`avat@nv$a8*LB8_H#;E@qVRUi&^sx2N%-x9J#q*s;OA?W#(bn^IYrnr`bd ztAl6wEL7G7)4Ye|gJTyRTJs^-e)Gg=tz*1!5oQ5-Kha3d7Ll1mC zdCA;lTLIZDU?m~~+z4E=kL&$M;_^2%p}hkpI*Vnsqa@@AouM_tojhZrZex60IrEs| zR0qrtZ&~+uDHUg6qKdSMj^N{CNXc@kvP%KAnTr`_`ohE9ccTLS(x@~w?y;T0Klr-( z+`DtZ2_O*mjVWUwQU48G?Y9PANr^*h$!>>$?BwvXY~?6D_PQt)%*s2$K#XsxML`9# zzc_i&5q~BGesm=^kyls<2@+z^D*TJMs$?q~Kt6<9z3F+sxk*6I+-UA&esUAHI}Xr; z%;#z=o7O)umBxi1(B*vr zaTz2maH#SIFv}-Qi;t)N{>%e)s+QxobY+)6@QhV)dnqk-GM>Oyt@I6qa{3aa;$7iq zjyL`-<)&AipSdIec@ex9eUXD9cbdE?kz(=wJr~|ddY>!0idI-^q3xuIrHq`xMWN@RvVHIz&~-o4jEK zaH{ohJAV!Sv~)i?*`ykysglT@4JHE zC>o;==Nu&Gnr1%5%9{U$rjeTOca_=|yM+@Vj@1=@r53@Ypofd$tskx`$UCF$b}ArD znzw6dSV4z+24z>GM_sqS{3C!!^1B>@>V)ZZfDkLVRPko=_#r^vBVoP;0%(p|ARo>z zMRm*ZO@)Jb`Ya!d1=m*)A|>j9jdh_QHz51RGDj%lLA|tV-4vH^%LS`W5m42}RWMf+ zi@d#zGtwLup`ViM&7+1*DKIJMX;&BRH9iDX&BXgNPO7PDzrR>bnfULCqW%dHe0L~z zm&Y6bwVdQ2$5Plf2CNAd%}NSuYhuW2KPX~YIz7rlL!pYcaa@6EgNj4U-o?KvO4`uj zpwbG41VTKz?G9wW=}y#{nl_Ng;sw&y1=Za^9Se1*;Df7x5S0R9mzMFd)nSb;={t0y z+vyPTYGYGw82>Oi0%?mO6U&6%USR*dNuCW~qhG>;ss$Gf?n)I-IDw)1n9^6^tER4~ zs5>G2e0woX2`mjB!y7UC<*b8oigfg8;LHJp$w#u1;~TocTe8|HC+Sa7!(!Ibg_rpu zf)1!j^R|{*n2n(%`s*-%cjhS-9h4> zBw1MUDo?N_S0C0HN6DpRw@6ZWVaUV;Rsy^Wetsj)Pw=|TdT{ygiU#d;l%=P|stY$8 zYBapgy1e-bs|XvsMH5|Uw)A#Lm8l?mMhnxM`u=o!+9G^zj_M1`-dTYMjcs8shpgJZ zYBZWqv3W=LD++Zpf2Z+{XaUpc8-L$#*a74E5YG(fXUS=@zVaRAaC?9(Fw$~~1;(MG z#&UG(wsTq~PWa#o)y?2`kng@?5Ej%^5G0f>VR{mvbNLI1zNR4ivC1?ASqTryYD0Xs ze~b|}cXG{bP<2Ve(-Xs!eL`Q?Q8#p3?TWS^?sy6zm-h$#8_;`S7{uq*S=JKH1c}X9+{0+^J>VFOh!S*uaWb`vSETJ?NC@B`xgT(@Ke-Aw@YC zUgg6n;`Z~`EzJ7MVos{8JuyXidYfW@Oc>gUAcv{_zIO=r2bV2Wrd3SZL$6Y8orWit z|8@Uc!zYP5J=W%h##f0QVrAO{?Wj=4)I`UU1U2gf>ADwYox7;Y9c^3Vr}(%sE(qK9 zG5*e0DsPVBO_Ztjq-!J8+jf0p+3;-jvd!(7x$1dr6tud1?bV6#DKOi?QpcPA!ooC< z=nu-js(780s3)4sEmg5B0!Hw;aNMdH&qHW?{8DS2E0hvn&aW6FhYQc8;gopJ!>D4V zWqgn+5`Fc$Pf*03D>bJeJ&*5LuiBA$BfZ^Z`oqg9qzula8}m|Ym6FG2vy^2vQZJ2r z{O?J)zZ3}2H(8oy{I<)1QS;rqBq*3zbut=WUE|@3u$@8TB#$K8* z5v2k?X0+SB`!UtCAys@e;6+Amz~>-~EPM!l91nC24sm}e%!*mCs=`7RIXL05Qr|zw zLlS8P<|Z*im!6}#K=JBIV~j-s59Sh;^v+WXQ&c_2+u}m^FV3T*DaCPGKn;t+&t%Ig zC#U4q=K}#54HGpz}>-kcdWyi~aoBqhm4%zC_zn53#i!Z<et_lys)B=XYcsNL!O#Q7@N8L<;y?L{ zTqTk9blImGP1!M#QZ;n!#QX`Re(m-g(K$s`zsx?*&Z*H-oQ&?sC=VkS1|>K>ZU&Ch zRTfKuJm4c?34~ig4tv+1ZArN*Qi-!jetlh{8hnINg_}B54s#5lM=f~mQ5FLHkimwn z;u|kCgHy+(;<*Ggoc}R-m>!M!*~J!36Mc)`gxoXzQD6~HMZ4S5F1eWLc>}KO|-s^CHZtLB*^VSS8_K-cZ+qGDVyTPJ=u6H%W#Zh_t^ivi6{o*Z=-Jqn>hXg;>SeBBy z#2#gLyVQEQtggEe5QA)`ww%$t(zb2KrQjm1&>HKO`am&F; zoaOHSPtGP4890QUl~(y_oxj>)!8FsukyKPpEBu{l2boQUND{ybTz^h}{84$H0b6 z?jJ%S3)u~&z?tSO79BHLHk&|!M&-cmMuH5Q;BzNA7K3@ol-3bBLOpyqc-FqiUl{(( zIf$7owpXn1CT%IAxFYx(mj8x<{}%xK_ObJh`yT?h@V^LPuj-4;WQuQHc7UN5&1~vb zO}4jf2J3V~k-ZPCS@%U$q@yxv(yN!k6XGX2fem@;)73al_%Z8O_X&%?~* z_p=pi*VIk*RalgTINZIUTMOMKsU%)QzoNq{3=4N>Bl+Z*h=m%w>6SCduvl$PsOI{^ z1ccKO9Xy|>i!vazYh+g5JAs=^6XLM6Oni=wi0(QmH?5)j>}_(-d1W>N{0wceaIgz( z#SoRICI+>rZep>HvknLghQ{4rnQkxSmOV%qdEW5`bbU5l*AAH&!|N5yhxgXA`1TFnMY+8G`hG@jTuPVk=b|;Y>BEmM za9&q??m>?GW03>d`ZbD{>gJY+YPQ}Oxtly8sin#NfKJcoYeI_N<`UeS(}RikyY5$F zbsGj#!bg0~s()8aC@a2I95q~0+E)^6%G8cnw|d~T#~C1;_^Q=f zQJ>ZU7kVkL>3+$BIaAg4%R{HYe(Fw(o*^^oukq)xEB@h~%=?1z6tw0?TpIU-g zLnM>|2$iLMm#adw#+48xUC86Cj+|E`>!9z$=Ii+PW)ZKgnK1zKKrRA#1Vf&K2ZgJ# zOcpvFblHyjN)obv#IrcjM(e(A$W-k3vz1D0mNt(*t&^V;;6dDzG^;`*>$ywyEKA13 zZqhdBpR#e4vr49LN(u{H0Cw^g4;j#(!j-Kql>K8Y@-O*%yI(EasfU3&K-hn>t+?OV^G(932=2Q@2nk<1UXX=Fv# zZ2Gqv|J1QCeoHHcw-U5BxrFh8iFk-1`f77_)Qj3Vc9jY^DoQctb zN5;&GFT5bC;PQkx)`MYXwZYWz&Ij5>B&CVGgW&kR168)HB5x^l9c&v=^fWl=bk5NT z-=AK-cx%CRj^PNuZM6(M_pYq^Hg4yax-K%GBgifn-j)+4wV#(Hvwl)q;f5FXx>IK! z`7Z?1K*~r63dSLNYVv4U7c4f|BA^1UL-KTML=7dm`_l#5quUs? zSXM+uhx!a|)0iVv+nUMYQHn%``ZSW((M>c^Y&gRQFD4dtcZ7T+EbL0kJvBk3GSwiwnac@GV z4YQuydQsC8;^)Oc*Kd z(zLJ0H0s|T9Gu|>I&2~euYk4=d$ikmj2?xE+((@QH3k^gq!$<7NasFS);eI*Daw|v zVd=)-vXRxS4>6peG7qE+Hi76(ki2C~I6)i729GC9<2|8}6qm^gawx7Z3e&A+Oqd=l z@K_s0Yvj;@HwB~)O3CDih(Y@#$6!zAjFiZ7Qd{{RHNdf5^zqP54sH2$LY%Al>38$j z`FywH$hr4~kJx5JtWl{dlo^t9wIbkYy$m*vAM6slO&mLm^f&%cIAu-w51Y5hsB_@v z=h>aVB^GK1G);{~@-B8gxu3=*A}DU&&v64h7w{x7y3k|49O~?KoSw9}eb1SKx?EcP zzM9zT?%R9j?(Tx!A1p-I0~q^q?5ec9IW5T4)C^v&s1SsNH@=@~)Cyy2HkdKQf_NrB zs`2tB*l%i^MN#zJm#sT)*R*(B?|tQ>+7yBrh9d>YoK?s5r`}jIwGTq;#=g|wtV9ci z0g(08WG1yA_5Xxk#wFR|S#w4`BqKRomY19=LETny`-7MvF;Mi8Cvia>Vr14V8hCd? zI5(jj0I69fqDq5D3LWw6zWbCwHGrp~8$n&+Usq=0I{D7lqAG=wleYp>{Z1xP!N^jYE z(RzzdAt1w_p&7Pu9Uh8O%FM$L%u79^K54`L?Gk5HSA@5%+J}EtC)2@_GfQNA7eJ`w zIo*7WYIGMM%&DevT}-3c`tj|42?hH3=(5>@|C_Dmlg7q!JOFj5&E$Z*pL6t7?QmAz zsfoA3Z||7>{YS2uo*eSRl_T6~-v(h5IsuwQUFOpG-c+%hR*ZV=`)cL>`ROqjr5VHk zM~A3x5!nJ*t;r?TAD~3+Mo5RJd`v| zdHoS-5!9Qz`mPj^atIg4;`=QiwZ6XANSh=fFB@DGibst_37!%(L$$e`T$wtqE-0Bh zSi@aXG8<9v3mMYSg~_EBL%lzvKK?Z`w^%Cc%4N~KadoX9BfI~e04_^#&g#z;ricn( zFVl^Nl=v;6=*ek8ed6fFbSbtMD-I~05@g+z3lti$8jThsHdIs!=3tO|B1+XS>eodz zm3*%Q&!j9B@DwCQB=-|6kC)tuj!**YKe9gZz8iN`c4NYuK+pKu0`~8;g(J+!4Remw zXcbXEH$o!oy0Te#Wbp~RYgXP^E&Td_#VyvH%7aq%C2Wq2h#ej6k9FA%j2tLz1%azr z!6YNcX%x4j#?$Gz49etv0{f?s;_B^b^UZw`he%(kPyWik-&!qKz#LARsH5>dw(NFfUZC~GW(1q5nTvR@Kq8N<8+$aYZad?{<#gF^g zx}z>N^m^dmlUs;=Z@Cb#3}5jdRT>vET8K-r?@RrI-7rT($XM3_@-! z-JH9=5yP<4uyKQQ0waB;e-IDMB+m}hvj}+DyV=lvI3h^1s zACuPQLx<1)T8=d1*%sbYiU*HjLv9RoVD|;N=6F_52KBwhFhqUTxQ8qC#80y3-+|GS zXnu)04TFULUGk;sAiy;dpN71_1&EW#W1yJ=e3;{^2^#J2&R`sN?i|jJ_L5LIktPiI z%;~C01HJ@DIKWG}N5I&73?bV<^sZli_sdp~?3-jDWQb5UFEgSKe_&qEwJQGzyr$s3 zO^1vh8ZjC*{vsxeJ@1V;n$qw3-W1A=2Ye_O<`$`V1t_lg;NCg96A>p#J9m^}Q(38b zwM93!<2G6zyii?D1ujX+JObaE6XV7R{W$+7wT4kth>z%`1LXi5)>Bpfv45S3)@{*& z5gE)BnPL7qt=6|JMkr`MDI3S0^mW(3u9LS`jb>)H{)CMh6hw*)<_5(R>XM8b`Dz?9 zH=ZIgU+ZnMw~wtqE~EfvtYQ{<91#Pvu?(O8l7XR~HzIV!!f7~oLGm@95=3g@YHU7f z3xp^u{{Kc?r~+x`b{$&a=}&3~#k}+e-Cf|?{L;uaJ_EIaVT24NfQrsIV?s-)N1B0F z7wypdi8~}aamGW=$V5iL*S|l{*u)K_7Rb$Gx%$@q)*Ny_HXH9YFwjF7f z(L5rKhrj#WWkZd$x^Bl@Ubd>zfBb|2KQm%LC{2Ya1F;-Yo$6ueAVWc%#8(wp`TcEG z@S)qo35>KXY(RG#vfjmM4RG^yTsfg)ZCKKhWEQwr3$BYH^3pS7h~@NNHO!YpTR3`o z^o3$_Bu$fsZx!9w@pG!d48_sLsAjrj*|Jsbq3!5aY!(D?-23WhA>>i4zTfT9Wo-{6 z?99ic-d6NNcmD^86Ff^l))YiHvx@V%m|eb0C|dhp$~vbBR?NkRs}67g2ac^xvW#gq zp@_ZKS8D5L3Lj$keyTOnEVrWoJo-uV*~MBLKFWUZzw}Pn{(B*RN?JJ+qQ=~JA^A1# z*g7+uNUm~xd3aZSyHE)K$Fy~sCK-t5nk~HiqOaUUulBq7M=5=im>0%>?2%cH>wimR z$l#XuSpFyG&GAD&4-%XrhVF-9i7f`^dbbJR;G=JhjwY{B$>Y3!kds8%3{wRJgN}te?s=dH}=s^82!vA=- z!k|Wm+RY&s@jg+pPRwAn5v+#|Uxxo3);VMy>q68# zjY~3mpDzcl>vO@COWdNUo}x9Wa*z1uP=g8gf+PSVMC@He#J( ze)FP_5C47OL%T-#)_z(pHT@GN{g31%u=f?f_eAzi60hd0?<^5E9{m52)cv1J{O^0- zO?Z=72XjTm&y6Rxt0>C9vIN|?CTJA zEs-*~W_6SzXsgI5l3L+3eXRTUt3y!Wt>V1Mxwwi>PZ5bWl_uTN_MZ9v=G$bCAeX`t4k7VefnPGf_ov4Xo>x%ZBw52 z672}@V z#naZIE&c~S`_=o()z$SW-K?9dh3);KVJ1OfW>{*YngGKR?BP*0_3rMLATC^r<_r)d z%#opl3@4n!w9~gxTns-daFOB9-YB$@r%7i!v^zF6b)~<2J!1q2eP?-$B;xBIO*SI< znCD;sBJBl@Lb4Z%?aR6iYQVXxN31p364+$aO>d$1X9PvQ6Q|y+hnEXpp0}m?Kr8qw zH$t)W-Rv58o5@X$*d@4W&vuCko7JXToIg7qF~FCf9O5znG`V94^p|!pyplK4afmrzIhFu2bw`hl&``AQYv{2Bh znUE8T2#vLR#y(6Qai>7u5EPx&G{y)$eupZIFh+ ze@W zX}Jg9Zp3Zo(BuOh+pr^x|8@cNrK7FyPFhfP!7it_A<%^K{Ia5)+Ga+`;G@BsP$#g9 z-X>$~+YqIA-f@rKC?JtAnw zugD$$z~m{brvZ3#yT)1$T|0&#F-)?+NJ^a@1thew2w`ldpo+_R-zQu$(+nf@H>AEQ~ z0~TnlheM%R1r%CnG(Gj0H{huonZBRx80hIyoNqYQWJ}Bh2D6NLad=fCfSUI zZ1aI6ePJfSBjuLW=%UG z+y8j}8uv@L|M|M6P*ffuOYeUs{U^H5Q)~p)_TDs4q8b!z#CN19u&&mQFZ&DMJGa(T z@FP(^4y^{{lc#t-{H7<^FaLIYEFUeeiSN^D_z!nTuyPdEglJ@lekkd{&0ySgtt3YT zQKWDGs~>G%**Lnj!6nu56Ydk{ht&qZDsi=->TX%xO1LB7tYGiL!oH4H*mN<6z2_cX zHpT--*Vx@P%pEMcxNu;74%}nJcW#aYG9lA?)eTA+s%mWKPCqDwbD)8rzRqbLu{OX* zpZ%hYUqKuV9<{{s;M;|UitBIZf(#ngCl(zhY;dZB_tQ@4{hX9Njni;LK#?V%mD^=- zq^aIC{lEUO9w1kZjyjCS;4Aqry7g|SW69<$`YY1rNzfB_vcin$Xll|zYx|J|{A29t zsGS_=t(qiN%R6bjU_5VGqP*tu5?&Bl!7Jbr(w!1iX@XugU{&GLLwkZ##j{@F+OLz; zBAJ@4-=9MB3E01SEverKpacR(_J)9H7|s(VR@rSm(zhfdoZ=`Y#4N2jZ94qat`Q^6 zF_F3yLi-i9qo>FV#M;0TnAho|J1I{{ZCnM~mhgOoy$ij0LFevPW&tgEH})#KPtA4? z`g7{oFkyl%y8WB^ADkF|Gop&$C}}qWT$^cFVO@S%BkG>>W%QoESf@UKd6~Sn0~uP; zUoqVD505-@V06k_`D5rxMj>rij5slcDdF$e3^UW`!G{j$7X+Qt5JWT1rqlCjvH!+X zoXUb{F;(}kug`W?F>P9gIdh!2M0AGR1Ff zV9k768^);wwpwl~+`5N%`?3XeURlM_($xUml^(p)uPlgz_IV*C12>Zud^7w|pm0Y!5 z5z1rspEIbk0ZTOJt_~8IRU45VNOc@SR8J7>Ex#oH<#0rJ4xU_$3sl#jzkbVV% z#CiaRvIGko=Fsu)7BbB>NV^rvivuID|G{dZRKR}+J;uDT(`-d&+`7#^j3Jmm6)I}R z0B#*!mTjJW4|E`UB7fI336pO1!NNWA+ZrOfj=UP^m*6KI=nn5&2-Q7Au^{8h87^N) zoV*?&-5}e|pb{NUx^^<$`9!Nl34ReD)wuue(gZKV-Ix*Ee??Nie|&!!1>lSd4I7-( z4eXLO1xL=N-!QOy-*}9R8&FLR&MdqcAT*H_HX|JyPN!u<+9TjY*<22H5FMN2av^hD zqh7zkqEd|*gb!e;GnUZ|mM0ifT#4q^VSjmW>=NF{!Us{Uw4KTfF@U~MAYOf$dj zpMbO|%_=>@)(KXEHr>_amVplh&poVMnX8rAV&tT-Q%s^*Moyw5!&^b?49MS$gx72Y z3DwP^ZZ0Fw{KGqkr%L`HJY9Fl&iZY$iJxWVg8mPln^#idNPqo`*vYKis}_|WUi8_a z8L?Y@VWXyZJ_I?N9*U$nDdi%MMo5gk8a9WLQ}x_d)XmAZrkn&*th0SPrZl=^ zV7_w2#>txMVX&3$ktKw=|JIH`rLd}{%p)m|wHB2{aAv>K?u)gP8_6HgcqsKG=Pe>@ zZ1>Q}=l2GcnB_(4iNz^Q=L^SO*htL})ZyN~=0?C8t0f6aQtt#fai6+F=fGlyuoQ9s z4fb$;lyimDbw>h_M`f%Nqj8^t5mRdhZu|;h(544ZRT}|u`w9>Npa4@?_R(8_+t z1M?|;ihVDfA%6$#i(`iR6&ym9Y|wJIKNHUQw|XOZ)Kk*VY(S8z!pS2u*eE`5@DMM4 zT5q2s`MCMMly3Ixg!AIn15dLFqxklSwGtpio~&u%`wI%|@OmR)KTcg;<7{VH0hx%6 z1;c`ZqBVm~J6$tBMUVUggqzt&X||i52T0Jq{qE zm==ADt`L`#M8V0r*bGqUh@q=oQdMeLPapu?fsq3f?oxI{pQi!{%E8#6=;W{Sg3-v^ zF+#C-NbQlo)Feyp-jZ`dtQcCzf3)a(^YsQY+MU==@yYhZU0^}FUjwWpu;@!BR z7uuI~r7|P^@(o2xt$61N``VmjI%1rsG}>sIt8M*M?C3u$#HCFlgHI)l^~8~56Z_|Z za0v)*T+yaq-ohu(NR?h4%WbXGaAzd9CRRp_-Q0odcSrsr3s%0>v7qnmr*mWLaO|Iy1;%UQ$9Mg7IZIS0|Nz3a9Bx%>0@nmBmsj3vKfWHAUP_6eVpxZv#N`h z(DMz6-@@vny@!Im*p74>b9`YwjlEWtSva}bY`HeX#|Ut$#vWR4^4srC*MbZ?`GZFK zq_7;1tjK-DH9ATSzaj;7wfl6b{6-8ox`Z)4CJ%Kxh$?#dO6G;MA070U@iSOShq0_+ zOSwvekaMwuf?)6X35twf-)=NE+vi4R5{c!!8 z)$<9=?JQ!aKX56m02hB+PQ5)oSg|j9$~gJBlrw)D#AD|u0(r7+lP8dwN>mEympXSa zc-&wf%ZW%Db({750$#-1&*wv+DLKqf)Z3epXoy>IAn^QdN9;>z3fp?Yy2E<#&xyV3 zU*+~0wl8gi<;$p;Qhx;j1l@*86<~>#^|Kt*FX}oDG^InC+mV80SOOu8<_J@6{M&! z4xGD)vuMsRZL8-Uq%6t7?2wPsJ=w(lpN>NOBoG43>x5&NoQ~#CImlF7mnfQat`FO)ZWY8lU;E3i7#3A6&A1 zTE>vmJbuU{HHAWFh%se&-*7Gz=4C;)8fL|iPBq33xGC{+Y^OThyC^w zwU6cj8h(@TDCk}8yqpm1L=Ml0AR)VVk2S0;&M2psW6(jE!9rM@&QAkpZ(@ zYu3Wp1%f|-7CkK58kg^TjWR9>*QvSLh|F)xgl)XTT^VDwua^O5$vBd-L{t-f<+AjT zxR4dtk1v zYY2|^Y1)reNS)U6{m7Fxr$j{eMYP-b*+?us2DoZjw;&q4$#ILI(m|JXf$Zxi#S{fo zFf+F6JAKC@??-24k2@L-TRq$I!&-@TW>D|%KD0&)-GF{cWM_p<92>p^e3ob|8F zNN}U3))XQnL*x*PV6-}(@f9WztWJ|bHVFmj(@hAE4@r%xQ7FfG#|(=SUTJ#ulTjnn zx^js3yy5L9I#CtYdN`JwTBk8(Pc4)P>Ku$q=MKZWtFx8hdi)6n;T62T8CZQkg&8Du zM!1GQa~<~@MEk!8`{wXUx24bS*d5!pI<{@w>DbvFCmq|iZQHhO+xFy~`M!B(?l95* zzpr+6xq>7cHCXRVruiGgS6)3c6K#12Lw%$;7LRI64$z^HsM21O97AeI47`N4Ozs@tPmY8TrXZHY;HfSW4BkT(qYqz zp9u$aCCw2V9bhVB$B9*`OR`3Kw`JW)&Hj3FDYX<(g1rJ$YmyO3b4=7pj2hHv9a^N+ zgWIaTBWqHd@7LsSD~@;~!eL!_n{%S@?9f9ytomDA@2OOn{E-R;M@+vPkNmMHe(CIkVQ1 zUQJIjEasprgq4Q-_hFpr zA9yM;nyo#Y)OgFPv_xc0DCr%-qm3fzH!sH7Z&(46?IKrz;lcIQ&S`=gDh{cZzi_Vj z!}E9#Uu8=wCko>9(A#EZ3g3^0xadBJz_UO zCoCpkCDFQ+w7OvhgX;-;$JX3)QGrye@}mpul+NvQsBGeb3{J0L8WP7lEg%scA4*A; z5eB3e1|%ex331xaI+O5aROkHrl5)1=K>m}Rr3@fcn!o*W;d}jJh&e%znUcegrey|; zjv+D&Hv^1%6NkiK1FTWwc=;#^MH3`BrgHc$YLzgIoDg2TGAopT_c!7^Do`D<4w zMYUWFsB7S%OeP1M0ghBq%U3q+Zb?g0xP_hk0S57iMTuZ8ZF1u&E z5`tCu0X-~Mg&mEj>R1GTAg`8$&R`YXCsIWRL~UcsBLtflG(Uhf5v#u(m>s1ZHgs;Va}%FNF_=+v81 zxB(>({mvc8fgEMOA&)C<Xi3$VMk zW@R}1QOP<^)80Ltir{&qQD+gV_5TcfQtc4B!;%<86BYv*m#GYq9#MwnbV?0B03E(M znT4Eydlu7v#eJY&^HIF4;7c#B44wFHj#DaRqL^mZ6!JAk$kWGn#Ipq~7fZIpzJ8)a zBXXgq2XiKdQ>;DOhtnu;j%(H2B)dg8`y?Xo8_Ar!#mn+=Xq*Yg_KKJXv|^o;#!{Dr z@e}ex$^Hf0TEP{Pld&y)Sn#g~66amYv|jikMvzh_XXj7@&@!!IPINOdi7}z9`j6(( zHBa>@WiF2p*v6(2_%h4%9);qG`IsH|>x1;z#MBAq7-Sip46$JuBpb2i)%Z#W;XS40 zC3=PosvOzp_FYV=tOEq{O%0{n7cCO*nxS#;d=JUGv=!{tj#S^>oH=@rWd+qHC!9zb zZPD!c=W;eKODO9lci+@S-9QU;?V+NW&Dz-MDIpk|?eZR3oR{wrWaPM)r&Mw?H9T7F zc>aQgEnx_srgwB^zo<7Of@#bQqEo|&Ru^`!Dhwgg9(Y`mO+N{D7uth=y=L}V*n|ls z7HkKZE=#|KHCLfp1$veYnAjITxFTFQn&ic@hT67EXP%9s*`?B&89LmNeFwz|M)t0B zCAOGUz$M`@AC?U16TN+#^Db6eC5{-8gMJ2eG|{keEw8PWX~?nHvM9YkJsm0%Tgbm9 z7UM||DVMg%?Y{e_rS*bj^u3a(uA`LGDbcvmA83eI3od%OU^zg?qnkpAtX?^4kgRzNVfbJA{^lL4`ITAlS z`D*{j8QnL9M9-oyEvDnHYB&MkkG7W0qxe-nQ*a6XXj3jH94NOODui>fiq_6|p8DBt zsL-}%g+1W(Bc}>zGduOf*v{Z>(~C!_)w-9y-vKn?1U)GnvQ(|J>{$P0CRji$o|e)^ zdz%thvlQHoh=MIeRZCSUdQQ=TL&;B%z@FF~739kbR z__QnwZG@)x>4z)PJrSMd@^4UpuDQy&9J`|nv|+9Y(fbO`4dq>6sV<8Q?<(e}_Ki>d z$du9cA}TDInerpvE0h4LwaD7N@6a%jp)JjM1Lbh?j?}f2Kbkk0u9(oSr;WbUou)x- zv*z(Y!k8*bN4`Xz^OnGkbz1K|vHd`{TGfXBJvp{7aEOf%5rK4RNV|y@{yt^}4lgj- z4^5*&;}D&$3NYX!^GC(as%oX?ft1+o#~S*l9+7-hP2 zM)Nz{Y0pJG)x_gQBX0NGj$=g=uw8y5T!HDzYvdUSS$`FG^N>szjTO0);0&SLa7B1` zz2ox@O04Ep2Rj5?zjjSpXew(?qF6{MmKQs+KG4=DIpvkYV+Iqm*S6FTV|lJgj(7B9B+hmaAB^bX?G>6wpF~0xuJD+$FyQ4X8W-g>-~vFpvtZ7eNTFcjbtN%;q%+)Rd*`g zc5V3Kw??p}4qM2By9ZX4RXrEepdazj+blar7&scZ>)wq6V}m^L;EvV;El+V#Ubz9T zuZvJ9@0WQqL!G;X9+C*0b_az8l_*muC_a_}~w%yu(o_;x<@KuZv3w-_( z!fl@$Qa-z+0lhNoa(j-{?qv>`?)DH{!(kqd+ag6$#7{N(vd&q8#hPP$HOD5 zMi33K!a_zK&dyEU3mVRtil16?F?3wPCN#KIl9<{T{P%K|!Z^l7-_|E$0!yt&@)Ktu z=>+PkQKY~R>hoK@0Hc~NAl=I~5Y5Yu=S2*ERHQqR5%*jDkdcX&sqoP^`0pU)X+3=3 z^lstH=mf;Tgw27J2*Q~I1$A<;@ep0@RncGAk9(e`3R>@Ifw!AhSFspC5>H0CN2giT zNmYs4B)9G`Tr+(h&`K+mHk>=~UW!%^NRWykLGCK)%>^PU=L50(CNUxu7fGtv%H8i6 zc0)7NIxFF*dpCtPm*0gQ@+*erx0f+!0t16=PW^=dK+HqY04<){4t z!_|UvHb=tmEZtV{ClUbS;J)3q@yxXh>yHG2MlUUg6B z-&?U)@E|i@@fWcPF<8}2;>G|hu5fi<J?{Ewwvq_FmwBmUtdlbmyExUWj{-E}CvHbo;ep9fVK$0ix zr1g9EW3gC_=Qr_Yx~|F#xw4NYkXJ@udUqi-XUOyE>)G^*MW@UGs9ls|(%9<11f~lT~n?SAyPI=qdf~ zqDRt_5i!dI_w&&JtjyY*4wFD|(HQlt zvatYS19!tFg5=S65gqI9Vng-RlJ z5^zuHm9GAQU>#&r@4Pz6pvD}ujpwCodjE*ma|1CgL8U?M()<`D1ci#((RGhAyGNPt z=FiSCiw^yJrjdav4W1R~$#)8U0wrqjPSCg)CFo-%68qsM!l3ulHmQqAeB)$#88J-Z$h4jt)b%E|U3@UBYS4weUTBGM zxPmu-!N zu(MC3{03H)XMr6rDIMHFQZm^ytrRrMSJ@N_>i{R8z27NE%7*C)A|k`4Wok~CvSF4X zABrZqyz|sj9eg&0a6tZTNU?o4HtwAz45UAfdy89<=>L7f27 z@09#M^!4ZUfCAo5{JajO2Djx)nKAt)*CBY7gWxmKerKhQr!L(-LukEfsrO&zqa4u} z3nqiR5Cg!oZ?9mNKJV2m-%<{a_qf+up)q`i9m)yq*GApK!f5r=I0L_5FX}DQ%DEuq zO=leBc3(KYeda__SUF0>F9+dGW`VZvl@q?iAsAG3ePtWfJ%1xwICB7Uh1w-rhy*k$%mS&UqNLD6|XC+tXlW-xF6B;*Km8VIcf zpt70_;tT{jEEK;~Z0vr}k;JgM-}mxRd)5EMX!4-D= zPoWDQ=A#&0e)r>t+sB7ouIKsi=+r~M^~iG)1|aRl-G9TXee1jed3)~GYXohCIae){ z#AC|P$xo!g1!MM>;npZlbrhH&^AitI=M(W-@-Q@hpTBqdzVs1(FTbrX&JSkrPi2VR z-n>)v)9Rs^QgGSribfr_AnVseI}!kkZ|zi?@*We+6E#+WF|@R$PZBg3Z&ZQh_Ys0|~CSeY*n)j_@YPnu#Jm84dX zg?yd%>*jMSO8YZ26cB(@b%J0WJ*U$f_VH?`yGl|0WWNMrTPO=K-Ox}Y{0RQEEeM(6 z1uA530>|?Lt$BAz?DwtRn2@+tyP$R&{JBQh~LH) zHluixEGRRgv-}hE-h+OBg!qS*bYZO)Xnw}2CPGTyi<%0itJ3Ww%e6b|Xp>UU<7G#1 z(B&pEpR`peRi4uNyMOPOlFk;@*l_#Asdh_eNoSfLe{GOXNDR*DK~!5}>nTV$_pm6e z@p-(n(pE=6+0e~~5DqK^@~*38a}+TtP>_fbRU?2abr5vFiq>IdbcKi-=Cd4?+O92WzgNqUfXD+tmC(2CT+7n*u)@N{S@7M+#W9<_J~wdy zXCT2^kigB33QTrE2R*J*7Oo-;av+=bmEO}b&sy>^Zu0rvEZ*q=9ix z2?E%o31@y(WJjX+(M3){)J{m>&E*0!-7T%fRY=fAL^}rU$+(JQ#bl{9_4L;3eFz2T zfE<%uzBL+?4Z@)2O$WI85*jNC=fz-{NFqbYwNV-+;I^a2O7%TWI;nDh#$6i7j0Q~&!*PthFv5EBMqbK+ zWE-<*>P@z>V7o2)Ica<3QAeUW6T0})K4lgoMVAuP;;=S>DYKr1L%SR*eSDX?(1Ix+ zI@C7&mr}Od0V1n~Li4KxvFp!$`_n{SelT@}W_gV%=s4w!jua1M7qKT+OwbKjIo2ib zj0qy7KmH`^hvI|rKN+g7EdN}|nMeZ&hzjA|p;E>*L+IM(R)wfYS17gbqcti=Jd2H@ z5jK5xE)!Tvc$}$?6tk<882$Ysicv<^6!HC$ZxA^mqp#z!1LhcV!jCD!ekAK5vraXJ z3^9=Es#jz&NFVZtxRec6`s_BJ+%c5X*p#z_AWq;6ra5f{Mn?Xyq47GY zr1NK7wb_s3Ka?;kOrItLLHwF?0=%|$}0ul>ucHr*vH&okoT-EPC-Sah_#};XZ z`Ak$#83Oh4UVTJIve)fI8q7my4RYk9|B$D z31~p$K42J$kv%_j9IbNk-PMdtjLlfcZMmoL%oB(!>|Qlu+@kU?f-@gBxgMY&ZH_wT zEO!|DUbA_*GKG^-)J%8=HV`FRJbY;(6X$y2*xi2Xm4Kv43RzrKNnX=f%N&x+WAU~` zD9V9F1?izh4_4S{Wo~H@P8lTtR^N!HU{y$YZy3UIS0y9S?fF(cpHexy)+LSR2y;AZ zyn`}{iwVQ1tct}_FM(W%&OI+*i~k;k>f1iF{ZN#wda43lK5B~|f3;CK*{&7F=ArzO zLi~G)gt~HfL`CmWQp(MIf?8B!ZEM19va5{GeoPRl&uR>LRK1!0wayJLaGF%+`EPrA{ER{^l!0Yi= z!|9p}S7yeE%Yjr~>;a=aVBcCTfswQfll}fAWiAq`@cPhXkKUJ86)Yfu*0cJw=nF*e&`8q&je z#0{cR%kd8HR%>w{5V+*ppAxbDPB!L@US=TB%<=`e5`O30B%A80h46p&C(lkCRF6U{ zs`sFQ0`K~h)RimxXYe-HX-sYRMEI+;cmCA5iskFv9jU5lAF|MP5_41b0{@GKR8|d$ z{p`ncDC=38_=Iz?L!IFk$3|a%C)?|j<*JUN@BRphEs>gE=u`zF;wbFJS97CK;;85sbW%OHU^yFO@DU5ExK(Z{z)v}Cjx)CeZz4fH62Yc1T<%DEkBtx zB>GZf*0}Z*C+hj#>c+WzMjOko`eM(gr&ePm(&bjQWdigGCjU+~{)?smsu6!l+v7{x zOGDLB;Elpfu|VpFkwh|IXM&}u>4Oiw-_hr2(WBE}@D<48Hc?>vek02e3I{W~Fd z0sm!EzFAh=1~#y9$e0kXa(`AE8RZMDziBu^$z9M)irjUKv!(O|==riWNByIK17*He z1@?pgJ6xH%5AaSyjXvJQxq7HWVA|I1F;Hm?*P4ttS*PCL{`=o+wfBkS7nw&_OQ_oD zm^hD0w_DHuzzuMTt{v}&f$+Z_)jue7mmopcz*eA7I@VV;-oJR3|5o|G`NX9LWC`P0 z)z-}XADH(=kii!Z>fvPZ$Y0fHpK@L=+qfCf1oV%pFdzHP4NP@%w@2eYEV$&a|IAWk z6IdjbsL0u273MOzndOuOMXq<<3w;<`1F4g2rejd zxzsns*eg^2Dhi7LXv*fuDc+EqATKqOz+RF9_lhp|(@(yMHvcT+{6}U8efb1QSm4VA zZec-Nku@_*?N-RZ39{}Uif`I2tkZLMHk?XKAZP^xTU`@gw$~~=*uWYFa)El%>7wkh zsd0Y_ofLjxf*Xpb#)vjk{fBo^eo2*<8Tsu!t%w-y@Pj9$@6ITVliV2uSf#<7%v_eK z;t(ost?%Hz)sEo<2+ndTK&WI_iwx*OE-uE@c^)uD#%61P*MW{vq}p9Rs&&S02O&8q z8nh49_~5)-t6OzA1)0X}5WquLb$jSynzI^_LyKz7`=?SA5wDPweX<;c&PKUc zR@u4)7MP7#V(UYNi#k0Xr21!dOaWO!*E(tHAIw(_22OdnguufBMYb;A5+(2sg^t6m zfeQTQJnd@z=8{Kco-4eX0MTWY7C8xO*#>`NopH_dt^|Y+5Pm!yJT;@YH^6fi3$^?G zNm1?ohNi1$^eDFUOJ~4)-OZL(9V~MIxauiUweFPyd+Y2ZOob@XaDMK$ZIc72yu3+t zT0$hDsi3B*6MZz*NZ){99rqfF_8O(R7z;rn>p$x9l^kTzx;9=3;(YOSSS^+vi9Kb{ zJ0ZPo+6*V!4YK8$Yrq^bOsRs}jMKn4^4#Ssmj;L$|A8G^r}hxgiCgMAN~p!A-utqC z(o_@HFQJZbx?HPl+jPGVgaz`jXPnU8IJ*2-yA8`dzl^RH?&KUx|2FW2k5|Z(c?i?J{gLMCrA3_v8+T?iLts&Q^ncL$$g>YOWvjbj}!RUhbwY; zy~!;F(PGcWY=}aq!Tq%`eklVmAul~>Jjb&IF?B^NO_HCk)(v_rC<#t-MU17;0R|4U zhrBqX&k;wgW@Sy1i)J3%;?07cbhANKL7V=>nG{dgkvME3*?2j*!|;}psgfafs)MJh zl*)WDH>@I3?=rQQ?MC)C`}#=dN7Vb-c64vfc>mx4j z6Cs#!fElb?9US0rolX0XjqM%&^Pj9YrqG{tUciq6UszD@Z$>U=D+G~T+iUto*(xXtH95Vw#kOtW~}}Qh~DAMAOYTcrvavP zPf;E$GzZx8C2B91qnq%O)#NFU7vD4)xhgdY(cR`LWRt6l10M^yLrn%d!% zP?HqJ>6uEI)FQ*NM%uvSsZ1{4N$7{-Mt53brl{|ZB%7UoSRcpy94yKnT1joZn#Oi9 zZO?@ndZVBYBzqgxKRWmM;J@IqIDr6`(*%r>(ow(s7oxiCiPA*-W-Y~niNDaXV?eSL zX+m*h@fR8((2&0`SRUK3NU%ZB6!fkmiYl>x6nH=p3Fp|ByZj02Jd~C*|&iJP&>^sR< zLU1caFVVFy3ftS}*ei-&K7#cR+y6?<4nUqj?dRXVRlEM9VbFV*;CE$oEAv-_4Q(a% z&j0Zp(*AeB!(V9yDa4mIf@Ev^PqDV*U)fp#_OSUzB>j)9;J}`ugn|Z)^t zc5Lv+sxad*0_!e=%#bJ_IqA!k3&mYXpOe;Vcd*8%3wIP?FZFA5`TT+lXy!AJ~)yNt;K>QAl&U0a`hzgJ^5oN6%4OEtA1 z>>V2_qW5-lJHowpem$MJnU&${Wn^%i)u4uLl1tIt7)G|S-h?>mx0I#)z%Qj9FK5Rv z;8@X=XWk@=a#al1&S>(Mq*y56aotxtJCIu)NhKHO^ZD@MQ!kH!5+hf@7+&8z>M8Km z{W)pDoh{-hBbSmLPFticgtf5Fx6Fjx6(&u&{_u|iPBge|PYVi>p2smOOj->Z^uiZN z6+!XjxhGd9#roz{NsbYM;x!?34$Yghd{rqau2i0~W9S^|M$0Uj>6V~lE~@xmvS-J7 zsKzx^EnjljHu5iA?=qC?x|-iMgaNS?cr^jb%5GdBSC2^#;y(QpaL-omnA-jIn0QAvGcP z7a4G}K@ANwT#gG^ShfnP#H4)b$VwV)-78<{kTbph!Ko?vxVNf-q&tQc70ag0$!d}u z9oY4$(=kI?nRShb@AUwdV78^Ou7;WvcN>~jp{i;AOTDBOfD1rFyPGK68Niwxi=)9C zd5x34eT0u)Hj>YuS%C=K&5&xckxHO8-^QO#m4k^f#=H6ioFS$W!9(}170rErsuGVK zKUcDoTe&Bw_VX_}4NA>}0o>=vNdI3c7Jnf!-PTl7-|GH4WHirTyoBM6&EjS7X(XaCa z*3#R*fLU)b%f24O&@>(DfgmRRUhC;U3?_Ze&}<0Gno=6cUp;@+l0XsXQ2Kf;UtXYq-k_Zo%|^`#SkVT7kz-b-9GGH zCW4*}y6;yiQE43Iyd`tz9~cR^2% zFCvtjO)Wc}?4*r@7KR$x!h_FSiI|kUo0^!U8KOcuRo=-fz&Rd>4XZdqV9dUy&$hn7^gM|M=+eHH|Rs^_3j)7>MI~ zOZTe$CrWmMhEmL$*Y&N_rvf+GT{0WCXTA|vNhwQCU{H#7%-fOscFyB%^X zu`3*}E(~iZV$+{C(e`v(qnNMz)!sDmG`f{ttY!-a>u9fPhVJPCHyZJ~G65iPEJkd! z@T|eQnGtmYjT-*sa-7)`Mo;IgTc_Am()m9E)pLbaNLAMDzV5pYJH#8sN9hBWRiND+ z6g6dQd$~=x7(6$$>TVRW#3l)iKu>c*pYHA};VtHp44S4jq9?b@ha#`-C@!@C=L@^M zU7WdY1YN@Dsw86UudD~*E?9y4?N_@S>{sni?MK5Uwic0SBK1Nu9huc69KgP)WrLbH z#7~}%y3|C!dp4evP3%}sd^GCJ#RntX_E4i#EmdVDk>enK84?(8Jzjgj1bD-XbQBv& znY4?Zhh-6w*A)P^m4@85TGJg6oINmJq~6u%mIW%l0b(Cvm1 zwz;Pl>)tMW{6TG0F`U0&NaCr%2#3vaK7{g2V+Re*Wh8Kpvd$UYU(ah`QlapV9Q1zg zr6BSzX9DK!oB|FV*88}b_5a(rMZSS1ZHz z&yTR#UJX9S$JHQKTnevnZ419fm;>=wN@{!q+?gYk5hh0V-40eCq&BOGzeC~PL3(D) zBZ{Jh^=qD1hPFcJ`glKgv3l47o{^>0r3m;&qH{OoANGXa?iOxMF?R?a+KE{)z!yBj zKQ)`A%Lv0dSxuxxD#@_Adil9k8h6SW9Bd2bY;xMJi6EE?BQ#hAC9#UP<}-qQLld^8 zIMRV1K0?gy9kEFe;NaKOp!wtuo}9nJ1mg{Mc6?bs`7*Fz1P$W`MM*~I z*t_EgPQGT$k#%DFerguOBJD01(=K?vAXm^9RF}Z1=Ej&PW!ewaE_cq}yeRt*wi6ES z@Q1+y2WE!;YiQ&w1&MA4>?&m@*SNbobG-Up`qjxVGW@GeiOScpcFzt_J%e;&csK(u z<+?hXvu^jySSKa@lEvTXqrL~{EJL^LjTZokcb8I(W*aVK;0GgAanKot2DRK z4z(bIHkyLwbp6mCH?T)4kYn~vG)n*$9G>vZ0VgjSe8qlkF&ylz&9e5Vo?;Oq-M%?H zLwbNMk-SQ1fKgjbYbdmxkG>2&5wJ=Qg_73%XUrPE$cXfsl=Q&)YVpueqi<;FA-BIb zeSU4=MRmR$#`y`SU<|ImZti`%-F|fV)L0`bSGuE=PhW>Mw-Z|vN4HLtVZ?-yF(i~@ zfLEZIb0|zV`(du_js!;@?RL`3wANRvKw|%)i7_FOf*Uv?asGm#uRFj-JJH@}S~p5$ zz>2l58-%akG;4P3=ByEeCfx*CG(2y+ShxESbK+zsswQ=q&Df;{4Zgq_1-UsBgzPlB zn^dzPc>H5ObvpySztX~XME`n=#oexDWDp_8K4_#@=u`wJO0a$f)w>KPbuCpdNU&c& zFx?X2D0;t4S#+r~Da@X%!wrFE7(Pt`rty*|WK}`e5sMWGX+7Rac);r#ROEN0pVfge z_EJ0eVT^H~#W&Q?n~;`c@Rl~$cewh)5DLx5-P7egk}}Q*5a}`Y3niH6}_Hg0faz43oGU!eA3h1473q{u?r&68Xi( zpQw@?UwX9r=c#a~B&DLich*zfBxua{3u~SLFWt}wq!JW)r+>H-%*V5I6yig1mh+!4D!nTR5C1Ox-kjXv*~q9YrO#t*KSEda7aOH<&X0 zsM%&h^ef~>R}l@P zV`2*#RZ3krLSLg2Zx5D%uO?LTw=Gcn&v7v&2(-xk#4X?G&~L}+8sWS6%&`Zwu^V(DdEk z^4m+jt`4Y14>u{CKRZITeZrkz@B)2!f zjj_sLKu4AO2&@Vs%UvVf&s$BnHiC@K7gv(x?yn9SKkBU5HCm zJ;`njr6TqU8{;z?fNsdqj(@UN^33w@V)8nyQ;d@Kby4Fk8F*XkdKvNuI1MjNN^Vlg!=s-Xu_8 zVAnbc;kkj01$6nHs7xOHwl$-%t*8va!_R6z{LtKGjmn<-NXuh$FaRRC^IyHa9?(eP zSh6pi_sez3}qYjkd17F5fnqVN0^p(t3BgeLOHF#UE|y% z<^qwXQqX?&igVVnfRv7Ty9^B@scJk!60yjG3tYI?9k;qLH&jfu!}|qefHXIbWaZMb z!RhPhS4%rCnCC6-H)`j@;+QQQO-*_>@m_k9Q56l1X#N`Xh>kmIR+l5lNQX<#^dLwC z{i4NkVC>Tsd>S5D+-<0y_d9(@noxvbh~0n*r(@A)Z(TAd7BK(afjQy$&mUQ1qh= zZ*$|2v1#@8*tQ0;HPd~2AQw;-e#T-4eHax>l$|t6a1~b;Zp6wffuf1g8e~AakcdKY z@C2ICmR1W(!To{YwGm83q)2*dG*!inn0W+tH=-U->Y2+q)y3w4?&TO8-@a6*^`5qIVMonzKN=$fR0<-5r}8 z_7D@7t|3@e#k!8JF50V*PQBwqP<+1n1)ffrqF>~~zC@cm30s`JU#!OLYsUWW65C>?!&ER>a!!;DPFh2Y0wwHp|(W z+&j4D&~wNe-ThvQ`-SpScjTcR0@4=}Gd#aNyj8dviWEmPc=(m?N0{V8v<&LMJ$`j= zQ8Hi(mB4v~!iLW7e&u0dYTtqRR~#*p^Lsen+%BBJQD;vJgT?|t*wX-6rC0|QTo~Rp z{33X(MH=3P9CO-V!e$|5OfrVF_iVh&k}=nVc?FUCYYLOlMpNLdH2RzpAJGwvSwD5ocKQUS&&v#mG!{BW57h{$vHS3-jtJvzTW6z^> zkpT2~Znbk9Dr6(0sKdf5XkuWchkfX#aO%E&3A?8~lDIIKUL@K3!Ya6aw(0|74p}Sz z@9!GH15KlavKA>wza!T_X?1kc@+eAA!q_=VSL616Dc0%Xv(=DzKyM7M2t9~0m`U%h zSUo1xGQ#)d=JjMu8n38;M$pnKxgI1eTjylq6HV`_G4zYVyPZ#BnAUf4>v$L7;AJSf2Sdz5cX{dn!W*b2Wef79P#0vh=%nY zEhx{=&g;A_@2{1VY=%AWR#}zeE98G;M^-u1FO(P5jD{M1x*a92L9v)zJh)&MdgS=t4HbDdJ_%d? zlFYmP%D$y$ejWw)BBqT%7nccr0<6Btmo46VeCrpIzviY!Krr_K!I&@QKE+@VF;#pI z!8cmGw~HhB!9CM%LssCHygLeqRH&w)juOp>8k%kWZs7b+*$Bz}CR1Of3=pW0@> ziycJ_|IkjqZl8>jTw1O(HOT^NjCbdg6EOMSfCZ`BJNly!r|uA)?cgqh#2opmvE9O> zLV+5cX*D?zaIiW<{S-JsF{13UMSdFu>=UU3l&-~6ydvDmydyP z7)?T9QMCxe05RQU5yP~JYX%(y=4Z-Mj)9fRIF+39*TH87tf6(3X}3gLXrfa7vcG zXZn{ChfRg6Ri=oAljz>QvLFtjsVD(HhE>ZH4#LR)ddSRcoZxtYmCdN?_a-)0n zQKmqxOM3Ws>9}&9RZl_gE`6n_>KSJhY-`6#h{G}Sw8ItoT@hM11MtCC%Q|G=jEMF) z=IX4)o7dK#bp}UCay}{>&X7xtQ1aX;u!bqs7y@*2Z*%nLZu__QbJ)7eS%|>RBwua{ zM#ltHaEyg|hR9X}?0(^OOXQ!*(XQxT8=3wAGy{6Guawv_Rw32f1UnYHK8JNp-f6_5 z3L`!823lHJ#$%vw;x(Gj;oXG}H`R19!Pecf+dC`jOJ%U8(yUc5E7rnt(NF@0rXR}FRwbhm4b$s*QN zwvN3gb8N7j-s=7rb8i(^cemwh27(1AxCeK4cb5crC%C)2+X@g|0>Rzg-QAsqyStwC z?W*doop0Ca>hqlQbYCv6xR`VP=N!Lxydw*G@60_5KSYV975|cUe80Yv#Yp0J2J~SL z4KqQ(?yXUlq7^=~j{xo-G^WLs@}eCC-D)|9LrI$nFgTXT4twcim&pD0MGC~M%^Lnk zk6Coz+Q>-qk0mjHxkqka7^ZvjFNJ+>qUDbLYN6Fru8N#qRK@`pIimKK!)~L~gFCe- zdks8mJxyv17)&7%%!dfU7YaI?LQqNounD8RBLuPSBOF)Vi0k@yJSZSVZXgc_TI}yA znoL0HezFZSJ?$&b0tKyj=;YZJueF}@kEfr5<}D5RU!~3>hdIy1KBNs%x>zTh_h|fW z<@xbFH;#-dD_aspW^%F`{*3z;Hul;jN`}jqG!Z5C|uXORc8Y0G&$XW zNB=_p#Ds}7E~+ABR7p%iXyoJ2S*?%YHRy6UqkQ2$9!O0=cQP(c+#c^>F~TA) z6h_-s2a!6B7J1F%Ojp9MyJNRu_?1{?u<+DAd^~t;?=7%1Pqn>aOSbw!>bb%%L!z)~ zM7b>>%!w$+SZB4#NobS{JtNFuUC#cz|GPHFR`x9iM#B@Et4=50Q8))EoH zApDXe)cL4_6XR14?kRiL)#Bznr*K0u4#{zshJ~;@{Am5?HtPC>=P2Py#6ELt^?Aao zXF-_Ogc-|r)d#U`psr{0(AJQ#DBg4bv%KD=u!M&=n*97cK)GR&dsuz-H=(fC&=)-5BS_X`#?KYb zU%2kK>@MY%YMo^puA)31oGHz?U3NLkz~*IJwe3lJpErlxoQ}4|lJ4xBsY*;UD9A(V z^M`mX*|h^1&mA5Hy~$w&BCL5X!Cyb9CY{|&#uJA1+Rsb~&ELefWI}2r*ss?a)xPPR zELX0l%lug`)(0me&YJvIJ>RWeWuMvPNcELdnlKybP@B7W&cZv>$;Jz998M1t4K2)F zF~!Lm^vlt~;m6OPK@IB|Wt#ILX7!_UZD1BEj)FceIB|;1WApCHENSkPn@Sn%-Xn_J zobFGWGCFDBilhSLS-abS1OVmZv3z`>KR<6|; z`na(o$5fP-`kj{T2Z=0m zGJU0vFOLQUPXt>6Nk|V@A2f$CX%3E(c^VQa5FcgXQ37HwEh(` z{K0rIU8|DTejn0c8WND1p(@CX>?lHO!Va#|`SJYAdbQ%OFT8k}D7_d{>)`t#mO01y zUpYgdCs;2r8s-_25(NC0KW_B--*@Z(@fBq9G-khQU<>P=iylWWH2CEe8Tr1$R*do~4 zildt?^jcc?0kg|-8=so*CQ;_E(;&fy@OnulirH6zqALG8iA%`?euAy-Vx__S*OMSi z_)~7LjtG|+UHua0w$b>CECyV$HpC*bcGF&9-QTfkQ1=b&DcTJsV(dWgAB*O1#IF_n z9@~GSOaB#`=>`wV=pUGpcZL~zO$Y@2psnZoind_PG&?sY+9cok`N4ixJU>i|E>SD^ zDiL>2!RIBr!f~%i_rWF@!SSPWf3V(nm&3O1sZrdDf$zS_}0_fgJ5 zRpQ^z9gA(<4zOa>uF{r<*f=eAo{qHB#wZpE=WpE`atLUJDBf~`Weum&OF5ryqZNN= zFyqgtD)-p)Hg^aG@$w)dI2cxvF^f-(@))B9SQO}Q#C((tL0I^N{XsnH7`y;9tV+6# zi)ZRKr*=EHsY z7}nlt&^UI7;Zvd(8K#lcew<8k5S>+L0dth}_*1M>fv6EEjz@_H>UFUHND6`rWjD}L zwg@LhE0VReo;qTf90w8;b4T@sJNSst!TMrX$el+7yzw7!+&HiBQ@|pqp0XjVa0K;S z0xFoCo`_mIPFWzD$PLCCrxw!<-#Q?0=FF@Xxd^{%>xSML3DA)$xN5|}e?K(R9f{jd z+-@ADqA+bAc6?2qiM{@_Kvt*;G5Wr%R@bj@WW6?Ny@>oUUy_|vGA!BIg%8@^ED!VM z_)(K*Wx(PF^J4q^qfaNCZVDUu)R|_hc*tDkANUa;J#ItmKIRYbbsq4|$-$%jimH(~ zo^`r;@9LD=7#x-2UrL08o`SAt4Z*opQuK~WT|WC61*Nq24%dE{QkXXRNyaE$Y-wUN zIh3lboY-f;2Q?(`v@z=xW;BHbXIWP^kF8}H*0xWXWyooA?euP3JhORN-AeO{>L`|L zDQ`r8u}MO%u^A>_rJ2=h2xAJ_>-PB($rNVZ*;aKwu23B6`u$8Zaz6YR_NZ8N5Q-zl zUp>5qtrEq5-|hi+-R83Ss$j7AbO;&L`VcKkOjeO^Z{LGjXVI0X4~Wp zAj^2_MS3vS7%yCSeI8zgh{9F&uljuMKp{z2Ub0s!?kMWh~quD z+aBy&p+i)c#ZFG`dS9?IV-sx=KY6sZM{I@&6d9&k)XRdUI=4X+B@c%TWMQ?Hjj`hD z#78OdmoucQgMyZe$rYa(I}y{cc_evvM5UHne*gf=-hSxGYLouXMuS3^!~XPZzrO2E z!ZcRChX?=OU0GxRt`?Ia5FqZIa54LP{A$;Xb^YS9{L{qAv^(fziOFgjdl($}7Q(h$ zO33BBQ-oFJ7H0<2-s*|XuiXx9@%~M;mHFe_89h0;G_T&UsE2rhPF&6e(m7wGpWg;! z^RtW_iyi)YOx(2-G%_mq{+y#PhwjhD^l5(a+DJr)p zjLm~jJn5LNS+?l<%j94`N-iL$93KcD3v-mSF$O(rGjZi*QClU^?ebf1d05qBPblXz z(D%ZI#vF$%RiZtMU>iAOft(Vw)4p;r_MK7ekA-=(SvGKXZ*fpYzOhj*F6t~&{^UdV zlfHni$r`gDl5Xwki{)3dimf=zmMU6%1BmuR8;paBi+0*-$1n(9zzVn5J_9zUJ8ttFYD*;Cx+R^j#ST z0%>~fhT03?(^RwMr>1;=Y>&}lFTwa-(IRIJ$VAxXb=U6=(}SHpdf$^36D^u~k1D?z z2vSEPxl0ZImB`=CXi{c+_Ig&DEjajepEs=2)O)onA{#G?1x4oVWEC;qwK|W zPiVG(N))5x{Eir7^^EqeeHW-MrtVwO_Qngv`-;Y^om+?P?zs$X9uxli!-rJG3YL_<)IdIR_bUGeEBk zI5aq|b1ae;aoQo5Rlf;Vml*fpKfY}(b*6NF8n@I!skh`6CebA_y0D;H$(M*evoDsG z`@Fj@nPomCAbkNA`v`Hat{+eEM!j#_~@qN__hD@no zf!IoG8goH)+9OeT`M{~B@GFz0?p>Sq(7d?RUJ36!Acd^^Z%=GxCU6XGui`~Yt3n$u zZCEKsp_VSbZyQn{x|arU(5b z30l!&P)j^^a@K4HNf=vP*mSV zqM5l&c)9$L5c9wcrV49Bi{0-=?_@l^pt6u?%KbagwZaxG-fG0+iaOAS`UnMM@dZ> z^oP|O9>=sBw-zS`kNkUVj|htGTUlQfS4AwQtykMUp?%-IF^iVwzLg~Iiv;^u=GTN? zt|}Hrm4BTNA|`{?>z54iF4MH=s5jflg5q6^`YX8?qj7DVbrEqEiowem;-0RRl4Ct0 z@NWWrCR)*gXVet+^-9Q0yecJIJ|z)jVw;;w%FVoiXAeuEV!yoJ<8Q@AL_Isz#9bD8 zmv|6AXXCG-;5vVJkNg@cv;C#D#W~oEtNTK-Ahpi&_jTj#B6ALn_8=oZI(jtE&{94@ zlIjDDVTkt=Mo1hHNc~M|wNn34;&=RHqa4y`I=4Ed`07&0U_(Xpr1?bT!gP|p{#{nx z{Xi9qp{l(@ko2Rm9nb3$trM}xg^uCFwtxJ?N;{ax*Hl2!*|MG(x$g^8|LtXoIewFo6bQ8(q1E8kr{ckNhRJyt80vQ%PGO)!r{u?ukSR}YAE%=gWvsVUZk;2q) z5pn8#n$aeLkE{9<_GWc8lZzaJ1qCT&{kT(5h2lPrtTVa$jJpY9e|bfDNlw==)!gJv z!3T!sJtOzb9J2%3R>8i-9##b569bK>uvg4$vLKR!r7meQ$7`FWX74?P(&a;`OMwCX z%!!r<8G{ERp$l?tPXEolX>k=DcwCiRP^LzUixY4OR(f=GET_vLa)%0qrrVl^Wh?usOw@pseCD!x*_9K<3Mk;ehYQ&p zlPps>zC9n;uLW={E5XDcU#4BGR?1E8eC?T%Vdx|}#-`>qah9$cYgeS|Q!U{0uZWgjPO7bCyh$nGluFz&o zZ#BHOznR&;*y6q-$M}q0BEhTVcN(xjm**Ub`DJFGwVqHGwIaB#@^sdBvRK6wB6gvp z7O}6};o-^PZNyB;m8w4$(-jcQFtzWl&DVr_KKcN7h*BI*c9lCd$CB#z%_SUg>|*J2 z=|=jfC0~~1wy`V(<4g`UpH0XnuP=NKqm$vH?qc@QgZ~w2^hP5Foq4_n&s(+%l;Cx& z2`)~G9~_iVdkCbdQobf^F=%(70UlmM#WV!)xxy6?R31iFJ8XNuJ4xznU9ik!2WQ6i zRW_PtJglnw<4+ke_H}URUZzo$>j~X$vd0XzJ(Yz^v=x>@dIwc+&9|mE{a`D<(#0i9 zVer^XdVE5m2>2TVP&f<$yRuw-rEc~6IlfIIhfK_Ku+C3o)6{Tjg`H#1O3eFT|XN0cLt@j-xJ)Q(HZVZzC-_E^iuM{>*%#j$a<(%;_Uw;ML zp>&Vj8N;h$u*F#%Q4iUEjpji!?7qNhg3~z zPCb@}Qu!T%AA+MrS2X3tO7>T~+VPrsb0;a>bwkP`nu0@6T8067~w3opxDgz?anhDEMVH>&di@g0Wy%hDH( zIj(zZc2QU+**Z8HvOrzeh1p=hl(>2-h7B=^rzcI|gj8Q2T2I^aYn2-_lt6er-%319 z`Me~xM9e07x#Uv{JM*(_g^~e8-{qsvfPGNIVeq=`O9TtUhS&+=6z9#{yTK_@Pg}jq zu8l0hXW>ty6h;>gwcZ90?t|b8EAz)KG^!wEMONHXY??oiNZm|MAj+!XI~CdY7avln zv7Y8KKHy4qJJG>FAoH@B+|lB6tl=ts3O5Yl142I!3M%85N-j-a{FrD7O=4oVh;>eD z>vm-@-J2-zIC(-w4{<)h`bz)wc__r}82!Yr4;%L(+`XWoP#lwvW=gEK=U`YiA~MTI z*JXz}6}dd&9VybL&cHVaJ`N}G$8Kk7XF2%&P^6hi$(2W(kW(~z1WQ@!QoaL?+8jxS zr1mA7EBK#1-_9Jja~K9G-=ze2S*(c@r~BQBPy!DSK5cF`^b4$;u~p{+zGR$c^Y9T|#nSQSwXRLf{j8ICGr9PSq`3PuQ+9oOUR%Bx5USd;2g;dDtpM-cnU%E3bgwbm4>dB z8b1zwNI>z#_9el$zdyBq872G{Z5cA}4Xvae>XrVs2k$X{5JfcMgb{6DwLgB?f|{x) z@M1fvn^HJYa~qDAk;jjI&qArmxVgI!4jOxEEJFO8lWfINfM_D@Rw#Y)Xf^rGH6IQy z<5$V;D4n7W83_ej*O6uwr~vF~v`=&3)rhN`$wI*QQ8Qa^fPc%hd$;U>>5i|;v?Y=d z*dmj|xPFcuHA^doySAr`+pwDDaC$8jgC~?st;EQyDPOZd(2Ld;nP~V);h%B=h%s^b3qP?(=UR_teZv{_J4(B%cHR!KSz*9Z1F_g9Bh&A`8qBzKZEws9T1yf7$FH(6%+~z`Egj;85VE%D zYnquSruoQ;Kdb(QybustpDDuqBID;jTzt_O&h8Miowj^F1c`6NoDBkr9Qe@`Lo4kM zW|N7j;)vX~T?=YcR9-xVEBSa)Yc8go59{v0@mjYf`!|I@#>3ZHlwHm@vOdFr^>>CU|y=*VOHYXL<1$;w!ppi&( zz18CH?zp_?d?+j~ZW(;aZF!PdV!vA39lGy_fMEfaFUhW}__?=YHK*$e@H9kgYEQ%L z+*7z9brSAEy7tvLyF5vE=I;^N7ZkD}lgYOa#4<5e$Z-4f4={48ui#l>kLV+Nggwke zfl(PFcXT2X1y5V(zr@h$g-a%$Es^v`rx|5mtk|?Eog}Bf^4#cFRqtq%h%mZ$FV|s- zR_u3_ATbct-dN5(zK<~%f{4>mP9??KFD$3 zW}Uwurp^koU7aK<4)1oTQ(gZ%~Q{+gwY>g469)c9tizD?KP}Ue&Efga54c z@?!jj61-LEXA$Q9g%W)D*C@g7f<)YAJ|6h?%-Tq7ch_|(7x9U8@7maan)mK1RLtSw z^1Ou_TKWGcmcWz*jW-l^&c&@-!MPN6cmS}&wAz+}gDJmjq*VQRYANPGa{~Q2#KdT% z4(DJ)3``H2xjz;~ZSg@aHa7H?YL0PKB$|Yzrs~X!t@d=&ud-R=Tb_x5NWT8!kcee3@K|BViN2)$80i z0&?}IRl~Bj*fO~lH#g$7hf`ns$Cb+Ck}}RDT~t13fH1&g3X4S_v3w;%kk)#3uC$7; zt^XYwaS>mnAqc$osy=5iqbiIU)?6Pqx=s;7gzg&xiGX@cM@O6goi`5f0@tyULM&u_ zdh1J1Gy9&sT2xMQL7EaNPOXIXV0y7Fk|J@7ZurLvd)%^9x8Ma%+Gj)+Td`%_x0d8pca#*KFM$2DrNrdNnm`1BzE z=y1m^1ut{ss2b`4vu!#lhR6slV2*+uXkg{LXwS3#gZ;fO9*-lOyspqiksLuvgtB&v z{Iv6ZRu99k&HW%SEG#TZojl<6+{UDWX=5Tu=#6>}8&n2)Ltn34N4M#SJYG{-=gh}n zVjJvd59UHhqiffKJn#joZaiBW=@Zueru{LZJj<)G-E^2zi3JhgYj)LhZsK zC4(N6TDz9@!Lqy5U`+9l&hN%Z5J+o)9@Ed?TAW?s4-}FbS4Fj1vA;Tdm5whwii9{8PVo9_P%DrnpM1uC$X;tGLTKKJ z=8XKKZ`6MP;CHB}1=x6ylPC@AJ8NTOs&)O4`sADkDCgur*hiGuk}eO>MezAdCn{3; z%>?NedjMwk&(@1Ccf9h6u~qU%d9*PRQC?AxLtrBTY!^f;d0&;P8{>pj6XF5R0@PJ= zy)304B9V9usl^{wk{99LqCIovdQY{Rhdz-TpjD6xpB~9 zMCC#6C_OeRRO2`064x#4Xl){>`iPN}z$mKor*A31uOqB3cVp#T@r+&s$O#yJ0E`&2bP zkb_f}?WQTRkO#!zlWx{(93bUG)YPYiLBoQY)HdGW{F;p$B@A=uK{Mr1|NHB|^Ah*} z#!H~%M=FdbCrB_=SmLZ-;3^+Tfagf(anfC60A|u8w%5D*4&IMkRmp}7BwOkejx^Lh zd+(IF<0vw54`Hjhmm!p(X3@|NJ;jm$j{o_=Xid%@p$Wt@)?j>S3v@yG~d8%{Ioxecj%YjDan`STzrW=+KV#Pm$t} zu@VoewS*RHX4;KqtCmxXcsqUwsLLt6@rf(z^S9J#{PhHS=DP{TuRrS6< z{vXf;KecymCU0<0fsVbynJhDe)|;uu=`A(J52A;zIYLICofcLv7F(so57Npz4T~6Q zK@8Db*eil3B9VnwPrNsR!-d(aw@Tt`Ac@=`$U!j{*d2ViA!`2-NO`8u1AfLorhs~n zY`S;ryK-x&CH0@^iN$)EMAdMZhX*zhya{izR20?VKR;~}(ICl^fCbC&_CMH&1DOAy zC$O&{lCRn0`vQsyz}O+w+PI9O|9lqdgC~RwW@iLY$6J*CHPGbGv*Mo?)M5n4#bGTL zxBE|j{reAUCXkmwZEMK=r?TZ97=+uTiB39oj9)(F%j;_7&G|N};A1lYN$zLa=UWak zV!W|$5$+9HHD$`B-?-{Gm9jrhy3m`x4i+g*iJ%xVJuC69!%Ed+bd%)&JkzBz>I;5Y z=0D3+^`!b5;&4+{Z1o9t#8I2<+sL;%*iyp4YOlX34a86@Tdm#2ELFQ+Ew%Y3b4{Fg zObdvp$Yx5}>2Gnf*ilBMJEDJ%Rxi!1Sq*$o=PC~T{AOd3B^Z5RiDT7ftu{;mTGT&3 zpZ+{duK$e_vpw~SK)kbLZ}tN-=FIITS>J!Yd@|0 zR+J&lmi(@18L8^)?}CVlGG#z3|MQxqSoLAV&Dui^?dD#nBfDbdj!VI;(xSqAv7HDn z#@8!4dj<*kYW<67knNLYe{}yI+VwlxWTCiG&-kO;))jXx;j=kWc=L#ZF{KRQwPqr3 z1Kz-Qc`mMNmCWOT^qBO4f8Kw|f^)?BZwwv9Y*4tC$00U7A)O7n2yNOb;^2s9i;)l7 zWkeMUE65P8=AYC^JeFK53>mPW6|KxqW-Pz)Q{Zqwi^kCS0Yuu{dkjwf4(*W`J-#}l ze(a;zKAGZX!+-Td@CCicI1Tv$QJyKY%G7 z%LgS?A$fDoyl=txJWo5HbGj>UXW(GmFL6^urFG@Dw?Zf^<^p62&Mvx$Sk1O#G{4U|@^SXmFIR9tBbn4~z6|GAk}BK%^xYNQW! zOor!=r}bDN3i>ldW>d5ZAC;jY>dd2by}^+QvE^QyyBbKa1BL>x05eJUEIR%eK5rM7 zR{oVfzJ@aszCTlJzSBMYmjH#%N_LYc7_TFwuQFG^KHHUo=J}Q|wes}H2_7?LQ={Qd zhi=dGrx7ta#~Nin>XAKh^1fHzAI81sZ^)58&2UIjba^*J9PAjgpTJACp%a=wWTF`oe+*aBfw)l_I%El5(cpdInm^ zd23|$53Ojp0`}OqNeD%-=YQ7t?99d%81`;S{U&<2I{W@$_efCqDuQx34FAy5k_39=pQvrx=WU%9(87UI&=|qv3O8BK#HFFt zdd|n>5=PiY=NUvId*?|+vdJ%XI$|#oO z`QKLmnipABL*Air_0EIh&%gGr;&b$ocY{J-{%T_Qh54@oHwkFqxma9^Jply;Taiugf;_fJ z_9w;9u6D*N1rPhxguT?=PoAf@`%IgM1)D(PvN_37ZyTa<%w~!REr9?*E@#rUQP7z0 zU{hrrADwobeWimpfg3X7gB&^7$7``;oBk`6$ja%?U+G+zcCxTPl;Wk@h5-rDe(? zuY`dorW(<|zv8LII|CxWqT>c5%tZrah|KBDI2xgkc+9hkX0Q>4iWmhXnDZ5?Vu==~ z+CDWSSip5rUF&WkJe4;eO5^;8yFdlt#mZoaH~A$nJxGbrEGas|P~b(ZDh@OPVz}X) zCN{QU>=)Z8HcOgm4;KXz#apEadEZPW1L?@SxoIiFxVX^(9$vV@*1kZ-WLE6Q`KXDY z(Dw4rY$a5ac{wcYXQ_}$&`q2urU0J%QzFhyi}-YIMIAVae~Cl{*9TXh4yoU64x6tk zHW}We*`iU;={}9WftQ#f2^%G`;w`m7Kj$cY+wlFuzw*qVLR77Pz7-&T+7g~7Rfo?3 z$3o5*icPW{5zX@ycUi27L5~Ve^r>W8h&4DODPJ$bQ&O%udd2m8^StAnn5_lJV(!YT zkP&&_iG38)`D-?FGrtCE#7{~uY@?&-k~_=DI|Pf)nXy4q$rG(whfo=74rRKak$`m@iadJ#V zM1RJPl@dUP2J|@V;rE6U8AA4Ymqx3%UhyZHk}_M(hc=PNr$r+h*vlxE*Ly}F zh7h@U)e8GMMUeq}N)EjCs({ulPptlaZJz66u6 z-qm#qi;SBD=<`e$V-OSzfi>cQi{Sjv*hAcvlff6tyPZLDW51E%{zW#n!i*nip!pFf z?b1VRi-?ijyHlP+T*>v)i{Iooi-mt7W767|bcq7IUexvtXnS#7%0I1!kBFc11<0gr zwwW|r?apS4C&nYkWSK&b?22F8{4!#k*w=Z2zQp2eBti4hCb9C zgA}`yA4EPS^0gPuHS=!P%Sl+KKht^Zsx)^GY3qp?_RlflyV7DcbLNjXGP=wNZEFjV z$rrXcfK3KzSwp`@$LhbrK(% zXYa6MHb64yV6*9;8(%W%+rKX!IO{P2hYbo>cBA=32~9<9y%El>3iLE6%~#WUSazv1 zsIpqCptR(p21bO4(4;s0v7`l+7$GK{oC3G{>0f!#C?qb7b({1#-TU^o4+xDd1L^tu|C;TCE>a_zS9D^;6yGN`tKn-U3z2xJklV-}0O(F%o+gkgoN_)0$jJh?!8A1^A}Anp#o)7ylzR z@xrVpuqAqd`L|1MieHgR88x6+yjft$lT}l(uzz$#EmnCG@x0$zzoHaC(6(ZD+!gtx zi&h)?x+_qg9ixRmYpV_|kIA0L*fBa^*uEKy@h~q>K4NjY{zBLFZt<>b`6P(*MT(%7@pf#Cv+&%UkJzNwz-7Pn z8S--;pvtM)bQDbmC+uFb@ygr1IFVt$S32bem#%(JhPjv}T%lZLGvNJFlBLJ!6APQ4I%Tws$z*vQf632tbY z6>^hgHmo?@p_b!-5_&%r-r{}SOqNAy^P;bXiJ_)&KX-Q7M*Fr-Sr|(ZX4fvVRiF!X z1giUxFFI%oyE^Q(Epn43Gh|PIma#C!--Mlo(;$-Ciq#uO!q>?{0e9(>!XmK^hD2~` zJ{DuPK&vK1=eat(p#$VGXn^`|2L5j@cH&4OFbD}$)AAP z)K&YAvF*J7}IH@z}D(3+;L`kx;$)O?3y~ z8+e?c4`V`6I0s_#&jpp{Et{9N7FqSVfKI8iRLmny>3Y1R*-*NL5Yn0DD&{gmOAiO^ zKTkn)3BgJ-`#6|J&T#R77w92H#8*0xc-@t+6x)e3#c;UryWBZqen@fSdKl5VhGKor z#yfW+-k5ni>LzA-!Qp!+vh(GNMVkM^p zmpQHyt8XNBe_Cec);|yHGzCzW$+%xWYgtytO78q^B-8U`F*7 z{gjPeE8sU6XGGiE-NeQ(jOyC)fzr^YuljMIQg-l*(SEh}$mDfVyIY?rN^sfa(e>N% zN30rFcvJx`1WZ``xSJWoHnmb(u7yEl+0058I;g4R$Md5e85nDCQ0E){9>^V2&43+1 zh!^79kQ7YJ)W+Xad6&x@Zm z|KF7$woe%gXa@MAlun>|MbbG!v54fGz{+q*eTQDoR8lD7XoH_j9-GknNZE;IJl(-q(ZNb&qy`ER=IrH;qC6N{AJe(w9FCGLDR%REbw~g$AZs74(UoI@s zF!J<>en-NqD}ZbaR;RwYN<6|5_2&Y#IYU0eB(}3 zeT*&+)4fh2m40hoC^a^^V6a<$)Qnea{@1>Q?Z12pZXjR6?=95_GiB6D_Zfky3m-h6 z)i%t5@zsEMHDoV~86?vGBai~@wJEk5MslM9f_6=^HAzCB0KW z*ZgHm$S7`RkB|*Wi85ROq_C&={ZSk5+?MFPsVEz;eaR=u|M8*ae!h2d9n9=#A%VYn zYn3&f2QQqa$=Lki6&kPb6}~O*1){C}G@QMeda1~sv-Xy8>9f;3jM7lTn{;d}fJuN$ zU!xL=-?-(*yqG-WI*YjHw3#qr(P9f*)vqr!qmn%LLs!NujCea|`~OUvaFd2+9Wm;^ z;%DL3u7W78^ee}id23MJwE~$=F?*4;K)y=YN||V25bidKV}Zn_)3BDB5$63*%AiW} zzoHCKdRo)A)}u!nZEE{#-}(*FQ}hzGRy7~F5Ro2X__Xf&ENx-8m}4pX>FOjdxpAA{ z9Y*YB-77H3J9r?|Os!baen4+lJBL=@<>_7^WkC2+O99@%1Qwx_IP~>rA4vXjcHgqlF=flgVIAK`!Aj0#S zq$n;t7QIMm;HyiA!<$H{{L-yx2nL%q6CWr~e0!Jaz>?WXA+murhdGv6(mhiXs``K- zJ~zyYa_$J9-loldAJo7sZLSVFLcpW^FQc;q`d*XfOu4NT>j%xSK3S;k=#`1=+eQ~G z-d8zza%YEgZBWfb_ds$Ytb1trDfS3MO9DGm>qaDu0ec7TY`q^nr>?xU3LI$Lw7I>6 zM$%+N*~(*)S3Ky}ZU8h!Jy$utc1E1&XasLjYx6U~7vHKwB;D7=qhB|VsE;{(GF6rW z(ckV#N~R~n_L?6{Q{0-i%*^ExGovI5_;sDkk<>7OTsjy-sHh@ZGeN)DaLa|%aqEpK zU+n5nd*N%;U>5#txZaGV_)DL_F74RY z@4h#l#|xzN4&u*sJSVp~@Y4DA?aRNV%L<$mLqkG}il5g#v}!FhaDOi` ztKCBts*Hg>E}2V853wo@V4vMu=5VLX)J)rwkkwe=_>aLyb>sXYR2Y)Np++#Y&5;}o z{NO-y{qH;hokqMtnN9-3Os$~4ZFTYYjlQ|UYq1BF*@u^p&z*tr(^Gp+aYff1^)Dfp z*6DUmL;9_ayNN^JSkK0${)JSbmG=J^Qib20hQ?^8H$Vpq1igqrxS>X0XBuvR*F^CT zCK`aD?gDEokfU%C0HK;TL{Iw%Ca{tK-4k~}VmmhTBO+zt3M)yal8hFF2T*03mH#mV zhkyqhZo>=r_IQT;Xnee~rUq3&IU&4q%`Zl@jf_`#AE7CC7feUd= zjqyDiqE7DegfX3}TV+G;Zv2^8X#7}XnovgI)_A7BeDHb#O;g<>wT_cUs44!gRM0&P zW+V7_r2+x)Un&*8{wJkEUV>WOt42_RGiO=6J>oe z;ky#z%Mk4Ou73ZaRj4WbXRX4P;cHoBC?w|pC01}-M4}nNIQ25)KByy5e-i)w z&xtaBf$pYua~VAI>7e<4il6Q7&0|v0^0?{gn|{U(S2Q)~eORT;bgZrWAB24cSer}J zc1v-m#kG`T#oeV)phb&2!9BRU6ql6ZUZ6nH;O-Q6DeeJ+yX&9xYERGk-kbyjZNV#rJZ8mzE$sD`9jEM0*wSSD1ZQ&NLW@-{ zOtR%LI)o?^uD9N<>S$cjnI+QoC?E;nPR|ecrA4zZbv&{e{eOc?|J7fY?$6Q0@9fX*?0WQmK;N9XkB7}M5Go^91uGu_t#1u^fRd_J(JHk^V@u8S**(jj z9usTF9P+Uor0Ddq)RZ|?Yd?k)aKV8bV6)a>&3#`;0iua)a7$-@_^VzMsSASkB zzh#0{ppaNf>tn``2W$#2zY6$t}42^LVUqL(82K~`{Y{i znx)tqSY;y<@3XB%HPSDeVWQ|LUT_~5yW7Qm+xq%2oou9UM*P&lS$TUL!uPv<_${BvS{Al~xV9sjG({IIziEmER<2CP1&ui}Rf;zH|Gn_pgzVsh`zUV>C~fYWh-f}o24re}+B~x?5$NDwNrbTAuw32A?TX=s$sQ(M__1n#B{;1by^d($lZ%O-w zxF^!r0)YC>7OLZf-GSZf(siwqtK3mcOFU9aw{xvRqlK95YnEG%@|23ri|>d8>q+=0 zc>hzWW!n({U@Sm3)LWysUUWk(J;3-_l=AGPa^iE`7tQYp+a_n1yI-SNbsWU)v=-#f zW@S#axVsq?%GJy0HCuis#QD>bY*YIK!SgpZ?I%OM{#f%N-r)tg%qL+>gU3nYqjxT| zF1_P_&BXde)^65+lr(_LUs`HL$dncgr_hf=!ZwwOrBlBttmtkeT z1=A}=J4?$B`b)RJ$rtt)n3l$Y9DO-h0pz=ZwDJQ`kxl<H%#tY2={mA@N|yg^;Ek(_r(9>Lt)3`{S>VnuY%lGiV!?6$ zrHYXhH(@Y)gIBJ+PBkz{QHj~0YJON;{wm8l;*I5AF8NRKL5YIfs`4jRR-H=fsxB>z z7@?;F@uL6Aw2CBmzIjO11qRg`7H)%sUQ~|InJ{uQUE`kjrtOVyP$Vtn(CFxr3t`Du z8u4T)4@#h9DCQm%5vm#!B#N5NvNNeN=CK@KZ|N7qr z&CbPz?tMK_N$)4~D|`i5-I_#Kmd=oYOVNFb@KANrw&lexV>;p}9Am2a#NcE^`bLX0tT31!F!EX*rQg}|Rv%~}LiYK;~pY9-Yz`;S1Y z$C?%!UtoM8aB)Yn1g+(LN!?dQxc-DEZ;?N}{sjN!v&jQAIhmHPzMjJ|M3x5SZW!ta z6@>DQ%(g(6QU^Jp8CKL^5>^W#(Cn{mpzLg2HA%xRW+G40V8T_+kI3dka@vGJO6j)~-?=mMMIe3w7 zb$#}vSIX9wRc2rmj{T=XZ!m%GhpNUhBi_+EQTaMxpmRPnw&`N_g`Y+w=Fy=9qg>UD zOI3;ZnU~F~lt27?zkgp}wO@SYm|+v@3^65t?yxV?BQ_pI90qlpyqhVyxqOHdvv7$?h2H7^DKAmJf^HXgx_my z(YK@8Y)DjuuY{PP+_2qC$7MS6S^dMN^6?RgtHF;=Df=lwUH9~m`OG_#VbUtpWubdX zFa8~3kRuL-*u&EvNWy$+`?i$AI~%pH6Lh-ePekhPhF5Y1GN26o^{eHLVHx0@(mU#d zx;>|LB-+8qd$|Sg>yi@fjHKh`M{v*Qv&meyZzBpvt?Fb1Y1-C2+DK`ng5c&EH$vaZ z`p^7=HF(ZCHaSG|0`$5M444J)n>E;|`OUC^^tTZQ8KA=qRpfdJt|=8mSKSv%>=hqt zcSd-DOH`Kl+!vG3Q4j(SQ7|xzt5aEfK>Q-A;HrBcw3c=XLcMim-Qk;>b8@5aci$=) z309c&jDzw;JzT!B)MnS3(3`yF$gagB*P-jFdU4*eYQHyDx^ZyjE2bjM`SR)W|6E(# z@Wn&gjdGa{Ra9LP8+rGPvLc?`i21iei78ZUlZ<}A@5=eqqeZoXmC4cN`NLfWX5I*9 zgV!vi!n`Fiw`8Dh9_uAw;Wo&MfU$$ZmZ#{`>P$_$I!Gu!{`>c0G|p)a^{{k-fx&XJ z`TjR$`7~vc#M8nTJUX<|D=ADGCl^RFv56FR4^?MlwIq1C^RmhN{wH|V$y?Jb;C-s8 z2gXR!F@ny=UH-ctya7e(EbZgY8}GMyFi(BF)o)v>RebctI=XEdT)V^%S7@PxQg*sH zOFrI|+*9anla4kW0$2c&EicDa+(E)|68G7Jhyr)s?&y)XYLC`uU)+y*36LanybBl( z8?h1xnchimXf@qlh!xK*eQH-8X%9TLMJ4u31Am7~-sb6Yg{6V}cpivAOILX7W~yt8 ziGVI`hW??MksqDld(?W5sHEe|{bd3vy%SnNp+jEdWD2GPMos_yMoVq=2#<1mGN87} zWIeVc7SNqoeLhcDd2HCs-f5UngsyFGA(>C3aUJNTqZ3qoXJmg^iB+XDpm+;8CUxBZ z7NK;oRq%8=MJ6xNGfsw$M|ILZSqyLsVX-TUx+|m@eIH2QJFV$7VB)mStwYtI>J`%~{V(?Sd($ff9~uA>8dn^Oq+%scK|WxlK!)9314z711S!7sm{%ghj;2W6yr>Hd-Ya+t-HM+tR%S!FYyD`!~ zIf9dLt()p`S(rXk^P6@hp#&l#Om)2iudtr+kO#%ZtrGINJnv?_N7B=6pwgdsA@XoN zacDH&whVb*>0oxYq7WTJQ1fDrmP~_;9v>8nnBmzLZf4ugl8I%5yfQ)**mQE9x3;oOc8PCY zf;1e@^RD?(P-7jqrwHxnTt)+@<+CZ@W!%p=i`ee>}(8_&rkk+iC(@OUCY=dU);XYlTA96 zi{vijBScP^}!67mT2#s3ibEkP!vYb0v}&F-7kt_h!rRawRPlSQTIb{kZKh zMN+%T`&PBgQD;9#S4oaWr+ecvI!0u!&tlo7xOHX|Ogv%>kh7}YnTCWRsM3%*g~lBg z@DzC=X6q--2JuD@>%TVN>yTOyrlx2e@9)`Tx&mEtul{h9G8~N5(YM$=%J~qp`ATb6 z<0LkGxns)6whJ z_V2mBj$lLF#F)mNOv;jyfNEa3wke5B!q!R$n1U?ad3HZmoS9!$;|Uh(8yxN6w zO{g&4xu}Bys;+m1#hl^veDiK^`D*>vMB}y#wdr*5ajo2SVI*e?U*{Wg8cBrEf^YcT zfjo)*9{J|01Wy&I`2Z1;>kuLyUq$xrNX!TG)O3L{(eVAQ(wLjQ?KD?br{r9G)o(RF z-uqOAIt}w+g{{uTG`xZbLk+5gJ)5N@U<7Hc1bXw~P9lPzAGKfUTlev=oN5wONYy1A z%gb;m2AQAYRl^bgS6QB*kUGI{q1WV1W^&_Ic3(&V`<@Gyutc1KerzYE2P+!oXB{=i zYiMS|1DtUZ`o&g1ey7(9;1ZxQocj8daH?tO^*xGjbP#ZWTHMqIlAQ_ZMyhRC@0Qwd)=Aa7 zdm63dB-rA6n#*fH=O&xN$782cv#B}QvehauMHEq4d#yz#?s=SyW{V+dv%7&n0TGCe z?yP3<`NR=%`O5c9|EmR+-d%)X?dS#n`BX-u>K#!-?SvYM&z{~$dChr!{+ctnN2^p2 z#UC@cG>_^layFMBQ2p#@Foov~afwyEz(Xc>&GO)Xjxn&tmJ9saB}TzK#{LujxOj4> z$^FHjS~ImonKs28-#di2s9D|?jkL{lO6dl~-N6FsilH+;~mG0D za%>Jt+O-5n(7_*NZP(LEuV21PL7T4-_cDI$=dCbf4onyv`r1reN@i~k zsH-AsGR%Q3sco9>JP4$~jP!E)p%XektaS8-%~rNvzN{>q!-S?&GjJCjcYQezRrlSy zY3?ns5RcL%O>gG{`XZn4m!@@C9F^Sh96WA&)&cl!Hm@Ie4tl~~D70gt9&{WESqqG^ zFCnK5q~0hrwk9(t9Srw{&xMY6udACzp z>$oJ)`5x$Quy#&*s+2f=%4(PiaRQy3UA~F|x<4hfO+}t|P};~iIQJE6>KVTI^>n}= zFS@tI|M#d1l#Zu!*;X2Bjb*Gm?)sQuOpJ zOrzSAseh-E)n^A6R$tO|w>JJOXMbT^DVf35RI1dX-(iL?d&O{O)Qe$nv^T!*Mi&dW0^yZao4 zm3G23+Avbj@w{udqN`V4z%v9l=r*I^!yvJ2%NA-HA2XSpHlPO(KE86w(vir;qrWwS z#`dTlrJ=(1oIuyB!hO0PCAe{jYE7pYo$ob&Z;zXQAV<6~`K8V!1|ygv0<7mGoCi&j zdJxw%#0Iu}314%xdF{~R6@SX+drV#Dd|~ef*@qsDbBq{jsshs7E)bH0%n@LYhpBbd zu$c)q{N}@US9kL_^X8$T1gvSbV#xSST6yAWeXi_@vEUUb;dZ|< zeY8ZY{aJWN1NV$)IuQ&zx?ND z@C3z40q#b`;&M+n+jB!ZA`!3~;Ru!O?CpRI;_QfeQztNK`8l6&4zxiJSDF_l*sR9& zamj(?;ut|Yz@p=RhD`H{o~{q686lmf8UAA&f#T+znBlYsP0vS?2~Nz9 zsGGw)4+NfJEjv6n1z78G67&<+dBL#1dh}_p!>3JmqptQdI8azk9@))@5?S4=1h2%BK33Ayqoaw?br;v?M7}}ru1L|YXhIGn^Ca@| z8J6qyc+g8@-lWzK$8j7>sZdudxv>~)1n~UiXH-BCo=`NI(|C#tTvJO2A{$$TD&_((jJn;0gCGaZ-1TunFe$E$*t2& zw8qJyV*6Bo94V?=F3LkrHBp0@50|cc43~y_5DN=fyeVqa&z1L15Wr?E_hBB<)ra~T za<>BV8WSHSubyj@d%;HxUz5p`x}w_Diw_o+J13R%+@?s8B(iKc3tpUY>Ua$KQdn9WHnQ`&yPFE?~#iZStRa&Cjf?faUcUc^6%K3^o?mskp@# zrp3Mw`MigT;93i6rB_;+IZK^Xst3IhGYR&Ho~xw$q>h~1DUln3kuzqeBBC7+dOvo3 z2=iOzO7+h-%}hL!m6`A_GG-Sa6w11#V*ZWZz+jxOw=a&aSBMR^_^_>o$la5PB zZ5EpkLSIKe0O@t7w}7ol`nwdpK7ShP#?kwn8s^;?UT(b6eUx(o>SA+@)bA7|FNRNNFR++(ExcFOoN=GhoF4M)8jCUCkl7AbPg#Mn_|mP`nfNmQSq&p3=~}=VCQmZpiz=B&7gA- zqQ{HYX}_8A@^X^8e2K?s9kz3JM3)8#qOwPdRMS=c3igpC9|lH zpD0#F9=-8XrXCTbG9DXekg#({>`e%BnH17NQe=6QBT$2H7o04Zmvqgg9Sk=9lA5q9i`6FWgv-Cw>Dea(Sm-cu)@C;xq5H;QW>{g3~;Kn_;Z4B34ew<{FI3j(IJ5Aw z=~B9eUIzT5-}cq;Q0+<{2d30DQfp7&X@;P&JOXA_$cwFPtK>)8v!m1CMcRMkHlYmu zfr~_gz*lP?4P_OjFJDIc%|}tW9p3n^jh`NJ>GHa%S@Z)Ph(cPJ7R!B)>8s`Nrc`88N3i~Af!nTMy(zK?DrDev*EouZ{$epjG#hO4kU3hS zfaDVWUyWXq_hSfzM91N|AovG#bbiFOkclYWQsJ?T^=cS1CJoT-qbCe(nTdLpxc?FJ zEonOUx_G*y{3<=~eO-C4jEt1`xqPw4*|*t%kXCosIh3AofhbXRodFnRFp(FF_n+xG z6NS?uT6jhqr7L`fJc>i=KHNvkPO<62?0=Gt5n8e940Tz-F1Y^))oD3l5(Gw1iAvcq zph*jb{i`$Dbjm%3e>;FMD>JYz1RQ!&tE-* zf3{(LWoG@+mprTgSkT1hD9hsaZ4Yf>)(q{0SpA!rQ`ge#b=tndR=s)C*pAJ`ci$Up&(T1h(b|;_tH0`r@2$b~%6kDAx4YgSz*>nLYu27G zeMC;AaOO&&avI^`#$xh;>$y0E#ER%dGCWrCo6ma*`rNNQBV1Ohcn=^5M|{ZWvt&l{{8^$Gp%_ zeOpF2#WPLl;MRvM&03GoNR=MDwJbuxowW}rX5NQ=pD=66$9Mr=7&H0uN%Gc0F~E9E zs+hDFvkANU0;PMC*E?du>HN${7w>8|%p2xuXaSF%epGc{Lj!e}(<~jf2lpIEB^J)` zAs!jTH`<@StlE;vjB5=(4pFcnpZD_bXxBNo04k;H>bXRoDk-EWs|S~}?sV*OCfJN8 z{8#J$d0K7w;@&eRW9(!UxzFEPmCDNdS_gt9kXoI#%M;&{t*46l&xDXcGtWN_vi5b+y?D7el#6Sv3= zQvS9K{B2-UrQZ{WPLTrS6^6@_Yn+xD|^opd{ z#a!lbW=Wqv@sw{1qlz+?3w)|n%HhKV$o^(fu@^Zq51+b7qqT_$Z zAwE3RF&rOcM?`)Oh>SxObiXffvok@wdlucpRI3{}0m=wnU|gLF9mhjEiXAvaFU{j9 zsy*;IU>jUGM$cIC!fo;FL+?#UiE5l)JxQg8Nd97L~c<51eG<)Ucu);1>_9*}h=sfV$EhjvMcWCC-;twP;J zF;P4BFR_ZCyP^EGRi1;6&>_%Tv3o-yKUS^CHBTC!IbMtBP1KdsBv%G649_6pMax_X z3>Nb;*|g(8+Z<$ar)Yh+;Bu=LL^!r)I0XsYzmPfF7aFp zr@xAK7h79zGM?n(4lXQeTLudbIFp3xGf{FR(!CK+WZzd^Ixte44|mWtZt*dTzlnyt$?4GDMS)Dao;`b_BuEPp$xtb0-wkd$6xLy{#U_fkIzE_3E4TD~fv6yagf-ksuK^N4qmnx7 zI(lrt6k&^A+4(6`=A_G~bQ9It1XvF09Ne))`I~qHFFXT^k0elLP}bA?_OdG`@eV~{ zL;zE>d%MZF57l~Eb-qG+L`K`Cadn-6+yhC3uZK5aH~i>g7p=V9^hsWZY%#lp%cu@dNAyd77L+P_Omf0kqD)i7z~ZZu}#>kYzPHz_ryyGk1=+1rFI= z9H`s5JYc)5k^Tnn!)y6YZg#lll7HDoCC-N9vSr`@R$l^0b8|i*@D=z{knL>Lg5{Ep z1s1MimIV;YH=xN-v^=ehq^cWS=mhXwZl%+UvqHl&*9y}{IY`GgJJ7_jF8LKMWhbC+ z=^}bpZb{53zi)-2iP*?qL;GJ68ZC1081y@5MF+s1{XT~C0JzeDXk}^M6?|WeF!3sdOQB z(d};gIm`BikK>7^TYoWpg57*2#ab#Px@{KW_PDXG`sdt8wDcI1!3P?g*m9Bv^7582 zqMN=*Pn1L28ImCbS$Y>h!bE(DE;BvZnVE`v4u>Y-p1;x!oRfb|!ZMxMlEkDWG^bW| z)z!${8PUBJ-h&UhCwK^qpiTe8CvwXp zeCPrmV!z(CB4r}OD%QIEpB!$P53B;~1FZcnWo%O4^se(`{0AP%; zf9KS|K}41h-L<8m?MFfP_Pn34_(@a+{$_qc!W-DkTH^L~Pn@gb-r+F7rZ!=kmq`_I z=F^#hoZrT}Q^JUAD;fXLT&|J9Oleu}(Lbhea#u|4E``YxhTK>22jsGB`dl{gVeDZK z=)5x~+}2aab&`~70Ck<-h4uF!iYEW%G(+T{v0c6QI`pBcAc?C+#8M_dFyP^mJY(2Bxw%B;O)GM>2AUZ#G}R(Zs>bQ7_a0kMuU0cPMy3kF zfbmgiaLOF_Y&BlHQ|lhi$!o8dTX|GKbV$q$g_mGsR!hU_Jip(AMZ zo94#qL>LIY2?L?$IF?Pl8p=^~P;b8`HZ=|M`d$*Z=CRnmJ~=j6p>{M(1NL8>eOBhh zXo-L9z8CSvx*X6StUW|2<==my^LuTkO@mr3Gix#}-qmvJnmthvZ=m;V_?1 zRZP+GY_>v-iaVpRa%9?MRf3oAuq--Snl@9RA9hS-N=kf^3-4iZ7>#BWOF}UZa6ime zJ8$!MklSTqY{P~dFm8}>ic<>S;y?wcCeO~nZ>d*5=h5?N9sn@`M-;GBgSn0!yxW`R zD(6E|R${T|M%>uW97fLO)FyWg#qDlG*2@7f@c9rpi~6ox<)a&6xSGx6Y8Oki9eBbW z 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≺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 z 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