mirror of
https://github.com/preservim/vim-pencil.git
synced 2025-11-16 13:53:47 -05:00
New indicator for use in status line; fixes #6
This commit is contained in:
@@ -14,7 +14,8 @@ The _pencil_ plugin aspires to make Vim as powerful a tool for writers as
|
|||||||
it is for coders by focusing narrowly on the handful of tweaks needed to
|
it is for coders by focusing narrowly on the handful of tweaks needed to
|
||||||
smooth the path to writing prose.
|
smooth the path to writing prose.
|
||||||
|
|
||||||
* For editing prose-oriented file types such as _text_, _markdown_, and _textile_
|
* For editing prose-oriented file types such as _text_, _markdown_, and
|
||||||
|
_textile_
|
||||||
* Agnostic on soft line wrap _versus_ hard line breaks, supporting both
|
* Agnostic on soft line wrap _versus_ hard line breaks, supporting both
|
||||||
* Auto-detects wrap mode via modeline and sampling
|
* Auto-detects wrap mode via modeline and sampling
|
||||||
* Adjusts navigation key mappings to suit the wrap mode
|
* Adjusts navigation key mappings to suit the wrap mode
|
||||||
@@ -25,6 +26,7 @@ smooth the path to writing prose.
|
|||||||
preserves your global settings)
|
preserves your global settings)
|
||||||
* Support for Vim’s Conceal feature to hide markup defined by Syntax
|
* Support for Vim’s Conceal feature to hide markup defined by Syntax
|
||||||
plugins (e.g., `_` and `*` markup for styled text in \_*Markdown*\_)
|
plugins (e.g., `_` and `*` markup for styled text in \_*Markdown*\_)
|
||||||
|
* Support for display of mode indicator (`h✎`, e.g.) in the status line
|
||||||
* Pure Vimscript with no dependencies
|
* Pure Vimscript with no dependencies
|
||||||
|
|
||||||
Need spell-check and other features? Vim is about customization. To
|
Need spell-check and other features? Vim is about customization. To
|
||||||
@@ -53,9 +55,9 @@ You can find that reason in Vim's mysterious command sequences. Take `cas`
|
|||||||
for instance. You might see it as a mnemonic for _Change Around Sentence_
|
for instance. You might see it as a mnemonic for _Change Around Sentence_
|
||||||
to replace an existing sentence. But dig a bit deeper to discover that
|
to replace an existing sentence. But dig a bit deeper to discover that
|
||||||
such commands have a grammar of their own, comprised of nouns, verbs, and
|
such commands have a grammar of their own, comprised of nouns, verbs, and
|
||||||
modifiers. Think of them as the composable building blocks of a _domain specific
|
modifiers. Think of them as the composable building blocks of a _domain
|
||||||
language_ for manipulating text, one that can become a powerful tool in
|
specific language_ for manipulating text, one that can become a powerful
|
||||||
expressing yourself. For more details on vi-style editing, see...
|
tool in expressing yourself. For more details on vi-style editing, see...
|
||||||
|
|
||||||
* [Learn to speak vim – verbs, nouns, and modifiers!][ls] (December 2011)
|
* [Learn to speak vim – verbs, nouns, and modifiers!][ls] (December 2011)
|
||||||
* [Your problem with Vim is that you don't grok vi][gv] (December 2011)
|
* [Your problem with Vim is that you don't grok vi][gv] (December 2011)
|
||||||
@@ -164,7 +166,8 @@ augroup END
|
|||||||
with autoformat disabled.
|
with autoformat disabled.
|
||||||
|
|
||||||
(\*) Advanced users will want to check out `g:pencil#autoformat_blacklist`
|
(\*) Advanced users will want to check out `g:pencil#autoformat_blacklist`
|
||||||
to set highlight groups for which autoformat will not be enabled.
|
to set highlight groups for which autoformat will not be enabled when
|
||||||
|
entering Insert mode.
|
||||||
|
|
||||||
### Manual formatting
|
### Manual formatting
|
||||||
|
|
||||||
@@ -260,6 +263,34 @@ terminal to support **bold** and _italic_ styles.
|
|||||||
[co]: http://www.google.com/fonts/specimen/Cousine
|
[co]: http://www.google.com/fonts/specimen/Cousine
|
||||||
[tm]: http://github.com/tpope/vim-markdown
|
[tm]: http://github.com/tpope/vim-markdown
|
||||||
|
|
||||||
|
### Status line indicator
|
||||||
|
|
||||||
|
Your status line can reflect the wrap mode for _pencil_ buffers. For
|
||||||
|
example, `h✎` to represent `HardPencil` (hard line break) mode.
|
||||||
|
|
||||||
|
To configure your status line, add to your `.vimrc`:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
set statusline=%<%f\ %{PencilMode()}\ %P
|
||||||
|
```
|
||||||
|
|
||||||
|
or if using [bling/vim-airline][va]:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
let g:airline_section_x = '%{PencilMode()}'
|
||||||
|
```
|
||||||
|
|
||||||
|
If you don’t like the default indicators, you can specify different ones:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
let g:pencil#mode_indicators = {'hard': 'h✎ ', 'soft': 's✎ ', 'off': '×✎ '}
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that `PencilMode()` will return blank for buffers in which _pencil_
|
||||||
|
has not been initialized.
|
||||||
|
|
||||||
|
[va]: http://github.com/bling/vim-airline
|
||||||
|
|
||||||
## Auto-detecting wrap mode
|
## Auto-detecting wrap mode
|
||||||
|
|
||||||
**(For advanced users looking to tweak _pencil's_ behavior.)**
|
**(For advanced users looking to tweak _pencil's_ behavior.)**
|
||||||
@@ -322,11 +353,7 @@ then _pencil_ assumes soft line wrap.
|
|||||||
let g:pencil#softDetectThreshold = 130
|
let g:pencil#softDetectThreshold = 130
|
||||||
```
|
```
|
||||||
|
|
||||||
If no such lines found, _pencil_ falls back to the default mentioned earlier:
|
If no such lines found, _pencil_ falls back to the default wrap mode.
|
||||||
|
|
||||||
```vim
|
|
||||||
let g:pencil#wrapModeDefault = 'hard' " or 'soft'
|
|
||||||
```
|
|
||||||
|
|
||||||
## See also
|
## See also
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ fun! s:detect_wrap_mode() abort
|
|||||||
return s:WRAP_MODE_HARD
|
return s:WRAP_MODE_HARD
|
||||||
en
|
en
|
||||||
|
|
||||||
if b:max_textwidth == 0 || g:pencil#wrapModeDefault ==# 'soft'
|
if b:max_textwidth ==# 0 || g:pencil#wrapModeDefault ==# 'soft'
|
||||||
" modeline(s) found only with zero textwidth, so it's soft line wrap
|
" modeline(s) found only with zero textwidth, so it's soft line wrap
|
||||||
" or, the user wants to default to soft line wrap
|
" or, the user wants to default to soft line wrap
|
||||||
return s:WRAP_MODE_SOFT
|
return s:WRAP_MODE_SOFT
|
||||||
@@ -53,7 +53,7 @@ fun! s:imap(preserve_completion, key, icmd)
|
|||||||
en
|
en
|
||||||
endf
|
endf
|
||||||
|
|
||||||
fun! s:enable_autoformat()
|
fun! s:maybe_enable_autoformat()
|
||||||
" don't enable autoformat if in a code block or table
|
" don't enable autoformat if in a code block or table
|
||||||
let l:okay_to_enable = 1
|
let l:okay_to_enable = 1
|
||||||
let l:col = col('.')
|
let l:col = col('.')
|
||||||
@@ -82,10 +82,10 @@ fun! pencil#setAutoFormat(mode)
|
|||||||
if !exists('b:last_autoformat')
|
if !exists('b:last_autoformat')
|
||||||
let b:last_autoformat = 0
|
let b:last_autoformat = 0
|
||||||
en
|
en
|
||||||
let b:last_autoformat = a:mode == -1 ? !b:last_autoformat : a:mode
|
let b:last_autoformat = a:mode ==# -1 ? !b:last_autoformat : a:mode
|
||||||
if b:last_autoformat
|
if b:last_autoformat
|
||||||
aug pencil_autoformat
|
aug pencil_autoformat
|
||||||
au InsertEnter <buffer> call s:enable_autoformat()
|
au InsertEnter <buffer> call s:maybe_enable_autoformat()
|
||||||
au InsertLeave <buffer> set formatoptions-=a
|
au InsertLeave <buffer> set formatoptions-=a
|
||||||
aug END
|
aug END
|
||||||
el
|
el
|
||||||
@@ -99,8 +99,8 @@ endf
|
|||||||
fun! pencil#init(...) abort
|
fun! pencil#init(...) abort
|
||||||
let l:args = a:0 ? a:1 : {}
|
let l:args = a:0 ? a:1 : {}
|
||||||
|
|
||||||
if !exists('b:wrap_mode')
|
if !exists('b:pencil_wrap_mode')
|
||||||
let b:wrap_mode = s:WRAP_MODE_OFF
|
let b:pencil_wrap_mode = s:WRAP_MODE_OFF
|
||||||
en
|
en
|
||||||
if !exists("b:max_textwidth")
|
if !exists("b:max_textwidth")
|
||||||
let b:max_textwidth = -1
|
let b:max_textwidth = -1
|
||||||
@@ -109,49 +109,49 @@ fun! pencil#init(...) abort
|
|||||||
" If user explicitly requested wrap_mode thru args, go with that.
|
" If user explicitly requested wrap_mode thru args, go with that.
|
||||||
let l:wrap_arg = get(l:args, 'wrap', 'detect')
|
let l:wrap_arg = get(l:args, 'wrap', 'detect')
|
||||||
|
|
||||||
if (b:wrap_mode && l:wrap_arg ==# 'toggle') ||
|
if (b:pencil_wrap_mode && l:wrap_arg ==# 'toggle') ||
|
||||||
\ l:wrap_arg =~# '^\(0\|off\|disable\|false\)$'
|
\ l:wrap_arg =~# '^\(0\|off\|disable\|false\)$'
|
||||||
let b:wrap_mode = s:WRAP_MODE_OFF
|
let b:pencil_wrap_mode = s:WRAP_MODE_OFF
|
||||||
elsei l:wrap_arg ==# 'hard'
|
elsei l:wrap_arg ==# 'hard'
|
||||||
let b:wrap_mode = s:WRAP_MODE_HARD
|
let b:pencil_wrap_mode = s:WRAP_MODE_HARD
|
||||||
elsei l:wrap_arg ==# 'soft'
|
elsei l:wrap_arg ==# 'soft'
|
||||||
let b:wrap_mode = s:WRAP_MODE_SOFT
|
let b:pencil_wrap_mode = s:WRAP_MODE_SOFT
|
||||||
elsei l:wrap_arg ==# 'default'
|
elsei l:wrap_arg ==# 'default'
|
||||||
let b:wrap_mode = s:WRAP_MODE_DEFAULT
|
let b:pencil_wrap_mode = s:WRAP_MODE_DEFAULT
|
||||||
el
|
el
|
||||||
" this can return s:WRAP_MODE_ for soft, hard or default
|
" this can return s:WRAP_MODE_ for soft, hard or default
|
||||||
let b:wrap_mode = s:detect_wrap_mode()
|
let b:pencil_wrap_mode = s:detect_wrap_mode()
|
||||||
en
|
en
|
||||||
|
|
||||||
" translate default(-1) to soft(1) or hard(2) or off(0)
|
" translate default(-1) to soft(1) or hard(2) or off(0)
|
||||||
if b:wrap_mode == s:WRAP_MODE_DEFAULT
|
if b:pencil_wrap_mode ==# s:WRAP_MODE_DEFAULT
|
||||||
if g:pencil#wrapModeDefault =~# '^\(0\|off\|disable\|false\)$'
|
if g:pencil#wrapModeDefault =~# '^\(0\|off\|disable\|false\)$'
|
||||||
let b:wrap_mode = s:WRAP_MODE_OFF
|
let b:pencil_wrap_mode = s:WRAP_MODE_OFF
|
||||||
elsei g:pencil#wrapModeDefault ==# 'soft'
|
elsei g:pencil#wrapModeDefault ==# 'soft'
|
||||||
let b:wrap_mode = s:WRAP_MODE_SOFT
|
let b:pencil_wrap_mode = s:WRAP_MODE_SOFT
|
||||||
el
|
el
|
||||||
let b:wrap_mode = s:WRAP_MODE_HARD
|
let b:pencil_wrap_mode = s:WRAP_MODE_HARD
|
||||||
en
|
en
|
||||||
en
|
en
|
||||||
|
|
||||||
" autoformat is only used in Hard mode, and then only during
|
" autoformat is only used in Hard mode, and then only during
|
||||||
" Insert mode
|
" Insert mode
|
||||||
call pencil#setAutoFormat(
|
call pencil#setAutoFormat(
|
||||||
\ b:wrap_mode == s:WRAP_MODE_HARD &&
|
\ b:pencil_wrap_mode ==# s:WRAP_MODE_HARD &&
|
||||||
\ get(l:args, 'autoformat', g:pencil#autoformat))
|
\ get(l:args, 'autoformat', g:pencil#autoformat))
|
||||||
|
|
||||||
if b:wrap_mode == s:WRAP_MODE_HARD
|
if b:pencil_wrap_mode ==# s:WRAP_MODE_HARD
|
||||||
if &modeline == 0 && b:max_textwidth > 0
|
if &modeline ==# 0 && b:max_textwidth > 0
|
||||||
" Compensate for disabled modeline
|
" Compensate for disabled modeline
|
||||||
exe 'setl textwidth=' . b:max_textwidth
|
exe 'setl textwidth=' . b:max_textwidth
|
||||||
elsei &textwidth == 0
|
elsei &textwidth ==# 0
|
||||||
exe 'setl textwidth=' .
|
exe 'setl textwidth=' .
|
||||||
\ get(l:args, 'textwidth', g:pencil#textwidth)
|
\ get(l:args, 'textwidth', g:pencil#textwidth)
|
||||||
el
|
el
|
||||||
setl textwidth<
|
setl textwidth<
|
||||||
en
|
en
|
||||||
setl nowrap
|
setl nowrap
|
||||||
elsei b:wrap_mode == s:WRAP_MODE_SOFT
|
elsei b:pencil_wrap_mode ==# s:WRAP_MODE_SOFT
|
||||||
setl textwidth=0
|
setl textwidth=0
|
||||||
setl wrap
|
setl wrap
|
||||||
setl linebreak
|
setl linebreak
|
||||||
@@ -168,7 +168,7 @@ fun! pencil#init(...) abort
|
|||||||
en
|
en
|
||||||
|
|
||||||
" global settings
|
" global settings
|
||||||
if b:wrap_mode
|
if b:pencil_wrap_mode
|
||||||
set display+=lastline
|
set display+=lastline
|
||||||
set backspace=indent,eol,start
|
set backspace=indent,eol,start
|
||||||
if get(l:args, 'joinspaces', g:pencil#joinspaces)
|
if get(l:args, 'joinspaces', g:pencil#joinspaces)
|
||||||
@@ -177,7 +177,7 @@ fun! pencil#init(...) abort
|
|||||||
set nojoinspaces " only one space after a .!? (default)
|
set nojoinspaces " only one space after a .!? (default)
|
||||||
en
|
en
|
||||||
|
|
||||||
"if b:wrap_mode == s:WRAP_MODE_SOFT
|
"if b:pencil_wrap_mode ==# s:WRAP_MODE_SOFT
|
||||||
" " augment with additional chars
|
" " augment with additional chars
|
||||||
" set breakat=\ !@*-+;:,./?([{
|
" set breakat=\ !@*-+;:,./?([{
|
||||||
"en
|
"en
|
||||||
@@ -186,7 +186,7 @@ fun! pencil#init(...) abort
|
|||||||
" because ve=onemore is relatively rare and could break
|
" because ve=onemore is relatively rare and could break
|
||||||
" other plugins, restrict its presence to buffer
|
" other plugins, restrict its presence to buffer
|
||||||
" Better: restore ve to original setting
|
" Better: restore ve to original setting
|
||||||
if b:wrap_mode && get(l:args, 'cursorwrap', g:pencil#cursorwrap)
|
if b:pencil_wrap_mode && get(l:args, 'cursorwrap', g:pencil#cursorwrap)
|
||||||
set whichwrap+=<,>,b,s,h,l,[,]
|
set whichwrap+=<,>,b,s,h,l,[,]
|
||||||
aug pencil_cursorwrap
|
aug pencil_cursorwrap
|
||||||
au BufEnter <buffer> set virtualedit+=onemore
|
au BufEnter <buffer> set virtualedit+=onemore
|
||||||
@@ -197,7 +197,7 @@ fun! pencil#init(...) abort
|
|||||||
en
|
en
|
||||||
|
|
||||||
" window/buffer settings
|
" window/buffer settings
|
||||||
if b:wrap_mode
|
if b:pencil_wrap_mode
|
||||||
setl nolist
|
setl nolist
|
||||||
setl wrapmargin=0
|
setl wrapmargin=0
|
||||||
setl autoindent " needed by formatoptions=n
|
setl autoindent " needed by formatoptions=n
|
||||||
@@ -236,7 +236,7 @@ fun! pencil#init(...) abort
|
|||||||
en
|
en
|
||||||
en
|
en
|
||||||
|
|
||||||
if b:wrap_mode == s:WRAP_MODE_SOFT
|
if b:pencil_wrap_mode ==# s:WRAP_MODE_SOFT
|
||||||
nn <buffer> <silent> $ g$
|
nn <buffer> <silent> $ g$
|
||||||
nn <buffer> <silent> 0 g0
|
nn <buffer> <silent> 0 g0
|
||||||
vn <buffer> <silent> $ g$
|
vn <buffer> <silent> $ g$
|
||||||
@@ -258,7 +258,7 @@ fun! pencil#init(...) abort
|
|||||||
sil! iu <buffer> <End>
|
sil! iu <buffer> <End>
|
||||||
en
|
en
|
||||||
|
|
||||||
if b:wrap_mode
|
if b:pencil_wrap_mode
|
||||||
nn <buffer> <silent> j gj
|
nn <buffer> <silent> j gj
|
||||||
nn <buffer> <silent> k gk
|
nn <buffer> <silent> k gk
|
||||||
vn <buffer> <silent> j gj
|
vn <buffer> <silent> j gj
|
||||||
@@ -283,7 +283,7 @@ fun! pencil#init(...) abort
|
|||||||
|
|
||||||
" set undo points around common punctuation,
|
" set undo points around common punctuation,
|
||||||
" line <c-u> and word <c-w> deletions
|
" line <c-u> and word <c-w> deletions
|
||||||
if b:wrap_mode
|
if b:pencil_wrap_mode
|
||||||
ino <buffer> . .<c-g>u
|
ino <buffer> . .<c-g>u
|
||||||
ino <buffer> ! !<c-g>u
|
ino <buffer> ! !<c-g>u
|
||||||
ino <buffer> ? ?<c-g>u
|
ino <buffer> ? ?<c-g>u
|
||||||
|
|||||||
@@ -13,6 +13,33 @@ let g:loaded_pencil = 1
|
|||||||
let s:save_cpo = &cpo
|
let s:save_cpo = &cpo
|
||||||
set cpo&vim
|
set cpo&vim
|
||||||
|
|
||||||
|
let s:WRAP_MODE_DEFAULT = -1
|
||||||
|
let s:WRAP_MODE_OFF = 0
|
||||||
|
let s:WRAP_MODE_HARD = 1
|
||||||
|
let s:WRAP_MODE_SOFT = 2
|
||||||
|
|
||||||
|
fun! s:unicode_enabled()
|
||||||
|
retu &encoding ==# 'utf-8'
|
||||||
|
endf
|
||||||
|
|
||||||
|
" helper for statusline
|
||||||
|
"
|
||||||
|
" Note that it shouldn't be dependent on init(), which
|
||||||
|
" won't have been called for non-prose modules.
|
||||||
|
fun! PencilMode()
|
||||||
|
if exists('b:pencil_wrap_mode')
|
||||||
|
if b:pencil_wrap_mode ==# s:WRAP_MODE_SOFT
|
||||||
|
return get(g:pencil#mode_indicators, 'soft', 'sp')
|
||||||
|
elsei b:pencil_wrap_mode ==# s:WRAP_MODE_HARD
|
||||||
|
return get(g:pencil#mode_indicators, 'hard', 'hp')
|
||||||
|
el
|
||||||
|
return get(g:pencil#mode_indicators, 'off', '')
|
||||||
|
en
|
||||||
|
else
|
||||||
|
return ''
|
||||||
|
en
|
||||||
|
endf
|
||||||
|
|
||||||
if !exists('g:pencil#wrapModeDefault')
|
if !exists('g:pencil#wrapModeDefault')
|
||||||
" user-overridable default, if detection fails
|
" user-overridable default, if detection fails
|
||||||
" should be 'soft' or 'hard' or 'off'
|
" should be 'soft' or 'hard' or 'off'
|
||||||
@@ -92,6 +119,15 @@ if !exists('g:pencil#softDetectThreshold')
|
|||||||
let g:pencil#softDetectThreshold = 130
|
let g:pencil#softDetectThreshold = 130
|
||||||
en
|
en
|
||||||
|
|
||||||
|
if !exists('g:pencil#mode_indicators')
|
||||||
|
" used to set PencilMode() for statusline
|
||||||
|
if s:unicode_enabled()
|
||||||
|
let g:pencil#mode_indicators = {'hard': 'h✎ ', 'soft': 's✎ ', 'off': '×✎ ',}
|
||||||
|
el
|
||||||
|
let g:pencil#mode_indicators = {'hard': 'hp', 'soft': 'sp', 'off': '',}
|
||||||
|
en
|
||||||
|
en
|
||||||
|
|
||||||
" # coms
|
" # coms
|
||||||
com -nargs=0 HardPencil call pencil#init({'wrap': 'hard'})
|
com -nargs=0 HardPencil call pencil#init({'wrap': 'hard'})
|
||||||
com -nargs=0 SoftPencil call pencil#init({'wrap': 'soft'})
|
com -nargs=0 SoftPencil call pencil#init({'wrap': 'soft'})
|
||||||
|
|||||||
Reference in New Issue
Block a user