Quel est le format de la ligne d'état par défaut?

14

J'ai lu comment mettre à jour la ligne d'état de vim ici . Et je suis en mesure de le mettre à jour avec succès.

Mais, je voudrais conserver le format de la ligne d'état par défaut de vim et y ajouter quelques informations supplémentaires, par exemple la taille du fichier, le type de fichier, etc.

La ligne d'état par défaut de Vim est:

   <file-name>                              line_num,col_num        %file

Comment pourrais-je faire ce qui suit?

  1. Je voudrais ajouter des informations après le nom du fichier
  2. Afficher le format actuel de la ligne d'état ( :set statuslinen'affiche rien)

J'ai essayé:

set statusline+=%y

Mais cela écrase toute la ligne d'état et affiche simplement le type de fichier ( %y).

Des indices?

mtk
la source
2
Si vous êtes intéressé par Vim, consultez Vi et Vim !
muru

Réponses:

15

Comme l'a dit @muru, il ne semble pas possible de simuler exactement la ligne d'état par défaut lorsqu'elle statuslineest définie comme le code de rendu qui fait des choses qui ne peuvent pas être spécifiées dans le statuslineparamètre. Il est cependant possible de se rapprocher assez près. Voici une approximation raisonnable de l'apparence de la ligne d'état par défaut lorsqu'elle rulerest activée:

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

La principale différence est le positionnement des numéros de ligne et de colonne. S'il est possible de simuler la logique d'espacement par défaut, je n'ai pas été en mesure de trouver un moyen de le faire. Ce sera peut-être assez proche de vos besoins.

J'utilise une version divisée de celle-ci .vimrcpour placer les informations de la ligne d'état Syntastic au milieu de ce qui ressemble à une ligne d'état vim normale avec une règle:

" 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%)
Laurence Gonsalves
la source
7

Le code ne définit aucune valeur sur une chaîne d'état vide, mais agit simplement en utilisant certaines valeurs par défaut. Voir src/screen.c, fonctionwin_redr_status() . Les éléments affichés sont basés sur des fonctionnalités compilées, donc pour reconstruire la ligne d'état exacte, il faudrait regarder les fonctionnalités compilées. Il pourrait être plus simple d'utiliser l'exemple de ligne d'état donné dans :h statusline:

Examples:
Emulate standard status line with 'ruler' set 
  :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
muru
la source
Que signifie le point (.) Après la largeur (14) %-14.(%l,%c%V%)?
Shamaoke
5

tl; dr

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

Bien que ma solution suggérée ne diffère pas beaucoup de celle des autres réponses, je voudrais partager une explication plus détaillée.

comportement d'origine

Voyons d'abord comment vimdessine la ligne d'état. Les fonctions responsables sont win_redr_status()et win_redr_ruler().

vimprend le tampon nom , ajoute un espace s'il y a des drapeaux à suivre (comme [Help], [Preview], [+], [RO]). Ensuite, il ajoute les drapeaux .

Normalement, il alloue 18 cellules de caractères à la règle. Si la partie du nom du tampon ne correspond pas au reste de l'espace disponible, il la vim tronque à gauche et l'ajoute <au début.

S'il y a de la place pour le clavier , il l'ajoute à la fin (aligné à droite).

Maintenant, la règle. Il se compose d'une <row>,<col>-<virtcol> partie et de la position relative (aligné à droite).

Il existe également une restriction selon laquelle la partie portant le nom du tampon doit occuper au moins la moitié de la largeur .

Solution

Prenons maintenant la valeur suggérée par les documents :

: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

Ainsi, le premier %<peut être omis, car par défaut, le nom du tampon est tronqué au début. Ensuite, il manque l'indicateur de prévisualisation ( %w). De plus, lorsque la fenêtre a moins de 18 * 2caractères de large, la partie droite occupe plus de la moitié de la ligne d'état.

Donc, au moins, nous pouvons omettre %<et ajouter %w:

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

Nous pouvons aller plus loin et nous assurer que la bonne partie ne prend pas plus de la moitié de la ligne d'état:

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

Ensuite , nous pouvons faire dépendre des caractéristiques vima été compilé avec .

if has("quickfix")
    ...
endif

Mais je dirais que ce n'est pas pratique, et la solution précédente suffirait pour la plupart des intentions. Cependant, si la dernière solution ne fonctionne pas pour vous, dites-moi ce qui ne va pas et j'essaierai d'en trouver une meilleure.


Le problème avec la solution suggérée par Laurence Gonsalves est que s'il n'y a pas de drapeaux, il y a deux espaces entre les parties gauche et droite:

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)
x-yuri
la source