큰 소스 분석을 할땐 navigation 관련해서 vs2019 에 관련 플러그인,
키매핑이 필요하다.
vs2019 에서도 vsvim 플러그인이 vim 에뮬레이션 레이어를 지원하고 있다.
기존에 사용하던 vimrc 파일에서 호환되지 않거나, 불필요한 명령을 지우고,
필요한 기능들을 일부 대체 할수 있는 vs2019 플러그인들 / 단축키들을 확인해서 추가한다.
vim 에서 잘 쓰고 있던 모든 기능이 될거라는 생각은 하지 않되,
visual studio 에서 어떤 방식(scheme) 으로 플러그인 / 단축키들을 지원하고 있고,
필요한 생각들의 base 를 다져본다.
" nerdtree setting (open current directory)
set autochdir
" open file with previous cursor
autocmd BufWinLeave *.* mkview
autocmd BufWinEnter *.* silent loadview
autocmd FileType vim set shiftwidth=4
" misc
set number " print line number
set hlsearch " highlight all search results
set tabstop=4 " tab = 4 space
set shiftwidth=4 " maybe shiftwidth is still 8, so =G will insert 2 tabs(problem) not just 1 tabs..
set cursorline " highlight cursor line
map q :q!<cr>
map <C-q> :q!<cr> " for "ctrl + q" compatiblity
" prev/next word
nnoremap <S-h> b
nnoremap <S-l> w
" Window
nnoremap w :vs<cr>
nnoremap e :sp<cr>
https://github.com/VsVim/VsVim
w : vertical split window
e : horizontal split window
q : close window
vim 과는 달리, vsvim 으로 만든 split window 에는 몇가지 제약사항이 확인된다.
keyboard shortcut 을 변경할때 주의사항이 있다.
1) global 설정보다, editor 설정이 우선된다.
따라서, 내가 기본설정한 global 설정이 editor 설정과 중복(ex. ctrl + h) 되고 있다면, editor 설정이 우선되므로 내 keyboard shortcut 이 안먹는 문제가 생길수 있다.
2) 조합키 설정을 지울땐 약간 머리를 써야 한다.
ctrl + k 는 조합키로 많이 사용되고 있다.
따라서, 일일히 keyboard shortcut 을 지우는 방법말고 다른 방법이 필요하다.
나는 editor 설정에서 쓸 keyboard shortcut 을 설정중이므로,
Edit.xxxx 에 키를 assign 하고 있다.
따라서, Edit.xxxx 중 assign 된 키가 없는 녀석을 선택하고,
그곳에 ctrl + k 를 assign 하고 바로 remove 하면, 한번에 지울수 있다.
vim 처럼 pagedown / pageup 을 하기 위해 ctrl + d 와 ctrl + u 에 키설정을 하면, tab 이 움직이는 상황을 볼수 있다.
해당 문제 관련해서 직접 EnvDTE 문서들을 보면서 시도해보고 있었는데,
의외의 곳에서 해법이 나왔다. 키설정을 해제하면 정상적으로 동작한다.
ctrl + t : type / function skimming
ctrl + w : find all references
ctrl + a : go back to document window
ctrl + s : go back to find reference window
ctrl + o : move cursor to previous position
ctrl + i : move cursor to next position
https://github.com/stevium/vs-nerdx
ctrl + alt + l : solution explorer 열고, 내부로 이동
ctrl + q : solution explorer 닫기
ctrl + d : go back from solution explorer
solution explorer 안에선 nerdtree 처럼 파일/디렉토리 제어
https://marketplace.visualstudio.com/items?itemName=MackenzieZastrow.NavigateTabGroups
ctrl + h / l : vertical split window (tabgroup) 간 이동
ctrl + j / k : horizontal split window 간 이동
cf. ctrl + g / ; : tab 간 이동
split window 커서 위치에 대한 개선이 확인된다.
1) vertical split window 생성시, 이전 커서 위치를 가져오지 않고, 라인 1에서 커서가 시작하게 된다.
--> 이부분은 vcmd 상에선 개선하였으나, vcmd 는 w 키매핑이 불가하므로,
vimrc 상에서 개선하는 방향을 추가로 모색하고 있다.
--> vsvim 이 line('.') 을 지원하지 않으며, w 키를 다른 키로 매핑하더라도,
이 키를 vcmd 가 받아볼 수 없으므로 단순 스크립트 수정으로는 어려울것으로 판단된다.
우선은 ctrl + p 에 매핑하고 사용하기로 한다. 아래는 vcmd 스크립트와 참고링크이다.
ctrl + p : vertical split window (retain previous cursor position)
using EnvDTE;
using EnvDTE80;
public class C : VisualCommanderExt.ICommand
{
public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package)
{
EnvDTE80.DTE2 dte = DTE;
Document doc = dte.ActiveDocument;
if (doc == null)
return;
Window win = doc.ActiveWindow;
EnvDTE.TextSelection ts = DTE.ActiveDocument.Selection as EnvDTE.TextSelection;
int line = ts.CurrentLine; // get current line position
TextDocument tdoc = doc.Object("TextDocument") as EnvDTE.TextDocument;
win.Activate();
dte.ExecuteCommand("Window.NewWindow");
dte.ExecuteCommand("Window.NewVerticalTabGroup");
ts = DTE.ActiveDocument.Selection as EnvDTE.TextSelection;
//System.Windows.MessageBox.Show(line.ToString());
ts.GotoLine(line, false);
}
}
2) horizontal split window 생성후, 편집을 완료하고 닫으면, 기존 윈도우의 커서가
닫힌 창 커서가 있던 곳으로 이동된다.
그리고 hjkl 를 화살표(arrow) 처럼 쓸수 있다면 좀더 유용할듯 싶다는 생각도 들었다.
안쓰는 split window 를 최소화 하는 기능이 있었으면 좋겠다는 생각도 들었다.
마지막으로 goto declaration 시 tab 으로 열지말고, 새 tabgroup 으로 열면 좋겠다는 생각도 들었다.
우선은 (언제가 될진 모르겠지만) 지금 확인된 내용들만으로 1차적으로 정리하였다.
https://vlasovstudio.com/visual-commander/