2019-06-03 14:58:18 +00:00
" don't spam the user when Vim is started in Vi compatibility mode
let s :cpo_save = &cpo
set cpo &vim
func ! Test_GometaGolangciLint ( ) abort
call s :gometa ( 'golangci-lint' )
endfunc
func ! s :gometa ( metalinter ) abort
2020-10-28 13:35:24 +00:00
let RestoreGOPATH = go #util #SetEnv ( 'GOPATH' , fnamemodify ( getcwd ( ) , ':p' ) . 'test-fixtures/lint' )
2018-05-06 15:45:27 +00:00
silent exe 'e ' . $GOPATH . '/src/lint/lint.go'
2019-06-03 14:58:18 +00:00
try
2020-10-28 13:35:24 +00:00
let g :go_metalinter_command = a :metalinter
2019-06-03 14:58:18 +00:00
let expected = [
\ {'lnum' : 5 , 'bufnr' : bufnr ( '%' ) + 1 , 'col' : 1 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : 'w' , 'pattern' : '' , 'text' : 'exported function MissingFooDoc should have comment or be unexported (golint)' }
\ ]
2020-10-28 13:35:24 +00:00
if a :metalinter = = 'golangci-lint'
let expected = [
\ {'lnum' : 5 , 'bufnr' : bufnr ( '%' ) + 5 , 'col' : 1 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'exported function `MissingFooDoc` should have comment or be unexported (golint)' }
\ ]
endif
2018-05-06 15:45:27 +00:00
2019-06-03 14:58:18 +00:00
" clear the quickfix lists
call setqflist ( [], 'r' )
2018-05-06 15:45:27 +00:00
2019-06-03 14:58:18 +00:00
let g :go_metalinter_enabled = ['golint' ]
2018-05-06 15:45:27 +00:00
2019-06-03 14:58:18 +00:00
call go #lint #Gometa ( 0 , 0 , $GOPATH . '/src/foo' )
2018-05-06 15:45:27 +00:00
let actual = getqflist ( )
2019-06-03 14:58:18 +00:00
let start = reltime ( )
while len ( actual ) = = 0 && reltimefloat ( reltime ( start ) ) < 10
sleep 100 m
let actual = getqflist ( )
endwhile
call gotest #assert_quickfix ( actual , expected )
finally
2020-10-28 13:35:24 +00:00
call call ( RestoreGOPATH , [])
unlet g :go_metalinter_enabled
endtry
endfunc
func ! Test_GometaGolangciLint_shadow ( ) abort
call s :gometa_shadow ( 'golangci-lint' )
endfunc
func ! s :gometa_shadow ( metalinter ) abort
let RestoreGOPATH = go #util #SetEnv ( 'GOPATH' , fnamemodify ( getcwd ( ) , ':p' ) . 'test-fixtures/lint' )
silent exe 'e ' . $GOPATH . '/src/lint/golangci-lint/problems/shadow/problems.go'
try
let g :go_metalinter_command = a :metalinter
let expected = [
\ {'lnum' : 4 , 'bufnr' : bufnr ( '%' ) , 'col' : 7 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : 'w' , 'module' : '' , 'text' : '[runner] Can''t run linter golint: golint: analysis skipped: errors in package' },
\ {'lnum' : 4 , 'bufnr' : bufnr ( '%' ) , 'col' : 7 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : 'e' , 'module' : '' , 'text' : 'Running error: golint: analysis skipped: errors in package' }
\ ]
" clear the quickfix lists
call setqflist ( [], 'r' )
let g :go_metalinter_enabled = ['golint' ]
call go #lint #Gometa ( 0 , 0 )
let actual = getqflist ( )
let start = reltime ( )
while len ( actual ) = = 0 && reltimefloat ( reltime ( start ) ) < 10
sleep 100 m
let actual = getqflist ( )
endwhile
call gotest #assert_quickfix ( actual , expected )
finally
call call ( RestoreGOPATH , [])
2019-06-03 14:58:18 +00:00
unlet g :go_metalinter_enabled
endtry
2018-05-06 15:45:27 +00:00
endfunc
2020-10-28 13:35:24 +00:00
func ! Test_GometaAutoSaveGolangciLint ( ) abort
call s :gometaautosave ( 'golangci-lint' , 0 )
2019-06-03 14:58:18 +00:00
endfunc
2020-10-28 13:35:24 +00:00
func ! Test_GometaAutoSaveKeepsErrors ( ) abort
call s :gometaautosave ( 'golangci-lint' , 1 )
2019-06-03 14:58:18 +00:00
endfunc
2020-10-28 13:35:24 +00:00
func ! s :gometaautosave ( metalinter , withList ) abort
let RestoreGOPATH = go #util #SetEnv ( 'GOPATH' , fnameescape ( fnamemodify ( getcwd ( ) , ':p' ) ) . 'test-fixtures/lint' )
2018-05-06 15:45:27 +00:00
silent exe 'e ' . $GOPATH . '/src/lint/lint.go'
2019-06-03 14:58:18 +00:00
try
2020-10-28 13:35:24 +00:00
let g :go_metalinter_command = a :metalinter
let l :expected = [
\ {'lnum' : 5 , 'bufnr' : bufnr ( '%' ) , 'col' : 1 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : 'w' , 'pattern' : '' , 'text' : 'exported function MissingDoc should have comment or be unexported (golint)' }
2019-06-03 14:58:18 +00:00
\ ]
2020-10-28 13:35:24 +00:00
if a :metalinter = = 'golangci-lint'
let l :expected = [
\ {'lnum' : 5 , 'bufnr' : bufnr ( '%' ) , 'col' : 1 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'exported function `MissingDoc` should have comment or be unexported (golint)' }
\ ]
endif
let l :list = []
if a :withList
let l :list = [
\ {'lnum' : 1 , 'bufnr' : 1 , 'col' : 1 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'before metalinter' }
\ ]
let l :expected = extend ( l :list , l :expected )
endif
" set the location lists
call setloclist ( 0 , l :list , 'r' )
let g :go_metalinter_autosave_enabled = ['golint' ]
2018-05-06 15:45:27 +00:00
2020-10-28 13:35:24 +00:00
call go #lint #Gometa ( 0 , 1 )
let l :actual = getloclist ( 0 )
let l :start = reltime ( )
while len ( l :actual ) ! = len ( l :expected ) && reltimefloat ( reltime ( l :start ) ) < 10
sleep 100 m
let l :actual = getloclist ( 0 )
endwhile
call gotest #assert_quickfix ( l :actual , l :expected )
finally
call call ( RestoreGOPATH , [])
unlet g :go_metalinter_autosave_enabled
endtry
endfunc
func ! Test_GometaGolangciLint_importabs ( ) abort
call s :gometa_importabs ( 'golangci-lint' )
endfunc
func ! s :gometa_importabs ( metalinter ) abort
let RestoreGOPATH = go #util #SetEnv ( 'GOPATH' , fnamemodify ( getcwd ( ) , ':p' ) . 'test-fixtures/lint' )
silent exe 'e ' . $GOPATH . '/src/lint/golangci-lint/problems/importabs/problems.go'
try
let g :go_metalinter_command = a :metalinter
let expected = [
\ {'lnum' : 3 , 'bufnr' : bufnr ( '%' ) , 'col' : 8 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : 'w' , 'module' : '' , 'text' : '[runner] Can''t run linter golint: golint: analysis skipped: errors in package' },
\ {'lnum' : 3 , 'bufnr' : bufnr ( '%' ) , 'col' : 8 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : 'e' , 'module' : '' , 'text' : 'Running error: golint: analysis skipped: errors in package' },
\ ]
2019-06-03 14:58:18 +00:00
" clear the quickfix lists
call setqflist ( [], 'r' )
2018-05-06 15:45:27 +00:00
2020-10-28 13:35:24 +00:00
let g :go_metalinter_enabled = ['golint' ]
2018-05-06 15:45:27 +00:00
2020-10-28 13:35:24 +00:00
call go #lint #Gometa ( 0 , 0 )
2018-05-06 15:45:27 +00:00
let actual = getqflist ( )
2019-06-03 14:58:18 +00:00
let start = reltime ( )
while len ( actual ) = = 0 && reltimefloat ( reltime ( start ) ) < 10
sleep 100 m
let actual = getqflist ( )
endwhile
call gotest #assert_quickfix ( actual , expected )
finally
2020-10-28 13:35:24 +00:00
call call ( RestoreGOPATH , [])
unlet g :go_metalinter_enabled
2019-06-03 14:58:18 +00:00
endtry
2018-05-06 15:45:27 +00:00
endfunc
2020-10-28 13:35:24 +00:00
func ! Test_GometaAutoSaveGolangciLint_importabs ( ) abort
call s :gometaautosave_importabs ( 'golangci-lint' )
2019-06-03 14:58:18 +00:00
endfunc
2020-10-28 13:35:24 +00:00
func ! s :gometaautosave_importabs ( metalinter ) abort
let RestoreGOPATH = go #util #SetEnv ( 'GOPATH' , fnameescape ( fnamemodify ( getcwd ( ) , ':p' ) ) . 'test-fixtures/lint' )
silent exe 'e ' . $GOPATH . '/src/lint/golangci-lint/problems/importabs/ok.go'
try
let g :go_metalinter_command = a :metalinter
let expected = [
\ {'lnum' : 3 , 'bufnr' : bufnr ( '%' ) + 1 , 'col' : 8 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : 'w' , 'module' : '' , 'text' : '[runner] Can''t run linter golint: golint: analysis skipped: errors in package' },
\ {'lnum' : 3 , 'bufnr' : bufnr ( '%' ) + 1 , 'col' : 8 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : 'e' , 'module' : '' , 'text' : 'Running error: golint: analysis skipped: errors in package' }
\ ]
" clear the location lists
call setloclist ( 0 , [], 'r' )
let g :go_metalinter_autosave_enabled = ['golint' ]
call go #lint #Gometa ( 0 , 1 )
let actual = getloclist ( 0 )
let start = reltime ( )
while len ( actual ) = = 0 && reltimefloat ( reltime ( start ) ) < 10
sleep 100 m
let actual = getloclist ( 0 )
endwhile
call gotest #assert_quickfix ( actual , expected )
finally
call call ( RestoreGOPATH , [])
unlet g :go_metalinter_autosave_enabled
endtry
2019-06-03 14:58:18 +00:00
endfunc
2020-10-28 13:35:24 +00:00
func ! Test_GometaGolangciLint_multiple ( ) abort
call s :gometa_multiple ( 'golangci-lint' )
endfunc
func ! s :gometa_multiple ( metalinter ) abort
let RestoreGOPATH = go #util #SetEnv ( 'GOPATH' , fnamemodify ( getcwd ( ) , ':p' ) . 'test-fixtures/lint' )
silent exe 'e ' . $GOPATH . '/src/lint/golangci-lint/problems/multiple/problems.go'
2018-05-06 15:45:27 +00:00
2019-06-03 14:58:18 +00:00
try
2020-10-28 13:35:24 +00:00
let g :go_metalinter_command = a :metalinter
2019-06-03 14:58:18 +00:00
let expected = [
2020-10-28 13:35:24 +00:00
\ {'lnum' : 8 , 'bufnr' : bufnr ( '%' ) , 'col' : 7 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : 'w' , 'module' : '' , 'text' : '[runner] Can''t run linter golint: golint: analysis skipped: errors in package' },
\ {'lnum' : 8 , 'bufnr' : bufnr ( '%' ) , 'col' : 7 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : 'e' , 'module' : '' , 'text' : 'Running error: golint: analysis skipped: errors in package' },
2019-06-03 14:58:18 +00:00
\ ]
2020-10-28 13:35:24 +00:00
" clear the quickfix lists
call setqflist ( [], 'r' )
2018-05-06 15:45:27 +00:00
2020-10-28 13:35:24 +00:00
let g :go_metalinter_enabled = ['golint' ]
call go #lint #Gometa ( 0 , 0 )
let actual = getqflist ( )
let start = reltime ( )
while len ( actual ) = = 0 && reltimefloat ( reltime ( start ) ) < 10
sleep 100 m
let actual = getqflist ( )
endwhile
call gotest #assert_quickfix ( actual , expected )
finally
call call ( RestoreGOPATH , [])
unlet g :go_metalinter_enabled
endtry
endfunc
func ! Test_GometaAutoSaveGolangciLint_multiple ( ) abort
call s :gometaautosave_multiple ( 'golangci-lint' )
endfunc
func ! s :gometaautosave_multiple ( metalinter ) abort
let RestoreGOPATH = go #util #SetEnv ( 'GOPATH' , fnameescape ( fnamemodify ( getcwd ( ) , ':p' ) ) . 'test-fixtures/lint' )
silent exe 'e ' . $GOPATH . '/src/lint/golangci-lint/problems/multiple/problems.go'
try
let g :go_metalinter_command = a :metalinter
let expected = [
\ {'lnum' : 8 , 'bufnr' : bufnr ( '%' ) , 'col' : 7 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : 'w' , 'module' : '' , 'text' : '[runner] Can''t run linter golint: golint: analysis skipped: errors in package' },
\ {'lnum' : 8 , 'bufnr' : bufnr ( '%' ) , 'col' : 7 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : 'e' , 'module' : '' , 'text' : 'Running error: golint: analysis skipped: errors in package' },
\ ]
2018-05-06 15:45:27 +00:00
2019-06-03 14:58:18 +00:00
" clear the location lists
2020-10-28 13:35:24 +00:00
call setloclist ( 0 , [], 'r' )
2018-05-06 15:45:27 +00:00
2019-06-03 14:58:18 +00:00
let g :go_metalinter_autosave_enabled = ['golint' ]
2018-05-06 15:45:27 +00:00
2019-06-03 14:58:18 +00:00
call go #lint #Gometa ( 0 , 1 )
2018-05-06 15:45:27 +00:00
2020-10-28 13:35:24 +00:00
let actual = getloclist ( 0 )
2019-06-03 14:58:18 +00:00
let start = reltime ( )
while len ( actual ) = = 0 && reltimefloat ( reltime ( start ) ) < 10
sleep 100 m
2020-10-28 13:35:24 +00:00
let actual = getloclist ( 0 )
2019-06-03 14:58:18 +00:00
endwhile
call gotest #assert_quickfix ( actual , expected )
finally
2020-10-28 13:35:24 +00:00
call call ( RestoreGOPATH , [])
2019-06-03 14:58:18 +00:00
unlet g :go_metalinter_autosave_enabled
endtry
2018-05-06 15:45:27 +00:00
endfunc
2019-06-03 14:58:18 +00:00
func ! Test_Vet ( ) abort
2020-10-28 13:35:24 +00:00
let l :tmp = gotest #load_fixture ( 'lint/src/vet/vet.go' )
try
let expected = [
\ {'lnum' : 7 , 'bufnr' : bufnr ( '%' ) , 'col' : 2 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' ,
\ 'text' : 'Printf format %d has arg str of wrong type string' }
\ ]
let winnr = winnr ( )
" clear the location lists
call setqflist ( [], 'r' )
call go #lint #Vet ( 1 )
let actual = getqflist ( )
let start = reltime ( )
while len ( actual ) = = 0 && reltimefloat ( reltime ( start ) ) < 10
sleep 100 m
let actual = getqflist ( )
endwhile
call gotest #assert_quickfix ( actual , expected )
finally
call delete ( l :tmp , 'rf' )
endtry
endfunc
func ! Test_Vet_subdir ( ) abort
let l :tmp = gotest #load_fixture ( 'lint/src/vet/vet.go' )
" go up one directory to easily test that go vet's file paths are handled
" correctly when the working directory is not the directory that contains
" the file being vetted.
call go #util #Chdir ( '..' )
try
let expected = [
\ {'lnum' : 7 , 'bufnr' : bufnr ( '%' ) , 'col' : 2 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' ,
\ 'text' : 'Printf format %d has arg str of wrong type string' }
\ ]
let winnr = winnr ( )
" clear the location lists
call setqflist ( [], 'r' )
call go #lint #Vet ( 1 )
let actual = getqflist ( )
let start = reltime ( )
while len ( actual ) = = 0 && reltimefloat ( reltime ( start ) ) < 10
sleep 100 m
let actual = getqflist ( )
endwhile
call gotest #assert_quickfix ( actual , expected )
finally
call delete ( l :tmp , 'rf' )
endtry
endfunc
func ! Test_Vet_compilererror ( ) abort
let l :tmp = gotest #load_fixture ( 'lint/src/vet/compilererror/compilererror.go' )
try
let expected = [
\ {'lnum' : 6 , 'bufnr' : bufnr ( '%' ) , 'col' : 22 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : "missing ',' before newline in argument list (and 1 more errors)" }
\ ]
let winnr = winnr ( )
" clear the location lists
call setqflist ( [], 'r' )
call go #lint #Vet ( 1 )
let actual = getqflist ( )
let start = reltime ( )
while len ( actual ) = = 0 && reltimefloat ( reltime ( start ) ) < 10
sleep 100 m
let actual = getqflist ( )
endwhile
call gotest #assert_quickfix ( actual , expected )
finally
call delete ( l :tmp , 'rf' )
endtry
endfunc
func ! Test_Lint_GOPATH ( ) abort
let RestoreGOPATH = go #util #SetEnv ( 'GOPATH' , fnameescape ( fnamemodify ( getcwd ( ) , ':p' ) ) . 'test-fixtures/lint' )
silent exe 'e ' . $GOPATH . '/src/lint/lint.go'
2018-05-06 15:45:27 +00:00
compiler go
let expected = [
2020-10-28 13:35:24 +00:00
\ {'lnum' : 5 , 'bufnr' : bufnr ( '%' ) , 'col' : 1 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'exported function MissingDoc should have comment or be unexported' },
\ {'lnum' : 5 , 'bufnr' : bufnr ( '%' ) + 7 , 'col' : 1 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'exported function AlsoMissingDoc should have comment or be unexported' }
2018-05-06 15:45:27 +00:00
\ ]
let winnr = winnr ( )
" clear the location lists
call setqflist ( [], 'r' )
2020-10-28 13:35:24 +00:00
call go #lint #Golint ( 1 )
2018-05-06 15:45:27 +00:00
let actual = getqflist ( )
let start = reltime ( )
while len ( actual ) = = 0 && reltimefloat ( reltime ( start ) ) < 10
sleep 100 m
let actual = getqflist ( )
endwhile
call gotest #assert_quickfix ( actual , expected )
2020-10-28 13:35:24 +00:00
call call ( RestoreGOPATH , [])
endfunc
func ! Test_Lint_NullModule ( ) abort
silent exe 'e ' . fnameescape ( fnamemodify ( getcwd ( ) , ':p' ) ) . 'test-fixtures/lint/src/lint/lint.go'
compiler go
let expected = [
\ {'lnum' : 5 , 'bufnr' : bufnr ( '%' ) , 'col' : 1 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'exported function MissingDoc should have comment or be unexported' },
\ {'lnum' : 5 , 'bufnr' : bufnr ( '%' ) + 7 , 'col' : 1 , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'pattern' : '' , 'text' : 'exported function AlsoMissingDoc should have comment or be unexported' }
\ ]
let winnr = winnr ( )
" clear the location lists
call setqflist ( [], 'r' )
call go #lint #Golint ( 1 )
let actual = getqflist ( )
let start = reltime ( )
while len ( actual ) = = 0 && reltimefloat ( reltime ( start ) ) < 10
sleep 100 m
let actual = getqflist ( )
endwhile
call gotest #assert_quickfix ( actual , expected )
endfunc
func ! Test_Errcheck ( ) abort
let RestoreGOPATH = go #util #SetEnv ( 'GOPATH' , fnamemodify ( getcwd ( ) , ':p' ) . 'test-fixtures/lint' )
silent exe 'e ' . $GOPATH . '/src/errcheck/errcheck.go'
try
let l :bufnr = bufnr ( '' )
let expected = [
\ {'lnum' : 9 , 'bufnr' : bufnr ( '' ) , 'col' : 9 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'module' : '' , 'text' : ":\tio.Copy(os.Stdout, os.Stdin)" },
\ {'lnum' : 10 , 'bufnr' : bufnr ( '' ) + 1 , 'col' : 9 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'module' : '' , 'text' : ":\tio.Copy(os.Stdout, os.Stdin)" },
\ ]
" clear the location lists
call setqflist ( [], 'r' )
call go #lint #Errcheck ( 1 )
call gotest #assert_quickfix ( getqflist ( ) , expected )
call assert_equal ( l :bufnr , bufnr ( '' ) )
finally
call call ( RestoreGOPATH , [])
endtry
endfunc
func ! Test_Errcheck_options ( ) abort
let RestoreGOPATH = go #util #SetEnv ( 'GOPATH' , fnamemodify ( getcwd ( ) , ':p' ) . 'test-fixtures/lint' )
silent exe 'e ' . $GOPATH . '/src/errcheck/errcheck.go'
try
let l :bufnr = bufnr ( '' )
let expected = [
\ {'lnum' : 9 , 'bufnr' : bufnr ( '' ) , 'col' : 9 , 'pattern' : '' , 'valid' : 1 , 'vcol' : 0 , 'nr' : -1 , 'type' : '' , 'module' : '' , 'text' : ":\tio.Copy(os.Stdout, os.Stdin)" },
\ ]
" clear the location lists
call setqflist ( [], 'r' )
call go #lint #Errcheck ( 1 , '-ignoretests' )
call gotest #assert_quickfix ( getqflist ( ) , expected )
call assert_equal ( l :bufnr , bufnr ( '' ) )
finally
call call ( RestoreGOPATH , [])
endtry
endfunc
func ! Test_Errcheck_compilererror ( ) abort
let l :tmp = gotest #load_fixture ( 'lint/src/errcheck/compilererror/compilererror.go' )
try
let l :bufnr = bufnr ( '' )
let expected = []
" clear the location lists
call setqflist ( [], 'r' )
call go #lint #Errcheck ( 1 )
call gotest #assert_quickfix ( getqflist ( ) , expected )
call assert_equal ( l :bufnr , bufnr ( '' ) )
finally
call delete ( l :tmp , 'rf' )
endtry
2018-05-06 15:45:27 +00:00
endfunc
2019-06-03 14:58:18 +00:00
" restore Vi compatibility settings
let &cpo = s :cpo_save
unlet s :cpo_save
2018-05-06 15:45:27 +00:00
" vim: sw=2 ts=2 et