[vim] 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를 선호합니다). 자세한 내용은이 질문에 대한 다른 답변을 참조하십시오!


답변

LSP ( Language Server Protocol )

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

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

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

https://langserver.org/ 에서 더 많은 언어 서버를 찾을 수 있습니다 .

정력

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

  1. LanguageClient-neovim ( 녹스 필요)은 매핑을 제안합니다.

    nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
    
  2. coc.nvim (node.js 필요)은 매핑을 제안합니다.

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

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

    Ale은 키 바인딩을 정의하지 않습니다. 이것은 사용자가 수행해야합니다.

  4. vim-lsp 는 다음 명령을 제공합니다.

    :LspRename
    

    Ale과 유사하게 매핑이 제안되지 않습니다. 그러나 물론 다음과 같이 정의 할 수 있습니다.

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

    ( <leader>r은 귀하의 선택으로 대체됩니다. 대부분의 플러그인이 동의하는 플러그인을 모르겠습니다)

  5. vim-lsc 에는 기본 매핑이 있습니다.

    'Rename': 'gR'
    

LSP를 용이하게하는 YouCompleteMe 도 참조하십시오 .

Neovim

Neovim은 2019 년 11 월 13 일 부터 lsp에 대한 초기 내장 지원을 제공합니다.

LSP의 일반적인 구성은 https://github.com/neovim/nvim-lsp를 참조하십시오.

그러나 스마트 이름 바꾸기가 어떻게 작동하는지 알 수 없었습니다. 누군가가 이것을 알고 있다면이 섹션을 업데이트하십시오.

기타 리팩토링

LSP 프로토콜이 클래스 구조 변경, 메서드 / 함수에 매개 변수 추가 또는 메서드를 다른 클래스로 이동과 같은 더 복잡한 리팩토링을 지원할 계획이 있는지 모르겠습니다. 리팩토링 목록은 https://refactoring.com/catalog/를 참조 하세요 .


답변

파이썬

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

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


답변

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>
    


답변

일반적인 리팩토링을 위해이 플러그인 을 작성 했습니다 . 여전히 많은 개선이 필요합니다. 언젠가는 C & C ++ 리팩토링을위한 clang을 위해 ctags를 버리려고 노력할 것입니다.


답변

아마도 가장 우아한 솔루션은 아니지만 매우 편리하다는 것을 알았습니다. ECLIM 을 사용하여 VIM과 Eclipse를 연결합니다. 물론 모든 소스 코드 편집은 VIM에서 이루어 지지만 리팩토링 할 때이 문제에서 Eclipse의 우수한 기능을 활용할 수 있습니다.

시도 해봐.


답변

플러그인 Factorus

github에서 사용할 수있는 factorus 라는 리팩토링 전용 vim 플러그인 이 있습니다 .

현재 (2017-12), 언어 지원

  • 씨,
  • 자바 및
  • 파이썬.