add dotfiles to be placed under home directories
dotfiles like .bash*, .git*, .vim*, etc.
This commit is contained in:
parent
8fd26fd7b3
commit
0722320162
96 changed files with 24010 additions and 0 deletions
95
.bash_gitprompt
Normal file
95
.bash_gitprompt
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
# .bash_gitprompt
|
||||||
|
# Git Commands
|
||||||
|
#
|
||||||
|
# original sources - https://github.com/matthewmccullough/MatthewsShellConfig/
|
||||||
|
# modified by Dongsu Park <dpark AT posteo.net>
|
||||||
|
#
|
||||||
|
# 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
|
44
.bash_profile
Normal file
44
.bash_profile
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
# .bash_profile
|
||||||
|
# Dongsu Park <dpark AT posteo.net>
|
||||||
|
|
||||||
|
# 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
|
181
.bashrc
Normal file
181
.bashrc
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
# .bashrc
|
||||||
|
# executed by login and subshells
|
||||||
|
#
|
||||||
|
# Dongsu Park <dpark AT posteo.net>
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
2921
.git-completion.bash
Normal file
2921
.git-completion.bash
Normal file
File diff suppressed because it is too large
Load diff
47
.gitconfig
Normal file
47
.gitconfig
Normal file
|
@ -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 <dpark@posteo.net>"
|
||||||
|
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:]$_].*[^:]$"
|
119
.muttrc
Normal file
119
.muttrc
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
# A basic .muttrc for multiple accounts
|
||||||
|
# Dongsu Park <dpark AT posteo.net>
|
||||||
|
|
||||||
|
# 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 <dpark@posteo.net>" \
|
||||||
|
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 <advance38@gmail.com>" \
|
||||||
|
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 "<enter-command>set trash=\"imaps://imap.googlemail.com/[Gmail]/Trash\"\n <delete-message>" "Gmail archive message"
|
||||||
|
|
||||||
|
macro index,pager l "<change-folder>?<toggle-mailboxes>" "Listing mailboxes"
|
||||||
|
|
||||||
|
macro index,pager gg "<change-folder>=posteo/INBOX<enter>" "Go to inbox advance38"
|
||||||
|
macro index,pager gi "<change-folder>=posteo/INBOX<enter>" "Go to inbox advance38"
|
||||||
|
macro index,pager ga "<change-folder>=[<tab>/All<tab><enter>" "Go to all mail"
|
||||||
|
macro index,pager gs "<change-folder>=[<tab>Starred<enter>" "Go to starred messages"
|
||||||
|
macro index,pager gd "<change-folder>=[<tab>Drafts<enter>" "Go to drafts"
|
||||||
|
|
||||||
|
set alias_file="~/.mutt/aliases"
|
543
.offlineimaprc
Normal file
543
.offlineimaprc
Normal file
|
@ -0,0 +1,543 @@
|
||||||
|
# Sample configuration file
|
||||||
|
# Copyright (C) 2002-2005 John Goerzen
|
||||||
|
# <jgoerzen@complete.org>
|
||||||
|
#
|
||||||
|
# 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 <n> to do <n> quick updates before doing
|
||||||
|
# another full synchronization (requires autorefresh). Updates are
|
||||||
|
# always performed after <autorefresh> 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
|
||||||
|
|
347
.vim/autoload/pathogen.vim
Normal file
347
.vim/autoload/pathogen.vim
Normal file
|
@ -0,0 +1,347 @@
|
||||||
|
" pathogen.vim - path option manipulation
|
||||||
|
" Maintainer: Tim Pope <http://tpo.pe/>
|
||||||
|
" 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,'\\\@<!\%(\\\\\)*\zs,')
|
||||||
|
return map(split,'substitute(v:val,''\\\([\\,]\)'',''\1'',"g")')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Convert a list to a path.
|
||||||
|
function! pathogen#join(...) abort
|
||||||
|
if type(a:1) == type(1) && a:1
|
||||||
|
let i = 1
|
||||||
|
let space = ' '
|
||||||
|
else
|
||||||
|
let i = 0
|
||||||
|
let space = ''
|
||||||
|
endif
|
||||||
|
let path = ""
|
||||||
|
while i < a:0
|
||||||
|
if type(a:000[i]) == type([])
|
||||||
|
let list = a:000[i]
|
||||||
|
let j = 0
|
||||||
|
while j < len(list)
|
||||||
|
let escaped = substitute(list[j],'[,'.space.']\|\\[\,'.space.']\@=','\\&','g')
|
||||||
|
let path .= ',' . escaped
|
||||||
|
let j += 1
|
||||||
|
endwhile
|
||||||
|
else
|
||||||
|
let path .= "," . a:000[i]
|
||||||
|
endif
|
||||||
|
let i += 1
|
||||||
|
endwhile
|
||||||
|
return substitute(path,'^,','','')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Convert a list to a path with escaped spaces for 'path', 'tag', etc.
|
||||||
|
function! pathogen#legacyjoin(...) abort
|
||||||
|
return call('pathogen#join',[1] + a:000)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Turn filetype detection off and back on again if it was already enabled.
|
||||||
|
function! pathogen#cycle_filetype() abort
|
||||||
|
if exists('g:did_load_filetypes')
|
||||||
|
filetype off
|
||||||
|
filetype on
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Check if a bundle is disabled. A bundle is considered disabled if its
|
||||||
|
" basename or full name is included in the list g:pathogen_disabled.
|
||||||
|
function! pathogen#is_disabled(path) abort
|
||||||
|
if a:path =~# '\~$'
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
let sep = pathogen#slash()
|
||||||
|
let blacklist = map(
|
||||||
|
\ get(g:, 'pathogen_blacklist', get(g:, 'pathogen_disabled', [])) +
|
||||||
|
\ pathogen#split($VIMBLACKLIST),
|
||||||
|
\ 'substitute(v:val, "[\\/]$", "", "")')
|
||||||
|
return index(blacklist, fnamemodify(a:path, ':t')) != -1 || index(blacklist, a:path) != -1
|
||||||
|
endfunction "}}}1
|
||||||
|
|
||||||
|
" Prepend the given directory to the runtime path and append its corresponding
|
||||||
|
" after directory. Curly braces are expanded with pathogen#expand().
|
||||||
|
function! pathogen#surround(path) abort
|
||||||
|
let sep = pathogen#slash()
|
||||||
|
let rtp = pathogen#split(&rtp)
|
||||||
|
let path = fnamemodify(a:path, ':p:?[\\/]\=$??')
|
||||||
|
let before = filter(pathogen#expand(path), '!pathogen#is_disabled(v:val)')
|
||||||
|
let after = filter(reverse(pathogen#expand(path.sep.'after')), '!pathogen#is_disabled(v:val[0:-7])')
|
||||||
|
call filter(rtp, 'index(before + after, v:val) == -1')
|
||||||
|
let &rtp = pathogen#join(before, rtp, after)
|
||||||
|
return &rtp
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" For each directory in the runtime path, add a second entry with the given
|
||||||
|
" argument appended. Curly braces are expanded with pathogen#expand().
|
||||||
|
function! pathogen#interpose(name) abort
|
||||||
|
let sep = pathogen#slash()
|
||||||
|
let name = a:name
|
||||||
|
if has_key(s:done_bundles, name)
|
||||||
|
return ""
|
||||||
|
endif
|
||||||
|
let s:done_bundles[name] = 1
|
||||||
|
let list = []
|
||||||
|
for dir in pathogen#split(&rtp)
|
||||||
|
if dir =~# '\<after$'
|
||||||
|
let list += reverse(filter(pathogen#expand(dir[0:-6].name.sep.'after'), '!pathogen#is_disabled(v:val[0:-7])')) + [dir]
|
||||||
|
else
|
||||||
|
let list += [dir] + filter(pathogen#expand(dir.sep.name), '!pathogen#is_disabled(v:val)')
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
let &rtp = pathogen#join(pathogen#uniq(list))
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let s:done_bundles = {}
|
||||||
|
|
||||||
|
" Invoke :helptags on all non-$VIM doc directories in runtimepath.
|
||||||
|
function! pathogen#helptags() abort
|
||||||
|
let sep = pathogen#slash()
|
||||||
|
for glob in pathogen#split(&rtp)
|
||||||
|
for dir in map(split(glob(glob), "\n"), 'v:val.sep."/doc/".sep')
|
||||||
|
if (dir)[0 : strlen($VIMRUNTIME)] !=# $VIMRUNTIME.sep && filewritable(dir) == 2 && !empty(split(glob(dir.'*.txt'))) && (!filereadable(dir.'tags') || filewritable(dir.'tags'))
|
||||||
|
silent! execute 'helptags' pathogen#fnameescape(dir)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endfor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
command! -bar Helptags :call pathogen#helptags()
|
||||||
|
|
||||||
|
" Execute the given command. This is basically a backdoor for --remote-expr.
|
||||||
|
function! pathogen#execute(...) abort
|
||||||
|
for command in a:000
|
||||||
|
execute command
|
||||||
|
endfor
|
||||||
|
return ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Section: Unofficial
|
||||||
|
|
||||||
|
function! pathogen#is_absolute(path) abort
|
||||||
|
return a:path =~# (has('win32') ? '^\%([\\/]\|\w:\)[\\/]\|^[~$]' : '^[/~$]')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Given a string, returns all possible permutations of comma delimited braced
|
||||||
|
" alternatives of that string. pathogen#expand('/{a,b}/{c,d}') yields
|
||||||
|
" ['/a/c', '/a/d', '/b/c', '/b/d']. Empty braces are treated as a wildcard
|
||||||
|
" and globbed. Actual globs are preserved.
|
||||||
|
function! pathogen#expand(pattern) abort
|
||||||
|
if a:pattern =~# '{[^{}]\+}'
|
||||||
|
let [pre, pat, post] = split(substitute(a:pattern, '\(.\{-\}\){\([^{}]\+\)}\(.*\)', "\\1\001\\2\001\\3", ''), "\001", 1)
|
||||||
|
let found = map(split(pat, ',', 1), 'pre.v:val.post')
|
||||||
|
let results = []
|
||||||
|
for pattern in found
|
||||||
|
call extend(results, pathogen#expand(pattern))
|
||||||
|
endfor
|
||||||
|
return results
|
||||||
|
elseif a:pattern =~# '{}'
|
||||||
|
let pat = matchstr(a:pattern, '^.*{}[^*]*\%($\|[\\/]\)')
|
||||||
|
let post = a:pattern[strlen(pat) : -1]
|
||||||
|
return map(split(glob(substitute(pat, '{}', '*', 'g')), "\n"), 'v:val.post')
|
||||||
|
else
|
||||||
|
return [a:pattern]
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" \ on Windows unless shellslash is set, / everywhere else.
|
||||||
|
function! pathogen#slash() abort
|
||||||
|
return !exists("+shellslash") || &shellslash ? '/' : '\'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! pathogen#separator() abort
|
||||||
|
return pathogen#slash()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Convenience wrapper around glob() which returns a list.
|
||||||
|
function! pathogen#glob(pattern) abort
|
||||||
|
let files = split(glob(a:pattern),"\n")
|
||||||
|
return map(files,'substitute(v:val,"[".pathogen#slash()."/]$","","")')
|
||||||
|
endfunction "}}}1
|
||||||
|
|
||||||
|
" Like pathogen#glob(), only limit the results to directories.
|
||||||
|
function! pathogen#glob_directories(pattern) abort
|
||||||
|
return filter(pathogen#glob(a:pattern),'isdirectory(v:val)')
|
||||||
|
endfunction "}}}1
|
||||||
|
|
||||||
|
" Remove duplicates from a list.
|
||||||
|
function! pathogen#uniq(list) abort
|
||||||
|
let i = 0
|
||||||
|
let seen = {}
|
||||||
|
while i < len(a:list)
|
||||||
|
if (a:list[i] ==# '' && exists('empty')) || has_key(seen,a:list[i])
|
||||||
|
call remove(a:list,i)
|
||||||
|
elseif a:list[i] ==# ''
|
||||||
|
let i += 1
|
||||||
|
let empty = 1
|
||||||
|
else
|
||||||
|
let seen[a:list[i]] = 1
|
||||||
|
let i += 1
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
return a:list
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Backport of fnameescape().
|
||||||
|
function! pathogen#fnameescape(string) abort
|
||||||
|
if exists('*fnameescape')
|
||||||
|
return fnameescape(a:string)
|
||||||
|
elseif a:string ==# '-'
|
||||||
|
return '\-'
|
||||||
|
else
|
||||||
|
return substitute(escape(a:string," \t\n*?[{`$\\%#'\"|!<"),'^[+>]','\\&','')
|
||||||
|
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(<count>,'edit<bang>',<q-args>,0)
|
||||||
|
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vedit :execute s:find(<count>,'edit<bang>',<q-args>,0)
|
||||||
|
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vopen :execute s:find(<count>,'edit<bang>',<q-args>,1)
|
||||||
|
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vsplit :execute s:find(<count>,'split',<q-args>,<bang>1)
|
||||||
|
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vvsplit :execute s:find(<count>,'vsplit',<q-args>,<bang>1)
|
||||||
|
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vtabedit :execute s:find(<count>,'tabedit',<q-args>,<bang>1)
|
||||||
|
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vpedit :execute s:find(<count>,'pedit',<q-args>,<bang>1)
|
||||||
|
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vread :execute s:find(<count>,'read',<q-args>,<bang>1)
|
||||||
|
|
||||||
|
" vim:set et sw=2 foldmethod=expr foldexpr=getline(v\:lnum)=~'^\"\ Section\:'?'>1'\:getline(v\:lnum)=~#'^fu'?'a1'\:getline(v\:lnum)=~#'^endf'?'s1'\:'=':
|
2037
.vim/autoload/plug.vim
Normal file
2037
.vim/autoload/plug.vim
Normal file
File diff suppressed because it is too large
Load diff
201
.vim/bundle/rust.vim/LICENSE-APACHE
Normal file
201
.vim/bundle/rust.vim/LICENSE-APACHE
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
25
.vim/bundle/rust.vim/LICENSE-MIT
Normal file
25
.vim/bundle/rust.vim/LICENSE-MIT
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
Copyright (c) 2015 The Rust Project Developers
|
||||||
|
|
||||||
|
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.
|
87
.vim/bundle/rust.vim/README.md
Normal file
87
.vim/bundle/rust.vim/README.md
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
# rust.vim
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
This is a Vim plugin that provides [Rust][r] file detection, syntax highlighting, formatting,
|
||||||
|
[Syntastic][syn] integration, and more.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### Using [Vundle][v]
|
||||||
|
|
||||||
|
1. Add `Plugin 'rust-lang/rust.vim'` to `~/.vimrc`
|
||||||
|
2. `:PluginInstall` or `$ vim +PluginInstall +qall`
|
||||||
|
|
||||||
|
*Note:* Vundle will not automatically detect Rust files properly if `filetype
|
||||||
|
on` is executed before Vundle. Please check the [quickstart][vqs] for more
|
||||||
|
details.
|
||||||
|
|
||||||
|
### Using [Pathogen][p]
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git clone --depth=1 https://github.com/rust-lang/rust.vim.git ~/.vim/bundle/rust.vim
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using [NeoBundle][nb]
|
||||||
|
|
||||||
|
1. Add `NeoBundle 'rust-lang/rust.vim'` to `~/.vimrc`
|
||||||
|
2. Re-open vim or execute `:source ~/.vimrc`
|
||||||
|
|
||||||
|
### Using [vim-plug][vp]
|
||||||
|
|
||||||
|
1. Add `Plug 'rust-lang/rust.vim'` to `~/.vimrc`
|
||||||
|
2. `:PlugInstall` or `$ vim +PlugInstall +qall`
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Error checking with [Syntastic][syn]
|
||||||
|
|
||||||
|
`rust.vim` automatically registers `rustc` as a syntax checker
|
||||||
|
with [Syntastic][syn]. Check Syntastic's documentation for
|
||||||
|
information on how to customize its behaviour.
|
||||||
|
|
||||||
|
### Formatting with [rustfmt][rfmt]
|
||||||
|
|
||||||
|
The `:RustFmt` command will format your code with
|
||||||
|
[rustfmt][rfmt] if installed.
|
||||||
|
|
||||||
|
Placing `let g:rustfmt_autosave = 1` in your `~/.vimrc` will
|
||||||
|
enable automatic running of `:RustFmt` when you save a buffer.
|
||||||
|
|
||||||
|
Do `:help :RustFmt` for further formatting help and customization
|
||||||
|
options.
|
||||||
|
|
||||||
|
### [Playpen][pp] integration
|
||||||
|
|
||||||
|
*Note:* This feature requires [webapi-vim][wav] to be installed.
|
||||||
|
|
||||||
|
The `:RustPlay` command will send the current selection, or if
|
||||||
|
nothing is selected the current buffer, to the [Rust playpen][pp].
|
||||||
|
|
||||||
|
[rfmt]: https://crates.io/crates/rustfmt/
|
||||||
|
|
||||||
|
## Help
|
||||||
|
|
||||||
|
Further help can be found in the documentation with `:Helptags` then `:help rust`.
|
||||||
|
|
||||||
|
Detailed help can be found in the documentation with `:help rust`.
|
||||||
|
Helptags (`:help helptags`) need to be generated for this plugin
|
||||||
|
in order to navigate the help. Most plugin managers will do this
|
||||||
|
automatically, but check their documentation if that is not the case.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Like Rust, rust.vim is primarily distributed under the terms of both the MIT
|
||||||
|
license and the Apache License (Version 2.0). See LICENSE-APACHE and
|
||||||
|
LICENSE-MIT for details.
|
||||||
|
|
||||||
|
[r]: https://www.rust-lang.org
|
||||||
|
[v]: https://github.com/gmarik/vundle
|
||||||
|
[vqs]: https://github.com/gmarik/vundle#quick-start
|
||||||
|
[p]: https://github.com/tpope/vim-pathogen
|
||||||
|
[nb]: https://github.com/Shougo/neobundle.vim
|
||||||
|
[vp]: https://github.com/junegunn/vim-plug
|
||||||
|
[rfmt]: https://github.com/rust-lang-nursery/rustfmt
|
||||||
|
[syn]: https://github.com/scrooloose/syntastic
|
||||||
|
[wav]: https://github.com/mattn/webapi-vim
|
||||||
|
[pp]: https://play.rust-lang.org/
|
34
.vim/bundle/rust.vim/after/syntax/rust.vim
Normal file
34
.vim/bundle/rust.vim/after/syntax/rust.vim
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
if !exists('g:rust_conceal') || g:rust_conceal == 0 || !has('conceal') || &enc != 'utf-8'
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
" For those who don't want to see `::`...
|
||||||
|
if exists('g:rust_conceal_mod_path') && g:rust_conceal_mod_path != 0
|
||||||
|
syn match rustNiceOperator "::" conceal cchar=ㆍ
|
||||||
|
endif
|
||||||
|
|
||||||
|
syn match rustRightArrowHead contained ">" 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 <buffer> hi! link Conceal Operator
|
||||||
|
endif
|
414
.vim/bundle/rust.vim/autoload/rust.vim
Normal file
414
.vim/bundle/rust.vim/autoload/rust.vim
Normal file
|
@ -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 <SID>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 <mattn.jp@gmail.com> 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:
|
106
.vim/bundle/rust.vim/autoload/rustfmt.vim
Normal file
106
.vim/bundle/rust.vim/autoload/rustfmt.vim
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
" Author: Stephen Sugden <stephen@stephensugden.com>
|
||||||
|
"
|
||||||
|
" 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
|
28
.vim/bundle/rust.vim/compiler/cargo.vim
Normal file
28
.vim/bundle/rust.vim/compiler/cargo.vim
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
" Vim compiler file
|
||||||
|
" Compiler: Cargo Compiler
|
||||||
|
" Maintainer: Damien Radtke <damienradtke@gmail.com>
|
||||||
|
" 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 <args>
|
||||||
|
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\\,%.%#
|
45
.vim/bundle/rust.vim/compiler/rustc.vim
Normal file
45
.vim/bundle/rust.vim/compiler/rustc.vim
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
" Vim compiler file
|
||||||
|
" Compiler: Rust Compiler
|
||||||
|
" Maintainer: Chris Morgan <me@chrismorgan.info>
|
||||||
|
" 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 <args>
|
||||||
|
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
|
237
.vim/bundle/rust.vim/doc/rust.txt
Normal file
237
.vim/bundle/rust.vim/doc/rust.txt
Normal file
|
@ -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_<D-r>*
|
||||||
|
<D-r> Executes |:RustRun| with no arguments.
|
||||||
|
Note: This binding is only available in MacVim.
|
||||||
|
|
||||||
|
*rust_<D-R>*
|
||||||
|
<D-R> 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:
|
1
.vim/bundle/rust.vim/ftdetect/rust.vim
Normal file
1
.vim/bundle/rust.vim/ftdetect/rust.vim
Normal file
|
@ -0,0 +1 @@
|
||||||
|
au BufRead,BufNewFile *.rs set filetype=rust
|
207
.vim/bundle/rust.vim/ftplugin/rust.vim
Normal file
207
.vim/bundle/rust.vim/ftplugin/rust.vim
Normal file
|
@ -0,0 +1,207 @@
|
||||||
|
" Language: Rust
|
||||||
|
" Description: Vim syntax file for Rust
|
||||||
|
" Maintainer: Chris Morgan <me@chrismorgan.info>
|
||||||
|
" Maintainer: Kevin Ballard <kevin@sb.org>
|
||||||
|
" 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 <buffer>
|
||||||
|
\ if expand('<afile>') ==# '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 <buffer>
|
||||||
|
\ if expand('<afile>') ==# '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 <silent> <buffer> [[ :call rust#Jump('n', 'Back')<CR>
|
||||||
|
nnoremap <silent> <buffer> ]] :call rust#Jump('n', 'Forward')<CR>
|
||||||
|
xnoremap <silent> <buffer> [[ :call rust#Jump('v', 'Back')<CR>
|
||||||
|
xnoremap <silent> <buffer> ]] :call rust#Jump('v', 'Forward')<CR>
|
||||||
|
onoremap <silent> <buffer> [[ :call rust#Jump('o', 'Back')<CR>
|
||||||
|
onoremap <silent> <buffer> ]] :call rust#Jump('o', 'Forward')<CR>
|
||||||
|
|
||||||
|
" Commands {{{1
|
||||||
|
|
||||||
|
" See |:RustRun| for docs
|
||||||
|
command! -nargs=* -complete=file -bang -buffer RustRun call rust#Run(<bang>0, <q-args>)
|
||||||
|
|
||||||
|
" See |:RustExpand| for docs
|
||||||
|
command! -nargs=* -complete=customlist,rust#CompleteExpand -bang -buffer RustExpand call rust#Expand(<bang>0, <q-args>)
|
||||||
|
|
||||||
|
" See |:RustEmitIr| for docs
|
||||||
|
command! -nargs=* -buffer RustEmitIr call rust#Emit("llvm-ir", <q-args>)
|
||||||
|
|
||||||
|
" See |:RustEmitAsm| for docs
|
||||||
|
command! -nargs=* -buffer RustEmitAsm call rust#Emit("asm", <q-args>)
|
||||||
|
|
||||||
|
" See |:RustPlay| for docs
|
||||||
|
command! -range=% RustPlay :call rust#Play(<count>, <line1>, <line2>, <f-args>)
|
||||||
|
|
||||||
|
" See |:RustFmt| for docs
|
||||||
|
command! -buffer RustFmt call rustfmt#Format()
|
||||||
|
|
||||||
|
" See |:RustFmtRange| for docs
|
||||||
|
command! -range -buffer RustFmtRange call rustfmt#FormatRange(<line1>, <line2>)
|
||||||
|
|
||||||
|
" Mappings {{{1
|
||||||
|
|
||||||
|
" Bind ⌘R in MacVim to :RustRun
|
||||||
|
nnoremap <silent> <buffer> <D-r> :RustRun<CR>
|
||||||
|
" Bind ⌘⇧R in MacVim to :RustRun! pre-filled with the last args
|
||||||
|
nnoremap <buffer> <D-R> :RustRun! <C-r>=join(b:rust_last_rustc_args)<CR><C-\>erust#AppendCmdLine(' -- ' . join(b:rust_last_args))<CR>
|
||||||
|
|
||||||
|
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 <buffer> <D-r>
|
||||||
|
\|nunmap <buffer> <D-R>
|
||||||
|
\|nunmap <buffer> [[
|
||||||
|
\|nunmap <buffer> ]]
|
||||||
|
\|xunmap <buffer> [[
|
||||||
|
\|xunmap <buffer> ]]
|
||||||
|
\|ounmap <buffer> [[
|
||||||
|
\|ounmap <buffer> ]]
|
||||||
|
\|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:
|
206
.vim/bundle/rust.vim/indent/rust.vim
Normal file
206
.vim/bundle/rust.vim/indent/rust.vim
Normal file
|
@ -0,0 +1,206 @@
|
||||||
|
" Vim indent file
|
||||||
|
" Language: Rust
|
||||||
|
" Author: Chris Morgan <me@chrismorgan.info>
|
||||||
|
" 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
|
22
.vim/bundle/rust.vim/plugin/rust.vim
Normal file
22
.vim/bundle/rust.vim/plugin/rust.vim
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
" Vim syntastic plugin helper
|
||||||
|
" Language: Rust
|
||||||
|
" Maintainer: Andrew Gallant <jamslam@gmail.com>
|
||||||
|
|
||||||
|
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
|
294
.vim/bundle/rust.vim/syntax/rust.vim
Normal file
294
.vim/bundle/rust.vim/syntax/rust.vim
Normal file
|
@ -0,0 +1,294 @@
|
||||||
|
" Vim syntax file
|
||||||
|
" Language: Rust
|
||||||
|
" Maintainer: Patrick Walton <pcwalton@mozilla.com>
|
||||||
|
" Maintainer: Ben Blum <bblum@cs.cmu.edu>
|
||||||
|
" Maintainer: Chris Morgan <me@chrismorgan.info>
|
||||||
|
" 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 /\<union\_s\+\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*/ transparent contains=rustUnion
|
||||||
|
syn keyword rustOperator as
|
||||||
|
|
||||||
|
syn match rustAssert "\<assert\(\w\)*!" contained
|
||||||
|
syn match rustPanic "\<panic\(\w\)*!" contained
|
||||||
|
syn keyword rustKeyword break
|
||||||
|
syn keyword rustKeyword box nextgroup=rustBoxPlacement skipwhite skipempty
|
||||||
|
syn keyword rustKeyword continue
|
||||||
|
syn keyword rustKeyword extern nextgroup=rustExternCrate,rustObsoleteExternMod skipwhite skipempty
|
||||||
|
syn keyword rustKeyword fn nextgroup=rustFuncName skipwhite skipempty
|
||||||
|
syn keyword rustKeyword in impl let
|
||||||
|
syn keyword rustKeyword pub nextgroup=rustPubScope skipwhite skipempty
|
||||||
|
syn keyword rustKeyword return
|
||||||
|
syn keyword rustSuper super
|
||||||
|
syn keyword rustKeyword unsafe where
|
||||||
|
syn keyword rustKeyword use nextgroup=rustModPath skipwhite skipempty
|
||||||
|
" FIXME: Scoped impl's name is also fallen in this category
|
||||||
|
syn keyword rustKeyword mod trait nextgroup=rustIdentifier skipwhite skipempty
|
||||||
|
syn keyword rustStorage move mut ref static const
|
||||||
|
syn match rustDefault /\<default\ze\_s\+\(impl\|fn\|type\|const\)\>/
|
||||||
|
|
||||||
|
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::<T>();
|
||||||
|
|
||||||
|
" 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 ``\*\@<!`` at the start of them; it makes it worse, as
|
||||||
|
" then you must deal with cases like ``/*/**/*/``. And don't try making it
|
||||||
|
" worse with ``\%(/\@<!\*\)\@<!``, either...
|
||||||
|
|
||||||
|
syn keyword rustTodo contained TODO FIXME XXX NB NOTE
|
||||||
|
|
||||||
|
" Folding rules {{{2
|
||||||
|
" Trivial folding rules to begin with.
|
||||||
|
" FIXME: use the AST to make really good folding
|
||||||
|
syn region rustFoldBraces start="{" end="}" transparent fold
|
||||||
|
|
||||||
|
" Default highlighting {{{1
|
||||||
|
hi def link rustDecNumber rustNumber
|
||||||
|
hi def link rustHexNumber rustNumber
|
||||||
|
hi def link rustOctNumber rustNumber
|
||||||
|
hi def link rustBinNumber rustNumber
|
||||||
|
hi def link rustIdentifierPrime rustIdentifier
|
||||||
|
hi def link rustTrait rustType
|
||||||
|
hi def link rustDeriveTrait rustTrait
|
||||||
|
|
||||||
|
hi def link rustMacroRepeatCount rustMacroRepeatDelimiters
|
||||||
|
hi def link rustMacroRepeatDelimiters Macro
|
||||||
|
hi def link rustMacroVariable Define
|
||||||
|
hi def link rustSigil StorageClass
|
||||||
|
hi def link rustEscape Special
|
||||||
|
hi def link rustEscapeUnicode rustEscape
|
||||||
|
hi def link rustEscapeError Error
|
||||||
|
hi def link rustStringContinuation Special
|
||||||
|
hi def link rustString String
|
||||||
|
hi def link rustCharacterInvalid Error
|
||||||
|
hi def link rustCharacterInvalidUnicode rustCharacterInvalid
|
||||||
|
hi def link rustCharacter Character
|
||||||
|
hi def link rustNumber Number
|
||||||
|
hi def link rustBoolean Boolean
|
||||||
|
hi def link rustEnum rustType
|
||||||
|
hi def link rustEnumVariant rustConstant
|
||||||
|
hi def link rustConstant Constant
|
||||||
|
hi def link rustSelf Constant
|
||||||
|
hi def link rustFloat Float
|
||||||
|
hi def link rustArrowCharacter rustOperator
|
||||||
|
hi def link rustOperator Operator
|
||||||
|
hi def link rustKeyword Keyword
|
||||||
|
hi def link rustTypedef Keyword " More precise is Typedef, but it doesn't feel right for Rust
|
||||||
|
hi def link rustStructure Keyword " More precise is Structure
|
||||||
|
hi def link rustUnion rustStructure
|
||||||
|
hi def link rustPubScopeDelim Delimiter
|
||||||
|
hi def link rustPubScopeCrate rustKeyword
|
||||||
|
hi def link rustSuper rustKeyword
|
||||||
|
hi def link rustReservedKeyword Error
|
||||||
|
hi def link rustRepeat Conditional
|
||||||
|
hi def link rustConditional Conditional
|
||||||
|
hi def link rustIdentifier Identifier
|
||||||
|
hi def link rustCapsIdent rustIdentifier
|
||||||
|
hi def link rustModPath Include
|
||||||
|
hi def link rustModPathSep Delimiter
|
||||||
|
hi def link rustFunction Function
|
||||||
|
hi def link rustFuncName Function
|
||||||
|
hi def link rustFuncCall Function
|
||||||
|
hi def link rustShebang Comment
|
||||||
|
hi def link rustCommentLine Comment
|
||||||
|
hi def link rustCommentLineDoc SpecialComment
|
||||||
|
hi def link rustCommentLineDocError Error
|
||||||
|
hi def link rustCommentBlock rustCommentLine
|
||||||
|
hi def link rustCommentBlockDoc rustCommentLineDoc
|
||||||
|
hi def link rustCommentBlockDocError Error
|
||||||
|
hi def link rustAssert PreCondit
|
||||||
|
hi def link rustPanic PreCondit
|
||||||
|
hi def link rustMacro Macro
|
||||||
|
hi def link rustType Type
|
||||||
|
hi def link rustTodo Todo
|
||||||
|
hi def link rustAttribute PreProc
|
||||||
|
hi def link rustDerive PreProc
|
||||||
|
hi def link rustDefault StorageClass
|
||||||
|
hi def link rustStorage StorageClass
|
||||||
|
hi def link rustObsoleteStorage Error
|
||||||
|
hi def link rustLifetime Special
|
||||||
|
hi def link rustLabel Label
|
||||||
|
hi def link rustInvalidBareKeyword Error
|
||||||
|
hi def link rustExternCrate rustKeyword
|
||||||
|
hi def link rustObsoleteExternMod Error
|
||||||
|
hi def link rustBoxPlacementParens Delimiter
|
||||||
|
hi def link rustQuestionMark Special
|
||||||
|
|
||||||
|
" Other Suggestions:
|
||||||
|
" hi rustAttribute ctermfg=cyan
|
||||||
|
" hi rustDerive ctermfg=cyan
|
||||||
|
" hi rustAssert ctermfg=yellow
|
||||||
|
" hi rustPanic ctermfg=red
|
||||||
|
" hi rustMacro ctermfg=magenta
|
||||||
|
|
||||||
|
syn sync minlines=200
|
||||||
|
syn sync maxlines=500
|
||||||
|
|
||||||
|
let b:current_syntax = "rust"
|
48
.vim/bundle/rust.vim/syntax_checkers/rust/rustc.vim
Normal file
48
.vim/bundle/rust.vim/syntax_checkers/rust/rustc.vim
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
" Vim syntastic plugin
|
||||||
|
" Language: Rust
|
||||||
|
" Maintainer: Andrew Gallant <jamslam@gmail.com>
|
||||||
|
"
|
||||||
|
" 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
|
349
.vim/bundle/vim-go/CHANGELOG.md
Normal file
349
.vim/bundle/vim-go/CHANGELOG.md
Normal file
|
@ -0,0 +1,349 @@
|
||||||
|
## 1.11 - (January 9, 2017)
|
||||||
|
|
||||||
|
FEATURES:
|
||||||
|
|
||||||
|
* Travis test integration has been added. Now any file that is added as `<name>_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 `<C-w><C-]>` and `<C-w>]>` 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 `<Plug>(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
|
||||||
|
|
60
.vim/bundle/vim-go/LICENSE
Normal file
60
.vim/bundle/vim-go/LICENSE
Normal file
|
@ -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
|
7
.vim/bundle/vim-go/Makefile
Normal file
7
.vim/bundle/vim-go/Makefile
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
all: test
|
||||||
|
|
||||||
|
test:
|
||||||
|
@echo "==> Running tests"
|
||||||
|
@./scripts/test.sh
|
||||||
|
|
||||||
|
.PHONY: all test
|
339
.vim/bundle/vim-go/README.md
Normal file
339
.vim/bundle/vim-go/README.md
Normal file
|
@ -0,0 +1,339 @@
|
||||||
|
# vim-go [](https://travis-ci.org/fatih/vim-go)
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img style="float: right;" src="assets/vim-go.png" alt="Vim-go logo"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
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 `<C-x><C-o>`. 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 `<Plug>` 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 `<leader>r` or `go
|
||||||
|
build` and `go test` for the current package with `<leader>b` and `<leader>t`
|
||||||
|
respectively. Display beautifully annotated source code to see which functions
|
||||||
|
are covered with `<leader>c`.
|
||||||
|
|
||||||
|
```vim
|
||||||
|
au FileType go nmap <leader>r <Plug>(go-run)
|
||||||
|
au FileType go nmap <leader>b <Plug>(go-build)
|
||||||
|
au FileType go nmap <leader>t <Plug>(go-test)
|
||||||
|
au FileType go nmap <leader>c <Plug>(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 <Leader>ds <Plug>(go-def-split)
|
||||||
|
au FileType go nmap <Leader>dv <Plug>(go-def-vertical)
|
||||||
|
au FileType go nmap <Leader>dt <Plug>(go-def-tab)
|
||||||
|
```
|
||||||
|
|
||||||
|
Open the relevant Godoc for the word under the cursor with `<leader>gd` or open
|
||||||
|
it vertically with `<leader>gv`
|
||||||
|
|
||||||
|
```vim
|
||||||
|
au FileType go nmap <Leader>gd <Plug>(go-doc)
|
||||||
|
au FileType go nmap <Leader>gv <Plug>(go-doc-vertical)
|
||||||
|
```
|
||||||
|
|
||||||
|
Or open the Godoc in browser
|
||||||
|
|
||||||
|
```vim
|
||||||
|
au FileType go nmap <Leader>gb <Plug>(go-doc-browser)
|
||||||
|
```
|
||||||
|
|
||||||
|
Show a list of interfaces which is implemented by the type under your cursor
|
||||||
|
with `<leader>s`
|
||||||
|
|
||||||
|
```vim
|
||||||
|
au FileType go nmap <Leader>s <Plug>(go-implements)
|
||||||
|
```
|
||||||
|
|
||||||
|
Show type info for the word under your cursor with `<leader>i` (useful if you
|
||||||
|
have disabled auto showing type info via `g:go_auto_type_info`)
|
||||||
|
|
||||||
|
```vim
|
||||||
|
au FileType go nmap <Leader>i <Plug>(go-info)
|
||||||
|
```
|
||||||
|
|
||||||
|
Rename the identifier under the cursor to a new name
|
||||||
|
|
||||||
|
```vim
|
||||||
|
au FileType go nmap <Leader>e <Plug>(go-rename)
|
||||||
|
```
|
||||||
|
|
||||||
|
More `<Plug>` 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 <leader>rt <Plug>(go-run-tab)
|
||||||
|
au FileType go nmap <Leader>rs <Plug>(go-run-split)
|
||||||
|
au FileType go nmap <Leader>rv <Plug>(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
|
6
.vim/bundle/vim-go/addon-info.json
Normal file
6
.vim/bundle/vim-go/addon-info.json
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"name": "vim-go",
|
||||||
|
"description": "Full featured Go (golang) support for Vim.",
|
||||||
|
"author": "Fatih Arslan <fatih@arslan.io>",
|
||||||
|
"repository" : {"type": "git", "url": "https://github.com/fatih/vim-go.git"}
|
||||||
|
}
|
BIN
.vim/bundle/vim-go/assets/screenshot.png
Normal file
BIN
.vim/bundle/vim-go/assets/screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 747 KiB |
BIN
.vim/bundle/vim-go/assets/vim-go.png
Normal file
BIN
.vim/bundle/vim-go/assets/vim-go.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
821
.vim/bundle/vim-go/assets/vim-go.svg
Normal file
821
.vim/bundle/vim-go/assets/vim-go.svg
Normal file
|
@ -0,0 +1,821 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="173.53481mm"
|
||||||
|
height="147.26407mm"
|
||||||
|
viewBox="0 0 614.88711 521.80181"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="vim-go.svg"
|
||||||
|
style="enable-background:new"
|
||||||
|
inkscape:export-filename="F:\Go\src\github.com\egonelbre\vim-go\assets\vim-go.png"
|
||||||
|
inkscape:export-xdpi="46.84"
|
||||||
|
inkscape:export-ydpi="46.84">
|
||||||
|
<defs
|
||||||
|
id="defs4">
|
||||||
|
<linearGradient
|
||||||
|
id="gopher-iris"
|
||||||
|
osb:paint="solid"
|
||||||
|
gradientTransform="translate(-9.2596241,38.869516)">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#394455;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4317" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="docker-iris"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#394d54;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4311" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="docker-jaw"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d4edf1;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4305" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="docker-eye"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4299" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="docker-line"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#394d54;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4293" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="docker-body"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#24b8eb;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4287" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="gopher-limbs"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#e1d6b9;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4269" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="gopher-nose"
|
||||||
|
osb:paint="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#e1d0cb;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4263" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="gopher-body"
|
||||||
|
osb:paint="solid"
|
||||||
|
gradientTransform="matrix(-0.18574987,-0.98259706,0.98259706,-0.18574987,-1213.2665,1828.8814)">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#96d6ff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4334" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4253">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#bce8ff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4194" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4182">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#2e3436;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4184" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="gopher-eye"
|
||||||
|
osb:paint="solid"
|
||||||
|
gradientTransform="translate(381.30424,802.02286)">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4178" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="gopher-lines"
|
||||||
|
osb:paint="solid"
|
||||||
|
gradientTransform="matrix(2.0620253,3.9293227,1.3839016,-0.24027903,2506.9621,8572.3972)">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#394655;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4166" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#gopher-lines"
|
||||||
|
id="linearGradient4168"
|
||||||
|
x1="776.14288"
|
||||||
|
y1="39.505058"
|
||||||
|
x2="822.42859"
|
||||||
|
y2="39.505058"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.92105265,0,0,0.92105265,79.548449,262.52483)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#gopher-eye"
|
||||||
|
id="linearGradient4180"
|
||||||
|
x1="776.14288"
|
||||||
|
y1="90.770309"
|
||||||
|
x2="822.42859"
|
||||||
|
y2="90.770309"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.92105266,0,0,0.92105266,124.54841,215.30684)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#gopher-body"
|
||||||
|
id="linearGradient4336"
|
||||||
|
x1="-628.69226"
|
||||||
|
y1="371.77307"
|
||||||
|
x2="-151.41731"
|
||||||
|
y2="371.77307"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-1,0,0,1,-681.83098,347.55492)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#gopher-nose"
|
||||||
|
id="linearGradient4265"
|
||||||
|
x1="198.05417"
|
||||||
|
y1="374.50043"
|
||||||
|
x2="263.28683"
|
||||||
|
y2="374.50043"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.65610141,0,0,0.65610141,185.97779,480.81383)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#gopher-limbs"
|
||||||
|
id="linearGradient4271"
|
||||||
|
x1="730.36273"
|
||||||
|
y1="373.60995"
|
||||||
|
x2="831.0592"
|
||||||
|
y2="373.60995"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.90381797,-0.29515654,-0.62039307,-0.90381797,-597.71307,820.3894)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#gopher-limbs"
|
||||||
|
id="linearGradient4273"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.54351115,-0.65417141,-1.0770811,0.54351115,655.01412,667.6722)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#gopher-limbs"
|
||||||
|
id="linearGradient4275"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.94401471,-0.3302474,-0.32955964,0.94401471,1151.0861,721.50542)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#gopher-limbs"
|
||||||
|
id="linearGradient4279"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.89463991,0.4064691,0.49110603,-0.89463991,-749.6705,579.40921)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#gopher-limbs"
|
||||||
|
id="linearGradient4281"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.49170605,0.377674,2.0076181,-0.49170605,229.12024,357.65841)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#gopher-iris"
|
||||||
|
id="linearGradient4319"
|
||||||
|
x1="427.26477"
|
||||||
|
y1="316.13431"
|
||||||
|
x2="488.88409"
|
||||||
|
y2="316.13431"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-1,0,0,1,744.54563,401.01143)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#gopher-iris"
|
||||||
|
id="linearGradient4321"
|
||||||
|
gradientTransform="matrix(5.6994379,2.2315229,-1.9072375,4.8711945,4487.6828,1182.8772)"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.76274166"
|
||||||
|
inkscape:cx="499.78979"
|
||||||
|
inkscape:cy="92.336365"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer11"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1018"
|
||||||
|
inkscape:window-x="1912"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-nodes="true"
|
||||||
|
inkscape:snap-global="false"
|
||||||
|
showguides="true"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid4305"
|
||||||
|
originx="-15.732723"
|
||||||
|
originy="-274.01154" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer11"
|
||||||
|
inkscape:label="background"
|
||||||
|
style="display:none"
|
||||||
|
transform="translate(-15.732722,-256.54886)">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d3e5de;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4347"
|
||||||
|
width="614.88708"
|
||||||
|
height="521.80182"
|
||||||
|
x="15.732722"
|
||||||
|
y="256.54886"
|
||||||
|
inkscape:export-filename="vim-go.png"
|
||||||
|
inkscape:export-xdpi="46.84"
|
||||||
|
inkscape:export-ydpi="46.84" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer6"
|
||||||
|
inkscape:label="shadow"
|
||||||
|
transform="translate(-15.732722,-256.54886)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#2e4233;fill-opacity:0.10714285;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 287.3893,695.44531 c -50.0612,-2.78118 -62.1134,11.12305 -91.7793,11.12305 -29.6659,0 -47.28069,-6.48881 -76.01953,-1.85352 -28.738834,4.6353 -40.790093,3.70867 -55.623042,16.6875 -14.832949,12.97883 -21.926707,11.85327 -18.541016,20.39454 1.318705,3.32677 3.956373,1.53579 10.703125,0.83984 115.165183,-11.87969 237.050993,16.53486 337.406243,16.77539 83.20192,0.19942 110.33047,-21.09623 105.22253,-34.76541 -16.86616,-45.13499 -81.24683,-23.67849 -211.36901,-29.20139 z"
|
||||||
|
id="path4349"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="csssssssc" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
inkscape:label="cape-back"
|
||||||
|
style="display:inline"
|
||||||
|
sodipodi:insensitive="true"
|
||||||
|
transform="translate(-15.732722,-256.54886)">
|
||||||
|
<path
|
||||||
|
style="fill:#0c7a31;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 260.24444,535.87695 c -20.68496,5.13447 -3.94094,36.63825 -23.78246,45.53288 -18.22356,8.16932 -29.87743,27.29784 -48.21487,37.53094 -24.3143,13.56845 -47.25416,17.93122 -70.94376,35.71927 -11.54022,8.66532 -48.036929,3.46906 -49.132109,17.96915 56.226929,-8.73065 86.269619,15.95087 120.882979,20.57024 30.54605,4.07656 53.64011,2.39756 79.48357,-7.50413 89.71977,-34.37532 52.16171,-111.74704 51.81195,-135.28471 -17.69563,-3.28964 -42.98659,-18.78289 -60.1053,-14.53364 z"
|
||||||
|
id="path4321"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssscsscs" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer5"
|
||||||
|
inkscape:label="gopher-body"
|
||||||
|
style="display:inline;opacity:1"
|
||||||
|
sodipodi:insensitive="true"
|
||||||
|
transform="translate(-15.732722,-256.54886)">
|
||||||
|
<g
|
||||||
|
style="display:inline;opacity:1"
|
||||||
|
transform="matrix(-0.34823803,-0.28093567,-0.33018747,0.52325377,856.33627,409.62314)"
|
||||||
|
id="g4537">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4275);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 419.84023,584.57289 c -1.11092,4.23495 -3.11543,7.14238 -5.84936,9.02308 -2.73394,1.8807 -6.19236,2.76095 -10.13743,3.23943 -3.94504,0.47846 -8.37351,0.59759 -13.05363,0.66122 -4.6801,0.0636 -9.60653,0.0259 -14.5852,-0.15006 -4.97865,-0.17599 -9.67742,-0.66266 -13.94891,-1.44453 -4.27148,-0.78187 -8.12262,-1.83504 -11.28827,-3.15781 -3.16564,-1.32277 -5.63542,-2.92368 -7.07427,-4.89074 -1.43884,-1.96709 -1.83785,-4.30021 -0.94134,-7.07932 0.89648,-2.77911 2.64686,-4.65171 5.05838,-5.71202 2.41152,-1.06032 5.47772,-1.29847 8.97039,-1.04717 3.49268,0.25132 7.40119,0.98198 11.60615,1.60695 4.20496,0.62498 8.71575,1.10136 13.55734,0.95747 4.84159,-0.14387 9.82241,-1.20624 14.59946,-2.18657 4.77703,-0.9803 9.35663,-1.80521 13.2055,-1.76209 3.8489,0.0431 6.93814,0.92314 8.72484,2.84805 1.78673,1.92488 0.0493,13.32997 1.15633,9.09414 z"
|
||||||
|
id="path4539"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cssssssssssssssssc" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 411.66722,570.50504 c -3.64483,-0.3204 -7.91192,0.0353 -12.44327,0.67313 -5.17866,0.72899 -10.69026,1.78243 -16.25596,1.96339 -5.56571,0.181 -10.75654,-0.27799 -15.6406,-0.87383 -4.8841,-0.59575 -9.46828,-1.26261 -13.59381,-1.35067 -4.12552,-0.0881 -7.77812,0.41271 -10.6665,1.77043 -2.88834,1.35772 -5.00621,3.55109 -6.11385,6.60546 -1.10762,3.05438 -0.68341,5.7953 0.96623,8.19507 1.64966,2.39979 4.51594,4.46252 8.19691,6.21125 3.681,1.74874 8.16283,3.1933 13.12136,4.28264 4.95854,1.08935 10.4013,1.79657 16.15733,2.05756 5.756,0.26106 11.2421,0.29972 16.33832,0.21929 5.09618,-0.0804 9.79866,-0.25121 13.94009,-0.87517 1.57579,-0.23741 3.06793,-0.55279 4.47088,-0.96129 2.8331,-0.82603 3.60613,-5.66983 1.06694,-4.35369 -2.35253,1.21937 -5.13009,1.88834 -8.23473,2.27934 -3.78352,0.47652 -8.03435,0.60519 -12.52976,0.67623 -4.49538,0.071 -9.22983,0.0403 -14.01368,-0.12137 -4.78387,-0.16172 -9.29761,-0.62006 -13.39935,-1.36274 -4.10176,-0.74271 -7.79879,-1.74643 -10.8363,-3.01023 -3.03748,-1.2638 -5.40588,-2.79646 -6.78423,-4.6796 -1.37835,-1.88316 -1.75885,-4.11616 -0.89417,-6.78092 0.86467,-2.66475 2.54876,-4.4645 4.86314,-5.48862 2.31437,-1.0241 5.2526,-1.265 8.60072,-1.03925 3.34811,0.22576 7.09649,0.90864 11.13305,1.49473 4.03653,0.5862 8.37113,1.03632 13.02879,0.89877 4.65766,-0.13756 9.45383,-1.14909 14.04535,-2.09377 4.59152,-0.94468 8.9823,-1.75345 12.66755,-1.73592 0.46066,0.002 0.91144,0.0161 1.3482,0.0436 1.1223,0.0708 2.1698,0.20509 3.10067,0.47739 1.0735,0.314 2.95461,-2.6047 -0.11758,-2.94357 -0.49859,-0.055 -1.54942,0.19872 -1.52174,-0.17766 z"
|
||||||
|
id="path4541"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="csscsscssssssssssssssssssssccsssc" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="matrix(-0.20408679,0.36109427,0.8060854,0.48598006,286.09208,226.24278)"
|
||||||
|
id="g4640"
|
||||||
|
style="display:inline;opacity:1">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 767.29926,387.32674 c 11.1235,7.96555 31.77795,11.29978 44.73159,15.54502 12.95363,4.24526 18.14889,9.35948 22.12936,13.37285 3.98046,4.01338 5.94428,7.14463 4.71807,9.52723 -1.2262,2.38259 -5.54351,3.99405 -14.00119,4.81166 -8.45765,0.81761 -15.90978,0.12055 -23.02358,-1.72572 -7.11381,-1.84628 -13.80694,-4.86649 -21.70559,-8.603 -7.89866,-3.73649 -17.3272,-8.0507 -25.81115,-14.18439 -8.48395,-6.13369 -17.62324,-13.90003 -23.14238,-24.13356 -5.51915,-10.23352 -5.78201,-21.34406 -5.37146,-30.88264 0.41055,-9.53859 1.51092,-17.55377 2.71572,-23.74931 1.20482,-6.19553 2.71509,-10.67437 4.77102,-13.66952 2.05591,-2.99513 4.65165,-4.52673 7.71923,-4.52673 3.06759,0 5.70357,1.83092 7.62535,5.49926 1.9218,3.66832 3.04778,9.24444 3.28639,16.76004 0.23861,7.51561 -0.67126,17.08072 0.34029,27.19831 1.01155,10.1176 3.89485,20.79494 15.01833,28.7605 z"
|
||||||
|
id="path4642"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4281);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 760.81735,387.61463 c 8.35351,7.22933 23.40419,11.34465 36.92829,14.85447 13.52408,3.50986 21.76315,7.50998 26.41399,11.29491 4.65086,3.78492 7.04347,6.96136 6.89289,9.28045 -0.15059,2.31908 -3.07202,3.85186 -9.99413,4.53735 -6.92209,0.68549 -13.12478,-0.17957 -19.18856,-2.15841 -6.06375,-1.97886 -12.01277,-5.06603 -19.62326,-8.64782 -7.61047,-3.5818 -16.94465,-7.61787 -24.98938,-13.21535 -8.04472,-5.59749 -15.82286,-12.65396 -20.9022,-21.24583 -5.07935,-8.59186 -6.01346,-17.801 -5.99188,-25.91871 0.0216,-8.1177 0.93462,-15.14861 1.86635,-20.66954 0.93173,-5.52092 2.01706,-9.59713 3.38259,-12.30465 1.36554,-2.70753 3.03466,-4.06947 5.01979,-4.01398 1.98511,0.0555 3.57672,1.84704 4.61437,5.2751 1.03765,3.42807 1.44745,8.54444 1.4737,15.15288 0.0262,6.60845 -0.43638,14.76057 0.91317,23.27473 1.34954,8.51418 4.83074,17.27506 13.18427,24.5044 z"
|
||||||
|
id="path4644"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="display:inline;opacity:1"
|
||||||
|
id="g4594"
|
||||||
|
transform="matrix(-0.13664232,-0.29657059,-0.88136995,0.09664282,727.56031,790.52022)">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4588"
|
||||||
|
d="m 767.29926,387.32674 c 11.1235,7.96555 31.77795,11.29978 44.73159,15.54502 12.95363,4.24526 18.14889,9.35948 22.12936,13.37285 3.98046,4.01338 5.94428,7.14463 4.71807,9.52723 -1.2262,2.38259 -5.54351,3.99405 -14.00119,4.81166 -8.45765,0.81761 -15.90978,0.12055 -23.02358,-1.72572 -7.11381,-1.84628 -13.80694,-4.86649 -21.70559,-8.603 -7.89866,-3.73649 -17.3272,-8.0507 -25.81115,-14.18439 -8.48395,-6.13369 -17.62324,-13.90003 -23.14238,-24.13356 -5.51915,-10.23352 -5.78201,-21.34406 -5.37146,-30.88264 0.41055,-9.53859 1.51092,-17.55377 2.71572,-23.74931 1.20482,-6.19553 2.71509,-10.67437 4.77102,-13.66952 2.05591,-2.99513 4.65165,-4.52673 7.71923,-4.52673 3.06759,0 5.70357,1.83092 7.62535,5.49926 1.9218,3.66832 3.04778,9.24444 3.28639,16.76004 0.23861,7.51561 -0.67126,17.08072 0.34029,27.19831 1.01155,10.1176 3.89485,20.79494 15.01833,28.7605 z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="ellipse4590"
|
||||||
|
d="m 760.81735,387.61463 c 8.35351,7.22933 23.40419,11.34465 36.92829,14.85447 13.52408,3.50986 21.76315,7.50998 26.41399,11.29491 4.65086,3.78492 7.04347,6.96136 6.89289,9.28045 -0.15059,2.31908 -3.07202,3.85186 -9.99413,4.53735 -6.92209,0.68549 -13.12478,-0.17957 -19.18856,-2.15841 -6.06375,-1.97886 -12.01277,-5.06603 -19.62326,-8.64782 -7.61047,-3.5818 -16.94465,-7.61787 -24.98938,-13.21535 -8.04472,-5.59749 -15.82286,-12.65396 -20.9022,-21.24583 -5.07935,-8.59186 -6.01346,-17.801 -5.99188,-25.91871 0.0216,-8.1177 0.93462,-15.14861 1.86635,-20.66954 0.93173,-5.52092 2.01706,-9.59713 3.38259,-12.30465 1.36554,-2.70753 3.03466,-4.06947 5.01979,-4.01398 1.98511,0.0555 3.57672,1.84704 4.61437,5.2751 1.03765,3.42807 1.44745,8.54444 1.4737,15.15288 0.0262,6.60845 -0.43638,14.76057 0.91317,23.27473 1.34954,8.51418 4.83074,17.27506 13.18427,24.5044 z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4271);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="display:inline"
|
||||||
|
id="g4533-2"
|
||||||
|
transform="matrix(-0.60102903,0.32221978,0.53870829,0.77401445,526.12645,47.501077)" />
|
||||||
|
<g
|
||||||
|
style="opacity:1"
|
||||||
|
transform="matrix(-0.32879267,0.17361606,0.20143296,0.28338802,143.13323,319.59452)"
|
||||||
|
id="g4404">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4406"
|
||||||
|
d="m -626.54672,402.3529 c 2.22767,10.86299 0.34493,21.82632 -3.86747,31.42527 -4.21252,9.59894 -10.55173,17.86115 -17.72096,24.29983 -7.1694,6.43883 -15.25476,11.10591 -24.5716,13.61353 -9.31698,2.50761 -20.94966,4.46936 -31.63903,1.98398 -10.68939,-2.48537 -18.0688,-9.22838 -24.09401,-15.89285 -6.02508,-6.66442 -12.35923,-14.47524 -22.96531,-22.06805 -10.60584,-7.59266 -20.8648,-15.59839 -25.16123,-23.3775 -4.29632,-7.77931 -7.008,-15.66934 -7.81517,-23.39095 -0.80717,-7.7215 0.35908,-14.55922 3.12288,-20.54462 2.76393,-5.98548 7.12557,-11.1208 12.7854,-15.40902 5.65998,-4.28811 12.61751,-7.73606 20.64204,-10.24271 8.02465,-2.50651 17.11262,-4.07552 27.13941,-4.41504 10.0268,-0.3395 20.06604,0.59388 29.76158,2.87504 9.69543,2.2813 19.05511,5.92037 27.47739,11.02309 8.42215,5.10286 15.89307,11.69212 21.60465,19.6287 5.71147,7.93674 13.0738,19.62846 15.30143,30.4913 z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-body);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="csssccscsccscscccsccscsssscscscc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4408"
|
||||||
|
d="m -784.21409,457.33922 c -0.56136,0.0656 -1.08141,0.1809 -1.55606,0.33615 -0.63289,0.20699 -1.18396,0.48516 -1.6349,0.82686 -0.45093,0.3417 -0.80184,0.74659 -1.02778,1.21891 -0.22595,0.47234 -0.32669,1.01119 -0.27449,1.62035 0.0522,0.60917 0.25282,1.23371 0.57968,1.84938 0.32687,0.61567 0.98957,1.25218 1.83531,1.84156 0.84574,0.58937 1.35671,1.20529 1.82543,1.72857 0.46713,0.52147 1.13451,0.85371 2.02424,0.92674 0.10253,0.008 0.12328,-0.30471 0.0344,-0.32876 -0.78083,-0.20262 -1.25826,-0.72023 -1.71877,-1.11076 -0.4254,-0.46645 -0.87231,-1.01406 -1.62104,-1.54604 -0.74871,-0.53197 -1.47289,-1.09304 -1.77689,-1.63886 -0.30398,-0.54584 -0.49685,-1.10009 -0.55469,-1.64239 -0.0579,-0.54231 0.0245,-1.0222 0.21918,-1.44322 0.19469,-0.42103 0.50198,-0.78371 0.90168,-1.08623 0.39973,-0.30252 0.89062,-0.54587 1.4577,-0.7237 0.28355,-0.0889 0.5872,-0.16119 0.90722,-0.21465 0.32002,-0.0535 0.6576,-0.0885 1.01178,-0.10163 0.70839,-0.0255 1.4163,0.0392 2.10043,0.1987 0.68412,0.15947 1.34499,0.41522 1.93838,0.77329 0.59338,0.35806 1.11885,0.81986 1.52108,1.37653 0.40222,0.55667 0.92117,1.37523 1.07925,2.13677 0.12981,0.62539 0.0734,1.25844 -0.13288,1.83379 -0.0385,0.10712 0.4977,0.29416 0.62787,-0.0111 0.24265,-0.5698 0.23445,-1.24057 0.1026,-1.8741 -0.17834,-0.85666 -0.69031,-1.76937 -1.13671,-2.40019 -0.4464,-0.6308 -1.03123,-1.15292 -1.68895,-1.55276 -0.65772,-0.39984 -1.38674,-0.68003 -2.14271,-0.85021 -0.75599,-0.17016 -1.54036,-0.23166 -2.32498,-0.19142 -0.19617,0.0101 -0.38815,0.0268 -0.57528,0.0484 z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
transform="matrix(13.851095,0,0,13.851095,10133.213,-6001.611)" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m -753.77185,413.0219 c -0.13663,-2.61847 2.18018,-4.94804 7.2193,-6.20054 7.65443,-1.90257 20.03831,1.84566 27.93811,5.67152 4.33357,2.09883 8.88981,3.89076 12.66635,7.19411 1.28185,1.12133 2.51799,2.28349 3.36855,4.40869 -1.65849,0.577 -4.10492,-0.92134 -5.87278,-2.13046 -6.96771,-4.76531 -14.69502,-8.08983 -22.67695,-9.12646 -6.71591,-0.87187 -8.86923,-3.11022 -14.75541,-2.56175 -3.72583,0.34716 -4.90626,2.13878 -7.88716,2.74489 z"
|
||||||
|
id="path4365-1-2"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cssscsssc" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m -720.16989,411.68353 c 0.28532,-2.32502 0.86962,3.90377 -0.31886,5.45995 -4.46007,5.84 -8.20289,12.32072 -12.42083,18.36519 -1.37385,1.96787 -3.29463,0.0414 -2.42738,-2.09874 0.88118,-2.1739 2.06053,-3.99898 3.34915,-5.8153 1.20809,-1.70147 2.81353,-3.0576 3.88834,-4.85958 2.06619,-3.46267 2.39577,-6.62873 4.25443,-10.2393 0.63712,-1.23818 3.5225,0.42546 3.67386,-0.80905 z"
|
||||||
|
id="path4367-9-2"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssss" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="display:inline;opacity:1"
|
||||||
|
id="g4198"
|
||||||
|
transform="matrix(0.69027452,0,0,0.73815345,642.18876,259.65104)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m -140.71724,398.66408 c -9.31409,71.69689 -25.7611,141.32 -83.87724,188.8641 -73.31672,59.97949 -208.09131,67.90599 -303.42706,10.99618 -27.57065,-16.45805 -49.52457,-62.17665 -53.04177,-91.74122 -7.35191,-61.79791 19.82699,-103.64945 13.47928,-160.67805 -5.05249,-45.39216 -29.63784,-82.95495 -27.30836,-137.00138 1.56315,-36.26681 11.06536,-78.46439 40.50727,-100.88356 38.57103,-29.370718 83.60539,-46.188952 134.68095,-45.031125 72.73731,1.648875 151.17838,6.326503 212.18714,49.939365 43.544,31.12796 68.50323,82.53699 72.90385,135.3004 4.52019,54.19698 -0.16075,104.48555 -6.10406,150.23529 z"
|
||||||
|
id="path4188"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssssss" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4336);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m -158.93683,464.92976 c -15.56115,65.9367 -58.42288,127.39267 -134.42207,151.72082 -70.61462,22.6045 -163.49236,17.29949 -232.18476,-25.54762 -26.14623,-16.30879 -46.09162,-61.46233 -48.95901,-89.47579 -6.03547,-58.9646 19.04741,-102.17429 13.30293,-156.59502 -4.7951,-45.42661 -28.02123,-78.34585 -27.29597,-132.22289 0.47399,-35.21112 8.99044,-76.95773 37.82112,-98.79995 36.52466,-27.671205 78.3526,-45.238515 126.45621,-45.012482 76.22124,0.358155 162.16208,5.533182 222.84373,56.658952 55.47879,46.74224 63.38318,129.04796 60.81019,193.3049 -2.12217,52.99813 -7.67242,100.63054 -18.37237,145.96908 z"
|
||||||
|
id="ellipse4190"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssssss" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4376"
|
||||||
|
transform="matrix(0.40138799,-0.13710458,0.13710458,0.40138799,470.81791,82.723801)"
|
||||||
|
style="opacity:1">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-body);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m -626.57295,401.69566 c 2.24713,11.35067 0.36741,22.38948 -3.843,32.03835 -4.21053,9.64886 -10.54997,17.90531 -17.7192,24.34399 -7.1694,6.43883 -15.25457,11.1106 -24.57171,13.61082 -9.31727,2.5002 -20.94956,4.47176 -31.64526,1.82793 -10.69571,-2.64383 -18.09209,-9.81214 -24.14818,-17.25062 -6.05597,-7.43843 -12.44269,-16.56671 -23.09665,-25.35944 -10.65372,-8.79255 -20.95218,-17.78817 -25.30072,-26.87318 -4.34843,-9.08528 -7.1154,-18.36084 -7.98,-27.52156 -0.86459,-9.1606 0.24716,-17.36404 2.9617,-24.58398 2.71467,-7.22004 7.03243,-13.45488 12.66059,-18.5369 5.6283,-5.08191 12.56665,-9.01064 20.59229,-11.48936 8.02576,-2.47858 17.13537,-3.50537 27.20916,-2.66707 10.0738,0.83832 20.1809,3.47234 29.95223,7.6529 9.77122,4.18068 19.21426,9.9086 27.71179,16.89733 8.49741,6.98886 16.03465,15.24007 21.79567,24.41557 5.7609,9.17565 13.1742,22.14471 15.42129,33.49522 z"
|
||||||
|
id="path4398"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m -784.27135,455.90422 c -0.56339,0.0147 -1.08437,0.10666 -1.55902,0.26191 -0.63289,0.20699 -1.18231,0.52669 -1.63059,0.93484 -0.44828,0.40815 -0.79558,0.90361 -1.01756,1.4752 -0.22199,0.5716 -0.31844,1.21792 -0.26185,1.93717 0.0566,0.71926 0.26134,1.4471 0.59196,2.157 0.33063,0.7099 0.99621,1.41858 1.84494,2.08284 0.84872,0.66425 1.36325,1.36931 1.83382,1.93901 0.46898,0.56774 1.13678,0.9105 2.02675,0.98962 0.10256,0.009 0.12294,-0.31321 0.034,-0.33899 -0.78143,-0.21746 -1.26048,-0.77583 -1.72293,-1.21489 -0.42768,-0.5236 -0.87838,-1.16625 -1.63058,-1.78505 -0.75217,-0.61879 -1.47924,-1.25213 -1.78697,-1.89162 -0.30772,-0.63951 -0.50455,-1.29287 -0.56648,-1.9378 -0.062,-0.64492 0.0165,-1.22191 0.20772,-1.73042 0.1912,-0.50852 0.49539,-0.94884 0.89287,-1.30706 0.3975,-0.35822 0.88707,-0.63484 1.45426,-0.80994 0.2836,-0.0875 0.58767,-0.1494 0.90851,-0.1822 0.32084,-0.0328 0.65966,-0.0369 1.01552,-0.008 0.71174,0.0585 1.42446,0.24383 2.11396,0.53794 0.6895,0.29412 1.35628,0.69807 1.95502,1.19025 0.59873,0.49218 1.12894,1.07271 1.53474,1.71893 0.4058,0.64623 0.9285,1.5589 1.08808,2.35795 0.13104,0.65619 0.075,1.29927 -0.13103,1.88026 -0.0384,0.10817 0.49808,0.30362 0.62824,-0.002 0.24262,-0.57052 0.23429,-1.24452 0.10166,-1.89748 -0.17938,-0.88293 -0.69436,-1.871 -1.14416,-2.58711 -0.44981,-0.71609 -1.03943,-1.35821 -1.70275,-1.89855 -0.66333,-0.54034 -1.3987,-0.97968 -2.16052,-1.29649 -0.76184,-0.31679 -1.55154,-0.51173 -2.33984,-0.56369 -0.19709,-0.013 -0.38986,-0.0163 -0.57767,-0.0116 z"
|
||||||
|
id="path4369"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="csssccscsccscscccsccscsssscscscc"
|
||||||
|
transform="matrix(13.851095,0,0,13.851095,10133.213,-6001.611)" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m -730.27274,382.91266 c 1.8068,-2.76405 6.31309,-3.63001 13.24575,-1.6171 10.53068,3.05761 22.43414,14.97755 28.94834,24.04709 3.57338,4.97534 7.6424,9.78266 9.64772,15.62449 0.68055,1.98294 1.27611,3.97774 0.68898,6.70435 -2.4056,-0.49416 -4.1871,-3.62313 -5.37952,-6.01329 -4.69962,-9.4202 -11.38574,-17.86492 -20.09536,-24.13889 -7.3284,-5.27852 -8.20487,-8.9719 -15.61502,-12.25742 -4.69053,-2.07967 -7.44128,-1.02076 -11.44089,-2.34923 z"
|
||||||
|
id="path4365-1"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cssscsssc" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m -689.31909,403.49962 c 2.08771,-2.1886 -1.9021,4.5559 -4.48533,5.36905 -9.69439,3.05157 -19.01784,7.22624 -28.57811,10.64488 -3.11327,1.11257 -3.94795,-2.11026 -1.30738,-3.72982 2.68251,-1.64492 5.45711,-2.73872 8.35507,-3.75217 2.71578,-0.94874 5.64428,-1.2851 8.27731,-2.4236 5.06052,-2.18718 7.83343,-5.20599 12.75841,-7.67984 1.68866,-0.84854 3.86766,2.73608 4.97603,1.5739 z"
|
||||||
|
id="path4367-9"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssss" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4634"
|
||||||
|
transform="matrix(0.13058783,-0.42795023,-0.60869797,-0.11092817,632.15501,956.21909)"
|
||||||
|
style="display:inline;opacity:1">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4636"
|
||||||
|
d="m 423.50332,581.83521 c -0.004,4.40048 -1.19837,7.58856 -3.37524,9.82844 -2.17687,2.23987 -5.33154,3.55156 -9.14619,4.44292 -3.81465,0.89135 -8.28246,1.39523 -13.05675,1.83828 -4.77428,0.44304 -9.85163,0.79076 -14.95001,1.09928 -5.09838,0.30851 -9.94541,0.34741 -14.40217,0.0862 -4.45676,-0.26122 -8.52354,-0.79908 -11.99271,-1.71189 -3.46915,-0.91282 -6.33736,-2.21356 -8.3562,-4.09288 -2.01885,-1.87935 -3.18709,-4.34475 -3.25466,-7.51083 -0.0676,-3.16607 0.9983,-5.4859 2.92534,-7.0838 1.92703,-1.5979 4.71248,-2.46394 8.09977,-2.84688 3.38729,-0.38293 7.37282,-0.28336 11.77044,-0.16051 4.39762,0.12284 9.21051,0.23456 14.33166,-0.12202 5.12115,-0.35659 10.27171,-1.47349 15.16022,-2.54099 4.88852,-1.06749 9.50395,-2.05149 13.43823,-2.27114 3.9343,-0.21967 7.17754,0.32322 9.39823,2.04598 2.22069,1.72276 3.41425,4.59936 3.41004,8.99986 z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4279);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="csscsscssssssssssssssssssssccsssc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4638"
|
||||||
|
d="m 411.91406,568.54883 c -3.75011,-0.0271 -8.08701,0.53975 -12.76172,1.28711 -5.34251,0.85413 -11.10706,1.92059 -17.00976,2.32617 -5.9027,0.40562 -11.41103,0.38326 -16.44727,0.41406 -5.03624,0.0309 -9.6045,0.1607 -13.50781,0.85938 -3.9033,0.69867 -7.13503,1.96743 -9.4082,3.96875 -2.27316,2.00131 -3.58535,4.71676 -3.65235,8.17578 -0.067,3.45901 1.21821,6.3073 3.54297,8.58008 2.32476,2.27278 5.68789,3.9795 9.76172,5.25 4.07385,1.27051 8.85237,2.11894 14.05664,2.59765 5.20427,0.47871 10.83381,0.56134 16.70313,0.22266 5.86931,-0.33868 11.47146,-0.78653 16.60547,-1.34961 5.13399,-0.56309 9.79334,-1.22365 13.70703,-2.34375 1.48913,-0.4262 2.86677,-0.9287 4.12695,-1.51953 2.54507,-1.19325 2.05015,-6.17249 -0.0996,-4.54102 -1.99172,1.51153 -4.14364,1.68162 -7.15735,2.35061 -3.67269,0.81527 -8.18136,0.99111 -12.55008,1.3428 -4.3687,0.35167 -8.7789,1.78431 -13.31332,2.07736 -4.53444,0.29304 -8.86787,0.32801 -12.93181,0.0702 -4.06396,-0.25785 -7.85651,-0.78075 -11.12475,-1.64296 -3.26823,-0.86221 -5.99695,-2.08037 -7.8846,-3.81399 -1.88765,-1.73365 -2.92537,-3.9871 -2.97865,-6.80086 -0.0533,-2.81374 0.90176,-4.8192 2.66881,-6.10562 1.76704,-1.28641 5.61732,-0.58475 8.69196,-0.71399 3.07463,-0.12925 6.90624,-0.54484 10.78772,-0.41733 3.88147,0.12754 6.54592,-0.48119 11.04844,-1.2139 4.50252,-0.73264 9.15212,-2.3434 13.88736,-3.72101 4.73523,-1.37761 9.22461,-2.34259 13.00861,-2.55385 0.473,-0.0264 0.93707,-0.0422 1.38868,-0.0449 1.16046,-0.007 2.25007,0.0442 3.25,0.23633 1.15313,0.22156 2.31543,-2.86146 -0.83789,-2.92773 -0.51177,-0.0108 -1.03459,-0.045 -1.57032,-0.0488 z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer9"
|
||||||
|
inkscape:label="gopher-shadow"
|
||||||
|
style="display:inline;opacity:0.06000001"
|
||||||
|
sodipodi:insensitive="true"
|
||||||
|
transform="translate(-15.732722,-256.54886)">
|
||||||
|
<ellipse
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="path4544"
|
||||||
|
cx="-467.52527"
|
||||||
|
cy="482.66467"
|
||||||
|
rx="22.450642"
|
||||||
|
ry="20.682871"
|
||||||
|
transform="scale(-1,1)" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 234.60547,309.98047 c -6.62163,-0.0703 -10.7426,0.83465 -15.61133,3.26758 -5.0378,2.51742 -10.044,7.91661 -11.55273,12.45898 -2.26972,6.83348 -0.42196,14.92592 5.01757,21.97656 3.19606,4.1427 6.84938,6.56071 14.60938,9.66993 3.20846,1.28553 7.68985,3.50108 9.95898,4.92382 5.6211,3.52442 9.83526,5.31873 13.54102,5.76563 2.42194,0.29208 3.11523,0.63719 3.11523,1.55469 0,0.89182 -0.7061,1.28567 -2.89062,1.61328 -1.58919,0.23867 -3.77121,0.24076 -4.84961,0.004 -1.95019,-0.42833 -1.9703,-0.40483 -3.65625,4.68555 -3.87667,11.7048 -5.82609,25.85658 -5.80859,42.15625 0.0196,18.31899 1.82597,28.89111 9.58007,56.04688 5.56137,19.47655 7.15656,26.40249 8.58008,37.26171 2.05331,15.66359 1.31467,26.60445 -3.90625,57.79102 -4.8641,29.05517 -5.15869,31.69637 -5.18359,46.54297 -0.0239,14.28001 0.63486,19.84952 3.52539,29.8125 5.44577,18.77032 13.72789,34.11825 23.9082,44.30078 8.00321,8.00498 22.62783,16.26261 41.23438,23.2832 5.47456,2.06566 5.83617,2.12101 6.46679,0.99414 1.72277,-3.07839 3.2087,-3.7772 9.33203,-3.79882 -38.68101,-33.75954 -34.48259,-82.29367 -25.52281,-108.9339 7.33431,-21.80723 31.77025,-53.23407 31.77025,-53.23407 l -22.41052,-1.98245 c 0,0 -7.25969,-42.63753 -13.15682,-59.9065 -22.58603,-66.14023 -29.82384,-120.35922 4.37069,-158.19894 5.84309,-6.46598 12.5988,-11.21335 19.60937,-14.69727 -9.02679,1.89877 -18.30173,4.80561 -26.41601,8.32813 -6.65247,2.88791 -19.01394,9.90994 -18.99415,10.78906 0.009,0.39075 0.30731,1.97487 0.66407,3.52148 0.79845,3.46141 -0.0807,5.55969 -2.20117,5.25782 -1.1871,-0.16901 -1.49742,-0.76108 -1.83008,-3.48633 -0.63121,-5.17109 -3.20076,-9.39815 -9.06836,-14.91797 -9.25402,-8.70552 -17.29671,-12.21829 -29.22461,-12.76172 -1.05756,-0.0482 -2.05405,-0.0778 -3,-0.0879 z m 1.38086,24.10156 c 1.88404,0.0642 3.99413,0.41696 5.88476,1.04492 3.99187,1.32589 12.35644,6.69047 14.31446,9.17969 3.00519,3.82048 1.04901,4.01008 -3.4043,0.33008 -1.74522,-1.44216 -3.36983,-2.6211 -3.60937,-2.6211 -0.23954,0 -2.78812,1.91597 -5.66407,4.25782 -2.87594,2.34185 -5.59815,4.25776 -6.04883,4.25976 -1.88842,0.007 -0.56519,-2.08264 3.10938,-4.91015 4.64288,-3.57262 5.88952,-5.38766 4.12891,-6.00977 -0.64649,-0.22845 -2.92374,-1.13445 -5.06055,-2.01367 -3.0123,-1.23949 -4.52138,-1.50334 -6.71875,-1.17383 -3.06661,0.45987 -3.82178,-0.39095 -1.46485,-1.65234 0.9899,-0.52978 2.64916,-0.75563 4.53321,-0.69141 z m 103.78515,383.73633 c -0.005,0.0152 -0.007,0.0256 -0.0117,0.041 l -0.70118,2.28906 5.65625,1.01562 c 0.0901,0.0162 0.20551,0.0326 0.29688,0.0488 -1.81728,-1.11236 -3.56263,-2.24473 -5.24024,-3.39453 z"
|
||||||
|
id="path4271"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssscssssssssssscsccsscscssssssscsssscscsssscccccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 328.4205,548.25967 -4.47623,14.88037 c 2.60939,0.0254 9.84161,-6.41982 16.75619,-6.818 76.94638,-4.43102 125.04829,-0.40565 187.26295,-5.40532 1.45456,-0.11689 3.76527,-0.10936 5.20677,0.2079 5.21485,1.14773 8.09003,14.3736 9.3628,13.60525 0.6055,-14.12878 -2.32372,-19.14168 -5.81784,-22.69773 z"
|
||||||
|
id="path4275"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccsssccc" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer2"
|
||||||
|
inkscape:label="gopher-face"
|
||||||
|
style="display:inline"
|
||||||
|
sodipodi:insensitive="true"
|
||||||
|
transform="translate(-15.732722,-256.54886)">
|
||||||
|
<g
|
||||||
|
id="g4818"
|
||||||
|
transform="matrix(-0.65610141,0,0,0.65610141,655.70091,210.42145)">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4812"
|
||||||
|
d="m 547.42756,318.16456 c -0.44046,14.77191 -4.12869,29.02667 -10.38967,42.25266 -6.26099,13.22599 -15.09198,25.42687 -25.80466,35.99686 -10.71268,10.57 -23.30432,19.50822 -37.11826,26.08983 -13.81394,6.58161 -28.85103,10.80263 -44.50193,11.8618 -15.65091,1.05917 -30.4406,-1.15844 -43.81781,-6.16756 -13.37721,-5.00911 -25.3405,-12.8075 -35.30087,-22.80416 -9.96037,-9.99666 -17.91599,-22.19037 -23.26581,-35.90798 -5.34983,-13.71761 -8.0915,-28.95913 -7.64195,-44.98105 0.44955,-16.02192 4.04447,-31.2937 10.1422,-45.07896 6.09773,-13.78526 14.69591,-26.08175 25.16951,-36.25747 10.4736,-10.17571 22.82245,-18.23043 36.46168,-23.66123 13.63924,-5.4308 28.57214,-8.24285 44.22923,-8.02541 15.6571,0.21745 30.56095,3.42714 44.11009,8.94154 13.54914,5.5144 25.7404,13.33722 35.92568,22.91495 10.18529,9.57774 18.36233,20.91345 23.87736,33.53282 5.51504,12.61936 8.36566,26.52144 7.92521,41.29336 z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="ellipse4814"
|
||||||
|
d="m 539.72249,314.79002 c 10e-4,13.89984 -3.01572,27.53808 -8.51346,40.35257 -5.49774,12.81449 -13.48047,24.80543 -23.37659,35.2527 -9.89612,10.44726 -21.70519,19.34133 -34.78531,25.87862 -13.08011,6.53727 -27.4256,10.71236 -42.3773,11.7667 -14.9517,1.05435 -29.09103,-1.11258 -41.85904,-5.93108 -12.76803,-4.81852 -24.16883,-12.28715 -33.66552,-21.79076 -9.49671,-9.50362 -17.08979,-21.04298 -22.23241,-33.95465 -5.14261,-12.91166 -7.83328,-27.19561 -7.52333,-42.13595 0.30995,-14.94034 3.58995,-29.10832 9.22975,-41.85842 5.63981,-12.7501 13.63743,-24.08168 23.39638,-33.47108 9.75897,-9.38941 21.27795,-16.83842 34.00359,-21.94183 12.72563,-5.10342 26.66067,-7.86812 41.28534,-7.94317 14.62467,-0.0751 28.55938,2.53224 41.26083,7.24431 12.70145,4.71207 24.16709,11.5339 33.81555,20.03646 9.64847,8.50257 17.47884,18.68937 22.90117,30.21241 5.42232,11.52304 8.43889,24.38332 8.44035,38.28317 z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-eye);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<circle
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4319);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="path4828"
|
||||||
|
cx="458.07443"
|
||||||
|
cy="316.13431"
|
||||||
|
r="30.809652" />
|
||||||
|
<circle
|
||||||
|
r="15.152287"
|
||||||
|
cy="301.99216"
|
||||||
|
cx="444.43738"
|
||||||
|
id="circle4830"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-eye);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="matrix(-0.49821858,-0.255998,-0.255998,0.49821858,841.05915,359.59091)"
|
||||||
|
id="g4822">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 544.2609,323.96628 c -5.95391,12.33766 -15.20034,24.2228 -25.89846,35.91934 -10.69814,11.69654 -22.74349,23.28172 -34.52447,34.21851 -11.78099,10.93679 -23.27607,21.15489 -34.23709,29.30247 -10.96102,8.14759 -21.47285,14.18083 -32.04267,16.95199 -10.56982,2.77117 -20.29711,2.02561 -29.30402,-1.67713 -9.00692,-3.70274 -20.58076,-7.76561 -27.66538,-16.71749 -7.08461,-8.95188 -12.84054,-20.18257 -16.5035,-33.03389 -3.66297,-12.85133 -5.229,-27.32914 -3.92417,-42.72858 1.30484,-15.39944 5.36688,-30.24976 11.81788,-43.75488 6.45101,-13.5051 15.29008,-25.65823 26.00811,-35.78271 10.71803,-10.12447 28.44246,-20.29305 42.24879,-25.86698 13.80633,-5.57394 28.83304,-8.62768 44.20973,-8.80364 15.3767,-0.17594 29.62737,2.52591 41.94358,7.37479 12.31622,4.84887 22.69735,11.85058 30.35956,20.34718 7.66222,8.49661 12.60139,18.48263 14.06496,29.34879 1.4636,10.86615 -0.59894,22.56457 -6.55285,34.90223 z"
|
||||||
|
id="path4824"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 538.18032,322.65868 c -5.17728,11.63182 -13.27733,23.10077 -22.96883,34.40428 -9.69151,11.30351 -20.93897,22.46482 -32.34413,32.7753 -11.40514,10.31051 -22.90789,19.71873 -33.85893,27.13351 -10.95103,7.41476 -21.39599,12.82014 -31.59528,15.28718 -10.19931,2.46703 -19.30202,1.76338 -27.56839,-1.62958 -8.26637,-3.39295 -19.13397,-6.9512 -25.3913,-15.16185 -6.25732,-8.21068 -11.24381,-18.53447 -14.30417,-30.37519 -3.06035,-11.84072 -4.18965,-25.20221 -2.68634,-39.42576 1.5033,-14.22354 5.50837,-27.94818 11.67956,-40.43838 6.17119,-12.4902 14.50792,-23.74111 24.54768,-33.13895 10.03978,-9.39782 26.99021,-19.0621 39.83566,-24.2929 12.84546,-5.2308 26.78412,-8.15811 41.0009,-8.45853 14.21678,-0.30038 27.34319,2.03758 38.64284,6.33106 11.29965,4.29349 20.7704,10.54463 27.74089,18.16875 6.97048,7.62413 11.43794,16.6127 12.81335,26.51165 1.37541,9.89894 -0.36624,20.67759 -5.54351,32.30941 z"
|
||||||
|
id="path4826"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss" />
|
||||||
|
<circle
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4321);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="path4828-0"
|
||||||
|
cx="438.70038"
|
||||||
|
cy="219.30804"
|
||||||
|
r="27.721321"
|
||||||
|
transform="matrix(0.98640333,0.16434257,-0.16434257,0.98640333,0,0)" />
|
||||||
|
<circle
|
||||||
|
r="13.633434"
|
||||||
|
cy="205.95601"
|
||||||
|
cx="431.24106"
|
||||||
|
id="circle4830-3"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
transform="matrix(0.98640333,0.16434257,-0.16434257,0.98640333,0,0)" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer7"
|
||||||
|
inkscape:label="gopher-mouth"
|
||||||
|
style="display:inline"
|
||||||
|
sodipodi:insensitive="true"
|
||||||
|
transform="translate(-15.732722,-256.54886)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 477.59321,477.72343 -6.36763,0.0828 -3.71113,-0.0821 c -1.18372,-0.0262 -2.23819,0.53559 -3.00662,1.36379 -0.76845,0.82822 -1.14658,1.97521 -1.32551,3.22687 l -1.01303,7.08562 -1.40711,7.111 c -0.25342,1.28069 0.0841,2.40965 0.70518,3.23132 0.6211,0.82165 1.57363,1.28978 2.69674,1.31649 l 3.7446,0.0891 7.40657,-0.17258 c 1.42055,-0.0331 2.74014,-0.58514 3.70785,-1.43299 0.96771,-0.84787 1.54004,-2.00084 1.65553,-3.2592 l 0.6476,-7.05621 0.52522,-7.04505 c 0.0935,-1.25398 -0.46676,-2.37726 -1.25366,-3.18163 -0.78689,-0.80437 -1.85738,-1.2842 -3.00457,-1.27716 z"
|
||||||
|
id="rect4659"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="scssscssscssscsss" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 476.43064,479.86835 -5.19684,0.0698 -2.47497,-0.10149 c -0.94018,-0.0386 -1.80825,0.43586 -2.46124,1.11384 -0.65298,0.67797 -1.03424,1.61771 -1.21175,2.64338 l -1.0026,5.79325 -1.25494,5.80832 c -0.22406,1.03701 0.002,1.97056 0.48938,2.64162 0.48783,0.67105 1.26653,1.03411 2.19892,1.07115 l 2.54193,0.101 5.88547,-0.12754 c 1.11447,-0.0242 2.17518,-0.47212 2.97321,-1.1643 0.79803,-0.69218 1.30904,-1.6349 1.43939,-2.66511 l 0.73009,-5.77006 0.63032,-5.76301 c 0.11259,-1.02637 -0.28558,-1.94744 -0.89178,-2.6062 -0.60618,-0.65877 -1.45658,-1.05733 -2.39458,-1.04471 z"
|
||||||
|
id="rect4661"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="scssscssscssscsss" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 447.45177,471.71537 c 0.17729,2.27145 1.57656,4.32647 3.56538,6.17684 1.98881,1.85037 4.73553,3.49055 7.9169,4.83408 3.18137,1.34353 6.76993,2.37673 10.40491,2.92876 3.63499,0.55204 7.31771,0.61337 10.93742,0.17695 3.61969,-0.43645 6.8614,-1.30517 9.67542,-2.37849 2.81402,-1.07332 5.17844,-2.3467 7.04073,-3.75925 1.86231,-1.41254 3.23922,-2.97722 4.10853,-4.72358 0.86932,-1.74636 1.22997,-3.67959 0.91461,-5.76285 -0.31535,-2.08326 -1.29186,-4.11481 -2.79935,-5.98131 -1.5075,-1.86649 -3.53491,-3.56576 -5.91642,-4.97983 -2.3815,-1.41407 -5.11304,-2.54212 -8.12844,-3.28158 -3.0154,-0.73946 -6.31783,-1.09096 -9.93094,-0.97174 -3.6131,0.11924 -7.2186,0.69446 -10.6419,1.64517 -3.4233,0.95069 -6.6496,2.2832 -9.33875,3.91065 -2.68913,1.62746 -4.89892,3.50256 -6.18894,5.61926 -1.32139,2.16817 -1.77021,4.61153 -1.61916,6.54692 z"
|
||||||
|
id="ellipse4650"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4265);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 455.1011,471.20532 c 0.31019,1.80429 1.36577,3.48937 2.98663,4.99917 1.62086,1.5098 3.80505,2.84719 6.28703,3.91437 2.48197,1.06719 5.24944,1.8562 8.07117,2.27071 2.82174,0.4145 5.70079,0.45265 8.53169,0.10713 2.83089,-0.34553 5.35911,-1.02976 7.553,-1.90451 2.19389,-0.87475 4.04484,-1.93848 5.497,-3.12538 1.45217,-1.1869 2.50911,-2.50179 3.13219,-3.93394 0.62308,-1.43214 0.81446,-2.98543 0.48985,-4.63056 -0.32461,-1.64514 -1.13916,-3.22548 -2.3414,-4.6674 -1.20224,-1.44192 -2.78948,-2.74346 -4.65903,-3.82078 -1.86955,-1.07733 -4.01937,-1.92982 -6.38974,-2.4811 -2.37037,-0.55129 -4.96168,-0.80162 -7.76722,-0.68542 -2.80553,0.11621 -5.57317,0.58631 -8.1874,1.34158 -2.61424,0.75528 -5.07126,1.79757 -7.14628,3.06167 -2.07504,1.26412 -3.75959,2.75051 -4.8326,4.37276 -1.07302,1.62225 -1.53509,3.37741 -1.22489,5.1817 z"
|
||||||
|
id="ellipse4652"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
d="m 465.13937,460.19393 c 0.45232,1.29294 1.43586,2.44115 2.79664,3.4102 1.36078,0.96906 3.0934,1.76079 4.97332,2.36791 1.87992,0.60712 3.89927,1.0315 5.87533,1.25741 1.97606,0.2259 3.90879,0.25223 5.71982,0.052 1.81102,-0.20028 3.33955,-0.60742 4.63321,-1.17435 1.29367,-0.56695 2.35232,-1.29343 3.18646,-2.14861 0.83413,-0.85519 1.44471,-1.8405 1.79916,-2.93195 0.35445,-1.09146 0.45213,-2.29028 0.21175,-3.55738 -0.24038,-1.2671 -0.80099,-2.48156 -1.64917,-3.57911 -0.84818,-1.09755 -1.9831,-2.07741 -3.35494,-2.8723 -1.37184,-0.7949 -2.98056,-1.40441 -4.76729,-1.7664 -1.78672,-0.36199 -3.75169,-0.47615 -5.82322,-0.29097 -2.07153,0.18518 -4.05358,0.65136 -5.84566,1.3298 -1.79207,0.67844 -3.39432,1.56902 -4.69144,2.60198 -1.29713,1.03296 -2.28898,2.20893 -2.84443,3.45293 -0.55546,1.24399 -0.67186,2.55593 -0.21954,3.84888 z"
|
||||||
|
id="path4648"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer12"
|
||||||
|
inkscape:label="gopher-hands"
|
||||||
|
style="display:inline"
|
||||||
|
sodipodi:insensitive="true"
|
||||||
|
transform="translate(-15.732722,-256.54886)">
|
||||||
|
<g
|
||||||
|
id="g4533"
|
||||||
|
transform="matrix(-0.28489616,-0.34500545,-0.42832103,0.44649678,715.99765,474.46827)">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="sssssssssssssssss"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="ellipse4523"
|
||||||
|
d="m 423.50332,581.83521 c -0.004,4.40048 -1.19837,7.58856 -3.37524,9.82844 -2.17687,2.23987 -5.33154,3.55156 -9.14619,4.44292 -3.81465,0.89135 -8.28246,1.39523 -13.05675,1.83828 -4.77428,0.44304 -9.85163,0.79076 -14.95001,1.09928 -5.09838,0.30851 -9.94541,0.34741 -14.40217,0.0862 -4.45676,-0.26122 -8.52354,-0.79908 -11.99271,-1.71189 -3.46915,-0.91282 -6.33736,-2.21356 -8.3562,-4.09288 -2.01885,-1.87935 -3.18709,-4.34475 -3.25466,-7.51083 -0.0676,-3.16607 0.9983,-5.4859 2.92534,-7.0838 1.92703,-1.5979 4.71248,-2.46394 8.09977,-2.84688 3.38729,-0.38293 7.37282,-0.28336 11.77044,-0.16051 4.39762,0.12284 9.21051,0.23456 14.33166,-0.12202 5.12115,-0.35659 10.27171,-1.47349 15.16022,-2.54099 4.88852,-1.06749 9.50395,-2.05149 13.43823,-2.27114 3.9343,-0.21967 7.17754,0.32322 9.39823,2.04598 2.22069,1.72276 3.41425,4.59936 3.41004,8.99986 z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4273);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ssscsscssssssssssssssssssssccsss"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4521"
|
||||||
|
d="m 411.91406,568.54883 c -3.75011,-0.0271 -8.08701,0.53975 -12.76172,1.28711 -5.34251,0.85413 -11.10706,1.92059 -17.00976,2.32617 -5.9027,0.40562 -11.41103,0.38326 -16.44727,0.41406 -5.03624,0.0309 -9.6045,0.1607 -13.50781,0.85938 -3.9033,0.69867 -7.13503,1.96743 -9.4082,3.96875 -2.27316,2.00131 -3.58535,4.71676 -3.65235,8.17578 -0.067,3.45901 1.21821,6.3073 3.54297,8.58008 2.32476,2.27278 5.68789,3.9795 9.76172,5.25 4.07385,1.27051 8.85237,2.11894 14.05664,2.59765 5.20427,0.47871 10.83381,0.56134 16.70313,0.22266 5.86931,-0.33868 11.47146,-0.78653 16.60547,-1.34961 5.13399,-0.56309 9.79334,-1.22365 13.70703,-2.34375 1.48913,-0.4262 2.86677,-0.9287 4.12695,-1.51953 2.54507,-1.19325 2.05015,-6.17249 -0.0996,-4.54102 -1.99172,1.51153 -4.55969,2.50355 -7.57031,3.20703 -3.66893,0.85731 -7.96668,1.34146 -12.5586,1.76758 -4.59191,0.42612 -9.47527,0.75991 -14.3789,1.05664 -4.90363,0.29673 -9.56506,0.33523 -13.85156,0.084 -4.28652,-0.25124 -8.19851,-0.76855 -11.53516,-1.64649 -3.33664,-0.87795 -6.09539,-2.12996 -8.03711,-3.9375 -1.94173,-1.80756 -3.06587,-4.17751 -3.13086,-7.22265 -0.065,-3.04513 0.96102,-5.2776 2.81445,-6.81446 1.85342,-1.53686 4.53117,-2.36997 7.78907,-2.73828 3.2579,-0.36831 7.09262,-0.27244 11.32226,-0.1543 4.22963,0.11816 8.85767,0.22578 13.7832,-0.11718 4.92553,-0.34297 9.88026,-1.41664 14.58204,-2.44336 4.70178,-1.02671 9.13982,-1.97234 12.92382,-2.1836 0.473,-0.0264 0.93707,-0.0422 1.38868,-0.0449 1.16046,-0.007 2.25007,0.0442 3.25,0.23633 1.15313,0.22156 2.31543,-2.86146 -0.83789,-2.92773 -0.51177,-0.0108 -1.03459,-0.045 -1.57032,-0.0488 z"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#gopher-lines);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer3"
|
||||||
|
inkscape:label="cape-front"
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(-15.732722,-256.54886)">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cssscscc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4248"
|
||||||
|
d="m 250.62773,531.91504 c -9.09672,21.35801 -15.29674,29.07226 -30.27188,44.83759 -11.50237,12.10933 -28.85117,24.46609 -43.81134,39.61682 -13.55246,13.72509 -26.12338,21.00434 -64.22257,32.01103 -11.97434,3.45934 -44.031036,6.55017 -51.472472,37.30246 C 107.21772,654.7909 183.17617,662.32228 228.40418,636.09787 266.34279,614.10005 317.82474,552.6315 355.9453,547.7268 284.49621,547.05928 263.34291,542.49874 250.62773,531.91504 Z"
|
||||||
|
style="display:inline;fill:#019833;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:#019833;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 473.29262,543.99873 73.7751,-5.10117 c 0,0 2.29258,1.0455 2.68673,2.11494 7.36409,19.98076 -12.72148,60.84328 -12.72148,60.84328 0,-2.97132 13.53121,-43.94425 -5.91529,-53.46522 -16.4456,-8.05173 -38.16124,-2.06803 -57.82506,-4.39183 z"
|
||||||
|
id="path4265"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccscsc" />
|
||||||
|
<path
|
||||||
|
style="display:inline;fill:#019432;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 249.90625,533.57227 c -8.70868,20.08478 -14.97837,27.83833 -29.55078,43.17968 -11.50237,12.10933 -28.85038,24.46646 -43.81055,39.61719 -13.55246,13.72509 -26.12346,21.00503 -64.22265,32.01172 -10.63128,3.07133 -37.077893,5.86957 -48.087895,27.97656 2.731585,-3.48747 7.206694,-4.8761 9.881319,-8.70029 4.506995,-6.44411 60.824806,-11.61546 75.673426,-21.06752 9.77176,-6.22033 32.61216,-17.69963 44.08393,-25.40211 11.47178,-7.70248 50.16856,-39.82139 59.98047,-41.62695 30.99143,-5.70295 56.04882,-31.95703 56.04882,-31.95703 0,0 -5.76873,-1.34099 -7.30468,-1.69727 -26.4653,-1.9743 -39.57284,-5.58234 -48.29883,-11.28125 -1.77957,-0.42346 -3.78649,-0.89828 -4.39258,-1.05273 z"
|
||||||
|
id="path4280"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cssscsssscccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#01a939;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 250.88543,527.29897 c 4.9284,1.23444 7.57648,5.23948 12.39942,6.83706 14.83134,4.91283 28.22069,8.13985 43.80356,9.2706 19.18619,1.39223 40.09821,1.50171 59.33179,1.15882 36.63136,-0.65304 73.4946,-1.92414 110.08831,-3.70824 19.9513,-0.97271 40.58394,-2.2893 60.49061,-3.94 3.86874,-0.3208 7.97563,-6.05622 11.58825,-4.6353 2.39418,0.94168 2.01049,3.29975 2.64058,5.79412 2.44082,4.93143 0.14511,6.64447 -5.65353,7.64824 -19.43937,3.05253 -39.20884,3.55847 -58.86827,4.40354 -48.01128,2.06378 -96.10464,2.11621 -144.15772,1.62235 -17.00379,-0.17475 -34.11943,0.52285 -50.98827,-1.62235 -13.27515,-1.68819 -26.90453,-3.45163 -39.16825,-8.80707 -4.12399,-1.80091 -7.99437,-2.72852 -8.97266,-7.12095 -0.30759,-1.38101 1.19417,-2.17728 1.88173,-3.29956 0.57446,-0.93767 0.21317,-2.26036 1.23886,-2.84803 1.34064,-0.76812 2.84679,-1.12864 4.34559,-0.75323 z"
|
||||||
|
id="path4267"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssssssccssssssss" />
|
||||||
|
<path
|
||||||
|
style="fill:#019d35;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 245.9043,528.82812 c -0.24767,0.63868 -0.21658,1.44068 -0.60352,2.07227 -0.68756,1.12228 -2.18845,1.91782 -1.88086,3.29883 0.97829,4.39243 4.84867,5.32018 8.97266,7.12109 12.26372,5.35544 25.89282,7.11845 39.16797,8.80664 16.86884,2.1452 33.98449,1.4483 50.98828,1.62305 48.05308,0.49386 96.14692,0.44073 144.1582,-1.62305 19.65943,-0.84507 39.42782,-1.34981 58.86719,-4.40234 5.79864,-1.00377 8.09512,-2.71701 5.6543,-7.64844 -0.0557,-0.22031 -0.0962,-0.43699 -0.13868,-0.65429 0.48647,4.64963 -6.66572,4.9037 -11.87478,5.92187 -33.64204,6.57569 -68.48165,3.5437 -102.75586,4.0957 -42.87828,0.69057 -93.34812,6.52037 -135.57053,-0.98242 -17.79033,-3.16129 -43.90403,-10.17243 -54.98437,-17.62891 z"
|
||||||
|
id="path4340"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="csssssscccsssc" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer8"
|
||||||
|
inkscape:label="vim"
|
||||||
|
transform="translate(-15.732722,-256.54886)">
|
||||||
|
<g
|
||||||
|
id="g4330">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#005d04;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4293"
|
||||||
|
width="194.71968"
|
||||||
|
height="194.71968"
|
||||||
|
x="-29.381023"
|
||||||
|
y="744.44128"
|
||||||
|
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)" />
|
||||||
|
<rect
|
||||||
|
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
|
||||||
|
y="753.35699"
|
||||||
|
x="-20.465342"
|
||||||
|
height="176.88821"
|
||||||
|
width="176.88821"
|
||||||
|
id="rect4283"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#019833;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<g
|
||||||
|
id="text4285"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:203.27047729px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;display:inline;fill:#fefefe;fill-opacity:1;stroke:#005d04;stroke-width:4;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
transform="matrix(1.0880646,0,-0.29154603,1.0880646,-528.83975,-369.0604)">
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccccccccccccsc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4324"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-family:Eczar;-inkscape-font-specification:'Eczar Ultra-Bold';fill:#fefefe;fill-opacity:1;stroke:#005d04;stroke-width:5.01092911;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="m 202.34975,1029.0537 -56.02157,-157.11507 -17.82505,-3.05571 0.25466,-14.0054 89.88914,0 1.52787,8.1486 c -2.7162,2.2069 -5.77193,4.32893 -9.16717,6.36609 -3.22549,2.03714 -6.70561,3.98941 -10.44038,5.85679 l 26.38345,87.17129 39.56921,-89.71773 -21.89934,-3.81964 0.25464,-14.0054 72.06411,0 -68.4991,168.82868 0.25465,0.2547 c -6.28122,1.0184 -13.49612,1.9522 -21.6447,2.8011 -8.14859,0.8487 -16.38207,1.6126 -24.70042,2.2917 z" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<use
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
xlink:href="#g4330"
|
||||||
|
id="use4338"
|
||||||
|
transform="matrix(0.4546439,-0.10745401,-0.02175104,0.44922994,711.99298,282.73776)"
|
||||||
|
width="100%"
|
||||||
|
height="100%" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer4"
|
||||||
|
inkscape:label="palette"
|
||||||
|
style="display:inline"
|
||||||
|
sodipodi:insensitive="true"
|
||||||
|
transform="translate(-15.732722,-256.54886)">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4168);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4162"
|
||||||
|
width="40.789474"
|
||||||
|
height="40.789474"
|
||||||
|
x="779.60529"
|
||||||
|
y="21.967466" />
|
||||||
|
<rect
|
||||||
|
y="21.967466"
|
||||||
|
x="824.60529"
|
||||||
|
height="40.789474"
|
||||||
|
width="40.789474"
|
||||||
|
id="rect4170"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient4180);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052742;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bce8ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4208"
|
||||||
|
width="40.789474"
|
||||||
|
height="40.789474"
|
||||||
|
x="779.60529"
|
||||||
|
y="86.967468" />
|
||||||
|
<rect
|
||||||
|
y="-127.75694"
|
||||||
|
x="824.60529"
|
||||||
|
height="40.789474"
|
||||||
|
width="40.789474"
|
||||||
|
id="rect4223"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#abccd9;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
transform="scale(1,-1)" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#c3b0cb;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4227"
|
||||||
|
width="40.789474"
|
||||||
|
height="40.789474"
|
||||||
|
x="779.60529"
|
||||||
|
y="131.96747" />
|
||||||
|
<rect
|
||||||
|
y="131.96747"
|
||||||
|
x="824.60529"
|
||||||
|
height="40.789474"
|
||||||
|
width="40.789474"
|
||||||
|
id="rect4231"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#e1d0cb;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f5c3d2;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4233"
|
||||||
|
width="40.789474"
|
||||||
|
height="40.789474"
|
||||||
|
x="869.60529"
|
||||||
|
y="131.96747" />
|
||||||
|
<rect
|
||||||
|
y="176.96747"
|
||||||
|
x="779.60529"
|
||||||
|
height="40.789474"
|
||||||
|
width="40.789474"
|
||||||
|
id="rect4248"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cec4ad;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
transform="scale(1,-1)"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#96d6ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4263"
|
||||||
|
width="40.789474"
|
||||||
|
height="40.789474"
|
||||||
|
x="869.60529"
|
||||||
|
y="-127.75694" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f2f2ce;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4267"
|
||||||
|
width="40.789474"
|
||||||
|
height="40.789474"
|
||||||
|
x="824.60529"
|
||||||
|
y="176.96747" />
|
||||||
|
<rect
|
||||||
|
y="-327.75693"
|
||||||
|
x="779.60529"
|
||||||
|
height="40.789474"
|
||||||
|
width="40.789474"
|
||||||
|
id="rect4280"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#24b8eb;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
transform="scale(1,-1)" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#8aa9ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4284"
|
||||||
|
width="40.789474"
|
||||||
|
height="40.789474"
|
||||||
|
x="824.60529"
|
||||||
|
y="286.96747" />
|
||||||
|
<rect
|
||||||
|
y="331.96747"
|
||||||
|
x="779.60529"
|
||||||
|
height="40.789474"
|
||||||
|
width="40.789474"
|
||||||
|
id="rect4297"
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4edf1;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#394d54;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4301"
|
||||||
|
width="40.789474"
|
||||||
|
height="40.789474"
|
||||||
|
x="779.60529"
|
||||||
|
y="241.96747" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d6e2ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:9.21052647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect4303"
|
||||||
|
width="40.789474"
|
||||||
|
height="40.789474"
|
||||||
|
x="824.60529"
|
||||||
|
y="331.96747" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 84 KiB |
159
.vim/bundle/vim-go/autoload/ctrlp/decls.vim
Normal file
159
.vim/bundle/vim-go/autoload/ctrlp/decls.vim
Normal file
|
@ -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 <cr> <c-v> <c-t> or <c-x>
|
||||||
|
" 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
|
32
.vim/bundle/vim-go/autoload/go/alternate.vim
Normal file
32
.vim/bundle/vim-go/autoload/go/alternate.vim
Normal file
|
@ -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
|
69
.vim/bundle/vim-go/autoload/go/asmfmt.vim
Normal file
69
.vim/bundle/vim-go/autoload/go/asmfmt.vim
Normal file
|
@ -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
|
467
.vim/bundle/vim-go/autoload/go/cmd.vim
Normal file
467
.vim/bundle/vim-go/autoload/go/cmd.vim
Normal file
|
@ -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
|
182
.vim/bundle/vim-go/autoload/go/complete.vim
Normal file
182
.vim/bundle/vim-go/autoload/go/complete.vim
Normal file
|
@ -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("<cword>") . '\>'
|
||||||
|
" 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
|
371
.vim/bundle/vim-go/autoload/go/coverage.vim
Normal file
371
.vim/bundle/vim-go/autoload/go/coverage.vim
Normal file
|
@ -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#<buffer>")
|
||||||
|
autocmd! BufWinLeave <buffer>
|
||||||
|
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 <buffer> 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
|
320
.vim/bundle/vim-go/autoload/go/def.vim
Normal file
320
.vim/bundle/vim-go/autoload/go/def.vim
Normal file
|
@ -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]\)\@<!:')
|
||||||
|
else
|
||||||
|
let parts = split(out, ':')
|
||||||
|
endif
|
||||||
|
|
||||||
|
let filename = parts[0]
|
||||||
|
let line = parts[1]
|
||||||
|
let col = parts[2]
|
||||||
|
let ident = parts[3]
|
||||||
|
|
||||||
|
" Remove anything newer than the current position, just like basic
|
||||||
|
" vim tag support
|
||||||
|
if s:go_stack_level == 0
|
||||||
|
let s:go_stack = []
|
||||||
|
else
|
||||||
|
let s:go_stack = s:go_stack[0:s:go_stack_level-1]
|
||||||
|
endif
|
||||||
|
|
||||||
|
" increment the stack counter
|
||||||
|
let s:go_stack_level += 1
|
||||||
|
|
||||||
|
" push it on to the jumpstack
|
||||||
|
let stack_entry = {'line': line("."), 'col': col("."), 'file': expand('%:p'), 'ident': ident}
|
||||||
|
call add(s:go_stack, stack_entry)
|
||||||
|
|
||||||
|
" needed for restoring back user setting this is because there are two
|
||||||
|
" modes of switchbuf which we need based on the split mode
|
||||||
|
let old_switchbuf = &switchbuf
|
||||||
|
|
||||||
|
normal! m'
|
||||||
|
if filename != fnamemodify(expand("%"), ':p:gs?\\?/?')
|
||||||
|
" jump to existing buffer if, 1. we have enabled it, 2. the buffer is loaded
|
||||||
|
" and 3. there is buffer window number we switch to
|
||||||
|
if get(g:, 'go_def_reuse_buffer', 0) && bufloaded(filename) != 0 && bufwinnr(filename) != -1
|
||||||
|
" jumpt to existing buffer if it exists
|
||||||
|
execute bufwinnr(filename) . 'wincmd w'
|
||||||
|
else
|
||||||
|
if &modified
|
||||||
|
let cmd = 'hide edit'
|
||||||
|
else
|
||||||
|
let cmd = 'edit'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if a:mode == "tab"
|
||||||
|
let &switchbuf = "usetab"
|
||||||
|
if bufloaded(filename) == 0
|
||||||
|
tab split
|
||||||
|
endif
|
||||||
|
elseif a:mode == "split"
|
||||||
|
split
|
||||||
|
elseif a:mode == "vsplit"
|
||||||
|
vsplit
|
||||||
|
endif
|
||||||
|
|
||||||
|
" open the file and jump to line and column
|
||||||
|
exec cmd filename
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
call cursor(line, col)
|
||||||
|
|
||||||
|
" also align the line to middle of the view
|
||||||
|
normal! zz
|
||||||
|
|
||||||
|
let &switchbuf = old_switchbuf
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#def#SelectStackEntry() abort
|
||||||
|
let target_window = go#ui#GetReturnWindow()
|
||||||
|
if empty(target_window)
|
||||||
|
let target_window = winnr()
|
||||||
|
endif
|
||||||
|
|
||||||
|
let highlighted_stack_entry = matchstr(getline("."), '^..\zs\(\d\+\)')
|
||||||
|
if !empty(highlighted_stack_entry)
|
||||||
|
execute target_window . "wincmd w"
|
||||||
|
call go#def#Stack(str2nr(highlighted_stack_entry))
|
||||||
|
endif
|
||||||
|
|
||||||
|
call go#ui#CloseWindow()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#def#StackUI() abort
|
||||||
|
if len(s:go_stack) == 0
|
||||||
|
call go#util#EchoError("godef stack empty")
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let stackOut = ['" <Up>,<Down>:navigate <Enter>:jump <Esc>,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 <buffer> <silent> <CR> :<C-U>call go#def#SelectStackEntry()<CR>
|
||||||
|
noremap <buffer> <silent> <Esc> :<C-U>call go#ui#CloseWindow()<CR>
|
||||||
|
noremap <buffer> <silent> q :<C-U>call go#ui#CloseWindow()<CR>
|
||||||
|
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
|
32
.vim/bundle/vim-go/autoload/go/def_test.vim
Normal file
32
.vim/bundle/vim-go/autoload/go/def_test.vim
Normal file
|
@ -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
|
218
.vim/bundle/vim-go/autoload/go/doc.vim
Normal file
218
.vim/bundle/vim-go/autoload/go/doc.vim
Normal file
|
@ -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 <esc> or enter
|
||||||
|
noremap <buffer> <silent> <CR> :<C-U>close<CR>
|
||||||
|
noremap <buffer> <silent> <Esc> :<C-U>close<CR>
|
||||||
|
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('<cword>')
|
||||||
|
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
|
243
.vim/bundle/vim-go/autoload/go/fmt.vim
Normal file
243
.vim/bundle/vim-go/autoload/go/fmt.vim
Normal file
|
@ -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
|
31
.vim/bundle/vim-go/autoload/go/fmt_test.vim
Normal file
31
.vim/bundle/vim-go/autoload/go/fmt_test.vim
Normal file
|
@ -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
|
641
.vim/bundle/vim-go/autoload/go/guru.vim
Normal file
641
.vim/bundle/vim-go/autoload/go/guru.vim
Normal file
|
@ -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 <buffer> 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#<buffer>")
|
||||||
|
autocmd! BufWinEnter <buffer>
|
||||||
|
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
|
126
.vim/bundle/vim-go/autoload/go/impl.vim
Normal file
126
.vim/bundle/vim-go/autoload/go/impl.vim
Normal file
|
@ -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("<cword>")
|
||||||
|
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("<cword>")
|
||||||
|
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
|
213
.vim/bundle/vim-go/autoload/go/import.vim
Normal file
213
.vim/bundle/vim-go/autoload/go/import.vim
Normal file
|
@ -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
|
109
.vim/bundle/vim-go/autoload/go/job.vim
Normal file
109
.vim/bundle/vim-go/autoload/go/job.vim
Normal file
|
@ -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
|
161
.vim/bundle/vim-go/autoload/go/jobcontrol.vim
Normal file
161
.vim/bundle/vim-go/autoload/go/jobcontrol.vim
Normal file
|
@ -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
|
312
.vim/bundle/vim-go/autoload/go/lint.vim
Normal file
312
.vim/bundle/vim-go/autoload/go/lint.vim
Normal file
|
@ -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:
|
||||||
|
" <file>:<line>:[<column>]: <message> (<linter>)
|
||||||
|
" <file>:<line>:: <message> (<linter>)
|
||||||
|
" 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
|
133
.vim/bundle/vim-go/autoload/go/list.vim
Normal file
133
.vim/bundle/vim-go/autoload/go/list.vim
Normal file
|
@ -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
|
165
.vim/bundle/vim-go/autoload/go/package.vim
Normal file
165
.vim/bundle/vim-go/autoload/go/package.vim
Normal file
|
@ -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
|
175
.vim/bundle/vim-go/autoload/go/path.vim
Normal file
175
.vim/bundle/vim-go/autoload/go/path.vim
Normal file
|
@ -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
|
93
.vim/bundle/vim-go/autoload/go/play.vim
Normal file
93
.vim/bundle/vim-go/autoload/go/play.vim
Normal file
|
@ -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
|
146
.vim/bundle/vim-go/autoload/go/rename.vim
Normal file
146
.vim/bundle/vim-go/autoload/go/rename.vim
Normal file
|
@ -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("<cword>")
|
||||||
|
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
|
112
.vim/bundle/vim-go/autoload/go/statusline.vim
Normal file
112
.vim/bundle/vim-go/autoload/go/statusline.vim
Normal file
|
@ -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
|
50
.vim/bundle/vim-go/autoload/go/template.vim
Normal file
50
.vim/bundle/vim-go/autoload/go/template.vim
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
let s:current_file = expand("<sfile>")
|
||||||
|
|
||||||
|
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
|
139
.vim/bundle/vim-go/autoload/go/term.vim
Normal file
139
.vim/bundle/vim-go/autoload/go/term.vim
Normal file
|
@ -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
|
7
.vim/bundle/vim-go/autoload/go/test-fixtures/def/jump.go
Normal file
7
.vim/bundle/vim-go/autoload/go/test-fixtures/def/jump.go
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println("vim-go")
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println("vim-go")
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println("vim-go")
|
||||||
|
}
|
180
.vim/bundle/vim-go/autoload/go/textobj.vim
Normal file
180
.vim/bundle/vim-go/autoload/go/textobj.vim
Normal file
|
@ -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
|
209
.vim/bundle/vim-go/autoload/go/tool.vim
Normal file
209
.vim/bundle/vim-go/autoload/go/tool.vim
Normal file
|
@ -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
|
114
.vim/bundle/vim-go/autoload/go/ui.vim
Normal file
114
.vim/bundle/vim-go/autoload/go/ui.vim
Normal file
|
@ -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
|
308
.vim/bundle/vim-go/autoload/go/util.vim
Normal file
308
.vim/bundle/vim-go/autoload/go/util.vim
Normal file
|
@ -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), '\(\/\/.*\)\@<!\w\+')
|
||||||
|
if empty(l:matched)
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
|
||||||
|
let word = go#util#snippetcase(l:matched)
|
||||||
|
let tags = map(copy(l:keys), 'printf("%s:%s", v:val,"\"'. word .'\"")')
|
||||||
|
let updated_line = printf("%s `%s`", getline(line), join(tags, " "))
|
||||||
|
|
||||||
|
" finally, update the line inplace
|
||||||
|
call setline(line, updated_line)
|
||||||
|
endfor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" TODO(arslan): I couldn't parameterize the highlight types. Check if we can
|
||||||
|
" simplify the following functions
|
||||||
|
"
|
||||||
|
" NOTE(arslan): echon doesn't work well with redraw, thus echo doesn't print
|
||||||
|
" even though we order it. However echom seems to be work fine.
|
||||||
|
function! go#util#EchoSuccess(msg)
|
||||||
|
redraw | echohl Function | echom "vim-go: " . a:msg | echohl None
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#util#EchoError(msg)
|
||||||
|
redraw | echohl ErrorMsg | echom "vim-go: " . a:msg | echohl None
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#util#EchoWarning(msg)
|
||||||
|
redraw | echohl WarningMsg | echom "vim-go: " . a:msg | echohl None
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#util#EchoProgress(msg)
|
||||||
|
redraw | echohl Identifier | echom "vim-go: " . a:msg | echohl None
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#util#EchoInfo(msg)
|
||||||
|
redraw | echohl Debug | echom "vim-go: " . a:msg | echohl None
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim: sw=2 ts=2 et
|
41
.vim/bundle/vim-go/compiler/go.vim
Normal file
41
.vim/bundle/vim-go/compiler/go.vim
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
" 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.
|
||||||
|
"
|
||||||
|
" compiler/go.vim: Vim compiler file for Go.
|
||||||
|
|
||||||
|
if exists("current_compiler")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let current_compiler = "go"
|
||||||
|
|
||||||
|
if exists(":CompilerSet") != 2
|
||||||
|
command -nargs=* CompilerSet setlocal <args>
|
||||||
|
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
|
1557
.vim/bundle/vim-go/doc/vim-go.txt
Normal file
1557
.vim/bundle/vim-go/doc/vim-go.txt
Normal file
File diff suppressed because it is too large
Load diff
31
.vim/bundle/vim-go/ftdetect/gofiletype.vim
Normal file
31
.vim/bundle/vim-go/ftdetect/gofiletype.vim
Normal file
|
@ -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
|
19
.vim/bundle/vim-go/ftplugin/asm.vim
Normal file
19
.vim/bundle/vim-go/ftplugin/asm.vim
Normal file
|
@ -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
|
131
.vim/bundle/vim-go/ftplugin/go.vim
Normal file
131
.vim/bundle/vim-go/ftplugin/go.vim
Normal file
|
@ -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 <buffer> <silent> K :GoDoc<cr>
|
||||||
|
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 <buffer> <silent> gd :GoDef<cr>
|
||||||
|
nnoremap <buffer> <silent> <C-]> :GoDef<cr>
|
||||||
|
nnoremap <buffer> <silent> <C-w><C-]> :<C-u>call go#def#Jump("split")<CR>
|
||||||
|
nnoremap <buffer> <silent> <C-w>] :<C-u>call go#def#Jump("split")<CR>
|
||||||
|
nnoremap <buffer> <silent> <C-t> :<C-U>call go#def#StackPop(v:count1)<cr>
|
||||||
|
endif
|
||||||
|
|
||||||
|
if get(g:, "go_textobj_enabled", 1)
|
||||||
|
onoremap <buffer> <silent> af :<c-u>call go#textobj#Function('a')<cr>
|
||||||
|
onoremap <buffer> <silent> if :<c-u>call go#textobj#Function('i')<cr>
|
||||||
|
|
||||||
|
xnoremap <buffer> <silent> af :<c-u>call go#textobj#Function('a')<cr>
|
||||||
|
xnoremap <buffer> <silent> if :<c-u>call go#textobj#Function('i')<cr>
|
||||||
|
|
||||||
|
" Remap ]] and [[ to jump betweeen functions as they are useless in Go
|
||||||
|
nnoremap <buffer> <silent> ]] :<c-u>call go#textobj#FunctionJump('n', 'next')<cr>
|
||||||
|
nnoremap <buffer> <silent> [[ :<c-u>call go#textobj#FunctionJump('n', 'prev')<cr>
|
||||||
|
|
||||||
|
onoremap <buffer> <silent> ]] :<c-u>call go#textobj#FunctionJump('o', 'next')<cr>
|
||||||
|
onoremap <buffer> <silent> [[ :<c-u>call go#textobj#FunctionJump('o', 'prev')<cr>
|
||||||
|
|
||||||
|
xnoremap <buffer> <silent> ]] :<c-u>call go#textobj#FunctionJump('v', 'next')<cr>
|
||||||
|
xnoremap <buffer> <silent> [[ :<c-u>call go#textobj#FunctionJump('v', 'prev')<cr>
|
||||||
|
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 <buffer> <silent> * :<c-u>call Sameids_search(0)<CR>
|
||||||
|
" autocmd FileType go nnoremap <buffer> <silent> # :<c-u>call Sameids_search(1)<CR>
|
||||||
|
" autocmd FileType go nnoremap <buffer> <silent> n :<c-u>call Sameids_repeat(0)<CR>
|
||||||
|
" autocmd FileType go nnoremap <buffer> <silent> N :<c-u>call Sameids_repeat(1)<CR>
|
||||||
|
" autocmd FileType go cabbrev nohlsearch <C-r>=Sameids_nohlsearch()<CR>
|
||||||
|
" 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
|
94
.vim/bundle/vim-go/ftplugin/go/commands.vim
Normal file
94
.vim/bundle/vim-go/ftplugin/go/commands.vim
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
" -- gorename
|
||||||
|
command! -nargs=? GoRename call go#rename#Rename(<bang>0,<f-args>)
|
||||||
|
|
||||||
|
" -- guru
|
||||||
|
command! -nargs=* -complete=customlist,go#package#Complete GoGuruScope call go#guru#Scope(<f-args>)
|
||||||
|
command! -range=% GoImplements call go#guru#Implements(<count>)
|
||||||
|
command! -range=% GoWhicherrs call go#guru#Whicherrs(<count>)
|
||||||
|
command! -range=% GoCallees call go#guru#Callees(<count>)
|
||||||
|
command! -range=% GoDescribe call go#guru#Describe(<count>)
|
||||||
|
command! -range=% GoCallers call go#guru#Callers(<count>)
|
||||||
|
command! -range=% GoCallstack call go#guru#Callstack(<count>)
|
||||||
|
command! -range=% GoFreevars call go#guru#Freevars(<count>)
|
||||||
|
command! -range=% GoChannelPeers call go#guru#ChannelPeers(<count>)
|
||||||
|
command! -range=% GoReferrers call go#guru#Referrers(<count>)
|
||||||
|
command! -nargs=? GoGuruTags call go#guru#Tags(<f-args>)
|
||||||
|
|
||||||
|
|
||||||
|
command! -nargs=* -range GoAddTags call go#util#AddTags(<line1>, <line2>, <f-args>)
|
||||||
|
|
||||||
|
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(<bang>0,<f-args>)
|
||||||
|
command! -nargs=* -bang GoGenerate call go#cmd#Generate(<bang>0,<f-args>)
|
||||||
|
command! -nargs=* -bang -complete=file GoRun call go#cmd#Run(<bang>0,<f-args>)
|
||||||
|
command! -nargs=* -bang GoInstall call go#cmd#Install(<bang>0, <f-args>)
|
||||||
|
command! -nargs=* -bang GoTest call go#cmd#Test(<bang>0, 0, <f-args>)
|
||||||
|
command! -nargs=* -bang GoTestFunc call go#cmd#TestFunc(<bang>0, <f-args>)
|
||||||
|
command! -nargs=* -bang GoTestCompile call go#cmd#Test(<bang>0, 1, <f-args>)
|
||||||
|
|
||||||
|
" -- cover
|
||||||
|
command! -nargs=* -bang GoCoverage call go#coverage#Buffer(<bang>0, <f-args>)
|
||||||
|
command! -nargs=* -bang GoCoverageClear call go#coverage#Clear()
|
||||||
|
command! -nargs=* -bang GoCoverageToggle call go#coverage#BufferToggle(<bang>0, <f-args>)
|
||||||
|
command! -nargs=* -bang GoCoverageBrowser call go#coverage#Browser(<bang>0, <f-args>)
|
||||||
|
|
||||||
|
" -- play
|
||||||
|
command! -nargs=0 -range=% GoPlay call go#play#Share(<count>, <line1>, <line2>)
|
||||||
|
|
||||||
|
" -- def
|
||||||
|
command! -nargs=* -range GoDef :call go#def#Jump('')
|
||||||
|
command! -nargs=? GoDefPop :call go#def#StackPop(<f-args>)
|
||||||
|
command! -nargs=? GoDefStack :call go#def#Stack(<f-args>)
|
||||||
|
command! -nargs=? GoDefStackClear :call go#def#StackClear(<f-args>)
|
||||||
|
|
||||||
|
" -- doc
|
||||||
|
command! -nargs=* -range -complete=customlist,go#package#Complete GoDoc call go#doc#Open('new', 'split', <f-args>)
|
||||||
|
command! -nargs=* -range -complete=customlist,go#package#Complete GoDocBrowser call go#doc#OpenBrowser(<f-args>)
|
||||||
|
|
||||||
|
" -- 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, '', <f-args>, '')
|
||||||
|
command! -nargs=1 -bang -complete=customlist,go#package#Complete GoImport call go#import#SwitchImport(1, '', <f-args>, '<bang>')
|
||||||
|
command! -nargs=* -bang -complete=customlist,go#package#Complete GoImportAs call go#import#SwitchImport(1, <f-args>, '<bang>')
|
||||||
|
|
||||||
|
" -- linters
|
||||||
|
command! -nargs=* GoMetaLinter call go#lint#Gometa(0, <f-args>)
|
||||||
|
command! -nargs=0 GoMetaLinterAutoSaveToggle call go#lint#ToggleMetaLinterAutoSave()
|
||||||
|
command! -nargs=* GoLint call go#lint#Golint(<f-args>)
|
||||||
|
command! -nargs=* -bang GoVet call go#lint#Vet(<bang>0, <f-args>)
|
||||||
|
command! -nargs=* -complete=customlist,go#package#Complete GoErrCheck call go#lint#Errcheck(<f-args>)
|
||||||
|
|
||||||
|
" -- alternate
|
||||||
|
command! -bang GoAlternate call go#alternate#Switch(<bang>0, '')
|
||||||
|
|
||||||
|
" -- ctrlp
|
||||||
|
if globpath(&rtp, 'plugin/ctrlp.vim') != ""
|
||||||
|
command! -nargs=? -complete=file GoDecls call ctrlp#init(ctrlp#decls#cmd(0, <q-args>))
|
||||||
|
command! -nargs=? -complete=dir GoDeclsDir call ctrlp#init(ctrlp#decls#cmd(1, <q-args>))
|
||||||
|
endif
|
||||||
|
|
||||||
|
" -- impl
|
||||||
|
command! -nargs=* -buffer -complete=customlist,go#impl#Complete GoImpl call go#impl#Impl(<f-args>)
|
||||||
|
|
||||||
|
" -- template
|
||||||
|
command! -nargs=0 GoTemplateAutoCreateToggle call go#template#ToggleAutoCreate()
|
||||||
|
|
||||||
|
" vim: sw=2 ts=2 et
|
75
.vim/bundle/vim-go/ftplugin/go/mappings.vim
Normal file
75
.vim/bundle/vim-go/ftplugin/go/mappings.vim
Normal file
|
@ -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 <silent> <Plug>(go-run) :<C-u>call go#cmd#Run(!g:go_jump_to_error)<CR>
|
||||||
|
|
||||||
|
if has("nvim")
|
||||||
|
nnoremap <silent> <Plug>(go-run-vertical) :<C-u>call go#cmd#RunTerm(!g:go_jump_to_error, 'vsplit', [])<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-run-split) :<C-u>call go#cmd#RunTerm(!g:go_jump_to_error, 'split', [])<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-run-tab) :<C-u>call go#cmd#RunTerm(!g:go_jump_to_error, 'tabe', [])<CR>
|
||||||
|
endif
|
||||||
|
|
||||||
|
nnoremap <silent> <Plug>(go-build) :<C-u>call go#cmd#Build(!g:go_jump_to_error)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-generate) :<C-u>call go#cmd#Generate(!g:go_jump_to_error)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-install) :<C-u>call go#cmd#Install(!g:go_jump_to_error)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-test) :<C-u>call go#cmd#Test(!g:go_jump_to_error, 0)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-test-func) :<C-u>call go#cmd#TestFunc(!g:go_jump_to_error)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-test-compile) :<C-u>call go#cmd#Test(!g:go_jump_to_error, 1)<CR>
|
||||||
|
|
||||||
|
nnoremap <silent> <Plug>(go-coverage) :<C-u>call go#coverage#Buffer(!g:go_jump_to_error)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-coverage-clear) :<C-u>call go#coverage#Clear()<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-coverage-toggle) :<C-u>call go#coverage#BufferToggle(!g:go_jump_to_error)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-coverage-browser) :<C-u>call go#coverage#Browser(!g:go_jump_to_error)<CR>
|
||||||
|
|
||||||
|
nnoremap <silent> <Plug>(go-files) :<C-u>call go#tool#Files()<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-deps) :<C-u>call go#tool#Deps()<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-info) :<C-u>call go#tool#Info(0)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-import) :<C-u>call go#import#SwitchImport(1, '', expand('<cword>'), '')<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-imports) :<C-u>call go#fmt#Format(1)<CR>
|
||||||
|
|
||||||
|
nnoremap <silent> <Plug>(go-implements) :<C-u>call go#guru#Implements(-1)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-callees) :<C-u>call go#guru#Callees(-1)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-callers) :<C-u>call go#guru#Callers(-1)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-describe) :<C-u>call go#guru#Describe(-1)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-callstack) :<C-u>call go#guru#Callstack(-1)<CR>
|
||||||
|
xnoremap <silent> <Plug>(go-freevars) :<C-u>call go#guru#Freevars(0)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-channelpeers) :<C-u>call go#guru#ChannelPeers(-1)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-referrers) :<C-u>call go#guru#Referrers(-1)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-sameids) :<C-u>call go#guru#SameIds()<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-whicherrs) :<C-u>call go#guru#Whicherrs(-1)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-sameids-toggle) :<C-u>call go#guru#ToggleSameIds()<CR>
|
||||||
|
|
||||||
|
nnoremap <silent> <Plug>(go-rename) :<C-u>call go#rename#Rename(!g:go_jump_to_error)<CR>
|
||||||
|
|
||||||
|
nnoremap <silent> <Plug>(go-def) :<C-u>call go#def#Jump('')<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-def-vertical) :<C-u>call go#def#Jump("vsplit")<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-def-split) :<C-u>call go#def#Jump("split")<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-def-tab) :<C-u>call go#def#Jump("tab")<CR>
|
||||||
|
|
||||||
|
nnoremap <silent> <Plug>(go-def-pop) :<C-u>call go#def#StackPop()<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-def-stack) :<C-u>call go#def#Stack()<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-def-stack-clear) :<C-u>call go#def#StackClear()<CR>
|
||||||
|
|
||||||
|
nnoremap <silent> <Plug>(go-doc) :<C-u>call go#doc#Open("new", "split")<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-doc-tab) :<C-u>call go#doc#Open("tabnew", "tabe")<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-doc-vertical) :<C-u>call go#doc#Open("vnew", "vsplit")<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-doc-split) :<C-u>call go#doc#Open("new", "split")<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-doc-browser) :<C-u>call go#doc#OpenBrowser()<CR>
|
||||||
|
|
||||||
|
nnoremap <silent> <Plug>(go-metalinter) :<C-u>call go#lint#Gometa(0)<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-lint) :<C-u>call go#lint#Golint()<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-vet) :<C-u>call go#lint#Vet(!g:go_jump_to_error)<CR>
|
||||||
|
|
||||||
|
nnoremap <silent> <Plug>(go-alternate-edit) :<C-u>call go#alternate#Switch(0, "edit")<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-alternate-vertical) :<C-u>call go#alternate#Switch(0, "vsplit")<CR>
|
||||||
|
nnoremap <silent> <Plug>(go-alternate-split) :<C-u>call go#alternate#Switch(0, "split")<CR>
|
||||||
|
|
||||||
|
" vim: sw=2 ts=2 et
|
48
.vim/bundle/vim-go/ftplugin/go/snippets.vim
Normal file
48
.vim/bundle/vim-go/ftplugin/go/snippets.vim
Normal file
|
@ -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
|
57
.vim/bundle/vim-go/ftplugin/go/tagbar.vim
Normal file
57
.vim/bundle/vim-go/ftplugin/go/tagbar.vim
Normal file
|
@ -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
|
8
.vim/bundle/vim-go/ftplugin/gohtmltmpl.vim
Normal file
8
.vim/bundle/vim-go/ftplugin/gohtmltmpl.vim
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
if exists("b:did_ftplugin")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
setlocal commentstring=<!--\ %s\ -->
|
||||||
|
|
||||||
|
" vim: sw=2 ts=2 et
|
443
.vim/bundle/vim-go/gosnippets/UltiSnips/go.snippets
Normal file
443
.vim/bundle/vim-go/gosnippets/UltiSnips/go.snippets
Normal file
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* 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:
|
363
.vim/bundle/vim-go/gosnippets/snippets/go.snip
Normal file
363
.vim/bundle/vim-go/gosnippets/snippets/go.snip
Normal file
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* 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")}
|
||||||
|
})
|
78
.vim/bundle/vim-go/indent/go.vim
Normal file
78
.vim/bundle/vim-go/indent/go.vim
Normal file
|
@ -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
|
46
.vim/bundle/vim-go/indent/gohtmltmpl.vim
Normal file
46
.vim/bundle/vim-go/indent/gohtmltmpl.vim
Normal file
|
@ -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
|
213
.vim/bundle/vim-go/plugin/go.vim
Normal file
213
.vim/bundle/vim-go/plugin/go.vim
Normal file
|
@ -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(<f-args>)
|
||||||
|
|
||||||
|
" 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
|
81
.vim/bundle/vim-go/scripts/runtest.vim
Normal file
81
.vim/bundle/vim-go/scripts/runtest.vim
Normal file
|
@ -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!
|
30
.vim/bundle/vim-go/scripts/test.sh
Executable file
30
.vim/bundle/vim-go/scripts/test.sh
Executable file
|
@ -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"
|
397
.vim/bundle/vim-go/syntax/go.vim
Normal file
397
.vim/bundle/vim-go/syntax/go.vim
Normal file
|
@ -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
|
||||||
|
"
|
||||||
|
" \(\<chan\>\)\@<!<- (only pick arrow when it doesn't come after a chan)
|
||||||
|
" this prevents picking up 'chan<- chan<-' but not '<- chan'
|
||||||
|
syn match goSpaceError display "\(\(\<chan\>\)\@<!<-\)\@<=\s\+\(\<chan\>\)\@="
|
||||||
|
|
||||||
|
" send-only annotation on chan type
|
||||||
|
"
|
||||||
|
" \(<-\)\@<!\<chan\> (only pick chan when it doesn't come after an arrow)
|
||||||
|
" this prevents picking up '<-chan <-chan' but not 'chan <-'
|
||||||
|
syn match goSpaceError display "\(\(<-\)\@<!\<chan\>\)\@<=\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 /\<bytes\.\(Buffer\)\>/
|
||||||
|
syn match goExtraType /\<io\.\(Reader\|ReadSeeker\|ReadWriter\|ReadCloser\|ReadWriteCloser\|Writer\|WriteCloser\|Seeker\)\>/
|
||||||
|
syn match goExtraType /\<reflect\.\(Kind\|Type\|Value\)\>/
|
||||||
|
syn match goExtraType /\<unsafe\.Pointer\>/
|
||||||
|
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 /\<func\>/ 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 /\<type\>/ nextgroup=goTypeName skipwhite skipnl
|
||||||
|
syn match goTypeName /\w\+/ contained nextgroup=goDeclType skipwhite skipnl
|
||||||
|
syn match goDeclType /\<interface\|struct\>/ 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
|
20
.vim/bundle/vim-go/syntax/godefstack.vim
Normal file
20
.vim/bundle/vim-go/syntax/godefstack.vim
Normal file
|
@ -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
|
15
.vim/bundle/vim-go/syntax/gohtmltmpl.vim
Normal file
15
.vim/bundle/vim-go/syntax/gohtmltmpl.vim
Normal file
|
@ -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
|
85
.vim/bundle/vim-go/syntax/gotexttmpl.vim
Normal file
85
.vim/bundle/vim-go/syntax/gotexttmpl.vim
Normal file
|
@ -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
|
13
.vim/bundle/vim-go/syntax/vimgo.vim
Normal file
13
.vim/bundle/vim-go/syntax/vimgo.vim
Normal file
|
@ -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
|
7
.vim/bundle/vim-go/templates/hello_world.go
Normal file
7
.vim/bundle/vim-go/templates/hello_world.go
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println("vim-go")
|
||||||
|
}
|
60
.vim/bundle/vim-racer/README.md
Normal file
60
.vim/bundle/vim-racer/README.md
Normal file
|
@ -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
|
||||||
|
`<Plug>` 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 <Plug>(rust-def)
|
||||||
|
au FileType rust nmap gs <Plug>(rust-def-split)
|
||||||
|
au FileType rust nmap gx <Plug>(rust-def-vertical)
|
||||||
|
au FileType rust nmap <leader>gd <Plug>(rust-doc)
|
||||||
|
```
|
265
.vim/bundle/vim-racer/autoload/racer.vim
Normal file
265
.vim/bundle/vim-racer/autoload/racer.vim
Normal file
|
@ -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
|
44
.vim/bundle/vim-racer/ftplugin/rust_racer.vim
Normal file
44
.vim/bundle/vim-racer/ftplugin/rust_racer.vim
Normal file
|
@ -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('<sfile>: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 <silent><buffer> <Plug>(rust-def)
|
||||||
|
\ :call racer#GoToDefinition()<CR>
|
||||||
|
nnoremap <silent><buffer> <Plug>(rust-def-split)
|
||||||
|
\ :split<CR>:call racer#GoToDefinition()<CR>
|
||||||
|
nnoremap <silent><buffer> <Plug>(rust-def-vertical)
|
||||||
|
\ :vsplit<CR>:call racer#GoToDefinition()<CR>
|
||||||
|
nnoremap <silent><buffer> <Plug>(rust-doc)
|
||||||
|
\ :call racer#ShowDocumentation()<CR>
|
||||||
|
|
||||||
|
setlocal omnifunc=racer#RacerComplete
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
111
.vim/bundle/vim-racer/rplugin/python3/deoplete/sources/racer.py
Normal file
111
.vim/bundle/vim-racer/rplugin/python3/deoplete/sources/racer.py
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
#=============================================================================
|
||||||
|
# FILE: racer.py
|
||||||
|
# AUTHOR: Shougo Matsushita <Shougo.Matsu at gmail.com>
|
||||||
|
# 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
|
178
.vim/bundle/vim-racer/syntax/rustdoc.vim
Normal file
178
.vim/bundle/vim-racer/syntax/rustdoc.vim
Normal file
|
@ -0,0 +1,178 @@
|
||||||
|
" Vim syntax file
|
||||||
|
" Language: Rust Documentation (Markdown)
|
||||||
|
" Maintainer: Esteban Kuber <esteban@kuber.com.ar>
|
||||||
|
" 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 <sfile>: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 <args>
|
||||||
|
else
|
||||||
|
command! -nargs=+ HtmlHiLink hi def link <args>
|
||||||
|
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][] | 
|
||||||
|
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="\n\{-,1}[^]]\{-}\zs\]\ze[[(]" contains=@mkdNonListItem,@Spell nextgroup=mkdURL,mkdID skipwhite oneline' . s:concealends
|
||||||
|
|
||||||
|
" Autolink without angle brackets.
|
||||||
|
" mkd inline links: protocol optional user:pass@ sub/domain .com, .co.uk, etc optional port path/querystring/hash fragment
|
||||||
|
" ------------ _____________________ ----------------------------- _________________________ ----------------- __
|
||||||
|
syn match mkdInlineURL /https\?:\/\/\(\w\+\(:\w\+\)\?@\)\?\([A-Za-z0-9][-_0-9A-Za-z]*\.\)\{1,}\(\w\{2,}\.\?\)\{1,}\(:[0-9]\{1,5}\)\?\S*/
|
||||||
|
|
||||||
|
" Autolink with parenthesis.
|
||||||
|
syn region mkdInlineURL matchgroup=mkdDelimiter start="(\(https\?:\/\/\(\w\+\(:\w\+\)\?@\)\?\([A-Za-z0-9][-_0-9A-Za-z]*\.\)\{1,}\(\w\{2,}\.\?\)\{1,}\(:[0-9]\{1,5}\)\?\S*)\)\@=" end=")"
|
||||||
|
|
||||||
|
" Autolink with angle brackets.
|
||||||
|
syn region mkdInlineURL matchgroup=mkdDelimiter start="\\\@<!<\ze[a-z][a-z0-9,.-]\{1,22}:\/\/[^> ]*>" 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=/\s*``[^`]*/ end=/[^`]*``\s*/
|
||||||
|
syn region mkdCode start=/^\s*\z(`\{3,}\)[^`]*$/ end=/^\s*\z1`*\s*$/
|
||||||
|
syn region mkdCode start=/\s*\~\~[^\~]*/ end=/[^\~]*\~\~\s*/
|
||||||
|
syn region mkdCode start=/^\s*\z(\~\{3,}\)\s*[0-9A-Za-z_+-]*\s*$/ end=/^\s*\z1\~*\s*$/
|
||||||
|
syn region mkdCode start="<pre[^>]*\\\@<!>" end="</pre>"
|
||||||
|
syn region mkdCode start="<code[^>]*\\\@<!>" end="</code>"
|
||||||
|
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="\\\@<!\$" end="\$" contains=@tex keepend
|
||||||
|
syn region mkdMath start="\\\@<!\$\$" end="\$\$" contains=@tex keepend
|
||||||
|
endif
|
||||||
|
|
||||||
|
syn include @rust syntax/rust.vim
|
||||||
|
syn region mkdRust start="\`\`\`$" end="\`\`\`$" contains=@rust keepend
|
||||||
|
syn region mkdRust start="\`\`\`rust" end="\`\`\`$" contains=@rust keepend
|
||||||
|
syn region mkdRust start="\`\`\`no_run" end="\`\`\`$" contains=@rust keepend
|
||||||
|
|
||||||
|
syn cluster mkdNonListItem contains=@htmlTop,htmlItalic,htmlBold,htmlBoldItalic,mkdFootnotes,mkdInlineURL,mkdLink,mkdLinkDef,mkdLineBreak,mkdBlockquote,mkdCode,mkdRule,htmlH1,htmlH2,htmlH3,htmlH4,htmlH5,htmlH6,mkdMath,mkdRust
|
||||||
|
|
||||||
|
"highlighting for Markdown groups
|
||||||
|
HtmlHiLink mkdString String
|
||||||
|
HtmlHiLink mkdCode String
|
||||||
|
HtmlHiLink mkdCodeStart String
|
||||||
|
HtmlHiLink mkdCodeEnd String
|
||||||
|
HtmlHiLink mkdFootnote Comment
|
||||||
|
HtmlHiLink mkdBlockquote Comment
|
||||||
|
HtmlHiLink mkdListItem Identifier
|
||||||
|
HtmlHiLink mkdRule Identifier
|
||||||
|
HtmlHiLink mkdLineBreak Visual
|
||||||
|
HtmlHiLink mkdFootnotes htmlLink
|
||||||
|
HtmlHiLink mkdLink htmlLink
|
||||||
|
HtmlHiLink mkdURL htmlString
|
||||||
|
HtmlHiLink mkdInlineURL htmlLink
|
||||||
|
HtmlHiLink mkdID Identifier
|
||||||
|
HtmlHiLink mkdLinkDef mkdID
|
||||||
|
HtmlHiLink mkdLinkDefTarget mkdURL
|
||||||
|
HtmlHiLink mkdLinkTitle htmlString
|
||||||
|
HtmlHiLink mkdDelimiter Delimiter
|
||||||
|
|
||||||
|
let b:current_syntax = "mkd"
|
||||||
|
|
||||||
|
delcommand HtmlHiLink
|
||||||
|
" vim: ts=2
|
1607
.vim/plugin/EnhancedCommentify.vim
Normal file
1607
.vim/plugin/EnhancedCommentify.vim
Normal file
File diff suppressed because it is too large
Load diff
165
.vim/plugin/cscope_maps.vim
Normal file
165
.vim/plugin/cscope_maps.vim
Normal file
|
@ -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 <cfile> macro use '^<cfile>$': this is so
|
||||||
|
" that searches over '#include <time.h>" 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 <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-\>g :cs find g <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-\>c :cs find c <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-\>t :cs find t <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-\>e :cs find e <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-\>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
|
||||||
|
nmap <C-\>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
|
||||||
|
nmap <C-\>d :cs find d <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
|
||||||
|
|
||||||
|
" 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 <C-@>s <C-W><C-S> :cs find s <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
|
||||||
|
nmap <C-@>s :scs find s <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-@>g :scs find g <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-@>c :scs find c <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-@>t :scs find t <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-@>e :scs find e <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-@>f :scs find f <C-R>=expand("<cfile>")<CR><CR>
|
||||||
|
nmap <C-@>i :scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
|
||||||
|
nmap <C-@>d :scs find d <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
|
||||||
|
|
||||||
|
" 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 <C-@><C-@>s :vert scs find s <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-@><C-@>g :vert scs find g <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-@><C-@>c :vert scs find c <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-@><C-@>t :vert scs find t <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-@><C-@>e :vert scs find e <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
nmap <C-@><C-@>f :vert scs find f <C-R>=expand("<cfile>")<CR><CR>
|
||||||
|
nmap <C-@><C-@>i :vert scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
|
||||||
|
nmap <C-@><C-@>d :vert scs find d <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
|
||||||
|
|
||||||
|
""""""""""""" 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 <F1>), 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 <F1>).
|
||||||
|
"
|
||||||
|
"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
|
||||||
|
|
||||||
|
|
2041
.vim/plugin/fugitive.vim
Normal file
2041
.vim/plugin/fugitive.vim
Normal file
File diff suppressed because it is too large
Load diff
285
.vimrc
Normal file
285
.vimrc
Normal file
|
@ -0,0 +1,285 @@
|
||||||
|
" ==================================================================
|
||||||
|
" $HOME/.vimrc
|
||||||
|
" Author: Dongsu Park <dpark AT posteo.net>
|
||||||
|
" ==================================================================
|
||||||
|
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<C-\> :cs find 0 <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
map <C-\>s :cs find 0 <C-R>=expand("<cword>")<CR><CR>
|
||||||
|
|
||||||
|
map <c-w><c-b> :GotoBufExplorerWindow<cr>
|
||||||
|
map <c-w><c-f> :GotoFileExplorerWindow<cr>
|
||||||
|
|
||||||
|
"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 <silent> <unique> <F2> <Plug>Traditionalj
|
||||||
|
imap <silent> <unique> <F2> <Esc><Plug>Traditionalji
|
||||||
|
vmap <silent> <unique> <F2> <Plug>Traditional
|
||||||
|
|
||||||
|
nmap <silent> <unique> <C-E> <Plug>Traditionalj
|
||||||
|
imap <silent> <unique> <C-E> <Esc><Plug>Traditionalji
|
||||||
|
vmap <silent> <unique> <C-E> <Plug>Traditional
|
||||||
|
|
||||||
|
map <F7> <End>a<Tab>/*<SPACE><SPACE>*/<ESC><LEFT><LEFT>
|
||||||
|
imap <F7> <ESC><End>a<Tab>/*<SPACE><SPACE>*/<ESC><LEFT><LEFT>i
|
||||||
|
|
||||||
|
map <F8> i<TAB><ESC><RIGHT>
|
||||||
|
imap <F8> <TAB><ESC><RIGHT>i
|
||||||
|
|
||||||
|
nmap <F10> :TagBarToggle<CR>
|
||||||
|
|
||||||
|
|
||||||
|
inoremap <ESC> <ESC>:set imdisable<CR>
|
||||||
|
nnoremap i :set noimd<CR>i
|
||||||
|
nnoremap I :set noimd<CR>I
|
||||||
|
nnoremap a :set noimd<CR>a
|
||||||
|
nnoremap A :set noimd<CR>A
|
||||||
|
nnoremap o :set noimd<CR>o
|
||||||
|
nnoremap O :set noimd<CR>O
|
||||||
|
|
||||||
|
" 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 <leader>r <Plug>(go-run)
|
||||||
|
au FileType go nmap <leader>b <Plug>(go-build)
|
||||||
|
au FileType go nmap <leader>t <Plug>(go-test)
|
||||||
|
au FileType go nmap <leader>c <Plug>(go-coverage)
|
||||||
|
|
||||||
|
au FileType go nmap <Leader>ds <Plug>(go-def-split)
|
||||||
|
au FileType go nmap <Leader>dv <Plug>(go-def-vertical)
|
||||||
|
au FileType go nmap <Leader>dt <Plug>(go-def-tab)
|
||||||
|
|
||||||
|
au FileType go nmap <Leader>gd <Plug>(go-doc)
|
||||||
|
au FileType go nmap <Leader>gv <Plug>(go-doc-vertical)
|
||||||
|
au FileType go nmap <Leader>gb <Plug>(go-doc-browser)
|
||||||
|
|
||||||
|
au FileType go nmap <Leader>s <Plug>(go-implements)
|
||||||
|
au FileType go nmap <Leader>i <Plug>(go-info)
|
||||||
|
au FileType go nmap <Leader>e <Plug>(go-rename)
|
||||||
|
|
||||||
|
au FileType go nmap <C-]> <Plug>(go-def)
|
||||||
|
au FileType go nmap <C-\>s <Plug>(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 <leader>r <Plug>(RustRun)
|
||||||
|
au FileType rust nmap <leader>b <Plug>(RustBuild)
|
||||||
|
au FileType rust nmap gd <Plug>(rust-def)
|
||||||
|
au FileType rust nmap gs <Plug>(rust-def-split)
|
||||||
|
au FileType rust nmap gx <Plug>(rust-def-vertical)
|
||||||
|
au FileType rust nmap <leader>gd <Plug>(rust-doc)
|
||||||
|
|
||||||
|
au FileType rust nmap <C-]> <Plug>(rust-def)
|
Loading…
Add table
Reference in a new issue