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?

È stato utile?

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:

  1. Rinomina il tuo file su disco.
  2. Rinomina il file in git repo.
  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
  • 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 di call 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 #

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top