Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
implement gtrans#translate()/#echo()/#buffer()
- Loading branch information
0 parents
commit 81fa58a
Showing
13 changed files
with
2,648 additions
and
0 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
"============================================================================= | ||
" FILE: autoload/gtrans.vim | ||
" AUTHOR: haya14busa | ||
" License: MIT license | ||
"============================================================================= | ||
scriptencoding utf-8 | ||
let s:save_cpo = &cpo | ||
set cpo&vim | ||
|
||
let s:Process = vital#gtrans#import('System.Process') | ||
let s:String = vital#gtrans#import('Data.String') | ||
|
||
let g:gtrans#buffer_height = get(g:, 'gtrans#buffer_height', &previewheight) | ||
|
||
function! gtrans#cmd(target_lang) abort | ||
let cmd = ['gtrans'] | ||
if a:target_lang !=# '' | ||
let cmd += ['-to', a:target_lang] | ||
endif | ||
return cmd | ||
endfunction | ||
|
||
" gtrans#translate() translates text to target lang and returns translated | ||
" text. It's synchronous API. | ||
" target_lang can be empty string and if it's empty, gtrans automatically | ||
" detects it. | ||
function! gtrans#translate(text, target_lang) abort | ||
if s:check() | ||
return | ||
endif | ||
let result = s:Process.execute(gtrans#cmd(a:target_lang), {'input': a:text}) | ||
return s:String.chomp(result.output) | ||
endfunction | ||
|
||
function! gtrans#echo(text, target_lang, echocmd) abort | ||
if s:check() | ||
return | ||
endif | ||
let echocmd = a:echocmd ==# '' ? 'echo' : a:echocmd | ||
let job = job_start(gtrans#cmd(a:target_lang), { | ||
\ 'callback': s:genechocb(echocmd), | ||
\ }) | ||
call ch_sendraw(job, a:text) | ||
call ch_close_in(job) | ||
endfunction | ||
|
||
function! gtrans#buffer(text, target_lang, id) abort | ||
if s:check() | ||
return | ||
endif | ||
let id = a:id ==# '' ? '0' : a:id | ||
let bufname = printf('gtrans://result/%s/', id) | ||
|
||
if bufexists(bufname) | ||
let currentbuf = bufnr('%') | ||
execute printf(':%d bufdo 1,$delete', bufnr(bufname)) | ||
execute printf(':%d buffer', currentbuf) | ||
endif | ||
|
||
let job = job_start(gtrans#cmd(a:target_lang), { | ||
\ 'out_io': 'buffer', | ||
\ 'out_name': bufname, | ||
\ 'out_msg': 0, | ||
\ }) | ||
|
||
let bufnr = ch_getbufnr(job, 'out') | ||
|
||
if bufnr !=# -1 | ||
let buftext = join([ | ||
\ a:text, | ||
\ '---', | ||
\ ], "\n") | ||
let currentbuf = bufnr('%') | ||
execute printf(':%d bufdo put! =buftext | $delete', bufnr(bufname)) | ||
execute printf(':%d buffer', currentbuf) | ||
endif | ||
|
||
call ch_sendraw(job, a:text) | ||
call ch_close_in(job) | ||
|
||
if bufwinnr(bufnr) ==# -1 | ||
execute printf(':%dsplit %s', g:gtrans#buffer_height, bufname) | ||
wincmd p | ||
endif | ||
endfunction | ||
|
||
|
||
function! s:genechocb(cmd) abort | ||
let f = {} | ||
function! f.cb(ch, msg) abort closure | ||
execute a:cmd string(a:msg) | ||
endfunction | ||
return f.cb | ||
endfunction | ||
|
||
" check() returns 0 if gtrans found, otherwise returns 1. | ||
function! s:check() abort | ||
if executable('gtrans') !=# 1 | ||
echom 'gtrans not found in PATH' | ||
return 1 | ||
endif | ||
return 0 | ||
endfunction | ||
|
||
let &cpo = s:save_cpo | ||
unlet s:save_cpo | ||
" __END__ | ||
" vim: expandtab softtabstop=2 shiftwidth=2 foldmethod=marker |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
function! vital#of(name) abort | ||
let files = globpath(&runtimepath, 'autoload/vital/' . a:name . '.vital', 1) | ||
let file = split(files, "\n") | ||
if empty(file) | ||
throw 'vital: version file not found: ' . a:name | ||
endif | ||
let ver = readfile(file[0], 'b') | ||
if empty(ver) | ||
throw 'vital: invalid version file: ' . a:name | ||
endif | ||
return vital#_{substitute(ver[0], '\W', '', 'g')}#new() | ||
endfunction |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
let s:_plugin_name = expand('<sfile>:t:r') | ||
|
||
function! vital#{s:_plugin_name}#new() abort | ||
return vital#{s:_plugin_name[1:]}#new() | ||
endfunction |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
" ___vital___ | ||
" NOTE: lines between '" ___vital___' is generated by :Vitalize. | ||
" Do not mofidify the code nor insert new lines before '" ___vital___' | ||
if v:version > 703 || v:version == 703 && has('patch1170') | ||
function! vital#_gtrans#Data#Dict#import() abort | ||
return map({'pick': '', 'clear': '', 'max_by': '', 'foldl': '', 'swap': '', 'omit': '', 'min_by': '', 'foldr': '', 'make_index': '', 'make': ''}, 'function("s:" . v:key)') | ||
endfunction | ||
else | ||
function! s:_SID() abort | ||
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze__SID$') | ||
endfunction | ||
execute join(['function! vital#_gtrans#Data#Dict#import() abort', printf("return map({'pick': '', 'clear': '', 'max_by': '', 'foldl': '', 'swap': '', 'omit': '', 'min_by': '', 'foldr': '', 'make_index': '', 'make': ''}, \"function('<SNR>%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") | ||
delfunction s:_SID | ||
endif | ||
" ___vital___ | ||
" Utilities for dictionary. | ||
|
||
let s:save_cpo = &cpo | ||
set cpo&vim | ||
|
||
" Makes a dict from keys and values | ||
function! s:make(keys, values, ...) abort | ||
let dict = {} | ||
let fill = a:0 ? a:1 : 0 | ||
for i in range(len(a:keys)) | ||
let key = type(a:keys[i]) == type('') ? a:keys[i] : string(a:keys[i]) | ||
if key ==# '' | ||
throw "vital: Data.Dict: Can't use an empty string for key." | ||
endif | ||
let dict[key] = get(a:values, i, fill) | ||
endfor | ||
return dict | ||
endfunction | ||
|
||
" Swaps keys and values | ||
function! s:swap(dict) abort | ||
return s:make(values(a:dict), keys(a:dict)) | ||
endfunction | ||
|
||
" Makes a index dict from a list | ||
function! s:make_index(list, ...) abort | ||
let value = a:0 ? a:1 : 1 | ||
return s:make(a:list, [], value) | ||
endfunction | ||
|
||
function! s:pick(dict, keys) abort | ||
let new_dict = {} | ||
for key in a:keys | ||
if has_key(a:dict, key) | ||
let new_dict[key] = a:dict[key] | ||
endif | ||
endfor | ||
return new_dict | ||
endfunction | ||
|
||
function! s:omit(dict, keys) abort | ||
let new_dict = copy(a:dict) | ||
for key in a:keys | ||
if has_key(a:dict, key) | ||
call remove(new_dict, key) | ||
endif | ||
endfor | ||
return new_dict | ||
endfunction | ||
|
||
function! s:clear(dict) abort | ||
for key in keys(a:dict) | ||
call remove(a:dict, key) | ||
endfor | ||
return a:dict | ||
endfunction | ||
|
||
function! s:_max_by(dict, expr) abort | ||
let dict = s:swap(map(copy(a:dict), a:expr)) | ||
let key = dict[max(keys(dict))] | ||
return [key, a:dict[key]] | ||
endfunction | ||
|
||
function! s:max_by(dict, expr) abort | ||
if empty(a:dict) | ||
throw 'vital: Data.Dict: Empty dictionary' | ||
endif | ||
return s:_max_by(a:dict, a:expr) | ||
endfunction | ||
|
||
function! s:min_by(dict, expr) abort | ||
if empty(a:dict) | ||
throw 'vital: Data.Dict: Empty dictionary' | ||
endif | ||
return s:_max_by(a:dict, '-(' . a:expr . ')') | ||
endfunction | ||
|
||
function! s:_foldl(f, init, xs) abort | ||
let memo = a:init | ||
for [k, v] in a:xs | ||
let expr = substitute(a:f, 'v:key', string(k), 'g') | ||
let expr = substitute(expr, 'v:val', string(v), 'g') | ||
let expr = substitute(expr, 'v:memo', string(memo), 'g') | ||
unlet memo | ||
let memo = eval(expr) | ||
endfor | ||
return memo | ||
endfunction | ||
|
||
function! s:foldl(f, init, dict) abort | ||
return s:_foldl(a:f, a:init, items(a:dict)) | ||
endfunction | ||
|
||
function! s:foldr(f, init, dict) abort | ||
return s:_foldl(a:f, a:init, reverse(items(a:dict))) | ||
endfunction | ||
|
||
let &cpo = s:save_cpo | ||
unlet s:save_cpo | ||
|
||
" vim:set et ts=2 sts=2 sw=2 tw=0: |
Oops, something went wrong.