물론 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 )
언어 서버 프로토콜에는 프로젝트 전체에서 기호의 스마트 이름 바꾸기 기능이 포함되어 있습니다 .
예를 들어 다음 언어 서버는 이것을 지원합니다.
- C ++ 용 Clangd
- C / C ++ / Objective-C 용 CQuery
- Java 용 Eclipse.jdt.ls
- Python 용 파일 (로프 포함)
- JavaScript 및 TypeScript 용 javascript-typescript- langserver
- Ruby 용 Solargraph
- Go 용 gopls 공식 lsp (2019 년 11 월 알파 단계)
- LaTeX 용 texlab
https://langserver.org/ 에서 더 많은 언어 서버를 찾을 수 있습니다 .
정력
vim 내에서 사용하려면 vim 편집기 클라이언트가 필요합니다. 다음과 같은 옵션이 있습니다.
-
LanguageClient-neovim ( 녹스 필요)은 매핑을 제안합니다.
nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
-
coc.nvim (node.js 필요)은 매핑을 제안합니다.
" Remap for rename current word nmap <leader>rn <Plug>(coc-rename)
-
에일 은
nnoremap <silent> <Plug>(ale_rename) :ALERename<Return>
Ale은 키 바인딩을 정의하지 않습니다. 이것은 사용자가 수행해야합니다.
-
vim-lsp 는 다음 명령을 제공합니다.
:LspRename
Ale과 유사하게 매핑이 제안되지 않습니다. 그러나 물론 다음과 같이 정의 할 수 있습니다.
nmap <leader>r <plug>(lsp-rename)
(
<leader>r
은 귀하의 선택으로 대체됩니다. 대부분의 플러그인이 동의하는 플러그인을 모르겠습니다) -
vim-lsc 에는 기본 매핑이 있습니다.
'Rename': 'gR'
LSP를 용이하게하는 YouCompleteMe 도 참조하십시오 .
Neovim
Neovim은 2019 년 11 월 13 일 부터 lsp에 대한 초기 내장 지원을 제공합니다.
LSP의 일반적인 구성은 https://github.com/neovim/nvim-lsp를 참조하십시오.
그러나 스마트 이름 바꾸기가 어떻게 작동하는지 알 수 없었습니다. 누군가가 이것을 알고 있다면이 섹션을 업데이트하십시오.
기타 리팩토링
LSP 프로토콜이 클래스 구조 변경, 메서드 / 함수에 매개 변수 추가 또는 메서드를 다른 클래스로 이동과 같은 더 복잡한 리팩토링을 지원할 계획이 있는지 모르겠습니다. 리팩토링 목록은 https://refactoring.com/catalog/를 참조 하세요 .
답변
답변
C- 패밀리
-
c-family의 이름 변경 리팩토링을 위해 플러그인 Clighter 를 사용해보십시오 . clang을 기반으로하지만 제한 사항이 있으며 플러그인이 더 이상 사용되지 않는 것으로 표시됩니다.
Clighter 가 제안한 매핑은 다음과 같습니다.
nmap <silent> <Leader>r :call clighter#Rename()<CR>
후속 플러그인 clighter8 은 커밋 24927db42 에서 이름 바꾸기 기능을 제거했습니다 .
-
neovim을 사용하는 경우 플러그인 클램프를 살펴볼 수 있습니다 . 그것은 제안
nmap <silent> <Leader>r :call ClampRename()<CR>