Co robi: open robi w vimie?

18

Dokumentacja Vima mówi o :openpoleceniu:

This command is in Vi, but Vim only simulates it:

                                                        *:o* *:op* *:open*
:[range]o[pen]                      Works like |:visual|: end Ex mode.
                                {Vi: start editing in open mode}

:[range]o[pen] /pattern/    As above, additionally move the cursor to the
                                column where "pattern" matches in the cursor
                                line.

Vim does not support open mode, since it's not really useful.  For those
situations where ":open" would start open mode Vim will leave Ex mode, which
allows executing the same commands, but updates the whole screen instead of
only one line.

Nie komentuje natury „symulacji” i tego, dlaczego uważa się ją za symulację, a nie za prawdziwe polecenie o innym zachowaniu. Po uruchomieniu z trybu ex (Q), rzeczywiście zachowuje się jak opisano.

Wydaje się jednak, że istnieje również inne otwarte polecenie. Gdy jest uruchamiany z normalnego wiersza poleceń lub z trybu ex z różnymi argumentami, wydaje się być synonimem :edit. Po uruchomieniu z trybu poleceń za pomocą a /pattern/ustawia kursor i najwyraźniej działa :edit(pozycja kursora jest widoczna tylko wtedy, gdy: edycja się nie udaje). Można go również uruchomić jako :open /pattern/ file, który ustawia kursor i działa:edit file

Moje pytanie brzmi: dlaczego nie jest to udokumentowane? Czy są jakieś różnice od :edittego, których nie zauważam? Czy :openkiedyś był synonimem, :edita później zmienił się, próbując w połowie zachować zgodność z POSIX?

Losowo 832
źródło

Odpowiedzi:

13

„Tryb otwarty” vi był użyteczny dla terminali, które miały jedną linię, takich jak terminale drukowane. W trybie otwartym vi miał „widok pojedynczej linii” pliku. Przesuwanie kursora spowoduje przerysowanie całej linii, a znaki zostaną wydrukowane inaczej.

„Symulacja”, którą wykonuje vim, po prostu wspiera polecenie, czyniąc go działającym (jak mówi dokumentacja), :visuala ponieważ :visualjest „inaczej taki sam jak :edit”, prawdopodobnie dlatego widzisz, że zachowuje się jak :edit.

Z perspektywy kodu źródłowego :openjest implementowany w ex_docmd.c( ex_open()). Robi pewne rzeczy, aby poradzić sobie ze sprawą, w której podano wyrażenie regularne, ale zawsze kończy się wywołaniem do_exedit().

Realizacja :edit, :baddi :visualjest zawarty w ex_edit()funkcji w tym samym pliku, a funkcja jest bezpośrednie połączenie do do_exedit()(nic innego). Zatem, inaczej niż podczas obsługi parametru wyrażenia regularnego, wywoływany jest ten sam kod. do_exedit()jest nieco owłosiony, a jego zachowanie jest mocno zmodyfikowane na podstawie rzeczywistego polecenia, które zostało wydane, ale nigdy nie sprawdza jawnie tokenów poleceń pod kątem otwarcia / edycji / wizualnego. Tak więc trzy polecenia powodują uruchomienie mniej więcej tego samego kodu do_exedit().


źródło
8

Od wprowadzenia do edycji wyświetlania za pomocą Vi :

Jeśli korzystasz z terminala drukowanego lub terminalu, który nie ma kursora, który mógłby przesunąć się poza dolną linię, nadal możesz używać zestawu poleceń vi, ale w innym trybie. Kiedy wydasz polecenie vi, edytor poinformuje cię, że używa trybu otwartego. Ta nazwa pochodzi od polecenia open w ex, które służy do przejścia do tego samego trybu.

Jedyną różnicą między trybem wizualnym a trybem otwartym jest sposób wyświetlania tekstu.

W trybie otwartym edytor używa okna z pojedynczą linią do pliku, a przesuwanie się do tyłu i do przodu w pliku powoduje wyświetlanie nowych linii, zawsze poniżej bieżącej linii. Dwa polecenia vi działają inaczej w trybie otwartym: z i ^ R. Polecenie z nie pobiera parametrów, ale rysuje okno kontekstu wokół bieżącej linii, a następnie wraca do bieżącej linii.

Jeśli korzystasz z terminala, polecenie ^ R przepisze bieżącą linię. Na takich terminalach edytor zwykle używa dwóch linii do przedstawienia bieżącej linii. Pierwszy wiersz jest kopią wiersza, gdy zacząłeś go edytować i pracujesz nad wierszem poniżej tego wiersza. Podczas usuwania znaków edytor wpisuje liczbę znaków, aby wyświetlić znaki, które zostały usunięte. Edytor ponownie drukuje bieżącą linię wkrótce po takich zmianach, aby można było zobaczyć, jak linia wygląda ponownie.

Czasami przydatne jest używanie tego trybu na bardzo wolnych terminalach, które mogą obsługiwać vi w trybie pełnoekranowym. Możesz to zrobić, wpisując ex i używając polecenia open.

:openjest artefaktem pochodzenia Vima jako klonu Vi, który jest dziś zupełnie bezużyteczny. Mogę tylko założyć, że pozostaje tam dla kompatybilności z POSIX.

Pomimo podobieństw niejasne, :opento nie jest alternatywą dla :editżadnym odcinku wyobraźni.

romainl
źródło