2013-08-28 6 views
7

Spesso mi ritrovo a fare qualcosa di simile, mentre in via di sviluppo:

:e <file> 
:vsplit <the_same_file> "reopen/re-edit with a vertical split 

Come alcuni soccorritori hanno fatto notare, c'è un modo molto migliore per fare questo: :vs<CR>. Supponiamo per un momento che non ci fossero.

Se fossi l'apertura di file nel mio guscio, userei l'espansione !$ storia per catturare l'ultimo argomento del comando precedente, in questo modo:

$ echo "Hello" "stackoverflow" 
Hello stackoverflow 
$ echo "I'm posting on !$" 
I'm posting on stackoverflow 

Questa espansione, e il many others like it, totalmente ridefinito il modo in cui ho usato la riga di comando. Ci sono equivalenti in vim? So che lo % alias il file corrente. E gli argomenti del comando passato?

+0

non so di eventuali equivalenze scalo a bash di '' $!. Comunque potresti essere interessato a usare 'q:' che fa apparire la finestra della riga di comando. La finestra della riga di comando mostra la cronologia degli ultimi comandi e consente all'utente di utilizzare i normali comandi vim per apportare modifiche al comando. Vedi ': h cmdwin' per maggiori informazioni. –

+0

Non penso che la riga di comando di vim abbia lo stesso set di funzioni di bash. il tuo '! $' potrebbe essere più corto in bash: ''. anche se si vuole raggiungere l'operazione all'inizio della sua domanda in vim, dopo aver aperto il file con ': e file', è possibile premere' ' quest'ultimo è più facile da premere' v' o. – Kent

+0

Puoi usare ': e%' e ': e #' per (ri) modificare il file corrente e il file precedente - sarebbe d'aiuto? –

risposta

3

Per quanto ne so Vim non ha l'espansione della cronologia.

La cosa naturale da fare è quindi utilizzare gli strumenti che Vim ci fornisce sulla linea di comando. E abbiamo opzioni!

Comandi
  • <Up> filtraggio freccia
  • editing della riga di comando
    • CTRL-W Per eliminare una parola all'indietro
    • <Left> e <Right> muoversi, CTRL-B e CTRL-E per spostarsi inizio/fine della linea
  • Utilizzare il comando e finestra q: (o CTRL-F quando già sulla riga di comando) per la storia finale potenza di editing
  • trovare soluzioni alternative idiomatiche nello spirito Vim per il problema specifico a mano
    • gettoni automaticamente espanso come % e # sono un buon esempio

Tuttavia,, se si desidera davvero un'espansione della cronologia in stile Bash, è possibile modificare qualcosa con le abbreviazioni della riga di comando <expr> in modo abbastanza semplice (almeno per i casi più semplici).

Gli elementi di espansione storia che uso più spesso (francamente non molto spesso):

  • !!, la più recente linea di comando
  • !-2, la seconda più recente linea di comando
  • !*, tutti gli argomenti ma il primo della riga di comando precedente
  • !$, l'ultimo argomento della riga di comando precedente

Ecco come si possono implementare come abbreviazioni di espressione:

cnoreabbr <expr> !! getcmdtype() == ':' ? @: : '!*' 
cnoreabbr <expr> !-2 getcmdtype() == ':' ? histget(':', -2) : '!-2' 
cnoreabbr <expr> !* getcmdtype() == ':' ? join(split(@:,'\s\+')[1:], ' ') : '!*' 
cnoreabbr <expr> !$ getcmdtype() == ':' ? split(@:,'\s\+')[-1] : '!$' 

ed ecco come il tuo esempio funzionerebbe in Vim:

:echo "Hello Stackoverflow" 
Hello Stackoverflow 
:echo "I'm posting on !$<Enter> 
I'm posting on Stackoverflow 

Naturalmente, funzioni d'uso per le espressioni più complesse se davvero decidere di percorrere questa strada.

+0

Stavo pensando che potresti fare qualcosa per elencarlo. Comunque non volevo postarlo come risposta Principalmente perché la divisione non funziona bene con le stringhe o le funzioni. – FDinoff

+0

Nel tuo esempio mi sarei aspettato che "Hello Stackoverflow" fosse sostituito come ultimo argomento. Che ovviamente non può accadere perché ti stai dividendo in spazi vuoti. – FDinoff

+0

Funziona solo in alcuni casi semplici. Ecco perché ho detto "usa le funzioni". Ma non penso che sia ragionevole (o addirittura fattibile) estrarre il '@:' e provare ad analizzare la riga di comando, limitarsi a normale modifica della riga di comando. – glts

1

L'utilizzo di :vsp senza argomenti divide la finestra corrente.

Non è esattamente quello che stai chiedendo, ma io uso spesso % che è il nome del file corrente:

:e some_file 
:vsp % 

Vedi :help cmdline-special

+0

Questo mi imposta per questo caso specifico, ma è anche solo il primo caso a cui potrei pensare quando volevo ripetere un argomento precedente o comando con un'espansione. Capita di sapere di eventuali espansioni? – Christopher

0

L'eccezionale best of VIM tips rilevare uno specifico settore in cui opera la storia ripetizione, vale a dire in sostituzioni:

" Summary of editing repeats [N] 
.  last edit (magic dot) 
:&  last substitute 
:%& last substitute every line 
:%&gic last substitute every line confirm 
g%  normal mode repeat last substitute 
g&  last substitute on all lines 
@@  last recording 
@:  last command-mode command 
:!! last :! command 
:~  last substitute 
:help repeating