2909 lines
143 KiB
Plaintext
2909 lines
143 KiB
Plaintext
|
*txtfmt.txt* Syntax/Filetype plugin for formatting plain text
|
||
|
|
||
|
Author: Brett Pershing Stahlman <brettstahlman@comcast.net>
|
||
|
Version: 2.4
|
||
|
|
||
|
==============================================================================
|
||
|
1. Contents *txtfmt* *txtfmt-contents*
|
||
|
|
||
|
1. Contents....................................: |txtfmt-contents|
|
||
|
2. Motivation..................................: |txtfmt-motivation|
|
||
|
3. Overview....................................: |txtfmt-overview|
|
||
|
4. Installation................................: |txtfmt-installation|
|
||
|
Distributed files...........................: |txtfmt-dist-files|
|
||
|
Detecting/setting Txtfmt filetype...........: |txtfmt-filetype|
|
||
|
Combining with other filetypes..............: |txtfmt-combining|
|
||
|
Nesting Txtfmt regions....................: |txtfmt-nesting|
|
||
|
Using Txtfmt within C comments..........: |txtfmt-nesting-c-example|
|
||
|
Using Txtfmt within .otl (TVO) files....: |txtfmt-nesting-tvo-example|
|
||
|
Using Txtfmt within 'Notes' plugin......: |txtfmt-nesting-notes-example|
|
||
|
Loading.....................................: |txtfmt-loading|
|
||
|
5. Configuration...............................: |txtfmt-configuration|
|
||
|
Options.....................................: |txtfmt-options|
|
||
|
Option types..............................: |txtfmt-opt-types|
|
||
|
Option naming convention..................: |txtfmt-opt-names|
|
||
|
Number format.............................: |txtfmt-opt-num-fmt|
|
||
|
Txtfmt modelines..........................: |txtfmt-modeline|
|
||
|
Txtfmt modeline format..................: |txtfmt-modeline-fmt|
|
||
|
Refreshing display after option changes...: |txtfmt-opt-refresh|
|
||
|
:Refresh command........................: |txtfmt-:Refresh|
|
||
|
Option list...............................: |txtfmt-opt-list|
|
||
|
Txtfmt "conceal" feature considerations.....: |txtfmt-conceal-notes|
|
||
|
Choosing a token range......................: |txtfmt-choosing-token-range|
|
||
|
Colors......................................: |txtfmt-color-config|
|
||
|
Color defaults............................: |txtfmt-color-defaults|
|
||
|
Colorscheme considerations................: |txtfmt-colorschemes|
|
||
|
Achieving "colorscheme-independence"....: |txtfmt-hl-color-names|
|
||
|
Color terminal pitfalls.....................: |txtfmt-cterm-pitfalls|
|
||
|
Customizing the default maps................: |txtfmt-map-config|
|
||
|
Handling conflicts and ambiguities........: |txtfmt-map-conflict|
|
||
|
6. User interface..............................: |txtfmt-user-interface|
|
||
|
Inserting tokens............................: |txtfmt-ins-tok|
|
||
|
Fmt spec..................................: |txtfmt-fmt-spec|
|
||
|
Clr spec..................................: |txtfmt-clr-spec|
|
||
|
Fmt/clr spec list.........................: |txtfmt-fmt-clr-spec-list|
|
||
|
Mapping overview..........................: |txtfmt-ins-tok-maps|
|
||
|
Mappings..................................: |txtfmt-ins-tok-map-list|
|
||
|
Jumping to tokens...........................: |txtfmt-jump-to-tok|
|
||
|
Mappings..................................: |txtfmt-jump-to-tok-maps|
|
||
|
Building complex mappings from primitives...: |txtfmt-user-maps|
|
||
|
txtfmtUsermap{} element format............: |txtfmt-user-map-fmt|
|
||
|
User-map expansion macros.................: |txtfmt-user-map-expansion|
|
||
|
User-map examples.........................: |txtfmt-user-map-examples|
|
||
|
Using buf-local sets......................: |txtfmt-buflocal-user-map|
|
||
|
Creating token strings......................: |txtfmt-create-tok-str||
|
||
|
Txtfmt_GetTokStr()........................: |txtfmt-GetTokStr()|
|
||
|
Querying token type.........................: |txtfmt-query-tok-type|
|
||
|
Format of token description string........: |txtfmt-tok-descriptor|
|
||
|
\ga.......................................: |txtfmt-get-tok-info|
|
||
|
:GetTokInfo...............................: |txtfmt-:GetTokInfo|
|
||
|
Txtfmt_GetTokInfo()....!!!DEPRECATED!!!...: |txtfmt-GetTokInfo()|
|
||
|
Viewing token map...........................: |txtfmt-view-tok-map|
|
||
|
:ShowTokenMap.............................: |txtfmt-:ShowTokenMap|
|
||
|
Testing current settings....................: |txtfmt-test-cur-settings|
|
||
|
:MakeTestPage.............................: |txtfmt-:MakeTestPage|
|
||
|
Moving the current token range..............: |txtfmt-move-tok-range|
|
||
|
:MoveStartTok.............................: |txtfmt-:MoveStartTok|
|
||
|
7. File structure..............................: |txtfmt-files|
|
||
|
8. Detailed theory of operation................: |txtfmt-detailed-theory|
|
||
|
|
||
|
==============================================================================
|
||
|
2. Motivation *txtfmt-motivation*
|
||
|
|
||
|
In addition to using Vim to edit C code, I sometimes use it to write notes of
|
||
|
various kinds. Sometimes these notes are temporary in nature, and sometimes
|
||
|
they are meant to be more permanent; for example, a document describing
|
||
|
various subsystems in a large programming project. For a task of this nature,
|
||
|
Vim offers many advantages over a typical word processor. Features like word
|
||
|
completion, multiple text registers, tags, cscope, etc. are very useful when
|
||
|
documenting source code. However, there was always one advantage that a word
|
||
|
processor had when it came to creating non source code documents: formatted
|
||
|
text. The ability to set certain regions of text to an arbitrary foreground or
|
||
|
background color, or to make them stand out with attributes such as bold,
|
||
|
italic and underline can make a document much more readable, and hence, more
|
||
|
useful.
|
||
|
|
||
|
I realize that there are a number of very powerful formatting languages and
|
||
|
utilities, which may be used to create such documents. What I wanted, however,
|
||
|
was something very lightweight, something that depended only upon Vim. In
|
||
|
other words, I didn't want to create a file, which could be operated upon by a
|
||
|
tool, to create a file for viewing. I wanted only 1 file, the one I edited
|
||
|
with Vim, which could be viewed "on-the-fly," as each editing change was made.
|
||
|
The Txtfmt plugin is my solution for creating formatted documents with Vim,
|
||
|
to be viewed within Vim.
|
||
|
|
||
|
==============================================================================
|
||
|
3. Overview *txtfmt-overview*
|
||
|
|
||
|
Txtfmt's formatting is accomplished through the use of single-character
|
||
|
"tokens" (chosen from ranges not normally used in text files), which are used
|
||
|
to define highlight attributes for subsequent text. The tokens themselves are
|
||
|
concealed by Txtfmt's syntax file, so that each appears as a single space (or
|
||
|
not at all if your version of Vim was compiled with "conceal" support - see
|
||
|
|txtfmt-'conceal'|)
|
||
|
Note: See section |txtfmt-cterm-ignore-issue| if you notice that tokens are
|
||
|
not hidden on your system.
|
||
|
|
||
|
Txtfmt requires 9 of the aforementioned tokens for foreground color regions,
|
||
|
and an additional 9 tokens if background colors are enabled (see
|
||
|
txtfmt-'tokrange' ). The |txtfmt-'tokrange'| option setting also determines
|
||
|
the number of tokens required for format regions. If the tokrange suffix is
|
||
|
'S' (short formats) or 'X' (extended), then the only formatting attributes in
|
||
|
use are bold, underline and italic. All possible permutations of these
|
||
|
attributes may be represented with only 8 tokens. If, on the other hand, the
|
||
|
tokrange suffix is 'L' (long formats), the set of available format attributes
|
||
|
expands to include standout, reverse and (for Vim versions >= 7.0) undercurl.
|
||
|
In this case, Txtfmt will require either 32 or 64 format tokens, depending
|
||
|
upon whether the version of Vim supports undercurl.
|
||
|
|
||
|
There are 3 types of Txtfmt marker token: format, foreground color and
|
||
|
background color. The 3 types of regions begun by these 3 types of tokens are
|
||
|
"orthogonal"; i.e., the presence of one has no effect upon any others that
|
||
|
happen to be active at that point in the buffer. For example, suppose you have
|
||
|
begun a green color region by inserting the appropriate token (with one of
|
||
|
Txtfmt's mappings, to be discussed later). You now wish to emphasize a word or
|
||
|
phrase by formatting it in italics, but you do not wish to change the color.
|
||
|
In this case, you would simply insert the format token denoting "italic", and
|
||
|
subsequently typed text would be green italic. If you later wished to switch
|
||
|
back to un-italicized (normal) green text, you would simply insert the format
|
||
|
token corresponding to "no format". Note that format and color tokens may be
|
||
|
freely interspersed with one another in any order.
|
||
|
|
||
|
The tokens described above are simply characters belonging to the character
|
||
|
set in use (e.g. latin1, utf-8, etc...), so it would be theoretically possible
|
||
|
to accomplish the highlighting with a syntax file alone, by simply inserting
|
||
|
the marker characters with CTRL-V or something similar. However, this would
|
||
|
require you to memorize the character codes corresponding to 8 colors and all
|
||
|
combinations of underline, bold, italic, etc... Thus, in addition to a syntax
|
||
|
file, Txtfmt provides a filetype plugin (ftplugin), which provides mappings
|
||
|
and functions to facilitate working with the format/color tokens. Inserting
|
||
|
tokens, finding (jumping to) tokens, and querying token type, are a few of the
|
||
|
operations that can be performed with mappings and/or functions defined in the
|
||
|
ftplugin.
|
||
|
|
||
|
==============================================================================
|
||
|
4. Installation *txtfmt-installation*
|
||
|
|
||
|
DISTRIBUTED FILES *txtfmt-dist-files*
|
||
|
|
||
|
The Txtfmt distribution comprises the following 4 files:
|
||
|
|
||
|
doc/txtfmt.txt Txtfmt help file (this file)
|
||
|
ftplugin/txtfmt.vim Txtfmt filetype plugin (contains mappings for working
|
||
|
with Txtfmt tokens)
|
||
|
syntax/txtfmt.vim Txtfmt syntax file (defines the Txtfmt syntax
|
||
|
highlighting)
|
||
|
plugin/txtfmt.vim Txtfmt common configuration code (contains
|
||
|
configuration script needed by both the filetype and
|
||
|
syntax plugins)
|
||
|
indent_patch.txt Bram Moolenaar's patch to fix indent.vim's handling of
|
||
|
dot-separated lists in 'filetype' option values
|
||
|
(required only if your version of Vim is older than
|
||
|
7.2 and you plan to "nest" Txtfmt within other
|
||
|
filetypes)
|
||
|
For details, see |txtfmt-combining|.
|
||
|
|
||
|
All of the txtfmt.vim files should be placed in their respective parent
|
||
|
directories, somewhere in your 'runtimepath'. If you need the patch files, you
|
||
|
may place them wherever you like.
|
||
|
|
||
|
IMPORTANT NOTE: To make Txtfmt help topics visible to Vim's :help command, you
|
||
|
must run :helptags, passing the path to the doc folder where you unpacked
|
||
|
txtfmt.txt as an argument.
|
||
|
|
||
|
DETECTING OR SETTING TXTFMT FILETYPE *txtfmt-filetype*
|
||
|
|
||
|
Once you have copied the Txtfmt files to the appropriate directories in
|
||
|
'runtimepath', you can always use the Txtfmt syntax and mappings by manually
|
||
|
setting the 'filetype' option. (I am assuming, of course, that you have
|
||
|
enabled syntax at some point, most likely in your .vimrc. If you are not sure
|
||
|
about this, see |syntax-enable|.) The 'filetype' option may be set on the
|
||
|
command line: e.g. >
|
||
|
:set ft=txtfmt
|
||
|
|
||
|
A better approach for a file designed to be viewed with Txtfmt highlighting
|
||
|
would be to set the filetype in a Vim modeline: e.g. >
|
||
|
vim:ft=txtfmt
|
||
|
|
||
|
While the manual approach may be appropriate for some uses, if you find
|
||
|
yourself always using Txtfmt with certain types of files, it probably makes
|
||
|
sense to set up automatic detection via one of the methods discussed in the
|
||
|
section |new-filetype| in the Vim help. The simplest approach is to create
|
||
|
your own filetype.vim (assuming you haven't done so already) in a directory
|
||
|
that comes before $VIMRUNTIME in 'runtimepath'. Within this script, you should
|
||
|
define an autocommand that will :setfiletype to txtfmt for any file with an
|
||
|
appropriate extension.
|
||
|
|
||
|
Example: >
|
||
|
" Set up detection for Txtfmt files
|
||
|
au! filetypedetect BufRead,BufNewFile *.txt setfiletype txtfmt
|
||
|
|
||
|
COMBINING TXTFMT WITH OTHER FILETYPES *txtfmt-combining*
|
||
|
|
||
|
It is possible to use the Txtfmt plugins with the plugins of other filetypes.
|
||
|
This feature is useful when you wish to take advantage of Txtfmt's arbitrary
|
||
|
formatting capabilities in a file that would otherwise support only static
|
||
|
formatting. The simplest way to accomplish this is to set 'filetype' to a
|
||
|
dot-separated list of filetype names: e.g. "c.txtfmt". When you do this, Vim
|
||
|
will load the corresponding filetype and syntax files in the order in which
|
||
|
they appear in the list.
|
||
|
|
||
|
WARNING: Txtfmt's filetype plugin is designed to be used in this way; some of
|
||
|
the standard plugins, however, will skip loading if a plugin that sets
|
||
|
b:did_ftplugin has already been sourced. Thus, it is best to put Txtfmt last
|
||
|
in the list of filetypes.
|
||
|
|
||
|
The method just described is useful when you wish to use Txtfmt in conjunction
|
||
|
with an existing filetype. It is possible, however, that you simply wish to
|
||
|
extend Txtfmt by adding a few predefined formatting regions. As an example,
|
||
|
suppose you find yourself highlighting things like "TODO" and "IMPORTANT NOTE"
|
||
|
quite often in your Txtfmt files. You can always highlight them manually by
|
||
|
using Txtfmt markers; it would be more efficient, however, to define syntax
|
||
|
highlighting that handles these special cases automatically. You could do this
|
||
|
in a special Txtfmt syntax file, which you create in an "after" directory in
|
||
|
your 'runtimepath'. (See |after-directory|.)
|
||
|
|
||
|
Nesting Txtfmt regions *txtfmt-nesting*
|
||
|
|
||
|
Whether you are combining Txtfmt with an existing filetype, or simply
|
||
|
extending Txtfmt's highlighting with predefined regions of your own, it is
|
||
|
possible that you will want to use Txtfmt's highlighting within non-txtfmt
|
||
|
syntax regions. If, for example, you are using Txtfmt in combination with C
|
||
|
syntax, you may wish to create Txtfmt regions within C comments. This is
|
||
|
possible, but only if you have set the |txtfmt-'nested'| option. If you are
|
||
|
nesting Txtfmt regions within non-Txtfmt regions, you should generally
|
||
|
terminate the Txtfmt regions explicitly, rather than relying upon the
|
||
|
containing region to terminate it. A containing region without a "keepend"
|
||
|
argument will not be able to terminate the Txtfmt region. A containing region
|
||
|
with "keepend" will terminate the Txtfmt region, but the containing region's
|
||
|
end marker may not be formatted correctly unless a "matchgroup" was used to
|
||
|
define it.
|
||
|
|
||
|
A few practical examples follow...
|
||
|
|
||
|
C source file nesting example: *txtfmt-nesting-c-example*
|
||
|
|
||
|
Here is how you could use Txtfmt to format your C-language comments...
|
||
|
|
||
|
Put the following within your user "filetype.vim"
|
||
|
(e.g. $VIM/vimfiles/filetype.vim) >
|
||
|
" Allow Txtfmt regions to be nested within C comments
|
||
|
augroup filetypedetect
|
||
|
au! BufRead,BufNewFile *.c let b:txtfmtNested = 1
|
||
|
au BufRead,BufNewFile *.c setf c.txtfmt
|
||
|
augroup END
|
||
|
|
||
|
Now, you may use Txtfmt mappings to add color and formatting regions to your C
|
||
|
comments! (Technically, of course, you can format anything in the file, but
|
||
|
I'm assuming you want the source file to compile.)
|
||
|
|
||
|
*indent_patch.txt*
|
||
|
IMPORTANT NOTE: Prior to Vim 7.2, the distributed version of "indent.vim" was
|
||
|
not aware of the dot-separated filetype name convention. Thus, if you're using
|
||
|
an older version of Vim, C-indenting will not work properly if you set
|
||
|
filetype to "c.txtfmt". Bram's patch for this issue is packaged along with the
|
||
|
Txtfmt files. If you have not yet upgraded to the latest version of Vim, and
|
||
|
you do not wish to apply the patch, you could work around the issue with an
|
||
|
alternative approach such as this: >
|
||
|
" Allow Txtfmt regions to be nested within C comments without losing
|
||
|
" cindent capability in pre-7.2 Vim.
|
||
|
augroup filetypedetect
|
||
|
" Set filetype to c
|
||
|
au! BufRead,BufNewFile *.c setf c
|
||
|
" Make sure Txtfmt regions can nest within comments
|
||
|
au BufRead,BufNewFile *.c let b:txtfmtNested = 1
|
||
|
" Manually source the Txtfmt filetype and syntax plugin files...
|
||
|
au BufRead,BufNewFile *.c runtime syntax/txtfmt.vim
|
||
|
au BufRead,BufNewFile *.c runtime ftplugin/txtfmt.vim
|
||
|
augroup END
|
||
|
|
||
|
Of course, it's probably easier just to upgrade Vim;-)
|
||
|
|
||
|
TVO nesting example: *txtfmt-nesting-tvo-example*
|
||
|
|
||
|
Here is how you could use Txtfmt to format the ordinary text within .otl files
|
||
|
created with TVO (The Vim Outliner plugin written by Ned Konz)...
|
||
|
|
||
|
Put the following within the ftdetect/otl.vim file distributed with the TVO
|
||
|
plugin: >
|
||
|
" This sets up *.otl files to be outlined
|
||
|
au BufRead,BufNewFile *.otl setf otl.txtfmt
|
||
|
|
||
|
Important Note: Because the TVO plugin was not designed to work with the
|
||
|
"dot-separated" filetype syntax, it is important that your .otl files DO NOT
|
||
|
set 'filetype' within a Vim modeline; i.e., the set of 'filetype' to
|
||
|
otl.txtfmt should occur exclusively within the autocommand as shown above.
|
||
|
|
||
|
'Notes' nesting example: *txtfmt-nesting-notes-example*
|
||
|
|
||
|
Here is how you could use Txtfmt to format the ordinary text within files
|
||
|
created with 'Notes' (the lightweight notes management plugin written by Hari
|
||
|
Krishna Dara)...
|
||
|
|
||
|
In your .vimrc, set the g:notesFileType option as follows: >
|
||
|
let g:notesFileType = 'txtfmt'
|
||
|
|
||
|
This instructs the 'Notes' plugin to set 'filetype' to txtfmt for all notes
|
||
|
files it creates.
|
||
|
|
||
|
LOADING *txtfmt-loading*
|
||
|
|
||
|
Note: This section is provided for informational purposes only; the average
|
||
|
user can safely skip.
|
||
|
|
||
|
The Txtfmt plugin is actually several plugins working in concert: a syntax
|
||
|
plugin implementing token based highlighting, and a filetype plugin
|
||
|
facilitating working with the tokens. There are a significant number of
|
||
|
options permitting customization of various aspects of both plugins. Due to
|
||
|
the tightly integrated nature of the syntax and filetype plugins, most of the
|
||
|
options used to customize Txtfmt's behavior have implications for both
|
||
|
filetype and syntax plugins. Problems can result when the filetype and syntax
|
||
|
plugins see different values for the shared options. Since most Txtfmt options
|
||
|
are used only when the plugin is sourced, option values can get out of sync if
|
||
|
the filetype and syntax plugins are sourced at different times with
|
||
|
intervening option changes. The best protection against this is to have the
|
||
|
plugins loaded in the standard manner, via :setfiletype or assignment to
|
||
|
'filetype' option, as previously described.
|
||
|
|
||
|
Just as many of the options are common to both filetype and syntax plugins, so
|
||
|
is much of the option processing and attendant configuration code. It would be
|
||
|
highly inefficient (and dangerous from a maintainability standpoint) to
|
||
|
maintain large blocks of identical Vim script in two different script files.
|
||
|
Accordingly, I have segregated the option/configuration processing, which is
|
||
|
common to both filetype and syntax, and located it in a separate file, which
|
||
|
is intended to be installed in the user's plugin directory:
|
||
|
($VIM/plugin/txtfmt.vim). Very little of the script in this file is actually
|
||
|
executed at Vim startup. Most of it is executed only upon demand by either the
|
||
|
filetype or syntax plugin (whichever happens to be sourced first when Txtfmt
|
||
|
is loaded). When the common configuration script is executed, it processes the
|
||
|
various options (|txtfmt-modeline|, buffer-local and global), and saves the
|
||
|
resulting configuration to buffer-local variables, where it may be accessed by
|
||
|
both the filetype and syntax plugins.
|
||
|
|
||
|
Although the details will vary according to the user's setup, it generally
|
||
|
works something like this...
|
||
|
|
||
|
-FileType set to txtfmt
|
||
|
--Txtfmt syntax file is sourced
|
||
|
---Txtfmt syntax file invokes common configuration code in
|
||
|
$VIM/plugin/txtfmt.vim
|
||
|
--Txtfmt filetype plugin is sourced
|
||
|
|
||
|
==============================================================================
|
||
|
5. Configuration *txtfmt-configuration*
|
||
|
|
||
|
OPTIONS *txtfmt-options*
|
||
|
|
||
|
There are 3 ways for the Txtfmt user to set most Txtfmt options. The 3 methods
|
||
|
are listed below in order of highest to lowest priority.
|
||
|
|
||
|
1. in a Txtfmt modeline
|
||
|
2. with a buffer-local option variable
|
||
|
3. with a global option variable
|
||
|
|
||
|
Note: Some options do not support all 3 mechanisms. The help for a specific
|
||
|
option indicates which mechanisms may be used to set it.
|
||
|
|
||
|
Txtfmt will attempt to determine the value of an option from the highest
|
||
|
priority mechanism employed by the user.
|
||
|
Note: If the option value obtained in this manner is invalid, Txtfmt will not
|
||
|
consider lower-priority mechanisms. (In other words, the decision about which
|
||
|
user setting to use is made before the option value is validated.)
|
||
|
|
||
|
Although different strategies may be conceived by the Txtfmt user, the
|
||
|
intended use of the 3 mechanisms is as follows:
|
||
|
|
||
|
Txtfmt modelines
|
||
|
Used to associate options with a particular file
|
||
|
buffer-local
|
||
|
Used to set options automatically for a particular buffer or filetype.
|
||
|
Hint: Set buffer-local options in your local filetype.vim just before
|
||
|
calling :setfiletype
|
||
|
global
|
||
|
Used to set defaults for options not overridden by one of the
|
||
|
preceding 2 methods
|
||
|
|
||
|
Buffer-local and global option variables are set just like any other such
|
||
|
variables in Vim.
|
||
|
|
||
|
Examples: >
|
||
|
:let b:txtfmtEscape = 'bslash'
|
||
|
:let g:txtfmtNested = 1
|
||
|
|
||
|
For details on setting options via Txtfmt modelines, see |txtfmt-modeline|.
|
||
|
|
||
|
Option naming convention *txtfmt-opt-names*
|
||
|
|
||
|
Since the buffer-local and global Txtfmt options share a namespace with other
|
||
|
Vim global variables, the "txtfmt" prefix is prepended to these option names.
|
||
|
The option name itself is capitalized. Since a |txtfmt-modeline| is processed
|
||
|
only by Txtfmt, the "txtfmt" prefix is omitted from a |txtfmt-modeline| option
|
||
|
name. The modeline form of the option name is all lowercase, and just as with
|
||
|
Vim options, a short form of the option name is provided. In the option list
|
||
|
below, both the buflocal/global and modeline forms of each option are shown.
|
||
|
|
||
|
|
||
|
Option types *txtfmt-opt-types*
|
||
|
|
||
|
Txtfmt options fall into one of three categories:
|
||
|
|
||
|
1. String options
|
||
|
2. Number options
|
||
|
3. Boolean options
|
||
|
|
||
|
In most cases, the rhs of the assignment used to set the option's value is
|
||
|
identical for all set mechanisms (txtfmt modelines, buffer-local and global),
|
||
|
except of course that string options are not quoted in a Txtfmt modeline.
|
||
|
Boolean options are a special case, however. Setting and clearing boolean
|
||
|
options in a Txtfmt modeline is accomplished in the same manner as it is for a
|
||
|
Vim modeline: by including the bare option name in the modeline to turn the
|
||
|
option on, or by prepending "no" to the bare option name to turn it off.
|
||
|
|
||
|
Examples: >
|
||
|
" Txtfmt modeline that turns nesting ON
|
||
|
txtfmt:nested
|
||
|
" Txtfmt modeline that turns nesting OFF
|
||
|
txtfmt:nonested
|
||
|
|
||
|
Number format *txtfmt-opt-num-fmt*
|
||
|
|
||
|
Unless otherwise specified, a Txtfmt numeric option (represented with {number}
|
||
|
in this document) may be specified in either decimal or hexadecimal format:
|
||
|
e.g.
|
||
|
0, 1000, 0x8f, 0x1F1F
|
||
|
are all valid values for numeric options.
|
||
|
|
||
|
Txtfmt modelines *txtfmt-modeline*
|
||
|
|
||
|
Since a Txtfmt file should generally be viewed with the same set of options
|
||
|
that were in effect when it was created, Txtfmt provides a way to associate
|
||
|
certain option values with the file itself. Vim users should be familiar with
|
||
|
the concept of a modeline. Txtfmt extends this concept to a "Txtfmt-modeline",
|
||
|
which may be used to set various Txtfmt-specific options, described later. As
|
||
|
a general rule, an option that may be set from a Txtfmt-modeline may also be
|
||
|
set buffer-locally and/or globally, using the corresponding buffer-local or
|
||
|
global option variable.
|
||
|
Note: Txtfmt will search the first and last |txtfmtModelines| lines of a file
|
||
|
looking for a Txtfmt-modeline. All valid Txtfmt-modelines found will be used;
|
||
|
however, the search for valid modelines stops as soon as an invalid modeline
|
||
|
is encountered. (This is consistent with Vim's modeline processing.)
|
||
|
|
||
|
Format of a Txtfmt-modeline *txtfmt-modeline-fmt*
|
||
|
Txtfmt modelines are based upon the 1st Vim modeline format
|
||
|
[text]{white}txtfmt:[white]{options}
|
||
|
|
||
|
where {options} is a comma or whitespace separated list of Txtfmt
|
||
|
option settings. For a description of the various {options}, see
|
||
|
|txtfmt-opt-list|.
|
||
|
|
||
|
Note: Since Vim will not choke on a trailing ':' (probably because a
|
||
|
trailing ':' may be viewed as introducing an empty option field),
|
||
|
neither will I.
|
||
|
|
||
|
Examples: >
|
||
|
txtfmt:tokrange=180X:escape=bslash
|
||
|
txtfmt:rng=0xE000L esc=self nested
|
||
|
|
||
|
Refreshing display after option changes *txtfmt-opt-refresh*
|
||
|
|
||
|
As mentioned in the section on "Loading" (|txtfmt-loading|), option values are
|
||
|
generally taken into account only at the instant the plugin using them is
|
||
|
sourced. Thus, changes to one of the Txtfmt options discussed below will have
|
||
|
no immediate effect upon a Txtfmt buffer that has already been loaded. If you
|
||
|
have changed option settings and wish to have those changes applied to a
|
||
|
loaded Txtfmt buffer, you have a choice of three methods:
|
||
|
|
||
|
1) :e[dit]
|
||
|
This is probably the simplest method. It relies upon a buffer-local
|
||
|
BufReadPre autocmd, whose job is to ensure that all options will be
|
||
|
re-processed when the filetype/syntax plugins are reloaded in response to
|
||
|
the BufRead event.
|
||
|
|
||
|
*txtfmt-:Refresh*
|
||
|
2) :Refresh
|
||
|
:Refresh is a buffer-local command, which may be invoked from any loaded
|
||
|
Txtfmt buffer. For most practical purposes, this method yields the same
|
||
|
results as ":e[dit]", although the implementation is significantly
|
||
|
different (and more complex). In particular, :Refresh does not actually
|
||
|
re-edit the file, so the various BufRead autocommands will not be
|
||
|
triggered. It works via assignments to 'filetype' and/or 'syntax', as
|
||
|
appropriate.
|
||
|
|
||
|
3) :bd[elete] (followed by re-edit of the file)
|
||
|
This is arguably the safest method, since a :bdelete unlets all
|
||
|
buffer-local variables, thus wiping out all "memory" of any previous
|
||
|
Txtfmt plugin load for the current buffer. Of course, you shouldn't use
|
||
|
this method if you don't want to lose other (non-Txtfmt) buffer-local
|
||
|
variables.
|
||
|
|
||
|
|
||
|
Option List *txtfmt-opt-list*
|
||
|
|
||
|
The following is a comprehensive list of Txtfmt options. In the list below,
|
||
|
the option name as it would appear in a |txtfmt-modeline| is given within
|
||
|
single quotes (''). The variable name used for global or buffer-local
|
||
|
assignments is listed without the leading "g:" or "b:", but is accompanied by
|
||
|
a string such as "global" or "global or buffer-local" to indicate how it may
|
||
|
be set.
|
||
|
|
||
|
*txtfmtColor{}*
|
||
|
*txtfmtBgcolor{}*
|
||
|
txtfmtColor{1..8}
|
||
|
txtfmtBgcolor{1..8} old-style array of strings
|
||
|
(default: See |txtfmt-color-defaults|)
|
||
|
global or buffer-local
|
||
|
These old-style Vim "arrays" allow you to override the default colors
|
||
|
corresponding to the 8 foreground and 8 background color tokens. It is
|
||
|
possible to override none, some, or all of the colors. The
|
||
|
txtfmtBgcolor{} array may be used to configure background colors
|
||
|
differently from foreground colors. The txtfmtColor{} array applies
|
||
|
not only to foreground colors, but also to background colors for which
|
||
|
the corresponding entry in txtfmtBgcolor{} has not been defined.
|
||
|
Txtfmt considers each color index independently of all others; thus,
|
||
|
it is possible to set only those elements whose default color you wish
|
||
|
to override. Note that for a foreground color, "default" in this
|
||
|
context refers to the default color definition provided by the Txtfmt
|
||
|
plugin; for a background color, it could also refer to the default
|
||
|
provided by the txtfmtColor{} array. In other words, you can provide
|
||
|
overrides for both foreground and background colors in txtfmtColor{},
|
||
|
then use txtfmtBgcolor{} to override only the subset of background
|
||
|
colors you wish to differ from their corresponding foreground colors.
|
||
|
For details on the format of the strings, see |txtfmt-color-config|.
|
||
|
|
||
|
*txtfmt-'conceal'* *txtfmt-'cncl'* *txtfmtConceal*
|
||
|
'conceal' 'cncl'
|
||
|
txtfmtConceal boolean (default on when has('conceal') == 1)
|
||
|
global or buffer-local
|
||
|
*** New in version 2.0 ***
|
||
|
This option determines whether Txtfmt will attempt to use the
|
||
|
concealment capability provided either by the "conceal" feature (Vim
|
||
|
versions >= 7.3) or by Vince Negri's "conceal / ownsyntax" patch
|
||
|
(available for older versions of Vim). Note that this option is
|
||
|
ignored when has("conceal") returns 0.
|
||
|
Note: You can check to see whether your version of Vim supports the
|
||
|
"conceal" feature either by executing has('conceal'), or by searching
|
||
|
the output of :version for the applicable feature string:
|
||
|
+conceal (enabled)
|
||
|
-conceal (disabled)
|
||
|
|
||
|
The ideal Txtfmt token is zero-width, affecting the highlighting of
|
||
|
subsequent text without taking up any visible space in the Txtfmt
|
||
|
buffer. Such "zero-width" Txtfmt tokens are the default in versions of
|
||
|
Vim >= 7.3. In older versions of Vim, zero-width tokens were possible
|
||
|
only for users who built a custom version of Vim with Vince Negri's
|
||
|
"conceal / ownsyntax" patch. When the "conceal" feature is enabled,
|
||
|
Txtfmt will attempt to conceal completely all tokens not in the cursor
|
||
|
line. (Whether or not tokens in the cursor line are concealed depends
|
||
|
upon the |txtfmt-'concealcursor'| option setting.)
|
||
|
|
||
|
When the "conceal" feature is disabled (either by this option or by
|
||
|
lack of support in Vim), Txtfmt attempts to conceal the special
|
||
|
formatting tokens by making each appear as a single space character,
|
||
|
each of which consumes a single column of screen width. Although this
|
||
|
is typically not an issue when the tokens can be placed at the end of
|
||
|
a line or on a line by themselves, it can be a source of annoyance in
|
||
|
certain scenarios. Consider, for example, the case in which you want
|
||
|
to highlight a single word in red bold. You would need to insert both
|
||
|
a red fg color and a bold format token prior to the word, and both the
|
||
|
'no format' and 'no fg color' tokens immediately after the word. Since
|
||
|
each token appears as a single space, the highlighted word will appear
|
||
|
to be surrounded by more whitespace than usual. This becomes even more
|
||
|
of an issue in the unlikely event you wish to highlight only part of a
|
||
|
particular word. For this reason, Txtfmt will always use the "conceal"
|
||
|
feature whenever it is available.
|
||
|
|
||
|
*txtfmt-conceal-notes* *txtfmt-conceal-history*
|
||
|
*txtfmt-conceal-backwards-compatibility*
|
||
|
Prior to Vim 7.3, the default setting of the |txtfmt-'conceal'| option
|
||
|
was "off", even when has("conceal") indicated that the feature was
|
||
|
enabled in Vim (i.e., because the user had applied Vince Negri's
|
||
|
"conceal" patch). This design choice was made, in spite of the fact
|
||
|
that use of the "conceal" feature is optimal, primarily for reasons of
|
||
|
backwards-compatibility. In particular, as annoying as non-zero-width
|
||
|
tokens might be, many users were sure to have created files that
|
||
|
relied upon the tokens' width to achieve proper indenting. A 4 space
|
||
|
leading indent, for instance, might have been realized with a bold
|
||
|
format token followed by 3 spaces. Suddenly concealing the bold format
|
||
|
token would break the alignment.
|
||
|
|
||
|
Although this rationale is still valid, it is no longer sufficient (in
|
||
|
my judgment) to justify disabling the "conceal" feature by default,
|
||
|
now that the feature has been incorporated into Vim itself. First-time
|
||
|
Txtfmt users who begin using the plugin with Vim 7.3 will naturally
|
||
|
expect the plugin to take advantage of the "conceal" feature without
|
||
|
any explicit action on their part. Such users might not even be aware
|
||
|
of the existence of this option. Presenting Txtfmt in a sub-optimal
|
||
|
light (i.e., without "conceal" functionality) would increase the
|
||
|
probability that such users would abandon use of the plugin before
|
||
|
becoming sufficiently familiar with its documentation to learn that
|
||
|
they had the power to enable the "conceal" feature with a simple
|
||
|
option setting.
|
||
|
|
||
|
*txtfmt-viewing-old-files-without-conceal*
|
||
|
If you have legacy files that are best viewed without the "conceal"
|
||
|
feature, but you're using a version of Vim with compiled-in support
|
||
|
for "conceal", you may wish to view the old files with "noconceal",
|
||
|
and view all newly-created Txtfmt files with "conceal". This is easily
|
||
|
accomplished as follows...
|
||
|
|
||
|
1. Set txtfmtConceal true globally, either by leaving the option at
|
||
|
its default, or setting it explicitly in your vimrc. E.g.,
|
||
|
let g:txtfmtConceal = 1
|
||
|
|
||
|
2. Use Txtfmt modelines in your old files to disable the "conceal"
|
||
|
feature for those files only. E.g.,
|
||
|
txtfmt:noconceal
|
||
|
|
||
|
Note: If you have many old files, you might wish to automate the
|
||
|
addition of the modelines with a simple sed or awk script: E.g.,
|
||
|
|
||
|
find . -iname '*.txtfmt' | xargs sed -i -e '$a\' -e 'txtfmt:noconceal'
|
||
|
|
||
|
Explanation: Adds a Txtfmt-modeline disabling "conceal" on the last
|
||
|
line of all .txtfmt files recursively under the current directory.
|
||
|
Note: Txtfmt will process up to |txtfmtModelines| modelines at the
|
||
|
beginning or end of a file; thus, the command above simply adds a new
|
||
|
modeline without bothering to check for an existing one.
|
||
|
|
||
|
Of course, the strategy outlined above is merely a suggestion. You can
|
||
|
use a combination of Txtfmt modeline and buffer-local / global option
|
||
|
settings to achieve whatever behavior you desire.
|
||
|
|
||
|
*txtfmt-'concealcursor'* *txtfmt-'cocu'* *txtfmtConcealcursor*
|
||
|
'concealcursor' 'cocu'
|
||
|
txtfmtConcealcursor string (default: "nvic")
|
||
|
global or buffer-local
|
||
|
*** New in version 2.4 ***
|
||
|
Important Note: The default value of this option may change in a
|
||
|
future version of Txtfmt. If you care about its value, you should set
|
||
|
it explicitly.
|
||
|
|
||
|
Note: This option is ignored when the "conceal" feature is disabled
|
||
|
(via the |txtfmt-'conceal'| option) or is not supported by the running
|
||
|
Vim instance.
|
||
|
|
||
|
This option determines whether Txtfmt tokens in the line containing
|
||
|
the cursor are concealed. Its value is a string of single character
|
||
|
flags indicating the modes for which tokens in the cursor line should
|
||
|
be concealed. The flags are defined as follows in the Vim help:
|
||
|
|
||
|
n Normal mode
|
||
|
v Visual mode
|
||
|
i Insert mode
|
||
|
c Command line editing, for 'incsearch'
|
||
|
|
||
|
For detailed descriptions, see Vim help on 'concealcursor'...
|
||
|
|
||
|
Note: Some new users might be disconcerted by the fact that with the
|
||
|
default setting of this option, the tokens disappear as soon as they
|
||
|
are entered. (After all, he might wish to delete them at some point.)
|
||
|
This will not be a concern at all once visual maps (targeted for next
|
||
|
release) have been added. These maps will automate addition/removal of
|
||
|
tokens completely, such that the user needn't even be aware of the
|
||
|
tokens' existence. In the meantime, however, the best way to locate
|
||
|
existing tokens does not require you to see them: it involves use of
|
||
|
the |txtfmt-jump-to-tok| maps, which facilitate locating Txtfmt tokens
|
||
|
by their types; additionally, the |\ga| map (|txtfmt-get-tok-info|)
|
||
|
may be used to learn the nature of the token under the cursor, even
|
||
|
when the token is completely concealed (i.e., occupying zero width).
|
||
|
|
||
|
*txtfmt-'escape'* *txtfmt-'esc'* *txtfmtEscape*
|
||
|
'escape' 'esc'
|
||
|
txtfmtEscape string (default: "none")
|
||
|
global or buffer-local
|
||
|
This option determines how (if at all) the special format/color tokens
|
||
|
may be escaped in a Txtfmt buffer. Escaping would be necessary only in
|
||
|
the unlikely event that you needed to use the special tokens in a file
|
||
|
for a non-Txtfmt purpose. Hopefully, you have chosen a value for
|
||
|
|txtfmt-'tokrange'| that renders this unnecessary. If so, it is safe
|
||
|
to leave this option at its default value: "none". The following
|
||
|
values are possible:
|
||
|
bslash Escape a format/color token with backslash ('\')
|
||
|
self Escape a format/color token with itself (i.e., by
|
||
|
doubling the special chars)
|
||
|
none No escaping of format/color tokens
|
||
|
Note: Escaping characters themselves may be escaped, but only when
|
||
|
they appear in an unbroken sequence immediately preceding a Txtfmt
|
||
|
token. Examples for both the "bslash" and "self" cases are shown
|
||
|
below...
|
||
|
|
||
|
--bslash--
|
||
|
\<fb> Escaped bold format token
|
||
|
\\<fb> Backslash followed by bold format token
|
||
|
\\\<fb> Backslash followed by escaped bold format token
|
||
|
--self--
|
||
|
<fb><fb> Escaped bold format token
|
||
|
<fb><fb><fb> Escaped bold format token followed by bold format token
|
||
|
<fb><fb><fb><fb> Escaped bold format token followed by escaped bold
|
||
|
format token
|
||
|
Note: When a Txtfmt token is escaped, the escaping character will be
|
||
|
hidden, and the escaped character should be highlighted just like the
|
||
|
surrounding text.
|
||
|
|
||
|
*txtfmt-'fgcolormask'* *txtfmt-'fcm'* *txtfmtFgcolormask*
|
||
|
*txtfmt-'bgcolormask'* *txtfmt-'bcm'* *txtfmtBgcolormask*
|
||
|
'fgcolormask' 'fcm'
|
||
|
txtfmtFgcolormask string (default: "11111111")
|
||
|
global or buffer-local
|
||
|
*** New in version 2.0 ***
|
||
|
'bgcolormask' 'bcm'
|
||
|
txtfmtBgcolormask string (default: "01101000")
|
||
|
global or buffer-local
|
||
|
*** New in version 2.0 ***
|
||
|
|
||
|
These options permit you to deactivate colors you do not wish to view
|
||
|
in your Txtfmt buffer. Typically, colors are deactivated for
|
||
|
performance reasons. (See |txtfmt-performance-considerations|.) Each
|
||
|
option is a string containing exactly 8 characters. Each of the 8
|
||
|
characters corresponds to one of the 8 possible colors in the
|
||
|
corresponding color definition array. (For information on color
|
||
|
definition arrays, see help on |txtfmtColor{}|.) The first character
|
||
|
in the string corresponds to the first element in the color array. The
|
||
|
meaning of the mask characters is as follows:
|
||
|
"1" activates the color
|
||
|
"0" deactivates the color
|
||
|
|
||
|
Consider the bgcolormask default as an example: 01101000
|
||
|
This mask enables the colors corresponding to indices 2, 3 and 5 in
|
||
|
the background color definition array. In the default color definition
|
||
|
arrays, these indices correspond to blue, green and red, respectively.
|
||
|
For performance reasons, I enable only these 3 most commonly used
|
||
|
background colors by default. Feel free to enable an entirely
|
||
|
different set of colors if you like. For backward-compatibility
|
||
|
reasons, the default fgcolormask enables all foreground colors.
|
||
|
However, if you notice there are foreground colors that you never use,
|
||
|
you can deactivate them to speed up the syntax redrawing.
|
||
|
|
||
|
Note: Deactivating a color does not alter a Txtfmt buffer in any way.
|
||
|
The character code corresponding to the deactivated color continues to
|
||
|
be reserved within the Txtfmt token range; it simply has no effect on
|
||
|
highlighting.
|
||
|
|
||
|
*txtfmtJumptoinactive*
|
||
|
txtfmtJumptoinactive boolean (default off)
|
||
|
global or buffer-local
|
||
|
This option determines whether the |txtfmt-jump-to-tok| maps will
|
||
|
treat an inactive (masked) fg or bg color token as the target of a
|
||
|
jump. By default, only tokens that affect the highlighting of the
|
||
|
Txtfmt buffer will be considered as potential jump targets.
|
||
|
Note: Currently, this option may be set at any time; i.e., a change
|
||
|
will take effect even after the plugin has loaded. This behavior is
|
||
|
subject to change.
|
||
|
|
||
|
*txtfmtMapwarn*
|
||
|
txtfmtMapwarn string (default: "mMoOcC")
|
||
|
global
|
||
|
This option determines what the Txtfmt filetype plugin does when one
|
||
|
of its default 1st level maps is either ambiguous or conflicting with
|
||
|
an existing map. For an explanation of 1st and 2nd level maps, see
|
||
|
|txtfmt-map-config|. For a description of the character flags
|
||
|
comprising the option value, see |txtfmt-map-conflict|.
|
||
|
|
||
|
*txtfmtModelines*
|
||
|
txtfmtModelines number (default: 5)
|
||
|
global or buffer-local
|
||
|
This option is analogous to Vim's 'modelines' option. It determines
|
||
|
how many (if any) lines at the beginning and end of a file will be
|
||
|
searched for a |txtfmt-modeline|. For (hopefully) obvious reasons, it
|
||
|
cannot be set from a txtfmt-modeline.
|
||
|
|
||
|
*txtfmt-'nested'* *txtfmt-'nst'* *txtfmtNested*
|
||
|
'nested' 'nst'
|
||
|
txtfmtNested boolean (default on)
|
||
|
global or buffer-local
|
||
|
This option determines whether Txtfmt regions can be nested within
|
||
|
non-txtfmt regions. If you are not sure what this means, see
|
||
|
|txtfmt-nesting|.
|
||
|
|
||
|
*txtfmt-'pack'* *txtfmt-'pck'* *txtfmtPack*
|
||
|
'pack' 'pck'
|
||
|
txtfmtPack boolean (default on)
|
||
|
global or buffer-local
|
||
|
*** New in version 2.0 ***
|
||
|
This option determines the offset within the Txtfmt token range where
|
||
|
the background color tokens are located. By default, the background
|
||
|
color tokens are "packed" up against the end of the format token
|
||
|
range. In other words, space within the range is not reserved for the
|
||
|
inactive "long" format tokens. Currently, there is little reason to
|
||
|
reserve space for inactive "long" format tokens: you cannot have both
|
||
|
"long" formats and background colors in the same buffer. Moreover,
|
||
|
there are backward-compatibility concerns that dictate the packing of
|
||
|
background color tokens. There are, however, several reasons you might
|
||
|
wish to leave space for "long" format tokens, even if you're not
|
||
|
currently using them. It is recommended that you read the following
|
||
|
section for details: |txtfmt-upgrading-to-extended-long-formats|
|
||
|
|
||
|
Note: This option is meaningful only if the tokrange suffix is 'X'
|
||
|
(extended).
|
||
|
|
||
|
*txtfmt-'sync'* *txtfmtSync*
|
||
|
'sync'
|
||
|
txtfmtSync string or number (default: 250)
|
||
|
global or buffer-local
|
||
|
This option determines the method used to perform syntax
|
||
|
synchronization on a Txtfmt buffer. (For an overview of syntax
|
||
|
synchronization, see |:syn-sync|.)
|
||
|
|
||
|
Possible values:
|
||
|
fromstart Syncing always starts at the beginning of the Txtfmt
|
||
|
buffer. This is the most accurate, but least efficient
|
||
|
method.
|
||
|
none Syncing is not performed at all. This method is
|
||
|
extremely fast, but may produce incorrect highlighting
|
||
|
for Txtfmt regions that begin prior to the first
|
||
|
visible screen line.
|
||
|
{number} Works as though a "minlines={number}" argument has
|
||
|
been supplied to Vim's |:syn-sync| command.
|
||
|
(See |:syn-sync-minlines|for more information.)
|
||
|
|
||
|
Set examples: >
|
||
|
let g:txtfmtSync = "fromstart"
|
||
|
let g:txtfmtSync = 500
|
||
|
|
||
|
" In a modeline...
|
||
|
txtfmt:sync=none
|
||
|
txtfmt:sync=100
|
||
|
<
|
||
|
|
||
|
*txtfmt-'tokrange'* *txtfmt-'rng'* *txtfmtTokrange*
|
||
|
*txtfmt-starttok* *txtfmt-formats*
|
||
|
'tokrange' 'rng'
|
||
|
txtfmtTokrange string or Vim expression evaluating to string
|
||
|
(default:
|
||
|
1 byte encoding: "180X"
|
||
|
2 byte encoding: "180X"
|
||
|
unicode: "0xE000X")
|
||
|
format: {number}[{formats}]
|
||
|
global or buffer-local
|
||
|
This option allows the user to specify both the location of the range
|
||
|
of characters dedicated to Txtfmt and the types of highlighting
|
||
|
regions that may be created: {number} specifies the character code of
|
||
|
the first character in the range; {formats}, if specified, is a single
|
||
|
letter indicating the types of regions supported. The following values
|
||
|
are supported:
|
||
|
'S' ("short" formats)
|
||
|
'L' ("long" formats)
|
||
|
'X' ("extended")
|
||
|
All 3 modes suppport up to 8 foreground colors. Short format mode
|
||
|
supports only the bold, underline and italic format attributes,
|
||
|
whereas long formats adds to this basic set the standout and reverse
|
||
|
(inverse) attributes, and if the version of Vim in use supports it,
|
||
|
the undercurl attribute. Extended mode is equivalent to short formats
|
||
|
with the addition of up to 8 background colors. Note that for
|
||
|
performance reasons, you are currently not permitted to enable both
|
||
|
long formats and background colors. If you wish to know why (and
|
||
|
whether this restriction will ever be lifted), see
|
||
|
|txtfmt-upgrading-to-extended-long-formats|.
|
||
|
|
||
|
The table below provides a convenient illustration of the effect each
|
||
|
{formats} value has on the set of supported highlight attributes.
|
||
|
|
||
|
{--{formats}--}
|
||
|
+-------------------------------+
|
||
|
| S L X |
|
||
|
+-------------------------------+
|
||
|
|underline Y Y Y |
|
||
|
|bold Y Y Y |
|
||
|
|italic Y Y Y |
|
||
|
|standout - Y - |
|
||
|
|reverse* - Y - |
|
||
|
|undercurl - Y* - |
|
||
|
+-------------------------------+
|
||
|
|fg_clrs <=8 <=8 <=8 |
|
||
|
|bg_clrs - - <=8* |
|
||
|
+-------------------------------+
|
||
|
|
||
|
*Note: "Reverse" is another name for "inverse".
|
||
|
*Note: Versions of Vim prior to 7.0 did not support the undercurl
|
||
|
attribute; thus, Txtfmt will automatically disable undercurl if it
|
||
|
detects a Vim version < 7.0.
|
||
|
*Note: By default, only 3 background colors are enabled. You may
|
||
|
enable more with the |txtfmt-'bgcolormask'| option.
|
||
|
|
||
|
If you omit the optional {formats} suffix, Txtfmt assumes the default
|
||
|
of 'X'. The suffixes are all case-insensitive.
|
||
|
|
||
|
*txtfmt-'tokrange'-expr*
|
||
|
Note: If the option string is not a valid 'tokrange' string, Txtfmt
|
||
|
will attempt to evaluate the option string as a Vim expression. If
|
||
|
this evaluation produces a valid 'tokrange' value, Txtfmt will use it;
|
||
|
otherwise, Txtfmt will display error and use a default setting. This
|
||
|
feature permits you to defer the choice of 'tokrange' until a
|
||
|
particular file is being loaded. (Alternatively, you could defer
|
||
|
choosing 'tokrange' by performing buf-local sets within autocommands
|
||
|
or by using a |txtfmt-modeline|.) >
|
||
|
Example:
|
||
|
let g:txtfmtTokrange = 'MyTokrangeChooser()'
|
||
|
let g:txtfmtTokrange = '&enc == "utf-8" ? "0xE000X" : "180X"'
|
||
|
<
|
||
|
|
||
|
If you do not specify this option, either in a |txtfmt-modeline| or
|
||
|
via the txtfmtTokrange option variable, Txtfmt will attempt to choose
|
||
|
a suitable default. However, you should probably not let Txtfmt choose
|
||
|
a default for an option as important as this one. It is recommended
|
||
|
that you read |txtfmt-choosing-token-range| before setting this
|
||
|
option. Moreover, it is recommended that you use the :MakeTestPage
|
||
|
command to test whatever setting you ultimately choose. (See
|
||
|
|txtfmt-:MakeTestPage|.)
|
||
|
|
||
|
*txtfmt-'undercurl'* *txtfmt-'uc'* *txtfmtUndercurl*
|
||
|
'undercurl' 'uc'
|
||
|
txtfmtUndercurl boolean (default on if running Vim supports undercurl)
|
||
|
global or buffer-local
|
||
|
*** New in version 2.0 ***
|
||
|
Txtfmt disables use of the undercurl attribute automatically for
|
||
|
versions of Vim that don't support it (i.e., Vim versions older than
|
||
|
7.0). Turning this option off prevents the creation of undercurl
|
||
|
regions, even when the running version of Vim does support it. You
|
||
|
might wish to do this for performance reasons if you use "long"
|
||
|
formats but rarely if ever use undercurl. Disabling undercurl cuts the
|
||
|
number of format tokens in the Txtfmt token range in half. Of course,
|
||
|
the token reduction is not as significant as the associated runtime
|
||
|
performance improvement, especially if you're using Unicode, in which
|
||
|
character codes are plentiful. For a more detailed look at performance
|
||
|
considerations, read |txtfmt-performance-considerations|.
|
||
|
|
||
|
As is the case with color masks, setting or clearing this option does
|
||
|
not alter a Txtfmt buffer in any way; it merely alters its syntax
|
||
|
highlighting. Thus, there is nothing to prevent you from disabling
|
||
|
undercurl until you find you have need of it. Suppose, for example,
|
||
|
you have recently upgraded to the current version of Vim from a
|
||
|
pre-7.0 version (i.e., one that doesn't support undercurl). Suppose
|
||
|
further that you've been managing without undercurl, and you're not
|
||
|
sure you really need it. You could put a line such as... >
|
||
|
let g:txtfmtUndercurl = 0
|
||
|
<
|
||
|
...in your vimrc to disable undercurl globally until you decide you're
|
||
|
ready to use it. Alternatively, you may decide you want to use
|
||
|
undercurl right away, but you have a number of legacy files, created
|
||
|
under the old version of Vim, which do not have undercurl regions and
|
||
|
probably never will. To avoid paying a performance penalty when
|
||
|
viewing these legacy files, you could add the following Txtfmt
|
||
|
modeline to the legacy files: >
|
||
|
txtfmt:nouc
|
||
|
<
|
||
|
Caveat: For backward-compatibility reasons, disabled undercurl tokens
|
||
|
are not considered to be part of the Txtfmt token range in the same
|
||
|
way that disabled color tokens are. This fact has implications for the
|
||
|
|txtfmt-:MoveStartTok| command, which will not attempt to translate
|
||
|
characters corresponding to disabled undercurl tokens. Another
|
||
|
implication of this fact is that you will not be warned if you choose
|
||
|
a |txtfmt-'tokrange'| setting that does not leave room for undercurl
|
||
|
tokens at the end of the range. Of course, this is not really an
|
||
|
issue, since if you did eventually decide to enable undercurl in such
|
||
|
a case, you could simply run the :MoveStartTok command to translate
|
||
|
the entire token range leftward, thereby making room for the undercurl
|
||
|
tokens.
|
||
|
|
||
|
*txtfmtUsermap{}*
|
||
|
txtfmtUsermap{} old-style array of strings
|
||
|
(default: none)
|
||
|
global or buffer-local
|
||
|
This old-style Vim "array" allows you to build your own complex
|
||
|
mappings from Txtfmt primitives, by using a powerful mechanism known
|
||
|
as "Txtfmt user-maps". The user-map mechanism is described in detail
|
||
|
in section |txtfmt-user-maps|.
|
||
|
Note: First element of the array is at index 1.
|
||
|
|
||
|
*txtfmtUsermaplimit*
|
||
|
txtfmtUsermaplimit number (default: 25)
|
||
|
global or buffer-local
|
||
|
Defines the number of elements of txtfmtUsermap{} (described above)
|
||
|
that will be tested for valid user-map definitions.
|
||
|
|
||
|
CHOOSING A TOKEN RANGE *txtfmt-choosing-token-range*
|
||
|
|
||
|
*txtfmt-encoding*
|
||
|
Before choosing a value for the |txtfmt-'tokrange'| option, you should
|
||
|
consider what character encoding you will be using. Because of the sheer
|
||
|
number of available character codes, utf-8 is perhaps the ideal encoding for
|
||
|
use with Txtfmt.
|
||
|
|
||
|
*'short'/'long'-formats*
|
||
|
The number of character codes that must be dedicated to Txtfmt usage depends
|
||
|
upon the setting of txtfmt-'tokrange'. The number of tokens required for
|
||
|
format attributes is given by 2^N, where "N" is the number of format
|
||
|
attributes (e.g., bold, underline, etc...). As mentioned in the help for the
|
||
|
|txtfmt-'tokrange'| option, N will be 3 if "short" or "extended" formats are
|
||
|
selected and either 5 or 6 if "long" formats are used. All tokrange settings
|
||
|
require exactly 9 tokens to be reserved for foreground colors. If background
|
||
|
colors have been enabled ("extended" formats), an additional 9 tokens are
|
||
|
reserved. The following table illustrates the character range requirements
|
||
|
graphically.
|
||
|
Note: The undercurl column indicates whether the undercurl attribute is
|
||
|
active. It will be "on" if the version of the running Vim is >= 7.0 AND
|
||
|
undercurl has not been explicitly disabled via the |txtfmt-'undercurl'|
|
||
|
option.
|
||
|
|
||
|
+--------+-----------+------------+
|
||
|
| suffix | undercurl | num tokens |
|
||
|
+--------+-----------+------------+
|
||
|
| S | NA | 17 |
|
||
|
| X | NA | 26 |
|
||
|
| L | off | 41 |
|
||
|
| L | on | 73 |
|
||
|
+--------+-----------+------------+
|
||
|
|
||
|
|
||
|
When I wrote the initial version of the Txtfmt plugin, only the "short" format
|
||
|
attributes (bold, underline and italic) were supported. Accordingly, only 17
|
||
|
tokens needed to be dedicated to Txtfmt usage. At that time, I assumed that
|
||
|
only ASCII characters would be used for text. (The initial version of Txtfmt
|
||
|
was actually called "ascfmt"!) Since that time, my mindset has grown a bit
|
||
|
more global, and I now envision Txtfmt usage with a wide variety of character
|
||
|
encodings. If Txtfmt is configured for use with all possible format attributes
|
||
|
(bold, underline, italic, standout, reverse and undercurl), the Txtfmt token
|
||
|
requirement jumps to 73. Although it is possible for many English speakers
|
||
|
using a "latin1" encoding to forego the use of 73 character codes in the range
|
||
|
128-255, Europeans may find this restriction unacceptable, given the presence
|
||
|
of a number of accented characters in that range. If you're using a multibyte
|
||
|
character set such as Unicode, you should have no difficulty finding an unused
|
||
|
sequence of 73 characters to dedicate to Txtfmt. (Hint: see
|
||
|
|txtfmt-private-use-area| below.)
|
||
|
|
||
|
*txtfmt-performance-considerations*
|
||
|
The number of character codes dedicated to Txtfmt usage is not the only factor
|
||
|
you should consider when choosing a |txtfmt-'tokrange'| setting. The tokrange
|
||
|
setting also determines the number of syntax regions Txtfmt must define in
|
||
|
order to accomplish the desired highlighting. The number of syntax regions, in
|
||
|
turn, directly affects the speed with which Vim can load and redraw a Txtfmt
|
||
|
buffer. Consider, as an example, the choice between "short" and "long"
|
||
|
formats. Although it supports only 3 additional format attributes, the "long"
|
||
|
formats configuration requires roughly 10 times as many syntax regions as
|
||
|
"short" formats! This increase in the number of syntax regions engenders a
|
||
|
significant increase in CPU overhead consumed by syntax highlighting, even
|
||
|
when the additional format attributes are not used, since Vim must spend time
|
||
|
checking the unused region definitions. On some systems, the performance
|
||
|
penalty is large enough to render display of "long" formats noticeably
|
||
|
sluggish.
|
||
|
|
||
|
With the addition of "extended" formats (i.e., background colors) in Txtfmt
|
||
|
version 2.0, performance considerations have become even more significant. The
|
||
|
addition of 8 background colors to the "short" formats baseline results in a
|
||
|
thirty-fold increase in the number of syntax regions! (Hint: The dramatic
|
||
|
increase is due to the "orthogonality" of the various types of regions.)
|
||
|
Fortunately, Txtfmt allows you to reduce the number of syntax regions
|
||
|
considerably (thereby increasing load/redraw speed) by "de-activating" unused
|
||
|
colors. Consider that the typical user may never use more than 3 or 4 colors
|
||
|
in his Txtfmt buffers. If Txtfmt knows in advance which colors are used, it
|
||
|
can avoid defining syntax regions for the unused ones. Note that the tokens
|
||
|
corresponding to these inactive colors will still be reserved by Txtfmt, since
|
||
|
if the token range were "collapsed" on top of unused color tokens, it would be
|
||
|
impossible (or at least difficult) to re-activate the colors later when, for
|
||
|
example, the user got a faster computer and decided he might occasionally use
|
||
|
the extra colors.
|
||
|
|
||
|
Txtfmt provides the following 2 "color mask" options to permit you to
|
||
|
enable foreground and background colors independently:
|
||
|
|txtfmt-'fgcolormask'|
|
||
|
|txtfmt-'bgcolormask'|
|
||
|
If you don't define these options, Txtfmt will enable all 8 foreground colors,
|
||
|
and the 3 background colors corresponding to red, green and blue in the
|
||
|
default color configuration.
|
||
|
|
||
|
*txtfmt-syn-rgn-count-table*
|
||
|
The following table is intended to aid you in choosing your
|
||
|
|txtfmt-'tokrange'| suffix and fg/bg color masks, by showing the number of
|
||
|
syntax regions required for various configurations and numbers of active fg/bg
|
||
|
colors. The list is intended to be representative, not exhaustive.
|
||
|
Note: To facilitate comparison, the table rows are presented in order of
|
||
|
increasing syntax region counts.
|
||
|
|
||
|
+--------+-----------+-----------+------------+
|
||
|
| suffix | # fg clrs | # bg clrs | # syn rgns |
|
||
|
+--------+-----------+-----------+------------+
|
||
|
| S | 8 | NA | 142 |
|
||
|
| L* | 8 | NA | 574 | * no undercurl
|
||
|
| L | 4 | NA | 638 |
|
||
|
| X | 5 | 2 | 684 |
|
||
|
| X | 4 | 4 | 990 |
|
||
|
| L | 8 | NA | 1150 |
|
||
|
| X | 8 | 3 | 1448 |
|
||
|
| X | 8 | 4 | 1846 |
|
||
|
| X | 6 | 6 | 2030 |
|
||
|
| X | 8 | 8 | 3438 |
|
||
|
+--------+-----------+-----------+------------+
|
||
|
|
||
|
*txtfmt-upgrading-tokrange*
|
||
|
If you don't currently need background colors or "long" formats and thus are
|
||
|
considering the use of "short" formats because of the reduced token
|
||
|
requirement, but suspect that you may eventually want to use either "long"
|
||
|
format attributes or background colors, it may be reassuring to know that the
|
||
|
implementation has been designed to permit a seamless "upgrade" from "short"
|
||
|
to "long" or "extended" formats.
|
||
|
|
||
|
As an example, consider a Txtfmt file with the following |txtfmt-modeline|: >
|
||
|
txtfmt:tokrange=180S
|
||
|
|
||
|
This file will use tokens in the range 180-196 to support 8 colors as well as
|
||
|
all combinations of bold, underline and italic attributes. If you decide at
|
||
|
some point that you would like to begin using standout, reverse and undercurl
|
||
|
attributes in this file, simply change the modeline to the following: >
|
||
|
txtfmt:tokrange=180L
|
||
|
|
||
|
The original (bold, underline and italic) regions will be unaffected, but you
|
||
|
will now be able to create regions with all 63 combinations of format
|
||
|
attributes. The cost is an extra 56 character codes that will be unavailable
|
||
|
for normal text usage. The expanded range of characters used by Txtfmt is now
|
||
|
180-252.
|
||
|
|
||
|
Alternatively, if you were content with bold, underline and italic format
|
||
|
attributes, but wished to add background colors to your buffer, you could have
|
||
|
upgraded from "short" to "extended" with the following modeline: >
|
||
|
txtfmt:tokrange=180X
|
||
|
<
|
||
|
|
||
|
*txtfmt-upgrading-to-extended-long-formats*
|
||
|
*txtfmtAllowxl*
|
||
|
It should be pointed out that the default location for background color tokens
|
||
|
is just past the end of the "short" format tokens. Note that this is precisely
|
||
|
where the "long" format tokens would be located. Ideally, since the format
|
||
|
token range is the only variable-length range, the background color tokens
|
||
|
would have been located before it. Such a strategy would have permitted the
|
||
|
user to switch freely back and forth between "extended" and "long" formats
|
||
|
without the need to move or delete any existing background color tokens.
|
||
|
Unfortunately, for reasons of backward-compatibility, the background color
|
||
|
tokens had to go after all other tokens. The reason is that earlier versions
|
||
|
of Txtfmt, which didn't support background colors at all, used a default for
|
||
|
tokrange that puts the first token at the very beginning of Unicode's Private
|
||
|
Use Area. Locating background color tokens at the head of the token range,
|
||
|
therefore, would require users to translate the tokens at least 9 characters
|
||
|
rightward in their existing files if they wished to use background colors.
|
||
|
This was out of the question, as one of my design goals for version 2.0 was to
|
||
|
ensure that a user who wished to add background colors to a buffer created
|
||
|
with an older version of Txtfmt would be able to do so simply, i.e., without
|
||
|
the need for special upgrade steps.
|
||
|
|
||
|
The fact that background color and "long" format tokens occupy overlapping
|
||
|
ranges means that, by default, you can't have both background colors and long
|
||
|
formats active in the same buffer. Of course, it would have been possible to
|
||
|
locate the background color tokens after the long token range, leaving the
|
||
|
long tokens reserved but unused when only "short" formats are active. Although
|
||
|
this strategy would support simultaneously active long formats and background
|
||
|
colors, it would have broken backward compatibility. The reason is that the
|
||
|
default tokrange for the latin1 encoding is such that there is not enough room
|
||
|
after the final long format token for the range of background color tokens.
|
||
|
Thus, users with existing files that use the default tokrange would be
|
||
|
required to translate their entire token range at least 9 characters leftward
|
||
|
prior to enabling background colors. In light of the previously stated design
|
||
|
goals, this was unacceptable. Thus, by default, the background color tokens
|
||
|
are "packed" in just after the short format tokens. It is possible, however,
|
||
|
to override this default behavior by clearing the |txtfmt-'pack'| option. When
|
||
|
this option is turned off, the background color tokens will be located after
|
||
|
the range reserved for long format tokens, even when the configuration is such
|
||
|
that long formats are disabled.
|
||
|
|
||
|
Why would you ever wish to clear the |txtfmt-'pack'| option? Well, there are
|
||
|
two possible motivations:
|
||
|
1. You're not initially sure whether you would prefer to have background
|
||
|
colors or long formats.
|
||
|
Example scenario: You're currently using "extended" formats, but you've
|
||
|
done a lot of editing and have inserted only a handful of background
|
||
|
colors. Moreover, you've found yourself wishing more than once for the
|
||
|
undercurl attribute. At this point, you could simply change the tokrange
|
||
|
suffix from 'X' to 'L' and begin using undercurl. If |txtfmt-'pack'| had
|
||
|
been set when you added the background color tokens, those tokens would now
|
||
|
be interpreted as long format tokens, thereby introducing unwanted format
|
||
|
regions. Since |txtfmt-'pack'| was clear, however, they are located
|
||
|
harmlessly beyond the end of the Txtfmt token range, and will therefore
|
||
|
have no effect.
|
||
|
2. You know that one day Txtfmt will support the 'XL' (extended long) tokrange
|
||
|
suffix, and you want to create files that will be able to transition
|
||
|
seamlessly from 'X' or 'L' to 'XL'.
|
||
|
Note: Unofficially, Txtfmt already does support the 'XL' suffix, but it is
|
||
|
currently disabled for performance reasons. If you're wondering why, you
|
||
|
may be interested to know that the 'XL' suffix requires 28633 syntax
|
||
|
regions!!! On my machine, Vim crashes if I attempt to use 'XL' formats with
|
||
|
all foreground and background colors enabled! I can get it to load without
|
||
|
crashing by de-activating several colors, but even then, syntax definitions
|
||
|
are sometimes silently corrupted, apparently because Vim has run out of
|
||
|
memory for storing them. For this reason, I do not advertise support for
|
||
|
'XL', and in fact it is disallowed by default. However, if you set the
|
||
|
global |txtfmtAllowxl| option to a nonzero value before attempting to load
|
||
|
Txtfmt, you will be able to set suffix to 'XL'. (If you do, you may wish to
|
||
|
go make a pot of coffee while you wait for the file to load, and if Vim
|
||
|
crashes while you're gone, don't say I didn't warn you...;-)
|
||
|
|
||
|
*txtfmt-start-token*
|
||
|
*txtfmt-private-use-area*
|
||
|
If you're using Unicode, the "Private Use Area" (a block of character codes
|
||
|
beginning at 0xE000) is probably the ideal location for the Txtfmt token
|
||
|
range. This block is reserved for "application-specific" use, and is
|
||
|
guaranteed never to be used for actual characters.
|
||
|
|
||
|
*txtfmt-multibyte-syntax-bug*
|
||
|
Note: Several beta-release versions of Txtfmt did not work correctly with
|
||
|
multibyte encodings because of a Vim bug involving the treatment of offsets
|
||
|
used in syntax highlight matches. A patch for the Vim bug was created by
|
||
|
Yukihiro Nakadaira, and was included in the Txtfmt distribution. Only users
|
||
|
who applied the patch were able to use Txtfmt with a multibyte encoding such
|
||
|
as utf-8. As of Txtfmt version 1.1, however, the patch was no longer
|
||
|
necessary, as workaround logic had been added to Txtfmt itself. Moreover,
|
||
|
Yukihiro's patch has been incorporated into Vim 7.2, so Txtfmt's internal
|
||
|
workaround is required only for older versions of Vim. There is, however, one
|
||
|
_extremely_ rare scenario in which someone running a version of Vim older than
|
||
|
7.2 might wish to apply the patch: namely, when different characters within
|
||
|
tokrange are encoded with different numbers of bytes. Since the number of
|
||
|
bytes per character is usually constant across a large block of Unicode
|
||
|
characters, only users wishing to set tokrange to a very non-standard value
|
||
|
would be affected by this limitation. All of the default tokrange settings
|
||
|
work properly with no need for the patch. Thus, as of Txtfmt version 1.5, I'm
|
||
|
removing Yukihiro's patch from the distribution (to avoid frightening away new
|
||
|
users;-). If you determine that you need it, you can obtain it from a Txtfmt
|
||
|
version <= 1.4. Note, however, that you should never need this patch if you're
|
||
|
running Vim 7.2 or later.
|
||
|
|
||
|
*txtfmt-problematic-ranges*
|
||
|
Not all character codes are suitable for use as Txtfmt tokens. In particular,
|
||
|
only tokens that are susceptible to Vim's syntax highlighting should be used.
|
||
|
For a color terminal, characters used in terminal control sequences are
|
||
|
sometimes immune to syntax highlighting. The specific character code ranges
|
||
|
affected will vary from terminal to terminal. For latin1 and utf-8 encodings,
|
||
|
characters in the range 0x80-0xA0 should generally be avoided, as they tend to
|
||
|
cause problems in both GUI and terminal versions of Vim. (Exception: The
|
||
|
Windows GUI appears to be able to handle this range.) For utf-8 encodings,
|
||
|
only 16-bit character codes should be used, as Vim does not display characters
|
||
|
above 0xFFFF correctly. Note that not all 16-bit values correspond to a valid
|
||
|
Unicode character. The ones that do not will be displayed as <xxxx> (where
|
||
|
xxxx is the hexadecimal representation of the character code). These
|
||
|
"characters" cannot be highlighted and should not be used.
|
||
|
|
||
|
As a general rule, modern unix-style terminals tend to work best when Unicode
|
||
|
is used. I have found by experimentation that some ranges of tokens work
|
||
|
perfectly when 'encoding' is set to utf-8, but don't work at all when it is
|
||
|
set to latin1. The bottom-line is, if you're using a color terminal designed
|
||
|
to work with Unicode, you should probably keep 'encoding' at utf-8. If for
|
||
|
some reason you must use a different encoding, you should experiment with the
|
||
|
|txtfmt-:MakeTestPage| command to find a setting for |txtfmt-'tokrange'| that
|
||
|
works.
|
||
|
|
||
|
*txtfmt-default-tokrange*
|
||
|
If you do not explicitly set the |txtfmt-'tokrange'| option, either in a
|
||
|
|txtfmt-modeline| or via the |txtfmtTokrange| option variable, Txtfmt will
|
||
|
attempt to choose a default setting that is suitable for the current character
|
||
|
encoding. Success in this endeavor is not guaranteed, however, since it
|
||
|
involves choosing a range of characters that will not be used for any other
|
||
|
purpose in the file being edited. For Unicode, the task of choosing a suitable
|
||
|
range is simple, due to the existence of the "Private Use Area".
|
||
|
|
||
|
Backward-compatibility Note: Because versions of Vim prior to 7.2 handled
|
||
|
syntax highlighting match offsets incorrectly for multibyte characters,
|
||
|
versions of Txtfmt prior to 1.1 would not choose a tokrange default within the
|
||
|
"Private Use Area", even for Unicode encodings such as utf-8. Txtfmt version
|
||
|
1.1, however, contained a workaround that permitted multibyte tokens to be
|
||
|
used even in versions of Vim suffering from the aforementioned bug. Thus, in
|
||
|
Txtfmt version 1.1, the default start token for Unicode changed from 180 to
|
||
|
0xE000 (the start of the "Private Use Area").
|
||
|
|
||
|
Important Note: If you are a multibyte encoding user who created Txtfmt files
|
||
|
with the old start token value of 180, you should consider the following
|
||
|
(non-exhaustive) list of options...
|
||
|
1. Continue using 180 for all Txtfmt files.
|
||
|
How: Override the new default by setting the |txtfmtTokrange|
|
||
|
option explicitly.
|
||
|
2. Continue using 180 for existing files, but use 0xE000 for all
|
||
|
newly-created Txtfmt files.
|
||
|
How: Put a |txtfmt-modeline| containing (e.g.) "tokrange=180X" in
|
||
|
your existing Txtfmt files to override the new default.
|
||
|
3. Use 0xE000 for all Txtfmt files, old and new.
|
||
|
How: Use the :MoveStartTok command to relocate the tokens in your
|
||
|
existing file(s) to a new range within the "Private Use Area".
|
||
|
e.g. >
|
||
|
:MoveStartTok 0xE000
|
||
|
<
|
||
|
For more information, see |txtfmt-:MoveStartTok|
|
||
|
|
||
|
For encodings other than Unicode, there is nothing analogous to the "Private
|
||
|
Use Area"; hence, it is not possible to choose a default tokrange that will
|
||
|
work for everyone. Currently, Txtfmt's default algorithm chooses '180X' for
|
||
|
all 1 and 2 byte encodings. This value should be suitable for most
|
||
|
non-European users of a single byte encoding such as latin1. European users
|
||
|
who use accented letters located at or above character code 180 should
|
||
|
probably be using a multibyte encoding such as utf-8.
|
||
|
|
||
|
Although the tokrange defaults should be suitable for the vast majority of
|
||
|
users, they may not be suitable for everyone, and each Txtfmt user is
|
||
|
encouraged to put some thought into the tokrange he will use and then test it
|
||
|
thoroughly with :MakeTestPage. For usage details, see |txtfmt-:MakeTestPage|.
|
||
|
|
||
|
|
||
|
COLORS *txtfmt-color-config*
|
||
|
|
||
|
IMPORTANT NOTE: This section makes no attempt to distinguish between
|
||
|
foreground and background colors. The description of the |txtfmtColor{}| array
|
||
|
applies equally to the|txtfmtBgcolor{}| array, which permits background colors
|
||
|
to be configured independently of their foreground color counterparts.
|
||
|
|
||
|
As mentioned previously, there are 9 tokens used to begin Txtfmt color
|
||
|
regions: 8 corresponding to colors, and 1 indicating "default" or "no color".
|
||
|
By default, Txtfmt picks these colors according to RGB values: #000000
|
||
|
(black), #0000FF (blue), #00FF00 (green), etc... However, this choice may not
|
||
|
be desirable for all users; hence, Txtfmt provides a rather flexible mechanism
|
||
|
by which the user can configure the colors used. In fact, the user can
|
||
|
configure different sets of colors for different color terminals, GUI's, or
|
||
|
colorschemes. The configuration is accomplished via the old-style Vim array
|
||
|
txtfmtColor{1..8}, which may be set either buf-locally or globally. If a given
|
||
|
element has both a buf-local and a global setting, the buf-local setting is
|
||
|
given priority. This array has a static counterpart, initialized to default
|
||
|
values by Txtfmt, so the user can override only those elements he wishes to
|
||
|
change.
|
||
|
|
||
|
Each element of the txtfmtColor{} array corresponds to 1 of the 8 possible
|
||
|
colors. Its value is a string consisting of at least 2 comma-separated parts.
|
||
|
The first part is a Vim regular expression that determines how the color may
|
||
|
be specified in a "color spec". (See |txtfmt-clr-spec| for more information.)
|
||
|
Each of the subsequent parts contains a prefix indicating whether the
|
||
|
definition applies to cterm's or GUI's, an optional list of patterns
|
||
|
specifying the applicable values of 'term', and the actual color string to be
|
||
|
used as the rhs of a "ctermfg=" or "guifg=" in a :highlight command.
|
||
|
|
||
|
Here is the formal definition of a single string in the txtfmtColor{} array:
|
||
|
{namepat},{clrdef1}[,{clrdef2},...,{clrdefN}]
|
||
|
|
||
|
{clrdef} :=
|
||
|
{c|g}[{termpatlist}]:{clrstr}
|
||
|
|
||
|
{termpatlist} :=
|
||
|
:{termpat1}:{termpat2}:...:{termpatN}
|
||
|
|
||
|
Here are the meanings of the fields:
|
||
|
{namepat} Vim regex used to recognize the name used to specify a certain
|
||
|
color; e.g., when prompted by one of the insert token maps. May not
|
||
|
contain spaces or commas. (Example: 'k\\|bla\\%[ck]')
|
||
|
{c|g} Determines whether {clrstr} will be the rhs of a "ctermfg=" ('c'),
|
||
|
or "guifg=" ('g')
|
||
|
{termpat} Pattern used to match against &term option. It is a regex pattern
|
||
|
which will be applied as ^{termpat}$.
|
||
|
Note: The {termpatlist} is optional. If it is omitted, the color
|
||
|
definition will apply to all cterm's or gui's, as determined by
|
||
|
{c|g}.
|
||
|
{clrstr} rhs of a "ctermfg=" or "guifg=" assignment. For possible values,
|
||
|
see |gui-colors| and |cterm-colors| in the Vim help.
|
||
|
|
||
|
Note: When multiple {clrdef}'s could apply, the rightmost one is used.
|
||
|
Note: {namepat}, {termpat} and {clrstr} fields will have one level of
|
||
|
backslashes removed during processing. Commas, colons and backslashes
|
||
|
appearing within those fields should be preceded with a single backslash. (See
|
||
|
examples below...)
|
||
|
|
||
|
Example txtfmtColor{} elements: >
|
||
|
'red,c:xterm:dosterm:DarkRed,g:#FF0000,g:builtin_gui:other_gui:#FF1010'
|
||
|
'^b\\%[lue]$,c:DarkBlue,g:#0000FF'
|
||
|
<
|
||
|
|
||
|
Color defaults *txtfmt-color-defaults*
|
||
|
|
||
|
The default values for the 8 colors are given below: >
|
||
|
txtfmtColor{1} = '^\\%(k\\|bla\\%[ck]\\)$,c:Black,g:#000000'
|
||
|
txtfmtColor{2} = '^b\\%[lue]$,c:DarkBlue,g:#0000FF'
|
||
|
txtfmtColor{3} = '^g\\%[reen]$,c:DarkGreen,g:#00FF00'
|
||
|
txtfmtColor{4} = '^t\\%[urquoise]$,c:DarkCyan,g:#00FFFF'
|
||
|
txtfmtColor{5} = '^r\\%[ed]$,c:DarkRed,g:#FF0000'
|
||
|
txtfmtColor{6} = '^v\\%[iolet]$,c:DarkMagenta,g:#FF00FF'
|
||
|
txtfmtColor{7} = '^y\\%[ellow]$,c:DarkYellow,g:#FFFF00'
|
||
|
txtfmtColor{8} = '^w\\%[hite]$,c:White,g:#FFFFFF'
|
||
|
|
||
|
You may override none, some or all of the defaults. It is even permissible to
|
||
|
override only part of an element; you could, for example, override the
|
||
|
definition of "red" for a "dosterm" color terminal, but use the default red
|
||
|
definition for other cterm's and GUI's.
|
||
|
|
||
|
Colorscheme considerations *txtfmt-colorschemes*
|
||
|
|
||
|
Although the simplest way to override the default colors is to set the global
|
||
|
version of txtfmtColor{} once and for all in your vimrc, there may be times
|
||
|
when this simple solution is inadequate. Consider the following scenario...
|
||
|
You use Txtfmt to create some blue text in a buffer with a light background.
|
||
|
You later decide you wish to view the Txtfmt buffer with the "blue"
|
||
|
colorscheme. The blue text you created is no longer visible! Of course, you
|
||
|
can make it visible again by redefining the "blue" element in the global
|
||
|
txtfmtColor{} array and re-editing or :Refresh'ing the Txtfmt buffer (see
|
||
|
|txtfmt-:Refresh|), but changing g:txtfmtColor{} everytime you change
|
||
|
colorschemes could become tedious. A better solution is to use autocommands to
|
||
|
change the color definitions automatically whenever the colorscheme changes.
|
||
|
Although you could set the global version of txtfmtColor{} in the autocommand,
|
||
|
setting the buf-local version instead lets you reserve the global version for
|
||
|
defaults that will be used with filetypes for which an autocommand has not
|
||
|
been defined.
|
||
|
|
||
|
For the sake of example, let us assume that you use Txtfmt to edit *.txt
|
||
|
files, and that you wish to vary the color definitions according to current
|
||
|
colorscheme for all such files. To keep the example simple, I will consider
|
||
|
only the following 3 cases:
|
||
|
|
||
|
1. "default" colorscheme
|
||
|
Txtfmt defaults are acceptable
|
||
|
2. "blue" and "darkblue" colorscheme
|
||
|
Change black to orange
|
||
|
Change blue to brown
|
||
|
3. all other colorschemes
|
||
|
Change black to orange
|
||
|
Leave blue at the Txtfmt default
|
||
|
|
||
|
The following sample implementation shows one possible strategy for
|
||
|
configuring the Txtfmt colors as described above...
|
||
|
>
|
||
|
" --INSIDE YOUR USER FILETYPE.VIM--
|
||
|
augroup filetypedetect
|
||
|
au! ColorScheme *.txt call Define_colors(1)
|
||
|
au! BufRead,BufNewFile *.txt call Define_colors(0)
|
||
|
au BufRead,BufNewFile *.txt setfiletype txtfmt
|
||
|
augroup END
|
||
|
<
|
||
|
-------------------------------
|
||
|
Explanation of the autocommands
|
||
|
-------------------------------
|
||
|
All assignments to the buf-local txtfmtColor{} array occur within the
|
||
|
Define_colors function (shown below). A call to Define_colors has been placed
|
||
|
in a BufRead,BufNewFile autocommand to ensure that colors can be set
|
||
|
appropriately even when :colorscheme has never been called. The call from
|
||
|
within the ColorScheme autocommand ensures that the colors are recomputed
|
||
|
whenever the colorscheme is changed. >
|
||
|
Note: It is not necessary that the ColorScheme autocommand be placed within
|
||
|
the filetypedetect group.
|
||
|
>
|
||
|
" IN A FILE SOURCED AT STARTUP (E.G., VIMRC)
|
||
|
" Configure colors in response to colorscheme change or Txtfmt buffer load
|
||
|
" Note: 'refresh' input will be true if and only if the function is
|
||
|
" called in response to colorscheme change.
|
||
|
fu! Define_colors(refresh)
|
||
|
if !exists('g:colors_name') || g:colors_name == 'default'
|
||
|
" Use defaults
|
||
|
let b:txtfmtColor{1} = '^\\%(k\\|bla\\%[ck]\\)$,c:Black,g:#000000'
|
||
|
let b:txtfmtColor{2} = '^b\\%[lue]$,c:DarkBlue,g:#0000FF'
|
||
|
elseif g:colors_name == 'blue' || g:colors_name == 'darkblue'
|
||
|
" Replace black with orange
|
||
|
let b:txtfmtColor{1} = '^o\\%[range]$,c:Yellow,g:#FF8040'
|
||
|
" Replace blue with brown
|
||
|
let b:txtfmtColor{2} = '^b\\%[rown]$,c:Brown,g:#804000'
|
||
|
else
|
||
|
" Replace black with orange, but leave blue at Txtfmt
|
||
|
" default
|
||
|
let b:txtfmtColor{1} = '^o\\%[range]$,c:Yellow,g:#FF8040'
|
||
|
let b:txtfmtColor{2} = '^b\\%[lue]$,c:DarkBlue,g:#0000FF'
|
||
|
endif
|
||
|
" We shouldn't get here if this isn't a Txtfmt buffer, but check to be
|
||
|
" safe since :Refresh is defined only for Txtfmt buffers
|
||
|
if a:refresh && b:current_syntax =~ '\<txtfmt\>'
|
||
|
" Important: We must reload the Txtfmt plugin because
|
||
|
" :colorscheme clears the old highlight groups
|
||
|
:Refresh
|
||
|
endif
|
||
|
endfu
|
||
|
|
||
|
------------------------------
|
||
|
Explanation of Define_colors()
|
||
|
------------------------------
|
||
|
In the example, I use g:colors_name (which, if it exists, holds the name of
|
||
|
the currently active colorscheme) to decide which elements of the buf-local
|
||
|
txtfmtColor{} array need to be overridden, and what color values should be
|
||
|
used. It would also be possible to take 'background' into account, but be
|
||
|
aware that not all colorschemes set this option. You can make the color
|
||
|
configuration logic as simple or as complex as you like.
|
||
|
Note: Because Txtfmt processes each element of the txtfmtColor{} array as a
|
||
|
separate entity, it is necessary to set only the elements you wish to change
|
||
|
from the Txtfmt defaults. Of course, if one of the if/else blocks sets a
|
||
|
particular element, the others should set it as well, even if they do not need
|
||
|
to override the default. Alternatively, a block that wishes to use the default
|
||
|
could simply unlet! the corresponding element to ensure that the Txtfmt
|
||
|
default is used.
|
||
|
|
||
|
It is important to note that simply changing the buf-local version of
|
||
|
txtfmtColor{} has no effect on an existing Txtfmt buffer; the Txtfmt plugin
|
||
|
must be reloaded (i.e., "refreshed") before the color changes can take effect.
|
||
|
When Define_colors() is called in response to a BufRead or BufNewFile event,
|
||
|
the required reload happens automatically because of the subsequent
|
||
|
"setfiletype txtfmt". In the case of the ColorScheme event, however, there is
|
||
|
no such automatic reload. To ensure that the user will not need to do anything
|
||
|
special to see the results of changing the colorscheme, I have added the
|
||
|
conditional :Refresh to Define_colors(). The test of the boolean "refresh"
|
||
|
argument ensures that the |txtfmt-:Refresh| command will be invoked only when
|
||
|
the colorscheme is changing and we are within a Txtfmt buffer.
|
||
|
|
||
|
Achieving colorscheme independence *txtfmt-hl-color-names*
|
||
|
|
||
|
Although the default txtfmtColor{} array uses hard-coded color names, this is
|
||
|
by no means required. An intriguing possibility, which I have implemented on
|
||
|
my own system, is to use color name patterns corresponding to the default Vim
|
||
|
highlighting groups. Under this strategy, instead of naming a particular color
|
||
|
"red", you might instead name it "error". Within the Define_colors() routine
|
||
|
outlined above, you would define the error color according to the
|
||
|
colorscheme-specific guibg/ctermbg definitions used for the Error highlight
|
||
|
group. The advantage of this strategy is that it guarantees that your
|
||
|
Txtfmt files will look good in any colorscheme (assuming they looked good in
|
||
|
the original colorscheme ;-). To facilitate creation of the required color
|
||
|
definitions, I created a Vim script that parses the colorscheme files in
|
||
|
$VIMRUNTIME/colors and extracts the desired definitions for each colorscheme
|
||
|
automatically. I can send a copy of this script, along with instructions for
|
||
|
using it, to anyone who is interested...
|
||
|
|
||
|
COLOR TERMINAL PITFALLS *txtfmt-cterm-pitfalls*
|
||
|
|
||
|
Cterm default background *txtfmt-cterm-default-background*
|
||
|
|
||
|
When you define a highlighting region for a cterm without specifying the
|
||
|
background color with ctermbg, Vim assumes the "default" background color is
|
||
|
desired. The "default" background for a cterm is the default background color
|
||
|
of the terminal itself, unless ctermbg has been overridden in a highlight
|
||
|
statement for the "Normal" group: e.g., >
|
||
|
:hi Normal ctermbg=15
|
||
|
<
|
||
|
In such cases, the Normal background color replaces the cterm's default
|
||
|
background for all subsequent highlighting. Certain colorschemes (e.g., blue,
|
||
|
darkblue and evening) explicitly set the Normal background color in a cterm.
|
||
|
Others leave it at the default for the color terminal. Ordinarily, Txtfmt can
|
||
|
handle either case, but the following paragraph describes an issue I have
|
||
|
encountered with one particular terminal, seen only when 'term' is set
|
||
|
incorrectly...
|
||
|
|
||
|
Incorrect 'term' setting for gnome-terminal *txtfmt-cterm-term-issue*
|
||
|
*txtfmt-gnome-terminal-issue*
|
||
|
The default version of gnome-terminal leaves the TERM environment variable
|
||
|
set to xterm, although the proper setting appears to be gnome-256color.
|
||
|
Unfortunately, the package containing the gnome-256color terminfo description
|
||
|
is not installed by default on some gnome systems. Strangely, even when the
|
||
|
gnome-256color terminfo description is installed, gnome-terminal won't set
|
||
|
TERM to use it. When Vim is started in a gnome-terminal for which TERM=xterm,
|
||
|
the 't_Co' termcap entry is incorrectly set to 8 instead of 256. One of the
|
||
|
effects of this is that outputting certain foreground colors to the cterm will
|
||
|
cause the default background color to revert from the value defined for the
|
||
|
Normal group to the terminal's default. The problem appears to be limited to
|
||
|
the "dark" foreground colors (0-7), which are precisely the colors used in
|
||
|
Txtfmt's default color map. Thus, this issue has the potential to cause
|
||
|
serious display problems for Txtfmt.
|
||
|
|
||
|
*txtfmt-gnome-terminal-issue-workaround*
|
||
|
There are several ways to resolve this issue. The simplest is to set t_Co=256:
|
||
|
e.g., >
|
||
|
:set t_Co=256
|
||
|
<
|
||
|
The set of t_Co could go in your vimrc, or anyplace that causes it to be
|
||
|
executed before Txtfmt is loaded. A better solution, in my opinion, is to
|
||
|
ensure that Vim's 'term' option is set to its proper value (i.e.,
|
||
|
gnome-256color), but this is possible only if the corresponding terminfo
|
||
|
description is installed on your system. If the following command... >
|
||
|
:set term=gnome-256color
|
||
|
<
|
||
|
...generates an error in Vim, you must first install the terminfo description.
|
||
|
On Fedora Linux, the package is named "ncurses-term". (It may have a different
|
||
|
name in other distributions.) Once you have installed the terminfo package,
|
||
|
you should ensure that Vim's 'term' option is set properly. There are at least
|
||
|
2 possible approaches:
|
||
|
|
||
|
1. Set TERM environment variable
|
||
|
Put the following in one of your shell startup scripts (e.g., .bashrc): >
|
||
|
export TERM=gnome-256color
|
||
|
<
|
||
|
2. Set 'term' option in your vimrc
|
||
|
e.g., >
|
||
|
set term=gnome-256color
|
||
|
<
|
||
|
|
||
|
When "hidden" tokens are not hidden *txtfmt-cterm-ignore-issue*
|
||
|
|
||
|
Originally, Txtfmt relied exclusively upon the "Ignore" preferred highlighting
|
||
|
group to hide the special formatting tokens. The Ignore group was added in Vim
|
||
|
5.2 to permit markup characters such as the `*' and `|' ("stars and bars")
|
||
|
surrounding tags in a Vim help file to be hidden. It has since come to my
|
||
|
attention, however, that roughly half of the colorschemes distributed with Vim
|
||
|
do not hide text in the Ignore group. In some cases, the contrast between
|
||
|
foreground and background color is minimized; in other cases, there appears to
|
||
|
have been no attempt at all to obscure the text.
|
||
|
Note: It is easy to see how your particular colorscheme treats text in the
|
||
|
Ignore group: simply execute... >
|
||
|
:hi Ignore
|
||
|
If the Ignore group is defined properly, the "xxx" test pattern should be
|
||
|
invisible.
|
||
|
|
||
|
In some cases, the Txtfmt plugin can take the Ignore group completely out of
|
||
|
the equation, by defining a Txtfmt-specific concealment region that sets the
|
||
|
foreground color equal to the background color. This strategy always works for
|
||
|
the GUI. It works in a cterm if and only if the terminal background color is
|
||
|
known to Vim; i.e., it works when the Normal group's background color has been
|
||
|
set (as described in section |txtfmt-cterm-default-background|). If the Normal
|
||
|
group background is not set, any attempt to use "bg" as a color name in a
|
||
|
highlight command will generate an error: e.g., >
|
||
|
:hi Tf_conceal ctermfg=bg " ERROR if Normal ctermbg not set
|
||
|
<
|
||
|
If you are seeing the formatting tokens in your Txtfmt buffer, the plugin was
|
||
|
unable to set ctermfg=bg. In that case, you have several options, as described
|
||
|
below...
|
||
|
|
||
|
*txtfmt-cterm-ignore-workaround*
|
||
|
1. Redefine the Ignore group:
|
||
|
First of all, determine the foreground color that most closely matches the
|
||
|
default background color of your terminal. You can do this by
|
||
|
experimentation, or by looking at the Ignore group definition of a
|
||
|
colorscheme that does a better job of hiding Ignore'd text. (The default
|
||
|
colorscheme would be a good one to check first.) Once you have determined
|
||
|
the proper color, put it into a :highlight command as follows: >
|
||
|
:hi Ignore ctermfg=<bg_color>
|
||
|
<
|
||
|
Of course, you need to ensure that the :highlight command is executed after
|
||
|
the colorscheme has been sourced. There are several ways this can be
|
||
|
accomplished... If your colorscheme is sourced in your vimrc, and you never
|
||
|
change it after that, you could put the :highlight command in your vimrc,
|
||
|
just after the :colorscheme command. If, however, you sometimes change
|
||
|
colorschemes after starting Vim, you should avoid this method. Instead, you
|
||
|
might try one of the following:
|
||
|
|
||
|
1. Put the :highlight command into an autocommand defined for the
|
||
|
ColorScheme event: e.g., >
|
||
|
:au ColorScheme * hi Ignore ctermfg=<bg_color>
|
||
|
<
|
||
|
The autocommand itself could be defined in your vimrc. Note that
|
||
|
the ColorScheme event is triggered only after the colorscheme has
|
||
|
been loaded. (See |ColorScheme| in the Vim help for more
|
||
|
information.)
|
||
|
|
||
|
2. Create an override of your colorscheme file containing the
|
||
|
following two lines: >
|
||
|
:source <your_colorscheme_file>
|
||
|
:hi Ignore ctermfg=<bg_color>
|
||
|
<
|
||
|
The file you create should be placed in a folder that appears
|
||
|
earlier in your 'runtimepath' than the folder containing the
|
||
|
colorscheme you are overriding.
|
||
|
|
||
|
2. Define a background color for the Normal group:
|
||
|
This method ensures that Vim knows the terminal background color, which
|
||
|
enables Txtfmt to define its own highlight group with ctermfg=bg. You can
|
||
|
set the default background color like so... >
|
||
|
:hi Normal ctermbg=<desired_color>
|
||
|
<
|
||
|
Note: Be sure to put the :highlight command in a place where it will be
|
||
|
executed before Txtfmt is loaded. Any of the methods described above for
|
||
|
redefining the Ignore group could be used here as well.
|
||
|
Note: The Normal background color is used for all buffers, not just the
|
||
|
Txtfmt ones, so you will probably want to choose a color that is close to
|
||
|
your default background color.
|
||
|
Note: If you are using a gnome-terminal, read section
|
||
|
|txtfmt-gnome-terminal-issue| before using this method.
|
||
|
|
||
|
3. Choose a colorscheme that does a better job of hiding the text in the
|
||
|
Ignore group.
|
||
|
Note: Because it is not always possible to specify a foreground text color
|
||
|
that _exactly_ matches a color terminal's default background, only
|
||
|
colorschemes that explicitly set the Normal background color can guarantee
|
||
|
that text in the Ignore group will be hidden. However, even when the
|
||
|
Normal group's background color is not defined, it should usually be
|
||
|
possible to find a foreground color that comes reasonably close to matching
|
||
|
the default background.
|
||
|
|
||
|
|
||
|
CUSTOMIZING MAPPINGS *txtfmt-map-config*
|
||
|
|
||
|
The Txtfmt filetype plugin defines a number of mappings for various modes. By
|
||
|
default, Txtfmt picks consistent and intuitive key sequences for the lhs of
|
||
|
these mappings. It may be, however, that you already use one or more of those
|
||
|
key sequences for an existing map in the same mode. Even if there is no direct
|
||
|
conflict, it is possible that Txtfmt's default mapping would create an
|
||
|
ambiguity with respect to an existing mapping. (For details, see
|
||
|
|map-ambiguous| in the Vim help.) Finally, it may be that you simply do not
|
||
|
like the key sequences chosen by the plugin author. Whatever the case, Txtfmt
|
||
|
provides several ways to customize the map lhs. You can even specify that a
|
||
|
conflicting or ambiguous map should not be defined at all. All of these
|
||
|
customization mechanisms are discussed below...
|
||
|
|
||
|
All but one of the maps defined by the Txtfmt filetype plugin begin with
|
||
|
<LocalLeader>; hence, you may achieve a small amount of customization by
|
||
|
setting the special Vim global variable |maplocalleader| to a non-default
|
||
|
value.
|
||
|
|
||
|
Example: >
|
||
|
let g:maplocalleader = '_'
|
||
|
|
||
|
Now, when a Txtfmt map such as <LocalLeader>I is defined, the actual {lhs}
|
||
|
will be _I instead of the default \I. Of course, if the conflicting map was
|
||
|
also defined with <LocalLeader>, then this approach will not resolve the
|
||
|
conflict.
|
||
|
|
||
|
A more flexible mechanism for customizing maps involves the <Plug> construct.
|
||
|
If you are unfamiliar with this construct, you may wish to see |using-<Plug>|
|
||
|
in the Vim documentation. All of the mappings provided by the Txtfmt filetype
|
||
|
plugin are defined in a 2 stage process, which permits the default {lhs} to be
|
||
|
completely redefined. To the 2 "stages" in the map definition process
|
||
|
correspond 2 map "levels", henceforth referred to as the 1st and 2nd levels.
|
||
|
|
||
|
The 2nd level map is the one whose {rhs} actually implements the Txtfmt
|
||
|
functionality. The {lhs} of the 2nd level map is a key sequence beginning with
|
||
|
<Plug>, which can never be produced by the keyboard alone. Thus, if the Txtfmt
|
||
|
map functionality is to be usable, there must be a 1st level mapping capable
|
||
|
of producing this untypable key sequence. If Txtfmt sees that the user has
|
||
|
already defined such a map, it will define only the 2nd level map, effectively
|
||
|
allowing the user-defined 1st level map to override the default map sequence.
|
||
|
If, on the other hand, the user has not defined a 1st level map for a
|
||
|
particular map functionality, Txtfmt will define a 1st level map with the
|
||
|
default key sequence listed in this help document.
|
||
|
|
||
|
Some examples using one of the "Jump to token" mappings will be used to
|
||
|
illustrate the concepts presented above...
|
||
|
|
||
|
From the section defining the insert token maps (|txtfmt-ins-tok-map-list|),
|
||
|
we see the following map definition:
|
||
|
|
||
|
<LocalLeader>i <Plug>TxtfmtInsertTok_i
|
||
|
|
||
|
The <LocalLeader>i represents the default 1st level map {lhs}, while
|
||
|
<Plug>TxtfmtInsertTok_i is the 2nd level map {lhs}. The following 4 examples
|
||
|
show the 1st level map that results for 4 distinct customization scenarios.
|
||
|
|
||
|
Scenario: Neither maplocalleader nor 1st level map redefined
|
||
|
Result: \i ==> insert token functionality
|
||
|
|
||
|
Scenario: maplocalleader redefined as follows: >
|
||
|
let maplocalleader = '_'
|
||
|
< Result: _i ==> insert token functionality
|
||
|
|
||
|
Scenario: 1st level map redefined as follows in user's vimrc (or
|
||
|
something sourced prior to Txtfmt load): >
|
||
|
nmap _it <Plug>TxtfmtInsertTok_i
|
||
|
< Result: _it ==> insert token functionality
|
||
|
(\i map not created)
|
||
|
|
||
|
Scenario: Both maplocalleader and 1st level map redefined: >
|
||
|
let maplocalleader = '_'
|
||
|
nmap <LocalLeader>it <Plug>TxtfmtInsertTok_i
|
||
|
< Result: _it ==> insert token functionality
|
||
|
(\i map not created)
|
||
|
|
||
|
|
||
|
Handling map conflicts and ambiguities *txtfmt-map-conflict*
|
||
|
|
||
|
The mechanisms described above permit the Txtfmt user to eliminate map
|
||
|
conflicts and ambiguities once they become known. Of course, when you first
|
||
|
begin using the Txtfmt plugin, you will probably not be aware of the
|
||
|
conflicts. By default, Txtfmt will overwrite any existing mappings with its
|
||
|
own 1st level maps; moreover, to ensure that you have the opportunity to
|
||
|
resolve the conflict, Txtfmt gives one warning per Vim session for each
|
||
|
conflict or ambiguity it detects. The default behavior just described may be
|
||
|
tailored with global option |txtfmtMapwarn|. With this option, you can specify
|
||
|
any or all of the following:
|
||
|
|
||
|
-whether echomsg or echoerr is used for warnings
|
||
|
-whether the same map conflict/ambiguity will produce a warning every
|
||
|
time the plugin is sourced, or only once per Vim session
|
||
|
-whether a Txtfmt map will be created when a conflicting/ambiguous map
|
||
|
exists
|
||
|
|
||
|
The |txtfmtMapwarn| option may be set to a string of the following character
|
||
|
flags: "mMeEoOcC". The flags may appear in any combination and in any order.
|
||
|
Lowercase flags affect the handling of map ambiguities, while uppercase flags
|
||
|
pertain to map conflicts. The meaning of the flags is as follows:
|
||
|
|
||
|
m Use :echomsg to warn about map ambiguities
|
||
|
M Use :echomsg to warn about map conflicts
|
||
|
e Use :echoerr to warn about map ambiguities
|
||
|
E Use :echoerr to warn about map conflicts
|
||
|
o Warn of a particular map ambiguity only once per Vim session
|
||
|
O Warn of a particular map conflict only once per Vim session
|
||
|
c Create the Txtfmt map in case of map ambiguity
|
||
|
C Create the Txtfmt map in case of map conflict
|
||
|
|
||
|
The "once-only" flag: The intent of the o and O flags is to prevent the user
|
||
|
from being bombarded with the same conflict warning every time he loads a
|
||
|
Txtfmt buffer. To determine whether a map conflict or ambiguity is identical
|
||
|
to one for which the user has already been warned, Txtfmt employs the concept
|
||
|
of a "conflict instance". A conflict instance is defined by a unique
|
||
|
combination of the following:
|
||
|
|
||
|
-map mode
|
||
|
-{lhs} of the Txtfmt map
|
||
|
-{rhs} of the existing map
|
||
|
|
||
|
Note: If mutually exclusive flags are used, Txtfmt will give precedence to the
|
||
|
flag appearing later in the string. If a flag is used without another flag
|
||
|
required to give it meaning, the useless flag is simply ignored. Txtfmt will
|
||
|
not generate an error unless invalid flags are used.
|
||
|
|
||
|
==============================================================================
|
||
|
6. User interface *txtfmt-user-interface*
|
||
|
|
||
|
INSERTING TOKENS *txtfmt-ins-tok*
|
||
|
|
||
|
Whenever you wish to alter the formatting or coloring of text in a Txtfmt
|
||
|
buffer, you must insert the appropriate Txtfmt token or tokens. A single
|
||
|
format token is sufficient to determine any combination of format attributes,
|
||
|
just as a single color token is sufficient to determine any of the 8 possible
|
||
|
foreground or background colors. Thus, as a general rule, a Txtfmt buffer will
|
||
|
not contain sequences of more than 3 consecutive Txtfmt tokens. There are,
|
||
|
however, times when it makes sense to insert more than 3 Txtfmt tokens at
|
||
|
once; when you know, for example, that the region you are creating will be
|
||
|
terminated by an explicit "no format" and/or "no color" token, you may wish to
|
||
|
insert both the region opening and closing tokens with a single insert
|
||
|
mapping, which leaves the cursor positioned just after the opening tokens
|
||
|
where the region text will go. Details on the various mappings are provided
|
||
|
below in the section on |txtfmt-ins-tok-map-list|. Before you attempt to use
|
||
|
those mappings, however, you should be familiar with the concept of
|
||
|
format/color specifications. Each of the token insertion mappings prompts you
|
||
|
to enter a list of such specifications, which it then translates into a
|
||
|
sequence of tokens to be inserted into the buffer. The following sections
|
||
|
describe these specifications and the lists comprising them in detail.
|
||
|
|
||
|
Fmt spec *txtfmt-fmt-spec*
|
||
|
|
||
|
A format specification specifies a unique combination of valid format
|
||
|
attributes. The set of "valid" format attributes is determined by the
|
||
|
|txtfmt-'tokrange'| option (in particular, by the tokrange suffix) as well as
|
||
|
by the version of Vim you are using.
|
||
|
|
||
|
The format of a single format specification is given as follows:
|
||
|
|
||
|
f{fmts}
|
||
|
|
||
|
where {fmts} is a string consisting of either a single dash ('-') indicating
|
||
|
"no format attributes", or a sequence of letters from the set "ubisrc", in
|
||
|
which each letter represents a format attribute that should be applied to the
|
||
|
region. The letter/attribute correspondences are shown in the table below.
|
||
|
Also shown are the |txtfmt-'tokrange'| suffix and version of Vim required to
|
||
|
enable the format attribute.
|
||
|
|
||
|
====================================================
|
||
|
| ltr | attribute | tokrange | v:version |
|
||
|
| | | suffix | |
|
||
|
====================================================
|
||
|
| u | underline | S or X | any |
|
||
|
| b | bold | S or X | any |
|
||
|
| i | italic | S or X | any |
|
||
|
| s | standout | L | any |
|
||
|
| r | reverse (inverse) | L | any |
|
||
|
| c | undercurl | L | >= 700 |
|
||
|
====================================================
|
||
|
|
||
|
Note: {fmts} may contain any combination of valid format specification
|
||
|
letters in any order.
|
||
|
|
||
|
Clr spec *txtfmt-clr-spec*
|
||
|
|
||
|
A color specification specifies a single color from among up to 8
|
||
|
possibilities in the active color definition.
|
||
|
|
||
|
The format of a single color specification is given as follows:
|
||
|
|
||
|
{typ}{clr}
|
||
|
|
||
|
{typ} is either
|
||
|
'c' => foreground color
|
||
|
'k' => background color
|
||
|
{clr} is either a single dash ('-') indicating "no color" (i.e., default
|
||
|
color), or a string matching the {namepat} corresponding to one of the 8
|
||
|
possible colors. As discussed in the section |txtfmt-color-config|, {namepat}
|
||
|
is simply a Vim regular expression used to recognize a (possibly abbreviated)
|
||
|
color name. The default color definitions use Vim's \%[] contruct with
|
||
|
intuitive color names (e.g. "red", "green", "blue") so that you can usually
|
||
|
specify a color by the first letter of its name.
|
||
|
|
||
|
Example: >
|
||
|
{namepat} valid {clr} values
|
||
|
===================================
|
||
|
b\%[lue]$ "b" "bl" "blu" "blue"
|
||
|
r\%[ed]$ "r" "re" "red"
|
||
|
|
||
|
Of course, if you override the default color definition array, you are free to
|
||
|
define whatever colors and corresponding {namepat}'s you like. See
|
||
|
|txtfmt-color-config| for details.
|
||
|
|
||
|
|
||
|
Fmt/clr spec list *txtfmt-fmt-clr-spec-list*
|
||
|
|
||
|
Since most mappings and functions for working with fmt/clr tokens permit
|
||
|
multiple tokens to be inserted simultaneously, Txtfmt permits the format/color
|
||
|
specifications described in the preceding two sections to be concatenated into
|
||
|
comma or dot-separated lists. The resulting "format/color specification lists"
|
||
|
are the topic of this section.
|
||
|
|
||
|
Format/color specification lists may contain any number of fmt-spec and
|
||
|
clr-spec "atoms", freely intermixed and in any order. Internally, Txtfmt will
|
||
|
translate the list of fmt/clr atoms into a sequence of character codes
|
||
|
representing the corresponding fmt/clr tokens. By default, Txtfmt's token
|
||
|
insertion mappings leave the cursor after the final token inserted; you can
|
||
|
alter this behavior, however, by replacing one of the commas separating the
|
||
|
individual fmt/clr specs with a dot ('.') to indicate the desired cursor
|
||
|
position.
|
||
|
Note: Although commas are used only to separate items in the list, a dot may
|
||
|
be placed at the beginning of the list to indicate that the cursor should end
|
||
|
up before any of the inserted tokens.
|
||
|
|
||
|
Here are a few example fmt/clr spec lists:
|
||
|
Note: The following examples assume the default color definitions
|
||
|
listed in |txtfmt-color-defaults|.
|
||
|
|
||
|
kb
|
||
|
Result: Blue background region is begun (but not terminated). Cursor
|
||
|
is positioned after the inserted token.
|
||
|
|
||
|
fu,cr
|
||
|
Result: Red underline region is begun (but not terminated). Cursor is
|
||
|
positioned after the inserted tokens.
|
||
|
|
||
|
fbi,cg,kr.k-,c-,f-
|
||
|
Result: Green bold,italic on red background region is begun (and
|
||
|
simultaneously terminated). Cursor is left just inside the region.
|
||
|
|
||
|
.f-,c-
|
||
|
Result: Inserts the "no format" and "no color" tokens, but leaves
|
||
|
cursor positioned within the combined fmt/clr region being terminated.
|
||
|
|
||
|
fubisrc
|
||
|
Result: Underline,bold,italic,standout,reverse,undercurl region is
|
||
|
begun. Cursor is positioned after the inserted token.
|
||
|
|
||
|
Mapping overview *txtfmt-ins-tok-maps*
|
||
|
|
||
|
The Txtfmt filetype plugin provides a number of mappings that may be used to
|
||
|
insert the special tokens used to delineate the Txtfmt format/color regions.
|
||
|
All of the token insertion mappings prompt the user to enter a special comma
|
||
|
or dot-separated list, known as a fmt/clr spec list, which completely
|
||
|
describes the sequence of tokens that should be inserted. Details on the
|
||
|
format of this list may be found in section |txtfmt-fmt-clr-spec-list|.
|
||
|
|
||
|
There are actually 15 separate mappings that may be used to insert Txtfmt
|
||
|
tokens: 1 may be used only in insert mode; the other 14 are used only in
|
||
|
normal mode. The main reason there are so many normal mode mappings is that
|
||
|
Vim provides many ways to go from normal mode to insert mode, each of which
|
||
|
may be more suitable than the others in a given context. Suppose, for example,
|
||
|
that you are in normal mode and you wish to insert the "no format" token at
|
||
|
the end of the current line. You might consider jumping to the end of the line
|
||
|
with $, then invoking a Txtfmt normal mode mapping to insert the token. If,
|
||
|
for the sake of example, Txtfmt provided only one normal mode mapping, which
|
||
|
inserted tokens before the cursor position, you would have a problem. The
|
||
|
token would be inserted prior to the last character on the line, when in fact,
|
||
|
it needed to go after the last character on the line. In this case, you could
|
||
|
circumvent the difficulty by hitting A in normal mode (instead of $) and using
|
||
|
the Txtfmt insert mode mapping to insert the desired token, but this would
|
||
|
require separate operations for entering and exiting insert mode. What would
|
||
|
be preferable here is a Txtfmt normal mode mapping that functions in a manner
|
||
|
analogous to Vim's normal mode 'A' command for entering insert mode.
|
||
|
|
||
|
Of course, we could construct other examples, which call for mappings that
|
||
|
insert tokens at the beginning of a line (analogous to Vim's normal mode 'I'
|
||
|
command), or mappings that replace the N characters under the cursor with the
|
||
|
tokens inserted (analogous to Vim's normal mode 's' command), and so on... By
|
||
|
the same token, there may be times when you wish to remain in insert mode
|
||
|
after the tokens have been inserted, and times when you wish simply to insert
|
||
|
the tokens and return to normal mode. The Txtfmt insert-token mappings listed
|
||
|
below provide you with all of those capabilities and more.
|
||
|
|
||
|
Although the number of normal mode mappings may appear large at first glance,
|
||
|
their default key sequences are intuitive, once you understand that they all
|
||
|
are constructed according to the following pattern:
|
||
|
|
||
|
<LocalLeader>[{end-in-normal}]{vim-enterinsert-char}
|
||
|
|
||
|
where {vim-enterinsert-char} is one of Vim's single-letter normal mode
|
||
|
commands for entering insert mode: >
|
||
|
i, I, a, A, o, O, s
|
||
|
and the optional {end-in-normal} is the letter 'v', which is simply a flag
|
||
|
indicating that you wish to return to normal mode after the insertion.
|
||
|
|
||
|
There is only one insert mode mapping. Its default map sequence was selected
|
||
|
because it is (in the author's opinion, at least) fairly easy to type, and not
|
||
|
something you are otherwise likely to type in insert mode.
|
||
|
|
||
|
All 15 of the insert-token mappings are listed below, with similar ones
|
||
|
grouped together to avoid repetition. For each mapping, 2 forms are shown:
|
||
|
1. The default map sequence
|
||
|
2. The <Plug> form, used only for customization
|
||
|
For details on customizing maps, refer to section |txtfmt-map-config|.
|
||
|
|
||
|
Mapping list *txtfmt-ins-tok-map-list*
|
||
|
|
||
|
<LocalLeader>i <Plug>TxtfmtInsertTok_i *\i* *txtfmt-ins-tok-i*
|
||
|
<LocalLeader>I <Plug>TxtfmtInsertTok_I *\I* *txtfmt-ins-tok-I*
|
||
|
<LocalLeader>a <Plug>TxtfmtInsertTok_a *\a* *txtfmt-ins-tok-a*
|
||
|
<LocalLeader>A <Plug>TxtfmtInsertTok_A *\A* *txtfmt-ins-tok-A*
|
||
|
<LocalLeader>o <Plug>TxtfmtInsertTok_o *\o* *txtfmt-ins-tok-o*
|
||
|
<LocalLeader>O <Plug>TxtfmtInsertTok_O *\O* *txtfmt-ins-tok-O*
|
||
|
<LocalLeader>s <Plug>TxtfmtInsertTok_s *\s* *txtfmt-ins-tok-s*
|
||
|
|
||
|
Available in normal mode only. Insert a sequence of Txtfmt tokens in the
|
||
|
current buffer and remain in insert mode. The various mappings differ only in
|
||
|
how they enter insert mode. Conceptually, they all do the following:
|
||
|
|
||
|
-Prompt user to enter a |txtfmt-fmt-clr-spec-list| at the command line
|
||
|
-Translate the entered text into a Txtfmt token sequence
|
||
|
-Enter insert mode via the {vim-enterinsert-char} specified in the
|
||
|
default map sequence.
|
||
|
-Insert the token sequence (with <C-R><C-R>=)
|
||
|
-Perform any cursor adjustment requested by the presence of a dot
|
||
|
('.') in the |txtfmt-fmt-clr-spec-list|.
|
||
|
-Remain in insert mode.
|
||
|
|
||
|
<LocalLeader>vi <Plug>TxtfmtInsertTok_vi *\vi* *txtfmt-ins-tok-vi*
|
||
|
<LocalLeader>vI <Plug>TxtfmtInsertTok_vI *\vI* *txtfmt-ins-tok-vI*
|
||
|
<LocalLeader>va <Plug>TxtfmtInsertTok_va *\va* *txtfmt-ins-tok-va*
|
||
|
<LocalLeader>vA <Plug>TxtfmtInsertTok_vA *\vA* *txtfmt-ins-tok-vA*
|
||
|
<LocalLeader>vo <Plug>TxtfmtInsertTok_vo *\vo* *txtfmt-ins-tok-vo*
|
||
|
<LocalLeader>vO <Plug>TxtfmtInsertTok_vO *\vO* *txtfmt-ins-tok-vO*
|
||
|
<LocalLeader>vs <Plug>TxtfmtInsertTok_vs *\vs* *txtfmt-ins-tok-vs*
|
||
|
|
||
|
Available in normal mode only. Insert a sequence of Txtfmt tokens in the
|
||
|
current buffer and return to normal mode. The various mappings differ only in
|
||
|
how they enter insert mode. Conceptually, they all do the following:
|
||
|
|
||
|
-Prompt user to enter a |txtfmt-fmt-clr-spec-list| at the command line
|
||
|
-Translate the entered text into a Txtfmt token sequence
|
||
|
-Enter insert mode via the {vim-enterinsert-char} specified in the
|
||
|
default map sequence.
|
||
|
-Insert the token sequence (with <C-R><C-R>=)
|
||
|
-Perform any cursor adjustment requested by the presence of a dot
|
||
|
('.') in the |txtfmt-fmt-clr-spec-list|.
|
||
|
-Exit insert mode.
|
||
|
|
||
|
*<C-\><C-\>*
|
||
|
<C-\><C-\> <Plug>TxtfmtInsertTok_i *txtfmt-ins-tok-CTRL-\_CTRL-\*
|
||
|
|
||
|
Available in insert mode only. Insert a sequence of Txtfmt tokens in the
|
||
|
current buffer and remain in insert mode. The mapping works like this:
|
||
|
|
||
|
-Prompt user to enter a |txtfmt-fmt-clr-spec-list| at the command line
|
||
|
-Translate the entered text into a Txtfmt token sequence
|
||
|
-Insert the token sequence (with <C-R><C-R>=)
|
||
|
-Perform any cursor adjustment requested by the presence of a dot
|
||
|
('.') in the |txtfmt-fmt-clr-spec-list|.
|
||
|
-Remain in insert mode.
|
||
|
|
||
|
IMPORTANT NOTE: Txtfmt will generate an error if |txtfmt-fmt-clr-spec-list|
|
||
|
specifies any colors that are inactive under the effective color masks. See
|
||
|
|txtfmtFgcolormask| or |txtfmtBgcolormask| for details on configuring color
|
||
|
masks.
|
||
|
|
||
|
JUMPING TO TOKENS *txtfmt-jump-to-tok*
|
||
|
|
||
|
The Txtfmt syntax plugin conceals the special tokens delineating the
|
||
|
format/color regions. Normally, you will see such tokens only in 3 cases:
|
||
|
1. when a region containing them is visually selected
|
||
|
2. when the token is serving no purpose in the buffer
|
||
|
Rationale: When a default ("no format" or "no color") token,
|
||
|
normally used to terminate a region, appears where there is no
|
||
|
region to terminate, Txtfmt intentionally leaves the token visible
|
||
|
so that you might notice and remove it.
|
||
|
3. when a fg or bg color token is disabled by |txtfmtFgcolormask| or
|
||
|
|txtfmtBgcolormask|
|
||
|
|
||
|
Although this behavior is generally what you want, it can make it difficult to
|
||
|
locate tokens after you have inserted them. There are many reasons why you
|
||
|
might wish to locate a concealed token: to remove it, to change it to a
|
||
|
different token, to insert another token immediately before or after it,
|
||
|
etc... To simplify the task of locating such tokens, Txtfmt provides various
|
||
|
mappings for jumping to them. These "jump to token" commands are analogous to
|
||
|
various Vim motion commands: e.g., [{, ]}, f, F, t, T, etc...
|
||
|
|
||
|
There are exactly 48 such mappings, but their default map sequences are
|
||
|
constructed according to a pattern, which renders memorization of the
|
||
|
individual mappings unnecessary. (The desired mapping can be easily deduced
|
||
|
according to the pattern.)
|
||
|
|
||
|
{direction}[{till-flag}][{target-modifier}]{target}
|
||
|
|
||
|
The definitions of the fields in the pattern given above are as follows:
|
||
|
{direction}
|
||
|
[ (search backwards)
|
||
|
] (search forwards)
|
||
|
{till-flag}
|
||
|
Optional flag consisting of the letter 't'. If present,
|
||
|
indicates that the sought position is 1 character position
|
||
|
closer to the starting point of the jump than it would have
|
||
|
been without the {till-flag}. Behavior is analogous to that of
|
||
|
Vim's normal mode T operator; i.e., jump is "till" the target
|
||
|
location.
|
||
|
{target-modifier}
|
||
|
b (begin region tokens)
|
||
|
e (end region tokens)
|
||
|
Note: While there are a number of tokens that can begin a
|
||
|
format or color region, each of the 3 orthogonal region types
|
||
|
has only one "end region" token: the one specified by a dash
|
||
|
(`-') in the |txtfmt-fmt-spec| or |txtfmt-clr-spec|.
|
||
|
{target}
|
||
|
f (format tokens)
|
||
|
c (fg color tokens)
|
||
|
k (bg color tokens)
|
||
|
a (any format or fg/bg color token)
|
||
|
|
||
|
Examples: >
|
||
|
]f Jump forward to next token that begins or ends a
|
||
|
format region
|
||
|
]ef Jump forward to next "end format region" token
|
||
|
[tbc Jump backward "till" previous "begin fg color region"
|
||
|
token
|
||
|
|
||
|
|
||
|
All of the jump-to-token mappings are defined for normal, visual, and
|
||
|
operator-pending modes, and all can take a count, which causes them to jump to
|
||
|
the [count] token of the specified type in the specified direction. Whether
|
||
|
the search for tokens wraps around the start or end of the buffer is
|
||
|
determined by the 'wrapscan' option.
|
||
|
|
||
|
SPECIAL NOTE ON VISUAL MODE
|
||
|
The visual-mode maps correctly extend the visual selection for linewise,
|
||
|
characterwise and blockwise selections.
|
||
|
|
||
|
SPECIAL NOTE ON OPERATOR-PENDING MODE
|
||
|
By default, when used with an operator such as 'd', 'c' or 'y', a
|
||
|
jump-to-token map behaves in an "exclusive" manner; i.e., the character
|
||
|
landed upon is not deleted, changed or yanked. If you wish to make these
|
||
|
motions work more like the builtin 'f', 't', 'F' and 'T' commands, simply
|
||
|
hit 'v' between the operator and the jump-to-token map. (For details, see
|
||
|
|o_v| in the Vim help.)
|
||
|
|
||
|
All 48 of the jump-to-token mappings are listed below. For each mapping, 2
|
||
|
forms are shown:
|
||
|
1. The default map sequence
|
||
|
2. The <Plug> form, used only for customization
|
||
|
For details on customizing maps, refer to section |txtfmt-map-config|.
|
||
|
|
||
|
Mappings *txtfmt-jump-to-tok-maps*
|
||
|
|
||
|
[f <Plug>TxtfmtBckToFmtTok *[f* *txtfmt-bck-to-fmt-tok*
|
||
|
Jump to [count] previous format begin/end region token
|
||
|
]f <Plug>TxtfmtFwdToFmtTok *]f* *txtfmt-fwd-to-fmt-tok*
|
||
|
Jump to [count] next format begin/end region token
|
||
|
[c <Plug>TxtfmtBckToClrTok *[c* *txtfmt-bck-to-clr-tok*
|
||
|
Jump to [count] previous fg color begin/end region token
|
||
|
]c <Plug>TxtfmtFwdToClrTok *]c* *txtfmt-fwd-to-clr-tok*
|
||
|
Jump to [count] next fg color begin/end region token
|
||
|
[k <Plug>TxtfmtBckToBgcTok *[k* *txtfmt-bck-to-bgc-tok*
|
||
|
Jump to [count] previous bg color begin/end region token
|
||
|
]k <Plug>TxtfmtFwdToBgcTok *]k* *txtfmt-fwd-to-bgc-tok*
|
||
|
Jump to [count] next bg color begin/end region token
|
||
|
[a <Plug>TxtfmtBckToAnyTok *[a* *txtfmt-bck-to-any-tok*
|
||
|
Jump to [count] previous format/color begin/end region token
|
||
|
]a <Plug>TxtfmtFwdToAnyTok *]a* *txtfmt-fwd-to-any-tok*
|
||
|
Jump to [count] next format/color begin/end region token
|
||
|
|
||
|
[bf <Plug>TxtfmtBckToFmtBegTok *[bf* *txtfmt-bck-to-fmt-beg-tok*
|
||
|
Jump to [count] previous format begin region token
|
||
|
]bf <Plug>TxtfmtFwdToFmtBegTok *]bf* *txtfmt-fwd-to-fmt-beg-tok*
|
||
|
Jump to [count] next format begin region token
|
||
|
[bc <Plug>TxtfmtBckToClrBegTok *[bc* *txtfmt-bck-to-clr-beg-tok*
|
||
|
Jump to [count] previous fg color begin region token
|
||
|
]bc <Plug>TxtfmtFwdToClrBegTok *]bc* *txtfmt-fwd-to-clr-beg-tok*
|
||
|
Jump to [count] next fg color begin region token
|
||
|
[bk <Plug>TxtfmtBckToBgcBegTok *[bk* *txtfmt-bck-to-bgc-beg-tok*
|
||
|
Jump to [count] previous bg color begin region token
|
||
|
]bk <Plug>TxtfmtFwdToBgcBegTok *]bk* *txtfmt-fwd-to-bgc-beg-tok*
|
||
|
Jump to [count] next bg color begin region token
|
||
|
[ba <Plug>TxtfmtBckToAnyBegTok *[ba* *txtfmt-bck-to-any-beg-tok*
|
||
|
Jump to [count] previous format/color begin region token
|
||
|
]ba <Plug>TxtfmtFwdToAnyBegTok *]ba* *txtfmt-fwd-to-any-beg-tok*
|
||
|
Jump to [count] next format/color begin region token
|
||
|
|
||
|
[ef <Plug>TxtfmtBckToFmtEndTok *[ef* *txtfmt-bck-to-fmt-end-tok*
|
||
|
Jump to [count] previous format end region token
|
||
|
]ef <Plug>TxtfmtFwdToFmtEndTok *]ef* *txtfmt-fwd-to-fmt-end-tok*
|
||
|
Jump to [count] next format end region token
|
||
|
[ec <Plug>TxtfmtBckToClrEndTok *[ec* *txtfmt-bck-to-clr-end-tok*
|
||
|
Jump to [count] previous fg color end region token
|
||
|
]ec <Plug>TxtfmtFwdToClrEndTok *]ec* *txtfmt-fwd-to-clr-end-tok*
|
||
|
Jump to [count] next fg color end region token
|
||
|
[ek <Plug>TxtfmtBckToBgcEndTok *[ek* *txtfmt-bck-to-bgc-end-tok*
|
||
|
Jump to [count] previous bg color end region token
|
||
|
]ek <Plug>TxtfmtFwdToBgcEndTok *]ek* *txtfmt-fwd-to-bgc-end-tok*
|
||
|
Jump to [count] next bg color end region token
|
||
|
[ea <Plug>TxtfmtBckToAnyEndTok *[ea* *txtfmt-bck-to-any-end-tok*
|
||
|
Jump to [count] previous format/color end region token
|
||
|
]ea <Plug>TxtfmtFwdToAnyEndTok *]ea* *txtfmt-fwd-to-any-end-tok*
|
||
|
Jump to [count] next format/color end region token
|
||
|
|
||
|
[tf <Plug>TxtfmtBckTillFmtTok *[tf* *txtfmt-bck-till-fmt-tok*
|
||
|
Jump "till" [count] previous format begin/end region token
|
||
|
]tf <Plug>TxtfmtFwdTillFmtTok *]tf* *txtfmt-fwd-till-fmt-tok*
|
||
|
Jump "till" [count] next format begin/end region token
|
||
|
[tc <Plug>TxtfmtBckTillClrTok *[tc* *txtfmt-bck-till-clr-tok*
|
||
|
Jump "till" [count] previous fg color begin/end region token
|
||
|
]tc <Plug>TxtfmtFwdTillClrTok *]tc* *txtfmt-fwd-till-clr-tok*
|
||
|
Jump "till" [count] next fg color begin/end region token
|
||
|
[tk <Plug>TxtfmtBckTillBgcTok *[tk* *txtfmt-bck-till-bgc-tok*
|
||
|
Jump "till" [count] previous bg color begin/end region token
|
||
|
]tk <Plug>TxtfmtFwdTillBgcTok *]tk* *txtfmt-fwd-till-bgc-tok*
|
||
|
Jump "till" [count] next bg color begin/end region token
|
||
|
[ta <Plug>TxtfmtBckTillAnyTok *[ta* *txtfmt-bck-till-any-tok*
|
||
|
Jump "till" [count] previous format/color begin/end region token
|
||
|
]ta <Plug>TxtfmtFwdTillAnyTok *]ta* *txtfmt-fwd-till-any-tok*
|
||
|
Jump "till" [count] next format/color begin/end region token
|
||
|
|
||
|
[tbf <Plug>TxtfmtBckTillFmtBegTok *[tbf* *txtfmt-bck-till-fmt-beg-tok*
|
||
|
Jump "till" [count] previous format begin region token
|
||
|
]tbf <Plug>TxtfmtFwdTillFmtBegTok *]tbf* *txtfmt-fwd-till-fmt-beg-tok*
|
||
|
Jump "till" [count] next format begin region token
|
||
|
[tbc <Plug>TxtfmtBckTillClrBegTok *[tbc* *txtfmt-bck-till-clr-beg-tok*
|
||
|
Jump "till" [count] previous fg color begin region token
|
||
|
]tbc <Plug>TxtfmtFwdTillClrBegTok *]tbc* *txtfmt-fwd-till-clr-beg-tok*
|
||
|
Jump "till" [count] next fg color begin region token
|
||
|
[tbk <Plug>TxtfmtBckTillBgcBegTok *[tbk* *txtfmt-bck-till-bgc-beg-tok*
|
||
|
Jump "till" [count] previous bg color begin region token
|
||
|
]tbk <Plug>TxtfmtFwdTillBgcBegTok *]tbk* *txtfmt-fwd-till-bgc-beg-tok*
|
||
|
Jump "till" [count] next bg color begin region token
|
||
|
[tba <Plug>TxtfmtBckTillAnyBegTok *[tba* *txtfmt-bck-till-any-beg-tok*
|
||
|
Jump "till" [count] previous format/color begin region token
|
||
|
]tba <Plug>TxtfmtFwdTillAnyBegTok *]tba* *txtfmt-fwd-till-any-beg-tok*
|
||
|
Jump "till" [count] next format/color begin region token
|
||
|
|
||
|
[tef <Plug>TxtfmtBckTillFmtEndTok *[tef* *txtfmt-bck-till-fmt-end-tok*
|
||
|
Jump "till" [count] previous format end region token
|
||
|
]tef <Plug>TxtfmtFwdTillFmtEndTok *]tef* *txtfmt-fwd-till-fmt-end-tok*
|
||
|
Jump "till" [count] next format end region token
|
||
|
[tec <Plug>TxtfmtBckTillClrEndTok *[tec* *txtfmt-bck-till-clr-end-tok*
|
||
|
Jump "till" [count] previous fg color end region token
|
||
|
]tec <Plug>TxtfmtFwdTillClrEndTok *]tec* *txtfmt-fwd-till-clr-end-tok*
|
||
|
Jump "till" [count] next fg color end region token
|
||
|
[tek <Plug>TxtfmtBckTillBgcEndTok *[tek* *txtfmt-bck-till-bgc-end-tok*
|
||
|
Jump "till" [count] previous bg color end region token
|
||
|
]tek <Plug>TxtfmtFwdTillBgcEndTok *]tek* *txtfmt-fwd-till-bgc-end-tok*
|
||
|
Jump "till" [count] next bg color end region token
|
||
|
[tea <Plug>TxtfmtBckTillAnyEndTok *[tea* *txtfmt-bck-till-any-end-tok*
|
||
|
Jump "till" [count] previous format/color end region token
|
||
|
]tea <Plug>TxtfmtFwdTillAnyEndTok *]tea* *txtfmt-fwd-till-any-end-tok*
|
||
|
Jump "till" [count] next format/color end region token
|
||
|
|
||
|
|
||
|
BUILDING COMPLEX MAPPINGS FROM PRIMITIVES *txtfmt-user-maps*
|
||
|
|
||
|
The insert-token maps discussed in a preceding section permit the insertion of
|
||
|
a single sequence of fmt/clr tokens at a fixed location relative to the cursor
|
||
|
position. A common scenario, however, is one in which you wish to perform
|
||
|
multiple insertions, possibly interspersed with cursor movements and other Vim
|
||
|
commands. Suppose, for example, that you often find yourself highlighting an
|
||
|
entire line in bold,italic, and then using :ce to center the text on the line.
|
||
|
You could accomplish this using only Vim commands and insert-token maps as
|
||
|
follows: >
|
||
|
|
||
|
Hit \vI and enter fmt spec "fbi" at the prompt
|
||
|
Hit \vA and enter fmt spec "f-" at the prompt
|
||
|
Execute :ce[nter] at the command-line
|
||
|
|
||
|
While this approach works, it could become tedious if you do it often. A
|
||
|
better approach would be to create a single mapping that executes the entire
|
||
|
sequence of steps shown above. To facilitate creation of such maps, Txtfmt
|
||
|
provides a mechanism known as "user-maps". User-map creation is requested
|
||
|
through the "old-style" Vim array |txtfmtUsermap{}|. The first element of the
|
||
|
array is txtfmtUsermap{1} and the last element is txtfmtUsermap{N}, where N is
|
||
|
determined from option variable |txtfmtUsermaplimit|. It is not necessary to
|
||
|
set every element between indices 1 and N. You may define as many or as few
|
||
|
maps within that range as you like. Only the elements that have been set will
|
||
|
cause a map to be created. Moreover, both |txtfmtUsermap{}| and
|
||
|
|txtfmtUsermaplimit| may be set either globally or buffer-locally. As a
|
||
|
general rule, the global elements define mappings that should be available in
|
||
|
any type of file, whereas buffer-local elements would define more specialized
|
||
|
maps: e.g. maps that are used only when using Txtfmt within C comments in
|
||
|
buffers whose filetype is set to "c.txtfmt". For a more detailed look at
|
||
|
possible usage scenarios involving buf-local assignment to |txtfmtUsermap{}|
|
||
|
elements, see |txtfmt-buflocal-user-map|.
|
||
|
|
||
|
txtfmtUsermap{} element format *txtfmt-user-map-fmt*
|
||
|
|
||
|
Each element of the |txtfmtUsermap{}| array is a string, which specifies a
|
||
|
single normal or insert mode map to be created in the Txtfmt buffer. The
|
||
|
format of the string is as follows:
|
||
|
|
||
|
"{map-cmd} {map-lhs} {map-rhs}"
|
||
|
|
||
|
The descriptions of the fields in braces are as follows:
|
||
|
|
||
|
{map-cmd}
|
||
|
The map creation command used by Txtfmt to create the mapping.
|
||
|
Currently, the following commands are supported:
|
||
|
imap, inoremap, nmap, nnoremap
|
||
|
{map-lhs}
|
||
|
Everything following {map-cmd} up to the first whitespace character
|
||
|
that is not preceded by a literal CTRL-V represents the {lhs} of the
|
||
|
mapping to be created.
|
||
|
{map-rhs}
|
||
|
The remainder of the string represents the {rhs} of the mapping to be
|
||
|
created. May contain special user-map expansion macros within <<...>>
|
||
|
requesting Txtfmt "insert-token" or "jump-to-token" functionality.
|
||
|
(See section |txtfmt-user-map-expansion| below.)
|
||
|
|
||
|
MAP-LHS DETAILS
|
||
|
Note that {map-lhs} should appear exactly as it would if the mapping were
|
||
|
being created without the aid of Txtfmt; i.e., just as it would if you were
|
||
|
creating the map with an :exe[cute] on the |txtfmtUsermap{}| string. This
|
||
|
means, for example, that whitespace may be included in the {lhs} if it is
|
||
|
escaped by a literal CTRL-V, and that the special key notation sequences (e.g.
|
||
|
<Up>, <Down>, <Bslash>, etc...) may be used in place of the corresponding key
|
||
|
codes. For more details, read the following sections in the Vim documentation:
|
||
|
|:map-special-keys|
|
||
|
|:map-special-chars|
|
||
|
|
||
|
MAP-RHS DETAILS
|
||
|
Vim's normal map processing rules apply to {map-rhs} as well; however, Txtfmt
|
||
|
performs a special pre-processing step on {map-rhs} before it is used to
|
||
|
define the map; in particular, it scans for and processes the special Txtfmt
|
||
|
expansion macros (enclosed in <<...>>), which are the subject of the following
|
||
|
section. To include a literal `<' in {map-rhs}, use the special <lt> notation
|
||
|
discussed in the Vim help for commands and mappings and documented in the
|
||
|
|key-notation| table.
|
||
|
|
||
|
Example: >
|
||
|
<lt><lt>EOF
|
||
|
produces a mapping that looks like
|
||
|
<<EOF
|
||
|
|
||
|
Note: If necessary, you may use the special symbol <rt> to get a literal `>'
|
||
|
into {map-rhs}. The <rt> symbol is special only within a Txtfmt user-map
|
||
|
expansion macro. (Although it is unlikely you would ever need to include a
|
||
|
literal `>>' within an expansion macro, use of non-alphanumeric characters as
|
||
|
part of a color name is currently not prohibited.)
|
||
|
|
||
|
Example: >
|
||
|
<<n\i:cstrange<rt><rt>color<rt><rt>name>>
|
||
|
inserts token for fg color whose user-defined pattern matches
|
||
|
"strange>>color>>name"
|
||
|
|
||
|
User-map expansion macros *txtfmt-user-map-expansion*
|
||
|
|
||
|
When Txtfmt encounters `<<' in {map-rhs}, it attempts to process a user-map
|
||
|
expansion macro. To facilitate the addition of user-map macros in future
|
||
|
versions of txtfmt, the following template has been devised:
|
||
|
|
||
|
<<{mode}{cmd}[{cmd-modifiers}][:{cmd-parameters}]>>
|
||
|
|
||
|
The descriptions of the fields in braces are as follows:
|
||
|
|
||
|
{mode} Single character representing the expected
|
||
|
mode at the instant the `<<' is encountered.
|
||
|
i = insert
|
||
|
n = normal
|
||
|
o = operator-pending
|
||
|
v = visual
|
||
|
Note: The mode flag may specify a mode
|
||
|
different from the mode indicated by {map-cmd}
|
||
|
(discussed in the previous section). Consider
|
||
|
that a single normal or insert mode mapping
|
||
|
may cause multiple modes to be entered and
|
||
|
exited as the rhs of the mapping is traversed.
|
||
|
This flag specifies the "instantaneous" mode.
|
||
|
[{count}] Optional count to be applied to {cmd}.
|
||
|
Note: Not all expansion macros accept a count.
|
||
|
See command-specific documentation below to
|
||
|
determine which ones do.
|
||
|
{cmd} A character or characters indicating the
|
||
|
Txtfmt functionality that is required.
|
||
|
Currently, all {cmd}'s are indicated by a
|
||
|
special character, which, in most cases,
|
||
|
corresponds to the first character of the
|
||
|
associated default map:
|
||
|
\ Insert-token
|
||
|
`[' or `]' Jump-to-token
|
||
|
[{cmd-modifiers}] Optional data modifying the behavior of the
|
||
|
{cmd} in some way. (See command-specific
|
||
|
documentation below.)
|
||
|
[{cmd-parameters}] Permits data that would normally be entered at
|
||
|
a prompt at the time of map execution to be
|
||
|
specified in advance (i.e. at the time of map
|
||
|
creation).
|
||
|
|
||
|
The specific forms of user-map macro are shown below, grouped according to the
|
||
|
Txtfmt functionality involved.
|
||
|
|
||
|
INSERT TOKEN MACROS
|
||
|
<<i\:{fmt-clr-spec-list}>>
|
||
|
<<n[{count}]\[{end-in-normal}]{vim-enterinsert-char}:{fmt-clr-spec-list}>>
|
||
|
|
||
|
Both forms of "insert-token" macro contain a |fmt-clr-spec-list|, describing
|
||
|
the sequence of fmt/clr tokens to be inserted and optionally specifying a
|
||
|
cursor offset with a single dot somewhere in the otherwise comma-separated
|
||
|
list. The first form is used when the instantaneous mode within {map-rhs} is
|
||
|
"insert", whereas the more complicated second form is needed when the
|
||
|
instantaneous mode is "normal". (See earlier description of {mode} flag.)
|
||
|
|
||
|
There are 3 additional parameters that apply only to the normal mode form of
|
||
|
the insert-token expansion sequence:
|
||
|
|
||
|
{count} is an optional value, specifying the count to be applied to the
|
||
|
enter-insert command. Specifying a count in this manner is analogous to
|
||
|
typing a count prior to executing the corresponding insert-token map in
|
||
|
normal mode.
|
||
|
|
||
|
{vim-enterinsert-char} is one of Vim's single-letter normal mode commands
|
||
|
for entering insert mode: >
|
||
|
i, I, a, A, o, O, s
|
||
|
< Proper choice of enter-insert command can simplify the mapping by
|
||
|
minimizing the number of movement commands required to position the cursor
|
||
|
prior to token insertion.
|
||
|
|
||
|
{end-in-normal} is the letter 'v', which, when present, serves as a flag
|
||
|
indicating that you wish to return to normal mode after the insertion. The
|
||
|
flag is provided as a convenience to minimize the number of "<Esc>"
|
||
|
characters that need to be embedded in {map-rhs}.
|
||
|
|
||
|
Examples: >
|
||
|
<<i\:c->> Starting in insert mode, insert "no fg color" token at
|
||
|
cursor location.
|
||
|
<<n\I:fbi>> Starting in normal mode, insert "bold,italic" token at
|
||
|
beginning of line. Ends in insert mode.
|
||
|
<<n5\vs:fu>> Starting in normal mode, 'substitute' the next 5
|
||
|
characters with a single "underline" token. Ends in
|
||
|
normal mode.
|
||
|
|
||
|
JUMP TO TOKEN MACROS
|
||
|
|
||
|
<<{mode}[{count}]{default-jump-to-tok-map}>>
|
||
|
|
||
|
A jump-to-token macro is created simply by prepending the {mode} flag and the
|
||
|
optional {count} to the default mapping representing the desired jump, and
|
||
|
enclosing the whole string within `<<' and `>>'. For a detailed discussion of
|
||
|
the various forms of jump-to-token mappings and a listing of the default
|
||
|
mappings, see |txtfmt-jump-to-tok| and |txtfmt-jump-to-tok-maps|.
|
||
|
|
||
|
Examples: >
|
||
|
<<n]k>> Jump forward to next bg color region token
|
||
|
<<n[ec>> Jump backward to previous "end fg color region" token
|
||
|
<<n3]tbf>> Jump forward "till" 3rd "begin format region" token
|
||
|
|
||
|
User-map examples *txtfmt-user-map-examples*
|
||
|
|
||
|
The following concrete examples should help to clarify the use of the various
|
||
|
forms of user-map expansion sequence. You should be able to copy any that
|
||
|
appear useful to your .vimrc.
|
||
|
|
||
|
|
||
|
" Map CTRL-B in insert mode to start and terminate a 'bold' region,
|
||
|
" leaving the cursor positioned within the region, ready to type bold
|
||
|
" text.
|
||
|
" Hint: Similar maps might be created for underline and italic >
|
||
|
let g:txtfmtUsermap1 = 'inoremap <C-B> <<i\:fb.f->>'
|
||
|
<
|
||
|
" Map CTRL-\f in insert mode to end current format region. >
|
||
|
let g:txtfmtUsermap2 = 'inoremap <C-\>f <<i\:f->>'
|
||
|
<
|
||
|
" Map CTRL-\k in insert mode to end current bg color region. >
|
||
|
let g:txtfmtUsermap3 = 'inoremap <C-\>k <<i\:k->>'
|
||
|
<
|
||
|
" Map \t in normal mode to embolden, underline and center (i.e.
|
||
|
" 'title-ize') the current line >
|
||
|
let g:txtfmtUsermap4 =
|
||
|
\'nnoremap <Bslash>t <<n\vI:fbu>><<n\vA:f->>:ce<CR>'
|
||
|
<
|
||
|
" Map \cf in normal mode to change all text within the current format
|
||
|
" region (without deleting the tokens that begin and end the region).
|
||
|
" Note: Since the default jump-to-token mappings are used in the rhs
|
||
|
" (rather than the special expansion macros), nmap must be used (rather
|
||
|
" than nnoremap).
|
||
|
" Note: The reason the ]f does not cause the format 'end region' token to
|
||
|
" be deleted is that the operator-pending jump-to-token maps work
|
||
|
" 'exclusive-ly' when there is no 'v' between operator and motion.
|
||
|
" :help exclusive >
|
||
|
let g:txtfmtUsermap5 = 'nmap <Bslash>cf [tbfc]f'
|
||
|
<
|
||
|
" Same as preceding map but for current fg color region.
|
||
|
" Note: This one demonstrates the use of the 'jump-to-token' expansion
|
||
|
" macros. >
|
||
|
let g:txtfmtUsermap6 = 'nnoremap <Bslash>cc <<n[tbc>>c<<o]c>>'
|
||
|
<
|
||
|
" Map <LocalLeader>bw in normal mode to embolden the word under the
|
||
|
" cursor. (The extra complexity is needed to ensure that you can invoke
|
||
|
" with cursor anywhere on the word.) >
|
||
|
let g:txtfmtUsermap7 =
|
||
|
\'nnoremap <LocalLeader>bw :if col(".")!=1 && '
|
||
|
\.'getline(".")[col(".")-2]=~"\\w"<Bar>exe "norm! b"<Bar>'
|
||
|
\.'endif<CR><<n\vi:fb>>e<<n\va:f->>b'
|
||
|
<
|
||
|
" Map \vf in normal mode to select all of the current format region
|
||
|
" visually.
|
||
|
" Note: Unlike the earlier one for changing the text in the current
|
||
|
" format region, this one doesn't constrain the backwards jump to a
|
||
|
" 'begin region' token; hence, it will also highlight the text between
|
||
|
" regions if the cursor lies between regions at the time the map is
|
||
|
" invoked. >
|
||
|
let g:txtfmtUsermap8 = 'nnoremap <LocalLeader>vf <<n[tf>>v<<v]tf>>'
|
||
|
<
|
||
|
" Map <C-\>vf in insert mode to do the same in insert mode >
|
||
|
let g:txtfmtUsermap9 = 'inoremap <C-\>vf <<i[tf>><Esc>lv<<v]tf>>'
|
||
|
<
|
||
|
" Map <LocalLeader><Space> in normal mode to jump forward to the 3rd
|
||
|
" 'begin format region' token. (Not overly practical, but demonstrates the
|
||
|
" use of whitespace in the lhs, as well as the use of the optional count
|
||
|
" with the jump-to-token expansion macros.) >
|
||
|
let g:txtfmtUsermap10 = 'nnoremap <LocalLeader><Space> <<n3]bf>>'
|
||
|
<
|
||
|
" Map <LocalLeader>_ in normal mode to substitute the next 4 characters
|
||
|
" with a bold format token followed by a 'no format' token, leaving the
|
||
|
" cursor positioned between the two.
|
||
|
" (This map is not intended to be useful, but merely to demonstrate the
|
||
|
" specification of a count with an insert-token expansion macro.) >
|
||
|
let g:txtfmtUsermap11 = 'nnoremap <LocalLeader>_ <<n4\s:fb.f->>'
|
||
|
<
|
||
|
" Map <LocalLeader>rb in normal mode to make the current line bold with a
|
||
|
" red background. >
|
||
|
let g:txtfmtUsermap12 =
|
||
|
\'nnoremap <LocalLeader>rb <<n\vI:kr,fb>><<n\vA:f-,k->>'
|
||
|
<
|
||
|
|
||
|
Using buf-local sets *txtfmt-buflocal-user-map*
|
||
|
|
||
|
As mentioned in an earlier section, both txtfmtUsermap{} and
|
||
|
txtfmtUsermaplimit may be set either globally or buf-locally. Here's how it
|
||
|
works... When Txtfmt loads, it determines the effective value of
|
||
|
txtfmtUsermaplimit according to the following logic: >
|
||
|
if exists('b:txtfmtUsermaplimit')
|
||
|
let txtfmtUsermaplimit = b:txtfmtUsermaplimit
|
||
|
elseif exists('g:txtfmtUsermaplimit')
|
||
|
let txtfmtUsermaplimit = g:txtfmtUsermaplimit
|
||
|
else
|
||
|
let txtfmtUsermaplimit = 25 "use default
|
||
|
endif
|
||
|
|
||
|
Txtfmt then executes the following (pseudo-code) loop: >
|
||
|
for i = 1, txtfmtUsermaplimit
|
||
|
if exists('b:txtfmtUsermap{i}')
|
||
|
Define user-map b:txtfmtUsermap{i}
|
||
|
elseif exists('g:txtfmtUsermap{i}')
|
||
|
Define user-map g:txtfmtUsermap{i}
|
||
|
endif
|
||
|
endloop
|
||
|
|
||
|
Several points to note:
|
||
|
-Leaving elements of txtfmtUsermap{} undefined is harmless.
|
||
|
-Setting b:txtfmtUsermaplimit effectively overrides any existing setting
|
||
|
of g:txtfmtUsermaplimit.
|
||
|
-Setting an element of b:txtfmtUsermap{} effectively hides the
|
||
|
corresponding element of g:txtfmtUsermap{}.
|
||
|
|
||
|
You may be wondering why you would ever need to use the buffer-local versions
|
||
|
of txtfmtUsermap{} and txtfmtUsermaplimit. If you edit only one type of file
|
||
|
with Txtfmt, then the simplest approach would be to use only the global
|
||
|
versions. It is possible, however, that while you have some user-maps that are
|
||
|
generally useful, you also have some special-purpose user-maps, which are
|
||
|
useful only in a certain type of file. Defining such user-maps globally would
|
||
|
render the corresponding {map-lhs} unusable in files in which you would never
|
||
|
need the special-purpose user-map. I will now describe a strategy that uses
|
||
|
the buf-local user-map option variables to circumvent the problem just
|
||
|
described...
|
||
|
|
||
|
STEP #1
|
||
|
=======
|
||
|
In your .vimrc, define user-maps 1..N using g:txtfmtUsermap{} and set the
|
||
|
global version of txtfmtUsermaplimit to N.
|
||
|
Note: All of the maps defined in this manner should be general purpose maps,
|
||
|
which you might need in any Txtfmt buffer.
|
||
|
|
||
|
Example: >
|
||
|
let g:txtfmtUsermap1 = '<generally useful map #1>'
|
||
|
let g:txtfmtUsermap2 = '<generally useful map #2>'
|
||
|
.
|
||
|
.
|
||
|
let g:txtfmtUsermapN = '<generally useful map #N>'
|
||
|
let g:txtfmtUsermaplimit = N
|
||
|
|
||
|
STEP #2
|
||
|
=======
|
||
|
Create global functions that define special-purpose user maps N+1..M using the
|
||
|
buffer-local versions of txtfmtUsermap{} and set the buffer-local version of
|
||
|
txtfmtUsermaplimit to N+M.
|
||
|
Note: Since these functions do not overwrite previously set elements of the
|
||
|
g:txtfmtUsermap{}, the general-purpose user-maps will be left intact.
|
||
|
|
||
|
Example: >
|
||
|
" This function defines special-purpose Txtfmt user-maps, useful only
|
||
|
" for *.abc files.
|
||
|
fu! Define_txtfmt_abc_usermaps()
|
||
|
let N = g:txtfmtUsermaplimit
|
||
|
let b:txtfmtUsermap{N+1} = '<special-purpose map #1>'
|
||
|
let b:txtfmtUsermap{N+2} = '<special-purpose map #2>'
|
||
|
.
|
||
|
.
|
||
|
let b:txtfmtUsermap{N+M} = '<special-purpose map #M>'
|
||
|
" Ensure that both the general-purpose and special-purpose
|
||
|
" user-maps are defined.
|
||
|
let b:txtfmtUsermaplimit = N+M
|
||
|
endfu
|
||
|
|
||
|
STEP #3
|
||
|
=======
|
||
|
Ensure that each special-purpose map function is called from an autocommand
|
||
|
specific to the filetype that will need the user-maps it defines.
|
||
|
|
||
|
Note: It is necessary to define these autocommands prior to the ones that set
|
||
|
filetype to txtfmt, so that the changes to txtfmtUsermap{} occur before Txtfmt
|
||
|
is loaded. An easy way to ensure the proper sequence is to place the
|
||
|
autocommands that call the map definition functions within the same
|
||
|
autocommand group as the setfiletype autocommand (see example below).
|
||
|
|
||
|
Example: >
|
||
|
" Inside ~/.vim/filetype.vim
|
||
|
augroup filetypedetect
|
||
|
au! BufRead,BufNewFile *.abc call Define_txtfmt_abc_usermaps()
|
||
|
au! BufRead,BufNewFile *.xyz call Define_txtfmt_xyz_usermaps()
|
||
|
.
|
||
|
.
|
||
|
" Set up detection for Txtfmt files
|
||
|
au! BufRead,BufNewFile *.abc setfiletype txtfmt
|
||
|
au! BufRead,BufNewFile *.xyz setfiletype txtfmt
|
||
|
au! BufRead,BufNewFile *.txt setfiletype txtfmt
|
||
|
augroup END
|
||
|
|
||
|
It should be noted that the strategy outlined above is simply one of many
|
||
|
possibilities. A slight variation would be to replace the general-purpose
|
||
|
user-maps altogether with special-purpose ones for one or more filetypes.
|
||
|
Suppose, for example, that we knew we would use only special-purpose maps when
|
||
|
editing a '*.abc' file. In that case, we would simply omit all occurrences of
|
||
|
"N+" in Define_txtfmt_abc_usermaps() to ensure that the general-purpose maps
|
||
|
were overridden.
|
||
|
|
||
|
CREATING TOKEN STRINGS *txtfmt-create-tok-str*
|
||
|
Txtfmt_GetTokStr({fmt-clr-spec-list}) *txtfmt-GetTokStr()*
|
||
|
This function accepts a |txtfmt-fmt-clr-spec-list| as input and
|
||
|
returns the corresponding sequence of Txtfmt tokens as a string.
|
||
|
Note: May be called only from a Txtfmt buffer.
|
||
|
|
||
|
QUERYING TOKEN TYPE *txtfmt-query-tok-type*
|
||
|
|
||
|
In most cases, the role played by a Txtfmt token will be evident from the
|
||
|
highlighting of the text that follows it. There are at least two scenarios,
|
||
|
however, in which the role played by a particular format or color token may
|
||
|
not be evident: 1) there is no text following the token; 2) adjacent format
|
||
|
and color tokens make it difficult to tell which is which, since the
|
||
|
formatting of the subsequent text does not depend upon the order of the
|
||
|
tokens. Although you can always look up the character code (obtained from
|
||
|
Vim's ga command) in the output of the |txtfmt-:ShowTokenMap| command, this
|
||
|
section presents some more convenient methods of determining a token's type...
|
||
|
|
||
|
Token-descriptors *txtfmt-tok-descriptor*
|
||
|
|
||
|
A {token-descriptor} is returned or displayed by all of the mappings, commands
|
||
|
and functions discussed in this section. A {token-descriptor} is simply a
|
||
|
string providing information about a particular character or token in a Txtfmt
|
||
|
buffer. Its format depends upon how the character is used in the buffer. The
|
||
|
possibilities are described below...
|
||
|
|
||
|
format token
|
||
|
A |txtfmt-fmt-spec| in fiducial form (e.g. "fubi")
|
||
|
color token
|
||
|
A string of the form {type}{colornum}[ (inactive)], where {type}
|
||
|
indicates the type of color token ('c' => fg, 'k' => bg), {colornum}
|
||
|
is a value between 1 and 8 indicating the color's index, and the
|
||
|
optional " (inactive)" label, if present, indicates that the color is
|
||
|
disabled by the current color mask. (For details on color masks, see
|
||
|
|txtfmtFgcolormask| or |txtfmtBgcolormask|.)
|
||
|
non-Txtfmt char
|
||
|
A character code value in decimal format (e.g. 'a' => 97)
|
||
|
invalid char position
|
||
|
"NUL" (just like Vim's ga command)
|
||
|
|
||
|
*\ga* *txtfmt-get-tok-info*
|
||
|
<LocalLeader>ga <Plug>TxtfmtGetTokInfo
|
||
|
This mapping echoes the {token-descriptor} (discussed above) of the
|
||
|
character under the cursor. Analogous to Vim's builtin ga command, it
|
||
|
provides the most convenient way to obtain information about the token
|
||
|
under the cursor. The primary difference between it and the builtin
|
||
|
version is that the Txtfmt version is aware of the special role played
|
||
|
by Txtfmt formatting tokens.
|
||
|
|
||
|
Note: The <Plug> form of the mapping may be used for customization.
|
||
|
For details on customizing maps, refer to section |txtfmt-map-config|.
|
||
|
|
||
|
*txtfmt-:GetTokInfo*
|
||
|
:GetTokInfo [ {line} {col} ]
|
||
|
This buffer-local command echoes the {token-descriptor} corresponding
|
||
|
to the character/token at the requested {line} and {col} in the
|
||
|
current buffer. If {line} and {col} are not supplied, the cursor
|
||
|
location is assumed; i.e., calling :GetTokInfo without args is
|
||
|
equivalent to executing the \ga mapping.
|
||
|
Note: If either {line} or {col} is specified, both must be specified.
|
||
|
Note: {col} is a 1-based byte index, such as would be returned by
|
||
|
Vim's col() function. Note that this index may differ from both the
|
||
|
virtual column index and the character index.
|
||
|
|
||
|
*txtfmt-GetTokInfo()*
|
||
|
Txtfmt_GetTokInfo([{line}, {char}])
|
||
|
!!!!!!!!!!!!!!!!!!
|
||
|
<<< DEPRECATED >>>
|
||
|
!!!!!!!!!!!!!!!!!!
|
||
|
|
||
|
IMPORTANT NOTE: I have marked this function as deprecated because both
|
||
|
the mapping and command (discussed above) provide similar
|
||
|
functionality and are easier to use; however, on the off-chance that
|
||
|
someone created a mapping to this function in one of the initial
|
||
|
versions of Txtfmt, I have not yet removed it. Note that the 2nd
|
||
|
argument to this function is a character index, which is fundamentally
|
||
|
different from the byte index provided to the :GetTokInfo command. As
|
||
|
a general rule, supplying byte indices, (which may be obtained with
|
||
|
Vim's col() function), is easier for the plugin user.
|
||
|
|
||
|
This function returns a string describing the token specified by
|
||
|
{line} and {char}. Note that both {line} and {char} are optional.
|
||
|
Either both or neither should be specified. If neither is specified,
|
||
|
the returned information will apply to the character under the cursor.
|
||
|
Otherwise, {char} is the 1-based index of a token on the line
|
||
|
specified by {line}.
|
||
|
Important Note: Because {char} is a character index, its value may
|
||
|
differ from the values returned by virtcol() (screen column index) and
|
||
|
col() (byte index).
|
||
|
The format of the return string depends upon the type of token
|
||
|
being queried, and is described above under |txtfmt-tok-descriptor|.
|
||
|
|
||
|
|
||
|
VIEWING TOKEN MAP *txtfmt-view-tok-map*
|
||
|
*txtfmt-:ShowTokenMap*
|
||
|
:ShowTokenMap
|
||
|
This buffer-local command echoes a table displaying the current
|
||
|
format/color token map in an intuitive and informative manner.
|
||
|
Note: Since a Txtfmt token map is specific to a buffer, the command
|
||
|
may be used only from a Txtfmt buffer. The table columns are slightly
|
||
|
different for formats and colors. Here is some sample output text,
|
||
|
which corresponds to the default |txtfmt-'tokrange'| setting...
|
||
|
|
||
|
=== FG COLORS ===
|
||
|
char-nr description clr-pattern clr-def
|
||
|
0xE000 no color - N.A.
|
||
|
0xE001 Color1 ^\%(k\|bla\%[ck]\)$ #000000
|
||
|
0xE002 Color2 ^b\%[lue]$ #0000FF
|
||
|
.
|
||
|
.
|
||
|
0xE008 Color8 ^w\%[hite]$ #FFFFFF
|
||
|
=== FORMAT ===
|
||
|
char-nr description fmt-spec
|
||
|
0xE009 no format -
|
||
|
0xE00A underline u
|
||
|
.
|
||
|
.
|
||
|
0xE010 underline,bold,italic ibu
|
||
|
=== BG COLORS ===
|
||
|
char-nr description clr-pattern clr-def
|
||
|
0xE011 no color - N.A.
|
||
|
*0xE012 Color1 (inactive) ^\%(k\|bla\%[ck]\)$ #000000
|
||
|
0xE013 Color2 ^b\%[lue]$ #0000FF
|
||
|
.
|
||
|
.
|
||
|
*0xE019 Color8 (inactive) ^w\%[hite]$ #FFFFFF
|
||
|
|
||
|
Several points to note:
|
||
|
|
||
|
The fmt-spec column gives the set of characters (in fiducial form)
|
||
|
that you would put after the 'f' in a |txtfmt-fmt-spec| to insert the
|
||
|
corresponding format token.
|
||
|
Note: The order of the characters in the set is not significant; i.e.,
|
||
|
"ubi" is equivalent to "ibu" and "bui".
|
||
|
|
||
|
The clr-pattern column represents the Vim regular expression that is
|
||
|
used to recognize a color name in a |txtfmt-clr-spec|.
|
||
|
|
||
|
The clr-def column under the "COLORS" section represents the actual
|
||
|
color definitions supplied to Vim via the :highlight command: e.g.
|
||
|
hi guifg={clr-def}
|
||
|
hi ctermfg={clr-def}
|
||
|
For GUI'S, the {clr-def} is either a symbolic color name (e.g.,
|
||
|
DarkBlue) or a literal RGB value (e.g., #FF0000). For cterm's, it
|
||
|
could be a color number or a symbolic color name.
|
||
|
Note: All of the values in the final 2 columns of the "FG/BG COLORS"
|
||
|
sections may be overridden by the user. For details, see
|
||
|
|txtfmt-color-config|.
|
||
|
|
||
|
The presence of an asterisk before the char-nr and the string
|
||
|
"(inactive)" following the color description indicates that a color
|
||
|
has been rendered inactive by the fg or bg colormask currently in
|
||
|
effect. For details, see |txtfmtFgcolormask|.
|
||
|
|
||
|
The char-nr column displays the character code value in the number
|
||
|
format used to set |txtfmt-'tokrange'|.
|
||
|
|
||
|
|
||
|
TESTING CURRENT SETTINGS *txtfmt-test-cur-settings*
|
||
|
*txtfmt-:MakeTestPage*
|
||
|
:MakeTestPage [{modeline}]
|
||
|
This buffer-local command creates a scratch buffer containing a
|
||
|
Txtfmt "test page". The Txtfmt options used to create the test page
|
||
|
take into account any global option settings, as well as any
|
||
|
|txtfmt-modeline| settings specified on the command line as arguments
|
||
|
to the command. Example: >
|
||
|
|
||
|
:MakeTestPage tokrange=180S escape=bslash nested
|
||
|
<
|
||
|
This creates a test page with the |txtfmt-'tokrange'| option set to
|
||
|
"180S", the |txtfmt-'escape'| option set to "bslash" and the
|
||
|
|txtfmt-'nested'| option turned on. All other Txtfmt options will have
|
||
|
the values set globally, or default values if the global option has
|
||
|
not been set.
|
||
|
Note: Since the test page is created in a new scratch buffer,
|
||
|
buffer-local option settings are not considered.
|
||
|
|
||
|
This command provides a quick and easy way to visualize the effects of
|
||
|
a particular combination of option values. Suppose, for example, that
|
||
|
the default 'tokrange' option setting yields Txtfmt tokens that cannot
|
||
|
be concealed by Vim, due to their use as control sequences by a
|
||
|
particular terminal. In this case, you might wish to run :MakeTestPage
|
||
|
iteratively, each time supplying a different value for 'tokrange',
|
||
|
until you find one that appears to work.
|
||
|
|
||
|
In addition to displaying all available formats and colors (both
|
||
|
foreground and background if applicable), the test page attempts to
|
||
|
show how things like token escaping and nesting of Txtfmt regions
|
||
|
within non-Txtfmt regions will (or won't) work, given the applicable
|
||
|
option settings. The text in the test page buffer is rather verbose,
|
||
|
and is intended as an aid to the new user. Although the primary
|
||
|
purpose of the test page is to provide information, the buffer created
|
||
|
is a fully valid Txtfmt buffer; hence, you are free to make changes in
|
||
|
it, using it as a scratchpad for testing the various Txtfmt mappings.
|
||
|
|
||
|
Note: If the text in the buffer does not appear to be highlighted at
|
||
|
all, it may be that you have not installed Txtfmt properly. (See
|
||
|
section |txtfmt-installation|.) Currently, the :MakeTestPage command
|
||
|
loads the Txtfmt plugin files by executing the following command in
|
||
|
the scratch buffer: >
|
||
|
|
||
|
:set filetype=txtfmt
|
||
|
|
||
|
< On a typical system (one on which filetype and syntax are both
|
||
|
enabled), this results in a :runtime sourcing of both
|
||
|
ftplugin/txtfmt.vim and syntax/txtfmt.vim. Of course, if you have
|
||
|
syntax and/or filetype plugins disabled, you will not be able to view
|
||
|
the test page as it was meant to be viewed...
|
||
|
|
||
|
TRANSLATING TOKEN RANGE *txtfmt-move-tok-range*
|
||
|
*txtfmt-:MoveStartTok*
|
||
|
:MoveStartTok {new-starttok} [{old-vim-ver}]
|
||
|
NOTE: This command changes the current buffer!
|
||
|
|
||
|
This buffer-local command relocates the Txtfmt token range in use in
|
||
|
the current buffer from its current location to {new-starttok}. Its
|
||
|
purpose is to provide an easy way to change the |txtfmt-'tokrange'|
|
||
|
option value in a file that already contains a large number of Txtfmt
|
||
|
tokens.
|
||
|
|
||
|
The {new-starttok} argument specifies the character code to be used as
|
||
|
the start of the new token range. It should be a decimal or
|
||
|
hexadecimal value, which is valid for the 'encoding' in effect.
|
||
|
Note: You should NOT append the {formats} specifier to the numeric
|
||
|
starttok value; the current value will be used. (See
|
||
|
|txtfmt-'tokrange'| for a description of the {formats} specifier.)
|
||
|
|
||
|
The optional {old-vim-ver} argument allows you to specify the version
|
||
|
of Vim that was used to create the file being changed. This could be
|
||
|
important if the following conditions are met:
|
||
|
-"Long" formats are in effect.
|
||
|
-The version of Vim used to create the file differs from the
|
||
|
current version.
|
||
|
-Only one of these versions supports the undercurl attribute.
|
||
|
|
||
|
Txtfmt will not attempt to move characters in the undercurl range if
|
||
|
the version of Vim used to create the file does not support undercurl.
|
||
|
Txtfmt will, on the other hand, move such tokens if the version used
|
||
|
to create the file supports undercurl, and undercurl has not been
|
||
|
explicitly disabled with the |txtfmt-'undercurl'| option. Thus, it is
|
||
|
possible to translate undercurl tokens even with a version of Vim that
|
||
|
doesn't support undercurl. In other words, Txtfmt uses the
|
||
|
{old-vim-ver} argument to determine the "shape" of the Txtfmt token
|
||
|
range that needs to be translated.
|
||
|
Note: If the optional {old-vim-ver} argument is omitted, Txtfmt
|
||
|
assumes the buffer was created with the current version of Vim.
|
||
|
|
||
|
Since Txtfmt was first released after Vim began supporting undercurl
|
||
|
(in version 7.0), the {old-vim-ver} argument can generally be omitted,
|
||
|
and is included only for the sake of completeness. Note: The format of
|
||
|
{old-vim-ver} is identical to the format of v:version; i.e., Vim major
|
||
|
version number times 100 plus Vim minor version number. e.g.,
|
||
|
Vim 7.1 ==> "701"
|
||
|
|
||
|
If the |txtfmt-'escape'| option is set to something other than "none",
|
||
|
:MoveStartTok takes the current escape method into account, and
|
||
|
attempts to do whatever makes sense with regard to escaped and
|
||
|
escaping characters. Consider that escaping is used to prevent special
|
||
|
interpretation of characters. When the Txtfmt token range moves, some
|
||
|
of the characters that would have been interpreted specially under the
|
||
|
old token range are not special at all under the new range, and hence,
|
||
|
no longer require escaping. Similarly, characters that were not
|
||
|
special at all under the old token range lie squarely within the new
|
||
|
token range, and hence require escaping to prevent their being
|
||
|
interpreted specially.
|
||
|
|
||
|
Here's how Txtfmt handles token translation when escaping is in
|
||
|
effect... Characters that are not currently special, but will be after
|
||
|
the move, are escaped. Tokens that are currently escaped are not
|
||
|
translated. Characters that are currently escaped to prevent special
|
||
|
interpretation, but will not need to be escaped after the translation,
|
||
|
have their escaping characters removed.
|
||
|
|
||
|
Note: In the context of the preceding paragraph, a character is
|
||
|
considered to be "special" if it could be interpreted as either a
|
||
|
Txtfmt token or an escaping character. For details on what constitutes
|
||
|
an escaping character, see |txtfmt-'escape'|.
|
||
|
|
||
|
If there is a |txtfmt-modeline| containing a tokrange option setting
|
||
|
in the current buffer, it will be altered to reflect the new token
|
||
|
range. After the changes have been made to the buffer, the filetype
|
||
|
and syntax plugins are automatically reloaded to cause the new
|
||
|
tokrange setting to take effect. As a result, there should generally
|
||
|
be no visible change to the buffer as a result of executing the
|
||
|
:MoveStartTok command.
|
||
|
|
||
|
Note: As previously mentioned, :MoveStartTok alters the current
|
||
|
buffer. Txtfmt will save the buffer after performing the token
|
||
|
translation unless there were unsaved changes when the command was
|
||
|
invoked. In that case, Txtfmt assumes that the user was not yet ready
|
||
|
to save the existing changes and leaves the buffer modified. Of
|
||
|
course, if you don't like the changes made by the :MoveStartTok
|
||
|
command, you can always undo them, regardless of whether or not the
|
||
|
changes have been saved.
|
||
|
|
||
|
Examples of use:
|
||
|
Move current tokrange to start of "Private Use Area" >
|
||
|
:MoveStartTok 0xE000
|
||
|
<
|
||
|
Move current tokrange to 190 (in file created with Vim 6.3) >
|
||
|
:MoveStartTok 190 603
|
||
|
<
|
||
|
|
||
|
==============================================================================
|
||
|
vim:tw=78:ts=8:ft=help:norl:
|