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- 패밀리
c-family의 이름 변경 리팩토링을 위해 플러그인 Clighter 를 사용해보십시오 . clang을 기반으로하지만 제한 사항이 있으며 플러그인이 더 이상 사용되지 않는 것으로 표시됩니다.
Clighter 가 제안한 매핑은 다음과 같습니다.
nmap <silent> <Leader>r :call clighter#Rename()<CR>
후속 플러그인 clighter8 은 커밋 24927db42 에서 이름 바꾸기 기능을 제거했습니다 .
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 편집기 클라이언트가 필요합니다. 다음과 같은 옵션이 있습니다.
LanguageClient-neovim (requires rust) suggested mapping is:
nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
coc.nvim (requires node.js) suggested mapping is:
" Remap for rename current word nmap <leader>rn <Plug>(coc-rename)
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)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>
subcommandIn 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
'development' 카테고리의 다른 글
브라우저에서 : before 및 : after 가상 요소를 어떻게 검사하고 조정할 수 있습니까? (0) | 2020.09.25 |
---|---|
람다 함수가 재귀적일 수 있습니까? (0) | 2020.09.25 |
BackgroundWorker에 대한 작업 병렬 라이브러리 대체? (0) | 2020.09.25 |
NSParameterAssert 란 무엇입니까? (0) | 2020.09.25 |
다른 사람에게 git 저장소를 이메일로 보내려면 어떻게해야합니까? (0) | 2020.09.25 |