약 8분

VS Code에 Shift Shift 단축키 등록하는 방법

IntelliJ 단축키 느낌을 내 보자
VS Code에 Shift Shift 단축키 등록하는 방법
Photo by Nangialai Stoman / Unsplash

서론

자바/스프링 공부를 하면서 IntelliJ IDEA 를 자주 사용하다 보니 편리한 단축키를 많이 익혔다. 그중 Shift Shift 단축키가 특히 마음에 들었는데, 유용함도 유용함이지만 같은 키를 두 번 누르는 단축키가 재밌어서 자주 사용하다 보니 금방 익숙해질 수 있었다.

이거 정말 좋습니다

단축키 인식을 못해요

VS Code에서도 검색에 같은 단축키를 쓰고 싶다는 생각이 들어 키보드 단축키 목록을 열어봤는데, 아쉽게도 Intellij처럼 파일명과 파일 내부 코드를 동시에 검색할 수 있는 방법은 아직 없는 것 같았다. 다양한 검색 관련 기능들 중 내가 찾던 기능은 다음과 같다:

  • 디렉토리 내 모든 파일 내부를 검색하고, 해당 라인으로 이동: Search: Find in Files
  • 디렉토리 내 파일명을 검색하고, 해당 파일로 이동: Go to File...

첫번째 기능인 Find in Files의 경우 기본적으로 Shift + Command + F에 바인딩 되어 있다. 여기서 Shift가 빠진 Command + F 단축키는 현재 화면, 즉 현재 열려있는 에디터에서 검색하도록 동작하는 것이 직관적이므로 디렉토리 내 모든 파일에서 검색하려면 Shift를 같이 눌러준다고 기억하면 될 것 같다.

그래서 첫번째 기능의 단축키는 그대로 두고 Command + P라는 근본 없는 단축키에 바인딩돼있는 Go to File... 기능의 단축키를 Shift Shift로 변경하려 했더니, Shift Shift와 같이 동일한 키를 두 번 누르는 단축키는 누르는 속도와 상관 없이 인식하지 못하는 것만 같았다..

분명 나랑 비슷한 생각을 했던 사람이 있을 것 같아 인터넷에 검색을 해 보니 10년도 넘은 스택 오버플로우 질문글을 찾을 수 있었고, 2021년에 릴리즈된 VS Code 1.54.0 버전부터 Shift Shift같은 단축키를 사용할 수 있게 됐다는 답변을 봤다. 하지만 4년이 지난 지금까지도 UI에서는 동일한 키를 반복 입력하는 단축키를 적용할 수 없어서, 약간의 수고로움을 감수해야 했다.


Shift Shift 검색 단축키 적용 방법

키보드 단축키 설정 화면에서 Open Keyboard Shortcuts (JSON)을 클릭하면 keybindings.json 파일을 직접 수정할 수 있다.

이 파일은 key, command, when 형식으로 구성된 JSON 파일이며 다음과 같은 Element 구조를 가진다:

  • key : 단축키가 들어간다. UI에서는 설정이 불가능하던 Shift Shift 같은 단축키도 매핑시켜줄 수 있다.
  • command : 단축키를 통해 실행할 명령이 들어간다. 새로운 단축키를 추가하려면 그냥 작성하고, 기존 단축키를 제거하려면 value 앞에 -를 붙여준다.
  • when (optional) : 단축키를 인식하기 위한 상황, 조건이 들어간다.

기존 단축키인 Command + P를 삭제하고, Go to File 기능을 Shift Shift 단축키에 매핑시켜 주기 위해 keybindings.json 파일 하단에 아래 두 Elements를 추가해주면 된다:

    {
      "key": "shift shift",
      "command": "workbench.action.quickOpen"
    },
    {
      "key": "cmd+p",
      "command": "-workbench.action.quickOpen"
    },

파일을 저장한 다음 다시 단축키 패널을 열어보니 키바인딩이 Shift Shift로 변경되어 있으며, 정상적으로 동작하는 것을 확인할 수 있었다:


다른 단축키 수정

단축키 수정하는 방법을 알아본 김에, 다른 단축키들도 취향에 맞게 변경해봤다.

명령 패널

Control Control 단축키로 명령 패널을 열기 위해, keybindings.json 파일 하단에 아래 두 Elements를 추가해주면 된다:

    {
      "key": "ctrl ctrl",
      "command": "workbench.action.showCommands"
    },
    {
      "key": "f1",
      "command": "-workbench.action.showCommands"
    },

탭 전환 단축키 정상화

VS Code에서는 Control + Tab, Control + Shift + Tab 두 단축키가 뭔가 불편한 느낌이 들 때가 있어서 탭이 여러 개 열려있을땐 마우스/트랙패드를 통해 탭을 전환하곤 했다. 두 단축키가 브라우저처럼 한 칸씩 이동하는게 아니라 최근에 사용한 순서 대로 이동하기 때문이었다는 것을 알게 됐고, 이 또한 같이 수정해줬다:

  • Control + Tab을 누르면 오른쪽 탭으로 한 칸 이동하도록 수정
  • Control + Shift + Tab을 누르면 왼쪽 탭으로 한 칸 이동하도록 수정
  • 기존 Control + Tab 단축키의 기능을 Command + E에 매핑
  • 기존 Control + Shift + Tab 단축키의 기능을 Command + Shift + E에 매핑
    {
      "key": "cmd+e",
      "command": "-actions.findWithSelection"
    },
    {
      "key": "ctrl+tab",
      "command": "-workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup",
      "when": "!activeEditorGroupEmpty"
    },
    {
      "key": "ctrl+tab",
      "command": "-workbench.action.quickOpenNavigateNextInEditorPicker",
      "when": "inEditorsPicker && inQuickOpen"
    },
    {
      "key": "cmd+e",
      "command": "workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup",
      "when": "!activeEditorGroupEmpty"
    },
    {
      "key": "cmd+e",
      "command": "workbench.action.quickOpenNavigateNextInEditorPicker",
      "when": "inEditorsPicker && inQuickOpen"
    },
    {
      "key": "ctrl+shift+tab",
      "command": "-workbench.action.quickOpenNavigatePreviousInEditorPicker",
      "when": "inEditorsPicker && inQuickOpen"
    },
    {
      "key": "ctrl+shift+tab",
      "command": "-workbench.action.quickOpenLeastRecentlyUsedEditorInGroup",
      "when": "!activeEditorGroupEmpty"
    },
    {
      "key": "shift+cmd+e",
      "command": "workbench.action.quickOpenLeastRecentlyUsedEditorInGroup",
      "when": "!activeEditorGroupEmpty"
    },
    {
      "key": "shift+cmd+e",
      "command": "workbench.action.quickOpenNavigatePreviousInEditorPicker",
      "when": "inEditorsPicker && inQuickOpen"
    },
    {
        "key": "ctrl+tab",
        "command": "workbench.action.nextEditorInGroup"
    },
    {
        "key": "ctrl+shift+tab",
        "command": "workbench.action.previousEditorInGroup"
    },

Explorer 토글

Command + 1 단축키로 파일 익스플로러를 열고 닫을 수 있는 설정이다. 전부터 사용하던 단축키 설정인데, 함께 기록해두려 한다:

  • 사이드바가 닫힌 상태에서 Command + 1을 누르면 사이드바의 익스플로러가 열림
  • 사이드바가 열려 있으며 익스플로러가 아닌 다른 탭일 경우 Command + 1을 누르면 익스플로러로 이동
  • 사이드바가 열려 있으며 익스플로러 탭일 경우, Command + 1을 누르면 사이드바를 닫음 (토글)
    {
      "key": "shift+cmd+e",
      "command": "-workbench.view.explorer",
      "when": "viewContainer.workbench.view.explorer.enabled"
    },
    {
        "key": "cmd+1",
        "command": "-workbench.action.focusFirstEditorGroup"
    },
    {
        "key": "cmd+1",
        "command": "workbench.view.explorer",
        "when": "viewContainer.workbench.view.explorer.enabled"
    },
    {
        "key": "cmd+1",
        "command": "workbench.action.closeSidebar",
        "when": "filesExplorerFocus"
    },

keybindings.json 전체 코드

// Place your key bindings in this file to override the defaultsauto[]
[
  {
    "key": "shift+cmd+e",
    "command": "-workbench.view.explorer",
    "when": "viewContainer.workbench.view.explorer.enabled"
  },
  {
    "key": "cmd+1",
    "command": "-workbench.action.focusFirstEditorGroup"
  },
  {
    "key": "cmd+1",
    "command": "workbench.view.explorer",
    "when": "viewContainer.workbench.view.explorer.enabled"
  },
  {
    "key": "cmd+1",
    "command": "workbench.action.closeSidebar",
    "when": "filesExplorerFocus"
  }, // `Command + 1`로 Explorer 윈도우 토글
  {
    "key": "ctrl+alt+n",
    "command": "-code-runner.run"
  },
  {
    "key": "ctrl+r",
    "command": "-workbench.action.openRecent"
  },
  {
    "key": "ctrl+r",
    "command": "code-runner.run"
  }, // `Control + R`로 Code Runner 익스텐션 실행 (Run Code)
  {
    "key": "escape",
    "command": "search.action.clearSearchResults",
    "when": "searchViewletFocus"
  }, // `Command + Shift + F` 검색 콘솔에서 `ESC`를 통해 검색 창 입력 초기화
  {
    "key": "cmd+p",
    "command": "-workbench.action.quickOpen"
  },
  {
    "key": "shift shift",
    "command": "workbench.action.quickOpen"
  }, // `Shift Shift`로 검색 창 열기
  {
    "key": "ctrl ctrl",
    "command": "workbench.action.showCommands"
  }, // `Control Control`로도 명령 창을 열 수 있도록 단축키 오버로딩 (기본값은 F1)
  {
    "key": "ctrl+tab",
    "command": "-workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup",
    "when": "!activeEditorGroupEmpty"
  },
  {
    "key": "ctrl+tab",
    "command": "-workbench.action.quickOpenNavigateNextInEditorPicker",
    "when": "inEditorsPicker && inQuickOpen"
  },
  {
    "key": "ctrl+tab",
    "command": "workbench.action.nextEditorInGroup"
  }, // `Control + Tab`이 브라우저처럼 동작하도록 변경 (다음 탭으로 이동)
  {
    "key": "ctrl+shift+tab",
    "command": "-workbench.action.quickOpenNavigatePreviousInEditorPicker",
    "when": "inEditorsPicker && inQuickOpen"
  },
  {
    "key": "ctrl+shift+tab",
    "command": "-workbench.action.quickOpenLeastRecentlyUsedEditorInGroup",
    "when": "!activeEditorGroupEmpty"
  },
  {
    "key": "ctrl+shift+tab",
    "command": "workbench.action.previousEditorInGroup"
  }, // `Control + Shift + Tab`이 브라우저처럼 동작하도록 변경 (이전 탭으로 이동)
  {
    "key": "cmd+e",
    "command": "-actions.findWithSelection"
  },
  {
    "key": "cmd+e",
    "command": "workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup",
    "when": "!activeEditorGroupEmpty"
  },
  {
    "key": "cmd+e",
    "command": "workbench.action.quickOpenNavigateNextInEditorPicker",
    "when": "inEditorsPicker && inQuickOpen"
  }, // 기존 `Control + Tab` 기능을 `Command + E`로 이동 (최근 탭으로 이동)
  {
    "key": "shift+cmd+e",
    "command": "workbench.action.quickOpenLeastRecentlyUsedEditorInGroup",
    "when": "!activeEditorGroupEmpty"
  },
  {
    "key": "shift+cmd+e",
    "command": "workbench.action.quickOpenNavigatePreviousInEditorPicker",
    "when": "inEditorsPicker && inQuickOpen"
  }, // 기존 `Control + Shift + Tab` 기능을 `Command + Shift + E`로 이동 (최근 탭 역순으로 이동)
  {
    "key": "ctrl+[Backquote]",
    "command": "workbench.action.terminal.toggleTerminal",
    "when": "terminal.active"
  }, // 한글 키보드일 때도 터미널 토글 단축키가 동작할 수 있도록 단축키 오버로딩 (기본값은 Control + `)
  // 250617
]