Blocca l'editing * live * in Emacs o Vim


9

jEdit supporta l'editing a blocchi, ma Emacs e Vim sembrano avere seri problemi di usabilità sullo stesso argomento. Se qualcuno potesse compilare le incognite qui sarebbe molto più sopportabile usare uno dei due editor:

  • Selezione rettangolare effettiva : dove la selezione sullo schermo è un rettangolo, non una selezione lineare che viene quindi utilizzata per calcolare una regione a cui Emacs sembra limitato.
    • jEdit: tenere premuto Ctrle selezionare.
    • Vim: fare clic Ctrl-ve selezionare.
    • Emacs: sconosciuto ; sembra che sia necessario un plugin di oltre 400 righe .
  • Modifica rettangolare live : guarda come apparirà il risultato su tutte le linee mentre modifichi dopo una selezione di blocchi.
    • jEdit: inizia a digitare e vedrai il risultato finale mentre procedi.
    • Vim: fai clic Shift-ie digita. Mostrerà il risultato finale solo sulla prima riga finché non si preme Escper uscire dalla modalità di inserimento. Sconosciuto se esiste un modo per vedere immediatamente il risultato su tutte le righe.
    • Emacs: sconosciuto ; sembra che sia l'unico modo C-x r te impostare il testo da inserire dopo aver premuto Ret.
  • Inizia e termina la selezione in posizioni esterne al testo : ad esempio, vorrei rimuovere gli N primi caratteri di ogni riga, ma la prima e l'ultima riga contengono meno di N caratteri.
  • Incolla blocco in linea : incolla il blocco copiato come se stessi incollando più righe, come in, spingi il testo già lì verso il basso , non a destra.
    • jEdit: impostazione predefinita. Per incollare un blocco come blocco devi prima fare un'altra selezione di blocchi.
    • VIM: OEscVp.
    • Emacs: sconosciuto .

La funzionalità generale di selezione dei blocchi Emacs è disponibile nel cua-modeplugin .


Apparentemente la modalità di modifica delle colonne di Emacs può eseguire una sorta di modifica del rettangolo dal vivo: youtube.com/watch?v=k-6BVjlBSVo
Tom

Solo un'osservazione sul "plugin" di emacs 400+ righe. Un addon in qualche modo simile per gedit, chiamato multi-edit ha oltre 1000 righe di codice Python. Per me, il pugin è così utile (come sono sopravvissuto senza di esso), la dimensione è accademica ... e se l'emacs funziona come pubblicizzato, sarei più che felice di usarlo, ma ho un errore di caricamento quando l'ho eseguito "command-line-normalize-file-name: Args out of range:" ", 1" :( ... È proprio quello che stavo cercando anch'io ..
Peter.O

4
Per coloro che non hanno utilizzato jEdit, spiega la tua terminologia. Non capisco cosa significhi "live" qui, che cosa sia "editing rettangolare live" o che cosa significhi "blocco blocco in linea".
Gilles 'SO- smetti di essere malvagio' il

Risposte:


7

Posso rispondere per Vim, ma non per Emacs.

Inizia e termina la selezione in posizioni esterne al testo:

:set virtualedit=blockabiliterà il comportamento desiderato. Puoi eliminare i due punti iniziali e aggiungerlo al tuo .vimrc, se lo desideri. Per maggiori informazioni, :help 'virtualedit'da Vim.

Incolla blocco in linea:

Se premi pin modalità Comando, Vim inserirà il blocco, spingendo i personaggi a destra su ogni riga. Se selezioni un altro blocco e premi p, Vim sostituirà quel blocco con il blocco incollato.

È possibile incollare un blocco "linewise" con la sequenza di tasti in modalità comando OEscVp. Ciò inserisce una linea sopra la linea corrente ( O Esc), la seleziona in modo lineare ( V), quindi incolla su di essa ( p). Potresti accorciarlo a (per esempio) ypcon una mappatura come :nmap yp O<Esc>Vp- digita letteralmente; utilizzare cinque sequenze di tasti <Esc>anziché premere il tasto Esc.


Un bel consiglio in merito virtualedit; provarlo. Informazioni sull'incollaggio in linea, vedere la domanda aggiornata per una descrizione della funzionalità prevista.
l0b0

Ho aggiornato la mia risposta con un metodo per incollare i blocchi in modo lineare.
Jander,

5

Ad esempio, vorrei rimuovere gli N primi caratteri di ogni riga, ma la prima e l'ultima riga contengono meno di N caratteri.

Emacs: avvia la selezione nella prima riga e aggiungi semplicemente il numero mancante di caratteri (ad es. Spazi) all'ultima riga e quindi usa kill-rectangle

In alternativa, vedi artist-modeo picture-modeche ti consentono di muoverti liberamente nella finestra indipendentemente dalla lunghezza della linea.

Incolla blocco in linea

Emacs: prima salva il blocco con kill-rectangle o salvandolo in un registro, quindi vai al punto di inserimento, usa delete-rectangle e quindi inserisci il rettangolo salvato.

sembra che sia necessario un plugin di oltre 400 righe

Nel caso di Emacs, perché è un problema? Un plugin può essere compilato e la filosofia di emacs è che non metti tutto nel core, ma usi i plugin per estendere l'editor.


4

Esiste una "modalità cua" fornita con Emacsen 22.1 e successive, oppure segui il link per scaricare le versioni precedenti di Emacs. C'è un breve video che introduce la funzionalità.

Per i comandi generali del rettangolo, prova a leggere il manuale , che fornisce una semplice introduzione.


emacs cua-modesembra buono! +1 .. Non sono riuscito a trovare il video che hai citato, vedi il link di Tom nei commenti immediatamente sotto la domanda, per un link a un (diverso?) Video
informativo

@fered Ooops, errore taglia / incolla, risolto.
Trey Jackson,

0

In sostanza, il modo tipico di eliminare i primi n caratteri è fare qualcosa di simile :%s/.\{0,6\}//.

%farà l'intero documento; puoi sostituirlo con una selezione o con le linee che ti interessano. Il scomando è per "sostituire". Sostituirà un'espressione regolare con qualunque cosa tu le dia e corrisponderà una sola volta su ogni riga a meno che tu non aggiunga un'opzione specifica. Il /è un delimitatore - questo può essere qualsiasi carattere, ma /di solito è usato a meno che non è vantaggioso utilizzare qualcos'altro (in modo da non dover fuggire /nel resto del comando). L'argomento dopo il primo delimitatore è un'espressione regolare che verrà utilizzata per trovare le stringhe corrispondenti nella selezione. L'argomento dopo il secondo delimitatore è quello con cui la partita verrà sostituita.

Quindi questo comando dice di trovare da 0 a 6 istanze di qualsiasi carattere e di sostituirle con nulla.


Non è quello che ho chiesto.
l0b0

Ma pensi che non sia utile per gli altri che trovano questa domanda? Penso di si, ed è per questo che l'ho messo qui.
Shawn J. Goff,
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.