vsvim 환경설정

Cute_Security15·2024년 9월 15일
0

window dev

목록 보기
1/4
post-thumbnail

상황

큰 소스 분석을 할땐 navigation 관련해서 vs2019 에 관련 플러그인,
키매핑이 필요하다.

초기전략

vs2019 에서도 vsvim 플러그인이 vim 에뮬레이션 레이어를 지원하고 있다.

기존에 사용하던 vimrc 파일에서 호환되지 않거나, 불필요한 명령을 지우고,
필요한 기능들을 일부 대체 할수 있는 vs2019 플러그인들 / 단축키들을 확인해서 추가한다.

vim 에서 잘 쓰고 있던 모든 기능이 될거라는 생각은 하지 않되,
visual studio 에서 어떤 방식(scheme) 으로 플러그인 / 단축키들을 지원하고 있고,
필요한 생각들의 base 를 다져본다.

설정 단계

기본 기능만 남긴 vimrc

" 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>

VsVim

https://github.com/VsVim/VsVim

  • version : 2.8.0.0

w : vertical split window
e : horizontal split window
q : close window

vim 과는 달리, vsvim 으로 만든 split window 에는 몇가지 제약사항이 확인된다.

  • vsvim 으로 만든 vertial split window 는 "tab group" 으로 취급된다.
  • vsvim 으로 만든 horizontal split window 는 1개만 생성 가능하다.

keyboard shortcut 변경시 주의사항

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 하면, 한번에 지울수 있다.

Edit.pagedown / Edit.pageup 관련사항

vim 처럼 pagedown / pageup 을 하기 위해 ctrl + d 와 ctrl + u 에 키설정을 하면, tab 이 움직이는 상황을 볼수 있다.

해당 문제 관련해서 직접 EnvDTE 문서들을 보면서 시도해보고 있었는데,
의외의 곳에서 해법이 나왔다. 키설정을 해제하면 정상적으로 동작한다.

misc 키세팅

ctrl + t : type / function skimming

  • Edit.GoToAll

ctrl + w : find all references

  • Edit.FindAllReferences

ctrl + a : go back to document window

  • Window.NextDocumentWindow

ctrl + s : go back to find reference window

  • View.FindReferencesWindow1

ctrl + o : move cursor to previous position

  • View.NavigateBackward

ctrl + i : move cursor to next position

  • View.NavigateForward

https://stackoverflow.com/questions/4927375/how-to-navigate-back-to-the-last-cursor-position-in-visual-studio 에서 참고

VsNerdX 2015-2019

https://github.com/stevium/vs-nerdx

  • version : 2.4.0

ctrl + alt + l : solution explorer 열고, 내부로 이동

  • View.SolutionExplorer

ctrl + q : solution explorer 닫기

  • Window.Close

ctrl + d : go back from solution explorer

  • Window.NextDocumentWindow

solution explorer 안에선 nerdtree 처럼 파일/디렉토리 제어

https://marketplace.visualstudio.com/items?itemName=MackenzieZastrow.NavigateTabGroups

  • version : 1.4.0

ctrl + h / l : vertical split window (tabgroup) 간 이동

  • Tools.NavigateTabGroups.Previous
  • Tools.NavigateTabGroups.Next

ctrl + j / k : horizontal split window 간 이동

  • Window.NextSplitPane

cf. ctrl + g / ; : tab 간 이동

  • Window.PreviousTab
  • Widnow.NextTab

개선점

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);
	}
}

https://github.com/VsVim/VsVim/blob/8067489482f02e461a50780315363497399fb232/Src/VsVimShared/VsVimHost.cs#L1109

2) horizontal split window 생성후, 편집을 완료하고 닫으면, 기존 윈도우의 커서가
닫힌 창 커서가 있던 곳으로 이동된다.

그리고 hjkl 를 화살표(arrow) 처럼 쓸수 있다면 좀더 유용할듯 싶다는 생각도 들었다.

안쓰는 split window 를 최소화 하는 기능이 있었으면 좋겠다는 생각도 들었다.

마지막으로 goto declaration 시 tab 으로 열지말고, 새 tabgroup 으로 열면 좋겠다는 생각도 들었다.

우선은 (언제가 될진 모르겠지만) 지금 확인된 내용들만으로 1차적으로 정리하였다.

profile
관심분야 : Filesystem, Data structure, user/kernel IPC

4개의 댓글