Last active
June 12, 2021 12:48
-
-
Save kanekomasahiro/c59ab45c9ab565100fa5adce086a5fc9 to your computer and use it in GitHub Desktop.
python用のvimrc.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
" This is Gary Bernhardt's .vimrc file | |
" vim:set ts=2 sts=2 sw=2 expandtab: | |
" remove all existing autocmds | |
autocmd! | |
" initialize plugins | |
call plug#begin('~/.vim/plugged') | |
Plug 'vim-ruby/vim-ruby' | |
Plug 'slim-template/vim-slim' | |
" Plug 'zivyangll/git-blame.vim' | |
Plug 'romainl/vim-cool' | |
" JavaScript | |
" Plug 'pangloss/vim-javascript' | |
Plug 'MaxMEllon/vim-jsx-pretty' | |
" TypeScript highlighting/indent | |
Plug 'leafgarland/typescript-vim' | |
" Plug 'HerringtonDarkholme/yats.vim' | |
" Plug 'peitalin/vim-jsx-typescript' | |
" Plug 'ianks/vim-tsx' | |
" TypeScript semantic support | |
Plug 'Quramy/tsuquyomi' | |
Plug 'w0rp/ale' | |
" Color schemes | |
Plug 'jonathanfilip/vim-lucius' | |
colorscheme onedark | |
call plug#end() | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" BASIC EDITING CONFIGURATION | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
set nocompatible | |
" allow unsaved background buffers and remember marks/undo for them | |
set hidden | |
" remember more commands and search history | |
set history=10000 | |
set expandtab | |
set tabstop=2 | |
set shiftwidth=2 | |
set softtabstop=2 | |
set autoindent | |
set laststatus=2 | |
set showmatch | |
set incsearch | |
set hlsearch | |
set number | |
" Show vertical line in column 80 | |
set colorcolumn=80 | |
" make searches case-sensitive only if they contain upper-case characters | |
set ignorecase smartcase | |
" Always show tab bar at the top | |
set scrolloff=3 | |
" Don't make backups at all | |
set nobackup | |
set nowritebackup | |
set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp | |
set directory=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp | |
" allow backspacing over everything in insert mode | |
set backspace=indent,eol,start | |
" display incomplete commands | |
set showcmd | |
" Enable highlighting for syntax | |
syntax on | |
" Enable file type detection. | |
" Use the default filetype settings, so that mail gets 'tw' set to 72, | |
" 'cindent' is on in C files, etc. | |
" Also load indent files, to automatically do language-dependent indenting. | |
filetype plugin indent on | |
" use emacs-style tab completion when selecting files, etc | |
set wildmode=longest,list | |
" make tab completion for files/buffers act like bash | |
set wildmenu | |
let mapleader="," | |
" Fix slow O inserts | |
:set timeout timeoutlen=1000 ttimeoutlen=100 | |
" Normally, Vim messes with iskeyword when you open a shell file. This can | |
" leak out, polluting other file types even after a 'set ft=' change. This | |
" variable prevents the iskeyword change so it can't hurt anyone. | |
let g:sh_noisk=1 | |
" Modelines (comments that set vim options on a per-file basis) | |
set modeline | |
set modelines=3 | |
" Turn folding off for real, hopefully | |
set foldmethod=manual | |
set nofoldenable | |
" Insert only one space when joining lines that contain sentence-terminating | |
" punctuation like `.`. | |
set nojoinspaces | |
" If a file is changed outside of vim, automatically reload it without asking | |
set autoread | |
" Use the old vim regex engine (version 1, as opposed to version 2, which was | |
" introduced in Vim 7.3.969). The Ruby syntax highlighting is significantly | |
" slower with the new regex engine. | |
set re=1 | |
" Stop SQL language files from doing unholy things to the C-c key | |
let g:omni_sql_no_default_maps = 1 | |
" Diffs are shown side-by-side not above/below | |
set diffopt=vertical | |
" Always show the sign column | |
set signcolumn=no | |
" True color mode! (Requires a fancy modern terminal, but iTerm works.) | |
:set termguicolors | |
" Write swap files to disk and trigger CursorHold event faster (default is | |
" after 4000 ms of inactivity) | |
:set updatetime=200 | |
" Completion options. | |
" menu: use a popup menu | |
" preview: show more info in menu | |
:set completeopt=menu,preview | |
:set statusline=%<%f\ (%{&ft})\ %-4(%m%)%=%-19(%3l,%02c%03V%) | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" CUSTOM AUTOCMDS | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
augroup vimrcEx | |
" Clear all autocmds in the group | |
autocmd! | |
autocmd FileType text setlocal textwidth=78 | |
" Jump to last cursor position unless it's invalid or in an event handler | |
autocmd BufReadPost * | |
\ if line("'\"") > 0 && line("'\"") <= line("$") | | |
\ exe "normal g`\"" | | |
\ endif | |
"for ruby, autoindent with two spaces, always expand tabs | |
autocmd FileType ruby,haml,eruby,yaml,html,sass,cucumber set ai sw=2 sts=2 et | |
autocmd FileType python set sw=4 sts=4 et | |
autocmd! BufRead,BufNewFile *.sass setfiletype sass | |
autocmd BufRead *.mkd set ai formatoptions=tcroqn2 comments=n:> | |
autocmd BufRead *.markdown set ai formatoptions=tcroqn2 comments=n:> | |
" Indent p tags | |
" autocmd FileType html,eruby if g:html_indent_tags !~ '\\|p\>' | let g:html_indent_tags .= '\|p\|li\|dt\|dd' | endif | |
" Don't syntax highlight markdown because it's often wrong | |
autocmd! FileType mkd setlocal syn=off | |
" Leave the return key alone when in command line windows, since it's used | |
" to run commands there. | |
autocmd! CmdwinEnter * :unmap <cr> | |
autocmd! CmdwinLeave * :call MapCR() | |
" *.md is markdown | |
autocmd! BufNewFile,BufRead *.md setlocal ft= | |
" indent slim two spaces, not four | |
autocmd! FileType slim set sw=2 sts=2 et | |
" javascript | |
autocmd! FileType javascript set sw=2 sts=2 expandtab | |
" Expand tabs in Go. Was gofmt raised in a barn?! | |
autocmd! FileType go set sw=4 sts=4 expandtab | retab | |
" Two-space indents in json | |
autocmd! FileType json set sw=2 sts=2 expandtab | |
" Hitting K in a Ruby file opens rdoc, which completely breaks the terminal | |
" to the point of having to kill vim and do `reset`. Unmap it entirely. | |
nnoremap K <Nop> | |
" Compute syntax highlighting from beginning of file. (By default, vim only | |
" looks 200 lines back, which can make it highlight code incorrectly in some | |
" long files.) | |
autocmd BufEnter * :syntax sync fromstart | |
" Vim 8.2 adds built-in JSX support which seems broken. Setting these | |
" filetypes lets the installed plugins deal with JSX/TSX instead. | |
autocmd bufnewfile,bufread *.tsx set filetype=typescript.tsx | |
autocmd bufnewfile,bufread *.jsx set filetype=javascript.jsx | |
augroup END | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" MISC KEY MAPS | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
map <leader>y "*y | |
" Move around splits with <c-hjkl> | |
nnoremap <c-j> <c-w>j | |
nnoremap <c-k> <c-w>k | |
nnoremap <c-h> <c-w>h | |
nnoremap <c-l> <c-w>l | |
" Insert a hash rocket with <c-l> | |
imap <c-l> <space>=><space> | |
" Can't be bothered to understand ESC vs <c-c> in insert mode | |
inoremap <c-c> <esc> | |
" <leader><leader> is more convenient than <c-^> | |
nnoremap <leader><leader> <c-^> | |
" Align selected lines | |
vnoremap <leader>ib :!align<cr> | |
" Close all other splits | |
nnoremap <leader>o :only<cr> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" MULTIPURPOSE TAB KEY | |
" Indent if we're at the beginning of a line. Else, do completion. | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
function! InsertTabWrapper() | |
let col = col('.') - 1 | |
if !col | |
return "\<tab>" | |
endif | |
let char = getline('.')[col - 1] | |
if char =~ '\k' | |
" There's an identifier before the cursor, so complete the identifier. | |
return "\<c-p>" | |
else | |
return "\<tab>" | |
endif | |
endfunction | |
inoremap <expr> <tab> InsertTabWrapper() | |
inoremap <s-tab> <c-n> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" SHORTCUT TO REFERENCE CURRENT FILE'S PATH IN COMMAND LINE MODE | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
cnoremap <expr> %% expand('%:h').'/' | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" RENAME CURRENT FILE | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
function! RenameFile() | |
let old_name = expand('%') | |
let new_name = input('New file name: ', expand('%'), 'file') | |
if new_name != '' && new_name != old_name | |
exec ':saveas ' . new_name | |
exec ':silent !rm ' . old_name | |
redraw! | |
endif | |
endfunction | |
map <leader>n :call RenameFile()<cr> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" EXTRACT VARIABLE (SKETCHY) | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
function! ExtractVariable() | |
let name = input("Variable name: ") | |
if name == '' | |
return | |
endif | |
" Enter visual mode (not sure why this is needed since we're already in | |
" visual mode anyway) | |
normal! gv | |
" Replace selected text with the variable name | |
exec "normal c" . name | |
" Define the variable on the line above | |
exec "normal! O" . name . " = " | |
" Paste the original selected text to be the variable value | |
normal! $p | |
endfunction | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" INLINE VARIABLE (SKETCHY) | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
function! InlineVariable() | |
" Copy the variable under the cursor into the 'a' register | |
:let l:tmp_a = @a | |
:normal "ayiw | |
" Delete variable and equals sign | |
:normal 2daW | |
" Delete the expression into the 'b' register | |
:let l:tmp_b = @b | |
:normal "bd$ | |
" Delete the remnants of the line | |
:normal dd | |
" Go to the end of the previous line so we can start our search for the | |
" usage of the variable to replace. Doing '0' instead of 'k$' doesn't | |
" work; I'm not sure why. | |
normal k$ | |
" Find the next occurence of the variable | |
exec '/\<' . @a . '\>' | |
" Replace that occurence with the text we yanked | |
exec ':.s/\<' . @a . '\>/' . escape(@b, "/") | |
:let @a = l:tmp_a | |
:let @b = l:tmp_b | |
endfunction | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" Refactoring mappings | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
vnoremap <leader>rv :call ExtractVariable()<cr> | |
nnoremap <leader>ri :call InlineVariable()<cr> | |
nnoremap <leader>rn :TsuRenameSymbol<cr> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" MAPS TO JUMP TO SPECIFIC COMMAND-T TARGETS AND FILES | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
map <leader>gr :topleft :split config/routes.rb<cr> | |
function! ShowRoutes() | |
" Requires 'scratch' plugin | |
:topleft 100 :split __Routes__ | |
" Make sure Vim doesn't write __Routes__ as a file | |
:set buftype=nofile | |
" Delete everything | |
:normal 1GdG | |
" Put routes output in buffer | |
:0r! rake -s routes | |
" Size window to number of lines (1 plus rake output length) | |
:exec ":normal " . line("$") . "_ " | |
" Move cursor to bottom | |
:normal 1GG | |
" Delete empty trailing line | |
:normal dd | |
endfunction | |
map <leader>gR :call ShowRoutes()<cr> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" Selecta Mappings | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" Run a given vim command on the results of fuzzy selecting from a given shell | |
" command. See usage below. | |
function! SelectaCommand(choice_command, selecta_args, vim_command) | |
try | |
exec a:vim_command . " " . SelectaOutput(a:choice_command, a:selecta_args) | |
catch /Vim:Interrupt/ | |
" Swallow the ^C so that the redraw below happens; otherwise there will be | |
" leftovers from selecta on the screen | |
redraw! | |
return | |
endtry | |
endfunction | |
function! SelectaOutput(choice_command, selecta_args) | |
let selection = system(a:choice_command . " | selecta " . a:selecta_args) | |
" Escape spaces in the file name. That ensures that it's a single argument | |
" when concatenated with vim_command and run with exec. | |
let selection = substitute(selection, ' ', '\\ ', "g") | |
redraw! | |
return selection | |
endfunction | |
function! SelectaFile(path, glob, command) | |
call SelectaCommand("fd -t f . " . a:path, "", a:command) | |
endfunction | |
function! SelectaFileContents() | |
try | |
let selection = SelectaOutput("ls src/**/*.ts* | while read fn; do nl -b a \"$fn\" | while read line; do echo \"$fn:$line\"; done; done", "| cut -d \" \" -f 1") | |
catch /Vim:Interrupt/ | |
" Swallow the ^C so that the redraw below happens; otherwise there will be | |
" leftovers from selecta on the screen | |
redraw! | |
return | |
endtry | |
exec substitute(selection, "^\\([^:]\\+\\):\\([0-9]\\+\\).*$", ":e +\\2 \\1", "") | |
endfunction | |
nnoremap <leader>f :call SelectaFile(".", "*", ":edit")<cr> | |
nnoremap <leader>F :call SelectaFileContents()<cr> | |
nnoremap <leader>gv :call SelectaFile("app/views", "*", ":edit")<cr> | |
nnoremap <leader>gc :call SelectaFile("app/controllers", "*", ":edit")<cr> | |
nnoremap <leader>gm :call SelectaFile("app/models", "*", ":edit")<cr> | |
nnoremap <leader>gh :call SelectaFile("app/helpers", "*", ":edit")<cr> | |
nnoremap <leader>gl :call SelectaFile("lib", "*", ":edit")<cr> | |
nnoremap <leader>gp :call SelectaFile("public", "*", ":edit")<cr> | |
nnoremap <leader>gs :call SelectaFile("app/assets/stylesheets", "*.sass", ":edit")<cr> | |
nnoremap <leader>e :call SelectaFile(expand('%:h'), "*", ":edit")<cr> | |
nnoremap <leader>v :call SelectaFile(expand('%:h'), "*", ":view")<cr> | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
" Typescript Mappings | |
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" | |
nnoremap <leader>d :TsuDefinition<cr> | |
nnoremap <leader>D :TsuTypeDefinition<cr> | |
"Fuzzy select | |
function! SelectaIdentifier() | |
" Yank the word under the cursor into the z register | |
normal "zyiw | |
" Fuzzy match files in the current directory, starting with the word under | |
" the cursor | |
call SelectaCommand("find * -type f", "-s " . @z, ":e") | |
endfunction | |
nnoremap <c-g> :call SelectaIdentifier()<cr> | |
" Show the vim highlight groups for whatever's under the cursor. This is only | |
" useful for debugging vim color schemes. | |
nnoremap <leader>h :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<' . synIDattr(synID(line("."),col("."),0),"name") ."> lo<" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">"<CR> | |
" These two functions are specific to Execute Program. You don't need them. | |
function! GenerateStepID() | |
:r!bin/generate-step-id | |
:normal k | |
:normal J | |
:normal x | |
endfunction | |
function! ReplaceStepID() | |
" Delete the existing ID. | |
normal diw | |
" Move the cursor to the # that marked the ID. | |
normal 0f# | |
" Insert a newline, separating the part of the original line before the # | |
" from the part after. | |
execute "normal! a\n\<esc>" | |
" Remove all whitespace before this line (the second one, containing what | |
" was after the #). | |
left | |
" Move back up to the first half of the original line | |
normal k | |
" Generate a new step ID below this line | |
:r!bin/generate-step-id | |
" Move back up to the first half of the original line again | |
normal k | |
" Join with the new step ID | |
normal gJ | |
" Join with whatever was after the original step ID | |
normal gJ | |
endfunction | |
nnoremap <leader>s :call GenerateStepID()<cr> | |
nnoremap <leader>S :call ReplaceStepID()<cr> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment