Rinominare il file corrente in Vim


392

Come devo rinominare il mio file corrente in Vim?

Per esempio:

  • Sto modificando person.html_erb_spec.rb
  • Vorrei che fosse rinominato person.haml_spec.rb
  • Vorrei continuare a modificare person.haml_spec.rb

Come potrei fare per fare questo, elegantemente?

Risposte:


87

C'è un piccolo plugin che ti permette di farlo.


9
Questa versione aggiornata di Rename.vim gestisce correttamente CWD - salva sempre il file nella directory di quella originale.
sickill

48
D: "che tipo di strambo sociopatico mette spazi nel nome dir?" - A: il ragazzo che ha iniziato il progetto molto tempo fa che ora è il tuo capo ... promosso dalla codifica nella sua vera area di competenza: seguire le mode metodologiche di sviluppo e forzarle nel team.
Stabledog,

3
@AaronMahan Ho risolto Rename2.vim (ignorando la versione DelvarWorld più intelligente ma più complessa) per consentire spazi nei percorsi e lo ho biforcato qui: github.com/aehlke/vim-rename3 Sentiti libero di inviare richieste pull per funzionalità ancora più intelligenti!
aehlke,

4
@Stabledog Microsoft, a quanto pare. Program Files (x86). Ogni volta che questa directory deve essere utilizzata, deve essere racchiusa tra virgolette. Questo è molto.
JackHasaKeyboard,

5
@JackHasaKeyboard: +10. "Programmi (x86)" vince il "Nome directory peggiore di sempre in un sistema operativo privo di collegamenti simbolici". :)
Stabledog

451

Il comando si chiama :saveas, ma sfortunatamente non cancellerà il tuo vecchio file, dovrai farlo manualmente. vedi :help saveasper maggiori informazioni.

MODIFICARE:

La maggior parte delle installazioni di vim ha un esploratore di file integrato, che puoi usare per tali operazioni. Prova :Explorein modalità comando (in realtà lo assocerei a un tasto funzione, è molto utile). È possibile rinominare i file con Ro eliminarli con D, ad esempio. Ma premendo <F1>l'esploratore ti darà una migliore visione d'insieme.


6
Non penso che sia imbarazzante rispetto ad altri editor in cui normalmente non è possibile spostare un file. Invece devi andare al file manager di tua scelta, rinominare il file e tornare al tuo editor. Se sei fortunato devi chiudere e riavviare il tuo editor se non hai ricevuto la notifica di modifica del nome file.
Rafael Bugajewski,

130
Ti potrebbe piacere anche: Sesso (scorciatoia per split explore :-))
Peter Jankuliak

6
Inoltre: e aprirà explore nel riquadro corrente. Meno eccitante di: Sesso ma più efficiente;).
Josh,

56
Per l'intrepido, verticale: il sesso è: Vex.
hobbes3,

5
@Josh: E funziona per me, e non funziona per me. Uso: e per modificare altri file nella stessa finestra.
omar,

159

Se si utilizza git e hanno già plug-in del tpope fugitive.vim poi semplicemente:

:Gmove newname

Questo sarà:

  1. Rinomina il tuo file su disco.
  2. Rinomina il file in repository git.
  3. Ricarica il file nel buffer corrente.
  4. Conserva la cronologia degli annullamenti.

Se il tuo file non è stato ancora aggiunto a un repository git, prima aggiungilo:

:Gwrite

4
Le lacrime mi escono dagli occhi. La risposta perfetta!
Farid Nouri Neshat,

3
Ho sacrificato due capre in onore di questa risposta! Ma ho un piccolo problema, perché devi digitare il percorso dalla radice dell'albero di lavoro; e questo spesso diventa piuttosto lungo in qualsiasi progetto. c'è una soluzione a questo?
xo

1
È fantastico! Continuo a trovare nuove cose che il fuggitivo può fare.
Rich Churcher,

8
@xxor: come indicato nella risposta di Mesco, è possibile utilizzare Ctrl + R% per inserire il nome file corrente, che può quindi essere modificato.
deltab,

4
Per combinare alcuni commenti qui: :Gmoverichiede il percorso relativo per il nuovo nome file. Un bel modo per farlo è digitare :Gmove <ctrl-r>%quale accoda il percorso / nome file corrente.
shmup,

80

Lo sto facendo con il plugin NERDTree:

:NERDTreeFind

quindi premere m

Per rinominare è possibile scegliere (m)ove the current nodee modificare il nome del file. Inoltre ci sono opzioni come cancellare, copiare, spostare, ecc ...


1
sai cosa, questo è il modo principale in cui rinominare le cose in questi giorni
Sam Saffron,

2
Questo funziona davvero bene. Lo consiglio vivamente.
Matt Setter il

Adoro l'idea. Questo sarà il mio metodo principale per cambiare il nome del file ora.
SLN,

72
  • Scrivi il file durante la modifica - :w newname- per creare una copia.
  • Inizia a modificare la nuova copia - :e#.
  • (Opzionalmente) rimuovere la vecchia copia - :!rm oldname.

Su Windows, il terzo passaggio facoltativo cambia leggermente:

  • (Opzionalmente) rimuovere la vecchia copia di Windows - :!del oldname.

3
Uso sempre questo approccio, tuttavia, il rovescio della medaglia è che perdi il tuo albero di annullamento, quindi non puoi annullare nulla prima del: e
rampion

7
Bello. Apparentemente Ctrl-6 fa lo stesso di: e #
glenn jackman

puoi anche aprire la directory, spostare il cursore sul file e premere "D" per eliminare un file.
Peder

38
Il modo più semplice imho è 1) rinominare il buffer corrente :f newname2) salvarlo :w3) (opzionale) !rm oldname. Il vantaggio è che la cronologia degli annullamenti viene preservata.
kynan,

3
:saveasè meglio a questo proposito, @rampion - e fa quello che ha scritto @kynan.
lericson,

36

Se il file è già salvato:

:!mv {file location} {new file location}
:e {new file location}

Esempio:

:!mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala
:e src/test/scala/myNewFile.scala

Requisiti di autorizzazione:

:!sudo mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala

Salva come:

:!mv {file location} {save_as file location}
:w
:e {save_as file location} 


Per Windows non verificato

:!move {file location} {new file location}
:e {new file location}

5
Potresti almeno spiegare perché hai votato in giù questa risposta.
Benjamin,

31

Mi consiglia :Renamedi di tpope eunuco per questo.

Include anche una serie di altri comandi utili.

Il comando Rinomina è definito come segue attualmente (controlla il repository per eventuali aggiornamenti!):

command! -bar -nargs=1 -bang -complete=file Rename :
  \ let s:file = expand('%:p') |
  \ setlocal modified |
  \ keepalt saveas<bang> <args> |
  \ if s:file !=# expand('%:p') |
  \   call delete(s:file) |
  \ endif |
  \ unlet s:file

31

Puoi anche farlo usando netrw

Il comando explore apre netrw nella directory del file aperto

:E

Sposta il cursore sul file che vuoi rinominare:

R

Digita il nuovo nome, premi invio, premi y.


grande! non sapevo nemmeno del netrw.
javadba,

31

Breve, sicuro, senza plug-in:

:sav new_name
:!rm <C-R>#  // or !del <C-R># for windows

control+ R, #si espanderà istantaneamente in un file alternativo (percorso precedentemente modificato nella finestra corrente) prima di premere Enter. Questo ci consente di rivedere ciò che esattamente elimineremo. L'uso di pipe |in questo caso non è sicuro, perché se savfallisce per qualsiasi motivo, #punterà comunque verso un altro posto (o verso nulla). Ciò significa !rm #chedelete(expand(#)) può eliminare file completamente diversi! Quindi fallo a mano con attenzione o usa una buona sceneggiatura (sono citati in molte risposte qui).

educativo

... o prova a creare una funzione / comando / script tu stesso. Inizia da sth semplice come:

command! -nargs=1 Rename saveas <args> | call delete(expand('#')) | bd #

dopo la ricarica di vimrc, basta digitare :Rename new_filename. Qual è il problema con questo comando?

Test di sicurezza 1: cosa fa :Renamesenza argomento?

Sì, elimina il file nascosto in '#'!

Soluzione: è possibile utilizzare ad es. condizioni o trydichiarazioni del genere:

command! -nargs=1 Rename try | saveas <args> | call delete(expand('#')) | bd # | endtry

Il test di sicurezza 1: :Rename (senza argomento) genererà un errore:

E471: argomento richiesto

Test di sicurezza 2: cosa succede se il nome sarà lo stesso del precedente?

Test di sicurezza 3: cosa succede se il file si trova in una posizione diversa da quella effettiva?

Riparalo tu stesso. Per leggibilità puoi scriverlo in questo modo:

function! s:localscript_name(name):
  try
    execute 'saveas ' . a:name
    ...
  endtry
endfunction
command! -nargs=1 Rename call s:localscript_name(<f-args>)

Appunti

  • !rm #è meglio di !rm old_name-> non è necessario ricordare il vecchio nome

  • !rm <C-R>#è meglio di !rm #quando lo fai a mano -> vedrai cosa rimuovi effettivamente (motivo di sicurezza)

  • !rmnon è generalmente molto sicuro ... mvin una posizione di spazzatura è meglio

  • call delete(expand('#'))è meglio del comando shell (sistema operativo indipendente) ma più lungo da digitare e impossibile da usare control+R

  • try | code1 | code2 | tryend -> quando si verifica un errore durante code1, non eseguire code2

  • :sav(o :saveas) equivale a :f new_name | w- vedi file_f - e conserva la cronologia degli annullamenti

  • expand('%:p')fornisce l'intero percorso della posizione ( %) o della posizione del file alternativo ( #)



10

C'è una funzione nel .vimrc di Gary Bernhardt che gestisce questo.

function! RenameFile()
let old_name = expand('%')
let new_name = input('New file name: ', expand('%'), 'file')
if new_name != '' && new_name != old_name
    exec ':saveas ' . new_name
    exec ':silent !rm ' . old_name
    redraw!
endif
endfunction
map <leader>n :call RenameFile()<cr>

5
Sottoscrivimi tutto quello che vuoi. Almeno posso rinominare i file.
Jezen Thomas,

Questa è un'ottima risposta, non è richiesto alcun plug-in aggiuntivo.
wpp,

8
:!mv % %:h/new_name

Register %contiene il nome del file corrente. '%:h'mostra la directory 'head' contenente il file corrente, ad es .: %:hrestituisce /abc/defquando il percorso completo del file èabc/dev/my.txt


7

Che ne dici di questo (migliorato dal suggerimento di Jake):

:exe "!mv % newfilename" | e newfilename

Hmmm, dovrei chiarire che ha funzionato su MacVim ieri, ma sono stato lanciato su un server e l'ho provato oggi e il 2 ° comando non sembra essere trattato come un comando di due punti ...
Murftown,

1
In realtà ora non funziona neanche su MacVim. Torna al tavolo da disegno! :)
Murftown,

2
Dovrebbe essere:exe "!mv % newfilename" | e newfilename
Jake,

Grazie Jake, è un po 'meglio della mia soluzione. Aggiornato.
Murftown,

7

Vim ha una renamefunzione, ma sfortunatamente non mantiene la cronologia.

Il modo agnostico del sistema operativo più semplice per rinominare un file senza perdere la cronologia sarebbe:

:saveas new_file_name
:call delete(expand('#:p'))

expand('#:p') restituisce il percorso completo del file precedente.

Utilizzare :bd #se si desidera eliminare anche il file precedente dall'elenco dei buffer.

O crea un plugin

Se si desidera utilizzare un comando rapido per rinominare il file, aggiungere un nuovo file in ~ / .vim / plugin con i seguenti contenuti:

function! s:rename_file(new_file_path)
  execute 'saveas ' . a:new_file_path
  call delete(expand('#:p'))
  bd #
endfunction

command! -nargs=1 -complete=file Rename call <SID>rename_file(<f-args>)

Il comando Renameti aiuterà a rinominare rapidamente un file.


: call delete ('<Cr> #') è più facile da scrivere.
MaikoID,

7

C'è un plugin visivamente più grande chiamato -in vim- di Tim Pope che include una funzione di rinomina e alcune altre chicche (cancella, trova, salva tutto, chmod, sudo edit, ...).

Per rinominare un file in vim-eunuch:

:Move filename.ext

Rispetto a rename.vim:

:rename[!] filename.ext

Salva alcune sequenze di tasti :)


E ha davvero alcune altre funzioni molto utili!
Pierre-Adrien Buisson,

5

Per rinominare il file esistente senza usare i plugin dovresti usare il comando

:Explore

Questo comando consente di esplorare i file nella directory, eliminarli o rinominarli. di quanto dovresti passare al file necessario in explorer del Rcomando type che ti permetterà di rinominare il nome del file


3

Non so se questo è il metodo "più semplice", ma supponendo che tu abbia già salvato il tuo file (: w) invocherei la shell (: sh) e farei un semplice cp foo foo.bak Per tornare all'editor usa Ctrl-D / Esci. Elenco utile di comandi dell'editor vi su questo link


Questo copierà il file, non lo rinominerà.
inMaMil

Ah - Ho letto male "Vorrei continuare a modificare person.haml_spec.rb" Mio male!
DBMarcos99,

Suppongo che potresti:! cp foo foo.new e poi: e foo.new?
DBMarcos99,

3

Puoi anche usare: f seguito da: w


3
Questo non rimuove il vecchio file.
Keith Pinson,

1

Questo piccolo script non è perfetto (il ritorno in carrozza extra che devi premere) ma fa il lavoro.

function Rename()
  let new_file_name = input('New filename: ')
  let full_path_current_file = expand("%:p")
  let new_full_path = expand("%:p:h")."/".new_file_name
  bd    
  execute "!mv ".full_path_current_file." ".new_full_path
  execute "e ".new_full_path
endfunction                                                                                                                                                                                                                                 

command! Rename :call Rename()
nmap RN :Rename<CR>

0

Un altro modo è usare semplicemente netrw, che è una parte nativa di vim.

:e path/to/whatever/folder/

Quindi ci sono opzioni per eliminare, rinominare, ecc.

Ecco una keymap per aprire netrw nella cartella del file che stai modificando:

map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>

0

:sav newfile | !rm #

Si noti che non rimuove il vecchio file dall'elenco dei buffer. Se questo è importante per te, puoi invece utilizzare quanto segue:

:sav newfile | bd# | !rm #

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.