init repository
This commit is contained in:
commit
3c58690f3c
|
@ -0,0 +1 @@
|
||||||
|
vim/
|
|
@ -0,0 +1,13 @@
|
||||||
|
# sakhmatd's dotfiles
|
||||||
|
|
||||||
|
This is my personal collection of dotfiles.
|
||||||
|
|
||||||
|
Use `GNU stow` to install individual dotfiles as modules.
|
||||||
|
|
||||||
|
For example, if you cloned this repo to `~.dotfiles` and you wished
|
||||||
|
to install my vim config without the modules, use:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd ~/.dotfiles
|
||||||
|
stow vim
|
||||||
|
```
|
|
@ -0,0 +1,2 @@
|
||||||
|
ytdl-format="bestvideo[height<=?1080][vcodec!=vp9]+bestaudio/best"
|
||||||
|
|
|
@ -0,0 +1,157 @@
|
||||||
|
" Vim color file
|
||||||
|
" Converted from Textmate theme Blackboard Mine using Coloration v0.3.3 (http://github.com/sickill/coloration)
|
||||||
|
|
||||||
|
set background=dark
|
||||||
|
highlight clear
|
||||||
|
|
||||||
|
if exists("syntax_on")
|
||||||
|
syntax reset
|
||||||
|
endif
|
||||||
|
|
||||||
|
let g:colors_name = "blackboard"
|
||||||
|
|
||||||
|
hi Normal ctermfg=231 ctermbg=233 cterm=NONE guifg=#f8f8f8 guibg=#0c1021 gui=NONE
|
||||||
|
hi NonText ctermfg=239 ctermbg=233 cterm=NONE guifg=#494c59 guibg=#0c1021 gui=NONE
|
||||||
|
|
||||||
|
hi Cursor ctermfg=233 ctermbg=145 cterm=NONE guifg=#0c1021 guibg=#aaabb1 gui=NONE
|
||||||
|
hi LineNr ctermfg=102 ctermbg=233 cterm=NONE guifg=#82848d guibg=#0c1021 gui=NONE
|
||||||
|
hi SignColumn ctermfg=102 ctermbg=233 cterm=NONE guifg=#82848d guibg=#0c1021 gui=NONE
|
||||||
|
|
||||||
|
hi VertSplit ctermfg=236 ctermbg=236 cterm=NONE guifg=#242737 guibg=#242737 gui=NONE
|
||||||
|
hi StatusLine ctermfg=231 ctermbg=240 cterm=bold guifg=#f8f8f8 guibg=#50535f gui=bold
|
||||||
|
hi StatusLineNC ctermfg=231 ctermbg=240 cterm=NONE guifg=#f8f8f8 guibg=#50535f gui=NONE
|
||||||
|
|
||||||
|
hi Folded ctermfg=145 ctermbg=233 cterm=NONE guifg=#aeaeae guibg=#0c1021 gui=NONE
|
||||||
|
hi Title ctermfg=231 ctermbg=NONE cterm=bold guifg=#f8f8f8 guibg=NONE gui=bold
|
||||||
|
hi Visual ctermfg=NONE ctermbg=24 cterm=NONE guifg=NONE guibg=#253b76 gui=NONE
|
||||||
|
|
||||||
|
hi SpecialKey ctermfg=239 ctermbg=236 cterm=NONE guifg=#494c59 guibg=#242737 gui=NONE
|
||||||
|
|
||||||
|
hi ErrorMsg ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
hi WarningMsg ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
if version >= 700
|
||||||
|
hi CursorLine ctermfg=NONE ctermbg=236 cterm=NONE guifg=NONE guibg=#242737 gui=NONE
|
||||||
|
hi CursorColumn ctermfg=NONE ctermbg=236 cterm=NONE guifg=NONE guibg=#242737 gui=NONE
|
||||||
|
hi Pmenu ctermfg=202 ctermbg=NONE cterm=NONE guifg=#ff6400 guibg=NONE gui=NONE
|
||||||
|
hi PmenuSel ctermfg=NONE ctermbg=24 cterm=NONE guifg=NONE guibg=#253b76 gui=NONE
|
||||||
|
hi Search ctermfg=16 ctermbg=222 cterm=underline guifg=#000000 guibg=#fcdf86 gui=NONE
|
||||||
|
endif
|
||||||
|
|
||||||
|
hi ColorColumn ctermfg=NONE ctermbg=236 cterm=NONE guifg=NONE guibg=#242737 gui=NONE
|
||||||
|
hi IncSearch ctermfg=233 ctermbg=77 cterm=NONE guifg=#0c1021 guibg=#61ce3c gui=NONE
|
||||||
|
hi Directory ctermfg=110 ctermbg=NONE cterm=NONE guifg=#8da6ce guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
" Syntax highlighting
|
||||||
|
hi Comment ctermfg=145 ctermbg=NONE cterm=NONE guifg=#aeaeae guibg=NONE gui=NONE
|
||||||
|
hi String ctermfg=77 ctermbg=NONE cterm=NONE guifg=#61ce3c guibg=NONE gui=NONE
|
||||||
|
hi Number ctermfg=191 ctermbg=NONE cterm=NONE guifg=#d8fa3c guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
hi Keyword ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
hi PreProc ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
hi Conditional ctermfg=214 ctermbg=NONE cterm=NONE guifg=#fdbe2d guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
hi Todo ctermfg=145 ctermbg=NONE cterm=inverse,bold guifg=#aeaeae guibg=NONE gui=inverse,bold
|
||||||
|
hi Constant ctermfg=114 ctermbg=NONE cterm=NONE guifg=#99cc99 guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
hi Identifier ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
hi Function ctermfg=202 ctermbg=NONE cterm=NONE guifg=#ff6400 guibg=NONE gui=NONE
|
||||||
|
hi Type ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
hi Statement ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
hi Special ctermfg=110 ctermbg=NONE cterm=NONE guifg=#8da6ce guibg=NONE gui=NONE
|
||||||
|
hi Operator ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
hi Boolean ctermfg=191 ctermbg=NONE cterm=NONE guifg=#d8fa3c guibg=NONE gui=NONE
|
||||||
|
hi Character ctermfg=191 ctermbg=NONE cterm=NONE guifg=#d8fa3c guibg=NONE gui=NONE
|
||||||
|
hi Define ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
hi DiffAdd ctermfg=231 ctermbg=64 cterm=bold guifg=#f8f8f8 guibg=#417e0b gui=bold
|
||||||
|
hi DiffDelete ctermfg=88 ctermbg=NONE cterm=NONE guifg=#860307 guibg=NONE gui=NONE
|
||||||
|
hi DiffChange ctermfg=231 ctermbg=236 cterm=NONE guifg=#f8f8f8 guibg=#162d54 gui=NONE
|
||||||
|
hi DiffText ctermfg=231 ctermbg=24 cterm=bold guifg=#f8f8f8 guibg=#204a87 gui=bold
|
||||||
|
|
||||||
|
hi Float ctermfg=191 ctermbg=NONE cterm=NONE guifg=#d8fa3c guibg=NONE gui=NONE
|
||||||
|
hi Label ctermfg=77 ctermbg=NONE cterm=NONE guifg=#61ce3c guibg=NONE gui=NONE
|
||||||
|
hi StorageClass ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
hi Tag ctermfg=202 ctermbg=NONE cterm=NONE guifg=#ff6400 guibg=NONE gui=NONE
|
||||||
|
hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline guifg=NONE guibg=NONE gui=underline
|
||||||
|
|
||||||
|
hi link Character Constant
|
||||||
|
hi link Boolean Constant
|
||||||
|
hi link Float Number
|
||||||
|
hi link Repeat Statement
|
||||||
|
hi link Label Statement
|
||||||
|
hi link Exception Statement
|
||||||
|
hi link Include PreProc
|
||||||
|
hi link Define PreProc
|
||||||
|
hi link Macro PreProc
|
||||||
|
hi link PreCondit PreProc
|
||||||
|
hi link StorageClass Type
|
||||||
|
hi link Structure Type
|
||||||
|
hi link Typedef Type
|
||||||
|
hi link Tag Special
|
||||||
|
hi link SpecialChar Special
|
||||||
|
hi link SpecialComment Special
|
||||||
|
hi link Debug Special
|
||||||
|
|
||||||
|
" Ruby
|
||||||
|
hi rubyClass ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
hi rubyFunction ctermfg=202 ctermbg=NONE cterm=NONE guifg=#ff6400 guibg=NONE gui=NONE
|
||||||
|
hi rubyInterpolationDelimiter ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
hi rubySymbol ctermfg=191 ctermbg=NONE cterm=NONE guifg=#d8fa3c guibg=NONE gui=NONE
|
||||||
|
hi rubyConstant ctermfg=110 ctermbg=NONE cterm=NONE guifg=#8da6ce guibg=NONE gui=NONE
|
||||||
|
hi rubyStringDelimiter ctermfg=77 ctermbg=NONE cterm=NONE guifg=#61ce3c guibg=NONE gui=NONE
|
||||||
|
hi rubyBlockParameter ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
hi rubyInstanceVariable ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
hi rubyInclude ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
hi rubyGlobalVariable ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
hi rubyRegexp ctermfg=77 ctermbg=NONE cterm=NONE guifg=#61ce3c guibg=NONE gui=NONE
|
||||||
|
hi rubyRegexpDelimiter ctermfg=77 ctermbg=NONE cterm=NONE guifg=#61ce3c guibg=NONE gui=NONE
|
||||||
|
hi rubyEscape ctermfg=191 ctermbg=NONE cterm=NONE guifg=#d8fa3c guibg=NONE gui=NONE
|
||||||
|
hi rubyControl ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
hi rubyClassVariable ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
hi rubyOperator ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
hi rubyException ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
hi rubyPseudoVariable ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
hi rubyRailsUserClass ctermfg=110 ctermbg=NONE cterm=NONE guifg=#8da6ce guibg=NONE gui=NONE
|
||||||
|
hi rubyRailsARAssociationMethod ctermfg=110 ctermbg=NONE cterm=NONE guifg=#8da6ce guibg=NONE gui=NONE
|
||||||
|
hi rubyRailsARMethod ctermfg=110 ctermbg=NONE cterm=NONE guifg=#8da6ce guibg=NONE gui=NONE
|
||||||
|
hi rubyRailsRenderMethod ctermfg=110 ctermbg=NONE cterm=NONE guifg=#8da6ce guibg=NONE gui=NONE
|
||||||
|
hi rubyRailsMethod ctermfg=110 ctermbg=NONE cterm=NONE guifg=#8da6ce guibg=NONE gui=NONE
|
||||||
|
hi erubyDelimiter ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
hi erubyComment ctermfg=145 ctermbg=NONE cterm=NONE guifg=#aeaeae guibg=NONE gui=NONE
|
||||||
|
hi erubyRailsMethod ctermfg=110 ctermbg=NONE cterm=NONE guifg=#8da6ce guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
" html
|
||||||
|
hi htmlTag ctermfg=103 ctermbg=NONE cterm=NONE guifg=#7f90aa guibg=NONE gui=NONE
|
||||||
|
hi htmlEndTag ctermfg=103 ctermbg=NONE cterm=NONE guifg=#7f90aa guibg=NONE gui=NONE
|
||||||
|
hi htmlTagName ctermfg=103 ctermbg=NONE cterm=NONE guifg=#7f90aa guibg=NONE gui=NONE
|
||||||
|
hi htmlArg ctermfg=103 ctermbg=NONE cterm=NONE guifg=#7f90aa guibg=NONE gui=NONE
|
||||||
|
hi htmlSpecialChar ctermfg=191 ctermbg=NONE cterm=NONE guifg=#d8fa3c guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
" javascript
|
||||||
|
hi javaScriptFunction ctermfg=220 ctermbg=NONE cterm=NONE guifg=#fbde2d guibg=NONE gui=NONE
|
||||||
|
hi javaScriptRailsFunction ctermfg=110 ctermbg=NONE cterm=NONE guifg=#8da6ce guibg=NONE gui=NONE
|
||||||
|
hi javaScriptBraces ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
" yaml
|
||||||
|
hi yamlKey ctermfg=202 ctermbg=NONE cterm=NONE guifg=#ff6400 guibg=NONE gui=NONE
|
||||||
|
hi yamlAnchor ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
hi yamlAlias ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
hi yamlDocumentHeader ctermfg=77 ctermbg=NONE cterm=NONE guifg=#61ce3c guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
" css
|
||||||
|
hi cssURL ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
hi cssFunctionName ctermfg=110 ctermbg=NONE cterm=NONE guifg=#8da6ce guibg=NONE gui=NONE
|
||||||
|
hi cssColor ctermfg=191 ctermbg=NONE cterm=NONE guifg=#d8fa3c guibg=NONE gui=NONE
|
||||||
|
hi cssPseudoClassId ctermfg=202 ctermbg=NONE cterm=NONE guifg=#ff6400 guibg=NONE gui=NONE
|
||||||
|
hi cssClassName ctermfg=202 ctermbg=NONE cterm=NONE guifg=#ff6400 guibg=NONE gui=NONE
|
||||||
|
hi cssValueLength ctermfg=191 ctermbg=NONE cterm=NONE guifg=#d8fa3c guibg=NONE gui=NONE
|
||||||
|
hi cssCommonAttr ctermfg=110 ctermbg=NONE cterm=NONE guifg=#8da6ce guibg=NONE gui=NONE
|
||||||
|
hi cssBraces ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE
|
||||||
|
|
||||||
|
|
||||||
|
" NERDTree
|
||||||
|
hi NERDTreeDirSlash guifg=#82848d
|
||||||
|
hi NERDTreeCWD guifg=#aeaeae
|
|
@ -0,0 +1,3 @@
|
||||||
|
GuiFont Input:h20
|
||||||
|
|
||||||
|
color blackboard
|
|
@ -0,0 +1,3 @@
|
||||||
|
set runtimepath^=~/.vim runtimepath+=~/.vim/after
|
||||||
|
let &packpath = &runtimepath
|
||||||
|
source ~/.vimrc
|
|
@ -0,0 +1,106 @@
|
||||||
|
" Turn off vi compatibility, makes vim a lot better
|
||||||
|
set nocompatible
|
||||||
|
|
||||||
|
" Detect file types
|
||||||
|
filetype indent plugin on
|
||||||
|
|
||||||
|
" Enable syntax highlighting
|
||||||
|
syntax on
|
||||||
|
|
||||||
|
" Colorscheme
|
||||||
|
colorscheme blackboard
|
||||||
|
|
||||||
|
" Font
|
||||||
|
set guifont=Input\ 18
|
||||||
|
|
||||||
|
" Other good font options:
|
||||||
|
" set guifont=Inconsolata\ LGC\ 18
|
||||||
|
" set guifont=Fira\ Code\ 18
|
||||||
|
|
||||||
|
" Remove toolbar
|
||||||
|
set guioptions-=T
|
||||||
|
|
||||||
|
" Don't force file saving on buffer changes
|
||||||
|
set hidden
|
||||||
|
|
||||||
|
" Better command-line completion
|
||||||
|
set wildmenu
|
||||||
|
|
||||||
|
" Show partial commands in the last line of the screen
|
||||||
|
set showcmd
|
||||||
|
|
||||||
|
" Highlight searches
|
||||||
|
set hlsearch
|
||||||
|
|
||||||
|
" Use case insensitive search, except when using capital letters
|
||||||
|
set ignorecase
|
||||||
|
set smartcase
|
||||||
|
|
||||||
|
" Allow backspacing over autoindent, line breaks and start of insert action
|
||||||
|
set backspace=indent,eol,start
|
||||||
|
|
||||||
|
" When opening a new line and no filetype-specific indenting is enabled, keep
|
||||||
|
" the same indent as the line you're currently on. Useful for READMEs, etc.
|
||||||
|
set autoindent
|
||||||
|
|
||||||
|
" Stop certain movements from always going to the first character of a line.
|
||||||
|
set nostartofline
|
||||||
|
|
||||||
|
" Display the cursor position on the last line of the screen or in the status
|
||||||
|
" line of a window
|
||||||
|
set ruler
|
||||||
|
|
||||||
|
" Always display the status line, even if only one window is displayed
|
||||||
|
set laststatus=2
|
||||||
|
|
||||||
|
" Instead of failing a command because of unsaved changes, instead raise a
|
||||||
|
" dialogue asking if you wish to save changed files.
|
||||||
|
set confirm
|
||||||
|
|
||||||
|
" Use visual bell instead of beeping when doing something wrong
|
||||||
|
set visualbell
|
||||||
|
|
||||||
|
" And reset the terminal code for the visual bell. If visualbell is set, and
|
||||||
|
" this line is also included, vim will neither flash nor beep. If visualbell
|
||||||
|
" is unset, this does nothing.
|
||||||
|
set t_vb=
|
||||||
|
|
||||||
|
" Enable use of the mouse for all modes
|
||||||
|
set mouse=a
|
||||||
|
|
||||||
|
" Set the command window height to 2 lines, to avoid many cases of having to
|
||||||
|
" "press <Enter> to continue"
|
||||||
|
" set cmdheight=2
|
||||||
|
|
||||||
|
" Display line numbers on the left
|
||||||
|
set number
|
||||||
|
|
||||||
|
" Quickly time out on keycodes, but never time out on mappings
|
||||||
|
set notimeout ttimeout ttimeoutlen=200
|
||||||
|
|
||||||
|
" Use <F11> to toggle between 'paste' and 'nopaste'
|
||||||
|
set pastetoggle=<F11>
|
||||||
|
|
||||||
|
" Indentation options
|
||||||
|
set shiftwidth=8
|
||||||
|
set tabstop=8
|
||||||
|
|
||||||
|
" 80 column rule
|
||||||
|
highlight OverLength ctermbg=darkred ctermfg=white guibg=#592929
|
||||||
|
match OverLength /\%81v.\+/
|
||||||
|
|
||||||
|
" Paste normally
|
||||||
|
set clipboard=unnamedplus
|
||||||
|
vmap <C-c> "+yi
|
||||||
|
vmap <C-x> "+c
|
||||||
|
vmap <C-v> c<ESC>"+p
|
||||||
|
imap <C-v> <C-r><C-o>+
|
||||||
|
|
||||||
|
function! SourceIfExists(file)
|
||||||
|
if filereadable(expand(a:file))
|
||||||
|
exe 'source' a:file
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Plugins
|
||||||
|
call SourceIfExists("~/.vim/plugins.vim")
|
|
@ -0,0 +1,10 @@
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
After cloning the repo and using stow to install vimplugins, make sure to
|
||||||
|
run `:PlugInstall` after launching vim.
|
||||||
|
|
||||||
|
## Plugins
|
||||||
|
|
||||||
|
Simply browse through the `plugged` directory or look at `plugins.vim`
|
||||||
|
to get the list of the installed plugins.
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 39f06b873a8449af8ff6a3eee716d3da14d63a76
|
|
@ -0,0 +1,3 @@
|
||||||
|
*.pyc
|
||||||
|
*.vba
|
||||||
|
tags
|
|
@ -0,0 +1,14 @@
|
||||||
|
SHELL=/bin/bash
|
||||||
|
|
||||||
|
all: dist
|
||||||
|
|
||||||
|
dist:
|
||||||
|
@vim -c 'r! git ls-files autoload bin doc plugin' \
|
||||||
|
-c '$$,$$d _' \
|
||||||
|
-c '%MkVimball! clang_complete.vba .' -c 'q!'
|
||||||
|
|
||||||
|
install: dist
|
||||||
|
@vim clang_complete.vba -c 'so %' -c 'q'
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@rm -f clang_complete.vba
|
|
@ -0,0 +1,15 @@
|
||||||
|
This plugin uses clang for accurately completing C and C++ code.
|
||||||
|
|
||||||
|
To build and install in one step, type:
|
||||||
|
$ make install
|
||||||
|
|
||||||
|
To build and install in two steps, type:
|
||||||
|
$ make
|
||||||
|
$ vim clang_complete.vba -c 'so %' -c 'q'
|
||||||
|
|
||||||
|
Alternatively, you can also put the files in ~/.vim/
|
||||||
|
|
||||||
|
You need Vim 7.3 or higher, compiled with python support and ideally, with
|
||||||
|
the conceal feature.
|
||||||
|
|
||||||
|
See doc/clang_complete.txt for help and license.
|
|
@ -0,0 +1,96 @@
|
||||||
|
" clang_complete clang_complete's snippet generator
|
||||||
|
" Author: Xavier Deguillard, Philippe Vaucher
|
||||||
|
|
||||||
|
function! snippets#clang_complete#init()
|
||||||
|
noremap <expr> <silent> <buffer> <tab> UpdateSnips()
|
||||||
|
snoremap <expr> <silent> <buffer> <tab> UpdateSnips()
|
||||||
|
syntax match Conceal /<#/ conceal
|
||||||
|
syntax match Conceal /#>/ conceal
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" fullname = strcat(char *dest, const char *src)
|
||||||
|
" args_pos = [ [8, 17], [20, 34] ]
|
||||||
|
function! snippets#clang_complete#add_snippet(fullname, args_pos)
|
||||||
|
let l:res = ''
|
||||||
|
let l:prev_idx = 0
|
||||||
|
for elt in a:args_pos
|
||||||
|
let l:res .= a:fullname[l:prev_idx : elt[0] - 1] . '<#' . a:fullname[elt[0] : elt[1] - 1] . '#>'
|
||||||
|
let l:prev_idx = elt[1]
|
||||||
|
endfor
|
||||||
|
|
||||||
|
let l:res .= a:fullname[l:prev_idx : ]
|
||||||
|
|
||||||
|
return l:res
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! snippets#clang_complete#trigger()
|
||||||
|
call s:BeginSnips()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! snippets#clang_complete#reset()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" ---------------- Helpers ----------------
|
||||||
|
|
||||||
|
function! UpdateSnips()
|
||||||
|
let l:line = getline('.')
|
||||||
|
let l:pattern = '<#[^#]*#>'
|
||||||
|
if match(l:line, l:pattern) == -1
|
||||||
|
return "\<c-i>"
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:commands = ""
|
||||||
|
if mode() != 'n'
|
||||||
|
let l:commands .= "\<esc>"
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:commands .= ":call MoveToCCSnippetBegin()\<CR>"
|
||||||
|
let l:commands .= "m'"
|
||||||
|
let l:commands .= ":call MoveToCCSnippetEnd()\<CR>"
|
||||||
|
|
||||||
|
if &selection == "exclusive"
|
||||||
|
let l:commands .= "ll"
|
||||||
|
else
|
||||||
|
let l:commands .= "l"
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:commands .= "v`'o\<C-G>"
|
||||||
|
|
||||||
|
return l:commands
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! MoveToCCSnippetBegin()
|
||||||
|
let l:pattern = '<#'
|
||||||
|
let l:line = getline('.')
|
||||||
|
let l:startpos = col('.') + 1
|
||||||
|
let l:ind = match(l:line, l:pattern, l:startpos)
|
||||||
|
if l:ind == -1
|
||||||
|
let l:ind = match(l:line, l:pattern, 0)
|
||||||
|
endif
|
||||||
|
call cursor(line('.'), l:ind + 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! MoveToCCSnippetEnd()
|
||||||
|
let l:line = getline('.')
|
||||||
|
let l:pattern = '#>'
|
||||||
|
let l:startpos = col('.') + 2
|
||||||
|
|
||||||
|
call cursor(line('.'), match(l:line, l:pattern, l:startpos) + 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:BeginSnips()
|
||||||
|
if pumvisible() != 0
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Do we need to launch UpdateSnippets()?
|
||||||
|
let l:line = getline('.')
|
||||||
|
let l:pattern = '<#[^#]*#>'
|
||||||
|
if match(l:line, l:pattern) == -1
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
call feedkeys("\<esc>^\<tab>")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim: set ts=2 sts=2 sw=2 expandtab :
|
|
@ -0,0 +1,24 @@
|
||||||
|
" Prepare the snippet engine
|
||||||
|
function! snippets#dummy#init()
|
||||||
|
echo 'Initializing stuffs'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Add a snippet to be triggered
|
||||||
|
" fullname: contain an unmangled name. ex: strcat(char *dest, const char *src)
|
||||||
|
" args_pos: contain the position of the argument in fullname. ex [ [8, 17], [20, 34] ]
|
||||||
|
" Returns: text to be inserted for when trigger() is called
|
||||||
|
function! snippets#dummy#add_snippet(fullname, args_pos)
|
||||||
|
echo 'Creating snippet for "' . a:fullname
|
||||||
|
return a:fullname
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Trigger the snippet
|
||||||
|
" Note: usually as simple as triggering the tab key
|
||||||
|
function! snippets#dummy#trigger()
|
||||||
|
echo 'Triggering snippet'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Remove all snippets
|
||||||
|
function! snippets#dummy#reset()
|
||||||
|
echo 'Resetting all snippets'
|
||||||
|
endfunction
|
|
@ -0,0 +1,50 @@
|
||||||
|
" clang_complete snipmate's snippet generator
|
||||||
|
" Author: Philippe Vaucher
|
||||||
|
|
||||||
|
function! snippets#snipmate#init()
|
||||||
|
call snippets#snipmate#reset()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" fullname = strcat(char *dest, const char *src)
|
||||||
|
" args_pos = [ [8, 17], [20, 34] ]
|
||||||
|
function! snippets#snipmate#add_snippet(fullname, args_pos)
|
||||||
|
" If we are already in a snipmate snippet, well not much we can do until snipmate supports nested snippets
|
||||||
|
if exists('g:snipPos')
|
||||||
|
return a:fullname
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:snip = ''
|
||||||
|
let l:prev_idx = 0
|
||||||
|
let l:snip_idx = 1
|
||||||
|
for elt in a:args_pos
|
||||||
|
let l:snip .= a:fullname[l:prev_idx : elt[0] - 1] . '${' . l:snip_idx . ':' . a:fullname[elt[0] : elt[1] - 1] . '}'
|
||||||
|
let l:snip_idx += 1
|
||||||
|
let l:prev_idx = elt[1]
|
||||||
|
endfor
|
||||||
|
|
||||||
|
let l:snip .= a:fullname[l:prev_idx : ] . '${' . l:snip_idx . '}'
|
||||||
|
|
||||||
|
let l:snippet_id = substitute(a:fullname, ' ', '_', 'g')
|
||||||
|
|
||||||
|
call MakeSnip(&filetype, l:snippet_id, l:snip)
|
||||||
|
|
||||||
|
return l:snippet_id
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! snippets#snipmate#trigger()
|
||||||
|
" If we are already in a snipmate snippet, well not much we can do until snipmate supports nested snippets
|
||||||
|
if exists('g:snipPos')
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Trigger snipmate
|
||||||
|
call feedkeys("\<Tab>", 't')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! snippets#snipmate#reset()
|
||||||
|
" Quick & Easy way to prevent snippets to be added twice
|
||||||
|
" Ideally we should modify snipmate to be smarter about this
|
||||||
|
call ReloadSnippets(&filetype)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim: set ts=2 sts=2 sw=2 expandtab :
|
|
@ -0,0 +1,37 @@
|
||||||
|
" clang_complete ultisnips's snippet generator
|
||||||
|
" Author: Philippe Vaucher
|
||||||
|
|
||||||
|
function! snippets#ultisnips#init()
|
||||||
|
call snippets#ultisnips#reset()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" fullname = strcat(char *dest, const char *src)
|
||||||
|
" args_pos = [ [8, 17], [20, 34] ]
|
||||||
|
function! snippets#ultisnips#add_snippet(fullname, args_pos)
|
||||||
|
let l:snip = ''
|
||||||
|
let l:prev_idx = 0
|
||||||
|
let l:snip_idx = 1
|
||||||
|
for elt in a:args_pos
|
||||||
|
let l:snip .= a:fullname[l:prev_idx : elt[0] - 1] . '${' . l:snip_idx . ':' . a:fullname[elt[0] : elt[1] - 1] . '}'
|
||||||
|
let l:snip_idx += 1
|
||||||
|
let l:prev_idx = elt[1]
|
||||||
|
endfor
|
||||||
|
|
||||||
|
let l:snip .= a:fullname[l:prev_idx : ] . '${' . l:snip_idx . '}'
|
||||||
|
|
||||||
|
let l:snippet_id = substitute(a:fullname, ' ', '_', 'g')
|
||||||
|
|
||||||
|
call UltiSnips_AddSnippet(l:snippet_id, l:snip, a:fullname, 'i', &filetype)
|
||||||
|
|
||||||
|
return l:snippet_id
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! snippets#ultisnips#trigger()
|
||||||
|
call UltiSnips_ExpandSnippet()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! snippets#ultisnips#reset()
|
||||||
|
python UltiSnips_Manager.reset()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim: set ts=2 sts=2 sw=2 expandtab :
|
|
@ -0,0 +1,84 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
#-*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
CONFIG_NAME = ".clang_complete"
|
||||||
|
|
||||||
|
def readConfiguration():
|
||||||
|
try:
|
||||||
|
f = open(CONFIG_NAME, "r")
|
||||||
|
except IOError:
|
||||||
|
return []
|
||||||
|
|
||||||
|
result = []
|
||||||
|
for line in f.readlines():
|
||||||
|
strippedLine = line.strip()
|
||||||
|
if len(strippedLine) > 0:
|
||||||
|
result += [strippedLine]
|
||||||
|
f.close()
|
||||||
|
return result
|
||||||
|
|
||||||
|
def writeConfiguration(lines):
|
||||||
|
f = open(CONFIG_NAME, "w")
|
||||||
|
f.writelines(lines)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
def parseArguments(arguments):
|
||||||
|
nextIsInclude = False
|
||||||
|
nextIsDefine = False
|
||||||
|
nextIsIncludeFile = False
|
||||||
|
|
||||||
|
includes = []
|
||||||
|
defines = []
|
||||||
|
include_file = []
|
||||||
|
|
||||||
|
for arg in arguments:
|
||||||
|
if nextIsInclude:
|
||||||
|
includes += [arg]
|
||||||
|
nextIsInclude = False
|
||||||
|
elif nextIsDefine:
|
||||||
|
defines += [arg]
|
||||||
|
nextIsDefine = False
|
||||||
|
elif nextIsIncludeFile:
|
||||||
|
include_file += [arg]
|
||||||
|
nextIsIncludeFile = False
|
||||||
|
elif arg == "-I":
|
||||||
|
nextIsInclude = True
|
||||||
|
elif arg == "-D":
|
||||||
|
nextIsDefine = True
|
||||||
|
elif arg[:2] == "-I":
|
||||||
|
includes += [arg[2:]]
|
||||||
|
elif arg[:2] == "-D":
|
||||||
|
defines += [arg[2:]]
|
||||||
|
elif arg == "-include":
|
||||||
|
nextIsIncludeFile = True
|
||||||
|
|
||||||
|
result = map(lambda x: "-I" + x, includes)
|
||||||
|
result += map(lambda x: "-D" + x, defines)
|
||||||
|
result += map(lambda x: "-include " + x, include_file)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def mergeLists(base, new):
|
||||||
|
result = list(base)
|
||||||
|
for newLine in new:
|
||||||
|
try:
|
||||||
|
result.index(newLine)
|
||||||
|
except ValueError:
|
||||||
|
result += [newLine]
|
||||||
|
return result
|
||||||
|
|
||||||
|
configuration = readConfiguration()
|
||||||
|
args = parseArguments(sys.argv)
|
||||||
|
result = mergeLists(configuration, args)
|
||||||
|
writeConfiguration(map(lambda x: x + "\n", result))
|
||||||
|
|
||||||
|
|
||||||
|
status = os.system(" ".join(sys.argv[1:]))
|
||||||
|
if not os.WIFEXITED(status):
|
||||||
|
sys.exit(1)
|
||||||
|
sys.exit(os.WEXITSTATUS(status))
|
||||||
|
|
||||||
|
# vim: set ts=2 sts=2 sw=2 expandtab :
|
|
@ -0,0 +1,257 @@
|
||||||
|
*clang_complete.txt* For Vim version 7.3. Last change: 2011 Jun 04
|
||||||
|
|
||||||
|
|
||||||
|
clang_complete plugin documentation
|
||||||
|
|
||||||
|
|
||||||
|
clang_complete plugin *clang_complete*
|
||||||
|
|
||||||
|
1. Description |clang_complete-description|
|
||||||
|
2. Completion kinds |clang_complete-compl_kinds|
|
||||||
|
3. Configuration |clang_complete-configuration|
|
||||||
|
4. Options |clang_complete-options|
|
||||||
|
5. Known issues |clang_complete-issues|
|
||||||
|
6. PCH |clang_complete-pch|
|
||||||
|
7. cc_args.py script |clang_complete-cc_args|
|
||||||
|
8. To do |clang_complete-todo|
|
||||||
|
9. License |clang_complete-license|
|
||||||
|
|
||||||
|
Author: Xavier Deguillard <deguilx@gmail.com> *clang_complete-author*
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
1. Description *clang_complete-description*
|
||||||
|
|
||||||
|
This plugin use clang for accurately completing C and C++ code.
|
||||||
|
|
||||||
|
Note: This plugin is incompatible with omnicppcomplete due to the
|
||||||
|
unconditionnaly set mapping done by omnicppcomplete. So don't forget to
|
||||||
|
suppress it before using this plugin.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
2. Completion kinds *clang_complete-compl_kinds*
|
||||||
|
|
||||||
|
Because libclang provides a lot of information about completion, there are
|
||||||
|
some additional kinds of completion along with standard ones (see >
|
||||||
|
:help complete-items
|
||||||
|
for details):
|
||||||
|
'+' - constructor
|
||||||
|
'~' - destructor
|
||||||
|
'e' - enumerator constant
|
||||||
|
'a' - parameter ('a' from "argument") of a function, method or template
|
||||||
|
'u' - unknown or buildin type (int, float, ...)
|
||||||
|
'n' - namespace or its alias
|
||||||
|
'p' - template ('p' from "pattern")
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
3. Configuration *clang_complete-configuration*
|
||||||
|
|
||||||
|
Each project can have a .clang_complete at his root, containing the compiler
|
||||||
|
options. This is useful if you're using some non-standard include paths. For
|
||||||
|
simplicity, please don't put relative and absolute include path on the same
|
||||||
|
line. It is not currently correctly handled.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
4. Options *clang_complete-options*
|
||||||
|
|
||||||
|
*clang_complete-auto_select*
|
||||||
|
*g:clang_auto_select*
|
||||||
|
If equal to 0, nothing is selected.
|
||||||
|
If equal to 1, automatically select the first entry in the popup menu, but
|
||||||
|
without inserting it into the code.
|
||||||
|
If equal to 2, automatically select the first entry in the popup menu, and
|
||||||
|
insert it into the code.
|
||||||
|
Default: 0
|
||||||
|
|
||||||
|
*clang_complete-complete_auto*
|
||||||
|
*g:clang_complete_auto*
|
||||||
|
If equal to 1, automatically complete after ->, ., ::
|
||||||
|
Default: 1
|
||||||
|
|
||||||
|
*clang_complete-copen*
|
||||||
|
*g:clang_complete_copen*
|
||||||
|
If equal to 1, open quickfix window on error.
|
||||||
|
Default: 0
|
||||||
|
|
||||||
|
*clang_complete-hl_errors*
|
||||||
|
*g:clang_hl_errors*
|
||||||
|
If equal to 1, it will highlight the warnings and errors the same way clang
|
||||||
|
does it.
|
||||||
|
Default: 1
|
||||||
|
|
||||||
|
*clang_complete-periodic_quickfix*
|
||||||
|
*g:clang_periodic_quickfix*
|
||||||
|
If equal to 1, it will periodically update the quickfix window.
|
||||||
|
Default: 0
|
||||||
|
Note: You could use the g:ClangUpdateQuickFix() to do the same with a mapping.
|
||||||
|
|
||||||
|
*clang_complete-snippets*
|
||||||
|
*g:clang_snippets*
|
||||||
|
If equal to 1, it will do some snippets magic after a ( or a , inside function
|
||||||
|
call. Not currently fully working.
|
||||||
|
Default: 0
|
||||||
|
|
||||||
|
*clang_complete-snippets_engine*
|
||||||
|
*g:clang_snippets_engine*
|
||||||
|
The snippets engine (clang_complete, snipmate, ultisnips... see the snippets
|
||||||
|
subdirectory).
|
||||||
|
Default: "clang_complete"
|
||||||
|
|
||||||
|
*clang_complete-conceal_snippets*
|
||||||
|
*g:clang_conceal_snippets*
|
||||||
|
If equal to 1, vim will use vim 7.3 conceal feature to hide <# and #> which
|
||||||
|
delimit a snippets.
|
||||||
|
Default: 1 (0 if conceal not available)
|
||||||
|
Note: See concealcursor and conceallevel for conceal configuration.
|
||||||
|
|
||||||
|
*clang_complete-exec*
|
||||||
|
*g:clang_exec*
|
||||||
|
Name or path of clang executable.
|
||||||
|
Note: Use this if clang has a non-standard name, or isn't in the path.
|
||||||
|
Default: "clang"
|
||||||
|
|
||||||
|
*clang_complete-user_options*
|
||||||
|
*g:clang_user_options*
|
||||||
|
Option added at the end of clang command. Useful if you want to filter the
|
||||||
|
result, or do other stuffs. To ignore the error code returned by clang, set
|
||||||
|
|g:clang_exec| to `"clang` and |g:clang_user_options| to `2>/dev/null || exit
|
||||||
|
0"` if you're on *nix, or `2>NUL || exit 0"` if you are on windows.
|
||||||
|
Default: ""
|
||||||
|
|
||||||
|
*clang_complete-auto_user_options*
|
||||||
|
*g:clang_auto_user_options*
|
||||||
|
Set sources for user options passed to clang. Available sources are:
|
||||||
|
- path - use &path content as list of include directories (relative paths are
|
||||||
|
ignored)
|
||||||
|
- .clang_complete - use information from .clang_complete file Multiple options
|
||||||
|
are separated by comma.
|
||||||
|
Default: "path, .clang_complete"
|
||||||
|
|
||||||
|
*clang_complete-use_library*
|
||||||
|
*g:clang_use_library*
|
||||||
|
Instead of calling the clang/clang++ tool use libclang directly. This gives
|
||||||
|
access to many more clang features. Furthermore it automatically caches all
|
||||||
|
includes in memory. Updates after changes in the same file will therefore be a
|
||||||
|
lot faster.
|
||||||
|
Default: 0
|
||||||
|
|
||||||
|
*clang_complete-library_path*
|
||||||
|
*g:clang_library_path*
|
||||||
|
If libclang.[dll/so/dylib] is not in your library search path, set this to the
|
||||||
|
absolute path where libclang is available.
|
||||||
|
Default: ""
|
||||||
|
|
||||||
|
*clang_complete-sort_algo*
|
||||||
|
*g:clang_sort_algo*
|
||||||
|
How results are sorted (alpha, priority). Currently only works with libclang.
|
||||||
|
Default: "priority"
|
||||||
|
|
||||||
|
*clang_complete-complete_macros*
|
||||||
|
*g:clang_complete_macros*
|
||||||
|
If clang should complete preprocessor macros and constants.
|
||||||
|
Default: 0
|
||||||
|
|
||||||
|
*clang_complete-complete_patterns*
|
||||||
|
*g:clang_complete_patterns*
|
||||||
|
If clang should complete code patterns, i.e loop constructs etc.
|
||||||
|
Defaut: 0
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
5. Known issues *clang_complete-issues*
|
||||||
|
|
||||||
|
If you find that completion is slow, please read the |clang_complete-pch|
|
||||||
|
section below.
|
||||||
|
|
||||||
|
If you get following error message while trying to complete anything: >
|
||||||
|
E121: Undefined variable: b:should_overload
|
||||||
|
it means that your version of Vim is too old (this is an old bug and it has
|
||||||
|
been fixed with one of patches for Vim 7.2) and you need to update it.
|
||||||
|
|
||||||
|
If clang is not able to compile your file, it cannot complete anything. Since
|
||||||
|
clang is not supporting every C++0x features, this is normal if it can do any
|
||||||
|
completion on C++0x file.
|
||||||
|
|
||||||
|
There is no difference in clang's output between private methods/members and
|
||||||
|
public ones. Which means that I cannot filter private methods on the
|
||||||
|
completion list.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
6. PCH *clang_complete-pch*
|
||||||
|
|
||||||
|
In case you can not or you do not want to install libclang, a precompiled
|
||||||
|
header file is another way to accelerate compilation, and so, to accelerate
|
||||||
|
the completion. It is however more complicated to install and is still slower
|
||||||
|
than the use of libclang.
|
||||||
|
|
||||||
|
Here is how to create the <vector> pch, on linux (OSX users may use
|
||||||
|
-fnext-runtime instead of -fgnu-runtime): >
|
||||||
|
clang -x c++-header /path/to/c++/vector -fno-exceptions -fgnu-runtime \
|
||||||
|
-o vector.pch
|
||||||
|
You just have to insert it into your .clang_complete: >
|
||||||
|
echo '-include-pch /path/to/vector.pch -fgnu-runtime' >> .clang_complete
|
||||||
|
<
|
||||||
|
One of the major problem is that you cannot include more that one pch, the
|
||||||
|
solution is to put the system headers or non changing headers into another
|
||||||
|
header and then compile it to pch: >
|
||||||
|
echo '#include <iostream>\n#include <vector>' > pchheader.h
|
||||||
|
clang -x c++-header ./pchheader.h -fno-exceptions -fnu-runtime \
|
||||||
|
-o ./pchheader.pch
|
||||||
|
And then add it to the .clang_complete file.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
7. cc_args.py script *clang_complete-cc_args*
|
||||||
|
|
||||||
|
This script, installed at ~/.vim/bin/cc_args.py, could be used to generate or
|
||||||
|
update the .clang_complete file. It works similar to gccsence's gccrec and
|
||||||
|
simply stores -I and -D arguments passed to the compiler in the
|
||||||
|
.clang_complete file. Just add the cc_args.py script as the first argument of
|
||||||
|
the compile command. You should do that every time compile options have
|
||||||
|
changed.
|
||||||
|
|
||||||
|
Example (we need -B flag to force compiling even if project is up to date): >
|
||||||
|
make CC='~/.vim/bin/cc_args.py gcc' CXX='~/.vim/bin/cc_args.py g++' -B
|
||||||
|
After running this command, .clang_complete will be created or updated with
|
||||||
|
new options. If you don't want to update an existing configuration file,
|
||||||
|
delete it before running make.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
8. To do *clang_complete-todo*
|
||||||
|
|
||||||
|
- Write some unit tests
|
||||||
|
- clang vs libclang accuracy for complex completions
|
||||||
|
- clang vs libclang timing
|
||||||
|
- Explore "jump to declaration/definition" with libclang FGJ
|
||||||
|
- Think about supertab (<C-X><C-U> with supertab and clang_auto_select)
|
||||||
|
- Parse fix-its and do something useful with it
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
9. License *clang_complete-license*
|
||||||
|
|
||||||
|
Copyright (c) 2010, 2011, Xavier Deguillard
|
||||||
|
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 Xavier Deguillard 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 XAVIER DEGUILLARD 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.
|
||||||
|
|
||||||
|
Note: This license does not cover the files that come from the LLVM project,
|
||||||
|
namely, cindex.py and __init__.py, which are covered by the LLVM license.
|
||||||
|
|
||||||
|
vim:tw=78:ts=8:ft=help:norl:
|
|
@ -0,0 +1,24 @@
|
||||||
|
#===- __init__.py - Clang Python Bindings --------------------*- python -*--===#
|
||||||
|
#
|
||||||
|
# The LLVM Compiler Infrastructure
|
||||||
|
#
|
||||||
|
# This file is distributed under the University of Illinois Open Source
|
||||||
|
# License. See LICENSE.TXT for details.
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
r"""
|
||||||
|
Clang Library Bindings
|
||||||
|
======================
|
||||||
|
|
||||||
|
This package provides access to the Clang compiler and libraries.
|
||||||
|
|
||||||
|
The available modules are:
|
||||||
|
|
||||||
|
cindex
|
||||||
|
|
||||||
|
Bindings for the Clang indexing library.
|
||||||
|
"""
|
||||||
|
|
||||||
|
__all__ = ['cindex']
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,668 @@
|
||||||
|
"
|
||||||
|
" File: clang_complete.vim
|
||||||
|
" Author: Xavier Deguillard <deguilx@gmail.com>
|
||||||
|
"
|
||||||
|
" Description: Use of clang to complete in C/C++.
|
||||||
|
"
|
||||||
|
" Help: Use :help clang_complete
|
||||||
|
"
|
||||||
|
|
||||||
|
au FileType c,cpp,objc,objcpp call <SID>ClangCompleteInit()
|
||||||
|
|
||||||
|
let b:clang_parameters = ''
|
||||||
|
let b:clang_user_options = ''
|
||||||
|
let b:my_changedtick = 0
|
||||||
|
|
||||||
|
" Store plugin path, as this is available only when sourcing the file,
|
||||||
|
" not during a function call.
|
||||||
|
let s:plugin_path = escape(expand('<sfile>:p:h'), '\')
|
||||||
|
|
||||||
|
function! s:ClangCompleteInit()
|
||||||
|
if !exists('g:clang_auto_select')
|
||||||
|
let g:clang_auto_select = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_complete_auto')
|
||||||
|
let g:clang_complete_auto = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_complete_copen')
|
||||||
|
let g:clang_complete_copen = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_hl_errors')
|
||||||
|
let g:clang_hl_errors = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_periodic_quickfix')
|
||||||
|
let g:clang_periodic_quickfix = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_snippets')
|
||||||
|
let g:clang_snippets = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_snippets_engine')
|
||||||
|
let g:clang_snippets_engine = 'clang_complete'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_exec')
|
||||||
|
let g:clang_exec = 'clang'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_user_options')
|
||||||
|
let g:clang_user_options = ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Only use libclang if the user clearly show intent to do so for now
|
||||||
|
if !exists('g:clang_use_library')
|
||||||
|
let g:clang_use_library = (has('python') && exists('g:clang_library_path'))
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_complete_macros')
|
||||||
|
let g:clang_complete_macros = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_complete_patterns')
|
||||||
|
let g:clang_complete_patterns = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_debug')
|
||||||
|
let g:clang_debug = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_sort_algo')
|
||||||
|
let g:clang_sort_algo = 'priority'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:clang_auto_user_options')
|
||||||
|
let g:clang_auto_user_options = 'path, .clang_complete'
|
||||||
|
endif
|
||||||
|
|
||||||
|
call LoadUserOptions()
|
||||||
|
|
||||||
|
inoremap <expr> <buffer> <C-X><C-U> <SID>LaunchCompletion()
|
||||||
|
inoremap <expr> <buffer> . <SID>CompleteDot()
|
||||||
|
inoremap <expr> <buffer> > <SID>CompleteArrow()
|
||||||
|
inoremap <expr> <buffer> : <SID>CompleteColon()
|
||||||
|
inoremap <expr> <buffer> <CR> <SID>HandlePossibleSelectionEnter()
|
||||||
|
|
||||||
|
if g:clang_snippets == 1
|
||||||
|
call g:ClangSetSnippetEngine(g:clang_snippets_engine)
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Force menuone. Without it, when there's only one completion result,
|
||||||
|
" it can be confusing (not completing and no popup)
|
||||||
|
if g:clang_auto_select != 2
|
||||||
|
set completeopt-=menu
|
||||||
|
set completeopt+=menuone
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Disable every autocmd that could have been set.
|
||||||
|
augroup ClangComplete
|
||||||
|
autocmd!
|
||||||
|
augroup end
|
||||||
|
|
||||||
|
let b:should_overload = 0
|
||||||
|
let b:my_changedtick = b:changedtick
|
||||||
|
let b:clang_parameters = '-x c'
|
||||||
|
|
||||||
|
if &filetype == 'objc'
|
||||||
|
let b:clang_parameters = '-x objective-c'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if &filetype == 'cpp' || &filetype == 'objcpp'
|
||||||
|
let b:clang_parameters .= '++'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if expand('%:e') =~ 'h*'
|
||||||
|
let b:clang_parameters .= '-header'
|
||||||
|
endif
|
||||||
|
|
||||||
|
let g:clang_complete_lib_flags = 0
|
||||||
|
|
||||||
|
if g:clang_complete_macros == 1
|
||||||
|
let b:clang_parameters .= ' -code-completion-macros'
|
||||||
|
let g:clang_complete_lib_flags = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
if g:clang_complete_patterns == 1
|
||||||
|
let b:clang_parameters .= ' -code-completion-patterns'
|
||||||
|
let g:clang_complete_lib_flags += 2
|
||||||
|
endif
|
||||||
|
|
||||||
|
setlocal completefunc=ClangComplete
|
||||||
|
setlocal omnifunc=ClangComplete
|
||||||
|
|
||||||
|
if g:clang_periodic_quickfix == 1
|
||||||
|
augroup ClangComplete
|
||||||
|
au CursorHold,CursorHoldI <buffer> call <SID>DoPeriodicQuickFix()
|
||||||
|
augroup end
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Load the python bindings of libclang
|
||||||
|
if g:clang_use_library == 1
|
||||||
|
if has('python')
|
||||||
|
exe s:initClangCompletePython()
|
||||||
|
else
|
||||||
|
echoe 'clang_complete: No python support available.'
|
||||||
|
echoe 'Cannot use clang library, using executable'
|
||||||
|
echoe 'Compile vim with python support to use libclang'
|
||||||
|
let g:clang_use_library = 0
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! LoadUserOptions()
|
||||||
|
let b:clang_user_options = ''
|
||||||
|
|
||||||
|
let l:option_sources = split(g:clang_auto_user_options, ',')
|
||||||
|
let l:remove_spaces_cmd = 'substitute(v:val, "\\s*\\(.*\\)\\s*", "\\1", "")'
|
||||||
|
let l:option_sources = map(l:option_sources, l:remove_spaces_cmd)
|
||||||
|
|
||||||
|
for l:source in l:option_sources
|
||||||
|
if l:source == 'path'
|
||||||
|
call s:parsePathOption()
|
||||||
|
elseif l:source == '.clang_complete'
|
||||||
|
call s:parseConfig()
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:parseConfig()
|
||||||
|
let l:local_conf = findfile('.clang_complete', getcwd() . ',.;')
|
||||||
|
if l:local_conf == '' || !filereadable(l:local_conf)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:opts = readfile(l:local_conf)
|
||||||
|
for l:opt in l:opts
|
||||||
|
" Better handling of absolute path
|
||||||
|
" I don't know if those pattern will work on windows
|
||||||
|
" platform
|
||||||
|
if matchstr(l:opt, '\C-I\s*/') != ''
|
||||||
|
let l:opt = substitute(l:opt, '\C-I\s*\(/\%(\w\|\\\s\)*\)',
|
||||||
|
\ '-I' . '\1', 'g')
|
||||||
|
else
|
||||||
|
let l:opt = substitute(l:opt, '\C-I\s*\(\%(\w\|\\\s\)*\)',
|
||||||
|
\ '-I' . l:local_conf[:-16] . '\1', 'g')
|
||||||
|
endif
|
||||||
|
let b:clang_user_options .= ' ' . l:opt
|
||||||
|
endfor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:parsePathOption()
|
||||||
|
let l:dirs = split(&path, ',')
|
||||||
|
for l:dir in l:dirs
|
||||||
|
if len(l:dir) == 0 || !isdirectory(l:dir)
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Add only absolute paths
|
||||||
|
if matchstr(l:dir, '\s*/') != ''
|
||||||
|
let l:opt = '-I' . l:dir
|
||||||
|
let b:clang_user_options .= ' ' . l:opt
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:initClangCompletePython()
|
||||||
|
" Only parse the python library once
|
||||||
|
if !exists('s:libclang_loaded')
|
||||||
|
python import sys
|
||||||
|
if exists('g:clang_library_path')
|
||||||
|
" Load the library from the given library path.
|
||||||
|
exe 'python sys.argv = ["' . escape(g:clang_library_path, '\') . '"]'
|
||||||
|
else
|
||||||
|
" By setting argv[0] to '' force the python bindings to load the library
|
||||||
|
" from the normal system search path.
|
||||||
|
python sys.argv[0] = ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
exe 'python sys.path = ["' . s:plugin_path . '"] + sys.path'
|
||||||
|
exe 'pyfile ' . s:plugin_path . '/libclang.py'
|
||||||
|
python initClangComplete(vim.eval('g:clang_complete_lib_flags'))
|
||||||
|
let s:libclang_loaded = 1
|
||||||
|
endif
|
||||||
|
python WarmupCache()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:GetKind(proto)
|
||||||
|
if a:proto == ''
|
||||||
|
return 't'
|
||||||
|
endif
|
||||||
|
let l:ret = match(a:proto, '^\[#')
|
||||||
|
let l:params = match(a:proto, '(')
|
||||||
|
if l:ret == -1 && l:params == -1
|
||||||
|
return 't'
|
||||||
|
endif
|
||||||
|
if l:ret != -1 && l:params == -1
|
||||||
|
return 'v'
|
||||||
|
endif
|
||||||
|
if l:params != -1
|
||||||
|
return 'f'
|
||||||
|
endif
|
||||||
|
return 'm'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:CallClangBinaryForDiagnostics(tempfile)
|
||||||
|
let l:escaped_tempfile = shellescape(a:tempfile)
|
||||||
|
let l:buf = getline(1, '$')
|
||||||
|
try
|
||||||
|
call writefile(l:buf, a:tempfile)
|
||||||
|
catch /^Vim\%((\a\+)\)\=:E482/
|
||||||
|
return
|
||||||
|
endtry
|
||||||
|
|
||||||
|
let l:command = g:clang_exec . ' -cc1 -fsyntax-only'
|
||||||
|
\ . ' -fno-caret-diagnostics -fdiagnostics-print-source-range-info'
|
||||||
|
\ . ' ' . l:escaped_tempfile
|
||||||
|
\ . ' ' . b:clang_parameters . ' ' . b:clang_user_options . ' ' . g:clang_user_options
|
||||||
|
|
||||||
|
let l:clang_output = split(system(l:command), "\n")
|
||||||
|
call delete(a:tempfile)
|
||||||
|
return l:clang_output
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:CallClangForDiagnostics(tempfile)
|
||||||
|
if g:clang_use_library == 1
|
||||||
|
python updateCurrentDiagnostics()
|
||||||
|
else
|
||||||
|
return s:CallClangBinaryForDiagnostics(a:tempfile)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:DoPeriodicQuickFix()
|
||||||
|
" Don't do any superfluous reparsing.
|
||||||
|
if b:my_changedtick == b:changedtick
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let b:my_changedtick = b:changedtick
|
||||||
|
|
||||||
|
" Create tempfile name for clang/clang++ executable mode
|
||||||
|
let b:my_changedtick = b:changedtick
|
||||||
|
let l:tempfile = expand('%:p:h') . '/' . localtime() . expand('%:t')
|
||||||
|
|
||||||
|
let l:clang_output = s:CallClangForDiagnostics(l:tempfile)
|
||||||
|
|
||||||
|
call s:ClangQuickFix(l:clang_output, l:tempfile)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:ClangQuickFix(clang_output, tempfname)
|
||||||
|
" Clear the bad spell, the user may have corrected them.
|
||||||
|
syntax clear SpellBad
|
||||||
|
syntax clear SpellLocal
|
||||||
|
|
||||||
|
if g:clang_use_library == 0
|
||||||
|
let l:list = s:ClangUpdateQuickFix(a:clang_output, a:tempfname)
|
||||||
|
else
|
||||||
|
python vim.command('let l:list = ' + str(getCurrentQuickFixList()))
|
||||||
|
python highlightCurrentDiagnostics()
|
||||||
|
endif
|
||||||
|
|
||||||
|
if g:clang_complete_copen == 1
|
||||||
|
" We should get back to the original buffer
|
||||||
|
let l:bufnr = bufnr('%')
|
||||||
|
|
||||||
|
" Workaround:
|
||||||
|
" http://vim.1045645.n5.nabble.com/setqflist-inconsistency-td1211423.html
|
||||||
|
if l:list == []
|
||||||
|
cclose
|
||||||
|
else
|
||||||
|
copen
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:winbufnr = bufwinnr(l:bufnr)
|
||||||
|
exe l:winbufnr . 'wincmd w'
|
||||||
|
endif
|
||||||
|
call setqflist(l:list)
|
||||||
|
silent doautocmd QuickFixCmdPost make
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:ClangUpdateQuickFix(clang_output, tempfname)
|
||||||
|
let l:list = []
|
||||||
|
for l:line in a:clang_output
|
||||||
|
let l:erridx = match(l:line, '\%(error\|warning\|note\): ')
|
||||||
|
if l:erridx == -1
|
||||||
|
" Error are always at the beginning.
|
||||||
|
if l:line[:11] == 'COMPLETION: ' || l:line[:9] == 'OVERLOAD: '
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
let l:pattern = '^\(.*\):\(\d*\):\(\d*\):\(\%({\d\+:\d\+-\d\+:\d\+}\)*\)'
|
||||||
|
let l:tmp = matchstr(l:line, l:pattern)
|
||||||
|
let l:fname = substitute(l:tmp, l:pattern, '\1', '')
|
||||||
|
if l:fname == a:tempfname
|
||||||
|
let l:fname = '%'
|
||||||
|
endif
|
||||||
|
let l:bufnr = bufnr(l:fname, 1)
|
||||||
|
let l:lnum = substitute(l:tmp, l:pattern, '\2', '')
|
||||||
|
let l:col = substitute(l:tmp, l:pattern, '\3', '')
|
||||||
|
let l:errors = substitute(l:tmp, l:pattern, '\4', '')
|
||||||
|
if l:line[l:erridx] == 'e'
|
||||||
|
let l:text = l:line[l:erridx + 7:]
|
||||||
|
let l:type = 'E'
|
||||||
|
let l:hlgroup = ' SpellBad '
|
||||||
|
elseif l:line[l:erridx] == 'w'
|
||||||
|
let l:text = l:line[l:erridx + 9:]
|
||||||
|
let l:type = 'W'
|
||||||
|
let l:hlgroup = ' SpellLocal '
|
||||||
|
else
|
||||||
|
let l:text = l:line[l:erridx + 6:]
|
||||||
|
let l:type = 'I'
|
||||||
|
let l:hlgroup = ' '
|
||||||
|
endif
|
||||||
|
let l:item = {
|
||||||
|
\ 'bufnr': l:bufnr,
|
||||||
|
\ 'lnum': l:lnum,
|
||||||
|
\ 'col': l:col,
|
||||||
|
\ 'text': l:text,
|
||||||
|
\ 'type': l:type }
|
||||||
|
let l:list = add(l:list, l:item)
|
||||||
|
|
||||||
|
if g:clang_hl_errors == 0 || l:fname != '%' || l:type == 'I'
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Highlighting the ^
|
||||||
|
let l:pat = '/\%' . l:lnum . 'l' . '\%' . l:col . 'c./'
|
||||||
|
exe 'syntax match' . l:hlgroup . l:pat
|
||||||
|
|
||||||
|
if l:errors == ''
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
let l:ranges = split(l:errors, '}')
|
||||||
|
for l:range in l:ranges
|
||||||
|
" Doing precise error and warning handling.
|
||||||
|
" The highlight will be the same as clang's carets.
|
||||||
|
let l:pattern = '{\%(\d\+\):\(\d\+\)-\%(\d\+\):\(\d\+\)'
|
||||||
|
let l:tmp = matchstr(l:range, l:pattern)
|
||||||
|
let l:startcol = substitute(l:tmp, l:pattern, '\1', '')
|
||||||
|
let l:endcol = substitute(l:tmp, l:pattern, '\2', '')
|
||||||
|
" Highlighting the ~~~~
|
||||||
|
let l:pat = '/\%' . l:lnum . 'l'
|
||||||
|
\ . '\%' . l:startcol . 'c'
|
||||||
|
\ . '.*'
|
||||||
|
\ . '\%' . l:endcol . 'c/'
|
||||||
|
exe 'syntax match' . l:hlgroup . l:pat
|
||||||
|
endfor
|
||||||
|
endfor
|
||||||
|
return l:list
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:DemangleProto(prototype)
|
||||||
|
let l:proto = substitute(a:prototype, '\[#[^#]*#\]', '', 'g')
|
||||||
|
let l:proto = substitute(l:proto, '{#.*#}', '', 'g')
|
||||||
|
return l:proto
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let b:col = 0
|
||||||
|
|
||||||
|
function! s:ClangCompleteBinary(base)
|
||||||
|
let l:buf = getline(1, '$')
|
||||||
|
let l:tempfile = expand('%:p:h') . '/' . localtime() . expand('%:t')
|
||||||
|
try
|
||||||
|
call writefile(l:buf, l:tempfile)
|
||||||
|
catch /^Vim\%((\a\+)\)\=:E482/
|
||||||
|
return {}
|
||||||
|
endtry
|
||||||
|
let l:escaped_tempfile = shellescape(l:tempfile)
|
||||||
|
|
||||||
|
let l:command = g:clang_exec . ' -cc1 -fsyntax-only'
|
||||||
|
\ . ' -fno-caret-diagnostics -fdiagnostics-print-source-range-info'
|
||||||
|
\ . ' -code-completion-at=' . l:escaped_tempfile . ':'
|
||||||
|
\ . line('.') . ':' . b:col . ' ' . l:escaped_tempfile
|
||||||
|
\ . ' ' . b:clang_parameters . ' ' . b:clang_user_options . ' ' . g:clang_user_options
|
||||||
|
let l:clang_output = split(system(l:command), "\n")
|
||||||
|
call delete(l:tempfile)
|
||||||
|
|
||||||
|
call s:ClangQuickFix(l:clang_output, l:tempfile)
|
||||||
|
if v:shell_error
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
if l:clang_output == []
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:filter_str = "v:val =~ '^COMPLETION: " . a:base . "\\|^OVERLOAD: '"
|
||||||
|
call filter(l:clang_output, l:filter_str)
|
||||||
|
|
||||||
|
let l:res = []
|
||||||
|
for l:line in l:clang_output
|
||||||
|
|
||||||
|
if l:line[:11] == 'COMPLETION: ' && b:should_overload != 1
|
||||||
|
|
||||||
|
let l:value = l:line[12:]
|
||||||
|
|
||||||
|
let l:colonidx = stridx(l:value, ' : ')
|
||||||
|
if l:colonidx == -1
|
||||||
|
let l:wabbr = s:DemangleProto(l:value)
|
||||||
|
let l:word = l:value
|
||||||
|
let l:proto = l:value
|
||||||
|
else
|
||||||
|
let l:word = l:value[:l:colonidx - 1]
|
||||||
|
" WTF is that?
|
||||||
|
if l:word =~ '(Hidden)'
|
||||||
|
let l:word = l:word[:-10]
|
||||||
|
endif
|
||||||
|
let l:wabbr = l:word
|
||||||
|
let l:proto = l:value[l:colonidx + 3:]
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:kind = s:GetKind(l:proto)
|
||||||
|
if l:kind == 't' && b:clang_complete_type == 0
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:word = l:wabbr
|
||||||
|
|
||||||
|
let l:proto = s:DemangleProto(l:proto)
|
||||||
|
|
||||||
|
elseif l:line[:9] == 'OVERLOAD: ' && b:should_overload == 1
|
||||||
|
|
||||||
|
let l:value = l:line[10:]
|
||||||
|
if match(l:value, '<#') == -1
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
let l:word = substitute(l:value, '.*<#', '<#', 'g')
|
||||||
|
let l:word = substitute(l:word, '#>.*', '#>', 'g')
|
||||||
|
let l:wabbr = substitute(l:word, '<#\([^#]*\)#>', '\1', 'g')
|
||||||
|
let l:proto = l:value
|
||||||
|
let l:proto = s:DemangleProto(l:value)
|
||||||
|
let l:kind = ''
|
||||||
|
else
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:args_pos = []
|
||||||
|
if g:clang_snippets == 1
|
||||||
|
let l:startidx = match(l:proto, '<#')
|
||||||
|
while l:startidx != -1
|
||||||
|
let l:proto = substitute(l:proto, '<#', '', '')
|
||||||
|
let l:endidx = match(l:proto, '#>')
|
||||||
|
let l:proto = substitute(l:proto, '#>', '', '')
|
||||||
|
let l:args_pos += [[ l:startidx, l:endidx ]]
|
||||||
|
let l:startidx = match(l:proto, '<#')
|
||||||
|
endwhile
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:item = {
|
||||||
|
\ 'word': l:word,
|
||||||
|
\ 'abbr': l:wabbr,
|
||||||
|
\ 'menu': l:proto,
|
||||||
|
\ 'info': l:proto,
|
||||||
|
\ 'dup': 0,
|
||||||
|
\ 'kind': l:kind,
|
||||||
|
\ 'args_pos': l:args_pos }
|
||||||
|
|
||||||
|
call add(l:res, l:item)
|
||||||
|
endfor
|
||||||
|
return l:res
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ClangComplete(findstart, base)
|
||||||
|
if a:findstart
|
||||||
|
let l:line = getline('.')
|
||||||
|
let l:start = col('.') - 1
|
||||||
|
let b:clang_complete_type = 1
|
||||||
|
let l:wsstart = l:start
|
||||||
|
if l:line[l:wsstart - 1] =~ '\s'
|
||||||
|
while l:wsstart > 0 && l:line[l:wsstart - 1] =~ '\s'
|
||||||
|
let l:wsstart -= 1
|
||||||
|
endwhile
|
||||||
|
endif
|
||||||
|
if l:line[l:wsstart - 1] =~ '[(,]'
|
||||||
|
let b:should_overload = 1
|
||||||
|
let b:col = l:wsstart + 1
|
||||||
|
return l:wsstart
|
||||||
|
endif
|
||||||
|
let b:should_overload = 0
|
||||||
|
while l:start > 0 && l:line[l:start - 1] =~ '\i'
|
||||||
|
let l:start -= 1
|
||||||
|
endwhile
|
||||||
|
if l:line[l:start - 2:] =~ '->' || l:line[l:start - 1] == '.'
|
||||||
|
let b:clang_complete_type = 0
|
||||||
|
endif
|
||||||
|
let b:col = l:start + 1
|
||||||
|
return l:start
|
||||||
|
else
|
||||||
|
if g:clang_debug == 1
|
||||||
|
let l:time_start = reltime()
|
||||||
|
endif
|
||||||
|
|
||||||
|
if g:clang_snippets == 1
|
||||||
|
call b:ResetSnip()
|
||||||
|
endif
|
||||||
|
|
||||||
|
if g:clang_use_library == 1
|
||||||
|
python vim.command('let l:res = ' + str(getCurrentCompletions(vim.eval('a:base'))))
|
||||||
|
else
|
||||||
|
let l:res = s:ClangCompleteBinary(a:base)
|
||||||
|
endif
|
||||||
|
|
||||||
|
for item in l:res
|
||||||
|
if g:clang_snippets == 1
|
||||||
|
let item['word'] = b:AddSnip(item['info'], item['args_pos'])
|
||||||
|
else
|
||||||
|
let item['word'] = item['abbr']
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
if g:clang_snippets == 1
|
||||||
|
inoremap <expr> <buffer> <C-Y> <SID>HandlePossibleSelectionCtrlY()
|
||||||
|
augroup ClangComplete
|
||||||
|
au CursorMovedI <buffer> call <SID>TriggerSnippet()
|
||||||
|
augroup end
|
||||||
|
let b:snippet_chosen = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if g:clang_debug == 1
|
||||||
|
echom 'clang_complete: completion time (' . (g:clang_use_library == 1 ? 'library' : 'binary') . ') '. split(reltimestr(reltime(l:time_start)))[0]
|
||||||
|
endif
|
||||||
|
return l:res
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:HandlePossibleSelectionEnter()
|
||||||
|
if pumvisible()
|
||||||
|
let b:snippet_chosen = 1
|
||||||
|
return "\<C-Y>"
|
||||||
|
end
|
||||||
|
return "\<CR>"
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:HandlePossibleSelectionCtrlY()
|
||||||
|
if pumvisible()
|
||||||
|
let b:snippet_chosen = 1
|
||||||
|
end
|
||||||
|
return "\<C-Y>"
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:TriggerSnippet()
|
||||||
|
" Dont bother doing anything until we're sure the user exited the menu
|
||||||
|
if !b:snippet_chosen
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Stop monitoring as we'll trigger a snippet
|
||||||
|
silent! iunmap <buffer> <C-Y>
|
||||||
|
augroup ClangComplete
|
||||||
|
au! CursorMovedI <buffer>
|
||||||
|
augroup end
|
||||||
|
|
||||||
|
" Trigger the snippet
|
||||||
|
call b:TriggerSnip()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:ShouldComplete()
|
||||||
|
if (getline('.') =~ '#\s*\(include\|import\)')
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
if col('.') == 1
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
for l:id in synstack(line('.'), col('.') - 1)
|
||||||
|
if match(synIDattr(l:id, 'name'), '\CComment\|String\|Number')
|
||||||
|
\ != -1
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:LaunchCompletion()
|
||||||
|
let l:result = ""
|
||||||
|
if s:ShouldComplete()
|
||||||
|
let l:result = "\<C-X>\<C-U>"
|
||||||
|
if g:clang_auto_select != 2
|
||||||
|
let l:result .= "\<C-P>"
|
||||||
|
endif
|
||||||
|
if g:clang_auto_select == 1
|
||||||
|
let l:result .= "\<C-R>=(pumvisible() ? \"\\<Down>\" : '')\<CR>"
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
return l:result
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:CompleteDot()
|
||||||
|
if g:clang_complete_auto == 1
|
||||||
|
return '.' . s:LaunchCompletion()
|
||||||
|
endif
|
||||||
|
return '.'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:CompleteArrow()
|
||||||
|
if g:clang_complete_auto != 1 || getline('.')[col('.') - 2] != '-'
|
||||||
|
return '>'
|
||||||
|
endif
|
||||||
|
return '>' . s:LaunchCompletion()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:CompleteColon()
|
||||||
|
if g:clang_complete_auto != 1 || getline('.')[col('.') - 2] != ':'
|
||||||
|
return ':'
|
||||||
|
endif
|
||||||
|
return ':' . s:LaunchCompletion()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" May be used in a mapping to update the quickfix window.
|
||||||
|
function! g:ClangUpdateQuickFix()
|
||||||
|
call s:DoPeriodicQuickFix()
|
||||||
|
return ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! g:ClangSetSnippetEngine(engine_name)
|
||||||
|
try
|
||||||
|
call eval('snippets#' . a:engine_name . '#init()')
|
||||||
|
let b:AddSnip = function('snippets#' . a:engine_name . '#add_snippet')
|
||||||
|
let b:ResetSnip = function('snippets#' . a:engine_name . '#reset')
|
||||||
|
let b:TriggerSnip = function('snippets#' . a:engine_name . '#trigger')
|
||||||
|
catch /^Vim\%((\a\+)\)\=:E117/
|
||||||
|
echoe 'Snippets engine ' . a:engine_name . ' not found.'
|
||||||
|
let g:clang_snippets = 0
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim: set ts=2 sts=2 sw=2 expandtab :
|
|
@ -0,0 +1,381 @@
|
||||||
|
from clang.cindex import *
|
||||||
|
import vim
|
||||||
|
import time
|
||||||
|
import re
|
||||||
|
import threading
|
||||||
|
|
||||||
|
def initClangComplete(clang_complete_flags):
|
||||||
|
global index
|
||||||
|
index = Index.create()
|
||||||
|
global translationUnits
|
||||||
|
translationUnits = dict()
|
||||||
|
global complete_flags
|
||||||
|
complete_flags = int(clang_complete_flags)
|
||||||
|
|
||||||
|
# Get a tuple (fileName, fileContent) for the file opened in the current
|
||||||
|
# vim buffer. The fileContent contains the unsafed buffer content.
|
||||||
|
def getCurrentFile():
|
||||||
|
file = "\n".join(vim.eval("getline(1, '$')"))
|
||||||
|
return (vim.current.buffer.name, file)
|
||||||
|
|
||||||
|
def getCurrentTranslationUnit(args, currentFile, fileName, update = False):
|
||||||
|
if fileName in translationUnits:
|
||||||
|
tu = translationUnits[fileName]
|
||||||
|
if update:
|
||||||
|
if debug:
|
||||||
|
start = time.time()
|
||||||
|
tu.reparse([currentFile])
|
||||||
|
if debug:
|
||||||
|
elapsed = (time.time() - start)
|
||||||
|
print "LibClang - Reparsing: " + str(elapsed)
|
||||||
|
return tu
|
||||||
|
|
||||||
|
if debug:
|
||||||
|
start = time.time()
|
||||||
|
flags = TranslationUnit.PrecompiledPreamble | TranslationUnit.CXXPrecompiledPreamble # | TranslationUnit.CacheCompletionResults
|
||||||
|
tu = index.parse(fileName, args, [currentFile], flags)
|
||||||
|
if debug:
|
||||||
|
elapsed = (time.time() - start)
|
||||||
|
print "LibClang - First parse: " + str(elapsed)
|
||||||
|
|
||||||
|
if tu == None:
|
||||||
|
print "Cannot parse this source file. The following arguments " \
|
||||||
|
+ "are used for clang: " + " ".join(args)
|
||||||
|
return None
|
||||||
|
|
||||||
|
translationUnits[fileName] = tu
|
||||||
|
|
||||||
|
# Reparse to initialize the PCH cache even for auto completion
|
||||||
|
# This should be done by index.parse(), however it is not.
|
||||||
|
# So we need to reparse ourselves.
|
||||||
|
if debug:
|
||||||
|
start = time.time()
|
||||||
|
tu.reparse([currentFile])
|
||||||
|
if debug:
|
||||||
|
elapsed = (time.time() - start)
|
||||||
|
print "LibClang - First reparse (generate PCH cache): " + str(elapsed)
|
||||||
|
return tu
|
||||||
|
|
||||||
|
def splitOptions(options):
|
||||||
|
optsList = []
|
||||||
|
opt = ""
|
||||||
|
quoted = False
|
||||||
|
|
||||||
|
for char in options:
|
||||||
|
if char == ' ' and not quoted:
|
||||||
|
if opt != "":
|
||||||
|
optsList += [opt]
|
||||||
|
opt = ""
|
||||||
|
continue
|
||||||
|
elif char == '"':
|
||||||
|
quoted = not quoted
|
||||||
|
opt += char
|
||||||
|
|
||||||
|
if opt != "":
|
||||||
|
optsList += [opt]
|
||||||
|
return optsList
|
||||||
|
|
||||||
|
def getQuickFix(diagnostic):
|
||||||
|
# Some diagnostics have no file, e.g. "too many errors emitted, stopping now"
|
||||||
|
if diagnostic.location.file:
|
||||||
|
filename = diagnostic.location.file.name
|
||||||
|
else:
|
||||||
|
filename = ""
|
||||||
|
|
||||||
|
if diagnostic.severity == diagnostic.Ignored:
|
||||||
|
type = 'I'
|
||||||
|
elif diagnostic.severity == diagnostic.Note:
|
||||||
|
type = 'I'
|
||||||
|
elif diagnostic.severity == diagnostic.Warning:
|
||||||
|
type = 'W'
|
||||||
|
elif diagnostic.severity == diagnostic.Error:
|
||||||
|
type = 'E'
|
||||||
|
elif diagnostic.severity == diagnostic.Fatal:
|
||||||
|
type = 'E'
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return dict({ 'bufnr' : int(vim.eval("bufnr('" + filename + "', 1)")),
|
||||||
|
'lnum' : diagnostic.location.line,
|
||||||
|
'col' : diagnostic.location.column,
|
||||||
|
'text' : diagnostic.spelling,
|
||||||
|
'type' : type})
|
||||||
|
|
||||||
|
def getQuickFixList(tu):
|
||||||
|
return filter (None, map (getQuickFix, tu.diagnostics))
|
||||||
|
|
||||||
|
def highlightRange(range, hlGroup):
|
||||||
|
pattern = '/\%' + str(range.start.line) + 'l' + '\%' \
|
||||||
|
+ str(range.start.column) + 'c' + '.*' \
|
||||||
|
+ '\%' + str(range.end.column) + 'c/'
|
||||||
|
command = "exe 'syntax match' . ' " + hlGroup + ' ' + pattern + "'"
|
||||||
|
vim.command(command)
|
||||||
|
|
||||||
|
def highlightDiagnostic(diagnostic):
|
||||||
|
if diagnostic.severity == diagnostic.Warning:
|
||||||
|
hlGroup = 'SpellLocal'
|
||||||
|
elif diagnostic.severity == diagnostic.Error:
|
||||||
|
hlGroup = 'SpellBad'
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
|
pattern = '/\%' + str(diagnostic.location.line) + 'l\%' \
|
||||||
|
+ str(diagnostic.location.column) + 'c./'
|
||||||
|
command = "exe 'syntax match' . ' " + hlGroup + ' ' + pattern + "'"
|
||||||
|
vim.command(command)
|
||||||
|
|
||||||
|
# Use this wired kind of iterator as the python clang libraries
|
||||||
|
# have a bug in the range iterator that stops us to use:
|
||||||
|
#
|
||||||
|
# | for range in diagnostic.ranges
|
||||||
|
#
|
||||||
|
for i in range(len(diagnostic.ranges)):
|
||||||
|
highlightRange(diagnostic.ranges[i], hlGroup)
|
||||||
|
|
||||||
|
def highlightDiagnostics(tu):
|
||||||
|
map (highlightDiagnostic, tu.diagnostics)
|
||||||
|
|
||||||
|
def highlightCurrentDiagnostics():
|
||||||
|
if vim.current.buffer.name in translationUnits:
|
||||||
|
highlightDiagnostics(translationUnits[vim.current.buffer.name])
|
||||||
|
|
||||||
|
def getCurrentQuickFixList():
|
||||||
|
if vim.current.buffer.name in translationUnits:
|
||||||
|
return getQuickFixList(translationUnits[vim.current.buffer.name])
|
||||||
|
return []
|
||||||
|
|
||||||
|
def updateCurrentDiagnostics():
|
||||||
|
global debug
|
||||||
|
debug = int(vim.eval("g:clang_debug")) == 1
|
||||||
|
userOptionsGlobal = splitOptions(vim.eval("g:clang_user_options"))
|
||||||
|
userOptionsLocal = splitOptions(vim.eval("b:clang_user_options"))
|
||||||
|
args = userOptionsGlobal + userOptionsLocal
|
||||||
|
getCurrentTranslationUnit(args, getCurrentFile(),
|
||||||
|
vim.current.buffer.name, update = True)
|
||||||
|
|
||||||
|
def getCurrentCompletionResults(line, column, args, currentFile, fileName):
|
||||||
|
tu = getCurrentTranslationUnit(args, currentFile, fileName)
|
||||||
|
if debug:
|
||||||
|
start = time.time()
|
||||||
|
cr = tu.codeComplete(fileName, line, column, [currentFile],
|
||||||
|
complete_flags)
|
||||||
|
if debug:
|
||||||
|
elapsed = (time.time() - start)
|
||||||
|
print "LibClang - Code completion time: " + str(elapsed)
|
||||||
|
return cr
|
||||||
|
|
||||||
|
def formatResult(result):
|
||||||
|
completion = dict()
|
||||||
|
|
||||||
|
abbr = getAbbr(result.string)
|
||||||
|
word = filter(lambda x: not x.isKindInformative() and not x.isKindResultType(), result.string)
|
||||||
|
|
||||||
|
args_pos = []
|
||||||
|
cur_pos = 0
|
||||||
|
for chunk in word:
|
||||||
|
chunk_len = len(chunk.spelling)
|
||||||
|
if chunk.isKindPlaceHolder():
|
||||||
|
args_pos += [[ cur_pos, cur_pos + chunk_len ]]
|
||||||
|
cur_pos += chunk_len
|
||||||
|
|
||||||
|
word = "".join(map(lambda x: x.spelling, word))
|
||||||
|
|
||||||
|
completion['word'] = word
|
||||||
|
completion['abbr'] = abbr
|
||||||
|
completion['menu'] = word
|
||||||
|
completion['info'] = word
|
||||||
|
completion['args_pos'] = args_pos
|
||||||
|
completion['dup'] = 0
|
||||||
|
|
||||||
|
# Replace the number that represents a specific kind with a better
|
||||||
|
# textual representation.
|
||||||
|
completion['kind'] = kinds[result.cursorKind]
|
||||||
|
|
||||||
|
return completion
|
||||||
|
|
||||||
|
|
||||||
|
class CompleteThread(threading.Thread):
|
||||||
|
lock = threading.Lock()
|
||||||
|
|
||||||
|
def __init__(self, line, column, currentFile, fileName):
|
||||||
|
threading.Thread.__init__(self)
|
||||||
|
self.line = line
|
||||||
|
self.column = column
|
||||||
|
self.currentFile = currentFile
|
||||||
|
self.fileName = fileName
|
||||||
|
self.result = None
|
||||||
|
userOptionsGlobal = splitOptions(vim.eval("g:clang_user_options"))
|
||||||
|
userOptionsLocal = splitOptions(vim.eval("b:clang_user_options"))
|
||||||
|
self.args = userOptionsGlobal + userOptionsLocal
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
try:
|
||||||
|
CompleteThread.lock.acquire()
|
||||||
|
if self.line == -1:
|
||||||
|
# Warm up the caches. For this it is sufficient to get the current
|
||||||
|
# translation unit. No need to retrieve completion results.
|
||||||
|
# This short pause is necessary to allow vim to initialize itself.
|
||||||
|
# Otherwise we would get: E293: block was not locked
|
||||||
|
# The user does not see any delay, as we just pause a background thread.
|
||||||
|
time.sleep(0.1)
|
||||||
|
getCurrentTranslationUnit(self.args, self.currentFile, self.fileName)
|
||||||
|
else:
|
||||||
|
self.result = getCurrentCompletionResults(self.line, self.column,
|
||||||
|
self.args, self.currentFile, self.fileName)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
CompleteThread.lock.release()
|
||||||
|
|
||||||
|
def WarmupCache():
|
||||||
|
global debug
|
||||||
|
debug = int(vim.eval("g:clang_debug")) == 1
|
||||||
|
t = CompleteThread(-1, -1, getCurrentFile(), vim.current.buffer.name)
|
||||||
|
t.start()
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def getCurrentCompletions(base):
|
||||||
|
global debug
|
||||||
|
debug = int(vim.eval("g:clang_debug")) == 1
|
||||||
|
priority = vim.eval("g:clang_sort_algo") == 'priority'
|
||||||
|
line = int(vim.eval("line('.')"))
|
||||||
|
column = int(vim.eval("b:col"))
|
||||||
|
|
||||||
|
t = CompleteThread(line, column, getCurrentFile(), vim.current.buffer.name)
|
||||||
|
t.start()
|
||||||
|
while t.isAlive():
|
||||||
|
t.join(0.01)
|
||||||
|
cancel = int(vim.eval('complete_check()'))
|
||||||
|
if cancel != 0:
|
||||||
|
return []
|
||||||
|
cr = t.result
|
||||||
|
if cr is None:
|
||||||
|
return []
|
||||||
|
|
||||||
|
regexp = re.compile("^" + base)
|
||||||
|
filteredResult = filter(lambda x: regexp.match(getAbbr(x.string)), cr.results)
|
||||||
|
|
||||||
|
getPriority = lambda x: x.string.priority
|
||||||
|
getAbbrevation = lambda x: getAbbr(x.string).lower()
|
||||||
|
if priority:
|
||||||
|
key = getPriority
|
||||||
|
else:
|
||||||
|
key = getAbbrevation
|
||||||
|
sortedResult = sorted(filteredResult, None, key)
|
||||||
|
return map(formatResult, sortedResult)
|
||||||
|
|
||||||
|
def getAbbr(strings):
|
||||||
|
tmplst = filter(lambda x: x.isKindTypedText(), strings)
|
||||||
|
if len(tmplst) == 0:
|
||||||
|
return ""
|
||||||
|
else:
|
||||||
|
return tmplst[0].spelling
|
||||||
|
|
||||||
|
kinds = dict({ \
|
||||||
|
# Declarations \
|
||||||
|
1 : 't', # CXCursor_UnexposedDecl (A declaration whose specific kind is not \
|
||||||
|
# exposed via this interface) \
|
||||||
|
2 : 't', # CXCursor_StructDecl (A C or C++ struct) \
|
||||||
|
3 : 't', # CXCursor_UnionDecl (A C or C++ union) \
|
||||||
|
4 : 't', # CXCursor_ClassDecl (A C++ class) \
|
||||||
|
5 : 't', # CXCursor_EnumDecl (An enumeration) \
|
||||||
|
6 : 'm', # CXCursor_FieldDecl (A field (in C) or non-static data member \
|
||||||
|
# (in C++) in a struct, union, or C++ class) \
|
||||||
|
7 : 'e', # CXCursor_EnumConstantDecl (An enumerator constant) \
|
||||||
|
8 : 'f', # CXCursor_FunctionDecl (A function) \
|
||||||
|
9 : 'v', # CXCursor_VarDecl (A variable) \
|
||||||
|
10 : 'a', # CXCursor_ParmDecl (A function or method parameter) \
|
||||||
|
11 : '11', # CXCursor_ObjCInterfaceDecl (An Objective-C @interface) \
|
||||||
|
12 : '12', # CXCursor_ObjCCategoryDecl (An Objective-C @interface for a \
|
||||||
|
# category) \
|
||||||
|
13 : '13', # CXCursor_ObjCProtocolDecl (An Objective-C @protocol declaration) \
|
||||||
|
14 : '14', # CXCursor_ObjCPropertyDecl (An Objective-C @property declaration) \
|
||||||
|
15 : '15', # CXCursor_ObjCIvarDecl (An Objective-C instance variable) \
|
||||||
|
16 : '16', # CXCursor_ObjCInstanceMethodDecl (An Objective-C instance method) \
|
||||||
|
17 : '17', # CXCursor_ObjCClassMethodDecl (An Objective-C class method) \
|
||||||
|
18 : '18', # CXCursor_ObjCImplementationDec (An Objective-C @implementation) \
|
||||||
|
19 : '19', # CXCursor_ObjCCategoryImplDecll (An Objective-C @implementation \
|
||||||
|
# for a category) \
|
||||||
|
20 : 't', # CXCursor_TypedefDecl (A typedef) \
|
||||||
|
21 : 'f', # CXCursor_CXXMethod (A C++ class method) \
|
||||||
|
22 : 'n', # CXCursor_Namespace (A C++ namespace) \
|
||||||
|
23 : '23', # CXCursor_LinkageSpec (A linkage specification, e.g. 'extern "C"') \
|
||||||
|
24 : '+', # CXCursor_Constructor (A C++ constructor) \
|
||||||
|
25 : '~', # CXCursor_Destructor (A C++ destructor) \
|
||||||
|
26 : '26', # CXCursor_ConversionFunction (A C++ conversion function) \
|
||||||
|
27 : 'a', # CXCursor_TemplateTypeParameter (A C++ template type parameter) \
|
||||||
|
28 : 'a', # CXCursor_NonTypeTemplateParameter (A C++ non-type template \
|
||||||
|
# parameter) \
|
||||||
|
29 : 'a', # CXCursor_TemplateTemplateParameter (A C++ template template \
|
||||||
|
# parameter) \
|
||||||
|
30 : 'f', # CXCursor_FunctionTemplate (A C++ function template) \
|
||||||
|
31 : 'p', # CXCursor_ClassTemplate (A C++ class template) \
|
||||||
|
32 : '32', # CXCursor_ClassTemplatePartialSpecialization (A C++ class template \
|
||||||
|
# partial specialization) \
|
||||||
|
33 : 'n', # CXCursor_NamespaceAlias (A C++ namespace alias declaration) \
|
||||||
|
34 : '34', # CXCursor_UsingDirective (A C++ using directive) \
|
||||||
|
35 : '35', # CXCursor_UsingDeclaration (A using declaration) \
|
||||||
|
\
|
||||||
|
# References \
|
||||||
|
40 : '40', # CXCursor_ObjCSuperClassRef \
|
||||||
|
41 : '41', # CXCursor_ObjCProtocolRef \
|
||||||
|
42 : '42', # CXCursor_ObjCClassRef \
|
||||||
|
43 : '43', # CXCursor_TypeRef \
|
||||||
|
44 : '44', # CXCursor_CXXBaseSpecifier \
|
||||||
|
45 : '45', # CXCursor_TemplateRef (A reference to a class template, function \
|
||||||
|
# template, template template parameter, or class template partial \
|
||||||
|
# specialization) \
|
||||||
|
46 : '46', # CXCursor_NamespaceRef (A reference to a namespace or namespace \
|
||||||
|
# alias) \
|
||||||
|
47 : '47', # CXCursor_MemberRef (A reference to a member of a struct, union, \
|
||||||
|
# or class that occurs in some non-expression context, e.g., a \
|
||||||
|
# designated initializer) \
|
||||||
|
48 : '48', # CXCursor_LabelRef (A reference to a labeled statement) \
|
||||||
|
49 : '49', # CXCursor_OverloadedDeclRef (A reference to a set of overloaded \
|
||||||
|
# functions or function templates that has not yet been resolved to \
|
||||||
|
# a specific function or function template) \
|
||||||
|
\
|
||||||
|
# Error conditions \
|
||||||
|
#70 : '70', # CXCursor_FirstInvalid \
|
||||||
|
70 : '70', # CXCursor_InvalidFile \
|
||||||
|
71 : '71', # CXCursor_NoDeclFound \
|
||||||
|
72 : 'u', # CXCursor_NotImplemented \
|
||||||
|
73 : '73', # CXCursor_InvalidCode \
|
||||||
|
\
|
||||||
|
# Expressions \
|
||||||
|
100 : '100', # CXCursor_UnexposedExpr (An expression whose specific kind is \
|
||||||
|
# not exposed via this interface) \
|
||||||
|
101 : '101', # CXCursor_DeclRefExpr (An expression that refers to some value \
|
||||||
|
# declaration, such as a function, varible, or enumerator) \
|
||||||
|
102 : '102', # CXCursor_MemberRefExpr (An expression that refers to a member \
|
||||||
|
# of a struct, union, class, Objective-C class, etc) \
|
||||||
|
103 : '103', # CXCursor_CallExpr (An expression that calls a function) \
|
||||||
|
104 : '104', # CXCursor_ObjCMessageExpr (An expression that sends a message \
|
||||||
|
# to an Objective-C object or class) \
|
||||||
|
105 : '105', # CXCursor_BlockExpr (An expression that represents a block \
|
||||||
|
# literal) \
|
||||||
|
\
|
||||||
|
# Statements \
|
||||||
|
200 : '200', # CXCursor_UnexposedStmt (A statement whose specific kind is not \
|
||||||
|
# exposed via this interface) \
|
||||||
|
201 : '201', # CXCursor_LabelStmt (A labelled statement in a function) \
|
||||||
|
\
|
||||||
|
# Translation unit \
|
||||||
|
300 : '300', # CXCursor_TranslationUnit (Cursor that represents the \
|
||||||
|
# translation unit itself) \
|
||||||
|
\
|
||||||
|
# Attributes \
|
||||||
|
400 : '400', # CXCursor_UnexposedAttr (An attribute whose specific kind is \
|
||||||
|
# not exposed via this interface) \
|
||||||
|
401 : '401', # CXCursor_IBActionAttr \
|
||||||
|
402 : '402', # CXCursor_IBOutletAttr \
|
||||||
|
403 : '403', # CXCursor_IBOutletCollectionAttr \
|
||||||
|
\
|
||||||
|
# Preprocessing \
|
||||||
|
500 : '500', # CXCursor_PreprocessingDirective \
|
||||||
|
501 : 'd', # CXCursor_MacroDefinition \
|
||||||
|
502 : '502', # CXCursor_MacroInstantiation \
|
||||||
|
503 : '503' # CXCursor_InclusionDirective \
|
||||||
|
})
|
||||||
|
|
||||||
|
# vim: set ts=2 sts=2 sw=2 expandtab :
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 9f43dcb5a244faba6aedb6879b75a56c7de4b8ff
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit a486aa1d24294c5b14c8b2763a3b5ffdc39d0739
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 70a11ee67f3c4353e48aad69812c34b5c8489f07
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit ab11b74be4b0c9fac88d95f0f563d0dc0cb06ed3
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 359a80e3a34aacbd5257713b6a88aa085337166f
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit c9ab296e856bed4e694180efb6ffb692cf18ed8f
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 2d639b70e73ecf3f62884a578fe5e5937e6d8a92
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 8fcb1af27772174df5446d49de29052cac47e46f
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 339091ac4dd1f17e225fe7d57b48aff55f99b23a
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 62b68aecec2de531bc3978bfb9c07d3b6759ce0e
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit e066a0999e442d9d96f24ad9d203b1bd030ef72e
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 1725c13add66c6981d9406f109dcd64dff5fbf59
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 6532acee7a06b2420160279fdd397b9d8e5f1e8a
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit da5a7ac96f517e0fd6f886bc3fbe27156ca1f946
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 2609c9b054b562b6bf46936f3e80a25042c5d572
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit fab8621670f71637e9960003af28365129b1dfd0
|
|
@ -0,0 +1,32 @@
|
||||||
|
" vim-plug
|
||||||
|
call plug#begin('~/.vim/plugged')
|
||||||
|
Plug 'plasticboy/vim-markdown'
|
||||||
|
Plug 'godlygeek/tabular'
|
||||||
|
Plug 'w0rp/ale'
|
||||||
|
Plug 'airblade/vim-gitgutter'
|
||||||
|
Plug 'itchyny/lightline.vim'
|
||||||
|
Plug 'junegunn/fzf'
|
||||||
|
Plug 'junegunn/fzf.vim'
|
||||||
|
Plug 'scrooloose/nerdtree'
|
||||||
|
Plug 'terryma/vim-multiple-cursors'
|
||||||
|
Plug 'tpope/vim-eunuch'
|
||||||
|
Plug 'tpope/vim-surround'
|
||||||
|
Plug 'tpope/vim-commentary'
|
||||||
|
Plug 'Shougo/deoplete.nvim'
|
||||||
|
Plug 'roxma/nvim-yarp'
|
||||||
|
Plug 'roxma/vim-hug-neovim-rpc'
|
||||||
|
call plug#end()
|
||||||
|
|
||||||
|
" Toggle NERDTree
|
||||||
|
map <C-o> :NERDTreeToggle<CR>
|
||||||
|
|
||||||
|
" fzf
|
||||||
|
map ; :Files<CR>
|
||||||
|
|
||||||
|
" Deoplete
|
||||||
|
let g:deoplete#enable_at_startup = 1
|
||||||
|
" <TAB>: completion.
|
||||||
|
inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
|
||||||
|
|
||||||
|
" Disable markdown folding
|
||||||
|
let g:vim_markdown_folding_disabled = 1
|
|
@ -0,0 +1,16 @@
|
||||||
|
"mixer vol +5"
|
||||||
|
XF86AudioRaiseVolume
|
||||||
|
"mixer vol -5"
|
||||||
|
XF86AudioLowerVolume
|
||||||
|
"mixer vol mute"
|
||||||
|
m:0x0 + c:140
|
||||||
|
"sudo zzz"
|
||||||
|
XF86Sleep
|
||||||
|
"setxkbmap us"
|
||||||
|
Control + 1
|
||||||
|
"setxkbmap ru"
|
||||||
|
Control + 2
|
||||||
|
"rotate-screen.sh"
|
||||||
|
Mod4 + f
|
||||||
|
"scrot -s"
|
||||||
|
Shift + Print
|
|
@ -0,0 +1,8 @@
|
||||||
|
export QT_QPA_PLATFORMTHEME=qt5ct
|
||||||
|
|
||||||
|
# Wallpaper
|
||||||
|
xsetroot -solid "#008080" &
|
||||||
|
|
||||||
|
xbindkeys &
|
||||||
|
sdwmbar &
|
||||||
|
exec dwm
|
|
@ -0,0 +1,43 @@
|
||||||
|
# Sakhmatd ZSH Theme
|
||||||
|
# Based on gnzh theme, which is based on the bira theme
|
||||||
|
|
||||||
|
setopt prompt_subst
|
||||||
|
|
||||||
|
() {
|
||||||
|
|
||||||
|
local PR_USER PR_USER_OP PR_PROMPT PR_HOST
|
||||||
|
|
||||||
|
PR_USER='%F{green}%n%f'
|
||||||
|
PR_USER_OP='%F{green}%#%f'
|
||||||
|
PR_PROMPT='%f➤ %f'
|
||||||
|
|
||||||
|
# Check if we are on SSH or not
|
||||||
|
if [[ -n "$SSH_CLIENT" || -n "$SSH2_CLIENT" ]]; then
|
||||||
|
PR_HOST='%F{red}%M%f' # SSH
|
||||||
|
else
|
||||||
|
PR_HOST='%F{green}%M%f' # no SSH
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
local return_code="%(?..%F{red}%? ↵%f)"
|
||||||
|
|
||||||
|
local user_host="${PR_USER}%F{cyan}@${PR_HOST}"
|
||||||
|
local current_dir="%B%F{blue}%~%f%b"
|
||||||
|
local rvm_ruby=''
|
||||||
|
if ${HOME}/.rvm/bin/rvm-prompt &> /dev/null; then # detect user-local rvm installation
|
||||||
|
rvm_ruby='%F{red}‹$(${HOME}/.rvm/bin/rvm-prompt i v g s)›%f'
|
||||||
|
elif which rvm-prompt &> /dev/null; then # detect system-wide rvm installation
|
||||||
|
rvm_ruby='%F{red}‹$(rvm-prompt i v g s)›%f'
|
||||||
|
elif which rbenv &> /dev/null; then # detect Simple Ruby Version Management
|
||||||
|
rvm_ruby='%F{red}‹$(rbenv version | sed -e "s/ (set.*$//")›%f'
|
||||||
|
fi
|
||||||
|
local git_branch='$(git_prompt_info)'
|
||||||
|
|
||||||
|
PROMPT="${user_host} ${current_dir} ${rvm_ruby} ${git_branch}
|
||||||
|
─$PR_PROMPT "
|
||||||
|
RPROMPT="${return_code}"
|
||||||
|
|
||||||
|
ZSH_THEME_GIT_PROMPT_PREFIX="%F{yellow}‹"
|
||||||
|
ZSH_THEME_GIT_PROMPT_SUFFIX="› %f"
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
# If you come from bash you might have to change your $PATH.
|
||||||
|
# export PATH=$HOME/bin:/usr/local/bin:$PATH
|
||||||
|
|
||||||
|
# Path to your oh-my-zsh installation.
|
||||||
|
export ZSH=/home/sakhmatd/.oh-my-zsh
|
||||||
|
|
||||||
|
# Set name of the theme to load. Optionally, if you set this to "random"
|
||||||
|
# it'll load a random theme each time that oh-my-zsh is loaded.
|
||||||
|
# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes
|
||||||
|
ZSH_THEME="sakhmatd"
|
||||||
|
|
||||||
|
# Uncomment the following line to use case-sensitive completion.
|
||||||
|
# CASE_SENSITIVE="true"
|
||||||
|
|
||||||
|
# Uncomment the following line to use hyphen-insensitive completion. Case
|
||||||
|
# sensitive completion must be off. _ and - will be interchangeable.
|
||||||
|
# HYPHEN_INSENSITIVE="true"
|
||||||
|
|
||||||
|
# Uncomment the following line to disable bi-weekly auto-update checks.
|
||||||
|
#DISABLE_AUTO_UPDATE="true"
|
||||||
|
|
||||||
|
# Uncomment the following line to change how often to auto-update (in days).
|
||||||
|
# export UPDATE_ZSH_DAYS=13
|
||||||
|
|
||||||
|
# Uncomment the following line to disable colors in ls.
|
||||||
|
# DISABLE_LS_COLORS="true"
|
||||||
|
|
||||||
|
# Uncomment the following line to disable auto-setting terminal title.
|
||||||
|
# DISABLE_AUTO_TITLE="true"
|
||||||
|
|
||||||
|
# Uncomment the following line to enable command auto-correction.
|
||||||
|
ENABLE_CORRECTION="true"
|
||||||
|
|
||||||
|
# Uncomment the following line to display red dots whilst waiting for completion.
|
||||||
|
COMPLETION_WAITING_DOTS="true"
|
||||||
|
|
||||||
|
# Uncomment the following line if you want to disable marking untracked files
|
||||||
|
# under VCS as dirty. This makes repository status check for large repositories
|
||||||
|
# much, much faster.
|
||||||
|
DISABLE_UNTRACKED_FILES_DIRTY="true"
|
||||||
|
|
||||||
|
# Uncomment the following line if you want to change the command execution time
|
||||||
|
# stamp shown in the history command output.
|
||||||
|
# The optional three formats: "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
|
||||||
|
# HIST_STAMPS="mm/dd/yyyy"
|
||||||
|
|
||||||
|
# Would you like to use another custom folder than $ZSH/custom?
|
||||||
|
# ZSH_CUSTOM=/path/to/new-custom-folder
|
||||||
|
|
||||||
|
# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
|
||||||
|
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
|
||||||
|
# Example format: plugins=(rails git textmate ruby lighthouse)
|
||||||
|
# Add wisely, as too many plugins slow down shell startup.
|
||||||
|
plugins=(wd)
|
||||||
|
|
||||||
|
source $ZSH/oh-my-zsh.sh
|
||||||
|
|
||||||
|
# User configuration
|
||||||
|
|
||||||
|
# export MANPATH="/usr/local/man:$MANPATH"
|
||||||
|
|
||||||
|
# You may need to manually set your language environment
|
||||||
|
# export LANG=en_US.UTF-8
|
||||||
|
|
||||||
|
# Preferred editor for local and remote sessions
|
||||||
|
# if [[ -n $SSH_CONNECTION ]]; then
|
||||||
|
# export EDITOR='vim'
|
||||||
|
# else
|
||||||
|
# export EDITOR='mvim'
|
||||||
|
# fi
|
||||||
|
|
||||||
|
# Compilation flags
|
||||||
|
# export ARCHFLAGS="-arch x86_64"
|
||||||
|
|
||||||
|
# ssh
|
||||||
|
# export SSH_KEY_PATH="~/.ssh/rsa_id"
|
||||||
|
|
||||||
|
# Set personal aliases, overriding those provided by oh-my-zsh libs,
|
||||||
|
# plugins, and themes. Aliases can be placed here, though oh-my-zsh
|
||||||
|
# users are encouraged to define aliases within the ZSH_CUSTOM folder.
|
||||||
|
# For a full list of active aliases, run `alias`.
|
||||||
|
#
|
||||||
|
# Example aliases
|
||||||
|
# alias zshconfig="mate ~/.zshrc"
|
||||||
|
|
||||||
|
# alias ohmyzsh="mate ~/.oh-my-zsh"
|
||||||
|
|
||||||
|
# Automatically attach tmux session
|
||||||
|
if command -v tmux>/dev/null && xhost >& /dev/null; then
|
||||||
|
[[ ! $TERM =~ screen ]] && [ -z $TMUX] && { tmux attach || tmux new-session }
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make Xorg apps work in tmux
|
||||||
|
export DISPLAY=":0"
|
||||||
|
|
||||||
|
# Make me only type my key passwords once
|
||||||
|
if keychain --quiet; then
|
||||||
|
eval $(keychain --eval --quiet id_ed25519)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Print a fortune
|
||||||
|
echo
|
||||||
|
command fortune
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Expots, Functions and Aliases
|
||||||
|
source /home/sakhmatd/.zshrc.local
|
|
@ -0,0 +1,114 @@
|
||||||
|
## -*- mode: sh -*-
|
||||||
|
|
||||||
|
export RANGER_LOAD_DEFAULT_RC=FALSE
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
## Exports
|
||||||
|
############################################################
|
||||||
|
export EDITOR='nvim'
|
||||||
|
export PAGER='less'
|
||||||
|
export BROWSER='qutebrowser'
|
||||||
|
|
||||||
|
# Add dotnet tools
|
||||||
|
# export PATH="$PATH:/home/sakhmatd/.dotnet/tools"
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
## Functions
|
||||||
|
############################################################
|
||||||
|
|
||||||
|
# Transfer files to transfer.sh
|
||||||
|
transfer()
|
||||||
|
{
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
echo -e "No arguments specified.
|
||||||
|
Usage:\necho transfer /tmp/test.md\ncat /tmp/test.md | transfer
|
||||||
|
test.md";
|
||||||
|
return 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
tmpfile=$( mktemp -t transferXXX );
|
||||||
|
|
||||||
|
if tty -s; then
|
||||||
|
basefile=$(basename "$1" | sed -e 's/[^a-zA-Z0-9._-]/-/g');
|
||||||
|
curl --progress-bar --upload-file "$1" "https://transfer.sh/$basefile" >> $tmpfile;
|
||||||
|
else curl --progress-bar --upload-file "-" "https://transfer.sh/$1" >> $tmpfile ;
|
||||||
|
fi;
|
||||||
|
|
||||||
|
cat $tmpfile;
|
||||||
|
rm -f $tmpfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
## Aliases
|
||||||
|
############################################################
|
||||||
|
|
||||||
|
# neo- aliases
|
||||||
|
alias vim="nvim"
|
||||||
|
alias mutt='neomutt'
|
||||||
|
alias qemacs='emacs -q -nw'
|
||||||
|
alias sqemacs='sudo -q emacs -nw'
|
||||||
|
|
||||||
|
# Priv escalation
|
||||||
|
alias svim='sudo vim'
|
||||||
|
alias zzz='sudo zzz'
|
||||||
|
alias vm='sudo vm'
|
||||||
|
alias dmesg='sudo dmesg'
|
||||||
|
|
||||||
|
# Config files
|
||||||
|
alias fstab="$EDITOR /etc/fstab"
|
||||||
|
alias dwmconf="$EDITOR $DWM_CONF"
|
||||||
|
alias zshrcl="$EDITOR ~/.zshrc.local"
|
||||||
|
alias zshrc="$EDITOR ~/.zshrc"
|
||||||
|
alias muttrc="$EDITOR ~/.neomuttrc"
|
||||||
|
alias muttrcs="$EDITOR ~/.neomutt"
|
||||||
|
alias xinitrc="$EDITOR ~/.xinitrc"
|
||||||
|
|
||||||
|
# Convenience and helpers
|
||||||
|
alias h="history"
|
||||||
|
alias cd..="cd .."
|
||||||
|
alias reloadzsh="source ~/.zshrc.local"
|
||||||
|
alias rotatewacom='xsetwacom set "Wacom ISDv4 EC Pen stylus" Rotate'
|
||||||
|
alias myip='dig TXT +short o-o.myaddr.l.google.com @ns1.google.com'
|
||||||
|
alias watchsync='watch grep -e Dirty: -e Writeback: /proc/meminfo'
|
||||||
|
alias ducks='du -cks -h * | sort -rn | head -11'
|
||||||
|
alias speedtest='wget -O /dev/null http://speedtest.wdc01.softlayer.com/downloads/test10.zip'
|
||||||
|
alias cls='echo -ne "\033c"'
|
||||||
|
alias clearhistory='cat /dev/null > ~/.zsh_history && history -c && exit'
|
||||||
|
alias sshfs_mount='sshfs -C -o allow_other'
|
||||||
|
alias mountyadisk='sudo mount -t davfs https://webdav.yandex.ru /home/sakhmatd/mnt/yadisk'
|
||||||
|
alias mountallsync='sudo mount -t davfs https://cloud.allsync.com /home/sakhmatd/mnt/allsync'
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
# OS-Specific Modules
|
||||||
|
############################################################
|
||||||
|
|
||||||
|
# FreeBSD
|
||||||
|
if [[ $(uname) == "FreeBSD" ]] then
|
||||||
|
# Fix FreeBSD's backspace behavior.
|
||||||
|
stty erase "^?"
|
||||||
|
|
||||||
|
# Package management
|
||||||
|
alias pkg='sudo pkg'
|
||||||
|
|
||||||
|
# BSD config files
|
||||||
|
alias bootloader.conf="sudo $EDITOR /boot/loader.conf"
|
||||||
|
alias rc.conf="sudo $EDITOR /etc/rc.conf"
|
||||||
|
alias sysctl.conf="sudo $EDITOR /etc/sysctl.conf"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Void Linux
|
||||||
|
if xbps-install -V &> /dev/null; then
|
||||||
|
alias xbps-install='sudo xbps-install'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ArchLinux
|
||||||
|
if pacman -V &> /dev/null; then
|
||||||
|
alias pacman='sudo pacman'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Slackware
|
||||||
|
if [[ -e /etc/slackware-release ]]; then
|
||||||
|
alias slapt-get='sudo slapt-get'
|
||||||
|
alias slackpkg='sudo slackpkg'
|
||||||
|
fi
|
|
@ -0,0 +1,5 @@
|
||||||
|
Install [Oh My Zsh](https://ohmyz.sh) before using stow to install these files:
|
||||||
|
|
||||||
|
```
|
||||||
|
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
|
||||||
|
```
|
Loading…
Reference in New Issue