├── .gitignore ├── README.md ├── demos ├── coffee.gif ├── mongodb.gif └── mysql.gif ├── doc └── pipe2eval.txt └── plugin ├── pipe2eval.sh └── pipe2eval.vim /.gitignore: -------------------------------------------------------------------------------- 1 | /doc/tags 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pipe2eval 2 | 3 | simple REPL inside vim 4 | 5 | supports: python, php, coffee, mysql, mongodb, redis, sh, go, javascript, ruby, elixir ... 6 | 7 | ## demos 8 | 9 | coffeescript 10 | 11 | ![coffeescript](https://github.com/zweifisch/pipe2eval/raw/master/demos/coffee.gif) 12 | 13 | * [mysql](https://github.com/zweifisch/pipe2eval/raw/master/demos/mysql.gif) 14 | * [mongodb](https://github.com/zweifisch/pipe2eval/raw/master/demos/mongodb.gif) 15 | 16 | ## install 17 | 18 | via vundle 19 | ```vim 20 | Bundle "zweifisch/pipe2eval" 21 | ``` 22 | 23 | tempfiles are put to `/dev/shm/` by default, `export PIP2EVAL_TMP_FILE_PATH` to 24 | override. 25 | 26 | On Mac OS X, `/dev/` is highly locked down permissions wise. If you're on OS X it's recommended to use another folder, such as `/tmp/shms` or similar (you'll have to create it). To this by adding `export PIP2EVAL_TMP_FILE_PATH=/tmp/shms` to your Bash/ZSH RC file. 27 | 28 | ## usage 29 | 30 | press `v` to evaluate current line, `vip` to evaluate a paragraph 31 | 32 | to specify a diffrent filetype use the Pipe2 command `:Pipe2 redis`, `:Pipe2 mongo` ... 33 | 34 | evaluate an empty line will clear the context 35 | 36 | ## key mappings 37 | By default, pipe2eval maps `` in Visual mode with: 38 | 39 | ```vim 40 | vmap ':![pipe2eval dir]/plugin/pipe2eval.sh text' 41 | ``` 42 | 43 | This mapping can be customized by setting `g:pipe2eval_map_key`. For example: 44 | 45 | ```vim 46 | let g:pipe2eval_map_key = 'p2e' 47 | ``` 48 | 49 | ### specify a mysql connection 50 | 51 | ```sql 52 | -- hostname localhost 53 | -- username root 54 | -- password secret 55 | -- database test 56 | ``` 57 | 58 | ### specify a mongodb connection 59 | 60 | ```javascript 61 | // host localhost 62 | // port 27017 63 | // db test 64 | ``` 65 | 66 | mongodb commands 67 | 68 | ```javascript 69 | //> dbs 70 | //> collections 71 | //> version 72 | //> status 73 | //> status mem 74 | //> connections 75 | //> session 76 | ``` 77 | 78 | ### special commands for shell 79 | 80 | evaluate commands on a remote maschine 81 | 82 | ``` 83 | #> set ssh dbserver1 84 | uptime 85 | ``` 86 | 87 | end it 88 | ``` 89 | #> set ssh 90 | ``` 91 | 92 | ### c 93 | 94 | `v` to complie and run current file 95 | 96 | passing arguments 97 | 98 | ```c 99 | // arg1 arg2 100 | ``` 101 | 102 | ### sqlite 103 | 104 | `:Pipe2 sqlite` 105 | 106 | ```sql 107 | -- file /path/to/sqlite3.db 108 | 109 | .mode line 110 | select * from table limit 1; 111 | ``` 112 | 113 | ### rust/go 114 | 115 | `v` to complie and run current file 116 | -------------------------------------------------------------------------------- /demos/coffee.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zweifisch/pipe2eval/a4d83767b29ad3df86d06c9e8270bb8a8e95c78e/demos/coffee.gif -------------------------------------------------------------------------------- /demos/mongodb.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zweifisch/pipe2eval/a4d83767b29ad3df86d06c9e8270bb8a8e95c78e/demos/mongodb.gif -------------------------------------------------------------------------------- /demos/mysql.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zweifisch/pipe2eval/a4d83767b29ad3df86d06c9e8270bb8a8e95c78e/demos/mysql.gif -------------------------------------------------------------------------------- /doc/pipe2eval.txt: -------------------------------------------------------------------------------- 1 | *pipe2eval.txt* simple REPL inside vim 2 | Author: zweifisch 3 | License: Same terms as Vim itself (see |license|) 4 | 5 | ================================================================================ 6 | INTRODUCTION *pipe2eval* 7 | 8 | Supports: python, php, coffee, mysql, mongodb, redis, sh, go, javascript, ruby, 9 | elixir ... 10 | 11 | ================================================================================ 12 | USAGE *pipe2eval-usage* 13 | 14 | Press V to evaluate current line, vip to evaluate a paragraph. 15 | 16 | Evaluate an empty line to clear the buffer's context. 17 | 18 | pipe2eval will set the evaluation language based on each buffer's |filetype|. 19 | 20 | -------------------------------------------------------------------------------- 21 | *pipe2eval-:Pipe2* 22 | :Pipe2 [filetype] To specify a different filetype 23 | Examples: 24 | :Pipe2 redis 25 | :Pipe2 mongo 26 | 27 | -------------------------------------------------------------------------------- 28 | KEY MAPPINGS *pipe2eval-key-mappings* 29 | By default, pipe2eval maps in |Visual| mode with: 30 | vmap ':![pipe2eval dir]/plugin/pipe2eval.sh text' 31 | This mapping can be customized by setting the |g:pipe2eval_map_key| 32 | 33 | g:pipe2eval_map_key *pipe2eval-map_key* 34 | Change the key to be mapped by pipe2eval 35 | Example: 36 | let g:pipe2eval_map_key = 'p2e' 37 | 38 | ================================================================================ 39 | ABOUT *pipe2eval-about* 40 | 41 | Grab the latest version or report a bug on GitHub: 42 | http://github.com/zweifisch/pipe2eval 43 | -------------------------------------------------------------------------------- /plugin/pipe2eval.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # TODO 4 | # * each buffer should has it's own context 5 | 6 | INPUT_LANG=$1 7 | INPUT_FILE="$2" 8 | 9 | if [ -z "$PIP2EVAL_TMP_FILE_PATH" ]; then 10 | PIP2EVAL_TMP_FILE_PATH=/dev/shm/ 11 | fi 12 | PREFIX=repl 13 | TMP_FILE=$PIP2EVAL_TMP_FILE_PATH$PREFIX.$INPUT_LANG 14 | 15 | 16 | fn_exists(){ 17 | declare -F $1 &> /dev/null 18 | return $? 19 | } 20 | 21 | fn_call(){ 22 | if fn_exists $INPUT_LANG\_$1; then 23 | $INPUT_LANG\_$1 ${@:2} 24 | else 25 | default_$1 ${@:2} 26 | fi 27 | } 28 | 29 | process_commands(){ 30 | cmd="$( sed -n '1 s/^[#\/;-]\{1,2\}> \([a-zA-Z0-9_-]\+\) \?\(.*\)\?$/\1/p' < $TMP_FILE.new)" 31 | args="$(sed -n '1 s/^[#\/;-]\{1,2\}> \([^ ]\+\) \(.*\)$/\2/p' < $TMP_FILE.new)" 32 | if [ -n "$cmd" ]; then 33 | fn_call command_$cmd "$args" 34 | exit 0 35 | fi 36 | } 37 | 38 | hr() { 39 | echo -n "$1" 40 | pad=$(printf '%0.1s' "-"{1..80}) 41 | padlen=$((80 - ${#1} - ${#2})) 42 | printf '%0.*s' $padlen $pad 43 | echo "$2" 44 | } 45 | 46 | # commands --------------------------------------------------------------------- 47 | 48 | default_command_files(){ 49 | find $PIP2EVAL_TMP_FILE_PATH -maxdepth 1 -name "$PREFIX.$INPUT_LANG*" 50 | } 51 | 52 | default_command_reset(){ 53 | find $PIP2EVAL_TMP_FILE_PATH -maxdepth 1 -name "$PREFIX.$INPUT_LANG*" -exec rm -f {} \; 54 | } 55 | 56 | default_command_set(){ 57 | if [ -n "$1" ]; then 58 | echo $2 > $TMP_FILE.$1 59 | fi 60 | } 61 | 62 | 63 | # default ---------------------------------------------------------------------- 64 | 65 | default_comment(){ 66 | # do nothing 67 | : 68 | } 69 | 70 | default_init(){ 71 | fn_call reset > /dev/null 72 | } 73 | 74 | default_reset(){ 75 | > $TMP_FILE 76 | > $TMP_FILE.error 77 | echo '# context cleared' 78 | } 79 | 80 | default_error(){ 81 | echo "# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" 82 | sed -e 's/^\(.*\)$/# \1/' < "$TMP_FILE.error" 83 | echo "# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" 84 | } 85 | 86 | default_merge(){ 87 | # do nothing 88 | : 89 | } 90 | 91 | default_eval(){ 92 | cat $TMP_FILE "$TMP_FILE.new" | $INPUT_LANG - 2> "$TMP_FILE.error" |\ 93 | sed -e 's/^\(.*\)$/# \1/' 94 | } 95 | 96 | # php -------------------------------------------------------------------------- 97 | 98 | php_reset(){ 99 | echo ' $TMP_FILE 100 | } 101 | 102 | php_eval(){ 103 | fns=$(sed -n "s/^function \+\([^(]\+\).*$/\1/p" < "$TMP_FILE.new") 104 | for fn in $fns; do 105 | sed -i "s/^function \+\($fn\) *(/function \1$(date +%s)(/" "$TMP_FILE" 106 | done 107 | 108 | classes=$(sed -n "s/ *class \+\([^ ]\+\).*$/\1/p" < "$TMP_FILE.new") 109 | for cls in $classes; do 110 | sed -i "s/ *class \+\($cls\)/ class \1$(date +%s)/" "$TMP_FILE" 111 | done 112 | 113 | cat $TMP_FILE "$TMP_FILE.new" |\ 114 | sed '$! b 115 | /^[ \t]*[})]/ b 116 | s/\(.*\);/var_export(\1);/' |\ 117 | tee $TMP_FILE.eval |\ 118 | php 2> "$TMP_FILE.error" | sed -e 's/^\(.*\)$/# \1/' 119 | } 120 | 121 | php_merge(){ 122 | cat "$TMP_FILE.new" >> $TMP_FILE; 123 | } 124 | 125 | # python ----------------------------------------------------------------------- 126 | 127 | python_reset(){ 128 | echo 'import pprint' > $TMP_FILE 129 | echo '# context cleared' 130 | } 131 | 132 | python_eval(){ 133 | tail -1 $TMP_FILE.new | grep -q '^\s*\(return\|import\|from\)' 134 | 135 | if [ $? -eq 0 ]; then 136 | cat $TMP_FILE $TMP_FILE.new | $INPUT_LANG - 2> $TMP_FILE.error |\ 137 | sed -e 's/^\(.*\)$/# \1/' 138 | else 139 | cat $TMP_FILE $TMP_FILE.new | sed -e '/^$/d' |\ 140 | sed '$ s/^[^ \t].*$/____ =&\ 141 | \pprint.pprint(____)\ 142 | \____/' | $INPUT_LANG - 2> $TMP_FILE.error |\ 143 | sed -e 's/^\(.*\)$/# \1/' 144 | fi 145 | } 146 | 147 | python_merge(){ 148 | cat "$TMP_FILE.new" >> $TMP_FILE; 149 | } 150 | 151 | # coffeescript ----------------------------------------------------------------- 152 | 153 | coffee_eval(){ 154 | cat $TMP_FILE $TMP_FILE.new |\ 155 | sed -e '/^$/d' |\ 156 | sed '$ s/^\([ \t]*\)\(.*\)$/\1____ =\2\ 157 | \1console.log ____\ 158 | \1____/' > $TMP_FILE.eval 159 | $INPUT_LANG $TMP_FILE.eval 2> $TMP_FILE.error | sed -e 's/^\(.*\)$/# \1/' 160 | } 161 | 162 | coffee_merge(){ 163 | cat "$TMP_FILE.new" >> $TMP_FILE; 164 | } 165 | 166 | # livescript ------------------------------------------------------------------ 167 | 168 | ls_eval(){ 169 | cat $TMP_FILE $TMP_FILE.new |\ 170 | sed -e '/^$/d' |\ 171 | sed '$ s/^\([ \t]*\)\(.*\)$/\1____ =\2\ 172 | \1console.log ____\ 173 | \1____/' > $TMP_FILE.eval 174 | livescript $TMP_FILE.eval 2> $TMP_FILE.error | sed -e 's/^\(.*\)$/# \1/' 175 | } 176 | 177 | ls_merge(){ 178 | cat "$TMP_FILE.new" >> $TMP_FILE; 179 | } 180 | 181 | # javascript ------------------------------------------------------------------- 182 | 183 | javascript_eval(){ 184 | cat $TMP_FILE $TMP_FILE.new |\ 185 | sed -e '/^$/d' > $TMP_FILE.eval 186 | node -p < $TMP_FILE.eval 2> $TMP_FILE.error | sed -e 's/^\(.*\)$/\/\/ \1/' 187 | } 188 | 189 | javascript_merge(){ 190 | cat "$TMP_FILE.new" >> $TMP_FILE; 191 | } 192 | 193 | javascript_reset(){ 194 | > $TMP_FILE 195 | > $TMP_FILE.error 196 | echo '// context cleared' 197 | } 198 | 199 | # ruby ------------------------------------------------------------------------- 200 | 201 | ruby_eval(){ 202 | cat $TMP_FILE $TMP_FILE.new | sed -e '/^$/d' |\ 203 | sed '$! b 204 | /^[ \t]*end/ b 205 | s/^\([ \t]*\)\(.*\)$/\ 206 | \1____ =\2\ 207 | \1puts ____.inspect\ 208 | \1____/' |\ 209 | $INPUT_LANG - 2> $TMP_FILE.error | sed -e 's/^\(.*\)$/# \1/' 210 | } 211 | 212 | ruby_merge(){ 213 | cat "$TMP_FILE.new" >> $TMP_FILE; 214 | } 215 | 216 | # elixir ----------------------------------------------------------------------- 217 | 218 | elixir_eval(){ 219 | cat $TMP_FILE $TMP_FILE.new | sed -e '/^$/d' |\ 220 | sed '$! b 221 | /^[ \t]*end/ b 222 | s/^\([ \t]*\)\(.*\)$/\ 223 | \1____ =\2\ 224 | \1IO.puts inspect ____\ 225 | \1____/' > $TMP_FILE.eval 226 | $INPUT_LANG $TMP_FILE.eval 2> $TMP_FILE.error | sed -e 's/^\(.*\)$/# \1/' 227 | sed -i '/the result of the expression is ignored/d' $TMP_FILE.error 228 | sed -i '/variable .* is unused/d' $TMP_FILE.error 229 | } 230 | 231 | elixir_merge(){ 232 | cat "$TMP_FILE.new" >> $TMP_FILE; 233 | } 234 | 235 | # lua -------------------------------------------------------------------------- 236 | 237 | lua_eval(){ 238 | cat $TMP_FILE $TMP_FILE.new | sed -e '/^$/d' |\ 239 | sed '$! b 240 | /^[ \t]*end/ b 241 | s/^\([ \t]*\)\(.*\)$/\ 242 | \1____ =\2\ 243 | \1print(____)/' |\ 244 | $INPUT_LANG - 2> $TMP_FILE.error | sed -e 's/^\(.*\)$/-- \1/' 245 | } 246 | 247 | lua_merge(){ 248 | cat "$TMP_FILE.new" >> $TMP_FILE; 249 | } 250 | 251 | lua_reset(){ 252 | > $TMP_FILE 253 | > $TMP_FILE.error 254 | echo '-- context cleared' 255 | } 256 | 257 | # go --------------------------------------------------------------------------- 258 | 259 | go_reset(){ 260 | go_eval 261 | } 262 | 263 | go_eval(){ 264 | hr "// " 265 | $INPUT_LANG run "$INPUT_FILE" | sed -e 's/^\(.*\)$/\/\/ \1/' 266 | } 267 | 268 | # rust ------------------------------------------------------------------------- 269 | 270 | rust_eval(){ 271 | hr "// " 272 | rustc $INPUT_FILE -o $TMP_FILE.out 273 | $TMP_FILE.out | sed -e 's/^\(.*\)$/\/\/ \1/' 274 | } 275 | 276 | rust_reset(){ 277 | rust_eval 278 | } 279 | 280 | # haskell ---------------------------------------------------------------------- 281 | 282 | haskell_reset(){ 283 | > $TMP_FILE 284 | > $TMP_FILE.error 285 | echo '-- context cleared' 286 | } 287 | 288 | haskell_eval(){ 289 | if grep -q '^main' $TMP_FILE.new; then 290 | cat $TMP_FILE "$TMP_FILE.new" |\ 291 | runhaskell 2> "$TMP_FILE.error" | sed -e 's/^\(.*\)$/-- \1/' 292 | fi 293 | } 294 | 295 | # haskell_merge(){ 296 | # cat "$TMP_FILE.new" | sed '/^main/,$ d' >> $TMP_FILE; 297 | # } 298 | 299 | # c ---------------------------------------------------------------------------- 300 | 301 | c_reset(){ 302 | c_eval 303 | } 304 | 305 | c_eval(){ 306 | argv="$(sed -n 's/\s*\/\/// p' $TMP_FILE.new)" 307 | cc -Wall -g "$INPUT_FILE" -o "$TMP_FILE.o" 308 | hr "// " 309 | "$TMP_FILE.o" $argv 2> "$TMP_FILE.error" | sed -e 's/^\(.*\)$/\/\/ \1/' 310 | } 311 | 312 | # bash ------------------------------------------------------------------------- 313 | 314 | bash_eval(){ 315 | if [ -f $TMP_FILE.ssh ]; then 316 | host="$(cat $TMP_FILE.ssh)" 317 | if [ -n "$host" ]; then 318 | ssh $host "bash -s" < $TMP_FILE.new 2> $TMP_FILE.error | sed -e 's/.*/# &/' 319 | else 320 | rm $TMP_FILE.ssh 321 | bash $TMP_FILE.new 2> $TMP_FILE.error | sed -e 's/.*/# &/' 322 | fi 323 | else 324 | bash $TMP_FILE.new 2> $TMP_FILE.error | sed -e 's/.*/# &/' 325 | fi 326 | } 327 | 328 | # markdown --------------------------------------------------------------------- 329 | 330 | markdown_eval(){ 331 | markdown $TMP_FILE.new 332 | } 333 | 334 | # mongo ------------------------------------------------------------------------ 335 | 336 | mongo_exec(){ 337 | [ -f $TMP_FILE.host ] && host=$(cat $TMP_FILE.host) || host=127.0.0.1 338 | [ -f $TMP_FILE.port ] && port=$(cat $TMP_FILE.port) || port=27017 339 | [ -f $TMP_FILE.db ] && db=$(cat $TMP_FILE.db) 340 | mongo --quiet --host $host --port $port $db $TMP_FILE.eval 341 | } 342 | 343 | mongo_eval(){ 344 | db=$(sed -ne 's/^use \([a-zA-Z0-9_-]\+\)$/\1/p' < $TMP_FILE.new) 345 | if [ -n "$db" ]; then 346 | echo $db > $TMP_FILE.db 347 | exit 0 348 | fi 349 | 350 | db=$(sed -ne 's/^\/\/ db \([a-zA-Z0-9_-]\+\)$/\1/p' < $TMP_FILE.new) 351 | host=$(sed -ne 's/^\/\/ host \([a-zA-Z0-9._-]\+\)$/\1/p' < $TMP_FILE.new) 352 | port=$(sed -ne 's/^\/\/ port \([a-zA-Z0-9._-]\+\)$/\1/p' < $TMP_FILE.new) 353 | 354 | [ -n "$host" ] && echo $host > $TMP_FILE.host 355 | [ -n "$port" ] && echo $port > $TMP_FILE.port 356 | [ -n "$db" ] && echo $db > $TMP_FILE.db 357 | 358 | sed -e 's/^\(db\..*\)/var ____ = \1/' \ 359 | -e '$ a \ 360 | if("undefined" != typeof ____ && null != ____){\ 361 | if("function" == typeof ____.toArray){\ 362 | ____ = ____.toArray()\ 363 | if (____.length == 1){\ 364 | ____ = ____[0]\ 365 | }else{\ 366 | print("items:" + ____.length)\ 367 | }\ 368 | }\ 369 | if(Array.isArray(____) && ____.length > 20){\ 370 | printjson(____.slice(0,20))\ 371 | print("...")\ 372 | }else{\ 373 | printjson(____)\ 374 | }\ 375 | }' > $TMP_FILE.eval < $TMP_FILE.new 376 | mongo_exec 377 | } 378 | 379 | mongo_command_version(){ 380 | echo 'print(db.version())' > $TMP_FILE.eval 381 | mongo_exec 382 | } 383 | 384 | mongo_command_dbs(){ 385 | echo 'printjson(db.getMongo().getDBNames())' > $TMP_FILE.eval 386 | mongo_exec 387 | } 388 | 389 | mongo_command_collections(){ 390 | echo 'printjson(db.getCollectionNames())' > $TMP_FILE.eval 391 | mongo_exec 392 | } 393 | 394 | mongo_command_connections(){ 395 | echo 'db.currentOp(true).inprog.forEach(function(o){print(o.client)});' > $TMP_FILE.eval 396 | mongo_exec | cut -d ':' -f 1 | sort | uniq -c | sort -rn 397 | } 398 | 399 | mongo_command_session(){ 400 | [ -f $TMP_FILE.host ] && host=$(cat $TMP_FILE.host) || host=127.0.0.1 401 | [ -f $TMP_FILE.port ] && port=$(cat $TMP_FILE.port) || port=27017 402 | [ -f $TMP_FILE.db ] && db=$(cat $TMP_FILE.db) 403 | 404 | echo "host $host" 405 | echo "port $port" 406 | echo "db $db" 407 | } 408 | 409 | mongo_command_status(){ 410 | if [ -n "$1" ]; then 411 | echo "printjson(db.serverStatus().$1)" > $TMP_FILE.eval 412 | else 413 | echo "printjson(db.serverStatus())" > $TMP_FILE.eval 414 | fi 415 | mongo_exec 416 | } 417 | 418 | # sql -------------------------------------------------------------------------- 419 | 420 | sql_eval(){ 421 | host=`sed -ne 's/^-- host \([a-zA-Z0-9._-]\+\)$/\1/p' < $TMP_FILE.new` 422 | user=`sed -ne 's/^-- user \([a-zA-Z0-9._-]\+\)$/\1/p' < $TMP_FILE.new` 423 | password=`sed -ne 's/^-- password \([a-zA-Z0-9._#$-]\+\)$/\1/p' < $TMP_FILE.new` 424 | db=`sed -ne 's/^use \([a-z0-9_-]\+\);\?$/\1/ip' < $TMP_FILE.new` 425 | if [ -z "$db" ]; then 426 | db=`sed -ne 's/^-- database \([a-z0-9_-]\+\)$/\1/ip' < $TMP_FILE.new` 427 | fi 428 | 429 | HOST_SAVED=$TMP_FILE.host 430 | USER_SAVED=$TMP_FILE.user 431 | PASSWORD_SAVED=$TMP_FILE.password 432 | DB_SAVED=$TMP_FILE.db 433 | 434 | if [ -n "$host" ]; then 435 | echo $host > $HOST_SAVED 436 | > $DB_SAVED 437 | fi 438 | if [ -n "$user" ]; then 439 | echo $user > $USER_SAVED 440 | fi 441 | if [ -n "$password" ]; then 442 | echo $password > $PASSWORD_SAVED 443 | fi 444 | if [ -n "$db" ]; then 445 | echo $db > $DB_SAVED 446 | fi 447 | 448 | _USER="`cat $USER_SAVED`" 449 | _PASSWORD="`cat $PASSWORD_SAVED`" 450 | _HOST="`cat $HOST_SAVED`" 451 | if [ -f "$DB_SAVED" ]; then 452 | _DB="`cat $DB_SAVED`" 453 | fi 454 | 455 | #TODO use || ? 456 | _PIPE=`sed -n '$ s/[^|]*|\(.*\)/\1/p' < $TMP_FILE.new` 457 | if [ -n "$_PIPE" ]; then 458 | sed -i '$ s/\([^|]*\).*/\1/' $TMP_FILE.new 459 | mysql -t -u$_USER -p$_PASSWORD -h$_HOST $_DB < $TMP_FILE.new | $_PIPE 460 | else 461 | # DATABASE can be empty 462 | mysql -t -u$_USER -p$_PASSWORD -h$_HOST $_DB < $TMP_FILE.new |\ 463 | sed -e 's/^\(.*\)$/-- \1/' 464 | fi 465 | } 466 | 467 | # sqlite ----------------------------------------------------------------------- 468 | 469 | sqlite_eval(){ 470 | file=`sed -ne 's/^-- file \(.*\)$/\1/p' < $TMP_FILE.new` 471 | 472 | FILE_SAVED=$TMP_FILE.file 473 | 474 | if [ -n "$file" ]; then 475 | echo $file > $FILE_SAVED 476 | fi 477 | 478 | _FILE="`cat $FILE_SAVED`" 479 | 480 | sqlite3 "$_FILE" < $TMP_FILE.new |\ 481 | sed -e 's/^\(.*\)$/-- \1/' 482 | } 483 | 484 | 485 | # xml -------------------------------------------------------------------------- 486 | 487 | xml_eval(){ 488 | sed -e 's/^[^<]*//' -e 's/[^>]*$//' | xml_pp 489 | } 490 | 491 | # redis ------------------------------------------------------------------------ 492 | 493 | redis_eval(){ 494 | redis-cli -x < $TMP_FILE.new 495 | } 496 | 497 | 498 | # json ------------------------------------------------------------------------- 499 | 500 | json_eval(){ 501 | python -mjson.tool < $TMP_FILE.new 502 | } 503 | 504 | # yaml ------------------------------------------------------------------------- 505 | 506 | yaml_eval(){ 507 | ruby -ryaml -rjson -e 'puts JSON.pretty_generate(YAML.load(STDIN.read))' \ 508 | < $TMP_FILE.new 2> "$TMP_FILE.error" | sed -e 's/^\(.*\)$/# \1/' 509 | } 510 | 511 | # html ------------------------------------------------------------------------- 512 | 513 | html_eval(){ 514 | html2text < $TMP_FILE.new 515 | } 516 | 517 | # R ---------------------------------------------------------------------------- 518 | 519 | r_eval(){ 520 | R --vanilla <$TMP_FILE.new> $TMP_FILE.out 521 | sed -n '20,$p' $TMP_FILE.out | sed -ne 's/^\([^>].*\)$/# \1/p' 522 | } 523 | 524 | # main ------------------------------------------------------------------------- 525 | 526 | main(){ 527 | tee $TMP_FILE.new 528 | 529 | if [ ! -f "$TMP_FILE" ]; then 530 | fn_call 'init' 531 | fi 532 | 533 | if [ -z "$(sed '/^$/d' < "$TMP_FILE.new")" ]; then 534 | fn_call 'reset' 535 | exit 0 536 | fi 537 | 538 | process_commands 539 | 540 | fn_call 'eval' 541 | 542 | if [ -s "$TMP_FILE.error" ]; then 543 | fn_call 'error' 544 | else 545 | fn_call 'merge' 546 | fi 547 | } 548 | 549 | main 550 | -------------------------------------------------------------------------------- /plugin/pipe2eval.vim: -------------------------------------------------------------------------------- 1 | com! -nargs=+ Pipe2 call Pipe2eval() 2 | 3 | let s:map_key_default = "" 4 | let g:pipe2eval = expand(':p:h') . '/pipe2eval.sh' 5 | 6 | function! Pipe2eval(lang) 7 | let l:map_key = exists('g:pipe2eval_map_key') ? g:pipe2eval_map_key : s:map_key_default 8 | execute "vm ". l:map_key ." :!". g:pipe2eval ." ". a:lang . " " . expand('%:p') . "gv" 9 | endfunction 10 | 11 | au FileType * call Pipe2eval(&filetype) 12 | --------------------------------------------------------------------------------