1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 23:50:05 +08:00
SpaceVim/bundle/open-browser.vim/autoload/vital/__openbrowser__/OpenBrowser/Config.vim
2020-06-13 14:06:35 +08:00

233 lines
7.3 KiB
VimL

" vim:foldmethod=marker:fen:
scriptencoding utf-8
let s:save_cpo = &cpo
set cpo&vim
function! s:_vital_loaded(V) abort
let is_unix = has('unix')
let is_mswin = has('win16') || has('win32') || has('win64')
let is_cygwin = has('win32unix')
let is_macunix = !is_mswin && !is_cygwin && (has('mac') || has('macunix') || has('gui_macvim') || (!executable('xdg-open') && system('uname') =~? '^darwin'))
" FIXME: 'background' doesn't work now on neovim.
" https://github.com/tyru/open-browser.vim/issues/102
let s:background = has('nvim') ? 0 : 1
if is_cygwin
if executable('cygstart')
" Cygwin
function! s:_get_default_browser_commands()
return [
\ {'name': 'cygstart',
\ 'args': ['{browser}', '{uri}']}
\]
endfunction
else
" MSYS, MSYS2, ...
function! s:_get_default_browser_commands()
return [
\ {'name': 'rundll32',
\ 'args': 'rundll32 url.dll,FileProtocolHandler {use_vimproc ? uri : uri_noesc}'}
\]
endfunction
endif
elseif is_macunix
function! s:_get_default_browser_commands()
return [
\ {'name': 'open',
\ 'args': ['{browser}', '{uri}'],
\ 'background': s:background}
\]
endfunction
elseif is_mswin
function! s:_get_default_browser_commands()
return [
\ {'name': 'rundll32',
\ 'args': 'rundll32 url.dll,FileProtocolHandler {use_vimproc ? uri : uri_noesc}'}
\]
endfunction
elseif is_unix
function! s:_get_default_browser_commands()
if filereadable('/proc/version_signature') &&
\ get(readfile('/proc/version_signature', 'b', 1), 0, '') =~# '^Microsoft'
" Windows Subsystem for Linux (recent version's directory name is 'WINDOWS')
for rundll32 in [
\ '/mnt/c/WINDOWS/System32/rundll32.exe',
\ '/mnt/c/Windows/System32/rundll32.exe',
\]
if executable(rundll32)
return [
\ {'name': 'rundll32',
\ 'cmd': rundll32,
\ 'args': rundll32 . ' url.dll,FileProtocolHandler {use_vimproc ? uri : uri_noesc}'}
\]
endif
endfor
endif
return [
\ {'name': 'xdg-open',
\ 'args': ['{browser}', '{uri}'],
\ 'background': s:background},
\ {'name': 'x-www-browser',
\ 'args': ['{browser}', '{uri}'],
\ 'background': s:background},
\ {'name': 'firefox',
\ 'args': ['{browser}', '{uri}'],
\ 'background': s:background},
\ {'name': 'w3m',
\ 'args': ['{browser}', '{uri}'],
\ 'background': s:background},
\]
endfunction
else
throw 'OpenBrowser.Config: not supported environment'
endif
endfunction
function! s:new_user_var_source(prefix) abort
if !exists('s:_initialized')
call s:_init_global_vars(a:prefix)
let s:_initialized = 1
endif
return {
\ 'prefix': a:prefix,
\ 'get': function('s:_UserVarConfig_get'),
\}
endfunction
function! s:new_default_source() abort
return {
\ '_values': s:default_values(),
\ 'get': function('s:_DefaultConfig_get'),
\}
endfunction
function! s:_UserVarConfig_get(key) abort dict
let name = self.prefix . a:key
for ns in [b:, w:, t:, g:]
if has_key(ns, name)
return ns[name]
endif
endfor
throw 'openbrowser: internal error: '
\ . "s:get_var() couldn't find variable '" . name . "'."
endfunction
function! s:_DefaultConfig_get(key) abort dict
return self._values[a:key]
endfunction
function! s:_init_global_vars(prefix) abort
let default = s:default_values()
" Merge default values & user config values
for [key, value] in items(default)
let name = a:prefix . key
if type(value) is# type({})
let g:[name] = extend(get(g:, name, {}), value, 'keep')
else
let g:[name] = get(g:, name, value)
endif
endfor
" ======= Some special treatments for backward compatibility =======
function! s:_valid_commands_and_rules()
let open_commands = g:openbrowser_open_commands
let open_rules = g:openbrowser_open_rules
if type(open_commands) isnot type([])
return 0
endif
if type(open_rules) isnot type({})
return 0
endif
for cmd in open_commands
if !has_key(open_rules, cmd)
return 0
endif
endfor
return 1
endfunction
if !exists('g:openbrowser_browser_commands')
if exists('g:openbrowser_open_commands')
\ && exists('g:openbrowser_open_rules')
\ && s:_valid_commands_and_rules()
function! s:_convert_commands_and_rules()
let open_commands = g:openbrowser_open_commands
let open_rules = g:openbrowser_open_rules
let browser_commands = []
for cmd in open_commands
call add(browser_commands,{
\ 'name': cmd,
\ 'args': open_rules[cmd]
\})
endfor
return browser_commands
endfunction
let g:openbrowser_browser_commands = s:_convert_commands_and_rules()
else
let g:openbrowser_browser_commands = default.browser_commands
endif
endif
if !exists('g:openbrowser_format_message')
let g:openbrowser_format_message = default.format_message
elseif type(g:openbrowser_format_message) is type('')
let msg = g:openbrowser_format_message
unlet g:openbrowser_format_message
let g:openbrowser_format_message = extend(
\ default.format_message, {'msg': msg}, 'force')
else
let g:openbrowser_format_message = extend(
\ g:openbrowser_format_message, default.format_message, 'keep')
endif
endfunction
function! s:default_values() abort
return {
\ 'browser_commands': s:_get_default_browser_commands(),
\ 'fix_schemes': {
\ 'ttp': 'http',
\ 'ttps': 'https',
\ },
\ 'fix_hosts': {},
\ 'fix_paths': {},
\ 'default_search': 'google',
\ 'search_engines': {
\ 'alc': 'https://eow.alc.co.jp/search?q={query}',
\ 'askubuntu': 'https://askubuntu.com/search?q={query}',
\ 'baidu': 'https://www.baidu.com/s?wd={query}&rsv_bp=0&rsv_spt=3&inputT=2478',
\ 'cpan': 'http://search.cpan.org/search?query={query}',
\ 'devdocs': 'https://devdocs.io/#q={query}',
\ 'duckduckgo': 'https://duckduckgo.com/?q={query}',
\ 'go': 'https://pkg.go.dev/search?q={query}',
\ 'fileformat': 'https://www.fileformat.info/info/unicode/char/{query}/',
\ 'github': 'https://github.com/search?q={query}',
\ 'google': 'https://google.com/search?q={query}',
\ 'php': 'https://php.net/{query}',
\ 'python': 'https://docs.python.org/dev/search.html?q={query}&check_keywords=yes&area=default',
\ 'twitter-search': 'https://twitter.com/search/{query}',
\ 'twitter-user': 'https://twitter.com/{query}',
\ 'vim': 'https://www.google.com/cse?cx=partner-pub-3005259998294962%3Abvyni59kjr1&ie=ISO-8859-1&q={query}&sa=Search&siteurl=www.vim.org%2F#gsc.tab=0&gsc.q={query}&gsc.page=1',
\ 'wikipedia': 'https://en.wikipedia.org/wiki/{query}',
\ 'wikipedia-ja': 'https://ja.wikipedia.org/wiki/{query}',
\ 'yahoo': 'https://search.yahoo.com/search?p={query}',
\ },
\ 'open_filepath_in_vim': 0,
\ 'open_vim_command': 'vsplit',
\ 'format_message': {
\ 'msg': "opening '{uri}' ... {done ? 'done! ({command})' : ''}",
\ 'truncate': 1,
\ 'min_uri_len': 15,
\ },
\ 'message_verbosity': 2,
\ 'use_vimproc': 1,
\ 'force_foreground_after_open': 0,
\}
endfunction
let &cpo = s:save_cpo