Join plugin setup.
commit
b2bb146858
|
@ -0,0 +1,34 @@
|
|||
Smart Join
|
||||
==========
|
||||
|
||||
[VERSION: 0.1]
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
Allows for line joining that respects textwidth and optionally clears
|
||||
whitespace.
|
||||
|
||||
Refer to ```doc/``` for complete instructions on use.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
I prefer using [vim-plug](https://github.com/junegunn/vim-plug) for plugin
|
||||
management as follows:
|
||||
|
||||
```vim
|
||||
Plug 'jrpotter/vim-join'
|
||||
```
|
||||
|
||||
Follow use according to plugin manager you use or optionally copy
|
||||
plugin/join.vim from this repo into ```$VIM_DIR/plugin```.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Create a mapping to <Plug>SmartJoin to use the new joining functionality.
|
||||
For instance,
|
||||
|
||||
noremap J <Plug>SmartJoin
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
*smart-join* functionality of smart joining
|
||||
|
||||
==============================================================================
|
||||
CONTENTS *smart-join-contents*
|
||||
|
||||
1. Usage .................................................. |smart-join-usage|
|
||||
2. Variables .......................................... |smart-join-variables|
|
||||
|
||||
==============================================================================
|
||||
Section 1: Usage *highlight-usage*
|
||||
|
||||
<Plug>SmartJoin Performs a smart join on [count] line and the one below
|
||||
it. If [count] is too big it is reduced to the number of
|
||||
lines available. Fails when on the last line of the
|
||||
buffer.
|
||||
|
||||
==============================================================================
|
||||
Section 2: Variables *smart-join-variables*
|
||||
|
||||
g:smart_join_strip_whitespace_before
|
||||
|
||||
If true, indicates that before joining we strip any trailing whitespace on
|
||||
the current line.
|
||||
|
||||
g:smart_join_strip_whitespace_after
|
||||
|
||||
If true, indicates that after joining we strip any trailing whitespace on
|
||||
the current line.
|
||||
|
||||
vim:tw=78:ts=8:ft=help:norl:
|
|
@ -0,0 +1,135 @@
|
|||
" ==============================================================================
|
||||
" File: join.vim
|
||||
" Maintainer: Joshua Potter <jrpotter2112@gmail.com>
|
||||
"
|
||||
" ==============================================================================
|
||||
|
||||
if exists('g:loaded_smart_join')
|
||||
finish
|
||||
endif
|
||||
let g:loaded_smart_join = 1
|
||||
|
||||
|
||||
" GLOBAL VARIABLES: {{{1
|
||||
" ==============================================================================
|
||||
|
||||
" g:smart_join_strip_whitespace_before :: Boolean {{{2
|
||||
" ------------------------------------------------------------------------------
|
||||
" Indicates that before joining, we strip any trailing whitespace on the current
|
||||
" line.
|
||||
|
||||
if !exists('g:smart_join_strip_whitespace_before')
|
||||
let g:smart_join_strip_whitespace_before = 1
|
||||
endif
|
||||
|
||||
|
||||
" g:smart_join_strip_whitespace_after :: Boolean {{{2
|
||||
" ------------------------------------------------------------------------------
|
||||
" Indicates that after joining, we strip any trailing whitespace on the current
|
||||
" line.
|
||||
|
||||
if !exists('g:smart_join_strip_whitespace_after')
|
||||
let g:smart_join_strip_whitespace_after = 1
|
||||
endif
|
||||
|
||||
|
||||
" FUNCTION: StripTrailing() {{{1
|
||||
" ==============================================================================
|
||||
|
||||
function! s:StripTrailing(line)
|
||||
return substitute(a:line, '\(.\{-}\)\s*$', '\1', '')
|
||||
endfunction
|
||||
|
||||
|
||||
" FUNCTION: SmartJoinLine() {{{1
|
||||
" ==============================================================================
|
||||
" Primary functionality of smart joining. It tests the position of the textwidth
|
||||
" and the various possibilities of line continuation at this point, deciding if
|
||||
" it is necessary to introduce a line break or not. Returns true if a line break
|
||||
" occurred.
|
||||
|
||||
function! s:SmartJoinLine()
|
||||
if g:smart_join_strip_whitespace_before
|
||||
call setline('.', s:StripTrailing(getline('.')))
|
||||
endif
|
||||
join
|
||||
" Have a 0 default value (indicting textwidth disabled) or already fits line.
|
||||
" As a special precaution, if only one word on the line, do nothing.
|
||||
let l:line = getline('.')
|
||||
if &textwidth == 0 || len(l:line) <= &textwidth ||
|
||||
\ len(split(l:line, '\W\+')) <= 1
|
||||
return
|
||||
endif
|
||||
" Move to textwidth position if possible. If not, joined line was shorter and
|
||||
" we are finished. Otherwise we can then determine whether or not we must
|
||||
" insert a line break.
|
||||
call cursor('.', &textwidth)
|
||||
if getcurpos()[2] < &textwidth
|
||||
return
|
||||
endif
|
||||
" If the character at textwidth is a whitespace character, we should simply
|
||||
" place a line break at textwidth.
|
||||
if match(l:line[&textwidth - 1], '\W\+') != -1
|
||||
exe "normal! r\<CR>"
|
||||
return 1
|
||||
" If the character following textwidth is a whitespace character, we simply
|
||||
" create a line break at this point. Note that :join will already clear out
|
||||
" any trailing whitespace between the two lines.
|
||||
elseif match(l:line[&textwidth], '\W\+') != -1
|
||||
exe "normal! lr\<CR>"
|
||||
return 1
|
||||
" The last possibility includes whether or not the current word runs through
|
||||
" textwidth.
|
||||
else
|
||||
" Move to the start of the word and check if we need to break before this.
|
||||
" In this case, we first check if we are at the beginning of the word
|
||||
" already (by verifying whether or not there exists a whitespace character
|
||||
" at the position left of the textwidth).
|
||||
if match(l:line[&textwidth - 2], '\W\+') == -1
|
||||
exe "normal! B"
|
||||
endif
|
||||
" Check if WORD goes past textwidth and break at this point if it does.
|
||||
if getcurpos()[2] + len(expand('<cWORD>')) - 1 > &textwidth
|
||||
exe "normal! hr\<CR>"
|
||||
return 1
|
||||
endif
|
||||
endif
|
||||
return 0
|
||||
endfunction
|
||||
|
||||
|
||||
" FUNCTION: SmartJoin(count) {{{1
|
||||
" ==============================================================================
|
||||
" A wrapper around SmartJoinLine() to incorporate post whitespace-stripping and
|
||||
" potential recursive functionality.
|
||||
|
||||
function! s:SmartJoin(count)
|
||||
if a:count > 0
|
||||
let l:linebreak = s:SmartJoinLine()
|
||||
if l:linebreak
|
||||
exe "normal! j"
|
||||
endif
|
||||
if g:smart_join_strip_whitespace_after
|
||||
call setline('.', s:StripTrailing(getline('.')))
|
||||
endif
|
||||
call s:SmartJoin(a:count - 1)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
" FUNCTION: SaveCursorSmartJoin(count) {{{1
|
||||
" ==============================================================================
|
||||
" A wrapper around SmartJoin(count) used to save the cursor position.
|
||||
|
||||
function! g:SaveCursorSmartJoin(count)
|
||||
let l:curpos = getcurpos()
|
||||
call s:SmartJoin(a:count - 1)
|
||||
call setpos('.', l:curpos)
|
||||
endfunction
|
||||
|
||||
|
||||
" MAPPINGS: {{{1
|
||||
" ==============================================================================
|
||||
|
||||
noremap <Plug>SmartJoin :<C-U> call g:SaveCursorSmartJoin(v:count1)<CR>
|
||||
|
Loading…
Reference in New Issue