Vim'de yeniden düzenleme


101

Elbette IDE'lerde yeniden düzenleme yapabilmeniz birçokları için paha biçilemez, kod yazarken bunu neredeyse hiç yapmam ama başka birinin kaynağını düzenlerken bunu yapmayı deneyebilirim. Vim'de birden çok dosyada böylesine önemsiz bir görevi nasıl başarırsınız?

Bu eklentiyi Ruby'yi yeniden düzenlemek için buldum , peki ya "herhangi" bir dil?


2
Yeniden düzenleme çok dile özgüdür. İlgilendiğiniz her dil için belirli eklentiler aramanız gerekir. Muhtemelen bazıları için eklentiler bulacaksınız, diğerleri için değil. İstediğiniz ve bulamadığınız bir tane varsa, o zaman hırslı hissediyorsanız, başlangıç ​​noktası olarak başka bir benzer dil için mevcut bir eklentiyi kullanarak bir tane yazmaya çalışabilirsiniz.
Steve Jorgensen

2
VIM, projeleri değil, tek tek dosyaları ve belki bir dizin altındaki dosyaları düzenlemek için tasarlanmıştır . IDE destekli birçok yeniden düzenleme, tüm proje genelindeki dosyaları etkileyecektir (örneğin, bir sınıfın yeniden adlandırılması). Bence bu "doğru" u, (g) VI (m) gibi bir editörle, bir şirketin veya büyük bir projenin üstesinden gelmesi gerektiğini düşündüğüm noktaya getirmenin zor olacağını düşünüyorum. Basit dize ikameleri yapmaktan kaçınmak ve hatalara (ctags bunun bir kısmını verir ) ve karşılık gelen proje türlerini (hangi dosyaların düzenleneceğini bilmek için) eğilimli hale getirmek için temelde her dili ayrıştırmaları gerekir .
Merlyn Morgan-Graham

1
Yorumlarınız için teşekkürler, bence işlerin zorlaşmaya başladığı yer burası ve VIM'i bir IDE'ye çevirmeye çalışmak, birden çok dili düzenlemek için yalnızca bir program kullanmak için zarif bir çözüm değildir. IDE'lerde bulunan bazı "gelişmiş" özellikler nedeniyle VIM'den gerçekten vazgeçmek istemiyorum.
Helmut Granda

@ MerlynMorgan-Graham - Bazı kişiler kodlarını birkaç (büyük, olabilir) dosyada saklar. Bu sorunu tamamen ortadan kaldırır.
Kale

7
@ldigas: Bu sorunun etrafında çalışır. Ancak bazı diller için (örneğin Java) önerilen uygulamalara oldukça aykırıdır. Temel olarak kod, gerçekten tam tersi olması gerektiğinde, aracın ihtiyaçlarına uyacak şekilde bükülür.
Merlyn Morgan-Graham

Yanıtlar:


79

'Vim bir IDE değildir' paradigmasına katılıyorum. Ancak IDE'nin olmadığı zamanlar vardır. İşte bu durumlarda kullandığım şey:

: grep,: vimgrep,: Ag,: Ggrep

Düzenli değiştirmelerle daha fazla ilgisi olan yeniden düzenleme genellikle kullandığım : grep proje ağacımda ve sonra yeniden düzenleyiciyi yapmak için bir makro kaydedin -: g ve: s beyinci değildir. Genellikle çok az çabayla çok sayıda dosyayı hızlıca değiştirmeme izin verir. Açıkçası, bu yöntemi diğerlerinden daha fazla kullanıyorum.

İş akışınıza bağlı olarak, yerleşik komutlar yavaş / uygunsuz olabilir. Git kullanıyorsanız, mükemmel Fugitive eklentisini ve :Ggrepkomutunu yalnızca git'e kaydedilen dosyaları aramak için kullanmak isteyeceksiniz . Silver Searcher'ı da hızı için seviyorum .

: argdo,: cdo ve: bufdo

: cdo ve : argdo , bir dizi dosya üzerinde vim komutlarını çalıştırmak için kullanışlıdır.

Komut satırı

Değişiklik gerektiren dosyaların listesini bulmak daha zor olduğunda :vimgrep, yeniden düzenlemem gereken dosyaların listesini daha yakından düzenlemek için grep / find komut satırına başvuruyorum. Listeyi bir metin dosyasına kaydedin ve :eyapmam gereken değişiklikleri yapmak için makro kayıtlarının bir karışımını kullanın .

Makro kayıt becerilerimi ne kadar az paslı tutarsam, Vim'i yeniden düzenleme için o kadar yararlı buluyorum: yazmaçlardan kaydetme / geri yükleme, kayıt sayacı değişkenlerini artırma / azaltma, makro kayıtlarını daha sonra kullanmak üzere dosyaya temizleme / kaydetme, vb.


Güncelleme

Bu anlattığım yöntemler için daha fazla video yayını yazdığından beri vimcasts.org'da yayınlandı ( TÜM Vimcast'leri izlemenizi tavsiye ederim ! ). Yeniden düzenleme için şunları izleyin:

Vimgolf ayrıca pratik yapmanın harika bir yoludur.

Bu cevabı yazdığımdan beri Dil Sunucusu Protokolü sunucularının her yerde bulunması, Vim'e (ve diğer editörlere) bazı yeniden düzenleme yetenekleri de getirdi. IMO bunlar, amaca yönelik tasarlanmış bir IDE'de göreceğiniz yeniden düzenleme yeteneklerini eşitlemekten çok uzaktır (onları kullanıyorum ve coc ve ALE'yi tercih ediyorum). Daha fazla bilgi için bu sorunun diğer yanıtlarına bakın!


13
Yeniden düzenleme, kalıp eşleştirmeden ÇOK daha fazlasıdır, bu nedenle bunu güvenli bir şekilde otomatikleştirmek için IDE'lere ihtiyaç vardır. Açıkçası, bunu manuel olarak yapabilirsiniz, ancak mevcut seçenekleri ve çoğu zaman manuel olarak yapmanın daha güvenli olduğunu göz önünde bulundurarak, neden başka bir seçeneği düşünüyorsunuz?
Cutberto Ocampo

1
@CutbertoOcampo Size bir dereceye kadar katılıyorum: bir projenin sayısız yönüne bağlı olarak (yapı, dil (ler), personel becerileri ve kaynaklar, birkaçını belirtmek gerekirse), sorununuz için uygulanabilecek harika bir yeniden düzenleme aracı OLABİLİR. Cevabım, bunun doğru olmadığı ve Vim'deki sorunu çözmek istediğiniz durumlar için geçerlidir.
dsummersl

2
sorun değil, insanların uzun süredir tercih ettikleri araçları kullanarak bir şeyler yaparken kendilerini daha rahat hissedebileceklerini ve gerçekten iyi, muhtemelen piyasadaki herhangi bir IDE'den daha iyi performans gösterebilen bazı bilgisayar korsanları olduğunu anlıyorum. -box çözümü Gerçek bir IDE'nin çoğu kullanıcı için daha iyi performans göstereceğini söyleyebilirim. % 80-20 gibi bir durumu düşünürdüm (daha da fazlası, denge IDE lehine).
Cutberto Ocampo

1
Hemen hemen her dil için bir fikir vardır. Vim veya regex ile yeniden düzenleme yapmaya çalışmak kesinlikle çılgınca geliyor. Neden denesin ki?
rulolar

1
@, rastgele bir meslektaşınızın ihtiyaç duyduğu makineyi sizin fikriniz olmayan veya yalnızca birlikte yaşayabileceğiniz ve etrafta iyi bir izlenim bırakabileceğiniz ("sadece izlenim" için değil, itibar ve gelecekteki konumunuz için) kapmak için yeterince güçlü olacak.
kanlı

29

Dil Sunucusu Protokolü (LSP)

Dil sunucusu protokolü, bir proje genelinde sembollerin akıllıca yeniden adlandırılması özelliğini içerir :

https://microsoft.github.io//language-server-protocol/specifications/specification-3-14/#textDocument_rename

Örneğin aşağıdaki dil sunucusu bunu desteklemektedir:

Https://langserver.org/ altında daha fazla dil sunucusu bulabilirsiniz .

Vim

Bunları vim içinde kullanmak için bir vim editörü istemcisi gereklidir. Aşağıdaki seçenekler mevcuttur:

  1. LanguageClient-neovim (pas gerektirir) eşlemeyi önerir:

     nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
    
  2. coc.nvim ( node.js gerektirir), eşlemeyi önerir:

     " Remap for rename current word
     nmap <leader>rn <Plug>(coc-rename)
    
  3. Ale var

     nnoremap <silent> <Plug>(ale_rename) :ALERename<Return>
    

    Ale herhangi bir tuş atamasını tanımlamaz. Bu, kullanıcı tarafından yapılmalıdır.

  4. vim-lsp aşağıdaki komutu sağlar

     :LspRename
    

Ale'ye benzer şekilde eşleştirme önerilmemektedir. Ancak elbette bir tanesini şu şekilde tanımlayabilirsiniz:

    nmap <leader>r <plug>(lsp-rename)

( <leader>rsizin seçiminizle değiştirilecektir; çoğu eklentinin hangi konuda hemfikir olduğunu bilmiyorum)

  1. vim-lsc'nin varsayılan bir eşlemesi vardır:

     'Rename': 'gR'
    

Ayrıca LSP'leri de kolaylaştıran YouCompleteMe'ye bakın .

Neovim

Neovim, 13.11.2019'dan beri lsp için ilk yerleşik desteğe sahip

LSP'lerin ortak yapılandırmaları için bakın https://github.com/neovim/nvim-lsp

Ancak, akıllı yeniden adlandırmanın nasıl çalıştığını anlayamadım. Birisi bunu biliyorsa, lütfen bu bölümü güncelleyin.

Diğer Yeniden Düzenlemeler

Sınıf yapısını değiştirmek, yöntemlere / işlevlere parametreler eklemek veya bir yöntemi farklı bir sınıfa taşımak gibi daha karmaşık yeniden düzenlemeleri desteklemek için LSP protokolü için planlar olup olmadığını bilmiyorum. Yeniden düzenleme listesi için bkz. Https://refactoring.com/catalog/ .


Maalesef, LSP'de yeniden düzenleme desteği, son teknolojiye kıyasla şu anda oldukça zayıf. github.com/Microsoft/language-server-protocol/issues/61
Mickael

2
İçin yeniden adlandıran AFAIK coc-renameyalnızca geçerli arabellekte çalışır. Dışa aktarılan adın genel olarak projede (dosyalar arasında) kullanımını güncellemedi.
oligofren

16

Python

İçin piton eklentileri sağlamak vim için 'akıllı' adlandırma yetenekleri aşağıdaki dili:

  • jedi-vim( github )<leader>r
  • ropevim( github )CTRL-c r r
  • python-mode( github ):h pymode-rope-refactoring

13

C-Ailesi

  1. C-ailesi için yeniden adlandırmak için Clighter eklentisini deneyin . Clang'a dayalıdır, ancak sınırlamalar vardır ve eklenti kullanımdan kaldırıldı olarak işaretlenmiştir.

    Öneren haritalama Clighter olduğunu

     nmap <silent> <Leader>r :call clighter#Rename()<CR>
    

    Ardıl eklenti clighter8 , 24927db42 kaydetmede yeniden adlandırma işlevini kaldırdı .

  2. Neovim kullanıyorsanız, eklenti kıskacına bir göz atabilirsiniz . Öneriyor ki

     nmap <silent> <Leader>r :call ClampRename()<CR>
    

5

Bu eklentiyi genel yeniden düzenleme için yazdım . Hala birçok iyileştirme gerektiriyor. Gelecekte, C & C ++ yeniden düzenlemeleri için clang lehine ctag'leri terk etmeye çalışacağım.


5

Eklenti YouCompleteMe (YCM) (github'da 20 bin yıldız)

http://ycm-core.github.io/YouCompleteMe/#the-refactorrename-new-name-subcommand

:h RefactorRename-new-name

Desteklenen dosya türlerinde, bu komut, imlecin altındaki tanımlayıcının anlamsal olarak yeniden adlandırılmasını sağlamaya çalışır. Bu, tanımlayıcının bildirimlerini, tanımlarını ve kullanımlarını veya dile uygun başka herhangi bir eylemi yeniden adlandırmayı içerir. Spesifik davranış, kullanımdaki anlamsal motor tarafından tanımlanır.

Benzer şekilde FixIt, bu komut kaynak dosyalarınıza otomatik değişiklikler uygular. Yeniden adlandırma işlemleri, o anda Vim arabelleklerinde açık olan veya olmayan birden çok dosyada değişiklik içerebilir. YouCompleteMe tüm bunları sizin için halleder. Davranış aşağıdaki bölümde açıklanmaktadır.

Dosya türlerinde desteklenir: c, cpp, objc, objcpp, cuda, java, javascript, typescript, rust, cs

Varsayılan olarak eşleştirme yoktur.


Yani şimdilik bu sadece javascript, typcript ve java için mi çalışıyor?
SR

Bunun C-Ailesinde (clangd kullanarak) birden fazla dosyada çalışmasını sağlamak için bunu .vimrc dosyanıza eklemeniz gerekir: let g: ycm_clangd_args = ['-cross-file-rename']
jav

4

Belki en zarif çözüm değil, ama çok kullanışlı buldum: VIM ve Eclipse'i bağlamak için ECLIM kullanıyorum . Elbette tüm kaynak kod düzenlemem VIM'de yapılıyor, ancak yeniden düzenleme zamanı geldiğinde, Eclipse'in bu konudaki üstün özelliklerinden yararlanılabilir.

Bir şans ver.


3

Eklenti Faktörü

Başka vim eklenti olarak adlandırılan üstlenmeden için ayrılmış bulunmaktadır factorus üzerinde kullanılabilir olduğu github .

Şu anda (2017-12), dilleri destekliyor

  • c,
  • java ve
  • python.

2

Yeniden düzenlemek ve yazmak için imleci ismin üzerine getirin

gd(veya gDbir genel değişkeni yeniden düzenliyorsanız).

Sonra

cgn yeni isim esc

ve

. sonraki olayları yeniden düzenlemek için bir veya daha fazla kez

veya

:%norm . tampondaki tüm olayları bir defada yeniden düzenlemek için.


1

Vim'de çok fazla C / C ++ kodu yazıyorum. Yaptığım en yaygın yeniden düzenleme, değişkenleri, sınıf adlarını vb. Yeniden adlandırmaktır. Genellikle, :bufdo :%s/source/dest/gbüyük IDE'ler tarafından sağlanan yeniden adlandırmayla neredeyse aynı olan dosyalarda arama / değiştirme yapmak için kullanırım .
Bununla birlikte, benim durumumda, genellikle benzer varlıkları yeniden adlandırdığımı, farklı durumlarda yazdığımı (örneğin, CamelCase, snake_case, vb.) Fark ettim, bu yüzden bu tür "akıllı durum" aramasına yardımcı olacak küçük bir yardımcı program yazmaya karar verdim / değiştirin, burada barındırılıyor . Bu bir komut satırı yardımcı programıdır, vim için bir eklenti değildir, umarım onu ​​yararlı bulursunuz.


0

Yeniden düzenleme için, Unite kullanıyorsanız (ve kullanmalısınız ), vim-qfreplace'i kullanabilir ve bunu son derece kolaylaştırabilirsiniz. Nasıl çalıştığını gösteren bu videoyu kontrol edin . İş akışınız ayarlandıktan sonra, onu optimize etmek için bazı eşlemeler yapabilirsiniz (videodaki gibi çoğu şeyi yazmak yerine).


0

İki eklentinin birleşimi: dosyalar arasında bulmak ve sonuçları quickfix penceresine koymak için vim-ripgrep ve değişiklikleri doğrudan quickfix penceresine kaydetmek ve her değişikliği dosyalara otomatik olarak kaydetmek için quickfix-reflektör .


0

Emacs'ın spacemacs sürümünü kullanmayı düşünürdüm. Vim ile aynı modları ve çoğu tuş vuruşunu kullanır, ancak lisp doğası nedeniyle daha birçok eklentiye sahiptir. C ++ ile programlamak istiyorsanız, sadece c ++ katmanını ekleyin ve IDE'nin çoğu sizin için zaten ayarlanmıştır. Python veya bash gibi diğer yorumlanan diller için bunları kullanmak için boşluk bırakmanıza gerek yoktur. Hatta doğrudan metninizin içinde kod bloklarını çalıştırmanın bir yolu vardır; bu, kodun ve verilerin aynı dosyada olduğu okuryazar programlama veya yeniden üretilebilir programlama için harika çalışır. Her ikisi de metin olarak yapılır.

Spacemacs, ilk yüklemesinde çok daha ağırdır, ancak onunla yapabileceğiniz ek şeyler, başlangıç ​​maliyetinin birkaç saniyesine değer. Tek katmanlı kuruluş modu, kontrol etmeye değer. Şimdiye kadar kullandığım en iyi outliner, programcı, gün zamanlayıcı / yapılacaklar listesi.


0

Git

  1. Araç godoctor ( github ) birkaç yeniden düzenleme özelliğini destekler
  • Adını değiştirmek
  • Ayıklama İşlevi
  • Yerel Değişkeni Çıkarın
  • Değişken ⇔: = arasında geçiş yap
  • Godoc taslakları ekle

Bunları kullanıma sunan bir vim eklentisi https://github.com/godoctor/godoctor.vim var

İmleç yeniden adlandırılacak şeyin içindeyken:

:Rename <newname>

Çıkarılacak vurgulama bloğu:

:Refactor extract newfunc
  1. vim-go

    • İle tanımlayıcıların hassas tür güvenli yeniden adlandırılması :GoRename.
  2. Dil sunucusu gopls

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.