개발 환경 설정 (2025)

OS 공통

글꼴

OS 구분 없이 설치할 글꼴 목록

Pretendard

https://github.com/orioncactus/pretendard/releases

Pretendard와 Pretendard Variable만 설치한다.

나눔바른고딕

https://hangeul.naver.com/2017/nanum

D2Coding

https://github.com/naver/d2codingfont/releases

기본 버전만 설치한다 (bold 포함).


macOS/Ubuntu 공통

macOS/Ubuntu Git 설정

~/.gitconfig를 설정한다. user.nameuser.email을 수정해야 한다.

[core]
    editor = vim
    ignorecase = false
[push]
    default = simple
[user]
    name = Your Name
    email = id@email.com
[alias]
    st = status
    ci = commit
    cinv = commit --no-verify
    ciam = commit --amend
    ciamnv = commit --amend --no-verify
    br = branch
    brd = branch -D
    chp = cherry-pick
    co = checkout
    cobr = checkout -b
    fe = fetch
    fep = fetch --prune
    fepo = fetch --prune origin
    logp = log --pretty='%C(blue)%ai  %C(brightmagenta)%<(17,trunc)%an  %C(brightblack)%h  %C(reset)%s %C(cyan)%d'
    pu = push

끔찍하게도 리눅스와 다르게, macOS에서는 Git이 기본적으로 대소문자를 구분하지 않는다. core.ignorecase = false 설정을 하지 않으면, 몇 시간을 허비할 수도 있다.

macOS/Ubuntu VIM 설정

~/.vimrc에 아래 문장을 추가한다.

  • set ruler: 줄과 칼럼 번호가 보인다.
  • syntax on: Git commit 시 색깔이 보인다.

set nu (줄 번호가 보인다.)는 사용하지 않는다. 평소에는 터미널 너비만 줄이는 것 같다...


masOS

(macOS) Shell - zsh

2023년부터 Bash 대신 zsh를 기본으로 사용한다. Login shell 기본 스크립트는 ~/.zprofile~/.bash_profile을, interactive shell 기본 스크립트는 ~/.zshrc (~/.bashrc 제외)를 수정한다.

최신 macOS의 기본 shell은 zsh이다.

~/.zshrc 일부

.bashrc와 호환되지 않는다.

# Homebrew 1
export PATH="/opt/homebrew/bin:$PATH"


# Homebrew 2
export PATH="/usr/local/bin:$PATH"


# Git in English
alias git='LANG=en_US.UTF-8 git'


# Git autocompletion
# https://stackoverflow.com/a/58517668
autoload -Uz compinit && compinit


# jenv
export PATH="$HOME/.jenv/bin:$PATH"
[ -x "$(command -v jenv)" ] && eval "$(jenv init -)"


# NVM
export NVM_DIR=~/.nvm
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"


# PNPM
# pnpm
export PNPM_HOME="$HOME/Library/pnpm"
case ":$PATH:" in
  *":$PNPM_HOME:"*) ;;
  *) export PATH="$PNPM_HOME:$PATH" ;;
esac
# pnpm end


# pyenv
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv > /dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
command -v pyenv > /dev/null && eval "$(pyenv init -)"


# Rancher Desktop
### MANAGED BY RANCHER DESKTOP START (DO NOT EDIT)
export PATH="/Users/user/.rd/bin:$PATH"
### MANAGED BY RANCHER DESKTOP END (DO NOT EDIT)


# Hadoop
export HADOOP_HOME="$HOME/apps/hadoop"


# iTerm2
test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"

zsh의 Git autocompletion은 다음 웹페이지를 참고한다.

https://stackoverflow.com/a/58517668

macOS 프로그램 (IDE 제외)

Homebrew 설치 이후 터미널에서 명령어를 입력한다.

Homebrew 설치

macOS의 필수 프로그램 1. (iTerm2도 HomeBrew로 설치할 것이기 때문.)

https://brew.sh/ko/

2023년에 확인했을 때는 zsh에서는 Homebrew 설치가 제대로 안 된다. 그래서 ~/.zshrc 파일을 수정한다.

export PATH=/opt/homebrew/bin:$PATH

https://stackoverflow.com/questions/36657321/after-installing-homebrew-i-get-zsh-command-not-found-brew

Homebrew cask 기능이 완전히 통합돼서, 2024년부터 brew tap homebrew/cask-versions 명령어는 불필요한 것 같다.

iTerm2 (터미널) 설치

macOS의 필수 프로그램 2.

brew install --cask iterm2

설치 후 "macOS iTerm2 설정" 항목을 참고한다.

Ice 설치

노치로 인해 좁아진 MacBook 메뉴 바 아이콘의 구원자 같은 프로그램이다. 원하는 아이콘만 보여주고, 숨길 아이콘을 선택할 수 있으며, 숨긴 아이콘을 따로 보는 것도 가능하다.

https://github.com/jordanbaird/Ice

brew install jordanbaird-ice

"Launch at login" 설정은 필수다.

Karabiner Elements 설치

brew install --cask karabiner-elements

jenv 설치

# Install jenv
brew install jenv

.zshrc에 다음 내용을 추가한다.

# jenv
export PATH="$HOME/.jenv/bin:$PATH"
[ -x "$(command -v jenv)" ] && eval "$(jenv init -)"

OpenJDK 설치

JDK 11, 17, 21을 설치하고, 17을 기본으로 사용한다.

Homebrew formula 중 openjdk는 symbolic link를 직접 걸어줘야 해서 불편하다...

특히 openjdk@8openjdk@8: The x86_64 architecture is required for this software. 오류가 나므로, 애플 실리콘 맥 기기에 설치할 수 없다. JDK 1.8의 경우에는 Zulu OpenJDK를 이용하자.

# Install Homebrew formulas
brew install openjdk@11 openjdk@17 openjdk@21

# Symlink JDKs (required for Homebrew formulas not casks)
sudo ln -sfn /opt/homebrew/opt/openjdk@11/libexec/openjdk.jdk \
    /Library/Java/JavaVirtualMachines/openjdk-11.jdk
sudo ln -sfn /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk \
    /Library/Java/JavaVirtualMachines/openjdk-17.jdk
sudo ln -sfn /opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk \
    /Library/Java/JavaVirtualMachines/openjdk-21.jdk

# List all JDKs
/usr/libexec/java_home -V

# Add JDKs to jenv
jenv add /Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/openjdk-17.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/openjdk-21.jdk/Contents/Home

# List all jenv JDKs
jenv versions

# Set Java 17.0 as default
jenv global 17.0

# Check current Java version
java -version

jenv 홈페이지가 깔끔하다.

https://www.jenv.be/

(임시) Oracle JDK 1.7 설치

2024년 기준으로 Azul Zulu JDK 1.7 버전은 Homebrew를 통해 설치할 수 없게 돼 버렸다. (지원이 종료된 소프트웨어의 최후라고 볼 수 있겠다.)

Oracle 홈페이지에서 로그인을 하고 jdk-7u80-macosx-x64.dmg 파일을 다운로드받는다.

https://www.oracle.com/kr/java/technologies/javase/javase7-archive-downloads.html

AMD64 아키텍처 바이너리를 받았지만 걱정할 필요는 없다. 비교적 느려질 뿐이지, Rosetta 2를 통해 애플 실리콘 기기에서도 에뮬레이션이 된다.

# List all JDKs
/usr/libexec/java_home -V

# Add Oracle JDK 7u80 to jenv
jenv add /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home

# List all jenv JDKs
jenv versions

(임시) Azul Zulu JDK 1.8 설치

임시로 JDK 1.8를 사용한다.

# List Homebrew formulas & casks
brew search --cask zulu

# Install Homebrew casks
brew install --casks zulu@8

# List all JDKs
/usr/libexec/java_home -V

# Add Azul Zulu JDKs to jenv
jenv add /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home

# List all jenv JDKs
jenv versions

(임시) OpenJDK 15 설치

2024년 기준으로 Azul Zulu JDK 15 버전은 Homebrew를 통해 설치할 수 없게 돼 버렸다. (지원이 종료된 소프트웨어의 최후라고 볼 수 있겠다.)

아래 웹페이지에서 tar.gz 파일을 다운로드받는다.

https://jdk.java.net/archive/

/Library/Java/JavaVirtualMachines/ 디렉터리에 압축을 풀면 된다. (해당 압축 파일의 이름으로 된 디렉터리 안에 내용물을 넣는다.)

# List all JDKs
/usr/libexec/java_home -V

# Add OpenJDK 15.0.2 to jenv
jenv add /Library/Java/JavaVirtualMachines/jdk-15.0.2.jdk/Contents/Home

# List all jenv JDKs
jenv versions

Rancher Desktop 설치

Apple Sillicon Mac 기기에서도 Docker나 Kubernetes를 가상 머신에서 실행시킬 수 있다.

https://rancherdesktop.io/

Homebrew로 설치하면 좀 다르다는 썰이 보이니, 그냥 홈페이지에서 설치 파일을 받는다.

GIMP 설치

brew install --cask gimp

(macOS) 구름 입력기

기존 macOS 입력기는 자꾸 이상한 유니코드 문자를 남긴다. 그리고 backtick - 원화 기호 설정 변경이 편하게 안 된다.

구름 입력기 설치

brew install --cask gureumkim

반드시 로그아웃을 한 번 해야 한다.

구름 입력기 설정

내부 단축키 설정

"한자 및 이모지 단축키"가 option-enter이므로, IntelliJ와 충돌한다.

단축키를 해제한다.

시스템 단축키 설정

"오른쪽 키로 언어 전환"을 해제한다. Karabiner Elements 방식보다 잘 씹힌다.

한글 입력기 설정

"한글 입력기일 때 역따옴표(`)로 원화 기호(\) 입력" 체크 상자를 해제한다.

우측 Command를 한/영키로 바꾸기

Karabiner Elements에서 right_command 등을 F16에 mapping한다.

https://makepluscode.tistory.com/164

하지만... 이 방식에는 문제가 있으니. 바로 UTM 같은 가상 머신 프로그램에서 오른쪽 커맨드 버튼이 전달되지 않는다는 것이다.

ChatGPT 3.5에게 다음 질문을 하여 Karabiner custom rule JSON을 생성했다.

"Give me a custom rule JSON for macOS Karabiner-Elements to map the right command key to F16 in any application except one of which bundle identifier is com.utmapp.UTM."

{
  "description": "Map right command key to F16 in any application except UTM",
  "manipulators": [
    {
      "type": "basic",
      "from": {
        "key_code": "right_command",
        "modifiers": {
          "optional": ["any"]
        }
      },
      "to": [
        {
          "key_code": "f16"
        }
      ],
      "conditions": [
        {
          "type": "frontmost_application_unless",
          "bundle_identifiers": ["com.utmapp.UTM"]
        }
      ]
    }
  ]
}

macOS 중요한 설정

(macOS 13 Ventura) Caps Lock으로 한/영 전환 하지 않도록 막기

환경설정 > 키보드 > 입력 소스 > 편집...

"한/영키로 key ABC 전환" 체크 상자를 해제한다.

(macOS 13 Ventura) 메뉴 바에 블루투스 아이콘 추가하기

https://www.iphonetricks.org/add-bluetooth-icon-to-menu-bar-macos-ventura/

키를 누르고 있을 때 '액센트가 있는 문자' 대신 키 반복 입력 사용하기

defaults write -g ApplePressAndHoldEnabled -bool false

https://macnews.tistory.com/2195

(macOS 13 Ventura) 키보드 입력 소스 설정 바꾸기

환경설정 > 키보드 > 입력 소스 > 편집...

맞춤법 자동 수정, 스페이스를 두 번 눌러 마침표 추가, 스마트 인용 부호 및 대시 사용 옵션을 모두 끈다.

큰따옴표와 작은따옴표를 곧은 것으로 고른다 (개발자 필수 옵션).

텍스트 편집기(TextEdit) 기본 창 크기 설정하기

환경설정 (command-comma) > 윈도우 크기 section

너비 165자, 높이 60줄로 설정한다.

(터치바 없는 맥북) Function key (F1~F12)를 기본으로 사용하기

System Settings > Keyboard > Keyboard Shortcuts > Function Keys

https://apple.stackexchange.com/questions/450295/why-does-mac-running-ventura-os-now-insist-on-using-fn-key-to-deliver-function-k

트랙패드의 "페이지 쓸어넘기기" 제스처 설정하기

환경설정 > 트랙패드 > 추가 제스처 > 페이지 쓸어넘기기

이걸 "끔"에서 "두 손가락으로 좌우로 스크롤하기"로 바꿔야, Chrome에서 터치패드 두 손가락 좌우로 쓸기를 써서, 뒤로 가기와 앞으로 가기를 할 수 있다.

(터치바 있는 맥북) 맥북 터치바가 평소에 Function key (F1~F12)를 표시하도록 하기

환경설정 > 키보드 > 키보드 (기본) 탭

  1. "Touch Bar 보기" 선택 상자를 "F1, F2 등의 키"로 바꾼다.
  2. "외장 키보드에서 F1, F2 등의 키를 표준 기능 키로 사용" 체크 상자를 설정한다.

(터치바 있는 맥북) 맥북 터치바의 Modifier key + Function key (F1~F12) 불가 버그 해결

https://apple.stackexchange.com/questions/275905/can-i-use-shift-alt-and-control-modifier-keys-together-with-the-function-keys-o/275908

(macOS) iTerm2 설정

Natural editing 키셋 설정

command/option + arrow/delete 등의 조합을 사용할 수 있다.

https://superuser.com/a/1157575

텍스트 선택 시 자동 복사 끄기

Prefs > General > Selection > Copy to pasteboard on selection (selection)

위 설정을 끈다.

글꼴 변경

Prefs > Profiles > Text > Font

  • 글꼴: D2Coding
  • 크기: 13

색상 조정

Prefs > Profiles > Colors

  • Basic Colors
    • Foreground: c7c7c7
    • Background: 000000
    • Brighten bold text: true
    • Minimum Contrast: 0
  • ANSI Colors:
    • Black Normal: 484848
    • Black Bright: 6b6b6b
    • Red Normal: c03a38
    • Red Bright: ef5350
    • Green Normal: 00cc33
    • Green Bright: 4eff79
    • Yellow Normal: ca9f02
    • Yellow Bright: fdcc1c
    • Blue Normal: 2072ac
    • Blue Bright: 3d99db
    • Magenta Normal: ab51ba
    • Magenta Bright: c792ea
    • Cyan Normal: 1e9094
    • Cyan Bright: 27b9be
    • White Normal: c7c7c7
    • White Bright: ffffff

색상 확인은 아래 Bash 스크립트로 한다.

#!/bin/bash
#
#   This file echoes a bunch of color codes to the
#   terminal to demonstrate what's available.  Each
#   line is the color code of one forground color,
#   out of 17 (default + 16 escapes), followed by a
#   test use of that color on all nine background
#   colors (default + 8 escapes).
#
#   Copied from http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html

T='gYw'   # The test text

echo -e "\n                 40m     41m     42m     43m\
     44m     45m     46m     47m";

for FGs in '    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m' \
           '1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m' \
           '  36m' '1;36m' '  37m' '1;37m';
  do FG=${FGs// /}
  echo -en " $FGs \033[$FG  $T  "
  for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
    do echo -en "$EINS \033[$FG\033[$BG  $T  \033[0m";
  done
  echo;
done
echo

macOS 팁

글꼴 렌더링을 두껍게 만들기

레티나가 아닌 외부 모니터에서 글자를 더 잘 보이게 함. 재시작 필요!

https://qldhqldh.tistory.com/m/entry/맥-외부-모니터-가독성-증가

설정

defaults -currentHost write -g AppleFontSmoothing -int 2

해제

defaults -currentHost delete -g AppleFontSmoothing

(macOS 10.15 Catalina~) Root 디렉터리에 디렉터리 추가하기

https://apple.stackexchange.com/a/372500

Mission Control(control-up)에서 Spaces 재정렬 방지하기

시스템 환경설정 > 데스크탑 및 Dock > Mission Control

"Spaces를 최근 사용 내역에 따라 자동으로 재정렬" 체크 상자를 해제한다.

macOS 외부 마우스 쓰기

트랙패드와 애플 매직 마우스 대신 외부 마우스를 쓰려는 노력이다.

LinearMouse 설치

macOS의 마우스 설정은 매우 불편하고 끔찍하다. 마우스 smoothing과 scroll wheel smoothing을 없애려면 외부 프로그램 설치가 유일한 희망이다. (온라인에 있는 defaults 설정들은 죄다 가속도와 관계없는 그냥 속도 변경에 불과한 듯...)

brew install --cask linearmouse

https://github.com/lujjjh/LinearMouse

(macOS) BetterTouchTool 설치 (유료)

Logitech 마우스가 아니라면, 이것으로 마우스 버튼을 mapping한다. Button 3 (좌측 위 버튼)은 "Move Left a Space", Button 4 (좌측 아래 버튼)은 "Move Right a Space"로 mapping한다.

추가로 다음 단축키도 mapping한다.

  • control-J -> down (VIM 스타일)
  • control-K -> up (VIM 스타일)
  • fn+\ -> Toogle Bluetooth (마우스 연결로 인해 트랙패드 잠겼을 때 대응)

https://folivora.ai/

마우스 연결 시 트랙패드 끄기

환경설정 > 손쉬운 사용 > 포인터 제어기

"마우스 또는 무선 트랙패드가 있으면 내장 트랙패드 무시하기" 옵션을 활성화한다.

macOS 단축키 변경

macOS 설정 > 키보드 > 단축키

"사용 안 함"은 체크 상자를 해제하는 것이다.

Hierarchy Action Default My binding
Mission Control Mission Control control-up command-backtick
Mission Control 알림 센터 보기 없음 shift-command-backtick
키보드 다음 윈도우로 초점 이동 command-backtick 사용 안 함 (command-backtick)
서비스 텍스트 > 터미널에서 man 페이지 열기 shift-command-m 사용 안 함 (shift-command-m)
서비스 텍스트 > 터미널에서 man 페이지 인덱스 검색 shift-command-a 사용 안 함 (shift-command-a)

Node.JS

NVM 및 Node.JS 설치

VS Code의 확장 기능에서 Node.JS에 의존하는 경우가 많다. 그래서 NVM과 Node.JS를 먼저 설치한다.

macOS

https://yarisong.tistory.com/44

brew install nvm
mkdir -p ~/.nvm

~/.zshrc를 수정한다.

export NVM_DIR=~/.nvm
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"

터미널을 다시 열고, 사용 가능한 Node.JS 버전을 확인한다.

# Check Node.JS versions
nvm ls-remote

적당한 LTS 버전을 설치하고, 해당 버전을 기본으로 설정한다. (나온 지 얼마 안 된 LTS 버전은 호환성 문제가 생길 수 있다.)

# Install Node.JS
nvm install v18

# Set default version of Node.JS
# (Not required after first Node.JS installation)
nvm alias default v18

# List installed Node.JS versions
nvm ls

# Check current Node.JS runtime version
node -v

전역 모듈 설치

VS Code 확장을 위한 모듈들

npm install -g prettier eslint typescript

ESLint의 플러그인 모듈들

npm install -g eslint-plugin-react eslint-plugin-prettier eslint-plugin-react-hooks

IntelliJ IDEA Community

IntelliJ 설치 (OS 공통)

JetBrains Toolbox를 이용해 설치한다.

https://www.jetbrains.com/toolbox-app/

현재 기준으로 IntelliJ IDEA Community 2024.1.1을 설치한다. 당연히 New UI가 기본이다.

IntelliJ 주의할 점

인코딩

Editor > File Encodings

인코딩 (UTF-8) 설정은 프로젝트별로 모두 필요하다. 최신 버전에서는 전역 설정도 생겨서 좋아졌다.

Run/debug 구성 이사하기

각 프로젝트의 run/debug configuration은 아직까지도 쉽게 이사하는 방법이 없다 (.run 디렉터리 XML 파일을 유지하고 싶지 않다면...). 즉 import/export 기능이 전무하다. 하나하나 share 체크를 한 후, .run 디렉터리 XML 파일을 만들어서 노가다로 옮기고, 옮긴 뒤에 share 체크를 하나하나 다시 푼다.

https://stackoverflow.com/a/24642246

그 다음으로 좋은 방법은 Gradle이나 Maven에서 clean task를 한 번 수행한 다음, .gradle 디렉터리를 제외한 모든 파일을 압축해서 옮기는 것이다. 정신 건강에 아주 이롭다고 할 수 있겠다.(...)

IntelliJ preferences

편집기 글꼴

Editor > Font

  • Font: D2Coding
  • Size: 16.0
  • Line spacing: 1.21

파일 끝에 줄바꿈 문자 넣기

Editor > General > On Save (section)

"Ensure envery saved file ends with a line break" 체크 상자를 설정한다.

줄바꿈 문자 화면에 표시하기

Editor > Genereal > Appearance

"Show whitespaces" 체크 상자를 설정한다. "Inner"를 제외하고, "Leading", "Trailing", "Selection" 체크 상자를 설정한다.

IntelliJ indent guide 보기

Editor > Genereal > Appearance

"Show indent guides" 체크 상자를 설정한다. (최신 버전에서는 기본인 듯하다.)

한 줄 메서드가 접히지 않게 하기

Editor > Genereal > Code Folding > Java (section)

"One-line methods" 체크 상자를 해제한다.

IntelliJ editor tab 위쪽 대신 오른쪽에 놓기

Editor > General > Editor Tabs > Apprearance (section)

"Tab placement" 선택 상자를 "Right"로 지정한다.

Editor > General > Editor Tabs > Closing Policy (section)

덤으로 탭 개수 제한도 풀면 좋다. "Tab limit"을 20으로 조정한다.

Breadcrumbs 사용하기

Editor > General > Breadcrumbs

"Show breadcrumbs" 체크 상자를 설정하고 (최신 버전에서는 기본인 듯하다.), "Placement"를 Top으로 한다.

"Languages"에서 "Java"와 "Kotlin" 체크 상자를 설정한다.

Smooth scrolling 끄기

Appearance & Behavior > Appearance > UI Options

"Smoothing scrolling" 체크 상자를 해제한다.

IntelliJ 단축키 설정

Keymap

VIM style (HJKL)이 어느 정도 가미되었다. 그리고 IntelliJ로 VCS를 조작하지 않고, 터미널에서 Git을 조작하기 때문에, 관련 단축키는 무시했다.

macOS

IntelliJ preference에서 "Keymap"으로 가서 프로필을 "macOS"로 맞춘 다음, "Duplicate..."를 눌러 복제한다.

macOS 기본 단축키와 충돌하면 답이 없는 경우가 있으므로 꼭 확인해야 한다.
https://support.apple.com/ko-kr/HT201236

  • (+): 기존 단축키에 추가한다.
  • (R): 기존 단축키를 제거하고 추가한다.
  • "Run", "Debug"는 자주 쓰는 VIM 단축키와 충돌하므로 바꾸었다.
  • "Code Completion"의 "Basic"은 macOS 시스템 단축키와 충돌하므로 바꾸었다.
Menu hierarchy Action Default My binding
Editor Actions Down down (+) control-J
Editor Actions Extend Selection option-up (+) option-K
Editor Actions Shrink Selection option-down (+) option-J
Editor Actions Scroll to Top None (+) command-up
Editor Actions Scroll to Bottom None (+) command-down
Editor Actions Up up (+) control-K
Main menu > Edit > Find Replace... command-R (R) option-command-F
Main menu > Edit > Find Find in Files... shift-command-F (R) control-option-F
Main menu > Edit > Find Replace in Files... shift-command-R (R) control-option-command-F
Main menu > Edit > Find Find Usages option-F7 (+) command-U
Main menu > Code > Code Completion Basic control-space (R) control-option-space
Main menu > Code Reformat Code option-command-L (R) shift-command-F
Main menu > Code Reformat File... option-shift-command-L (R) control-shift-command-F
Main menu > Code Move Line Up/Down option-shift-up/down (+) option-shift-K/J
Main menu > Navigate Back/Forward option-command-left/right (+) control-option-H/L (Remove mouse clicks)
Main menu > Navigate > Goto by Reference Actions Go to Super Method command-U (R) control-command-U
Main menu > Navigate > Goto by Reference Actions Go to Test shift-command-T (R) control-T
Main menu > Navigate > Hierarchy Actions Type Hierarchy control-H (R) command-T command-T
Main menu > Navigate > Hierarchy Actions Method Hierarchy shift-command-H (R) command-T command-F
Main menu > Navigate > Hierarchy Actions Call Hierarchy control-option-H (R) command-T command-C
Main menu > Navigate > Navigate in File Previous/Next Method control-up/down (+) control-option-K/J
Main menu > Refactor Refactor This... control-T (R) control-command-R
Main menu > Refactor Rename... shift-F6 (+) shift-command-R
Main menu > Run Run... control-option-R (R) control-option-X
Main menu > Run Debug... control-option-D (R) control-option-G
Main menu > Run > Run/Debug Run control-R (R) control-X
Main menu > Run > Run/Debug Debug control-D (R) control-G
Main menu > Window > Editor Tabs Reopen Closed Tab None (+) shift-command-T
Main menu > Window > Editor Tabs Split Right None (+) command-\
Main menu > Window > Editor Tabs Select Previous/Next Tab control-left/right (R) control-H/L
Main menu > Window > Editor Tabs Goto Previous/Next Splitter option-(/shift)+right (+) option-shift-H/L
Other Activate Next Window command-backtick (R) control-command-L
Other Activate Previous Window shift-command-backtick (R) control-command-H

IntelliJ Plugins

  • IdeaVim

IntelliJ Theme

설치

Plugin으로 "Night Owl Native" by Aradi Patrik을 설치해야 한다.

https://plugins.jetbrains.com/plugin/13448-night-owl-native

"Rainbow Brackets Lite"도 설치한다. VS Code와 다르게, bracket 종류에 상관없는 색깔 순환이 이뤄지지 않으므로, round brackets만 적용할 것이다.

https://plugins.jetbrains.com/plugin/20710-rainbow-brackets-lite

Color Scheme 조정

Java와 Kotlin 위주로 조정한다.

IntelliJ preference에서 "Editor > Color Scheme"으로 가서 "Scheme"을 "one-dark-native"로 맞춘 다음, "Duplicate..."를 눌러 복제한다.

터미널 글꼴 설정

Editor > Color Scheme > Console Font

  • Font: D2Coding
  • Size: 15.0
  • Line spacing: 1.10

상세

macOS의 VS Code는 IntelliJ보다 실제 색깔이 덜 붉게 나오기 때문에, IntelliJ에서는 인스턴스 필드 이름 색깔을 7FDBCA 대신 88D3C3으로 쓴다. 그래야 비슷해진다. (95DBCA 쓰다가 88D3C3으로 바꿈.)

나중에 배경 색깔이 더 필요해지면, 3F001F (어두운 초록색)을 사용할 예정.

Menu hierarchy Section hierarchy Changes
General Code > TODO defaults fg: FFEB95 -ErrorStripeMark -Italic
General Errors and Warnings > Error -fg -bg +Effects: B71C1C underwaved
General Errors and Warnings > Warning -fg -bg +Effects: EF7F17 underwaved
General Errors and Warnings > Weak Warning -fg -bg +Effects: 3F9F4F underwaved
General Text > Folded text fg: F3F349 bg: 0A415B
General Text > Whitespaces fg: 174F7F
Language Defaults Braces and Operators > Brackets fg: C792EA
Language Defaults Braces and Operators > Brackets fg: C792EA
Language Defaults Braces and Operators > Comma -fg
Language Defaults Braces and Operators > Dot fg: C792EA
Language Defaults Braces and Operators > Parentheses fg: 89DDF7
Language Defaults Braces and Operators > Semicolon fg: 89DDF7
Language Defaults Classes > Class name fg: ADDB67
Language Defaults Classes > Instance field fg: 88D3C3 -Inherit
Language Defaults Classes > Interface name fg: 35C37F
Language Defaults Classes > Static field fg: 88D3C3 +Italic
Language Defaults Classes > Static method fg: 82AAFF +Italic
Language Defaults Identifiers > Default fg: D6DEEB -bg -Inherit
Language Defaults Identifiers > Function declaration fg: 82AAFF -Italic
Language Defaults Identifiers > Label fg: 2F4FFF -Inherit
Language Defaults Identifiers > Local variable +Inherit
Language Defaults Identifiers > Parameter +Inherit
Language Defaults Inline hints > Default fg: 707084 bg: 3B3B3B
Language Defaults Inline hints > Parameters > Current fg: D6DEEB bg: 7E57C2
Language Defaults Inline hints > Parameters > Default fg: 1A7C7F bg: 3B3B3B
Language Defaults Inline hints > Parameters > Highlighted fg: 20999D bg: 646464
Language Defaults Inline hints > Text without background fg: 707084
Language Defaults Keyword fg: C792EA -Italic
Language Defaults Markup > Attribute fg: 82AAFF -Inherit
Language Defaults Metadata fg: AB51BA -Inherit
Language Defaults String > Escape Sequence > Invalid fg: B71C1C Effects: B71C1C underwaved
Language Defaults String > Escape Sequence > Valid fg: F36D75
Console Colors ANSI Colors > Black fg: 484848 bg:same
Console Colors ANSI Colors > Blue fg: 2072AC bg:same
Console Colors ANSI Colors > Bright Black fg: 6B6B6B bg:same
Console Colors ANSI Colors > Bright Blue fg: 3D99DB bg:same
Console Colors ANSI Colors > Bright Cyan fg: 27B9BE bg:same
Console Colors ANSI Colors > Bright Green fg: 4EFF79 bg:same
Console Colors ANSI Colors > Bright Magenta fg: C792EA bg:same
Console Colors ANSI Colors > Bright Red fg: EF5350 bg:same
Console Colors ANSI Colors > Bright White fg: FFFFFF bg:same
Console Colors ANSI Colors > Bright Yellow fg: FDCC1C bg:same
Console Colors ANSI Colors > Cyan fg: 1E9094 bg:same
Console Colors ANSI Colors > Green fg: 00CC33 bg:same
Console Colors ANSI Colors > Magenta fg: AB51BA bg:same
Console Colors ANSI Colors > Red fg: C03A38 bg:same
Console Colors ANSI Colors > White (Gray) fg: C7C7C7 bg:same
Console Colors ANSI Colors > Yellow fg: CA9F02 bg:same
Console Colors Console > Standard output fg: C7C7C7
Console Colors Console > System output fg: C7C7C7
Java Annotations > Annotation attribute name fg: 20999D
Java Annotations > Annotation name +Inherit
Java Classes and Interfaces > Abstract Class +Inherit
Java Classes and Interfaces > Class +Inherit
Java Classes and Interfaces > Interface +Inherit
Java Methods > Constructor call fg: ADDB67 -Inherit
Java Methods > Method Call +Inherit
Java Methods > Static Method +Inherit
Java Parameters > Implicit anonymous class parameter -fg bg: 2F2F0F -Effects
Java Parameters > Type parameter fg: 20999D
JSON Property key fg: C5E478 -Inherit
JSON String +Inherit
Groovy Classes and Interfaces > Class +Inherit
Groovy Methods > Static method call +Inherit
Groovy Map key/Named argument fg: 20999D -Inherit
Groovy Methods > Method declaration +Inherit
Groovy References > Static property reference +Inherit
Kotlin Braces and Operators > Non-null assertion fg: FF5370
Kotlin Braces and Operators > Operator sign +Inherit
Kotlin Classes and Interfaces > Enum entry fg: F78C6C -Italic -Inherit
Kotlin Classes and Interfaces > Object fg: ADDB67 +Italic -Inherit
Kotlin Functions > Constructor call fg: ADDB67 -Inherit
Kotlin Functions > Package-level function call +Inherit
Kotlin Label +Inherit
Kotlin Named argument fg: 20999D
Kotlin Parameters > Lambda expression default parameter fg: FFFFFF +Bold
Kotlin Parameters > Type parameter +Inherit
Kotlin Properties and Variables > Backing field variable fg: C792EA -Bold
Kotlin Properties and Variables > Dynamic property fg: ADDB67 -Bold -Italic
Kotlin Properties and Variables > Extension property fg: 53BDEC +Italic -Inherit
Kotlin Properties and Variables > Synthetic extension ... fg: 53BDEC -Italic -Inherit
Kotlin Properties and Variables > ... captured in closure -fg bg: 2F2F0F -Inherit
Kotlin Smart-casts > Smart-cast implicit receiver -fg bg: 3F001F
Kotlin Smart-casts > Smart-cast value -fg bg: 3F001F
Kotlin Smart-casts > Smart constant -fg bg: 3F001F
Properties Invalid unicode code points +Inherit
Properties Key/value separator fg: C792EA
Properties Property key fg: C5E478
Properties Valid string escape +Inherit
XML Attribute name +Inherit
XML Tag fg: C792EA -bg -Inherit
XML Tag Data +Inherit
XML Tag Name fg: C5E478
XML Prologue fg: C792EA -bg -Inherit
YAML Key fg: C5E478 -Inherit
YAML Text fg: ECC48D -bg -Inherit
Rainbow Brackets Lite Round Brackets - Color #1 89DDF7
Rainbow Brackets Lite Round Brackets - Color #2 B3A03F
Rainbow Brackets Lite Round Brackets - Color #3 08916A
Rainbow Brackets Lite Round Brackets - Color #4 DF878F
Rainbow Brackets Lite Round Brackets - Color #5 2F9FC3

Visual Studio Code (VS Code)

VS Code 설치

macOS

brew install --cask visual-studio-code

VS Code extensions

Common

NodeJS 관련 확장의 경우, NPM을 통해 필요한 모듈들을 전역에 먼저 설치한다.

  • EditorConfig for VS Code (editorconfig.editorconfig)
  • GitLens — Git supercharged (eamodio.gitlens)
  • Multiple Formatters (Jota0222.multi-formatter)
  • Vim (vscodevim.vim)

Language

프로그래밍 언어 또는 마크업 언어를 정적으로 분석하는 확장임. ESLint 말고는 Microsoft 공식 확장을 제외함.

  • Markdown
    • Markdown All in One (yzhang.markdown-all-in-one)
    • Markdown Extended (jebbs.markdown-extended)
    • Markdown Preview GitHub Styling (bierner.markdown-preview-github-styles)
    • Markdown table from CSV/TSV (jojoco.markdownfromcsv)
  • JavaScript/TypeScript/JSON
    • ESLint (dbaeumer.vscode-eslint)
    • Prettier - Code formatter (esbenp.prettier-vscode)
  • Miscellaneous non-markup
    • Kotlin (fwcd.kotlin)
    • SQL Formatter (adpyke.vscode-sql-formatter)
  • Miscellaneous markup
    • XML (redhat.vscode-xml)
    • TOML
      • Even Better TOML (tamasfe.even-better-toml)

다음 확장은 예외적으로 기록했다.

  • Python
    • Black Formatter (ms-python.black-formatter)
      • Python formatting에 필요하나, VS Code가 추천해주지 않음...

JS/TS framework

  • Frontend big framework
    • Svelte for VS Code (svelte.svelte-vscode)
  • Styling
    • UnoCSS (antfu.unocss)
  • Components
    • shadcn/svelte (Selemondev.vscode-shadcn-svelte)

JSON

  • JSON Tools (eriklynd.json-tools)
  • Sort JSON objects (richie5um2.vscode-sort-json)

Theme

  • Night Owl (sdras.night-owl)

Utils

편의성 기능들임.

  • Bookmarks (alefragnani.Bookmarks)
  • Escape HTML code (raymondcamden.htmlescape-vscode-extension)
  • Escape-quotes (milovidov.escape-quotes)
  • Go to Next/Previous Member (mishkinf.goto-next-previous-member)
  • Quit Control for VSCode (artdiniz.quitcontrol-vscode)
  • URL Encode (flesler.url-encode)

VS Code settings.json

macOS 기준이므로 VIM 키 바인딩 충돌 설정은 뺐음.

{
  //// File extension settings
  "[Compose]": {
    "editor.defaultFormatter": "ms-azuretools.vscode-docker"
  },
  "[css]": {
    "editor.defaultFormatter": "vscode.css-language-features",
    "editor.formatOnSave": true,
    "files.insertFinalNewline": true
  },
  "[dockercompose]": {
    "editor.defaultFormatter": "ms-azuretools.vscode-docker"
  },
  "[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true,
    "multiFormatter.formatterList": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"]
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true,
    "multiFormatter.formatterList": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"]
  },
  "[javascriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true,
    "multiFormatter.formatterList": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint"]
  },
  "[json]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[jsonc]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[markdown]": {
    "editor.quickSuggestions": {
      "comments": "off",
      "strings": "off",
      "other": "off"
    },
    "editor.wordWrap": "on",
    "editor.defaultFormatter": "yzhang.markdown-all-in-one"
  },
  "[python]": {
    "editor.formatOnType": true,
    "editor.defaultFormatter": "ms-python.black-formatter"
  },
  "[scss]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "[svelte]": {
    "editor.defaultFormatter": "svelte.svelte-vscode",
    "multiFormatter.formatterList": [
      // Svelte VS Code Plugin formatter includes Prettier by default.
      "svelte.svelte-vscode",
      // Donno why, but this is not working now. Have no option other than running "Format Document
      // With..." > "ESLint".
      "dbaeumer.vscode-eslint"
    ]
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true,
    "multiFormatter.formatterList": [
      "esbenp.prettier-vscode",
      "dbaeumer.vscode-eslint",
      "vscode.typescript-language-features"
    ]
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true,
    "multiFormatter.formatterList": [
      "esbenp.prettier-vscode",
      "dbaeumer.vscode-eslint",
      "vscode.typescript-language-features"
    ]
  },
  //// Common settings
  "breadcrumbs.enabled": true,
  "diffEditor.ignoreTrimWhitespace": false,
  "editor.bracketPairColorization.enabled": true,
  "editor.fontFamily": "D2Coding, Menlo, Monaco, 'Courier New', monospace",
  "editor.fontSize": 16,
  "editor.suggestSelection": "first",
  "editor.renderFinalNewline": "on",
  "editor.renderWhitespace": "boundary",
  "editor.rulers": [100],
  "extensions.ignoreRecommendations": false,
  "git.mergeEditor": false,
  "html.format.unformatted": "li, p, wbr",
  "window.title": "${rootName}${separator}${activeEditorShort}",
  "workbench.colorTheme": "Night Owl (No Italics)",
  "workbench.editor.decorations.colors": true,
  "workbench.editor.showTabs": "multiple",
  "workbench.editor.wrapTabs": true,
  "workbench.editorAssociations": {
    "*.ipynb": "jupyter-notebook"
  },
  "terminal.integrated.defaultProfile.osx": "zsh-login",
  "terminal.integrated.fontSize": 15,
  "terminal.integrated.inheritEnv": true,
  "terminal.integrated.minimumContrastRatio": 1.2,
  "terminal.integrated.profiles.osx": {
    "zsh-login": {
      "path": "zsh",
      // Use login shell
      // https://github.com/Microsoft/vscode/issues/20265#issuecomment-278818467
      "args": ["-l"]
    }
  },
  //// Extension (non-language) settings
  "gitlens.codeLens.enabled": false,
  "gitlens.views.branches.branches.layout": "list",
  "gitlens.terminal.overrideGitEditor": false,
  "redhat.telemetry.enabled": false,
  //// Extension (language) settings
  "black-formatter.args": ["--line-length", "99", "--skip-string-normalization"],
  "eslint.format.enable": true,
  "eslint.trace.server": "messages",
  // By default, ESLint VS Code Plugin validates JS only.
  "eslint.validate": [
    "javascript",
    "javascriptreact",
    "typescript",
    "typescriptreact",
    "html",
    "svelte",
    "vue"
  ],
  "kotlin.debugAdapter.enabled": false,
  "kotlin.diagnostics.enabled": false,
  "kotlin.indexing.enabled": false,
  "kotlin.languageServer.enabled": false,
  "markdown.editor.filePaste.copyIntoWorkspace": "never",
  "markdown.extension.toc.updateOnSave": false,
  "markdown-pdf.displayHeaderFooter": false,
  "markdown-preview-github-styles.darkTheme": "dark_dimmed",
  "prettier.printWidth": 100,
  "prettier.singleQuote": true,
  "prettier.trailingComma": "all",
  "svelte.enable-ts-plugin": true,
  "typescript.updateImportsOnFileMove.enabled": "never",
  //// Theme customization
  // Original: https://github.com/sdras/night-owl-vscode-theme/blob/main/themes/Night%20Owl-color-theme-noitalic.json
  "workbench.colorCustomizations": {
    "editorBracketHighlight.foreground1": "#89DDF7",
    "editorBracketHighlight.foreground2": "#B3A03F",
    "editorBracketHighlight.foreground3": "#08916A",
    "editorBracketHighlight.foreground4": "#DF878F",
    "editorBracketHighlight.foreground5": "#2F9FC3",
    // // Dark background
    // "terminal.background": "#161616",
    // "editorHoverWidget.background": "#161616",
    // "editor.background": "#161616",
    // "editorGutter.background": "#161616",
    "terminal.foreground": "#C7C7C7",
    "terminal.ansiBlack": "#484848",
    "terminal.ansiBrightBlack": "#6B6B6B",
    "terminal.ansiBlue": "#2072AC",
    "terminal.ansiBrightBlue": "#3D99DB",
    "terminal.ansiCyan": "#1E9094",
    "terminal.ansiBrightCyan": "#27B9BE",
    "terminal.ansiGreen": "#00CC33",
    "terminal.ansiBrightGreen": "#4EFF79",
    "terminal.ansiMagenta": "#AB51BA",
    "terminal.ansiBrightMagenta": "#C792EA",
    "terminal.ansiRed": "#C03A38",
    "terminal.ansiBrightRed": "#EF5350",
    "terminal.ansiWhite": "#C7C7C7",
    "terminal.ansiBrightWhite": "#FFFFFF",
    "terminal.ansiYellow": "#CA9F02",
    "terminal.ansiBrightYellow": "#FDCC1C"
  },
  "editor.tokenColorCustomizations": {
    "[Night Owl (No Italics)]": {
      "variables": "#D6DEEB",
      "textMateRules": [
        {
          "name": "Keyword Operator",
          "scope": "keyword.operator",
          "settings": {
            "foreground": "#C792EA"
          }
        },
        {
          "name": "Keyword",
          "scope": [
            "constant.language",
            "constant.language.boolean",
            "constant.language.null",
            "variable.language.this",
            "keyword.operator.new",
            "meta.method.declaration storage.type"
          ],
          "settings": {
            "foreground": "#C792EA"
          }
        },
        {
          "name": "Constant Character Escape",
          "scope": ["constant.character.escape"],
          "settings": {
            "foreground": "#F36D75"
          }
        },
        {
          "name": "Function Argument",
          "scope": ["meta.function-call"],
          "settings": {
            "foreground": "#D6DEEB"
          }
        },
        {
          "name": "Object Property",
          "scope": ["variable.other.object.property"],
          "settings": {
            "foreground": "#7FDBCA"
          }
        },
        {
          "name": "Support Function",
          "scope": ["support.function"],
          "settings": {
            "foreground": "#82AAFF",
            "fontStyle": "italic"
          }
        },
        {
          "name": "Entity Type",
          "scope": [
            "entity.name.type",
            "entity.name.type.js",
            "entity.name.type.jsx",
            "entity.name.type.ts",
            "entity.name.type.tsx",
            "entity.name.type.module",
            "entity.name.type.module.js",
            "entity.name.type.module.jsx",
            "entity.name.type.module.ts",
            "entity.name.type.module.tsx",
            "support.class",
            "support.type",
            "storage.type.generic.java",
            "meta.definition.variable.java storage.type.java",
            "meta.method.identifier.java storage.type.java"
          ],
          "settings": {
            "foreground": "#ADDB67"
          }
        },
        {
          "name": "Entity Class (Including JS/TS Interface)",
          "scope": [
            "meta.class entity.name.type.class",
            "meta.class entity.name.type.class.js",
            "meta.class entity.name.type.class.jsx",
            "meta.class entity.name.type.class.ts",
            "meta.class entity.name.type.class.tsx",
            "entity.other.inherited-class",
            "meta.interface entity.name.type.interface.js",
            "meta.interface entity.name.type.interface.jsx",
            "meta.interface entity.name.type.interface.ts",
            "meta.interface entity.name.type.interface.tsx"
          ],
          "settings": {
            "foreground": "#ADDB67"
          }
        },
        {
          "name": "Entity Interface",
          "scope": ["meta.interface entity.name.type.interface"],
          "settings": {
            "foreground": "#35C37F"
          }
        },
        {
          "name": "Entity Enum",
          "scope": ["entity.name.type.enum"],
          "settings": {
            "foreground": "#ADDB67"
          }
        },
        {
          "name": "String Template",
          "scope": [
            "meta.template.expression.js",
            "meta.template.expression.jsx",
            "meta.template.expression.ts",
            "meta.template.expression.tsx"
          ],
          "settings": {
            "foreground": "#F36D75"
          }
        },
        {
          "name": "HTML/XML Entity Tag Name",
          "scope": ["entity.name.tag"],
          "settings": {
            "foreground": "#C5E478"
          }
        },
        {
          "name": "HTML/XML Entity Attribute Name",
          "scope": ["entity.other.attribute-name"],
          "settings": {
            "foreground": "#82AAFF"
          }
        },
        {
          "name": "JavaScript/TypeScript Object Key",
          "scope": ["meta.object.member"],
          "settings": {
            "foreground": "#7FDBCA"
          }
        },
        {
          "name": "React Tag Non-Component Name",
          "scope": ["entity.name.tag.jsx", "entity.name.tag.tsx"],
          "settings": {
            "foreground": "#35C37F"
          }
        },
        {
          "name": "React Tag Component Name",
          "scope": ["support.class.component.jsx", "support.class.component.tsx"],
          "settings": {
            "foreground": "#C9E290"
          }
        },
        {
          "name": "React Tag Attribute Name",
          "scope": ["entity.other.attribute-name.jsx", "entity.other.attribute-name.tsx"],
          "settings": {
            "foreground": "#53BDEC"
          }
        },
        {
          "name": "Java/Kotlin Annotation",
          "scope": [
            "meta.declaration.annotation.java",
            "meta.declaration.annotation.java storage.type.annotation.java",
            "entity.name.type.annotation.kotlin",
            "entity.name.type.annotation-site.kotlin"
          ],
          "settings": {
            "foreground": "#AB51BA"
          }
        },
        {
          "name": "Java Package/Import Statement Target",
          "scope": [
            "meta.package.java storage.modifier.package.java",
            "meta.import.java storage.modifier.import.java"
          ],
          "settings": {
            "foreground": "#D6DEEB"
          }
        },
        {
          "name": "Java Primitive Type",
          "scope": ["storage.type.primitive.java"],
          "settings": {
            "foreground": "#C792EA"
          }
        },
        {
          "name": "Python language constants",
          "scope": ["constant.language.python"],
          "settings": {
            "foreground": "#C792EA"
          }
        },
        {
          "name": "Python function call argument parameter name",
          "scope": "source.python meta.function-call.python meta.function-call.arguments.python variable.parameter.function-call.python",
          "settings": {
            "foreground": "#20999D"
          }
        },
        {
          "name": "JSON Property Key",
          "scope": ["support.type.property-name.json"],
          "settings": {
            "foreground": "#C5E478"
          }
        },
        {
          "name": "JSON Property Value",
          "scope": ["meta.structure.dictionary.value.json string.quoted.double"],
          "settings": {
            "foreground": "#ECC48D"
          }
        },
        {
          "name": "JSON Property Special Value",
          "scope": [
            "meta.structure.dictionary.json meta.structure.dictionary.value constant.language"
          ],
          "settings": {
            "foreground": "#C792EA"
          }
        },
        {
          "name": "Properties Property Key",
          "scope": ["keyword.other.definition.ini"],
          "settings": {
            "foreground": "#C5E478"
          }
        },
        {
          "name": "Properties Property Key-Value Separator",
          "scope": ["punctuation.separator.key-value.ini"],
          "settings": {
            "foreground": "#89DDF7"
          }
        },
        {
          "name": "YAML Entity Name Tag",
          "scope": ["entity.name.tag.yaml"],
          "settings": {
            "foreground": "#C5E478"
          }
        }
      ]
    }
  }
}

VS Code keybindings.json

macOS 기준!

[
  //// Sidebars
  // Explorer sidebar
  {
    "key": "ctrl+alt+e",
    "command": "workbench.view.explorer"
  },
  // Search sidebar
  {
    "key": "ctrl+alt+f",
    "command": "workbench.action.findInFiles"
  },
  {
    "key": "shift+cmd+f",
    "command": "-workbench.action.findInFiles"
  },
  // Source Control sidebar
  {
    "key": "ctrl+alt+s",
    "command": "workbench.view.scm"
  },
  // Toggle sidebar
  {
    "key": "shift+cmd+0",
    "command": "workbench.action.toggleSidebarVisibility"
  },
  //// Build and run
  // Build task
  {
    "key": "ctrl+b",
    "command": "workbench.action.tasks.build"
  },
  {
    "key": "cmd+b",
    "command": "-workbench.action.toggleSidebarVisibility"
  },
  // Run task
  {
    "key": "ctrl+x",
    "command": "workbench.action.tasks.test"
  },
  //// Editor tabs and groups
  // Move between editor tabs (VIM arrow)
  {
    "key": "ctrl+h",
    "command": "workbench.action.previousEditor",
    "when": "!terminalFocus"
  },
  {
    "key": "ctrl+l",
    "command": "workbench.action.nextEditor",
    "when": "!terminalFocus"
  },
  // Move between editor groups (VIM arrow)
  {
    "key": "ctrl+shift+h",
    "command": "workbench.action.focusLeftGroup",
    "when": "!terminalFocus"
  },
  {
    "key": "ctrl+shift+l",
    "command": "workbench.action.focusRightGroup",
    "when": "!terminalFocus"
  },
  //// Navigation
  // Go back/forward
  {
    "key": "ctrl+alt+h",
    "command": "workbench.action.navigateBack",
    "when": "editorFocus"
  },
  {
    "key": "ctrl+alt+l",
    "command": "workbench.action.navigateForward",
    "when": "editorFocus"
  },
  //// Editor text
  // Auto indention
  {
    "key": "shift+cmd+f",
    "command": "editor.action.formatDocument",
    "when": "editorTextFocus && !editorReadonly"
  },
  {
    "key": "shift+cmd+f",
    "command": "-workbench.view.search",
    "when": "!searchViewletVisible"
  },
  // Expand/shrink selection
  {
    "key": "alt+k",
    "command": "editor.action.smartSelect.expand",
    "when": "editorTextFocus"
  },
  {
    "key": "alt+j",
    "command": "editor.action.smartSelect.shrink",
    "when": "editorTextFocus"
  },
  // Move line up/down (VIM arrow)
  {
    "key": "shift+alt+k",
    "command": "editor.action.moveLinesUpAction",
    "when": "editorTextFocus && !editorReadonly"
  },
  {
    "key": "shift+alt+j",
    "command": "editor.action.moveLinesDownAction",
    "when": "editorTextFocus && !editorReadonly"
  },
  // Editor suggestion (select prev/next)
  {
    "key": "ctrl+j",
    "command": "selectNextSuggestion",
    "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus"
  },
  {
    "key": "ctrl+j",
    "command": "-editor.action.joinLines",
    "when": "editorTextFocus && !editorReadonly"
  },
  {
    "key": "ctrl+k",
    "command": "selectPrevSuggestion",
    "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus"
  },
  {
    "key": "ctrl+k",
    "command": "-deleteAllRight",
    "when": "textInputFocus && !editorReadonly"
  },
  //// Code
  // Rename
  {
    "key": "shift+cmd+r",
    "command": "editor.action.rename",
    "when": "editorHasRenameProvider && editorTextFocus && !editorReadonly"
  },
  // Go to next/previous problem (JenBrains style)
  {
    "key": "f2",
    "command": "editor.action.marker.nextInFiles",
    "when": "editorFocus"
  },
  {
    "key": "f2",
    "command": "-editor.action.rename",
    "when": "editorHasRenameProvider && editorTextFocus && !editorReadonly"
  },
  {
    "key": "shift+f2",
    "command": "editor.action.marker.prevInFiles",
    "when": "editorFocus"
  },
  // Go to references(usages)
  {
    "key": "cmd+u",
    "command": "editor.action.goToReferences",
    "when": "editorHasReferenceProvider && editorTextFocus && !inReferenceSearchEditor && !isInEmbeddedEditor"
  },
  {
    "key": "cmd+u",
    "command": "-cursorUndo",
    "when": "textInputFocus"
  },
  // Quick fix (JetBrains style)
  {
    "key": "alt+enter",
    "command": "editor.action.quickFix",
    "when": "editorHasCodeActionsProvider && editorTextFocus && !editorReadonly"
  },
  //// Terminal
  // Create integrated terminal
  {
    "key": "alt+shift+`",
    "command": "workbench.action.terminal.new"
  },
  // Kill integrated terminal
  {
    "key": "ctrl+shift+`",
    "command": "workbench.action.terminal.kill"
  },
  // Move between integrated terminal tabs (VIM arrow)
  {
    "key": "ctrl+h",
    "command": "workbench.action.terminal.focusPrevious",
    "when": "terminalFocus"
  },
  {
    "key": "ctrl+l",
    "command": "workbench.action.terminal.focusNext",
    "when": "terminalFocus"
  },
  // Integrated terminal creation for Python VEnv
  {
    "key": "cmd+ctrl+shift+`",
    "command": "python.createTerminal"
  },
  //// Extension - Go to Next/Previous Member (VIM arrow)
  {
    "key": "ctrl+alt+j",
    "command": "gotoNextPreviousMember.nextMember",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+alt+k",
    "command": "gotoNextPreviousMember.previousMember",
    "when": "editorTextFocus"
  },
  //// Others
  // Show definition
  {
    "key": "cmd+b",
    "command": "editor.action.revealDefinition",
    "when": "editorHasDefinitionProvider && editorTextFocus && !isInEmbeddedEditor"
  },
  // Show hover
  {
    "key": "f1",
    "command": "editor.action.showHover",
    "when": "editorTextFocus"
  },
  // Developers: Inspect Editor Tokens and Scopes
  {
    "key": "ctrl+shift+cmd+i",
    "command": "editor.action.inspectTMScopes"
  }
]

DBeaver Community

DBeaver 설치

JDK가 필요하다.

macOS

brew install --cask dbeaver-community

DBeaver Preferences

Dark theme 설정

User Interface > Apperance

"Enable theming" 체크 상자를 설정하고, "Theme"을 "Dark Theme"로 둔다.

글꼴 설정

User Interface > Apperance > Colors and Fonts

"DBeaver Fonts > Monospace Font"를 "D2Coding, 15"로 설정한다.

SQL format 설정

Editors > SQL Editor > Formatting

"Settings" 영역에 있는 설정들을 바꾼다.

  • "Insert spaces for tabs" 체크 상자를 설정한다.
  • "Keyword case"를 "Upper"로 지정한다. (원래는 "Default")

Text editor 추가 설정

Editors > Text Editors

  • "Show line numbers" 체크 상자를 설정한다.
  • "Show whitespace characters" 체크 상자를 설정한다. "Configure visibility"를 눌러서 뜨는 dialog는 다음처럼 설정한다.
    • Space: Leading, Trailing
    • Tab: Leading, Enclosed, Trailing
    • Line Feed: (None)
    • Transparency level: 80 -> 63

Heap status 설정

General

"Show heap status" 체크 상자를 설정한다.

DBeaver 단축키 설정

User Interface > Keys

Action Category Default My binding
Execute SQL Query SQL Editor control-enter command-enter
Content Format SQL Editor control-shift-F shift-command-F

DBeaver Plugins

Eclipse Marketplace Client

Help > Install New Software...

아래 URL을 이용해서, 가장 먼저 설치해야 한다. Eclipse IDE처럼 plugin을 자유롭게 고를 수 있게 해준다.

DBeaver 24.x 버전부터 Eclipse Marketplace Client 1.10.0 버전이 제대로 동작하지 않게 됐다.

https://download.eclipse.org/mpc/releases/1.10.3

Marketplace에서 설치할 plugin

  • Vrapper (Vim)

Postman

Postman 설치

Node.JS 런타임이 필요하다 (Interceptor 때문).

macOS

brew install --cask postman

macOS Interceptor 설치

macOS는 Chrome 라이브러리 디렉터리 권한 때문에 설치가 잘 안 된다 (~/Library/Application Support/Google/Chrome/NativeMessagingHosts).

FILE_PERMISSIONS_REQUIRED 오류로 인해 막힐 경우, 아래 웹페이지에서 직접 다운로드받아서 수작업으로 넣어본다.
https://learning.postman.com/docs/sending-requests/capturing-request-data/interceptor/#installing-interceptor

Chrome에서는 확장을 따로 설치해주면 된다.

'개발 > 개발 잡다' 카테고리의 다른 글

개발 환경 설정 (2023 ~ 2024)  (2) 2023.03.29
개발 환경 설정 (2020~2022)  (2) 2020.01.05
개발 설정 (2018~2019)  (0) 2018.01.25

+ Recent posts