From 7797732b379e061d276b3f596ad4e1f674951ef8 Mon Sep 17 00:00:00 2001 From: Shidong Wang Date: Sun, 24 Oct 2021 21:33:03 +0800 Subject: [PATCH] fix(chat): fix chatting server port --- autoload/SpaceVim/layers/chat.vim | 2 +- .../src/main/java/com/wsdjeg/chat/Server.java | 1 + bundle/vim-chat/autoload/chat/chatting.vim | 754 +++++++++--------- 3 files changed, 381 insertions(+), 376 deletions(-) diff --git a/autoload/SpaceVim/layers/chat.vim b/autoload/SpaceVim/layers/chat.vim index 6a602e4b6..439d37054 100644 --- a/autoload/SpaceVim/layers/chat.vim +++ b/autoload/SpaceVim/layers/chat.vim @@ -29,7 +29,7 @@ endif let s:chat_address = '127.0.0.1' let s:chat_port = 8080 -let s:chat_client_jar = fnamemodify(expand(':p:h:h:h:h') . 'bundle\Chatting-server\target\Chatting-1.0-SNAPSHOT.jar', ':gs?[\\/]?/?') +let s:chat_client_jar = fnamemodify(expand(':p:h:h:h:h') . '/bundle/Chatting-server/target/Chatting-1.0-SNAPSHOT.jar', ':gs?[\\/]?/?') function! SpaceVim#layers#chat#plugins() abort return [ diff --git a/bundle/Chatting-server/src/main/java/com/wsdjeg/chat/Server.java b/bundle/Chatting-server/src/main/java/com/wsdjeg/chat/Server.java index dd6a20ddf..01720c5df 100644 --- a/bundle/Chatting-server/src/main/java/com/wsdjeg/chat/Server.java +++ b/bundle/Chatting-server/src/main/java/com/wsdjeg/chat/Server.java @@ -45,6 +45,7 @@ public class Server extends ServerSocket { public Server() throws IOException { super(SERVER_PORT); + System.out.println("Server started on port:" + SERVER_PORT); try { while (true) { Socket socket = accept(); diff --git a/bundle/vim-chat/autoload/chat/chatting.vim b/bundle/vim-chat/autoload/chat/chatting.vim index 0118f9055..9205c71b0 100644 --- a/bundle/vim-chat/autoload/chat/chatting.vim +++ b/bundle/vim-chat/autoload/chat/chatting.vim @@ -16,99 +16,103 @@ let s:opened_channels = [] let s:unread_msg_num = {} let s:st_sep = '' +let s:JOB = SpaceVim#api#import('job') + function! s:push_message(msg) abort - if type(a:msg) == type([]) - for m in a:msg - if !empty(m) - call s:hander_msg(m) - endif - endfor - else - if !empty(a:msg) - call s:hander_msg(a:msg) - endif + if type(a:msg) == type([]) + for m in a:msg + if !empty(m) + call s:hander_msg(m) + endif + endfor + else + if !empty(a:msg) + call s:hander_msg(a:msg) endif + endif endfunction function! s:hander_msg(msg) abort - let info = json_decode(a:msg) - call add(s:messages, info) - if info['type'] ==# 'onWindowChange' - let s:current_channel = info['name'] - if index(s:opened_channels, s:current_channel) == -1 - call add(s:opened_channels, s:current_channel) - endif - if s:current_channel !=# '' - call s:update_statusline() - endif - elseif info['type'] ==# 'group_message' - let n = get(s:unread_msg_num, info['group_name'], 0) - let n += 1 - if has_key(s:unread_msg_num, info['group_name']) - call remove(s:unread_msg_num, info['group_name']) - endif - call extend(s:unread_msg_num, {info['group_name'] : n}) - if s:current_channel !=# '' - call s:update_statusline() - endif - elseif info['type'] ==# 'info_message' - if info['context'] =~# 'you are logined as ' - let s:login_user = substitute(info['context'], 'you are logined as ', '', 'g') - endif - elseif info['type'] ==# 'onGetConnection' - let s:chatting_commands = split(info['commands'], ',') + let info = json_decode(a:msg) + call add(s:messages, info) + if info['type'] ==# 'onWindowChange' + let s:current_channel = info['name'] + if index(s:opened_channels, s:current_channel) == -1 + call add(s:opened_channels, s:current_channel) endif + if s:current_channel !=# '' + call s:update_statusline() + endif + elseif info['type'] ==# 'group_message' + let n = get(s:unread_msg_num, info['group_name'], 0) + let n += 1 + if has_key(s:unread_msg_num, info['group_name']) + call remove(s:unread_msg_num, info['group_name']) + endif + call extend(s:unread_msg_num, {info['group_name'] : n}) + if s:current_channel !=# '' + call s:update_statusline() + endif + elseif info['type'] ==# 'info_message' + if info['context'] =~# 'you are logined as ' + let s:login_user = substitute(info['context'], 'you are logined as ', '', 'g') + endif + elseif info['type'] ==# 'onGetConnection' + let s:chatting_commands = split(info['commands'], ',') + endif endfunction function! chat#chatting#start() abort - if s:server_job_id == 0 - call chat#logger#info('startting server, server_lib is ' . s:server_lib . '(' . (empty(glob(s:server_lib)) ? 'no such file' : 'file exists' ). ')') - if has('nvim') - let s:server_job_id = jobstart(['java', '-cp', s:server_lib, 'com.wsdjeg.chat.Server'],{ - \ 'on_stdout' : function('s:server_handler'), - \ }) - elseif exists('*job#start') && !has('nvim') - let s:server_job_id = job#start(['java', '-cp', s:server_lib, 'com.wsdjeg.chat.Server'],{ - \ 'on_stdout' : function('s:server_handler'), - \ }) - endif - endif + if s:server_job_id == 0 + call chat#logger#info('startting server, server_lib is ' . s:server_lib . '(' . (filereadable(s:server_lib) ? 'no such file' : 'file exists' ). ')') + let s:server_job_id = s:JOB.start(['java', '-cp', s:server_lib, 'com.wsdjeg.chat.Server', '-D', s:server_port],{ + \ 'on_stdout' : function('s:server_handler'), + \ 'on_exit' : function('s:server_exit'), + \ }) + endif endfunction function! s:server_handler(id, data, event) abort + for data in a:data + call chat#logger#info('server stdout:' . data) + endfor +endfunction + +function! s:server_exit(id, data, event) abort + call chat#logger#info('server exit with code:' . a:data) endfunction function! s:client_handler(id, data, event) abort - if a:event ==# 'stdout' - call s:push_message(a:data) - call s:update_msg_screen() - elseif a:event ==# 'exit' - call chat#logger#info('client exit with code:' . a:data) - let s:client_job_id = 0 - endif + if a:event ==# 'stdout' + call s:push_message(a:data) + call s:update_msg_screen() + elseif a:event ==# 'exit' + call chat#logger#info('client exit with code:' . a:data) + let s:client_job_id = 0 + endif endfunction function! s:ch_callbakc(ch, msg) abort - call s:push_message(a:msg) - call s:update_msg_screen() + call s:push_message(a:msg) + call s:update_msg_screen() endfunction function! s:start_client() abort - if has('nvim') - if s:client_job_id == 0 - let s:client_job_id = jobstart(['java', '-cp', s:server_lib, 'com.wsdjeg.chat.Client', s:server_ip, s:server_port],{ - \ 'on_stdout' : function('s:client_handler'), - \ 'on_exit' : function('s:client_handler') - \ }) - call chat#logger#info('Server_lib:' . s:server_lib) - endif - else - let s:channel = ch_open(s:server_ip . ':' . s:server_port, - \ {'callback': function('s:ch_callbakc') ,'mode': 'nl', 'waittime': s:vim8_ch_waittime}) - call chat#logger#info('Client channel status:' . ch_status(s:channel)) + if has('nvim') + if s:client_job_id == 0 + let s:client_job_id = jobstart(['java', '-cp', s:server_lib, 'com.wsdjeg.chat.Client', s:server_ip, s:server_port],{ + \ 'on_stdout' : function('s:client_handler'), + \ 'on_exit' : function('s:client_handler') + \ }) + call chat#logger#info('Server_lib:' . s:server_lib) endif - call chat#logger#info('Client startting with server ip(' . s:server_ip . ') port(' . s:server_port . ')') + else + let s:channel = ch_open(s:server_ip . ':' . s:server_port, + \ {'callback': function('s:ch_callbakc') ,'mode': 'nl', 'waittime': s:vim8_ch_waittime}) + call chat#logger#info('Client channel status:' . ch_status(s:channel)) + endif + call chat#logger#info('Client startting with server ip(' . s:server_ip . ') port(' . s:server_port . ')') endfunction let s:name = '__Chatting__' @@ -118,362 +122,362 @@ let s:c_char = '' let s:c_end = '' let s:msg_win_opened = 0 function! chat#chatting#OpenMsgWin() abort - if has('nvim') - if s:client_job_id == 0 - call s:start_client() - endif + if has('nvim') + if s:client_job_id == 0 + call s:start_client() + endif + else + if !exists('s:channel') || ch_status(s:channel) !=# 'open' + call s:start_client() + endif + endif + if bufwinnr(s:name) < 0 + if bufnr(s:name) != -1 + exe 'silent! botright split ' . '+b' . bufnr(s:name) else - if !exists('s:channel') || ch_status(s:channel) !=# 'open' - call s:start_client() - endif + exe 'silent! botright split ' . s:name endif - if bufwinnr(s:name) < 0 - if bufnr(s:name) != -1 - exe 'silent! botright split ' . '+b' . bufnr(s:name) - else - exe 'silent! botright split ' . s:name - endif + else + exec bufwinnr(s:name) . 'wincmd w' + endif + call s:windowsinit() + call s:init_hi() + setl modifiable + let s:msg_win_opened = 1 + if !empty(s:last_channel) + let s:current_channel = s:last_channel + endif + call s:update_msg_screen() + call s:echon() + while get(s:, 'quit_chating_win', 0) == 0 + let nr = getchar() + if nr !=# "\" && nr !=# "\" + let s:complete_input_history_num = [0,0] + endif + if nr != 9 + let s:complete_num = 0 + endif + if nr == 13 + call s:enter() + elseif nr ==# "\" || nr == 6 " 向右移动光标 + let s:c_begin = s:c_begin . s:c_char + let s:c_char = matchstr(s:c_end, '^.') + let s:c_end = substitute(s:c_end, '^.', '', 'g') + elseif nr == 21 " ctrl+u clean the message + let s:c_begin = '' + elseif nr == 9 " use complete str + if s:complete_num == 0 + let complete_base = s:c_begin + else + let s:c_begin = complete_base + endif + let s:c_begin = s:complete(complete_base, s:complete_num) + let s:complete_num += 1 + elseif nr == 11 " ctrl+k delete the chars from cursor to the end + let s:c_char = '' + let s:c_end = '' + elseif nr ==# "\" || nr ==# "\" + "+ 移动到左边一个聊天窗口 + call s:previous_channel() + elseif nr ==# "\" || nr ==# "\" + "+ 移动到右边一个聊天窗口 + call s:next_channel() + elseif nr ==# "\" || nr == 2 " 向左移动光标 + if s:c_begin !=# '' + let s:c_end = s:c_char . s:c_end + let s:c_char = matchstr(s:c_begin, '.$') + let s:c_begin = substitute(s:c_begin, '.$', '', 'g') + endif + elseif nr ==# "\" + let l = line('.') - winheight('$') + if l < 0 + exe 0 + else + exe l + endif + elseif nr ==# "\" + exe line('.') + winheight('$') + elseif nr ==# "\" || nr == 1 " + a 将光标移动到行首 + let s:c_end = substitute(s:c_begin . s:c_char . s:c_end, '^.', '', 'g') + let s:c_char = matchstr(s:c_begin, '^.') + let s:c_begin = '' + elseif nr ==# "\" || nr == 5 " + e 将光标移动到行末 + let s:c_begin = s:c_begin . s:c_char . s:c_end + let s:c_char = '' + let s:c_end = '' + elseif nr ==# s:close_windows_char + let s:quit_chating_win = 1 + elseif nr == 8 || nr ==# "\" " ctrl+h or delete last char + let s:c_begin = substitute(s:c_begin,'.$','','g') + elseif nr ==# "\" + if s:complete_input_history_num == [0,0] + let complete_input_history_base = s:c_begin + let s:c_char = '' + let s:c_end = '' + else + let s:c_begin = complete_input_history_base + endif + let s:complete_input_history_num[0] += 1 + let s:c_begin = s:complete_input_history(complete_input_history_base, s:complete_input_history_num) + elseif nr ==# "\" + if s:complete_input_history_num == [0,0] + let complete_input_history_base = s:c_begin + let s:c_char = '' + let s:c_end = '' + else + let s:c_begin = complete_input_history_base + endif + let s:complete_input_history_num[1] += 1 + let s:c_begin = s:complete_input_history(complete_input_history_base, s:complete_input_history_num) else - exec bufwinnr(s:name) . 'wincmd w' + let s:c_begin .= nr2char(nr) endif - call s:windowsinit() - call s:init_hi() - setl modifiable - let s:msg_win_opened = 1 - if !empty(s:last_channel) - let s:current_channel = s:last_channel - endif - call s:update_msg_screen() call s:echon() - while get(s:, 'quit_chating_win', 0) == 0 - let nr = getchar() - if nr !=# "\" && nr !=# "\" - let s:complete_input_history_num = [0,0] - endif - if nr != 9 - let s:complete_num = 0 - endif - if nr == 13 - call s:enter() - elseif nr ==# "\" || nr == 6 " 向右移动光标 - let s:c_begin = s:c_begin . s:c_char - let s:c_char = matchstr(s:c_end, '^.') - let s:c_end = substitute(s:c_end, '^.', '', 'g') - elseif nr == 21 " ctrl+u clean the message - let s:c_begin = '' - elseif nr == 9 " use complete str - if s:complete_num == 0 - let complete_base = s:c_begin - else - let s:c_begin = complete_base - endif - let s:c_begin = s:complete(complete_base, s:complete_num) - let s:complete_num += 1 - elseif nr == 11 " ctrl+k delete the chars from cursor to the end - let s:c_char = '' - let s:c_end = '' - elseif nr ==# "\" || nr ==# "\" - "+ 移动到左边一个聊天窗口 - call s:previous_channel() - elseif nr ==# "\" || nr ==# "\" - "+ 移动到右边一个聊天窗口 - call s:next_channel() - elseif nr ==# "\" || nr == 2 " 向左移动光标 - if s:c_begin !=# '' - let s:c_end = s:c_char . s:c_end - let s:c_char = matchstr(s:c_begin, '.$') - let s:c_begin = substitute(s:c_begin, '.$', '', 'g') - endif - elseif nr ==# "\" - let l = line('.') - winheight('$') - if l < 0 - exe 0 - else - exe l - endif - elseif nr ==# "\" - exe line('.') + winheight('$') - elseif nr ==# "\" || nr == 1 " + a 将光标移动到行首 - let s:c_end = substitute(s:c_begin . s:c_char . s:c_end, '^.', '', 'g') - let s:c_char = matchstr(s:c_begin, '^.') - let s:c_begin = '' - elseif nr ==# "\" || nr == 5 " + e 将光标移动到行末 - let s:c_begin = s:c_begin . s:c_char . s:c_end - let s:c_char = '' - let s:c_end = '' - elseif nr ==# s:close_windows_char - let s:quit_chating_win = 1 - elseif nr == 8 || nr ==# "\" " ctrl+h or delete last char - let s:c_begin = substitute(s:c_begin,'.$','','g') - elseif nr ==# "\" - if s:complete_input_history_num == [0,0] - let complete_input_history_base = s:c_begin - let s:c_char = '' - let s:c_end = '' - else - let s:c_begin = complete_input_history_base - endif - let s:complete_input_history_num[0] += 1 - let s:c_begin = s:complete_input_history(complete_input_history_base, s:complete_input_history_num) - elseif nr ==# "\" - if s:complete_input_history_num == [0,0] - let complete_input_history_base = s:c_begin - let s:c_char = '' - let s:c_end = '' - else - let s:c_begin = complete_input_history_base - endif - let s:complete_input_history_num[1] += 1 - let s:c_begin = s:complete_input_history(complete_input_history_base, s:complete_input_history_num) - else - let s:c_begin .= nr2char(nr) - endif - call s:echon() - endwhile - setl nomodifiable - exe 'bd ' . bufnr(s:name) - let s:quit_chating_win = 0 - let s:last_channel = s:current_channel - let s:current_channel = '' - let s:msg_win_opened = 0 - normal! : + endwhile + setl nomodifiable + exe 'bd ' . bufnr(s:name) + let s:quit_chating_win = 0 + let s:last_channel = s:current_channel + let s:current_channel = '' + let s:msg_win_opened = 0 + normal! : endfunction function! s:update_msg_screen() abort - if s:msg_win_opened - normal! ggdG - for msg in s:messages - if msg['type'] ==# 'group_message' && msg['group_name'] ==# s:current_channel - call append(line('$'), '[' . msg['time'] . '] < ' . msg['sendder'] . ' > ' . msg['context']) - elseif msg['type'] ==# 'info_message' && msg['context'] !~# '^join channel :' - call append(line('$'), '[' . msg['time'] . '] ' . msg['context']) - elseif msg['type'] ==# 'user_message' - \ && ( - \ msg['sendder'] ==# s:current_channel - \ || - \ (msg['sendder'] ==# s:login_user && msg['receiver'] ==# s:current_channel) - \ ) - call append(line('$'), '[' . msg['time'] . '] < ' . msg['sendder'] . ' > ' . msg['context']) - endif - endfor - normal! gg - delete - normal! G - redraw - call s:echon() - endif + if s:msg_win_opened + normal! ggdG + for msg in s:messages + if msg['type'] ==# 'group_message' && msg['group_name'] ==# s:current_channel + call append(line('$'), '[' . msg['time'] . '] < ' . msg['sendder'] . ' > ' . msg['context']) + elseif msg['type'] ==# 'info_message' && msg['context'] !~# '^join channel :' + call append(line('$'), '[' . msg['time'] . '] ' . msg['context']) + elseif msg['type'] ==# 'user_message' + \ && ( + \ msg['sendder'] ==# s:current_channel + \ || + \ (msg['sendder'] ==# s:login_user && msg['receiver'] ==# s:current_channel) + \ ) + call append(line('$'), '[' . msg['time'] . '] < ' . msg['sendder'] . ' > ' . msg['context']) + endif + endfor + normal! gg + delete + normal! G + redraw + call s:echon() + endif endfunction function! s:echon() abort - redraw! - echohl Comment | echon s:c_base - echohl None | echon s:c_begin - echohl Wildmenu | echon s:c_char - echohl None | echon s:c_end + redraw! + echohl Comment | echon s:c_base + echohl None | echon s:c_begin + echohl Wildmenu | echon s:c_char + echohl None | echon s:c_end endfunction fu! s:windowsinit() abort - " option - setl fileformat=unix - setl fileencoding=utf-8 - setl iskeyword=@,48-57,_ - setl noreadonly - setl buftype=nofile - setl bufhidden=wipe - setl noswapfile - setl nobuflisted - setl nolist - setl nonumber - setl norelativenumber - setl wrap - setl winfixwidth - setl winfixheight - setl textwidth=0 - setl nospell - setl nofoldenable - setl cursorline + " option + setl fileformat=unix + setl fileencoding=utf-8 + setl iskeyword=@,48-57,_ + setl noreadonly + setl buftype=nofile + setl bufhidden=wipe + setl noswapfile + setl nobuflisted + setl nolist + setl nonumber + setl norelativenumber + setl wrap + setl winfixwidth + setl winfixheight + setl textwidth=0 + setl nospell + setl nofoldenable + setl cursorline endf function! s:debug() abort - tabnew - for line in s:debug_log - call append(line('$'), line) - endfor - nnoremap q :bd! + tabnew + for line in s:debug_log + call append(line('$'), line) + endfor + nnoremap q :bd! endfunction let s:enter_history = [] function! s:enter() abort - if s:c_begin . s:c_char . s:c_end ==# '/quit' - let s:quit_chating_win = 1 - let s:c_end = '' - let s:c_char = '' - let s:c_begin = '' - return - endif - if has('nvim') - if s:client_job_id != 0 - call jobsend(s:client_job_id, [s:c_begin . s:c_char . s:c_end, '']) - endif - else - call ch_sendraw(s:channel, s:c_begin . s:c_char . s:c_end ."\n") - endif - call add(s:enter_history, s:c_begin . s:c_char . s:c_end) + if s:c_begin . s:c_char . s:c_end ==# '/quit' + let s:quit_chating_win = 1 let s:c_end = '' let s:c_char = '' let s:c_begin = '' + return + endif + if has('nvim') + if s:client_job_id != 0 + call jobsend(s:client_job_id, [s:c_begin . s:c_char . s:c_end, '']) + endif + else + call ch_sendraw(s:channel, s:c_begin . s:c_char . s:c_end ."\n") + endif + call add(s:enter_history, s:c_begin . s:c_char . s:c_end) + let s:c_end = '' + let s:c_char = '' + let s:c_begin = '' endfunction let s:complete_num = 0 function! s:complete(base,num) abort - if a:base =~# '^/[a-z]*$' - let rsl = filter(copy(s:chatting_commands), "v:val =~# a:base .'[^\ .]*'") - if len(rsl) > 0 - return rsl[a:num % len(rsl)] . ' ' - endif + if a:base =~# '^/[a-z]*$' + let rsl = filter(copy(s:chatting_commands), "v:val =~# a:base .'[^\ .]*'") + if len(rsl) > 0 + return rsl[a:num % len(rsl)] . ' ' endif + endif + + return a:base - return a:base - endfunction let s:complete_input_history_num = [0,0] function! s:complete_input_history(base,num) abort - let results = filter(copy(s:enter_history), "v:val =~# '^' . a:base") - if len(results) > 0 - call add(results, a:base) - let index = ((len(results) - 1) - a:num[0] + a:num[1]) % len(results) - return results[index] - else - return a:base - endif + let results = filter(copy(s:enter_history), "v:val =~# '^' . a:base") + if len(results) > 0 + call add(results, a:base) + let index = ((len(results) - 1) - a:num[0] + a:num[1]) % len(results) + return results[index] + else + return a:base + endif endfunction function! s:init_hi() abort - if get(s:, 'init_hi_done', 0) == 0 - " current channel - hi! ChattingHI1 ctermbg=003 ctermfg=Black guibg=#fabd2f guifg=#282828 - " channel with new msg - hi! ChattingHI2 ctermbg=005 ctermfg=Black guibg=#b16286 guifg=#282828 - " normal channel - hi! ChattingHI3 ctermbg=007 ctermfg=Black guibg=#8ec07c guifg=#282828 - " end - hi! ChattingHI4 ctermbg=243 guibg=#7c6f64 - " current channel + end - hi! ChattingHI5 guibg=#7c6f64 guifg=#fabd2f - " current channel + new msg channel - hi! ChattingHI6 guibg=#b16286 guifg=#fabd2f - " current channel + normal channel - hi! ChattingHI7 guibg=#8ec07c guifg=#fabd2f - " new msg channel + end - hi! ChattingHI8 guibg=#7c6f64 guifg=#b16286 - " new msg channel + current channel - hi! ChattingHI9 guibg=#fabd2f guifg=#b16286 - " new msg channel + normal channel - hi! ChattingHI10 guibg=#8ec07c guifg=#b16286 - " new msg channel + new msg channel - hi! ChattingHI11 guibg=#b16286 guifg=#b16286 - " normal channel + end - hi! ChattingHI12 guibg=#7c6f64 guifg=#8ec07c - " normal channel + normal channel - hi! ChattingHI13 guibg=#8ec07c guifg=#8ec07c - " normal channel + new msg channel - hi! ChattingHI14 guibg=#b16286 guifg=#8ec07c - " normal channel + current channel - hi! ChattingHI15 guibg=#fabd2f guifg=#8ec07c - let s:init_hi_done = 1 - endif + if get(s:, 'init_hi_done', 0) == 0 + " current channel + hi! ChattingHI1 ctermbg=003 ctermfg=Black guibg=#fabd2f guifg=#282828 + " channel with new msg + hi! ChattingHI2 ctermbg=005 ctermfg=Black guibg=#b16286 guifg=#282828 + " normal channel + hi! ChattingHI3 ctermbg=007 ctermfg=Black guibg=#8ec07c guifg=#282828 + " end + hi! ChattingHI4 ctermbg=243 guibg=#7c6f64 + " current channel + end + hi! ChattingHI5 guibg=#7c6f64 guifg=#fabd2f + " current channel + new msg channel + hi! ChattingHI6 guibg=#b16286 guifg=#fabd2f + " current channel + normal channel + hi! ChattingHI7 guibg=#8ec07c guifg=#fabd2f + " new msg channel + end + hi! ChattingHI8 guibg=#7c6f64 guifg=#b16286 + " new msg channel + current channel + hi! ChattingHI9 guibg=#fabd2f guifg=#b16286 + " new msg channel + normal channel + hi! ChattingHI10 guibg=#8ec07c guifg=#b16286 + " new msg channel + new msg channel + hi! ChattingHI11 guibg=#b16286 guifg=#b16286 + " normal channel + end + hi! ChattingHI12 guibg=#7c6f64 guifg=#8ec07c + " normal channel + normal channel + hi! ChattingHI13 guibg=#8ec07c guifg=#8ec07c + " normal channel + new msg channel + hi! ChattingHI14 guibg=#b16286 guifg=#8ec07c + " normal channel + current channel + hi! ChattingHI15 guibg=#fabd2f guifg=#8ec07c + let s:init_hi_done = 1 + endif endfunction function! s:update_statusline() abort - let st = '' - for ch in s:opened_channels - let ch = substitute(ch, ' ', '\ ', 'g') - if ch == s:current_channel - if has_key(s:unread_msg_num, s:current_channel) - call remove(s:unread_msg_num, s:current_channel) - endif - let st .= '%#ChattingHI1#[' . ch . ']' - if index(s:opened_channels, ch) == len(s:opened_channels) - 1 - let st .= '%#ChattingHI5#' . s:st_sep - elseif get(s:unread_msg_num, s:opened_channels[index(s:opened_channels, ch) + 1], 0) > 0 - let st .= '%#ChattingHI6#' . s:st_sep - else - let st .= '%#ChattingHI7#' . s:st_sep - endif + let st = '' + for ch in s:opened_channels + let ch = substitute(ch, ' ', '\ ', 'g') + if ch == s:current_channel + if has_key(s:unread_msg_num, s:current_channel) + call remove(s:unread_msg_num, s:current_channel) + endif + let st .= '%#ChattingHI1#[' . ch . ']' + if index(s:opened_channels, ch) == len(s:opened_channels) - 1 + let st .= '%#ChattingHI5#' . s:st_sep + elseif get(s:unread_msg_num, s:opened_channels[index(s:opened_channels, ch) + 1], 0) > 0 + let st .= '%#ChattingHI6#' . s:st_sep + else + let st .= '%#ChattingHI7#' . s:st_sep + endif + else + let n = get(s:unread_msg_num, ch, 0) + if n > 0 + let st .= '%#ChattingHI2#[' . ch . '(' . n . 'new)]' + if index(s:opened_channels, ch) == len(s:opened_channels) - 1 + let st .= '%#ChattingHI8#' . s:st_sep + elseif get(s:unread_msg_num, s:opened_channels[index(s:opened_channels, ch) + 1], 0) > 0 + \ && s:opened_channels[index(s:opened_channels, ch) + 1] !=# s:current_channel + let st .= '%#ChattingHI11#' . s:st_sep + elseif s:opened_channels[index(s:opened_channels, ch) + 1] ==# s:current_channel + let st .= '%#ChattingHI9#' . s:st_sep else - let n = get(s:unread_msg_num, ch, 0) - if n > 0 - let st .= '%#ChattingHI2#[' . ch . '(' . n . 'new)]' - if index(s:opened_channels, ch) == len(s:opened_channels) - 1 - let st .= '%#ChattingHI8#' . s:st_sep - elseif get(s:unread_msg_num, s:opened_channels[index(s:opened_channels, ch) + 1], 0) > 0 - \ && s:opened_channels[index(s:opened_channels, ch) + 1] !=# s:current_channel - let st .= '%#ChattingHI11#' . s:st_sep - elseif s:opened_channels[index(s:opened_channels, ch) + 1] ==# s:current_channel - let st .= '%#ChattingHI9#' . s:st_sep - else - let st .= '%#ChattingHI10#' . s:st_sep - endif - else - let st .= '%#ChattingHI3#[' . ch . ']' - if index(s:opened_channels, ch) == len(s:opened_channels) - 1 - let st .= '%#ChattingHI12#' . s:st_sep - elseif get(s:unread_msg_num, s:opened_channels[index(s:opened_channels, ch) + 1], 0) > 0 - \ && s:opened_channels[index(s:opened_channels, ch) + 1] !=# s:current_channel - let st .= '%#ChattingHI14#' . s:st_sep - elseif s:opened_channels[index(s:opened_channels, ch) + 1] ==# s:current_channel - let st .= '%#ChattingHI15#' . s:st_sep - else - let st .= '%#ChattingHI13#' . s:st_sep - endif - endif + let st .= '%#ChattingHI10#' . s:st_sep endif - endfor - let st .= '%#ChattingHI4# ' - exe 'set statusline=' . st + else + let st .= '%#ChattingHI3#[' . ch . ']' + if index(s:opened_channels, ch) == len(s:opened_channels) - 1 + let st .= '%#ChattingHI12#' . s:st_sep + elseif get(s:unread_msg_num, s:opened_channels[index(s:opened_channels, ch) + 1], 0) > 0 + \ && s:opened_channels[index(s:opened_channels, ch) + 1] !=# s:current_channel + let st .= '%#ChattingHI14#' . s:st_sep + elseif s:opened_channels[index(s:opened_channels, ch) + 1] ==# s:current_channel + let st .= '%#ChattingHI15#' . s:st_sep + else + let st .= '%#ChattingHI13#' . s:st_sep + endif + endif + endif + endfor + let st .= '%#ChattingHI4# ' + exe 'set statusline=' . st endfunction function! s:previous_channel() abort - let id = index(s:opened_channels, s:current_channel) - let id -= 1 - if id < 0 - let id = id + len(s:opened_channels) - endif - let s:current_channel = s:opened_channels[id] - if s:current_channel =~# '^#' - call s:send('/join ' . s:current_channel) - else - call s:send('/query ' . s:current_channel) - endif - call s:update_msg_screen() - call s:update_statusline() + let id = index(s:opened_channels, s:current_channel) + let id -= 1 + if id < 0 + let id = id + len(s:opened_channels) + endif + let s:current_channel = s:opened_channels[id] + if s:current_channel =~# '^#' + call s:send('/join ' . s:current_channel) + else + call s:send('/query ' . s:current_channel) + endif + call s:update_msg_screen() + call s:update_statusline() endfunction function! s:next_channel() abort - let id = index(s:opened_channels, s:current_channel) - let id += 1 - if id > len(s:opened_channels) - 1 - let id = id - len(s:opened_channels) - endif - let s:current_channel = s:opened_channels[id] - if s:current_channel =~# '^#' - call s:send('/join ' . s:current_channel) - else - call s:send('/query ' . s:current_channel) - endif - call s:update_msg_screen() - call s:update_statusline() - + let id = index(s:opened_channels, s:current_channel) + let id += 1 + if id > len(s:opened_channels) - 1 + let id = id - len(s:opened_channels) + endif + let s:current_channel = s:opened_channels[id] + if s:current_channel =~# '^#' + call s:send('/join ' . s:current_channel) + else + call s:send('/query ' . s:current_channel) + endif + call s:update_msg_screen() + call s:update_statusline() + endfunction function! s:send(msg) abort - if has('nvim') - if s:client_job_id != 0 - call jobsend(s:client_job_id, [a:msg, '']) - endif - else - call ch_sendraw(s:channel, a:msg ."\n") + if has('nvim') + if s:client_job_id != 0 + call jobsend(s:client_job_id, [a:msg, '']) endif + else + call ch_sendraw(s:channel, a:msg ."\n") + endif endfunction call chat#debug#defind('chatting', function('s:debug'))