Masquer certaines lignes complètement (pas de pliage)

9

Je voudrais pouvoir cacher certaines lignes dans mon tampon de ne pas apparaître du tout (et pouvoir basculer entre les voir). J'ai trouvé des questions similaires , mais elles ne résolvent pas mon problème. Je ne veux pas utiliser de plis pour cela.

Qu'est-ce que je veux exactement?

Lorsque j'ouvre un document, je souhaite que Vim ne lise pas les lignes commentées. Il devrait se comporter comme si ces lignes n'existaient pas du tout dans le document, à une seule exception près: j'ai besoin d'un indicateur visuel (par exemple dans une colonne supplémentaire sur le côté) qui me dit que c'est un commentaire qui ne s'affiche pas.

En appuyant sur une certaine combinaison de touches, je veux que tous les commentaires apparaissent (c'est-à-dire le comportement normal de Vim).

Je veux pouvoir modifier le document avec des commentaires non affichés. Lors de l'enregistrement, le document entier est enregistré avec des commentaires (ils sont toujours enregistrés 1 ligne au-dessus du texte qui était sous eux au début).

Pourquoi je veux ça?

Il détruit moins et semble visuellement plus agréable. Prenons l' .vimrcexemple - vous pouvez avoir tous les paramètres bien en dessous les uns des autres. Si vous souhaitez modifier quelque chose ou si vous ne savez pas pourquoi vous l'avez configuré de cette façon, basculez simplement vos commentaires.

cbaumhardt
la source
J'espère que cela ne vous dérange pas que je demande ... Pourquoi excluez-vous spécifiquement les plis?
Roflo
1
Bien sûr que non :) J'ai exclu les plis car je sais comment réduire les commentaires avec des plis - mais les commentaires pliés distraient toujours, gênent le flux de lecture et ne sont pas vraiment attrayants visuellement.
cbaumhardt
Je veux aussi beaucoup de choses, mais j'ai découvert qu'il est généralement préférable de s'en tenir à ce dont j'ai besoin;)
VanLaser
@cbaumhardt, vous pouvez le plier et utiliser un paramètre / fonction de «texte de pliage» personnalisé pour tout cacher
Christian Brabandt

Réponses:

8

Je ne sais pas comment réaliser exactement ce que vous voulez, seulement une partie.

Vous souhaitez masquer du texte à l'intérieur ~/.vimrc(par exemple).

Nous devons d'abord savoir quel groupe de surbrillance gère le texte que vous souhaitez masquer. Ajoutez ce mappage à votre ~/.vimrc:

map <F10> :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<'
\ . synIDattr(synID(line("."),col("."),0),"name") . "> lo<"
\ . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">"<CR>

Je l'ai pris d' ici .

Placez ensuite votre curseur sur le texte que vous souhaitez masquer, par exemple un commentaire. Puis frappez F10.
Le nom du groupe de surbrillance doit apparaître sur la ligne de commande.
Sur mon système, la sortie est:

hi<vimLineComment> trans<vimLineComment> lo<Comment>

Je pense que cela signifie que le groupe de surbrillance pour les commentaires vim est vimLineCommentet qu'il est lié à Comment. Nous voulons donc masquer le texte géré par le groupe de surbrillance vimLineComment(ou Comment).

Pour ce faire, nous pourrions utiliser la fonction de masquage ajoutée dans vim 7.3 ( :help conceal).

:syntax match vimLineComment "^\".*" conceal containedin=ALL cchar=>

Cette ligne indique à vim de rechercher le texte dont le groupe de surbrillance est vimLineCommentet qui correspond à l'expression régulière ^\".*(un début de ligne ( ^) suivi d'un guillemet double ( \") suivi de n'importe quel texte ( .*)), et de le cacher et de le remplacer partout où il se trouve ( containedin=ALL) avec le caractère >( cchar=>).
L' concealattribut de syntaxe masquera le texte que nous voulons, sauf si le curseur est dessus.

Ensuite, nous demandons à vim de masquer complètement le texte à moins qu'un caractère de remplacement personnalisé ne soit défini:

:set conceallevel=2

Il existe 4 valeurs possibles pour cette option avec 4 effets différents (voir :help conceallevel).

Comme nous ne voulons pas taper ces commandes à chaque fois, nous ajoutons une autocommande dans notre ~/.vimrc:

augroup hide_text
    autocmd!
    autocmd FileType vim :set conceallevel=2 | :syntax match vimLineComment "^\".*" conceal containedin=ALL cchar=>
augroup END

Enfin, nous ajoutons un mappage pour basculer la valeur de l' concealleveloption (entre 2 et 0; 2 = caché, 0 = affiché):

nnoremap <leader>h :<c-u>if (&conceallevel==2) \| set conceallevel=0 \| else \| set conceallevel=2 \| endif<cr>

Le résultat est que le texte doit être affiché / masqué lorsque nous frappons <leader>h.

Vous pouvez également changer la couleur du caractère de remplacement:

highlight Conceal ctermfg=<code color> guifg=#<code color>

Et vous pouvez choisir dans quel mode un commentaire sera affiché. Par exemple, si vous souhaitez qu'il s'affiche uniquement lorsque vous êtes sur sa ligne en mode insertion:

setlocal concealcursor=ncv

Cependant, je ne sais pas comment réduire toutes ces lignes cachées comme le fait la fonction de pliage, désolé.


Edit : une autre solution possible.

Vous conservez vos paramètres de pliage pour réduire les lignes que vous ne voulez pas voir et vous masquez les titres des plis, afin qu'ils ne vous distraient pas.

function! FoldingTitle()
    if (v:foldlevel>1)
        let line = repeat(' ', &sw * (v:foldlevel-1)).'>'
    else
        let line = '|'
    endif
    return line
endfunction

set foldtext=FoldingTitle()
set fillchars+=fold:\ 
set foldcolumn=3 " optional

highlight FoldColumn ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color> "optional
highlight Folded ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color> "optional

Dans ce code, nous personnalisons le titre des plis en donnant la valeur FoldingTitle()à l' foldtextoption. Cela signifie que nous pouvons changer l'apparence d'un pli à travers cette fonction. FoldingTitle()renvoie simplement un symbole pour que vous sachiez qu'il y a un pli ( >précédé de quelques espaces répétés, ou| fonction du niveau de pli).

Ensuite, nous définissons le caractère espace comme le caractère à utiliser pour remplir l'espace vide sur les lignes:

set fillchars+=fold:\ 

N'oubliez pas l'espace après la barre oblique inverse.

Enfin, nous définissons une colonne (dont la largeur est de 3) qui sera affichée sur le côté de la fenêtre et qui indiquera les plis ouverts et fermés. Nous personnalisons également la couleur de la colonne de pliage ainsi que la couleur des titres des plis. Chacune de ces 3 lignes est facultative.

set foldcolumn=3 " optional
highlight FoldColumn ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color>
highlight Folded ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color>
saginaw
la source
1
C'est vraiment génial, je ne connaissais pas la fonction de masquage. Avec votre solution, les lignes sont toujours là, mais sont complètement vides ou n'ont qu'un seul caractère - j'ai donc beaucoup moins de distraction en regardant mon code. J'espère toujours qu'il existe un moyen de ne pas montrer du tout de lignes spécifiques, mais cette solution est également bonne (bien meilleure que le pliage pour moi).
cbaumhardt
Wow, la dissimulation est vraiment géniale, vous pouvez même masquer uniquement des parties d'une ligne (pliage vertical): vim.wikia.com/wiki/Patch_to_conceal_parts_of_lines
cbaumhardt
@cbaumhardt J'ai modifié ma réponse pour inclure une autre proposition qui pourrait peut-être vous intéresser.
saginaw
La proposition dans votre modification n'est pas vraiment une option, car je veux pouvoir continuer à utiliser mon pliage normal. Mais quand je le fais, les Foldedéléments de mes plis normaux ont besoin de couleur, donc la seule option est de simplement remplir le texte de pliage pour les lignes que je veux cacher avec des espaces. Cependant, je vais toujours voir la partie soulignée ainsi que l'arrière-plan différent pour les Foldedobjets - et je ne peux pas changer cela, car j'en ai besoin pour que mes plis normaux fonctionnent.
cbaumhardt
-1

toute solution possible est d'utiliser une barre de pliage minimaliste que j'ai utilisée parce que je ne trouve pas la même solution, ci-dessous je mets une liste de commandes pour créer une barre de pliage minimaliste que vous pouvez utiliser pour les commentaires cachés, dans chaque commande j'écris ce que je fais :

définir foldtext = '+' "pour faire apparaître un + dans la référence de texte pour fold

salut plié ctermbg = AUCUN "changer la barre de pliage de couleur pour rien

: set fillchars = vert: \ |, fold: \ "(mettre un espace) no mettre un ----- dans la barre de pliage

utilisation facultative pour disparaître les commentaires

:salut! lien Commentaire Ignorer

utilisation de retour

:salut! lien Commentaire Commentaire

ramses_ATK
la source
Je suis désolé mais je ne comprends pas votre message. Je suggère d'y écrire des phrases plus rondes.
peterh