Jak wyłączyć przewijanie w poziomie?

37

Mam kilka ukrytych znaków w buforze, a przewijanie w poziomie zabija wyrównanie.

Czy jest jakiś sposób, aby to wyłączyć? Nie mogłem znaleźć żadnych odpowiednich opcji.

złe demo przewijania w poziomie

Edycja: Dodano wersję demo. Możesz zobaczyć, że vim opiera przesunięcie przesunięcia na nieskrywanej części pliku, dlatego wyrównanie zostaje zerwane.

Enuy
źródło
6
Nie możesz tego wyłączyć, ale możesz:set wrap
EvergreenTree
8
@Enuy, mam na myśli to, że linie są faktycznie dłuższe niż szerokość okna, ale niektóre teksty (kody kolorów podobne do bash) są ukryte. Vim uważa, że ​​osiągnął już krawędź okna, ale wizualnie nie. Powiedziałbym, że to kwalifikuje się jako błąd.
tommcdo 10.04.15
8
@tommcdo Tak, rozumiem, co masz na myśli. Podobny jest problem z owijaniem linii, gdy przyczyną są owijki tylko ukryte części na końcu linii i otrzymało WONTFIX od Bram: code.google.com/p/vim/issues/detail?id=260
Enuy
3
Dlatego szukam alternatywnego rozwiązania - całkowicie wyłączyć przewijanie w poziomie.
Enuy
3
Najbliższe, o czym myślę, to jeśli jesteś w terminalu, możesz użyć go <c-s>do zawieszenia terminala, aby ekran się nie aktualizował. Następnie możesz na ślepo wprowadzić zmiany i wrócić do początku linii i nacisnąć, <c-q>aby wznowić. Inne być może nieprzydatne opcje: upewnij się, że ta sama liczba ukrytych znaków znajduje się między każdą widoczną postacią lub poszerz okno.
Matt Boehm,

Odpowiedzi:

2

Jak wyłączyć przewijanie w poziomie

Napisałem rozwiązanie, które wyłącza przewijanie w poziomie (poprzez riffowanie sugestii @ ЯрославРахматуллин ), ale nie sądzę, że ci się spodoba:

augroup NoScrollPlease
  autocmd!
  autocmd CursorMoved * norm!99zH
augroup END

Zapobiega to przewijaniu w prawo dzięki niewiarygodnie precyzyjnej metodzie ponownego przewijania do tyłu. *

* Ponieważ nie wiem, jak daleko przewinąłeś w prawo ani jak długie są twoje linie, przewijam dowolnie „daleko” 99 99 szerokości ekranu. Zauważ też, że nie zawracam sobie głowy sprawdzeniem, czy przewinąłeś w prawo przed przewinięciem „wstecz” w lewo. Jeśli faktycznie zamierzasz skorzystać z tego rozwiązania, możesz chcieć coś podważyć, porównując wartości getcurpos(), 'sidescroll'i 'columns'.

Dlaczego nie chcesz tego robić

Powodem, dla którego nie zamierzasz tego używać, jest to, że u podstaw problemu przewijania jest inny problem: Vim nie pozwala na przesuwanie kursora „poza ekran”. Dlatego jeśli przewiniesz w lewo w taki sposób, że po przewinięciu kursor będzie poza ekranem, Vim pomoże przesunąć kursor wraz z nim i przesunąć go w lewo.

Ponieważ jednak obliczenia używane do określania, czy kursor znajduje się na ekranie, są takie same, jak obliczania przy przewijaniu oryginalnego problemu, efektem netto jest to, że z tym „rozwiązaniem” na miejscu, jeśli spróbujesz przenieść kursor w prawo w sytuacji, która normalnie spowodowałaby przewijanie w bok, teraz kursor w ogóle nie chce się poruszać. **

** Aby być nieco bardziej precyzyjnym, w zależności od aktualnej pozycji i ruchu, kursor może przesuwać się w prawo; po prostu nie przesunie się poza pozycję, w której normalnie nastąpiłby zwój.

Inne opcje?

Więc obawiam się, że twoje zaplanowane obejście się nie powiedzie. Jeśli chcesz praktycznego rozwiązania ogólnego problemu, będzie trzeba go zaimplementować w kodzie źródłowym Vima.

Jak już zauważyłeś , jest mało prawdopodobne, że przyjedzie w najbliższym czasie, więc obawiam się, że najlepszym rozwiązaniem dla obejścia konkretnego przypadku problemu pokazanego w twoim gifie jest złożenie petycji autorowi wtyczki, aby przestał używać concealcałkowicie i zamiast tego usuń całkowicie ukryty tekst z bufora.

W oparciu o nieskryte dane wyjściowe i wzmiankę vim-plugin-AnsiEscw dokumentacji może to być coś, co można zaimplementować, ale trudno powiedzieć na pewno bez wiedzy o tym, jak działa wtyczka.

bogate
źródło
0

Jeśli masz sposób na edycję pliku, możesz zawinąć ustawienia kolorów za pomocą \[i \], jak wyjaśniono tutaj :

[...] To, co zostało zrobione, to załączyć „\ 033 [1; 33m”, który rozpoczyna żółty kolor w „[” i „]”, który mówi powłoce „wszystko między tymi uciekającymi nawiasami kwadratowymi, w tym same nawiasy, jest postacią niedrukowalną [...]

W przeciwnym razie całe kody kolorów są traktowane jako znaki i dlatego mogą być brane pod uwagę przy przewijaniu poziomym.

Nie jestem pewien, czy to jest problem, ale widząc źródło kalendarza (z syntax off) i obecne zachowanie, przypomniało mi się o tym.

padawin
źródło
Problemem nie są kolory, ale znaki ukryte przez concealfunkcję (patrz dyskusja w komentarzach).
Bogaty
Tak, rozumiem. Może jest coś, czego nie zrozumiałem dobrze, ale miałem podobny problem w bash z PS1 przy użyciu kolorowych znaków (fakt, że są to kolory nie ma znaczenia), a terminal nie wracał poprawnie w nowej linii na dobre miejsce, ponieważ liczył znaki dla kolorów jako znaki skuteczne, podczas gdy trzeba je było zignorować, ponieważ są niewidoczne. Animacja przypomniała mi o tym problemie (gdzie podział na poziomy jest wykonywany „zbyt wcześnie”, tak jakby robił to w oparciu o liczbę znaków w linii, co jest wspomniane w linku w mojej odpowiedzi).
padawin
Zgadzam się, że dwa problemy są podobne. Ale zachowanie opisane w tym pytaniu występuje z powodu sposobu, w jaki Vim liczy znaki (nie terminal), więc sugestia, którą podałeś w pierwszym akapicie, tutaj nie pomoże, obawiam się.
Bogaty
0

EDYCJA: To znany błąd, zamknięty „nie da się naprawić”: https://github.com/vim/vim/issues/260

Oryginalna odpowiedź:

Mój vim nie przewija się w poziomie, dopóki kursor nie dotknie krawędzi ekranu.

Używasz sidescrolloff?

Nie wiem, jak całkowicie wyłączyć przewijanie w poziomie, ale to ustawienie powinno sprawić, że zaczeka, aż kursor zejdzie z krawędzi:

:set sidescrolloff=0
JasonWoof
źródło
Problem ten występuje nawet 'sidescrolloff=0'ponieważ vim uważa, kursor jest już poza krawędź: opiera swoje obliczenia na jawnej postaci tekstu, nie widocznego tekstu.
Bogaty
Och, to naprawdę buggy. Znalazłem raport o błędzie na ten temat i dodałem go do mojej odpowiedzi. Opiekun vima nie chce tego naprawiać.
JasonWoof
Nie jest to poprawka dla tego błędu ... ale może możesz zaimplementować kolorowanie kalendarza za pomocą zwykłego tekstu w buforze oraz prop_type_add () i prop_add () dla kolorów / itp.
JasonWoof
Tak, to kłopot, ale ten raport o błędzie jest powodem, dla którego OP napisał to pytanie, szukając obejścia !
Bogaty