Domanda
Come devo rinominare il mio file corrente in Vim?
Ad esempio:
- Sto modificando
person.html_erb_spec.rb
- Vorrei che fosse rinominato in
person.haml_spec.rb
- Vorrei continuare a modificare <=>
Come potrei fare per fare questo, elegantemente?
Soluzione
C'è un un piccolo plug-in che ti permette di fare questo.
Altri suggerimenti
Il comando si chiama :saveas
, ma sfortunatamente non cancellerà il tuo vecchio file, dovrai farlo manualmente. vedi :help saveas
per maggiori informazioni.
Modifica
La maggior parte delle installazioni di vim ha un esploratore di file integrato, che puoi usare per tali operazioni. Prova :Explore
in modalità comando (in realtà lo assocerei a un tasto funzione, è molto utile). È possibile rinominare i file con R
o eliminarli con D
, ad esempio. Ma premendo <F1>
in Esplora risorse otterrai una panoramica migliore.
Se usi git e hai già il plugin di tpope fugitive.vim , semplicemente:
:Gmove newname
Questo:
- Rinomina il tuo file su disco.
- Rinomina il file in git repo.
- Ricarica il file nel buffer corrente.
- Conserva la cronologia degli annullamenti.
Se il tuo file non è stato ancora aggiunto a un repository git, prima aggiungilo:
:Gwrite
- Scrivi il file durante la modifica -
:w newname
- per creare una copia. - Inizia a modificare la nuova copia -
:e#
. - (Opzionalmente) rimuove la vecchia copia -
:!rm oldname
.
Su Windows, il terzo passaggio facoltativo cambia leggermente:
- (Opzionalmente) rimuove la vecchia copia di Windows -
:!del oldname
.
Lo sto facendo con il plugin NERDTree:
:NERDTreeFind
quindi premere m
Per rinominare è possibile scegliere (m)ove the current node
e cambiare il nome del file. Inoltre ci sono opzioni come cancellare, copiare, spostare, ecc ...
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 con nome:
:!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}
Consiglierei :Rename
dal eunuch di tpope.
Include anche una serie di altri comandi utili.
Il comando Rinomina è attualmente definito come segue (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
Breve, sicuro, senza plugin:
:sav new_name
:!rm <C-R># // or !del <C-R># for windows
controllo + R , # si espanderà istantaneamente in alternate-file (percorso precedentemente modificato nella finestra corrente) prima di premere Invio . Questo ci consente di rivedere ciò che esattamente elimineremo.
L'uso di pipe |
in tal caso non è non sicuro, perché se sav
fallisce per qualsiasi motivo, #
rimarrà comunque in un'altra posizione (o in nulla). Ciò significa che !rm #
o delete(expand(#))
possono eliminare file completamente diversi!
Quindi fallo a mano con attenzione o usa una buona sceneggiatura (sono citati in molte risposte qui).
Formazione
... oppure prova a creare tu stesso una funzione / comando / script. 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 significa :Rename
senza argomento?
Sì, elimina il file nascosto in '#'!
Soluzione: è possibile utilizzare ad es. condizioni o try
dichiarazione del genere:
command! -nargs=1 Rename try | saveas <args> | call delete(expand('#')) | bd # | endtry
Test di sicurezza 1:
!rm old_name
(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: Che cosa succede se il file si trova in una posizione diversa rispetto alla tua effettiva?
Risolvilo 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>)
note
-
!rm <C-R>#
è meglio di!rm
- > non è necessario ricordare il vecchio nome -
mv
è meglio dicall delete(expand('#'))
quando farlo a mano - > vedrai cosa rimuovi effettivamente (motivo di sicurezza) -
try | code1 | code2 | tryend
in genere non è molto sicuro ...:sav
è migliore una posizione nel cestino -
:saveas
è meglio del comando shell (agnostico del sistema operativo) ma è più lungo da digitare e impossibile usare il controllo + R -
:f new_name | w
- > quando si verifica un errore durante code1, non eseguire code2 -
expand('%:p')
(o%
) equivale a <=> - vedere file_f - e conserva la cronologia degli annullamenti -
<=> fornisce l'intero percorso della posizione (<=>) o della posizione del file alternativo (<=>)
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.
sav person.haml_spec.rb | call delete(expand('#'))
C'è & # 8217; una funzione in Gary Bernhardt & # 8217 ; s .vimrc 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>
Che ne dici di questo (migliorato dal suggerimento di Jake):
:exe "!mv % newfilename" | e newfilename
Vim ha una funzione rename
, 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 Rename
ti aiuterà a rinominare rapidamente un file.
Esiste un plug-in visibilmente più grande chiamato vim-eunuch di Tim Pope che include una funzione di rinomina come così come altre chicche (elimina, 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 :)
Puoi anche usare: f seguito da: w
Non so se questa è la quot &; quot <<>> più semplice; metodo, 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 / Exit. Elenco utile dei comandi dell'editor vi su questo link
:!mv % %:h/new_name
Il registro %
contiene il nome del file corrente. '%:h'
mostra la directory 'head' contenente il file corrente, ad esempio: %:h
restituisce /abc/def
quando il percorso completo del file è abc/dev/my.txt
Questo piccolo script non è perfetto (il ritorno a capo 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>
Un altro modo è usare semplicemente netrw, che è una parte nativa di vim.
:e path/to/whatever/folder/
Quindi ci sono opzioni per cancellare, 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>
: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 #