Załóżmy, że edytuję jakiś kod Pythona w vimie, który wygląda trochę jak:
myobj.myfunc("Some string parameter that goes on and on and on and on and sometimes doesn't"
"split very"
"neatly over different lines so that"
"it is formatted attractively")
Wolałbym sformatować to tak, aby powróciło do textwidth
ustawienia:
myobj.myfunc("Some string parameter that goes on and on and "
"on and on and sometimes doesn't split very "
"neatly over different lines so that it is "
"formatted attractively")
Czy jest na to łatwy sposób? Gdyby to był konwencjonalny akapit tekstowy gqiplub podobny, przydałby się, ale nie poradzi sobie z cudzysłowami używanymi do rozróżnienia łańcucha.
Uwaga : Pytam tutaj konkretnie o Pythona, ale idealnie, odpowiedź ta byłaby odpowiednia dla wielu rodzajów języka programowania, które pozwalają na ciąg znaków.
formatting
line-breaks
filetype-python
Andrew Ferrier
źródło
źródło
"""multi-line string"""
?Odpowiedzi:
Och, to trudne. Myślę, że najlepszym podejściem może być makro, ale bardziej prawdopodobne jest wtyczka. Oto przykład, który wymyśliłem (potrzebuję lepszego hobby). Wydawało mi się, że to działa, ale do poprawnego wcięcia potrzebna byłaby wtyczka wcięcia w Pythonie. Wypróbuj to.
Następnie możesz użyć go
:call ReformatMultiLines()
i / lub użyć go do mapowania.źródło
Jeśli jest to normalne zjawisko, najlepiej poszukaj wtyczki lub skorzystaj z funkcji @Sukima. Gdybym jednak robił to w locie, prawdopodobnie zrobiłbym to:
Dodaj nową linię za paren otwierającym i przed paren zamykającym, aby ciągi znaków znajdowały się w osobnych wierszach.
Wybierz linie z ciągami i usuń otaczające cudzysłowy:
:norm ^x$x
:set tw-=2
gvgq
:set tw+=2
gv:norm I"<Esc>A"
. Zamiast tego<Esc>
chcesz wstawić dosłowne wyjście, wpisując ctrl-v, a następnie klawisz Escape. Ponieważ mapuję jj do ucieczki, zwykle po prostu wpisuję tutaj jj.źródło
:set tw-=2
wynikiE487: Argument must be positive: tw-=2
. Czy składnia jest nieprawidłowa?:set tw?
. Domyślam się, że masz szerokość tekstu ustawioną na 0. W tych krokach założono, że szerokość tekstu zaczyna się od liczby znaków, które chcesz w wierszu.s/2/3/
dodać spację przed cytatem zamykającym, długi łańcuch nie będzie miał odpowiednich odstępów między słowami.Parsowanie i formatowanie kodu jest trudne, szczególnie w przypadku dynamicznych języków, takich jak Python.
Zamiast próbować parsować Pythona w Vimscript, zalecam użycie zewnętrznego formatera, takiego jak yapf . Z moją odpowiedzią tutaj możesz napisać to automatycznie po napisaniu za pomocą:
s:write_cmd()
Funkcja jest w innej odpowiedzi - Nie będę je dodać tutaj, więc nie będą musieli aktualizować go w dwóch miejscach, jeśli znajdę błąd :-)Można również ustawić
formatprg
nayapf
i ręcznie formatować jegq
.źródło
yapf
wydaje się nie działać. Niemniej jednak zgadzam się, że wygląda na użyteczne narzędzie.Następujące funkcje i odpowiadające im odwzorowania rozwiązały dla mnie ten problem:
źródło