Cosa fa: open do in vim?


18

La documentazione di Vim ha questo da dire sul :opencomando:

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.

Non commenta la natura della "simulazione" e il motivo per cui questa è considerata una simulazione piuttosto che un comando reale con un comportamento diverso. Quando eseguito dalla modalità ex (Q), si comporta davvero come descritto.

Tuttavia, sembra che ci sia anche un diverso comando aperto. Se eseguito dalla normale riga di comando o dalla modalità ex con argomenti diversi, sembra essere sinonimo di :edit. Quando viene eseguito dalla modalità di comando con a /pattern/, posiziona il cursore e apparentemente corre :edit(con la posizione del cursore evidente solo se: la modifica fallisce). Può anche essere eseguita come :open /pattern/ file, che posiziona il cursore e si avvia:edit file

La mia domanda è: perché questo non è documentato? Ci sono differenze rispetto a :editquelle che non noto? Una :openvolta è stato sinonimo di :edite cambiato solo in seguito nel tentativo di rispettare a metà strada POSIX?

Risposte:


13

La "modalità aperta" di vi era utile per i terminali che avevano una sola linea, come i terminali cartacei. In modalità aperta, vi aveva una "vista a linea singola" del file. Spostando il cursore si ridisegnava l'intera riga e i caratteri eliminati venivano stampati in modo diverso.

La "simulazione" che fa vim sta semplicemente supportando il comando, facendolo agire (come dice la documentazione) :visuale dato che :visualè "altrimenti uguale a :edit", probabilmente è per questo che lo vedi agire come :edit.

Dal punto di vista del codice sorgente, :openè implementato in ex_docmd.c( ex_open()). Fa alcune cose per affrontare il caso in cui viene fornita un'espressione regolare, ma termina sempre con una chiamata a do_exedit().

L'implementazione di :edit, :badded :visualè contenuta nella ex_edit()funzione nello stesso file, e quella funzione è una chiamata diretta a do_exedit()(nient'altro). Pertanto, oltre a quando si gestisce il parametro delle espressioni regolari, viene chiamato lo stesso codice. do_exedit()è un po 'peloso e il suo comportamento è fortemente modificato in base al comando effettivo che è stato emesso, ma non controlla mai esplicitamente i token di comando per open / edit / visual. Pertanto, i tre comandi generano più o meno lo stesso codice in esecuzione do_exedit().


8

Da un'introduzione alla modifica del display con Vi :

Se ci si trova su un terminale cartaceo o su un terminale che non ha un cursore che può spostarsi dalla riga inferiore, è comunque possibile utilizzare il set di comandi di vi, ma in una modalità diversa. Quando dai un comando vi, l'editor ti dirà che sta usando la modalità aperta. Questo nome deriva dal comando open in ex, che viene utilizzato per entrare nella stessa modalità.

L'unica differenza tra modalità visiva e modalità aperta è il modo in cui il testo viene visualizzato.

In modalità aperta l'editor utilizza una finestra a riga singola nel file e lo spostamento avanti e indietro nel file provoca la visualizzazione di nuove righe, sempre al di sotto della riga corrente. Due comandi di vi funzionano diversamente in open: z e ^ R. Il comando z non accetta parametri, ma disegna piuttosto una finestra di contesto attorno alla riga corrente e quindi ritorna alla riga corrente.

Se ci si trova su un terminale cartaceo, il comando ^ R ridigiterà la riga corrente. Su tali terminali, l'editor normalmente utilizza due righe per rappresentare la riga corrente. La prima riga è una copia della riga quando hai iniziato a modificarla e lavori sulla riga sotto questa riga. Quando elimini i caratteri, l'editor digita un numero di \ 's per mostrarti i caratteri che vengono eliminati. L'editor ristampa anche la riga corrente subito dopo tali modifiche in modo da poter vedere di nuovo come appare la riga.

A volte è utile usare questa modalità su terminali molto lenti che possono supportare vi nella modalità a schermo intero. Puoi farlo inserendo ex e usando un comando open.

:openè un artefatto delle origini di Vim come clone di Vi che è completamente inutile oggi. Posso solo supporre che rimanga lì per la compatibilità POSIX.

Nonostante vaghe somiglianze, non:open è un'alternativa a nessun tratto dell'immaginazione.:edit

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.