Ich habe festgestellt, dass die Fold-Methode von vim die Effizienz der automatischen Vervollständigung beeinflusst, z. B. C-N
langsam und C-X L
in mittelgroßen Dateien mit relativ teuren Dateien schrecklich langsam ist foldexpr
.
Ich kann den Wert nicht erkennen, wenn foldexpr beim Durchlaufen der automatischen Vervollständigung konsultiert wird. Daher möchte ich dies irgendwie deaktivieren, damit ich die verwendbare automatische Vervollständigung wieder bekomme.
Irgendwelche Vorschläge?
EDIT: Testfall
Ein Testfall: Keine Plugins; und nur dies, was die minimalste mögliche foldexpr-Funktion sein muss (und völlig nutzlos ist, außer zum Zählen von Aufrufen) in .vimrc
:
let g:c = 0
function! Myfoldexpr()
let g:c = 1 + g:c
return '0'
endfunction
Starten Sie vim nun mit einem leeren Dokument. Wir kopieren die ersten 100 Zeilen von Vims eigener Hilfedatei und führen dann die automatische Vervollständigungszeile aus, wählen den 10. Vorschlag aus und sehen dann, wie oft foldexpr aufgerufen wurde.
:help
y100j:q
P:set foldexpr=Myfoldexpr()
:set fdm=expr
O<C-X><C-L><C-L><C-L><C-L><C-L><C-L><C-L><C-L><C-L><C-L><Esc>
:echo g:c
2088
Das ist eine Datei mit 100 Zeilen, mit relativ kurzen Zeilen, und der foldexpr wurde 2088 Mal aufgerufen (obwohl 100 davon beim ersten Festlegen des foldexpr ausgeführt werden). Effizientes foldexpr ist natürlich gut, aber wir Programmierer fragen viele unserer foldexpr, daher sind sie notwendigerweise nicht trivial. Wenn ihre Ausführungszeit mit mehreren Tausend multipliziert wird, können Sie zwischen Autovervollständigung oder Einzug für die Produktivität wählen . Gierig / faul sein Ich würde gerne beides benutzen können! Abgesehen von dem Versuch, einige ziemlich gut etablierte foldexpr-basierte Falt-Plugins neu zu schreiben (ich habe versucht, php-folding neu zu schreiben und nach Tagen des Versuchs, es auf einen funktionsfähigen Zustand zu optimieren, habe ich foldexpr für php aufgegeben), gibt es vielleicht eine Möglichkeit, a zu verwenden Mapping fdm=manual
vor der automatischen Vervollständigung drehen oder so?
quelle
iHello<Esc>
,g:c
wird auch die Variable auf erhöht20
, dannoWorld<Esc>
macht es das38
... Die Anzahl der Auswertungenfoldexpr
scheint also nichts mit der Verwendung der Vervollständigung zu tun zu haben ... Versuchen Sie, Vim mit einem minimalen vimrc zu laden Datei und sehen, ob das Problem immer noch auftritt, es könnte eine andere Einstellung oder ein Plugin sein.p
). Ich denke, es tut es pro Zeichen des Einfügekandidaten.Antworten:
Ich hatte vor einiger Zeit ein Problem mit der Syntaxfaltung von PHP, bei der die Eingabe
{
die nachfolgenden Faltungen störte, bis ich das entsprechende Schließen tippte}
. Ich habe irgendwo einen Vorschlag gefunden (ich glaube, es war im Vim-Wiki), die Faltmethode im Einfügemodus vorübergehend auf manuell zu setzen. Ich weiß nicht , ob dies ist à propos genug , um eine Antwort , anstatt einen Kommentar zu machen, aber Code in den Kommentaren wird abgeraten und möglicherweise können Sie es für Ihre Gegebenheiten anpassen. Hier sind die beiden relevanten Zeilen aus meiner .vimrc.quelle
Nun, das macht das:
Wir Neuzuordnung
<C-x>
zum ersten Satz desfoldmethod
zumanual
vor dem Aufruf<C-x>
und mit denCompleteDone
undInsertLeave
automatischen Befehlen zurückgesetzt wir esexpr
.Ich habe dies getestet, indem ich
<C-l>
11 Mal gedrückt habe . meineg:c
Werte:Wie ich in den Kommentaren gesagt habe: Dieser Hack sollte nicht erforderlich sein. Sie haben "relativ teure
foldexpr
s" erwähnt, ich vermute, dass dies das eigentliche Problem ist; Ich kann mir natürlich nicht sicher sein, weil du deine nicht gepostet hastfoldexpr
, aber ich denke, es lohnt sich, eine neue Frage dazu zu stellen ( "Wie kann ich diesen Foldexpr schneller machen?" ).quelle
foldexpr
ist auch für mich ziemlich langsam ... Ich bin nicht sicher, ob dies in diesem speziellen Fall verbessert werden kann, daher ist diese Problemumgehung hier möglicherweise am besten: - / Nicht sicher, warum der PHP-Foldexpr erforderlich ist? Kann die