├── demo.gif ├── plugin └── operator.vim └── readme.md /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/romgrk/equal.operator/5c4cb737db8ded6bf56bbf090fda2b81efa7028c/demo.gif -------------------------------------------------------------------------------- /plugin/operator.vim: -------------------------------------------------------------------------------- 1 | " File: operator.vim 2 | " Author: romgrk 3 | " Date: 01 Feb 2016 4 | " Description: LHS/RHS operators 5 | " !::exe [so %] 6 | 7 | onoremap (operator-lhs) :normal! =selectLeftOperand('i') 8 | onoremap (operator-rhs) :normal! =selectRightOperand('i') 9 | onoremap (operator-Lhs) :normal! =selectLeftOperand('a') 10 | onoremap (operator-Rhs) :normal! =selectRightOperand('a') 11 | 12 | vnoremap (visual-lhs) "\" . selectLeftOperand('i') 13 | vnoremap (visual-rhs) "\" . selectRightOperand('i') 14 | vnoremap (visual-Lhs) "\" . selectLeftOperand('a') 15 | vnoremap (visual-Rhs) "\" . selectRightOperand('a') 16 | 17 | if get(g:, 'equal_operator_default_mappings', 1) 18 | omap il (operator-rhs) 19 | omap ih (operator-lhs) 20 | omap al (operator-Rhs) 21 | omap ah (operator-Lhs) 22 | 23 | xmap il (visual-rhs) 24 | xmap ih (visual-lhs) 25 | xmap al (visual-Rhs) 26 | xmap ah (visual-Lhs) 27 | end 28 | 29 | 30 | " Specs {{{ 31 | " 32 | " 1. operate on left/right side of equal sign 33 | " 2. if no equal sign is present, tries to match colon sign 34 | " 3. if no match is made, fails 35 | " 36 | " Test: 37 | " 38 | " let value = get_value() 39 | " String->Value("ok"); 40 | " key: "value" 41 | " let value += 'string' 42 | " key => "value" 43 | " let value >>= 'string' 44 | " return value 45 | " 46 | " }}} 47 | 48 | fu! s:selectLeftOperand(target) " {{{ 49 | let pos = s:findAssignment(0) 50 | if empty(pos) 51 | return '' 52 | end 53 | 54 | let column = 55 | \ a:target == 'i' ? 56 | \ pos[0] : pos[1] 57 | 58 | let keys = column.'|v^' 59 | return keys 60 | endfu 61 | fu! s:selectRightOperand(target) " {{{ 62 | let pos = s:findAssignment(1) 63 | if empty(pos) 64 | return '' 65 | end 66 | 67 | let column = 68 | \ a:target == 'i' ? 69 | \ pos[1] : pos[0] 70 | let column += 1 71 | let end = pos[2] 72 | 73 | let keys = column . '|v' 74 | 75 | if end != -1 76 | let keys .= end . '|' 77 | else 78 | let keys .= '$h' 79 | end 80 | 81 | return keys 82 | endfunction " }}} 83 | 84 | fu! s:findAssignment(dir, ...) " {{{ 85 | let line = a:0 ? a:1 : getline('.') 86 | let i = 0 87 | 88 | let patterns = [ 89 | \ '[><+\-*=/!@#$%^?&:.~]{,2}\=[><+\-*=/!@#$%^?&:.~]{,2}', 90 | \ ':', 91 | \ '-\>', 92 | \ 'return', 93 | \ ] 94 | 95 | for pattern in patterns 96 | let realPattern = 97 | \ '\v' . 98 | \ (a:dir == 0 ? '\s*' : '') . 99 | \ pattern . 100 | \ (a:dir == 1 ? '\s*(\s*)@=' : '') 101 | 102 | let end = -1 103 | if a:dir == 1 104 | let m = matchstrpos(line, '\v[;,]\s*$') 105 | if m[1] != -1 106 | let end = m[1] 107 | end 108 | end 109 | let m = matchstrpos(line, realPattern) 110 | if m[1] != -1 111 | return m[1:2] + [end] 112 | end 113 | endfor 114 | 115 | " Fail & return 116 | return v:null 117 | endfu " }}} 118 | 119 | " let x = 42; 120 | " let g:s = 'let x = 42;' 121 | " let g:R = s:findAssignment(1, g:s) 122 | " Pp R, !empty(R) ? s[R[1] - 1:R[2] - 1] : s 123 | 124 | " if !empty(g:R) 125 | " Pp [R, g:s[R[0]:R[1]]] 126 | " else 127 | " Pp g:R 128 | " end 129 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # LHS/RHS operator 2 | 3 | A text object for the LHS or RHS of the equal-sign (or colon). 4 | 5 | ```javascript 6 | 7 | // al 8 | // ah |----------------------------------------| 9 | // |-----------| 10 | // ih il 11 | // |---------| |--------------------------------------| 12 | const value = [ { id: 42, text: 'alomeeaqswabwzix' } ] 13 | 14 | ``` 15 | 16 | Usage (default mappings): 17 | 18 | | Mode | Mapping | Effect | 19 | |------|---------|--------| 20 | | operator, visual | `il` | select inside RHS | 21 | | operator, visual | `ih` | select inside LHS | 22 | | operator, visual | `al` | select all RHS | 23 | | operator, visual | `ah` | select all LHS | 24 | 25 | 26 | Configure your own mappings as such: 27 | 28 | ```viml 29 | let equal_operator_default_mappings = 0 30 | 31 | omap =h (operator-lhs) 32 | omap =l (operator-Lhs) 33 | omap =H (operator-rhs) 34 | omap =L (operator-Rhs) 35 | 36 | vmap =h (visual-lhs) 37 | vmap =l (visual-rhs) 38 | vmap =H (visual-Lhs) 39 | vmap =L (visual-Rhs) 40 | ``` 41 | 42 | ### Demo 43 | 44 | ![demo](./demo.gif) 45 | 46 | ### Support 47 | 48 | This plugin uses a pattern to match the following lines: 49 | 50 | ``` 51 | let lhs = rhs() 52 | 53 | Lhs->Rhs("rhs"); 54 | 55 | lhs = Rhs->Rhs("rhs"); 56 | 57 | let lhs += 'rhs' 58 | 59 | lhs => "rhs" 60 | 61 | let lhs >>= 'rhs' 62 | 63 | return rhs 64 | ``` 65 | 66 | ## License 67 | 68 | Same as JSON as far as I'm concerned, but most of the code here is freely adapted from 69 | [Learn Vimscript the Hard Way](http://learnvimscriptthehardway.stevelosh.com/). (eternal thanks to Steve Losh) 70 | --------------------------------------------------------------------------------