Tentu saja fakta bahwa Anda dapat melakukan refaktor pada IDE tidak ternilai harganya bagi banyak orang, saya hampir tidak pernah melakukannya ketika saya membuat kode tetapi saya mungkin mencoba melakukannya saat mengedit sumber orang lain. Bagaimana Anda menyelesaikan tugas sepele seperti itu di banyak file di Vim?
Saya menemukan plugin ini untuk refactoring Ruby, tapi bagaimana dengan bahasa "apa saja"?
vim
refactoring
Helmut Granda
sumber
sumber
Jawaban:
Saya setuju dengan paradigma 'Vim is not an IDE'. Tetapi ada kalanya tidak ada IDE. Inilah yang saya gunakan dalam situasi tersebut:
: grep,: vimgrep,: Ag,: Ggrep
Refactoring yang lebih berkaitan dengan penggantian biasa Saya biasanya menggunakan : grep pada pohon proyek saya dan kemudian merekam makro untuk melakukan refactor -: g dan: s tidak punya otak. Biasanya saya akan dengan cepat mengubah sejumlah besar file dengan sedikit usaha. Sejujurnya, saya menggunakan metode ini lebih dari yang lain.
Bergantung pada alur kerja Anda, perintah bawaan mungkin lambat / tidak nyaman. Jika Anda menggunakan git, Anda akan ingin menggunakan plugin Fugitive yang sangat baik dan
:Ggrep
perintahnya untuk hanya mencari file yang diperiksa di git. Saya juga menyukai Pencari Perak karena kecepatannya.: argdo,: cdo, dan: bufdo
: cdo dan : argdo berguna untuk menjalankan perintah vim pada satu set file.
garis komando
Ketika lebih sulit untuk menentukan daftar file yang perlu diubah melalui
:vimgrep
saya menggunakan baris perintah grep / find perintah untuk lebih dekat mengatur daftar file yang perlu saya refactor. Simpan daftar ke file teks dan gunakan:e
serta gabungan rekaman makro untuk membuat perubahan yang perlu saya buat.Saya menemukan bahwa semakin tidak berkarat saya menjaga keterampilan perekaman makro saya semakin berguna saya menemukan Vim untuk refactoring: merasa nyaman menyimpan / memulihkan dari register, menambah / mengurangi variabel penghitung register, membersihkan / menyimpan rekaman makro ke file untuk digunakan nanti, dll.
Memperbarui
Sejak menulis ini, lebih banyak videocast untuk metode yang saya jelaskan telah diterbitkan di vimcasts.org (Saya mendorong Anda untuk menonton SEMUA Vimcast! ). Untuk refactoring, jam tangan ini:
Vimgolf juga merupakan cara yang bagus untuk berlatih.
Keberadaan server Language Server Protocol sejak saya menulis jawaban ini juga membawa beberapa kemampuan refactoring ke Vim (dan editor lain). IMO mereka masih jauh dari kemampuan menyamakan kemampuan refactoring yang akan Anda lihat dalam IDE yang dibuat khusus (saya menggunakannya, dan lebih suka coc dan ALE). Lihat jawaban lain untuk pertanyaan ini untuk info lebih lanjut!
sumber
Protokol Server Bahasa (LSP)
Protokol server Bahasa berisi fitur untuk mengganti nama simbol dengan cerdas di seluruh proyek:
https://microsoft.github.io//language-server-protocol/specifications/specification-3-14/#textDocument_rename
Misalnya server bahasa berikut mendukung ini:
Anda dapat menemukan lebih banyak server bahasa di https://langserver.org/ .
Vim
Klien editor vim diperlukan untuk menggunakannya dalam vim. Ada opsi berikut:
LanguageClient-neovim (membutuhkan rust) menyarankan pemetaan:
coc.nvim (membutuhkan node.js) menyarankan pemetaan:
Ale punya
Ale tidak mendefinisikan keybindings apa pun. Ini harus dilakukan oleh pengguna.
vim-lsp memberikan perintah berikut
Mirip dengan Ale, tidak ada pemetaan yang disarankan. Namun, tentu saja Anda dapat mendefinisikannya sebagai berikut
(
<leader>r
akan diganti dengan pilihan Anda; Saya tidak tahu yang mana yang disetujui oleh sebagian besar plugin)vim-lsc memiliki pemetaan default:
Lihat juga YouCompleteMe yang memfasilitasi LSP juga.
Neovim
Neovim memiliki dukungan bawaan awal untuk lsp sejak 13.11.2019
Lihat konfigurasi umum LSP https://github.com/neovim/nvim-lsp
Namun, saya tidak tahu cara kerja penggantian nama yang cerdas. Jika seseorang mengetahui hal ini, perbarui bagian ini.
Refactorings lainnya
Saya tidak tahu apakah ada rencana untuk protokol LSP untuk mendukung refactorings yang lebih kompleks, seperti mengubah struktur kelas, menambahkan parameter ke metode / fungsi atau memindahkan metode ke kelas yang berbeda. Untuk daftar refactorings lihat https://refactoring.com/catalog/ .
sumber
coc-rename
hanya berfungsi pada buffer saat ini. Itu tidak memperbarui penggunaan nama yang diekspor secara global dalam proyek (di seluruh file).Python
Untuk bahasa python, plugin berikut menyediakan kemampuan mengganti nama 'pintar' untuk vim:
jedi-vim
( github )<leader>r
ropevim
( github )CTRL-c r r
python-mode
( github ):h pymode-rope-refactoring
sumber
Keluarga-C
Coba plugin Clighter untuk rename-refactoring untuk c-family. Ini didasarkan pada clang, tetapi ada batasan dan plugin ditandai sebagai usang.
Pemetaan yang disarankan oleh Clighter adalah
Catatan, plugin penerus clighter8 telah menghapus fungsionalitas penggantian nama di komit 24927db42 .
Jika Anda menggunakan neovim, Anda dapat melihat penjepit plugin . Itu menyarankan
sumber
Saya menulis plugin ini untuk refactoring generik. Masih membutuhkan banyak perbaikan. Suatu saat di masa mendatang saya akan mencoba untuk meninggalkan ctag yang mendukung dentang untuk refaktor C & C ++.
sumber
Plugin YouCompleteMe (YCM) (20k bintang di github)
http://ycm-core.github.io/YouCompleteMe/#the-refactorrename-new-name-subcommand
Secara default tidak ada pemetaan.
sumber
Mungkin bukan solusi yang paling elegan, tapi menurut saya sangat berguna: Saya menggunakan ECLIM untuk menghubungkan VIM dan Eclipse. Tentu saja semua pengeditan kode sumber saya dilakukan di VIM, tetapi ketika tiba waktunya untuk refactor, seseorang dapat memanfaatkan cababilitas unggul Eclipse dalam hal ini.
Cobalah.
sumber
Faktor Plugin
Ada plugin vim lain yang didedikasikan untuk refactoring yang disebut factorus yang tersedia di github .
Saat ini (2017-12), ini mendukung bahasa
sumber
Tempatkan kursor pada nama untuk refaktor dan tipe
gd(atau gDjika Anda memfaktorkan ulang variabel global).
Kemudian
cgn nama baru esc
dan
. satu kali atau lebih untuk memfaktor ulang kejadian berikutnya
atau
:%norm . untuk merefaktor semua kejadian di buffer sekaligus.
sumber
Saya menulis banyak kode C / C ++ di vim. Refactoring yang paling umum saya lakukan adalah mengganti nama variabel, nama class, dll. Biasanya saya gunakan
:bufdo :%s/source/dest/g
untuk melakukan search / replace pada file, yang hampir sama dengan rename yang disediakan oleh big IDE.Namun, dalam kasus saya, saya menemukan bahwa saya biasanya mengganti nama entitas yang serupa, dieja dalam kasus yang berbeda (yaitu CamelCase, snake_case, dll.), Jadi saya memutuskan untuk menulis utilitas kecil untuk membantu dengan jenis pencarian "smart-case" ini / ganti, itu di-host di sini . Ini adalah utilitas baris perintah, bukan plugin untuk vim, saya harap Anda dapat menemukannya berguna.
sumber
Untuk pemfaktoran ulang, jika Anda menggunakan Unite (dan seharusnya), Anda dapat menggunakan vim-qfreplace dan membuatnya sangat mudah. Lihat video ini yang menunjukkan cara kerjanya. Setelah alur kerja Anda disetel, Anda dapat membuat beberapa pemetaan untuk mengoptimalkannya (alih-alih mengetik sebagian besar hal seperti di video).
sumber
Kombinasi dua plugin: vim-ripgrep , untuk menemukan seluruh file dan meletakkan hasilnya di jendela quickfix, dan quickfix-reflector untuk menyimpan perubahan langsung di jendela quickfix dan membuatnya secara otomatis menyimpan setiap perubahan di seluruh file.
sumber
Saya akan mempertimbangkan untuk menggunakan versi spacemacs dari emacs. Ini menggunakan mode yang sama dan sebagian besar penekanan tombol seperti Vim tetapi memiliki lebih banyak add-on karena sifatnya yang jernih. Jika Anda ingin memprogram dalam C ++ Anda cukup menambahkan lapisan c ++ dan sebagian besar IDE sudah disiapkan untuk Anda. Untuk bahasa interpretasi lainnya seperti python atau bash, Anda tidak perlu meninggalkan spacemac untuk menggunakannya. Mereka bahkan memiliki cara untuk menjalankan blok kode langsung di dalam teks Anda yang bekerja sangat baik untuk pemrograman terpelajar atau pemrograman yang dapat direproduksi di mana kode dan data berada dalam file yang sama. Keduanya dilakukan sebagai teks.
Spacemacs jauh lebih berat dalam memuat awal tetapi hal tambahan yang dapat Anda lakukan dengan itu sepadan dengan beberapa detik biaya startup. Satu mode organisasi lapisan layak untuk dicoba. Ini adalah daftar outliner, programmer, pengatur waktu / agenda harian terbaik yang pernah saya gunakan.
sumber
Pergilah
Ada plugin vim https://github.com/godoctor/godoctor.vim yang membuatnya tersedia
vim-go
:GoRename
.Server bahasa
gopls
sumber