@@ -31,32 +31,45 @@ function! s:show_documentation(event) abort
31
31
32
32
33
33
" Neovim
34
- if s: use_nvim_float
34
+ if s: use_nvim_float
35
35
let l: event = a: event
36
36
let l: event .row = float2nr (l: event .row)
37
37
let l: event .col = float2nr (l: event .col )
38
38
39
39
let l: buffer = nvim_create_buf (v: false , v: true )
40
- let l: curpos = win_screenpos ( nvim_get_current_win ())[ 0 ] + winline () - 1
40
+ let l: curpos = screenrow ()
41
41
let g: lsp_documentation_float_docked = get (g: , ' lsp_documentation_float_docked' , 0 )
42
42
43
+ call setbufvar (l: buffer , ' lsp_syntax_highlights' , l: syntax_lines )
44
+ call setbufvar (l: buffer , ' lsp_do_conceal' , 1 )
45
+ call nvim_buf_set_lines (l: buffer , 0 , -1 , v: false , l: lines )
46
+ call nvim_buf_set_option (l: buffer , ' readonly' , v: true )
47
+ call nvim_buf_set_option (l: buffer , ' modifiable' , v: false )
48
+ call nvim_buf_set_option (l: buffer , ' filetype' , l: ft .' .lsp-hover' )
49
+
50
+
43
51
if g: lsp_documentation_float_docked
44
- let g: lsp_documentation_float_docked_maxheight = get (g: , ' : lsp_documentation_float_docked_maxheight' , &previewheight )
45
- let l: dock_downwards = max ([ screenrow (), l: curpos] ) < (&lines / 2 )
52
+ let g: lsp_documentation_float_docked_maxheight = get (g: , ' lsp_documentation_float_docked_maxheight' , &previewheight )
53
+ let l: dock_downwards = ( l: curpos + l: event .height ) < (&lines / 2 )
46
54
let l: height = min ([len (l: data ), g: lsp_documentation_float_docked_maxheight ])
47
55
let l: width = &columns
48
56
let l: col = 0
49
57
if l: dock_downwards
50
58
let l: anchor = ' SW'
51
59
let l: row = &lines - &cmdheight - 1
52
- let l: height = min ([l: height , &lines - &cmdheight - l: event .row - l: event .height])
60
+ let l: height = min ([l: height , &lines - &cmdheight - l: event .row - l: event .height - 1 ]) - 1
61
+ " Extra -1 of height to distinguish between completion popup
62
+ " and documentation popup
53
63
else " dock upwards
54
64
let l: anchor = ' NW'
55
65
let l: row = 0
56
66
let l: height = min ([l: height , l: event .row - 1 ])
57
67
endif
58
68
59
69
else " not docked
70
+ let l: bufferlines = nvim_buf_line_count (l: buffer )
71
+ let l: maxwidth = max (map (getbufline (l: buffer , 1 , ' $' ), ' strdisplaywidth(v:val)' ))
72
+
60
73
let l: row = l: event [' row' ]
61
74
let l: height = max ([&lines - &cmdheight - l: row , &previewheight ])
62
75
@@ -72,36 +85,40 @@ function! s:show_documentation(event) abort
72
85
let l: width = l: left_area
73
86
let l: col = l: event .col - 1 " 1 due to padding of completion popup
74
87
endif
88
+ if l: width < 0.75 * l: maxwidth
89
+ let l: col = &columns
90
+ let l: width = l: maxwidth
91
+ let l: above = l: event .row > &lines - &cmdheight - l: event .row - l: event .height
92
+ if l: above
93
+ let l: anchor = ' SE'
94
+ let l: row = l: event .row
95
+ let l: height = l: row
96
+ else
97
+ let l: anchor = ' NE'
98
+ let l: row = l: event .row + l: event .height
99
+ let l: height = &lines - &cmdheight - l: row
100
+ endif
101
+ endif
75
102
endif
76
103
77
- call setbufvar (l: buffer , ' lsp_syntax_highlights' , l: syntax_lines )
78
- call setbufvar (l: buffer , ' lsp_do_conceal' , 1 )
79
-
80
104
" add padding on both sides of lines containing text
81
105
for l: index in range (len (l: lines ))
82
106
if len (l: lines [l: index ]) > 0
83
107
let l: lines [l: index ] = ' ' . l: lines [l: index ] . ' '
84
108
endif
85
109
endfor
86
110
87
- call nvim_buf_set_lines (l: buffer , 0 , -1 , v: false , l: lines )
88
- call nvim_buf_set_option (l: buffer , ' readonly' , v: true )
89
- call nvim_buf_set_option (l: buffer , ' modifiable' , v: false )
90
- call nvim_buf_set_option (l: buffer , ' filetype' , l: ft .' .lsp-hover' )
91
-
92
111
if ! g: lsp_documentation_float_docked
93
- let l: bufferlines = nvim_buf_line_count (l: buffer )
94
- let l: maxwidth = max (map (getbufline (l: buffer , 1 , ' $' ), ' strdisplaywidth(v:val)' ))
95
- if g: lsp_preview_max_width > 0
96
- let l: maxwidth = min ([g: lsp_preview_max_width , l: maxwidth ])
97
- endif
98
112
let l: width = min ([float2nr (l: width ), l: maxwidth ])
99
113
let l: height = min ([float2nr (l: height ), l: bufferlines ])
100
114
endif
101
115
if g: lsp_preview_max_height > 0
102
116
let l: maxheight = g: lsp_preview_max_height
103
117
let l: height = min ([l: height , l: maxheight ])
104
118
endif
119
+ if g: lsp_preview_max_width > 0
120
+ let l: maxwidth = min ([g: lsp_preview_max_width , l: width ])
121
+ endif
105
122
106
123
" Height and width must be atleast 1, otherwise error
107
124
let l: height = (l: height < 1 ? 1 : l: height )
0 commit comments