14 changed files with 176 additions and 423 deletions
-
17README.md
-
10TODO.md
-
10bin/miaou-bash
-
0etc/bash.bashrc
-
0etc/inputrc
-
6etc/vim/vimrc.azerty
-
40etc/vim/vimrc.core
-
8etc/vim/vimrc.local
-
3etc/vim/vimrc.miaou
-
80etc/vim/vimrc.rookie
-
2init.sh
-
27install.sh
-
8tools/elapsed
-
388vimrc
@ -1,10 +0,0 @@ |
|||||
TODO |
|
||||
==== |
|
||||
|
|
||||
* [ ] prompt git shows version with `+` when there is more than one commit over current version. ie: v-1.0.0 + 2 commits more should display v-1.0.0+ |
|
||||
* [ ] semver_git_tag should append `RELEASE_NOTES.md` from this TODO markdown file, providing that NEW NOTE section below contains appropriate items to fulfill the current release note |
|
||||
* [ ] git log <LATEST_TAG>..HEAD --oneline |
|
||||
|
|
||||
NEW NOTE |
|
||||
======== |
|
||||
|
|
||||
@ -0,0 +1,6 @@ |
|||||
|
" AZERTY quick access to basic keys |
||||
|
" --------------------------------- |
||||
|
nnoremap ! . |
||||
|
nnoremap à 0 |
||||
|
nnoremap ù % |
||||
|
|
||||
@ -0,0 +1,40 @@ |
|||||
|
" Smart Defaults |
||||
|
set showcmd " Show (partial) command in status line. |
||||
|
set showmatch " Show matching brackets. |
||||
|
set ignorecase " Do case insensitive matching |
||||
|
set smartcase " Do smart case matching |
||||
|
set incsearch " Incremental search |
||||
|
set autowrite " Automatically save before commands like :next and :make |
||||
|
set hidden " Hide buffers when they are abandoned |
||||
|
set shiftwidth=2 |
||||
|
set tabstop=2 |
||||
|
set expandtab |
||||
|
set number |
||||
|
set relativenumber |
||||
|
filetype plugin indent on |
||||
|
|
||||
|
" Show Status |
||||
|
set laststatus=2 |
||||
|
highlight StatusLine ctermfg=DarkGrey |
||||
|
|
||||
|
" Wild Menu |
||||
|
set wildmenu |
||||
|
set wildmode=list:longest |
||||
|
set wildignore=*.jpg,*.png,*.gif,*.pdf |
||||
|
|
||||
|
" Show Cursor |
||||
|
set cursorline |
||||
|
highlight clear CursorLine |
||||
|
highlight link CursorLine CursorColumn |
||||
|
highlight CursorLineNR cterm=italic |
||||
|
|
||||
|
" Toggle line/relative numbers |
||||
|
nnoremap <F2> :set number!<CR> |
||||
|
nnoremap <F3> :set relativenumber!<CR> |
||||
|
highlight LineNr ctermfg=DarkGrey |
||||
|
|
||||
|
" Sudo Write |
||||
|
command! W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null' |
||||
|
|
||||
|
" Jump to Last Position |
||||
|
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif |
||||
@ -0,0 +1,8 @@ |
|||||
|
let additionals = [ "core", "miaou", "rookie", "azerty" ] |
||||
|
for additional in additionals |
||||
|
let s:vimrc_path = "/etc/vim/vimrc." . additional |
||||
|
if filereadable(s:vimrc_path) |
||||
|
execute "source " . expand(s:vimrc_path) |
||||
|
endif |
||||
|
endfor |
||||
|
|
||||
@ -0,0 +1,3 @@ |
|||||
|
" Detect miaou-bash |
||||
|
autocmd BufReadPost,BufNewFile * if getline(1) =~# '^#!.*miaou-bash' | setlocal filetype=bash | endif |
||||
|
|
||||
@ -0,0 +1,80 @@ |
|||||
|
" ROOKIE vim user |
||||
|
" --------------- |
||||
|
|
||||
|
" Open File and Go to Line under Cursor |
||||
|
nnoremap gf gF |
||||
|
|
||||
|
" Move Along Words |
||||
|
inoremap <C-Left> B |
||||
|
inoremap <C-Right> W |
||||
|
inoremap <M-Left> b |
||||
|
inoremap <M-Right> w |
||||
|
nnoremap <M-Left> b |
||||
|
nnoremap <M-Right> w |
||||
|
|
||||
|
" Move Along Paragraphs |
||||
|
inoremap <C-Up> { |
||||
|
inoremap <C-Down> } |
||||
|
nnoremap <C-Up> { |
||||
|
nnoremap <C-Down> } |
||||
|
|
||||
|
" Delete Words |
||||
|
inoremap <C-BS> db |
||||
|
inoremap <M-BS> d0 |
||||
|
inoremap <C-Del> dw |
||||
|
inoremap <M-Del> d$ |
||||
|
nnoremap <C-BS> db |
||||
|
nnoremap <M-BS> d0 |
||||
|
nnoremap <C-Del> dw |
||||
|
nnoremap <M-Del> d$ |
||||
|
|
||||
|
" Select |
||||
|
nnoremap <S-Left> vh |
||||
|
inoremap <S-Left> <Esc>vh |
||||
|
nnoremap <S-Right> vl |
||||
|
inoremap <S-Right> <Esc>vl |
||||
|
nnoremap <S-Up> vk |
||||
|
vnoremap <S-Up> k |
||||
|
inoremap <S-Up> <Esc>vk |
||||
|
nnoremap <S-Down> vj |
||||
|
vnoremap <S-Down> j |
||||
|
inoremap <S-Down> <Esc>vj |
||||
|
inoremap <S-Home> <Esc>v^ |
||||
|
inoremap <S-Home> <Esc>v^ |
||||
|
nnoremap <S-End> v$ |
||||
|
inoremap <S-End> <Esc>v^ |
||||
|
|
||||
|
" Save |
||||
|
nnoremap <C-s> :w<CR> |
||||
|
inoremap <C-s> <Esc>:w<CR>a |
||||
|
vnoremap <C-s> <Esc>:w<CR> |
||||
|
|
||||
|
" Quit |
||||
|
nnoremap <C-q> :qa<CR> |
||||
|
inoremap <C-q> <Esc>:qa<CR> |
||||
|
|
||||
|
" Slower Scroll Page |
||||
|
nnoremap <PageDown> <C-d><C-d> |
||||
|
nnoremap <PageUp> <C-u><C-u> |
||||
|
vnoremap <PageDown> <C-d> |
||||
|
vnoremap <PageUp> <C-u> |
||||
|
inoremap <PageDown> <C-o><C-d><C-o><C-d> |
||||
|
inoremap <PageUp> <C-o><C-u><C-o><C-u> |
||||
|
|
||||
|
" Slower Scroll Wheel |
||||
|
nnoremap <ScrollWheelUp> <C-u> |
||||
|
nnoremap <ScrollWheelDown> <C-d> |
||||
|
vnoremap <ScrollWheelUp> k |
||||
|
vnoremap <ScrollWheelDown> j |
||||
|
inoremap <ScrollWheelUp> <C-o><C-u> |
||||
|
inoremap <ScrollWheelDown> <C-o><C-d> |
||||
|
|
||||
|
" Move Lines |
||||
|
nnoremap <A-j> :m .+1<CR>== |
||||
|
nnoremap <A-k> :m .-2<CR>== |
||||
|
inoremap <A-j> <Esc>:m .+1<CR>==gi |
||||
|
inoremap <A-k> <Esc>:m .-2<CR>==gi |
||||
|
vnoremap <A-j> :m '>+1<CR>gv=gv |
||||
|
vnoremap <A-k> :m '<-2<CR>gv=gv |
||||
|
|
||||
|
|
||||
@ -1,8 +0,0 @@ |
|||||
#!/bin/bash |
|
||||
|
|
||||
START=$(date +%s.%N) |
|
||||
eval -- "$*" |
|
||||
END=$(date +%s.%N) |
|
||||
DIFF=$(echo "scale=6; (${END} - ${START}) / 1" | bc) |
|
||||
|
|
||||
printf -- "-----------------\nelapsed seconds = %f\n" "${DIFF}" >&2 |
|
||||
@ -1,388 +0,0 @@ |
|||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" Maintainer: |
|
||||
" Amir Salihefendic — @amix3k |
|
||||
" |
|
||||
" Awesome_version: |
|
||||
" Get this config, nice color schemes and lots of plugins! |
|
||||
" |
|
||||
" Install the awesome version from: |
|
||||
" |
|
||||
" https://github.com/amix/vimrc |
|
||||
" |
|
||||
" Sections: |
|
||||
" -> General |
|
||||
" -> VIM user interface |
|
||||
" -> Colors and Fonts |
|
||||
" -> Files and backups |
|
||||
" -> Text, tab and indent related |
|
||||
" -> Visual mode related |
|
||||
" -> Moving around, tabs and buffers |
|
||||
" -> Status line |
|
||||
" -> Editing mappings |
|
||||
" -> vimgrep searching and cope displaying |
|
||||
" -> Spell checking |
|
||||
" -> Misc |
|
||||
" -> Helper functions |
|
||||
" |
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
|
|
||||
|
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" => General |
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" Sets how many lines of history VIM has to remember |
|
||||
set history=500 |
|
||||
set nocompatible |
|
||||
|
|
||||
" Enable filetype plugins |
|
||||
filetype plugin on |
|
||||
filetype indent on |
|
||||
|
|
||||
" Set to auto read when a file is changed from the outside |
|
||||
set autoread |
|
||||
|
|
||||
" With a map leader it's possible to do extra key combinations |
|
||||
" like <leader>w saves the current file |
|
||||
let mapleader = "," |
|
||||
|
|
||||
" Fast saving |
|
||||
nmap <leader>w :w!<cr> |
|
||||
|
|
||||
" :W sudo saves the file |
|
||||
" (useful for handling the permission-denied error) |
|
||||
command W w !sudo tee % > /dev/null |
|
||||
|
|
||||
|
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" => VIM user interface |
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" Set 7 lines to the cursor - when moving vertically using j/k |
|
||||
set so=7 |
|
||||
|
|
||||
" Avoid garbled characters in Chinese language windows OS |
|
||||
let $LANG='en' |
|
||||
set langmenu=en |
|
||||
source $VIMRUNTIME/delmenu.vim |
|
||||
source $VIMRUNTIME/menu.vim |
|
||||
|
|
||||
" Turn on the Wild menu |
|
||||
set wildmenu |
|
||||
|
|
||||
" Ignore compiled files |
|
||||
set wildignore=*.o,*~,*.pyc |
|
||||
if has("win16") || has("win32") |
|
||||
set wildignore+=.git\*,.hg\*,.svn\* |
|
||||
else |
|
||||
set wildignore+=*/.git/*,*/.hg/*,*/.svn/*,*/.DS_Store |
|
||||
endif |
|
||||
|
|
||||
"Always show current position |
|
||||
set ruler |
|
||||
|
|
||||
" Height of the command bar |
|
||||
set cmdheight=2 |
|
||||
|
|
||||
" A buffer becomes hidden when it is abandoned |
|
||||
set hid |
|
||||
|
|
||||
" Configure backspace so it acts as it should act |
|
||||
" set,indent |
|
||||
"set backspace=i |
|
||||
set backspace=indent,eol,start |
|
||||
fixdel |
|
||||
|
|
||||
set whichwrap+=<,>,h,l |
|
||||
|
|
||||
" Ignore case when searching |
|
||||
set ignorecase |
|
||||
|
|
||||
" When searching try to be smart about cases |
|
||||
set smartcase |
|
||||
|
|
||||
" Highlight search results |
|
||||
set hlsearch |
|
||||
|
|
||||
" Makes search act like search in modern browsers |
|
||||
set incsearch |
|
||||
|
|
||||
" Don't redraw while executing macros (good performance config) |
|
||||
set lazyredraw |
|
||||
|
|
||||
" For regular expressions turn magic on |
|
||||
set magic |
|
||||
|
|
||||
" Show matching brackets when text indicator is over them |
|
||||
set showmatch |
|
||||
" How many tenths of a second to blink when matching brackets |
|
||||
set mat=2 |
|
||||
|
|
||||
" No annoying sound on errors |
|
||||
set noerrorbells |
|
||||
set novisualbell |
|
||||
set t_vb= |
|
||||
set tm=500 |
|
||||
|
|
||||
" Properly disable sound on errors on MacVim |
|
||||
if has("gui_macvim") |
|
||||
autocmd GUIEnter * set vb t_vb= |
|
||||
endif |
|
||||
|
|
||||
|
|
||||
" Add a bit extra margin to the left |
|
||||
set foldcolumn=1 |
|
||||
|
|
||||
|
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" => Colors and Fonts |
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" Enable syntax highlighting |
|
||||
syntax enable |
|
||||
|
|
||||
" Enable 256 colors palette in Gnome Terminal |
|
||||
if $COLORTERM == 'gnome-terminal' |
|
||||
set t_Co=256 |
|
||||
endif |
|
||||
|
|
||||
try |
|
||||
colorscheme desert |
|
||||
catch |
|
||||
endtry |
|
||||
|
|
||||
set background=dark |
|
||||
|
|
||||
" Set extra options when running in GUI mode |
|
||||
if has("gui_running") |
|
||||
set guioptions-=T |
|
||||
set guioptions-=e |
|
||||
set t_Co=256 |
|
||||
set guitablabel=%M\ %t |
|
||||
endif |
|
||||
|
|
||||
" Set utf8 as standard encoding and en_US as the standard language |
|
||||
set encoding=utf8 |
|
||||
|
|
||||
" Use Unix as the standard file type |
|
||||
set ffs=unix,dos,mac |
|
||||
|
|
||||
|
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" => Files, backups and undo |
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" Turn backup off, since most stuff is in SVN, git et.c anyway... |
|
||||
set nobackup |
|
||||
set nowb |
|
||||
set noswapfile |
|
||||
|
|
||||
|
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" => Text, tab and indent related |
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" Use spaces instead of tabs |
|
||||
set expandtab |
|
||||
|
|
||||
" Be smart when using tabs ;) |
|
||||
set smarttab |
|
||||
|
|
||||
" 1 tab == 4 spaces |
|
||||
set shiftwidth=4 |
|
||||
set tabstop=4 |
|
||||
|
|
||||
" Linebreak on 500 characters |
|
||||
set lbr |
|
||||
set tw=500 |
|
||||
|
|
||||
set ai "Auto indent |
|
||||
set si "Smart indent |
|
||||
set wrap "Wrap lines |
|
||||
set paste |
|
||||
|
|
||||
|
|
||||
"""""""""""""""""""""""""""""" |
|
||||
" => Visual mode related |
|
||||
"""""""""""""""""""""""""""""" |
|
||||
" Visual mode pressing * or # searches for the current selection |
|
||||
" Super useful! From an idea by Michael Naumann |
|
||||
vnoremap <silent> * :<C-u>call VisualSelection('', '')<CR>/<C-R>=@/<CR><CR> |
|
||||
vnoremap <silent> # :<C-u>call VisualSelection('', '')<CR>?<C-R>=@/<CR><CR> |
|
||||
|
|
||||
|
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" => Moving around, tabs, windows and buffers |
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" Map <Space> to / (search) and Ctrl-<Space> to ? (backwards search) |
|
||||
map <space> / |
|
||||
map <c-space> ? |
|
||||
|
|
||||
" Disable highlight when <leader><cr> is pressed |
|
||||
map <silent> <leader><cr> :noh<cr> |
|
||||
|
|
||||
" Smart way to move between windows |
|
||||
map <C-j> <C-W>j |
|
||||
map <C-k> <C-W>k |
|
||||
map <C-h> <C-W>h |
|
||||
map <C-l> <C-W>l |
|
||||
|
|
||||
" Close the current buffer |
|
||||
map <leader>bd :Bclose<cr>:tabclose<cr>gT |
|
||||
|
|
||||
" Close all the buffers |
|
||||
map <leader>ba :bufdo bd<cr> |
|
||||
|
|
||||
map <leader>l :bnext<cr> |
|
||||
map <leader>h :bprevious<cr> |
|
||||
|
|
||||
" Useful mappings for managing tabs |
|
||||
map <leader>tn :tabnew<cr> |
|
||||
map <leader>to :tabonly<cr> |
|
||||
map <leader>tc :tabclose<cr> |
|
||||
map <leader>tm :tabmove |
|
||||
map <leader>t<leader> :tabnext |
|
||||
|
|
||||
" Let 'tl' toggle between this and the last accessed tab |
|
||||
let g:lasttab = 1 |
|
||||
nmap <Leader>tl :exe "tabn ".g:lasttab<CR> |
|
||||
au TabLeave * let g:lasttab = tabpagenr() |
|
||||
|
|
||||
|
|
||||
" Opens a new tab with the current buffer's path |
|
||||
" Super useful when editing files in the same directory |
|
||||
map <leader>te :tabedit <c-r>=expand("%:p:h")<cr>/ |
|
||||
|
|
||||
" Switch CWD to the directory of the open buffer |
|
||||
map <leader>cd :cd %:p:h<cr>:pwd<cr> |
|
||||
|
|
||||
" Specify the behavior when switching between buffers |
|
||||
try |
|
||||
set switchbuf=useopen,usetab,newtab |
|
||||
set stal=2 |
|
||||
catch |
|
||||
endtry |
|
||||
|
|
||||
" Return to last edit position when opening files (You want this!) |
|
||||
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif |
|
||||
|
|
||||
|
|
||||
"""""""""""""""""""""""""""""" |
|
||||
" => Status line |
|
||||
"""""""""""""""""""""""""""""" |
|
||||
" Always show the status line |
|
||||
set laststatus=2 |
|
||||
|
|
||||
" Format the status line |
|
||||
set statusline=\ %{HasPaste()}%F%m%r%h\ %w\ \ CWD:\ %r%{getcwd()}%h\ \ \ Line:\ %l\ \ Column:\ %c |
|
||||
|
|
||||
|
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" => Editing mappings |
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" Remap VIM 0 to first non-blank character |
|
||||
map 0 ^ |
|
||||
|
|
||||
" Move a line of text using ALT+[jk] or Command+[jk] on mac |
|
||||
nmap <M-j> mz:m+<cr>`z |
|
||||
nmap <M-k> mz:m-2<cr>`z |
|
||||
vmap <M-j> :m'>+<cr>`<my`>mzgv`yo`z |
|
||||
vmap <M-k> :m'<-2<cr>`>my`<mzgv`yo`z |
|
||||
|
|
||||
if has("mac") || has("macunix") |
|
||||
nmap <D-j> <M-j> |
|
||||
nmap <D-k> <M-k> |
|
||||
vmap <D-j> <M-j> |
|
||||
vmap <D-k> <M-k> |
|
||||
endif |
|
||||
|
|
||||
" Delete trailing white space on save, useful for some filetypes ;) |
|
||||
fun! CleanExtraSpaces() |
|
||||
let save_cursor = getpos(".") |
|
||||
let old_query = getreg('/') |
|
||||
silent! %s/\s\+$//e |
|
||||
call setpos('.', save_cursor) |
|
||||
call setreg('/', old_query) |
|
||||
endfun |
|
||||
|
|
||||
if has("autocmd") |
|
||||
autocmd BufWritePre *.txt,*.js,*.py,*.wiki,*.sh,*.coffee :call CleanExtraSpaces() |
|
||||
endif |
|
||||
|
|
||||
|
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" => Spell checking |
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" Pressing ,ss will toggle and untoggle spell checking |
|
||||
map <leader>ss :setlocal spell!<cr> |
|
||||
|
|
||||
" Shortcuts using <leader> |
|
||||
map <leader>sn ]s |
|
||||
map <leader>sp [s |
|
||||
map <leader>sa zg |
|
||||
map <leader>s? z= |
|
||||
|
|
||||
|
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" => Misc |
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" Remove the Windows ^M - when the encodings gets messed up |
|
||||
noremap <Leader>m mmHmt:%s/<C-V><cr>//ge<cr>'tzt'm |
|
||||
|
|
||||
" Quickly open a buffer for scribble |
|
||||
map <leader>q :e ~/buffer<cr> |
|
||||
|
|
||||
" Quickly open a markdown buffer for scribble |
|
||||
map <leader>x :e ~/buffer.md<cr> |
|
||||
|
|
||||
" Toggle paste mode on and off |
|
||||
map <leader>pp :setlocal paste!<cr> |
|
||||
|
|
||||
|
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" => Helper functions |
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
|
||||
" Returns true if paste mode is enabled |
|
||||
function! HasPaste() |
|
||||
if &paste |
|
||||
return 'PASTE MODE ' |
|
||||
endif |
|
||||
return '' |
|
||||
endfunction |
|
||||
|
|
||||
" Don't close window, when deleting a buffer |
|
||||
command! Bclose call <SID>BufcloseCloseIt() |
|
||||
function! <SID>BufcloseCloseIt() |
|
||||
let l:currentBufNum = bufnr("%") |
|
||||
let l:alternateBufNum = bufnr("#") |
|
||||
|
|
||||
if buflisted(l:alternateBufNum) |
|
||||
buffer # |
|
||||
else |
|
||||
bnext |
|
||||
endif |
|
||||
|
|
||||
if bufnr("%") == l:currentBufNum |
|
||||
new |
|
||||
endif |
|
||||
|
|
||||
if buflisted(l:currentBufNum) |
|
||||
execute("bdelete! ".l:currentBufNum) |
|
||||
endif |
|
||||
endfunction |
|
||||
|
|
||||
function! CmdLine(str) |
|
||||
call feedkeys(":" . a:str) |
|
||||
endfunction |
|
||||
|
|
||||
function! VisualSelection(direction, extra_filter) range |
|
||||
let l:saved_reg = @" |
|
||||
execute "normal! vgvy" |
|
||||
|
|
||||
let l:pattern = escape(@", "\\/.*'$^~[]") |
|
||||
let l:pattern = substitute(l:pattern, "\n$", "", "") |
|
||||
|
|
||||
if a:direction == 'gv' |
|
||||
call CmdLine("Ack '" . l:pattern . "' " ) |
|
||||
elseif a:direction == 'replace' |
|
||||
call CmdLine("%s" . '/'. l:pattern . '/') |
|
||||
endif |
|
||||
|
|
||||
let @/ = l:pattern |
|
||||
let @" = l:saved_reg |
|
||||
endfunction |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue