Back (Current repo: dotfiles)

my dotfiles to make it easy to transfer my settings
To clone this repository:
git clone https://git.viktor1993.net/dotfiles.git
Log | Download | Files | Refs

prog_funcs.vim (4550B)


" turns the selected line number to a comment box, can also add a title into the box
" mostly intended for use at the beginning of files that might require an intro to understand

function WrapLineInCommentBox(linenumber, ...)
    " make title an optional variable
    if a:0 > 0
        let title = a:1
    else
        let title = ''
    end
    execute 'r!echo' getbufline(bufnr('%'), a:linenumber, a:linenumber)[0] '| bash $HOME/scripts/commentbox.sh' title
    execute a:linenumber ."d"
endfunction

" switch between js/html file of the same name
function SwitchJS()
    let file_name = expand("%<")
    let ext = split(expand("%"), '\.')[-1]

    if ext == "js"
        let swap_to_file = join([file_name, ".html"], "")
        if filereadable(swap_to_file)
            :e %<.html
        else " in some projects this is common, so add a special case for this
            let swap_to_file = "index.html"
                if filereadable(swap_to_file)
                    :e index.html
                endif
        endif
    elseif ext == "html"
        let swap_to_file = join([file_name, ".js"], "")
        if filereadable(swap_to_file)
            :e %<.js
        else " if file of same name is not found, try to look for file matching name of parent directory
            let swap_to_file = join([expand('%:p:h:t'), ".js"], "")
            if filereadable(swap_to_file)
                :e %:p:h:t.js
            endif
        endif
    endif
endfunction

" turns a comment composed of multiple lines of // to a single multi-line /* */ type of comment
function! ToMultiLineComment()
     let start_line = line(".")
     let double_slash = '^\s*\/\/'

     " if no '//' at the beginning of line, bail and tell the user
     if (match(getline(start_line), double_slash) == -1)
        echohl WarningMsg | echo 'Cursor not in line with a multi-line "//" comment.' | echohl None
        return
     endif

     let end_line = start_line

     " pick up how many lines our change is going to affect
     while (match(getline(start_line - 1), double_slash) >= 0)
        let start_line = start_line - 1
     endwhile
     while (match(getline(end_line + 1), double_slash) >= 0)
        let end_line = end_line + 1
     endwhile

     " if we would only change one single line, bail and tell the user
     if (start_line == end_line)
        echohl WarningMsg | echo 'This comment is only a single line in length.' | echohl None
        return
     endif

     if (match(getline(end_line), '^\s*\/\/\s*$') >= 0)
        " The last line is just a '//' so we want to replace it with ' */'
        " instead of replacing it with ' *', and adding a new terminating '*/' line.
        execute end_line
        execute 's~//~ */~'
        let end_line = end_line - 1
     endif

     execute start_line
     execute 's~//~/*~'

     " this if block prevents an error from getting thrown when two comments are close to each other
     if (end_line >= (start_line+1))
         execute (start_line + 1) . ',' . end_line . 's~^\(\s*\)//~\1 *~'
         execute end_line + 1
     endif
endfunction

" turn a single line of /* */ comment to // type of comment
" also fixes weird comments like
" /* ...
" */ to a single line // type of comment 
function! OneLineMultiComment()
     let start_line = line(".") " gets current line number at cursor position
     let start_pat = '^\s*\/\*'
     let end_pat   = '^\s*\*\/\s*$'
     let single_pat = '^\s*\/\*\([^*\\]\|\\.\)*\*\/\s*$'

     if match(getline(start_line), single_pat) >= 0
      " A complete /* ... */ comment on one line.
      execute 's~^\(\s*\)/\*\(.\{-}\)\s*\*/~\1//\2~'
      return
     endif

     if match(getline(start_line), start_pat) >= 0
      " If a line starts with '/*'; assume the next line will start with '*/'
      let end_line = start_line + 1
     elseif match(getline(start_line), end_pat) >= 0  " getline(5)  gets text of line 5
      "match() returns -1 if not found, otherwise returns position where match is found
      " If a line starts with '*/'; assume the previous line will start with '/*'
      let end_line = start_line
      let start_line = end_line - 1
     endif

     " Make sure start_line starts with '/*', and end_line starts with '*/'
     if match(getline(start_line), start_pat) == -1 || match(getline(end_line), end_pat) == -1
      echohl WarningMsg | echo 'Invalid operation, should be in a /* ... */ comment' | echohl None
      return
     endif

     execute end_line
     normal! ddk
     execute 's~^\(\s*\)/\*\(.\{-}\)\s*$~\1//\2~'
endfunction