Verstecke bestimmte Linien vollständig (nicht faltbar)

9

Ich möchte in der Lage sein, bestimmte Zeilen in meinem Puffer vor dem Erscheinen zu verbergen (und das Anzeigen umschalten zu können). Ich habe ähnliche Fragen gefunden , aber sie lösen mein Problem nicht. Ich möchte dafür keine Falten verwenden.

Was will ich genau?

Wenn ich ein Dokument öffne, soll Vim keine kommentierten Zeilen einlesen. Es sollte sich so verhalten, als ob diese Zeilen im Dokument überhaupt nicht vorhanden wären, mit nur einer Ausnahme: Ich benötige eine visuelle Anzeige (z. B. in einer zusätzlichen Spalte an der Seite), die mir sagt, dass hier ein Kommentar nicht angezeigt wird.

Beim Drücken einer bestimmten Tastenkombination möchte ich, dass alle Kommentare angezeigt werden (dh normales Vim-Verhalten).

Ich möchte das Dokument mit nicht angezeigten Kommentaren ändern können. Beim Speichern wird das gesamte Dokument mit Kommentaren gespeichert (sie werden immer 1 Zeile über dem Text gespeichert, der sich am Anfang darunter befand).

Warum will ich das?

Es lenkt weniger ab und sieht optisch ansprechender aus. Nehmen Sie .vimrczum Beispiel das - Sie können alle Einstellungen schön untereinander haben. Wenn Sie etwas ändern möchten oder nicht sicher sind, warum Sie es so einstellen, schalten Sie einfach Ihre Kommentare um.

cbaumhardt
quelle
Ich hoffe, es macht Ihnen nichts aus, wenn ich Sie frage ... Warum schließen Sie Falten ausdrücklich aus?
Roflo
1
Natürlich nicht :) Ich habe Falten ausgeschlossen, weil ich weiß, wie man Kommentare mit Falten kollabiert - aber gefaltete Kommentare lenken immer noch ab, behindern den Lesefluss und sind optisch nicht wirklich ansprechend.
cbaumhardt
Ich möchte auch viele Dinge, aber ich fand heraus, dass es normalerweise besser ist, sich an das zu halten, was ich brauche;)
VanLaser
@ Baumbaumt Sie könnten es falten und eine benutzerdefinierte 'Foldtext'-Einstellung / Funktion verwenden, um alles zu verbergen
Christian Brabandt

Antworten:

8

Ich weiß nicht, wie ich genau das erreichen soll, was Sie wollen, nur einen Teil.

Sie möchten ~/.vimrcbeispielsweise Text darin ausblenden .

Zuerst müssen wir wissen, welche Markierungsgruppe den Text verarbeitet, den Sie ausblenden möchten. Fügen Sie diese Zuordnung zu Ihrem hinzu ~/.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>

Ich habe es von hier genommen .

Setzen Sie als Nächstes den Cursor auf einen Text, den Sie ausblenden möchten, z. B. einen Kommentar. Dann schlagen F10.
Der Name der Markierungsgruppe sollte in der Befehlszeile angezeigt werden.
Auf meinem System lautet die Ausgabe:

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

Ich denke, es bedeutet, dass die Highlight-Gruppe für vim-Kommentare ist vimLineCommentund dass sie mit verknüpft ist Comment. Wir möchten also den Text ausblenden, der von der Markierungsgruppe vimLineComment(oder Comment) verarbeitet wird.

Um dies zu erreichen, könnten wir die in vim 7.3 ( :help conceal) hinzugefügte Funktion zum Verbergen verwenden .

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

Diese Zeile weist vim an, Text zu suchen, dessen Markierungsgruppe ist vimLineCommentund der mit dem regulären Ausdruck ^\".*(einem Anfang einer Zeile ( ^), gefolgt von einem doppelten Anführungszeichen ( \") gefolgt von einem beliebigen Text ( .*)) übereinstimmt, und ihn überall dort auszublenden und zu ersetzen, wo er gefunden wird ( containedin=ALL) mit dem Zeichen >( cchar=>).
Das concealSyntaxattribut verbirgt den gewünschten Text, es sei denn, der Cursor befindet sich darauf.

Als nächstes weisen wir vim an, den Text vollständig auszublenden, es sei denn, es ist ein benutzerdefiniertes Ersatzzeichen definiert:

:set conceallevel=2

Für diese Option gibt es 4 mögliche Werte mit 4 verschiedenen Effekten (siehe :help conceallevel).

Da wir diese Befehle nicht jedes Mal eingeben möchten, fügen wir einen automatischen Befehl in unser ~/.vimrc:

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

Schließlich fügen wir eine Zuordnung hinzu, um den Wert der conceallevelOption umzuschalten (zwischen 2 und 0; 2 = ausgeblendet, 0 = angezeigt):

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

Das Ergebnis ist, dass der Text beim Drücken angezeigt / ausgeblendet werden sollte <leader>h.

Sie können auch die Farbe des Ersatzzeichens ändern:

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

Und Sie können wählen, in welchem ​​Modus ein Kommentar angezeigt wird. Wenn Sie beispielsweise möchten, dass es nur angezeigt wird, wenn Sie sich im Einfügemodus in der Zeile befinden:

setlocal concealcursor=ncv

Ich weiß jedoch nicht, wie ich all diese versteckten Linien reduzieren soll, wie es die Faltfunktion tut, sorry.


Bearbeiten : eine andere mögliche Lösung.

Sie behalten Ihre Falteinstellungen bei, um die Linien zu reduzieren, die Sie nicht sehen möchten, und Sie verbergen die Titel der Falten, damit Sie nicht abgelenkt werden.

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

In diesem Code passen wir den Titel der Falten an, indem wir FoldingTitle()der foldtextOption den Wert geben . Dies bedeutet, dass wir ändern können, wie eine Falte durch diese Funktion aussehen wird. Gibt FoldingTitle()nur ein Symbol zurück, damit Sie wissen, dass es eine Falte gibt ( >vor einigen wiederholten Leerzeichen oder |abhängig von der Faltebene).

Dann definieren wir das Leerzeichen als das Zeichen, mit dem der leere Raum in den Zeilen gefüllt wird:

set fillchars+=fold:\ 

Vergessen Sie nicht den Platz nach dem Backslash.

Schließlich definieren wir eine Spalte (deren Breite 3 beträgt), die an der Seite des Fensters angezeigt wird und offene und geschlossene Falten anzeigt. Wir passen auch die Farbe der Faltsäule sowie die Farbe der Titel der Falten an. Jede dieser 3 Zeilen ist optional.

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
quelle
1
Das ist wirklich toll, ich wusste nichts über die Funktion zum Verbergen. Bei Ihrer Lösung sind die Zeilen noch vorhanden, aber entweder vollständig leer oder haben nur ein Zeichen. Ich habe also viel weniger Ablenkung, wenn ich meinen Code betrachte. Ich hoffe immer noch, dass es eine Möglichkeit gibt, bestimmte Linien überhaupt nicht anzuzeigen, aber diese Lösung ist auch gut (viel besser als für mich zu falten).
cbaumhardt
Wow, verbergen ist wirklich großartig, Sie können sogar nur Teile einer Linie verbergen (vertikale Faltung): vim.wikia.com/wiki/Patch_to_conceal_parts_of_lines
cbaumhardt
@cbaumhardt Ich habe meine Antwort so bearbeitet, dass sie einen weiteren Vorschlag enthält, der Sie vielleicht interessieren könnte.
Saginaw
Der Vorschlag in Ihrer Bearbeitung ist nicht wirklich eine Option, da ich weiterhin meine normale Faltung verwenden möchte. Wenn ich dies tue, Foldedbenötigen die Elemente für meine normalen Falten Farbe. Die einzige Option besteht darin, nur den Falttext für die Linien, die ich ausblenden möchte, mit Leerzeichen zu füllen. Ich werde jedoch weiterhin den unterstrichenen Teil sowie den unterschiedlichen Hintergrund für die FoldedObjekte sehen - und das kann ich nicht ändern, da ich sie benötige, damit meine normalen Falten funktionieren.
cbaumhardt
-1

Jede mögliche Lösung ist die Verwendung einer minimalistischen Faltleiste, die ich verwendet habe, weil ich nicht die gleiche Lösung finde. Unten habe ich eine Liste von Befehlen für die Erstellung einer minimalistischen Faltleiste, die Sie für versteckte Kommentare verwenden können. In jedem Befehl schreibe ich, was ich tun soll ::

setze foldtext = '+' "für ein + in der Textreferenz für fold

hi Folded ctermbg = NONE "Farbfalzbalken für nichts ändern

: setze fillchars = vert: \ |, fold: \ "(setze ein Leerzeichen) no setze ein ----- in die Faltleiste

Optionale Verwendung zum Verschwinden von Kommentaren

:Hallo! Link Kommentar Ignorieren

Rückverwendung

:Hallo! Link Kommentar Kommentar

ramses_ATK
quelle
Es tut mir leid, aber ich kann Ihren Beitrag nicht verstehen. Ich schlage vor, mehr runde Sätze darin zu schreiben.
Peterh - Wiedereinsetzung Monica