* Added [BOM] (byte-order-mark) text in file encoding info

Like in vim-airline
See https://github.com/vim-airline/vim-airline/pull/992 and fdb74f549d

Ref #2015

* Test with no text added, to check travis results

* make bom a sepaate segment
This commit is contained in:
Philip Wellnitz 2019-10-12 17:02:57 +09:00 committed by GitHub
parent f4dfe39112
commit 589461e109
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 47 additions and 34 deletions

View File

@ -5,6 +5,7 @@
"file_size": "information:unimportant", "file_size": "information:unimportant",
"file_format": "information:unimportant", "file_format": "information:unimportant",
"file_encoding": "file_format", "file_encoding": "file_format",
"file_bom": "file_format",
"file_type": "file_format", "file_type": "file_format",
"branch": "information:additional", "branch": "information:additional",
"file_scheme": "file_name", "file_scheme": "file_name",

View File

@ -92,8 +92,8 @@ def window_cached(func):
def mode(pl, segment_info, override=None): def mode(pl, segment_info, override=None):
'''Return the current vim mode. '''Return the current vim mode.
If mode (returned by ``mode()`` VimL function, see ``:h mode()`` in Vim) If mode (returned by ``mode()`` VimL function, see ``:h mode()`` in Vim)
consists of multiple characters and necessary mode is not known to powerline consists of multiple characters and necessary mode is not known to powerline
then it will fall back to mode with last character(s) ignored. then it will fall back to mode with last character(s) ignored.
:param dict override: :param dict override:
@ -123,10 +123,10 @@ def visual_range(pl, segment_info, CTRL_V_text='{rows} x {vcols}', v_text_onelin
:param str CTRL_V_text: :param str CTRL_V_text:
Text to display when in block visual or select mode. Text to display when in block visual or select mode.
:param str v_text_oneline: :param str v_text_oneline:
Text to display when in charaterwise visual or select mode, assuming Text to display when in charaterwise visual or select mode, assuming
selection occupies only one line. selection occupies only one line.
:param str v_text_multiline: :param str v_text_multiline:
Text to display when in charaterwise visual or select mode, assuming Text to display when in charaterwise visual or select mode, assuming
selection occupies more then one line. selection occupies more then one line.
:param str V_text: :param str V_text:
Text to display when in linewise visual or select mode. Text to display when in linewise visual or select mode.
@ -223,18 +223,18 @@ SCHEME_RE = re.compile(b'^\\w[\\w\\d+\\-.]*(?=:)')
def file_scheme(pl, segment_info): def file_scheme(pl, segment_info):
'''Return the protocol part of the file. '''Return the protocol part of the file.
Protocol is the part of the full filename just before the colon which Protocol is the part of the full filename just before the colon which
starts with a latin letter and contains only latin letters, digits, plus, starts with a latin letter and contains only latin letters, digits, plus,
period or hyphen (refer to `RFC3986 period or hyphen (refer to `RFC3986
<http://tools.ietf.org/html/rfc3986#section-3.1>`_ for the description of <http://tools.ietf.org/html/rfc3986#section-3.1>`_ for the description of
URI scheme). If there is no such a thing ``None`` is returned, effectively URI scheme). If there is no such a thing ``None`` is returned, effectively
removing segment. removing segment.
.. note:: .. note::
Segment will not check whether there is ``//`` just after the Segment will not check whether there is ``//`` just after the
colon or if there is at least one slash after the scheme. Reason: it is colon or if there is at least one slash after the scheme. Reason: it is
not always present. E.g. when opening file inside a zip archive file not always present. E.g. when opening file inside a zip archive file
name will look like :file:`zipfile:/path/to/archive.zip::file.txt`. name will look like :file:`zipfile:/path/to/archive.zip::file.txt`.
``file_scheme`` segment will catch ``zipfile`` part here. ``file_scheme`` segment will catch ``zipfile`` part here.
''' '''
name = buffer_name(segment_info) name = buffer_name(segment_info)
@ -250,20 +250,20 @@ def file_directory(pl, segment_info, remove_scheme=True, shorten_user=True, shor
'''Return file directory (head component of the file path). '''Return file directory (head component of the file path).
:param bool remove_scheme: :param bool remove_scheme:
Remove scheme part from the segment name, if present. See documentation Remove scheme part from the segment name, if present. See documentation
of file_scheme segment for the description of what scheme is. Also of file_scheme segment for the description of what scheme is. Also
removes the colon. removes the colon.
:param bool shorten_user: :param bool shorten_user:
Shorten ``$HOME`` directory to :file:`~/`. Does not work for files with Shorten ``$HOME`` directory to :file:`~/`. Does not work for files with
scheme. scheme.
:param bool shorten_cwd: :param bool shorten_cwd:
Shorten current directory to :file:`./`. Does not work for files with Shorten current directory to :file:`./`. Does not work for files with
scheme present. scheme present.
:param bool shorten_home: :param bool shorten_home:
Shorten all directories in :file:`/home/` to :file:`~user/` instead of Shorten all directories in :file:`/home/` to :file:`~user/` instead of
:file:`/home/user/`. Does not work for files with scheme present. :file:`/home/user/`. Does not work for files with scheme present.
''' '''
name = buffer_name(segment_info) name = buffer_name(segment_info)
@ -320,7 +320,7 @@ def file_size(pl, suffix='B', si_prefix=False):
use SI prefix, e.g. MB instead of MiB use SI prefix, e.g. MB instead of MiB
:return: file size or None if the file isnt saved or if the size is too big to fit in a number :return: file size or None if the file isnt saved or if the size is too big to fit in a number
''' '''
# Note: returns file size in &encoding, not in &fileencoding. But returned # Note: returns file size in &encoding, not in &fileencoding. But returned
# size is updated immediately; and it is valid for any buffer # size is updated immediately; and it is valid for any buffer
file_size = vim_funcs['line2byte'](len(vim.current.buffer) + 1) - 1 file_size = vim_funcs['line2byte'](len(vim.current.buffer) + 1) - 1
if file_size < 0: if file_size < 0:
@ -352,6 +352,18 @@ def file_encoding(pl, segment_info):
return vim_getbufoption(segment_info, 'fileencoding') or None return vim_getbufoption(segment_info, 'fileencoding') or None
@requires_segment_info
@add_divider_highlight_group('background:divider')
def file_bom(pl, segment_info):
'''Return BOM of the current file
:return: Byte order mark or None if unknown or missing BOM
Divider highlight group used: ``background:divider``.
'''
return 'bom' if vim_getbufoption(segment_info, 'bomb') else None
@requires_segment_info @requires_segment_info
@add_divider_highlight_group('background:divider') @add_divider_highlight_group('background:divider')
def file_type(pl, segment_info): def file_type(pl, segment_info):
@ -508,14 +520,14 @@ branch = with_docstring(VimBranchSegment(),
'''Return the current working branch. '''Return the current working branch.
:param bool status_colors: :param bool status_colors:
Determines whether repository status will be used to determine highlighting. Determines whether repository status will be used to determine highlighting.
Default: False. Default: False.
:param bool ignore_statuses: :param bool ignore_statuses:
List of statuses which will not result in repo being marked as dirty. Most List of statuses which will not result in repo being marked as dirty. Most
useful is setting this option to ``["U"]``: this will ignore repository useful is setting this option to ``["U"]``: this will ignore repository
which has just untracked files (i.e. repository with modified, deleted or which has just untracked files (i.e. repository with modified, deleted or
removed files will be marked as dirty, while just untracked files will make removed files will be marked as dirty, while just untracked files will make
segment show clean repository). Only applicable if ``status_colors`` option segment show clean repository). Only applicable if ``status_colors`` option
is True. is True.
Highlight groups used: ``branch_clean``, ``branch_dirty``, ``branch``. Highlight groups used: ``branch_clean``, ``branch_dirty``, ``branch``.
@ -575,9 +587,9 @@ trailing_whitespace_cache = None
def trailing_whitespace(pl, segment_info): def trailing_whitespace(pl, segment_info):
'''Return the line number for trailing whitespaces '''Return the line number for trailing whitespaces
It is advised not to use this segment in insert mode: in Insert mode it will It is advised not to use this segment in insert mode: in Insert mode it will
iterate over all lines in buffer each time you happen to type a character iterate over all lines in buffer each time you happen to type a character
which may cause lags. It will also show you whitespace warning each time you which may cause lags. It will also show you whitespace warning each time you
happen to type space. happen to type space.
Highlight groups used: ``trailing_whitespace`` or ``warning``. Highlight groups used: ``trailing_whitespace`` or ``warning``.
@ -625,7 +637,7 @@ def tabnr(pl, segment_info, show_current=True):
'''Show tabpage number '''Show tabpage number
:param bool show_current: :param bool show_current:
If False do not show current tabpage number. This is default because If False do not show current tabpage number. This is default because
tabnr is by default only present in tabline. tabnr is by default only present in tabline.
''' '''
try: try:
@ -681,7 +693,7 @@ if sys.version_info < (2, 7):
return fin(csv.reader(l, dialect)) return fin(csv.reader(l, dialect))
except csv.Error as e: except csv.Error as e:
if str(e) == 'newline inside string' and dialect.quotechar: if str(e) == 'newline inside string' and dialect.quotechar:
# Maybe we are inside an unfinished quoted string. Python-2.6 # Maybe we are inside an unfinished quoted string. Python-2.6
# does not handle this fine # does not handle this fine
return fin(csv.reader(l[:-1] + [l[-1] + dialect.quotechar])) return fin(csv.reader(l[:-1] + [l[-1] + dialect.quotechar]))
else: else:
@ -750,12 +762,12 @@ def csv_col_current(pl, segment_info, display_name='auto', name_format=' ({colum
Requires filetype to be set to ``csv``. Requires filetype to be set to ``csv``.
:param bool or str name: :param bool or str name:
May be ``True``, ``False`` and ``"auto"``. In the first case value from May be ``True``, ``False`` and ``"auto"``. In the first case value from
the first raw will always be displayed. In the second case it will never the first raw will always be displayed. In the second case it will never
be displayed. In thi last case ``csv.Sniffer().has_header()`` will be be displayed. In thi last case ``csv.Sniffer().has_header()`` will be
used to detect whether current file contains header in the first column. used to detect whether current file contains header in the first column.
:param str name_format: :param str name_format:
String used to format column name (in case ``display_name`` is set to String used to format column name (in case ``display_name`` is set to
``True`` or ``"auto"``). Accepts ``column_name`` keyword argument. ``True`` or ``"auto"``). Accepts ``column_name`` keyword argument.
Highlight groups used: ``csv:column_number`` or ``csv``, ``csv:column_name`` or ``csv``. Highlight groups used: ``csv:column_number`` or ``csv``, ``csv:column_name`` or ``csv``.