cursormode.vim 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. " MIT Licsense.
  2. " Plugin: https://github.com/vheon/vim-cursormode
  3. " Copyright (C) 2014 Andrea Cedraro <a.cedraro@gmail.com>,
  4. " Copyright (C) 2017 Eduardo Suarez-Santana <e.suarezsantana@gmail.com>
  5. scriptencoding utf-8
  6. if exists('g:loaded_cursormode')
  7. finish
  8. endif
  9. let g:loaded_cursormode = 1
  10. let s:is_win = has('win32') || has('win64')
  11. let s:is_iTerm = exists('$TERM_PROGRAM') && $TERM_PROGRAM =~# 'iTerm.app'
  12. let s:is_AppleTerminal = exists('$TERM_PROGRAM') && $TERM_PROGRAM =~# 'Apple_Terminal'
  13. let s:is_good = !has('gui_running') && !s:is_win && !s:is_AppleTerminal
  14. let s:last_mode = ''
  15. if !exists('g:cursormode_exit_mode')
  16. let g:cursormode_exit_mode='n'
  17. endif
  18. function! airline#extensions#cursormode#tmux_escape(escape)
  19. return '\033Ptmux;'.substitute(a:escape, '\\033', '\\033\\033', 'g').'\033\\'
  20. endfunction
  21. let s:iTerm_escape_template = '\033]Pl%s\033\\'
  22. let s:xterm_escape_template = '\033]12;%s\007'
  23. function! s:get_mode()
  24. return call(get(g:, 'cursormode_mode_func', 'mode'), [])
  25. endfunction
  26. function! airline#extensions#cursormode#set(...)
  27. let mode = s:get_mode()
  28. if mode !=# s:last_mode
  29. let s:last_mode = mode
  30. call s:set_cursor_color_for(mode)
  31. endif
  32. return ''
  33. endfunction
  34. function! s:set_cursor_color_for(mode)
  35. let mode = a:mode
  36. for mode in [a:mode, a:mode.&background]
  37. if has_key(s:color_map, mode)
  38. try
  39. let save_eventignore = &eventignore
  40. set eventignore=all
  41. let save_shelltemp = &shelltemp
  42. set noshelltemp
  43. silent call system(s:build_command(s:color_map[mode]))
  44. return
  45. finally
  46. let &shelltemp = save_shelltemp
  47. let &eventignore = save_eventignore
  48. endtry
  49. endif
  50. endfor
  51. endfunction
  52. function! s:build_command(color)
  53. if s:is_iTerm
  54. let color = substitute(a:color, '^#', '', '')
  55. let escape_template = s:iTerm_escape_template
  56. else
  57. let color = a:color
  58. let escape_template = s:xterm_escape_template
  59. endif
  60. let escape = printf(escape_template, color)
  61. if exists('$TMUX')
  62. let escape = airline#extensions#cursormode#tmux_escape(escape)
  63. endif
  64. return "printf '".escape."' > /dev/tty"
  65. endfunction
  66. function! s:get_color_map()
  67. if exists('g:cursormode_color_map')
  68. return g:cursormode_color_map
  69. endif
  70. try
  71. let map = g:cursormode#{g:colors_name}#color_map
  72. return map
  73. catch
  74. return {
  75. \ "nlight": "#000000",
  76. \ "ndark": "#BBBBBB",
  77. \ "i": "#0000BB",
  78. \ "v": "#FF5555",
  79. \ "V": "#BBBB00",
  80. \ "\<C-V>": "#BB00BB",
  81. \ }
  82. endtry
  83. endfunction
  84. augroup airline#extensions#cursormode
  85. autocmd!
  86. autocmd VimLeave * nested call s:set_cursor_color_for(g:cursormode_exit_mode)
  87. " autocmd VimEnter * call airline#extensions#cursormode#activate()
  88. autocmd Colorscheme * call airline#extensions#cursormode#activate()
  89. augroup END
  90. function! airline#extensions#cursormode#activate()
  91. if !exists('#airline')
  92. " airline disabled
  93. return
  94. endif
  95. let s:color_map = s:get_color_map()
  96. call airline#extensions#cursormode#set()
  97. endfunction
  98. function! airline#extensions#cursormode#apply(...)
  99. let w:airline_section_a = get(w:, 'airline_section_a', g:airline_section_a)
  100. let w:airline_section_a .= '%{airline#extensions#cursormode#set()}'
  101. endfunction
  102. function! airline#extensions#cursormode#init(ext)
  103. let s:color_map = s:get_color_map()
  104. call a:ext.add_statusline_func('airline#extensions#cursormode#apply')
  105. endfunction