Grok Vim movimenti e semplici modifiche


8

Sto tornando a Vim dopo aver usato Emacs per alcuni anni. Sto cercando di stimolare Vim leggendo e guardando tutorial, oltre a usarlo quotidianamente.

Durante la modifica del testo, trovo che i comandi Emacs di Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D e Alt-Backspace siano molto utili e intuitivi, consentendo modifiche locali facili e veloci mentre si lavora con testo (parole / codice).

Qual è il modo Vim di implementare funzionalità simili? Tornare in NORMALmodalità per emettere un singolo movimento, solo per accedere nuovamente alla INSERTmodalità non è ottimale.

Esempio 1: quando in INSERTmodalità per inserire (a all'inizio di un'espressione, come devo spostare alla fine dell'espressione o della riga per inserire il corrispondente )in Vim?

Esempio 2: quando si modifica il testo, è spesso possibile eliminare una parola in avanti o all'indietro durante la scrittura o la modifica di una frase o di un codice. Sarebbe insolito avere una frase / un codice perfettamente formati nella propria mente, pronti a digitare "una tantum" in anticipo; spesso una frase cambia mentre si lavora con il testo. Le restrizioni della INSERTmodalità mi stanno rendendo difficile questo tipo di editing in Vim. Non riesco a manipolare efficacemente il testo in modalità inserimento, trovandomi sempre a dover tornare alla NORMALmodalità per movimenti semplici o per eliminare le parole.

PS: Alt-F e -B spostano il cursore in avanti o indietro di una parola. Ctrl-a e -e spostano il cursore all'inizio o alla fine della riga. Alt-F cancella la parola sotto il cursore. Alt-Backspace cancella la parola prima del cursore.


1
Il modo Vim potrebbe essere quello di utilizzare un plug-in come algoritm.com.au/code/vimacs . : P Puoi includere una spiegazione di cosa fanno questi comandi in emacs? Un elenco di Ctrl / Alt / Meta-foo / bar è abbastanza insignificante per chiunque non usi emacs. E Ctrl-W cancella la parola prima del cursore. Inoltre, ho la sensazione che sia un po 'troppo ampio.
muru,

1
Se stiamo andando nel modo plugin, dovresti dare un'occhiata a github.com/tpope/vim-rsi
dkns,

3
Quando si passa dal linguaggio di programmazione "A" a "B". È meglio non scrivere "B" nello stile di "A", ma piuttosto imparare i modi di dire standard di "B" (è una dura lezione per la maggior parte degli sviluppatori). La stessa regola vale per i redattori. Non provare ad applicare il flusso di lavoro standard dell'editor "A" al tuo nuovo editor "B". Preferisco imparare i modi di usare direttamente "B". Curva di apprendimento più ampia ma molto più produttiva a lungo termine. Durante la vimmodifica trascorri la maggior parte del tempo in modalità normale, non in modalità inserimento.
Martin York,

Risposte:


6

1

È possibile ottenere queste o migliori mappature dei comandi (mignolo) molto rapidamente. Non sto raccomandando questa soluzione, ma come esempio, se vuoi spostare il cursore all'inizio della riga con <C-a>puoi eseguire la riga seguente dopo aver colpito :dalla modalità normale (o aggiungere la linea al tuo VIMRC)

inoremap <C-a> <C-o>0

oppure, se l'inizio della riga indica il primo carattere non vuoto della riga

inoremap <C-a> <C-o>^

Curioso, ho appena testato queste mappature nel buffer in cui sto scrivendo questa risposta, e sono stato confuso per un momento perché non funzionavano. Poi mi sono reso conto di essermi dimenticato di entrare nella modalità di inserimento. Ti sembra difficile lasciare la modalità di inserimento per eseguire i normali comandi di modalità. Potresti scoprire dopo aver usato Vim per un po 'che è il contrario - che indugi nella modalità normale mentre stai pensando e fai solo escursioni per inserire la modalità per occasioni particolari. Vim vale probabilmente (o principalmente) la pena di apprendere se scopri che fai più modifiche che scrivere testo.

Quindi una parte di una risposta alla tua domanda sull'esecuzione rapida dei comandi in modalità normale dalla modalità inserimento è <C-o>, che ti consente di lasciare temporaneamente la modalità inserimento per eseguire un comando in modalità normale, quindi rientrare. Leggilo a :help i_Ctrl-o. Questo è utile per comodità una tantum. Un percorso più sostenibile è probabilmente quello di provare ad abbracciare la modalità normale come impostazione predefinita per la navigazione e la modifica e accedere alla modalità di inserimento solo quando si desidera inserire manualmente nuovi caratteri nel buffer.

2

I tuoi esempi sono molto generali, quindi è difficile dare risposte specifiche. Ho intenzione di fare un esempio specifico nella speranza che si adatti o sia traducibile in qualcosa che incontri. Per il tuo numero 1, dipende da come sai dove dovrebbe andare la parentesi di chiusura. diciamo che ho una linea come

let cchar = s:cchar["atx"]

Questo è pensato per essere una linea di VimL, ​​il linguaggio di scripting di Vim, e (o qualcosa del genere) si verifica in un file di sintassi di Vim con cui attualmente non sono d'accordo. Diciamo che voglio cambiare la parte destra di questa espressione in una chiamata di funzione, forse perché la funzione fornisce valori predefiniti quando al dizionario s:ccharnon è stato ancora assegnato un valore per la "atx"chiave. Con il mio cursore (in modalità normale) sul primo carattere, 'l', potrei digitare

f=wcf[MyFunction(<Esc>$r)

In breve, questo dice

  • f=- forward to '=' (avrei potuto dirlo fs, ma probabilmente non mi fermerei abbastanza a lungo per vedere che la 's' che voglio raggiungere è la prima s sulla linea, quindi sceglierei il personaggio che è ovviamente unico, e continua da lì)
  • w - parola successiva, ora il mio cursore si trova sulla 's' di 's: cchar'
  • cf[ - passa a "["

a questo punto appare la linea

let cchar = |"atx"]

dov'è |il cursore e io sono in modalità inserimento. Quindi digito MyFunction(e lascio la modalità di inserimento ( <Esc>).

  • $- sposta il cursore alla fine della riga. Avrei potuto usare Eper la fine della parola grossa o f]per l'inoltro a "]" o qualche altro movimento, ma $prima mi venne in mente.
  • r) - sostituisci il carattere sotto il cursore con un ')'

Ora ho cambiato l'espressione di assegnazione dall'assegnazione da un dizionario script-local all'utilizzo del valore restituito di una funzione, e così facendo ho introdotto le parentesi. Non so come appaia il tuo particolare bisogno di parentesi, forse è molto diverso, nel qual caso ci sarà una diversa serie di comandi per raggiungerlo. Se mi fermassi a pensare più a lungo al mio esempio inventato, potrei trovare anche modi più efficienti per raggiungere questo obiettivo, ma chi ha tempo di mettere in pausa e pensare.

(Provalo, copia-incolla (scusa, yank-put) il testo e il comando in un buffer, e con il cursore sul primo carattere, 'f', del comando colpito y$. Ora il comando è nel tuo registro senza nome. Passa all'inizio della prima riga e premi :normal <C-r>"su a) entra in modalità riga di comando, b) inizia a eseguire un comando in modalità normale dalla riga di comando, e c) incolla ( atchoo put) il registro senza nome nella riga di comando come normale comando mode da eseguire. L'unica cosa che devi modificare nel comando è sostituire la <Esc>serie di caratteri fasulli (perché hai copiato atchoo dal tuo browser) con il codice chiave Escape reale, quindi cancellalo e premi <C-v>e poi il tuo tasto Esc. Sembrerà un po 'come^[. Ora premi Invio per eseguire il comando. Oppure ... basta digitare la stringa di tasti per testare i comandi, volevo solo mostrarti che puoi interagire con la modalità normale anche dalla modalità cmdline, e <C-v>, e <C-r>, e tutte le altre glorie del Paese delle Meraviglie. Inoltre, vedi :help Cmdline-mode.)

3

Per cancellare una parola all'indietro puoi usare la mappatura standard <C-w>(vedi :help i_Ctrl-w). Non so se esiste una mappatura predefinita per eliminare una parola in avanti, ma suppongo che potresti farne una

inoremap <C-S-w> <C-o>dw

Ancora una volta, <C-o>uscirà dalla modalità di inserimento per un comando una tantum e dw"eliminerà" il movimento "parola". Vedi :help d, :help w. Se le parole in avanti che elimini non sono parole reali ma nomi class.function #, potresti voler usare W(vedi :help W). Se sei già in gran parte in modalità normale non hai bisogno di queste mappature, basta fare dw, dbo con gli amici.

Alcuni aiutano i capitoli a guardare più da vicino

  • :help <C-o>
  • :help Insert
  • :help fe le seguenti sezioni ( F, t, T, ;e ,)
  • :help word-motions

5
La scrittura NON è lineare. Chiunque sia in grado di scrivere prosa (o codice) dall'inizio alla fine senza eseguire alcun tipo di modifica è pazzo o ha il potere di un Dio. Per il resto di noi facciamo più editing che scrivere e quindi pensare al tuo editor come eseguire prima i comandi di modifica (modalità NORMAL) e scrivere (modalità INSERT) in secondo luogo è più efficiente. E questo è il vero nodo del perché editor come Emacs, MS Word, Notepad, ecc. Hanno un approccio arretrato. È un peccato che esista il concetto senza modalità ma deve esserci un minimo comune denominatore.
Sukima,

12

Durante la modifica del testo, trovo che i comandi Emacs di Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D e Alt-Backspace siano molto utili e intuitivi, consentendo modifiche locali facili e veloci mentre si lavora con testo (parole / codice).

Per rispondere alla tua domanda sulle modifiche locali: se sei in modalità inserimento e premi ctrl-O, eseguirai il comando successivo in modalità inserimento. Può essere utile se decidi di cancellare la linea. Ci sono alcuni altri comandi nella modalità di inserimento per piccole cose, come incollare dal registro e completare automaticamente le parole. Puoi leggerli tutti con :h ins-special-keys.

Esempio 1: quando in modalità INSERT per inserire un (all'inizio di un'espressione, come devo spostare alla fine dell'espressione o della riga per inserire il corrispondente) in Vim?

Spesso c'è un modo migliore per fare le cose in modalità normale. Ad esempio, supponiamo che tu voglia racchiudere un'espressione tra parentesi. Alcune cose che si possono fare sono i(<end>), i(<esc>A), c$()<esc>P. * La cosa che preferisco implica avere uno dei "necessario" vim plugin, vim surround . Con vim-surround, è solo ys$). La cosa fantastica di tutto questo è che una volta che sai come farlo in una situazione, puoi farlo in tutte le situazioni simili. E se invece di aggiungere parentesi alla fine della riga, fossero solo tre parole? Puoi usare c3w()<esc>Po ys3w). E l'intera linea? cc()<esc>Poppure yss).

Esempio 2: quando si modifica il testo, è spesso possibile eliminare una parola in avanti o all'indietro durante la scrittura o la modifica di una frase o di un codice. Sarebbe insolito avere una frase / un codice perfettamente formati nella propria mente, pronti a digitare "una tantum" in anticipo; spesso una frase cambia mentre si lavora con il testo. Le restrizioni della modalità INSERT mi stanno rendendo difficile questo tipo di editing in Vim. Non riesco a manipolare efficacemente il testo in modalità inserimento, trovandomi sempre a dover tornare alla modalità NORMALE per movimenti semplici o eliminando parole.

Una cosa che aiuta molto è aggiungere inoremap jk <esc>al tuo vimrc. Quindi è possibile uscire dalla modalità di inserimento premendo jk. Ciò elimina la maggior parte delle spese generali dall'uscita dalla modalità di inserimento in modo da poter jk<sequenceofcommands>ieseguire i comandi senza interrompere la digitazione.


Inoltre :h ins-special-keys, controlla :h ins-special-specialper ulteriori mappature.
Lithis,

9

Alt-F, Alt-B, Ctrl-a, Ctrl-e, Alt-D e Alt-Backspace

I comandi equivalenti in modalità normale sono w, b, ^, $, dw, db. Nota la logica: dwelimina ciò che è coperto da wed dbelimina ciò che è coperto da b. Quale comando useresti per eliminare ciò che è coperto da ^? O per strapparlo?

Quella logica simile al linguaggio è il punto centrale dell'editing modale; potrebbe volerci un po 'di tempo per adattarsi ma non c'è inversione di marcia.

I comandi equivalenti in modalità di inserimento sono: <C-Right>, <C-Left>, <Home>, <End>, <C-w>e ... niente, ma è possibile creare un semplice mappatura: inoremap <C-something> <C-o>dw.

Tornare in NORMALmodalità per emettere un singolo movimento, solo per accedere nuovamente alla INSERTmodalità non è ottimale.

Infatti. L'approccio giusto è quello di accedere alla modalità di inserimento per inserire il meno testo possibile e tornare alla modalità normale il più presto possibile.

Esempio 1: quando in INSERTmodalità per inserire (a all'inizio di un'espressione, come devo spostare alla fine dell'espressione o della riga per inserire il corrispondente )in Vim?

Come in qualsiasi editor di testo o IDE o elaboratore di testi o <textarea>:

<End>)

Esempio 2: quando si modifica il testo, è spesso possibile eliminare una parola in avanti o all'indietro durante la scrittura o la modifica di una frase o di un codice. Sarebbe insolito avere una frase / un codice perfettamente formati nella propria mente, pronti a digitare "una tantum" in anticipo; spesso una frase cambia mentre si lavora con il testo. Le restrizioni della INSERTmodalità mi stanno rendendo difficile questo tipo di editing in Vim. Non riesco a manipolare efficacemente il testo in modalità inserimento, trovandomi sempre a dover tornare alla NORMALmodalità per movimenti semplici o per eliminare le parole.

Ancora una volta, la modalità di inserimento è per l' inserimento di testo. "Manipolazione del testo" e spostamento dovrebbero avvenire in modalità normale.

Si prega di porre domande più precise.


L'uso dei movimenti (come i Endtasti freccia o) in INSERTmodalità è OK?
SabreWolfy,

4
Ovviamente, tutto ciò che semplifica il tuo lavoro.
romainl,

3

Qual è il modo Vim di implementare funzionalità simili? Ritornare alla modalità NORMAL per emettere un singolo movimento, solo per accedere nuovamente alla modalità INSERT non è ottimale.

Bene, si può dire che Vim-way è di non rimanere in modalità INSERT. Il momento illuminante in Vim arriva quando ti rendi conto di come non è necessario rimanere in modalità INSERT. Esistono molti modi per inserire il testo e tutti partono dalla modalità NORMALE.

Detto questo, non sono un vero me stesso, e ho rimappato le chiavi per fare il lavoro (alla Windows):

nmap <C-BACKSPACE> dbi
nmap <C-DEL> dei
imap <C-BACKSPACE> <ESC>ldbi
imap <C-DEL> <ESC>ldei
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.