Gibt es eine Möglichkeit, den foldexpr während der automatischen Vervollständigung zu deaktivieren?

7

Ich habe festgestellt, dass die Fold-Methode von vim die Effizienz der automatischen Vervollständigung beeinflusst, z. B. C-Nlangsam und C-X Lin 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=manualvor der automatischen Vervollständigung drehen oder so?

Kunstroboter
quelle
Haben Sie darüber nachgedacht, in die vim_dev-Liste zu posten?
lcd047
Ich werde hier alles Nützliche posten, aber hier ist der Beitrag
artfulrobot
Ich denke, Ihr Testfall ist falsch. Wenn ich eine Testdatei erstelle und Text hinzufüge (indem ich nur mache iHello<Esc>, g:cwird auch die Variable auf erhöht 20, dann oWorld<Esc>macht es das 38... Die Anzahl der Auswertungen foldexprscheint 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.
Martin Tournoij
"Ich kann den Wert nicht erkennen, wenn foldexpr beim Durchlaufen der automatischen Vervollständigung konsultiert wird." Nun, Sie fügen Text ein. Daher muss Vim neu berechnen, welche Linien gefaltet werden sollen.
Martin Tournoij
Der Testfall ist absichtlich dumm und gibt = zurück. Aber schon in der Größenordnung kann man sehen, dass etwas los ist. Zum zweiten Kommentar: Ja, aber ich denke, das sollte am Ende eines Einfügekandidaten geschehen (wie bei p). Ich denke, es tut es pro Zeichen des Einfügekandidaten.
Artfulrobot

Antworten:

4

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.

autocmd InsertEnter * if !exists('w:last_fdm') | let w:last_fdm=&foldmethod | setlocal foldmethod=manual | endif
autocmd InsertLeave,WinLeave * if exists('w:last_fdm') | let &l:foldmethod=w:last_fdm | unlet w:last_fdm | endif
jjaderberg
quelle
2

Vielleicht gibt es eine Möglichkeit, ein Mapping zu verwenden, um fdm=manualvor der automatischen Vervollständigung zu drehen, oder so?

Nun, das macht das:

inoremap <C-x> <Esc>:setlocal foldmethod=manual<CR>a<C-x>
autocmd CompleteDone * :setlocal foldmethod=expr
autocmd InsertLeave * :setlocal foldmethod=expr

Wir Neuzuordnung <C-x>zum ersten Satz des foldmethodzu manualvor dem Aufruf <C-x>und mit den CompleteDoneund InsertLeaveautomatischen Befehlen zurückgesetzt wir es expr.

Ich habe dies getestet, indem ich <C-l>11 Mal gedrückt habe . meine g:cWerte:

  • Nach dem Start von Vim: 202
  • Mit diesem Hack: 408
  • Ohne diesen Hack: 2130

Wie ich in den Kommentaren gesagt habe: Dieser Hack sollte nicht erforderlich sein. Sie haben "relativ teure foldexprs" erwähnt, ich vermute, dass dies das eigentliche Problem ist; Ich kann mir natürlich nicht sicher sein, weil du deine nicht gepostet hast foldexpr, aber ich denke, es lohnt sich, eine neue Frage dazu zu stellen ( "Wie kann ich diesen Foldexpr schneller machen?" ).

Martin Tournoij
quelle
Danke, werde das versuchen. Bezüglich spezifischer foldexpr siehe github.com/tmhedberg/SimpylFold für Python und github.com/swekaj/php-foldexpr.vim für php. Aber ja, wir sind uns beide einig, dass dies eine andere Frage ist!
Artfulrobot
@artfulrobot Der Python foldexprist 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
Syntaxdatei