This repository has been archived by the owner on Dec 28, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 43
/
vimroom.vim
268 lines (242 loc) · 8.94 KB
/
vimroom.vim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
"==============================================================================
"File: vimroom.vim
"Description: Vaguely emulates a writeroom-like environment in Vim by
" splitting the current window in such a way as to center a column
" of user-specified width, wrap the text, and break lines.
"Maintainer: Mike West <mike@mikewest.org>
"Version: 0.7
"Last Change: 2010-10-31
"License: BSD <../LICENSE.markdown>
"==============================================================================
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Plugin Configuration
"
" The typical start to any vim plugin: If the plugin has already been loaded,
" exit as quickly as possible.
if exists( "g:loaded_vimroom_plugin" )
finish
endif
let g:loaded_vimroom_plugin = 1
" The desired column width. Defaults to 80:
if !exists( "g:vimroom_width" )
let g:vimroom_width = 80
endif
" The minimum sidebar size. Defaults to 5:
if !exists( "g:vimroom_min_sidebar_width" )
let g:vimroom_min_sidebar_width = 5
endif
" The sidebar height. Defaults to 3:
if !exists( "g:vimroom_sidebar_height" )
let g:vimroom_sidebar_height = 3
endif
" The GUI background color. Defaults to "black"
if !exists( "g:vimroom_guibackground" )
let g:vimroom_guibackground = "black"
endif
" The cterm background color. Defaults to "bg"
if !exists( "g:vimroom_ctermbackground" )
let g:vimroom_ctermbackground = "bg"
endif
" The "scrolloff" value: how many lines should be kept visible above and below
" the cursor at all times? Defaults to 999 (which centers your cursor in the
" active window).
if !exists( "g:vimroom_scrolloff" )
let g:vimroom_scrolloff = 999
endif
" Should Vimroom map navigational keys (`<Up>`, `<Down>`, `j`, `k`) to navigate
" "display" lines instead of "logical" lines (which makes it much simpler to deal
" with wrapped lines). Defaults to `1` (on). Set to `0` if you'd prefer not to
" run the mappings.
if !exists( "g:vimroom_navigation_keys" )
let g:vimroom_navigation_keys = 1
endif
" Should Vimroom clear line numbers from the Vimroomed buffer? Defaults to `1`
" (on). Set to `0` if you'd prefer Vimroom to leave line numbers untouched.
" (Note that setting this to `0` will not turn line numbers on if they aren't
" on already).
if !exists( "g:vimroom_clear_line_numbers" )
let g:vimroom_clear_line_numbers = 1
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Plugin Code
"
" Given the desired column width, and minimum sidebar width, determine
" the minimum window width necessary for splitting to make sense
let s:minwidth = g:vimroom_width + ( g:vimroom_min_sidebar_width * 2 )
" Save the current color scheme for reset later
let s:scheme = ""
if exists( "g:colors_name" )
let s:scheme = g:colors_name
endif
if exists( "&t_mr" )
let s:save_t_mr = &t_mr
end
" Save the current scrolloff value for reset later
let s:save_scrolloff = ""
if exists( "&scrolloff" )
let s:save_scrolloff = &scrolloff
end
" Save the current `laststatus` value for reset later
let s:save_laststatus = ""
if exists( "&laststatus" )
let s:save_laststatus = &laststatus
endif
" Save the current `textwidth` value for reset later
let s:save_textwidth = ""
if exists( "&textwidth" )
let s:save_textwidth = &textwidth
endif
" Save the current `number` and `relativenumber` values for reset later
let s:save_number = 0
let s:save_relativenumber = 0
if exists( "&number" )
let s:save_number = &number
endif
if exists ( "&relativenumber" )
let s:save_relativenumber = &relativenumber
endif
" We're currently in nonvimroomized state
let s:active = 0
function! s:is_the_screen_wide_enough()
return winwidth( winnr() ) >= s:minwidth
endfunction
function! s:sidebar_size()
return ( winwidth( winnr() ) - g:vimroom_width - 2 ) / 2
endfunction
function! <SID>VimroomToggle()
if s:active == 1
let s:active = 0
" Close all other split windows
if g:vimroom_sidebar_height
wincmd j
close
wincmd k
close
endif
if g:vimroom_min_sidebar_width
wincmd l
close
wincmd h
close
endif
" Reset color scheme (or clear new colors, if no scheme is set)
if s:scheme != ""
exec( "colorscheme " . s:scheme )
else
hi clear
endif
if s:save_t_mr != ""
exec( "set t_mr=" .s:save_t_mr )
endif
" Reset `scrolloff` and `laststatus`
if s:save_scrolloff != ""
exec( "set scrolloff=" . s:save_scrolloff )
endif
if s:save_laststatus != ""
exec( "set laststatus=" . s:save_laststatus )
endif
if s:save_textwidth != ""
exec( "set textwidth=" . s:save_textwidth )
endif
if s:save_number != 0
set number
endif
if s:save_relativenumber != 0
set relativenumber
endif
" Remove wrapping and linebreaks
set nowrap
set nolinebreak
else
if s:is_the_screen_wide_enough()
let s:active = 1
let s:sidebar = s:sidebar_size()
" Turn off status bar
if s:save_laststatus != ""
setlocal laststatus=0
endif
if g:vimroom_min_sidebar_width
" Create the left sidebar
exec( "silent leftabove " . s:sidebar . "vsplit new" )
setlocal noma
setlocal nocursorline
setlocal nonumber
silent! setlocal norelativenumber
wincmd l
" Create the right sidebar
exec( "silent rightbelow " . s:sidebar . "vsplit new" )
setlocal noma
setlocal nocursorline
setlocal nonumber
silent! setlocal norelativenumber
wincmd h
endif
if g:vimroom_sidebar_height
" Create the top sidebar
exec( "silent leftabove " . g:vimroom_sidebar_height . "split new" )
setlocal noma
setlocal nocursorline
setlocal nonumber
silent! setlocal norelativenumber
wincmd j
" Create the bottom sidebar
exec( "silent rightbelow " . g:vimroom_sidebar_height . "split new" )
setlocal noma
setlocal nocursorline
setlocal nonumber
silent! setlocal norelativenumber
wincmd k
endif
" Setup wrapping, line breaking, and push the cursor down
set wrap
set linebreak
if g:vimroom_clear_line_numbers
set nonumber
silent! set norelativenumber
endif
if s:save_textwidth != ""
exec( "set textwidth=".g:vimroom_width )
endif
if s:save_scrolloff != ""
exec( "set scrolloff=".g:vimroom_scrolloff )
endif
" Setup navigation over "display lines", not "logical lines" if
" mappings for the navigation keys don't already exist.
if g:vimroom_navigation_keys
try
noremap <unique> <silent> <Up> g<Up>
noremap <unique> <silent> <Down> g<Down>
noremap <unique> <silent> k gk
noremap <unique> <silent> j gj
inoremap <unique> <silent> <Up> <C-o>g<Up>
inoremap <unique> <silent> <Down> <C-o>g<Down>
catch /E227:/
echo "Navigational key mappings already exist."
endtry
endif
" Hide distracting visual elements
if has('gui_running')
let l:highlightbgcolor = "guibg=" . g:vimroom_guibackground
let l:highlightfgbgcolor = "guifg=" . g:vimroom_guibackground . " " . l:highlightbgcolor
else
let l:highlightbgcolor = "ctermbg=" . g:vimroom_ctermbackground
let l:highlightfgbgcolor = "ctermfg=" . g:vimroom_ctermbackground . " " . l:highlightbgcolor
endif
exec( "hi Normal " . l:highlightbgcolor )
exec( "hi VertSplit " . l:highlightfgbgcolor )
exec( "hi NonText " . l:highlightfgbgcolor )
exec( "hi StatusLine " . l:highlightfgbgcolor )
exec( "hi StatusLineNC " . l:highlightfgbgcolor )
set t_mr=""
set fillchars+=vert:\
endif
endif
endfunction
" Create a mapping for the `VimroomToggle` function
noremap <silent> <Plug>VimroomToggle :call <SID>VimroomToggle()<CR>
" Create a `VimroomToggle` command:
command -nargs=0 VimroomToggle call <SID>VimroomToggle()
" If no mapping exists, map it to `<Leader>V`.
if !hasmapto( '<Plug>VimroomToggle' )
nmap <silent> <Leader>V <Plug>VimroomToggle
endif