Який формат лінії за замовчуванням?


14

Про те, як оновити статус vim, я читав тут . І я можу її успішно оновити.

Але я хотів би зберегти формат статусу vim за замовчуванням і просто додати до нього додаткову інформацію, наприклад розмір файлу, тип файлу тощо.

Рядок статусу Vim за замовчуванням:

   <file-name>                              line_num,col_num        %file

Як я міг зробити наступне?

  1. Я хотів би додати інформацію після імені файлу
  2. Відображення поточного формату рядка стану ( :set statuslineнічого не відображається)

Я намагався:

set statusline+=%y

Але це перезаписує весь статус стану і просто відображає тип файлу ( %y).

Якісь підказки?


2
Якщо вас цікавить Vim, зробіть замовлення Vi та Vim !
muru

Відповіді:


15

Як сказав @muru, здається, що неможливо точно імітувати рядок стану за замовчуванням, коли statuslineвстановлено як код для візуалізації, він робить те, що неможливо вказати в statuslineналаштуваннях. Однак можна досить близько наблизитися. Ось розумне наближення до того, як виглядає рядок стану за замовчуванням, коли rulerце ввімкнено:

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)

Основна відмінність - розташування номерів рядків та стовпців. Якщо є можливість імітувати логіку інтервалу між замовчуванням, я не змогла знайти спосіб це зробити. Можливо, це буде досить близько для ваших цілей.

Я використовую розділену версію цього власного, .vimrcщоб розмістити інформацію про лінію синтастичного статусу посеред того, що схоже на звичайну лінію статусу vim з лінійкою:

" start of default statusline
set statusline=%f\ %h%w%m%r\ 
" NOTE: preceding line has a trailing space character

" Syntastic statusline
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

" end of default statusline (with ruler)
set statusline+=%=%(%l,%c%V\ %=\ %P%)

7

Код не встановлює значення порожнім рядком статусу, а просто діє, використовуючи деякі параметри за замовчуванням. Дивіться src/screen.c, функціонуйтеwin_redr_status() . Показані елементи базуються на функціях, зібраних у, тому для реконструкції точної лінії стану потрібно переглянути деталі, складені в. Можливо, буде простіше використовувати приклад стану стану, наведений у :h statusline:

Examples:
Emulate standard status line with 'ruler' set 
  :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

Що означає символ крапки (.) Після ширини (14) %-14.(%l,%c%V%)?
Шамаоке

5

тл; д-р

:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P

Хоча запропоноване нами рішення не сильно відрізняється від інших відповідей, я хотів би поділитися більш детальним поясненням.

оригінальна поведінка

Спочатку давайте розберемося, як vimмалює лінію статусу. Відповідальними функціями є win_redr_status()і win_redr_ruler().

vimприймає буфер ім'я , додає простір , якщо є якісь -то прапори , щоб слідувати (як [Help], [Preview], [+], [RO]). Потім він додає до прапорам .

Зазвичай він виділяє 18 ліній клітинок для лінійки. Якщо частина імені буфера не відповідає решті наявного простору, vim скорочує його зліва і додає <на початку.

Якщо є можливість для клавішної карти , вона додає її в кінці (вирівнюється праворуч).

Тепер правитель. Він складається з <row>,<col>-<virtcol> частини та відносного положення (вирівнюється справа).

Там же обмеження , що частина з ім'ям буфера повинні по крайней мере , половину від ширини .

рішення

Тепер візьмемо значення, запропоноване документами :

:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

де

%< - where to truncate the line if too long
%f - buffer name (path to a file, or something)
%h - help flag
%m - modified flag
%r - readonly flag
%= - separater between the left (buffer name) and the right (ruler) parts
%-14.(...%) - minimum field width == 14
%l - line
%c - column
%V - virtual column
%P - percentage

Отже, спочатку %<його можна опустити, оскільки за замовчуванням назва буфера обрізається на початку. Потім у ньому відсутній прапор попереднього перегляду ( %w). Крім того, коли вікно менше, ніж 18 * 2символи, права частина займає більше половини рядка статусу.

Отже, принаймні ми можемо опустити %<та додати %w:

:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P

Ми можемо піти далі і переконатися, що права частина не займає більше половини рядка статусу:

set statusline=%!MyStatusLine()
function! MyStatusLine()
    let l:w = min([14,winwidth(0)/2-3])
    return '%f %h%w%m%r%=%-' . l:w . '.(%l,%c%V%) %P'
endfunction

Тоді ми можемо зробити це залежним від особливостей, з яких vimбуло складено .

if has("quickfix")
    ...
endif

Але я б сказав, що це не практично, і попереднього рішення було б достатньо для більшості намірів і цілей. Однак якщо останнє рішення не працює для вас, скажіть, що не так, і я спробую придумати краще.


Проблема рішення, запропонованого Лоренсом Гонсальвесом, полягає в тому, що якщо немає прапорців, між лівою та правою частинами є два пробіли:

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.