development

Vim에서 리팩토링

big-blog 2020. 9. 25. 08:05
반응형

Vim에서 리팩토링


물론 IDE에서 리팩토링 할 수 있다는 사실은 많은 사람들에게 귀중한 일입니다. 코딩 할 때는 거의하지 않지만 다른 소스를 편집 할 때는 시도해 볼 수 있습니다. Vim의 여러 파일에서 이러한 사소한 작업을 어떻게 수행합니까?

Ruby 리팩토링을위한 이 플러그인찾았 지만 "모든"언어는 어떻습니까?


나는 'Vim은 IDE가 아니다'패러다임에 동의합니다. 그러나 IDE가없는 경우가 있습니다. 이러한 상황에서 내가 사용하는 것은 다음과 같습니다.

: grep, : vimgrep, : Ag, : Ggrep

정기적 인 교체와 더 많은 관련이있는 리팩토링 저는 보통 프로젝트 트리에서 : grep사용한 다음 리팩터링을 수행하기 위해 매크로기록합니다 .-: g 및 : s는 생각할 필요가 없습니다. 일반적으로 적은 노력으로 많은 수의 파일을 빠르게 수정할 수 있습니다. 솔직히 다른 것보다이 방법을 더 많이 사용합니다.

워크 플로에 따라 기본 제공 명령이 느리거나 불편할 수 있습니다. git을 사용하는 경우 훌륭한 Fugitive 플러그인과 해당 :Ggrep명령을 사용하여 git에 체크인 된 파일 만 검색 하고 싶을 것 입니다. 나는 또한 그 속도 때문에 Silver Searcher좋아한다 .

: argdo, : cdo 및 : bufdo

: cdo: argdo 는 파일 세트에 대해 vim 명령을 실행하는 데 편리합니다.

명령 줄

변경이 필요한 파일 목록을 결정하는 것이 더 어려울 때는 :vimgrep명령 줄 grep / find 명령을 사용하여 리팩터링해야하는 파일 목록을보다 면밀하게 관리합니다. 목록을 텍스트 파일에 저장하고 :e매크로 기록의 매시업을 사용하여 필요한 사항을 변경합니다.

녹슬지 않을수록 매크로 기록 기술을 유지할수록 Vim이 리팩토링에 더 유용하다는 것을 알았습니다. 레지스터에서 편안한 저장 ​​/ 복원, 레지스터 카운터 변수 증가 / 감소, 나중에 사용하기 위해 매크로 기록을 파일로 정리 / 저장하는 등.


최신 정보

제가 설명하는 방법에 대한이 비디오 캐스트를 더 많이 작성한 이후 vimcasts.org에 게시되었습니다 ( 모든 Vimcast 를 시청 하시기 바랍니다! ). 리팩토링의 경우 다음 항목을 확인하십시오.

Vimgolf 는 또한 연습하기 좋은 방법입니다.

이 답변을 작성한 이후 언어 서버 프로토콜 서버의 편재성은 Vim (및 다른 편집자)에게 리팩토링 기능을 제공했습니다. IMO는 목적에 맞게 구축 된 IDE에서 볼 수있는 리팩토링 기능의 기능과는 거리가 멀습니다 (저는이를 사용하고 coc 및 ALE를 선호합니다). 자세한 내용은이 질문에 대한 다른 답변을 참조하십시오!


C- 패밀리

  1. c-family의 이름 변경 리팩토링을 위해 플러그인 Clighter사용해보십시오 . clang을 기반으로하지만 제한 사항이 있으며 플러그인이 더 이상 사용되지 않는 것으로 표시됩니다.

    Clighter제안한 매핑은 다음과 같습니다.

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

    후속 플러그인 clighter8커밋 24927db42 에서 이름 바꾸기 기능을 제거했습니다 .

  2. neovim을 사용하는 경우 플러그인 클램프를 살펴볼 수 있습니다 . 그것은 제안

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

파이썬

를 들어 파이썬 플러그인이 제공 정력을위한 '스마트'이름 바꾸기 기능을 다음 언어 :

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

LSP (Language Server Protocol)

언어 서버 프로토콜에는 기호의 스마트 이름 바꾸기 기능이 포함되어 있습니다.

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

예를 들어 다음 언어 서버는 이것을 지원합니다.

vim 내에서 사용하려면 vim 편집기 클라이언트가 필요합니다. 다음과 같은 옵션이 있습니다.

  1. LanguageClient-neovim (requires rust) suggested mapping is:

    nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
    
  2. coc.nvim (requires node.js) suggested mapping is:

    " Remap for rename current word
    nmap <leader>rn <Plug>(coc-rename)
    
  3. vim-lsp provides following command

    :LspRename
    

    No mapping is suggested. However, of course you can define one as following

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

    (<leader>r is to be replaced by your choice; I do not know one which most plugins agree on)

  4. vim-lsc default mapping is:

    'Rename': 'gR'
    

Neovim has a pending (April 2019) pull request to support lsp out of the box:

https://github.com/neovim/neovim/pull/6856

I do not know if there are plans for the lsp protocol to support more complex refactorings, such as changing class structure, adding parameters to methods/functions or moving a method to a different class. For a list of refactorings see https://refactoring.com/catalog/.


I wrote this plugin for generic refactoring. It still requires many improvements. Sometime in the future I'll try to abandon ctags in favour of clang for C&C++ refactorings.


Maybe not the most elegant solution, but I found it very handy: I use ECLIM to connect VIM and Eclipse. Of course all my source code editing is done in VIM, but when it's time to refactor, one can take advantage of Eclipse's superior cababilities in this matter.

Give it a try.


Plugin Factorus

There is another vim plugin dedicated for refactoring called factorus which is available on github.

Currently (2017-12), it supports the languages

  • c,
  • java, and
  • python.

Plugin YouCompleteMe (YCM) (15k stars on github)

:h RefactorRename-new-name

The RefactorRename <new name> subcommand

In supported file types, this command attempts to perform a semantic rename of the identifier under the cursor. This includes renaming declarations, definitions and usages of the identifier, or any other language-appropriate action. The specific behavior is defined by the semantic engine in use.

Similar to |FixIt|, this command applies automatic modifications to your source files. Rename operations may involve changes to multiple files, which may or may not be open in Vim buffers at the time. YouCompleteMe handles all of this for you. The behavior is described in the following section.

Supported in filetypes: 'javascript' (variables only), 'typescript'

By default there is no mapping. But of course, you can define one if you like.


I write a lot of C/C++ code in vim. The most common refactoring that I do is renaming variables, class names, etc. Usually, I use :bufdo :%s/source/dest/g to do a search/replace in files, which is almost the same as renaming provided by big IDE's.
However, in my case, I found that I usually rename similar entities, spelled in different cases (i.e CamelCase, snake_case, etc.), so I decided to write a small utility to help with this kind of "smart-case" search/replace, it is hosted here. It is a command-line utility, not a plugin for vim, I hope that you can find it useful.


For refactoring, if you're using Unite (and you should), you can then use vim-qfreplace and make it extremely easy. Check this video that demonstrates how it works. Once your workflow is set, you can make some mappings to optimize it (instead of typing most things like in the video).


A combination of two plugins: vim-ripgrep, to find across files and put the results in the quickfix window, and quickfix-reflector to save the changes right in the quickfix window and have it automatically save each change across the files.


I would consider using the spacemacs version of emacs. It is uses the same modes and most keystrokes as Vim but has many more add-on because of it's lisp nature. If you want to program in C++ you just add the c++ layer and most of the IDE is just set up for you already. For other interpreted languages like python or bash you do not need to leave spacemacs to use them. They even have a way to run blocks of code directly within your text which works fantastic for literate programming or reproducible programming where the code and the data are in the same file. Both done as text.

Spacemacs is much more heavy handed in it's initial load but the additional stuff you can do with it is worth the few seconds of startup cost. One layer org-mode is worth checking it out. It is the best outliner, programmer, day timer / todo list I have ever used.


Place cursor at name to refactor and type

gd (or gD if you're refactoring a global variable).

Then

cgn new_name esc

and

. one or more times to refactor next occurrence(s)

or

:%norm . to refactor all occurrences in the buffer at once.

참고URL : https://stackoverflow.com/questions/8781975/refactoring-in-vim

반응형