Jay Taylor's notes
back to listing indexgarybernhardt/dotfiles
[web search]
Original source (github.com)
Clipped on: 2016-03-02
Skip to content
b3ff433
on May 22, 2015
525 lines (477 sloc)
17.8 KB
| 1 | " This is Gary Bernhardt's .vimrc file |
| 2 | " vim:set ts=2 sts=2 sw=2 expandtab: |
| 3 | |
| 4 | autocmd! |
| 5 | |
| 6 | call pathogen#incubate() |
| 7 | |
| 8 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 9 | " BASIC EDITING CONFIGURATION |
| 10 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 11 | set nocompatible |
| 12 | " allow unsaved background buffers and remember marks/undo for them |
| 13 | set hidden |
| 14 | " remember more commands and search history |
| 15 | set history=10000 |
| 16 | set expandtab |
| 17 | set tabstop=4 |
| 18 | set shiftwidth=4 |
| 19 | set softtabstop=4 |
| 20 | set autoindent |
| 21 | set laststatus=2 |
| 22 | set showmatch |
| 23 | set incsearch |
| 24 | set hlsearch |
| 25 | " make searches case-sensitive only if they contain upper-case characters |
| 26 | set ignorecase smartcase |
| 27 | " highlight current line |
| 28 | set cursorline |
| 29 | set cmdheight=1 |
| 30 | set switchbuf=useopen |
| 31 | set showtabline=2 |
| 32 | set winwidth=79 |
| 33 | " This makes RVM work inside Vim. I have no idea why. |
| 34 | set shell=bash |
| 35 | " Prevent Vim from clobbering the scrollback buffer. See |
| 36 | " http://www.shallowsky.com/linux/noaltscreen.html |
| 37 | set t_ti= t_te= |
| 38 | " keep more context when scrolling off the end of a buffer |
| 39 | set scrolloff=3 |
| 40 | " Don't make backups at all |
| 41 | set nobackup |
| 42 | set nowritebackup |
| 43 | set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp |
| 44 | set directory=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp |
| 45 | " allow backspacing over everything in insert mode |
| 46 | set backspace=indent,eol,start |
| 47 | " display incomplete commands |
| 48 | set showcmd |
| 49 | " Enable highlighting for syntax |
| 50 | syntax on |
| 51 | " Enable file type detection. |
| 52 | " Use the default filetype settings, so that mail gets 'tw' set to 72, |
| 53 | " 'cindent' is on in C files, etc. |
| 54 | " Also load indent files, to automatically do language-dependent indenting. |
| 55 | filetype plugin indent on |
| 56 | " use emacs-style tab completion when selecting files, etc |
| 57 | set wildmode=longest,list |
| 58 | " make tab completion for files/buffers act like bash |
| 59 | set wildmenu |
| 60 | let mapleader="," |
| 61 | " Fix slow O inserts |
| 62 | :set timeout timeoutlen=1000 ttimeoutlen=100 |
| 63 | " Normally, Vim messes with iskeyword when you open a shell file. This can |
| 64 | " leak out, polluting other file types even after a 'set ft=' change. This |
| 65 | " variable prevents the iskeyword change so it can't hurt anyone. |
| 66 | let g:sh_noisk=1 |
| 67 | " Modelines (comments that set vim options on a per-file basis) |
| 68 | set modeline |
| 69 | set modelines=3 |
| 70 | " Turn folding off for real, hopefully |
| 71 | set foldmethod=manual |
| 72 | set nofoldenable |
| 73 | " Insert only one space when joining lines that contain sentence-terminating |
| 74 | " punctuation like `.`. |
| 75 | set nojoinspaces |
| 76 | " If a file is changed outside of vim, automatically reload it without asking |
| 77 | set autoread |
| 78 | |
| 79 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 80 | " CUSTOM AUTOCMDS |
| 81 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 82 | augroup vimrcEx |
| 83 | " Clear all autocmds in the group |
| 84 | autocmd! |
| 85 | autocmd FileType text setlocal textwidth=78 |
| 86 | " Jump to last cursor position unless it's invalid or in an event handler |
| 87 | autocmd BufReadPost * |
| 88 | \ if line("'\"") > 0 && line("'\"") <= line("$") | |
| 89 | \ exe "normal g`\"" | |
| 90 | \ endif |
| 91 | |
| 92 | "for ruby, autoindent with two spaces, always expand tabs |
| 93 | autocmd FileType ruby,haml,eruby,yaml,html,javascript,sass,cucumber set ai sw=2 sts=2 et |
| 94 | autocmd FileType python set sw=4 sts=4 et |
| 95 | |
| 96 | autocmd! BufRead,BufNewFile *.sass setfiletype sass |
| 97 | |
| 98 | autocmd BufRead *.mkd set ai formatoptions=tcroqn2 comments=n:> |
| 99 | autocmd BufRead *.markdown set ai formatoptions=tcroqn2 comments=n:> |
| 100 | |
| 101 | " Indent p tags |
| 102 | " autocmd FileType html,eruby if g:html_indent_tags !~ '\\|p\>' | let g:html_indent_tags .= '\|p\|li\|dt\|dd' | endif |
| 103 | |
| 104 | " Don't syntax highlight markdown because it's often wrong |
| 105 | autocmd! FileType mkd setlocal syn=off |
| 106 | |
| 107 | " Leave the return key alone when in command line windows, since it's used |
| 108 | " to run commands there. |
| 109 | autocmd! CmdwinEnter * :unmap <cr> |
| 110 | autocmd! CmdwinLeave * :call MapCR() |
| 111 | |
| 112 | " *.md is markdown |
| 113 | autocmd! BufNewFile,BufRead *.md setlocal ft= |
| 114 | |
| 115 | " indent slim two spaces, not four |
| 116 | autocmd! FileType *.slim set sw=2 sts=2 et |
| 117 | augroup END |
| 118 | |
| 119 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 120 | " COLOR |
| 121 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 122 | :set t_Co=256 " 256 colors |
| 123 | :set background=dark |
| 124 | :color grb256 |
| 125 | |
| 126 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 127 | " STATUS LINE |
| 128 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 129 | :set statusline=%<%f\ (%{&ft})\ %-4(%m%)%=%-19(%3l,%02c%03V%) |
| 130 | |
| 131 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 132 | " MISC KEY MAPS |
| 133 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 134 | map <leader>y "*y |
| 135 | " Move around splits with <c-hjkl> |
| 136 | nnoremap <c-j> <c-w>j |
| 137 | nnoremap <c-k> <c-w>k |
| 138 | nnoremap <c-h> <c-w>h |
| 139 | nnoremap <c-l> <c-w>l |
| 140 | " Insert a hash rocket with <c-l> |
| 141 | imap <c-l> <space>=><space> |
| 142 | " Can't be bothered to understand ESC vs <c-c> in insert mode |
| 143 | imap <c-c> <esc> |
| 144 | nnoremap <leader><leader> <c-^> |
| 145 | " Close all other windows, open a vertical split, and open this file's test |
| 146 | " alternate in it. |
| 147 | nnoremap <leader>s :call FocusOnFile()<cr> |
| 148 | function! FocusOnFile() |
| 149 | tabnew % |
| 150 | normal! v |
| 151 | normal! l |
| 152 | call OpenTestAlternate() |
| 153 | normal! h |
| 154 | endfunction |
| 155 | " Reload in chrome |
| 156 | map <leader>l :w\|:silent !reload-chrome<cr> |
| 157 | " Align selected lines |
| 158 | vnoremap <leader>ib :!align<cr> |
| 159 | |
| 160 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 161 | " MULTIPURPOSE TAB KEY |
| 162 | " Indent if we're at the beginning of a line. Else, do completion. |
| 163 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 164 | function! InsertTabWrapper() |
| 165 | let col = col('.') - 1 |
| 166 | if !col || getline('.')[col - 1] !~ '\k' |
| 167 | return "\<tab>" |
| 168 | else |
| 169 | return "\<c-p>" |
| 170 | endif |
| 171 | endfunction |
| 172 | inoremap <expr> <tab> InsertTabWrapper() |
| 173 | inoremap <s-tab> <c-n> |
| 174 | |
| 175 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 176 | " OPEN FILES IN DIRECTORY OF CURRENT FILE |
| 177 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 178 | cnoremap <expr> %% expand('%:h').'/' |
| 179 | map <leader>e :edit %% |
| 180 | map <leader>v :view %% |
| 181 | |
| 182 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 183 | " RENAME CURRENT FILE |
| 184 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 185 | function! RenameFile() |
| 186 | let old_name = expand('%') |
| 187 | let new_name = input('New file name: ', expand('%'), 'file') |
| 188 | if new_name != '' && new_name != old_name |
| 189 | exec ':saveas ' . new_name |
| 190 | exec ':silent !rm ' . old_name |
| 191 | redraw! |
| 192 | endif |
| 193 | endfunction |
| 194 | map <leader>n :call RenameFile()<cr> |
| 195 | |
| 196 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 197 | " PROMOTE VARIABLE TO RSPEC LET |
| 198 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 199 | function! PromoteToLet() |
| 200 | :normal! dd |
| 201 | " :exec '?^\s*it\>' |
| 202 | :normal! P |
| 203 | :.s/\(\w\+\) = \(.*\)$/let(:\1) { \2 }/ |
| 204 | :normal == |
| 205 | endfunction |
| 206 | :command! PromoteToLet :call PromoteToLet() |
| 207 | :map <leader>p :PromoteToLet<cr> |
| 208 | |
| 209 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 210 | " EXTRACT VARIABLE (SKETCHY) |
| 211 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 212 | function! ExtractVariable() |
| 213 | let name = input("Variable name: ") |
| 214 | if name == '' |
| 215 | return |
| 216 | endif |
| 217 | " Enter visual mode (not sure why this is needed since we're already in |
| 218 | " visual mode anyway) |
| 219 | normal! gv |
| 220 | |
| 221 | " Replace selected text with the variable name |
| 222 | exec "normal c" . name |
| 223 | " Define the variable on the line above |
| 224 | exec "normal! O" . name . " = " |
| 225 | " Paste the original selected text to be the variable value |
| 226 | normal! $p |
| 227 | endfunction |
| 228 | vnoremap <leader>rv :call ExtractVariable()<cr> |
| 229 | |
| 230 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 231 | " INLINE VARIABLE (SKETCHY) |
| 232 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 233 | function! InlineVariable() |
| 234 | " Copy the variable under the cursor into the 'a' register |
| 235 | :let l:tmp_a = @a |
| 236 | :normal "ayiw |
| 237 | " Delete variable and equals sign |
| 238 | :normal 2daW |
| 239 | " Delete the expression into the 'b' register |
| 240 | :let l:tmp_b = @b |
| 241 | :normal "bd$ |
| 242 | " Delete the remnants of the line |
| 243 | :normal dd |
| 244 | " Go to the end of the previous line so we can start our search for the |
| 245 | " usage of the variable to replace. Doing '0' instead of 'k$' doesn't |
| 246 | " work; I'm not sure why. |
| 247 | normal k$ |
| 248 | " Find the next occurence of the variable |
| 249 | exec '/\<' . @a . '\>' |
| 250 | " Replace that occurence with the text we yanked |
| 251 | exec ':.s/\<' . @a . '\>/' . escape(@b, "/") |
| 252 | :let @a = l:tmp_a |
| 253 | :let @b = l:tmp_b |
| 254 | endfunction |
| 255 | nnoremap <leader>ri :call InlineVariable()<cr> |
| 256 | |
| 257 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 258 | " MAPS TO JUMP TO SPECIFIC COMMAND-T TARGETS AND FILES |
| 259 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 260 | map <leader>gr :topleft :split config/routes.rb<cr> |
| 261 | function! ShowRoutes() |
| 262 | " Requires 'scratch' plugin |
| 263 | :topleft 100 :split __Routes__ |
| 264 | " Make sure Vim doesn't write __Routes__ as a file |
| 265 | :set buftype=nofile |
| 266 | " Delete everything |
| 267 | :normal 1GdG |
| 268 | " Put routes output in buffer |
| 269 | :0r! rake -s routes |
| 270 | " Size window to number of lines (1 plus rake output length) |
| 271 | :exec ":normal " . line("$") . "_ " |
| 272 | " Move cursor to bottom |
| 273 | :normal 1GG |
| 274 | " Delete empty trailing line |
| 275 | :normal dd |
| 276 | endfunction |
| 277 | map <leader>gR :call ShowRoutes()<cr> |
| 278 | |
| 279 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 280 | " SWITCH BETWEEN TEST AND PRODUCTION CODE |
| 281 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 282 | function! OpenTestAlternate() |
| 283 | let new_file = AlternateForCurrentFile() |
| 284 | exec ':e ' . new_file |
| 285 | endfunction |
| 286 | function! AlternateForCurrentFile() |
| 287 | let current_file = expand("%") |
| 288 | let new_file = current_file |
| 289 | let in_spec = match(current_file, '^spec/') != -1 |
| 290 | let going_to_spec = !in_spec |
| 291 | let in_app = match(current_file, '\<controllers\>') != -1 || match(current_file, '\<models\>') != -1 || match(current_file, '\<views\>') != -1 || match(current_file, '\<helpers\>') != -1 |
| 292 | if going_to_spec |
| 293 | if in_app |
| 294 | let new_file = substitute(new_file, '^app/', '', '') |
| 295 | end |
| 296 | let new_file = substitute(new_file, '\.e\?rb$', '_spec.rb', '') |
| 297 | let new_file = 'spec/' . new_file |
| 298 | else |
| 299 | let new_file = substitute(new_file, '_spec\.rb$', '.rb', '') |
| 300 | let new_file = substitute(new_file, '^spec/', '', '') |
| 301 | if in_app |
| 302 | let new_file = 'app/' . new_file |
| 303 | end |
| 304 | endif |
| 305 | return new_file |
| 306 | endfunction |
| 307 | nnoremap <leader>. :call OpenTestAlternate()<cr> |
| 308 | |
| 309 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 310 | " RUNNING TESTS |
| 311 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 312 | function! MapCR() |
| 313 | nnoremap <cr> :call RunTestFile()<cr> |
| 314 | endfunction |
| 315 | call MapCR() |
| 316 | nnoremap <leader>T :call RunNearestTest()<cr> |
| 317 | nnoremap <leader>a :call RunTests('')<cr> |
| 318 | nnoremap <leader>c :w\|:!script/features<cr> |
| 319 | nnoremap <leader>w :w\|:!script/features --profile wip<cr> |
| 320 | |
| 321 | function! RunTestFile(...) |
| 322 | if a:0 |
| 323 | let command_suffix = a:1 |
| 324 | else |
| 325 | let command_suffix = "" |
| 326 | endif |
| 327 | |
| 328 | " Run the tests for the previously-marked file. |
| 329 | let in_test_file = match(expand("%"), '\(.feature\|_spec.rb\|_test.py\)$') != -1 |
| 330 | if in_test_file |
| 331 | call SetTestFile(command_suffix) |
| 332 | elseif !exists("t:grb_test_file") |
| 333 | return |
| 334 | end |
| 335 | call RunTests(t:grb_test_file) |
| 336 | endfunction |
| 337 | |
| 338 | function! RunNearestTest() |
| 339 | let spec_line_number = line('.') |
| 340 | call RunTestFile(":" . spec_line_number) |
| 341 | endfunction |
| 342 | |
| 343 | function! SetTestFile(command_suffix) |
| 344 | " Set the spec file that tests will be run for. |
| 345 | let t:grb_test_file=@% . a:command_suffix |
| 346 | endfunction |
| 347 | |
| 348 | function! RunTests(filename) |
| 349 | " Write the file and run tests for the given filename |
| 350 | if expand("%") != "" |
| 351 | :w |
| 352 | end |
| 353 | if match(a:filename, '\.feature$') != -1 |
| 354 | exec ":!script/features " . a:filename |
| 355 | else |
| 356 | " First choice: project-specific test script |
| 357 | if filereadable("script/test") |
| 358 | exec ":!script/test " . a:filename |
| 359 | " Fall back to the .test-commands pipe if available, assuming someone |
| 360 | " is reading the other side and running the commands |
| 361 | elseif filewritable(".test-commands") |
| 362 | let cmd = 'rspec --color --format progress --require "~/lib/vim_rspec_formatter" --format VimFormatter --out tmp/quickfix' |
| 363 | exec ":!echo " . cmd . " " . a:filename . " > .test-commands" |
| 364 | |
| 365 | " Write an empty string to block until the command completes |
| 366 | sleep 100m " milliseconds |
| 367 | :!echo > .test-commands |
| 368 | redraw! |
| 369 | " Fall back to a blocking test run with Bundler |
| 370 | elseif filereadable("Gemfile") |
| 371 | exec ":!bundle exec rspec --color " . a:filename |
| 372 | " If we see python-looking tests, assume they should be run with Nose |
| 373 | elseif strlen(glob("test/**/*.py") . glob("tests/**/*.py")) |
| 374 | exec "!nosetests " . a:filename |
| 375 | " Fall back to a normal blocking test run |
| 376 | else |
| 377 | exec ":!rspec --color " . a:filename |
| 378 | end |
| 379 | end |
| 380 | endfunction |
| 381 | |
| 382 | |
| 383 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 384 | " Md5 COMMAND |
| 385 | " Show the MD5 of the current buffer |
| 386 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 387 | command! -range Md5 :echo system('echo '.shellescape(join(getline(<line1>, <line2>), '\n')) . '| md5') |
| 388 | |
| 389 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 390 | " OpenChangedFiles COMMAND |
| 391 | " Open a split for each dirty file in git |
| 392 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 393 | function! OpenChangedFiles() |
| 394 | only " Close all windows, unless they're modified |
| 395 | let status = system('git status -s | grep "^ \?\(M\|A\|UU\)" | sed "s/^.\{3\}//"') |
| 396 | let filenames = split(status, "\n") |
| 397 | exec "edit " . filenames[0] |
| 398 | for filename in filenames[1:] |
| 399 | exec "sp " . filename |
| 400 | endfor |
| 401 | endfunction |
| 402 | command! OpenChangedFiles :call OpenChangedFiles() |
| 403 | |
| 404 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 405 | " InsertTime COMMAND |
| 406 | " Insert the current time |
| 407 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 408 | command! InsertTime :normal a<c-r>=strftime('%F %H:%M:%S.0 %z')<cr> |
| 409 | |
| 410 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 411 | " FindConditionals COMMAND |
| 412 | " Start a search for conditional branches, both implicit and explicit |
| 413 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 414 | command! FindConditionals :normal /\<if\>\|\<unless\>\|\<and\>\|\<or\>\|||\|&&<cr> |
| 415 | |
| 416 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 417 | " Diff tab management: open the current git diff in a tab |
| 418 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 419 | command! GdiffInTab tabedit %|vsplit|Gdiff |
| 420 | nnoremap <leader>d :GdiffInTab<cr> |
| 421 | nnoremap <leader>D :tabclose<cr> |
| 422 | |
| 423 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 424 | " Test quickfix list management |
| 425 | " |
| 426 | " If the tests write a tmp/quickfix file, these mappings will navigate through |
| 427 | " it |
| 428 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 429 | function! GetBufferList() |
| 430 | redir =>buflist |
| 431 | silent! ls |
| 432 | redir END |
| 433 | return buflist |
| 434 | endfunction |
| 435 | |
| 436 | function! BufferIsOpen(bufname) |
| 437 | let buflist = GetBufferList() |
| 438 | for bufnum in map(filter(split(buflist, '\n'), 'v:val =~ "'.a:bufname.'"'), 'str2nr(matchstr(v:val, "\\d\\+"))') |
| 439 | if bufwinnr(bufnum) != -1 |
| 440 | return 1 |
| 441 | endif |
| 442 | endfor |
| 443 | return 0 |
| 444 | endfunction |
| 445 | |
| 446 | function! ToggleQuickfix() |
| 447 | if BufferIsOpen("Quickfix List") |
| 448 | cclose |
| 449 | else |
| 450 | call OpenQuickfix() |
| 451 | endif |
| 452 | endfunction |
| 453 | |
| 454 | function! OpenQuickfix() |
| 455 | cgetfile tmp/quickfix |
| 456 | topleft cwindow |
| 457 | if &ft == "qf" |
| 458 | cc |
| 459 | endif |
| 460 | endfunction |
| 461 | |
| 462 | nnoremap <leader>q :call ToggleQuickfix()<cr> |
| 463 | nnoremap <leader>Q :cc<cr> |
| 464 | nnoremap <leader>j :cnext<cr> |
| 465 | nnoremap <leader>k :cprev<cr> |
| 466 | |
| 467 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 468 | " RemoveFancyCharacters COMMAND |
| 469 | " Remove smart quotes, etc. |
| 470 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 471 | function! RemoveFancyCharacters() |
| 472 | let typo = {} |
| 473 | let typo["“"] = '"' |
| 474 | let typo["”"] = '"' |
| 475 | let typo["‘"] = "'" |
| 476 | let typo["’"] = "'" |
| 477 | let typo["–"] = '--' |
| 478 | let typo["—"] = '---' |
| 479 | let typo["…"] = '...' |
| 480 | :exe ":%s/".join(keys(typo), '\|').'/\=typo[submatch(0)]/ge' |
| 481 | endfunction |
| 482 | command! RemoveFancyCharacters :call RemoveFancyCharacters() |
| 483 | |
| 484 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 485 | " Selecta Mappings |
| 486 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" |
| 487 | " Run a given vim command on the results of fuzzy selecting from a given shell |
| 488 | " command. See usage below. |
| 489 | function! SelectaCommand(choice_command, selecta_args, vim_command) |
| 490 | try |
| 491 | let selection = system(a:choice_command . " | selecta " . a:selecta_args) |
| 492 | catch /Vim:Interrupt/ |
| 493 | " Swallow the ^C so that the redraw below happens; otherwise there will be |
| 494 | " leftovers from selecta on the screen |
| 495 | redraw! |
| 496 | return |
| 497 | endtry |
| 498 | redraw! |
| 499 | exec a:vim_command . " " . selection |
| 500 | endfunction |
| 501 | |
| 502 | function! SelectaFile(path) |
| 503 | call SelectaCommand("find " . a:path . "/* -type f", "", ":e") |
| 504 | endfunction |
| 505 | |
| 506 | nnoremap <leader>f :call SelectaFile(".")<cr> |
| 507 | nnoremap <leader>gv :call SelectaFile("app/views")<cr> |
| 508 | nnoremap <leader>gc :call SelectaFile("app/controllers")<cr> |
| 509 | nnoremap <leader>gm :call SelectaFile("app/models")<cr> |
| 510 | nnoremap <leader>gh :call SelectaFile("app/helpers")<cr> |
| 511 | nnoremap <leader>gl :call SelectaFile("lib")<cr> |
| 512 | nnoremap <leader>gp :call SelectaFile("public")<cr> |
| 513 | nnoremap <leader>gs :call SelectaFile("public/stylesheets")<cr> |
| 514 | nnoremap <leader>gf :call SelectaFile("features")<cr> |
| 515 | |
| 516 | "Fuzzy select |
| 517 | function! SelectaIdentifier() |
| 518 | " Yank the word under the cursor into the z register |
| 519 | normal "zyiw |
| 520 | " Fuzzy match files in the current directory, starting with the word under |
| 521 | " the cursor |
| 522 | call SelectaCommand("find * -type f", "-s " . @z, ":e") |
| 523 | endfunction |
| 524 | nnoremap <c-g> :call SelectaIdentifier()<cr> |







