레이블이 iterm2인 게시물을 표시합니다. 모든 게시물 표시
레이블이 iterm2인 게시물을 표시합니다. 모든 게시물 표시

use fastfetch instead of neofetch

iterm2 에서 neofetch 로 다음 옵션으로 이미지 출력을 하고 있었다.
neofetch --backend iterm2 --size 300 --source ${HOME}/xelloss.jpg

그런데 언제부터 이미지와 텍스트 사이 공백이 많이 벌어졌다.
아직 해결되지 않은 상태로 보인다.

대신 다음과 같이 fastfetch 프로그램을 사용하면 된다.
fastfetch --logo-type iterm --logo ${HOME}/xelloss.jpg --logo-width 50 --logo-height 20

버전 정보
neofetch --version
Neofetch 7.1.0

fastfetch --version
fastfetch 1.12.2 (x86_64)

Alacritty terminal emulator

terminal emulator 는 맥에서 iterm2 를, 윈도우에서는 자체 terminal 를 쓰고 있었다.

여담이지만 윈도우에서는 microsoft(마소) terminal 나오기전까지 hyper 를 썼었다.
오픈소스라 좋았지만 자잘한 버그도 꽤있었다. 마소 오픈소스로 terminal(스타수 69K , 2020-11기준)을 내놓은건 정말 잘한것 같다.

여러 터미널 예뮬레이터가 중 아직 0.5 버전이지만 스타수가 27k(2020-11기준)나 되고 
GPU Acceleration 으로 아주 빠르다는 alacritty 를 사용하게 됐다.
사실 rust 로 만들었다고 해서 더 끌렸는데, 
사용중인 ripgrep, fd, bat 등의 rust 로 만든 프로그램들이 아주 좋기 때문이다.

맥(catalina 버전)에서 brew 또는 cargo 또는 깃헙에 올려둔 Alacritty-v0.5.0.dmg 릴리즈 파일을 설치 후 실행하면 다음과 같은 에러가 발생한다.

이때는 system preferences > security & privacy > allows apps download from > app store and identified developers 로 선택한다.

설치하기
직접 클론 받아 빌드 & 설치하는 경우
cd alacritty
make app && make install

빌드 바이너리를 사용하는 경우, 아래 URL 에서 다운받으면 된다.

alacritty 깃헙에서 alcritty.yml 설정 파일을 ${HOME}/.alcritty.yml 로 위치시키고
폰트, 컬러, 크기등을 입맛에 맞게 설정해 저장하면 즉시 반영돼 보인다.

#####

alacritty vs iterm2 (GPU rendering 활성화)
성능 비교를 위해 다음 명령으로 수행시간을 측정했다.
time tree /usr

user+system 수행 시간 자체는 비슷하지만 화면에 뿌려지는 시간 차이가 난다.
alacrityy = 28 s
iterm2 = 35 s

time seq 1 1000000

seq 로 숫자 출력되는 속도도 alacritty 가 빠르다.
alacritty = 1.200 s
iterm2 = 4.156 s

터미널 화면을 크게 하고 cacademo 플레이 했을때도 iterm2 는 많이 끊기는데,
alacritty 는 매끄럽게 재생된다.(이건 fps 결과가 없어 직접 눈으로 체감해봐야 한다.)

역시 rust == fast 다. alacritty 터미널 화면 출력에서 확실히 빠른게 체감된다.
CPU 를 많이 쓰긴 하지만 빠른 화면 출력이 맘에 들고 폰트,컬러등 화면도 잘 나와 iterm2 보다 alacritty 를 주로 사용할것 같다.
(추가로 윈도우에서도 위 테스트를 해봤는데, terminal 더 빠르다. 윈도우에서는 terminal 을 주로 사용)

#####

디폴트 단축키
마우스 클릭으로 URL 오픈시 
iterm2: cmd+click
alacritty: shift+click

마우스 클릭으로 블럭(단어) 선택시
iterm2: alt+double-click
alacritty: shift+double-click

마우스 클릭으로 라인전체 선택시
iterm2: alt+triple-click
alacritty: shift+triple-click

#####

윈도우 환경
설정파일 위치
%APPDATA%\alacritty\alacritty.yml

wsl(windows subsystem for linux) 실행
alacritty -e wsl

터미널에서 이미지 보기

# 터미널에서 이미지 파일 보기
# imagemagick 의 display 명령으로 터미널에서 이미지를 볼 수 있다고 하지만
# X11 앱 및 X11 용 imagemagick 설치등 까다롭다.
# iterm2 를 사용한다면 imgcat 스크립트를 사용해도 된다.
wget https://iterm2.com/utilities/imgcat
chmod +x imgcat
imgcat ./image.jpg

# terminal-image-viewer 는 ansi, unicode 로 이미지를 보여준다.
npm install -g terminal-image-viewer
tiv -w 70 -h 30 ./image.jpg


kerberos 패스워드 입력 문제

# mac + iterm2 + zsh(prezto) 환경에서
# 터미널을 오래동안 열어두고 사용하다 보면 어느순간 부터
# kerberos 패스워드 입력이 안되는 경우가 발생한다.
ysoftman@ysoftmanMac ~/workspace/❯ kinit ysoftman
ysoftman@ysoftman-company.com's password:
kinit: failed to read password
ysoftman@ysoftmanMac ~/workspace/❯ mypassword
zsh: command not found: mypassword

# stdin 입력을 테스트 해보면 이상은 없어 보인다.
ysoftman@ysoftmanMac ~/workspace/❯ read a
ysoftman input test
ysoftman@ysoftmanMac ~/workspace/❯ echo $a
ysoftman input test

# iterm 은 닫지 않고 bash 또는 zsh 쉘을 시작해도 같은 문제가 발생하고
# iterm 로 새 터미널을 시작하면 패스워드가 입력된다.
# mac 기본 kint
which kinit
/usr/bin/kinit

# 버전을 보면 오래 된것 같아
kinit --version
kinit (Heimdal 1.5.1apple1)
Copyright 1995-2011 Kungliga Tekniska Högskolan
Send bug-reports to heimdal-bugs@h5l.org

# 새 버전(1.18.2)을 설치 해봤다.
brew install krb5

# 새 버전의 kinit 을 사용하면 패스워드 입력이 잘 된다.
/usr/local/opt/krb5/bin/kinit

# 원래 맥에서 기본 제공하는 /usr/bin/ 의 curl,kinit 같은 프로그램은
# brew link --force 로도 /usr/local/bin/ 에 링크 생성을 못해
# PATH 환경변수에 /usr/local/opt/ 를 추가해야 한다
# export PATH=/usr/local/opt/krb5/bin:$PATH
# 하지만 다음과 같이 /usr/local/opt/krb5/bin/kinit 가 우선하는 상황에서
which -a kinit
/usr/local/opt/krb5/bin/kinit
/usr/bin/kinit

# /usr/local/opt/krb5/bin/kinit 를 사용하면 ssh 접속시 암호를 물어보는 등의 문제가 발생했다.
# 이런 문제로 /usr/local/opt/krb5/bin/kdestroy 하고 원래의 /usr/bin/kinit(klist,kdestroy) 를 사용해야 했다.

iterm2 단축키

[분할개념]
Window(창) > tabs > panes

[단축키
cmd + enter : iterm2 창 최대화 토글
cmd + , : iterm2 설정
cmd + i : 현재 (세션) 설정
cmd + + : 폰트 키우기
cmd + - : 폰트 줄이기
cmd + n : 새창 열기
cmd + d  : 세로로 pane 분리
cmd + shift + d : 가로로 pane 분리
cmd + ] : 다음 pane 선택
cmd + [ : 이전 pane 선택
cmd + t : 탭 추가
cmd + left : 이전 탭 선택
cmd + right : 다음 탭 선택
cmr + r : 현재 pane 리셋(클리어)
cmd + / : 커서 위치 찾기
cmd + shift + e : 현재 pane 에 타임스탬프 보이기
cmd + shift + i : 분할된 모든 pane 에 입력 커서 활성화 토글(창내의 모든 pane,tab에 똑같은 입력할때 유용)
ctrl + a : 현재 커맨드 라인의 시작으로 커서 이동
ctrl + e : 현재 커맨드 라인의 끝으로 커서 이동
ctrl + - : 실행취소(undo)
cmd + shift + s : 현재 윈도우 정렬(멀티pane,위치,크기등)상태 저장
cmd + shift + r : 저장된 윈도우 정렬 복원(별도의 창을 생성해서 불러오기)

[윈도우 정렬 상태 관련]
- 현재 창의 새로운 탭에 복원하려면 restore window arrangement as tabs 사용
- 저장된 윈도우 상태들은 iterm설정(cmd+,) -> arrangements 에서 확인, 삭제 가능

libcaca 터미널에 텍스트 그래픽 출력하기

libcaca 는 텍스트로 터미널에 그래픽을 표현하는 라이브러리다.
http://caca.zoy.org/wiki/libcaca

# 맥기준 설치
brew install libcaca

# 설치하면 요런것들을 실행할 수 있다.
/usr/local/bin/caca-config
/usr/local/bin/cacaclock
/usr/local/bin/cacademo
/usr/local/bin/cacafire
/usr/local/bin/cacaplay
/usr/local/bin/cacaserver
/usr/local/bin/cacaview

# cacademo, cacafire 를 실행하면 텍스트 그래픽으로 표현한 다양한 다음과 같은 데모들을 볼 수 있다.


# cacaclodk 은 .tlf 폰트 파일이 필요하다.
# figlet 을 설치하면 .tlf 폰트도 같이 설치되니 이걸 사용하면 된다.
brew install figlet
cacaclock -f "/usr/local/share/figlet/mono12.tlf"

# 참고
# iterm2 의 최근 nightly 버전을 설치하면 GPU 가속을 사용해야 부드럽게 보인다.
# iterm2 GPU 기능 활성화
preferences -> advanced -> user metal GPU-based renderer -> yes
preferences -> advanced -> show FPS meter -> yes

terminal, terminal-emulator, console, shell 차이

쉘(shell)은 확실히 명령 처리 프로그램으로 구분이 가지만 터미널(terminal), 콘솔(console)이라는 용어는 많이 혼용해서 사용하는 것 같다.
뭐 거의 비슷한 의미를 가지고 있지만 정확히 분류하면 다음과 같다.

터미널 = 텍스트 입출력 환경, tty(teletypewriter, 전기 타자기)라고도불린다. 엄밀히는 부팅시 GUI 로 시작하지 않고 CLI 로 진입한 경우를 터미널이라고 하고 GUI 로 환경에서 창을 띄워 터미널을 사용할 수 있는 것을 터미널 에뮬레이터(emulator) 라고 한다.
콘솔 = 물리적 측면에서의 터미널, (초창기 유닉스 장비의 가구 느낌)
쉘 = 커맨드 실행(인터프리터) 프로그램

참고
https://askubuntu.com/questions/506510/what-is-the-difference-between-terminal-console-shell-and-command-line

위 링크에서 초창기 유닉스 시스템 사진을 보면 큰 기계 장치를 일종의 가구에 비유해 콘솔이라를 이름을 붙인것 같다.

ohmyzsh url escape bug

[이슈]
iterm2 를 사용하다 url 스트링을 copy & paste 하면 escape(\) 가 붙는 경우가 발생한다.
처음에는 iterm2 의 paste 설정에 escape 가 활성화되어 발생한줄 알았는데,
"escape shell characters with \" 기능을 비활성화되어 있었다.
iterm2 menu -> edit -> paste special -> advacned paste (opt + cmd + v)


원인은 ohmyzsh 사용에 있었다. (prezto 쉘 환경에서는 발생하지 않는다.)

[해결방법]
찾아 보니 해당 버그는 ohmyzsh 의 노운이슈로 zsh 5.2 + 맥 10.12 에서 발생한다.
https://github.com/robbyrussell/oh-my-zsh/issues/5499

다음 스택오버플로우에 스크립트를 수정하여 해결하는 방법이 명시되어 있다.
https://stackoverflow.com/questions/25614613/how-to-disable-zsh-substitution-autocomplete-with-url-and-backslashes

그냥 다음 버전에 고쳐지기를 기다려 봐야겠당~ㅋ

mac ls 전체 시간 표시

리눅스에서 ls -l (long listing format) 옵션을 사용하면 파일 수정날짜가 yyyy-mm-dd hh:mm 으로 표시되지만 맥에서 ls -l 사용시 다음과 같이 mm dd hh:mm 으로 년도가 빠져보인다.


-T 옵션을 추가하면 아래와 같이 초와 년도가 표시된다.


참고로 -T 옵션은 맥 ls 에서만 사용된다.
리눅스에서는 --full-time(-l --time-style=full-iso) 로 지정하면 초단위까지 표시된다.
ls --full-time

Linux 터미널 멀티플렉서 Tmux

Tmux (terminal multiplexer)는 하나의 터미널을 다수의 pane(영역)으로 구분하여 프로그램을 실행하고 각 프로그램 사이를 쉽게 이동할 수 있는 툴이다. 보통을 screen 툴을 사용하거나 gui 환경에선 터미널을 여러개의 탭으 생성하여 사용하는데, 한화면에서 여러개의 프로그램으로 돌리며 모니터링할 수 있는데는 tmux 가 좋다.
공식 홈페이지 http://tmux.sourceforge.net/

# Ubuntu 에서 설치
sudo apt-get install tmux

# CentOS 에서 설치
sudo yum install tmux

# MacOS 에서 설치
brew install tmux


#####


# tmux 명령어/단축키
tmux -V # 버전, 버전에 따라 명령이 조금 달라질 수 있다.
tmux # 실행(새로운 세션으로 터미널 열림)
tmux new-session # 실행(새로운 세션으로 터미널 열림)
tmux list-commands # tmux 명령어 보기
tmux ls # 열려 있는 세션 리스트
tmux kill-server # 모든 세션(tabs,pane)종료
tmux list-windows # tab(window) 리스트
tmux list-panes # pane 리스트
tmux a # 세션 붙이기(attach)
ctrl+b d # 세션 떼기(detach)

ctrl+b c # 새 window(tab) 생성
ctrl+b w # tab 리스트 보기 및 선택
ctrl+b n # 다음 tab 이동
ctrl+b p # 이전 tab 이동
ctrl+b f # tab 찾기
ctrl+b 번호  # tab 로 이동
ctrl+b , # 현재 tab 이름 변경
ctrl+b & 또는 exit # 현재 tab 종료

ctrl+b % # 수직으로 pane 나누기
ctrl+b " # 수평으로 pane 나누기
ctrl+b q 번호선택 # pane 번호 보기 및 번호로 pane 선택
ctrl+b 방향키 # pane 이동(ctrl+b 후 방향키로 계속 이동 가능)
ctrl+b spacebar # pane 레이아웃 변경
ctrl+b alt+방향키 # pane 크기 변경
ctrl+b x 또는 exit # 현재 pane 종료

ctrl+b m 현재 pane mark/unmark
ctrl+b { 현재 선택한 pane 과 위쪽 pane 위치 교환
ctrl+b } 현재 선택한 pane 과 아래쪽 pane 위치 교환


ctrl+b : # 명령 프롬프트 사용
ctrl+b t # 현재 시간 보기
ctrl+b ? # 설정된 단축키 보기

# copy & paste
# setw -g mode-keys vi 로 vi 단축키를 활성화 선행
ctrl+b [ # copy mode 시작
spacebar # 블럭지정 시작, 방향키로 복사할 블럭 지정
enter # 복사
ctrl+b ] # 붙이기

# find
ctrl+b [ # copy mode 시작
/ # 찾을 문자 입력, vi 찾기와 같음

# 수직분할 후 수평분할된 3개의 pane 을 가진 세션 시작
tmux new-session \; \
split-window -v \; \
split-window -h \;
attach


#####


# tmux 시작시 로딩되는 설정파일
# 명령 프롬프트로에서도 사용
vi ~/.tmux.conf
# -g global option
set -g display-panes-time 5000 # 5초 동안 pane 숫자 보이기

# 마우스 사용 활성화
# tmux 1.9 이전
#set -g mode-mouse on
#set -g mouse-resize-pane on
#set -g mouse-select-pane on
#set -g mouse-select-window on
# tmux 1.9 이후
set -g mouse on

# setw -> set window
setw -g mode-keys vi # vi 단축키 사용(디폴트는 emacs)

#setw synchronize-pane on # 모든 panes 에 동시 입력 활성화
#setw synchronize-pane off # 모든 panes 에 동시 입력 해제

# ctrl+b i panes 동시 입력 활성화 단축키
# ctrl+b I panes 동시 입력 비활성화 단축키
bind i setw synchronize-panes on
bind I setw synchronize-panes off

# 기본 prefix(ctrl+b) 대신 ctrl+a 사용하기
#set -g prefix C-a
#bind C-a send-prefix
#unbind C-b


# 여러개의 pane 생성하고(tiled 레이아웃 사용) 각 pane 에 명령 실행하기
# 현재 창을 계속 split-window 하면 공간이 없다는 에러 발생하기 때문에
# select-pane 으로 활성 창을 옮겨가며 분할해야 한다.
unbind S
bind S \
split-window -v\; \
split-window -v\; \
split-window -v\; \
split-window -v\; \
select-pane -t 00\; \
split-window -h\; \
split-window -h\; \
split-window -h\; \
select-pane -t 04\; \
split-window -h\; \
split-window -h\; \
split-window -h\; \
select-pane -t 08\; \
split-window -h\; \
select-layout tiled\;

# 위에 생성한 창(pane)들의 쉘 프롬프트가 늦게 뜨면 send-key 전달이 되지 않아
# 창들의 쉘 프롬프트가 완료된 후 접속하는것이 좋다.
unbind s
bind s \
select-pane -t 00\; send-keys 'echo ysoftman0' Enter \; \
select-pane -t 01\; send-keys 'echo ysoftman1' Enter \; \
select-pane -t 02\; send-keys 'echo ysoftman2' Enter \; \
select-pane -t 03\; send-keys 'echo ysoftman3' Enter \; \
select-pane -t 04\; send-keys 'echo ysoftman4' Enter \; \
select-pane -t 05\; send-keys 'echo ysoftman5' Enter \; \
select-pane -t 06\; send-keys 'echo ysoftman6' Enter \; \
select-pane -t 07\; send-keys 'echo ysoftman7' Enter \; \
select-pane -t 08\; send-keys 'echo ysoftman8' Enter \; \
select-pane -t 09\; send-keys 'echo ysoftman9' Enter \; \
select-pane -t 10\; send-keys 'echo ysoftman10' Enter \; \
select-pane -t 11\; send-keys 'echo ysoftman11' Enter \;

# 별도 설정 파일 읽기
# source-file ~/workspace/a/a.conf;
# 별도 설정 파일이 존재하면 읽기
if-shell "test -f ~/workspace/a/a.conf" "source ~/workspace/a/a.conf"

# tmux 다시 읽기
# display-message (alias: display) 상태바에 메시지 출력  -p 사용하면 stdout에 출력
bind r source-file ~/.tmux.conf \; display "ysoftman ~/.tmux.conf loaded"

# 현재 바인딩되 있는 모든 단축키 확인
tmux list-keys


#####


iterm2 에서 tmux의 내용을 마우스 드래그해서 copy and paste 가 안될때는
iterm2 -> preferences -> gerneral -> applications in terminal my access clipboard 활성화 (아래 그림 참고)



#####


# .bashrc, .zshrc 에 설정시
# TMUX 변수 값을 확인해 중복 실행을 막는다.
if [ -z "$TMUX" ]; then exec tmux; fi

vim command

[vim 설치]
# vim 은 vi 를 향상시킨 버전으로 GUI 용인 gVim 도 있다.
# 윈도우 또는 소스설치는 vim 사이트에서 다운로드
http://www.vim.org/
# 레드햇 계열 리눅스
sudo yum install vim
# 데미안 계열 리눅스
sudo apt-get install vim

[용어]
normal 모드 : 기본 모드로 명령을 실행할 수 있는 상태로, 다른 모드로 전환하기 전의 상태
insert 모드 : i, a 등으로 수정(쓰기)작업을 할 수 있는 상태
visual 모드 : v 로 특정 블럭을 지정(선택)할 수 있는 상태
register : yank(copy역할)등으로 저장된 메모리 공간(클립보드 역할)
buffer : 파일을 읽어 놓은 메모리 공간, 버퍼 수정 저장해야 파일로 쓰게 된다.
window : 버퍼 내용이 표시되는 화면
tab : 여러 windows 들의 모음

[.vimrc 설정 예시]
" vimrc 에서 주석은 " 를 사용한다.
" ysoftman .vimrc 설정
syntax on
color elflord
set number
set hlsearch
set incsearch
set backspace=indent,eol,start
set enc=utf-8
set fencs=utf-8,cp949
set tabstop=4
set autoindent
" gvim 의 경우 source $VIMRUNTIME/vimrc_example.vim 에서 텍스트 파일을 열때 textwidth=78 로 설정하고 있는데 이를 수정함
autocmd FileType text setlocal textwidth=0 tabstop=4 shiftwidth=4
if has("gui_running")
 set guifont=나눔고딕코딩:h10 " 폰트 설정
 au GUIEnter * winsize 100 50 " 시작시 윈도크 크기 설정
endif

[vim 명령어]
esc "ctrl+c 명령 취소
syntax on "신택스 기능 활성화
color elflord 또는 colorscheme elflord "컬러설정, syntax 활성화되어야 함
highlight Normal ctermbg=none "하이라이트로 normal 그룹에 color terminal background 색은 무시, 컬러스킴의 black 아닌 none 값으로 검은색 배경이 된다.
highlight ColorColumn ctermbg=brown "colorcolumn 색변경, 컬러스킴 설정 후 에 명시해야 적용된다.
ctrl+w n "새창 만들기, :new
ctrl+w s "현재파일을 수평창으로 나눔, :sp
ctrl+w v "현재파일을 수직창으로 나눔, :vs
ctrl+w o "현재창만 놔두고 모든 분할된 창 닫기
ctrl+w q "현재창 닫기
ctrl+w = "창들을 균등하게 분할
ctrl+w w 또는 방향키 또는 h,j,k,l 방향키 "창들간에 이동
ctrl+w H "현재 창을 왼쪽으로 이동
ctrl+w L "현재 창을 오른쪽으로 이동
ctrl+w J "현재 창을 아래쪽으로 이동
ctrl+w K "현재 창을 위쪽으로 이동
ctrl+w n< "현재 창 n(명시하지 않으면 1)만큼 width 줄이기
ctrl+w n> "현재 창 n(명시하지 않으면 1)만큼 width 늘리기
ctrl+w n- "현재 창 n(명시하지 않으면 1)만큼 height 줄이기
ctrl+w n+ "현재 창 n(명시하지 않으면 1)만큼 height 늘리기
20ctrl+w _ "창 높이를 20라인 크기로 조정, :resize 20
100ctrl+w | "창 폭을 100컬럼 크기로 조정, :vertical resize 100
ctrl+f "page down
ctrl+b "page up
ctrl+d "반페이지 down
ctrl+u "반페이지 up
ctrl+v "visual block mode, 세로로 블럭 지정 가능
insert 모드에서 ctrl+v숫자 "터미널로 입력되는 특수키 문자 파악, 예를 들어 숫자에 027입력하면 ^[ --> ESC 키로 ^와[ 를 조합된게 아님, 065는 A로 표시된다
ctrl+z "vim 중지하고 백그라운드로 전환해 쉘이 보임, fg 로 vim으로 다시실행, :sh 와 exit 도 같은 기능
h "커서 왼쪽 이동
l "커서 오른쪽 이동
j "커서 아래쪽 이동
k "커서 위쪽쪽 이동
2h "커서 왼쪽 2칸 이동
2l "커서 오른쪽 2칸 이동
2j "커서 아래쪽 2줄 이동
2k "커서 위쪽쪽 2줄 이동
10G "10 라인으로 이동
10+ "현재 라인에서 10 라인 아래로 이동
10- "현재 라인에서 10 라인 이전으로 이동
H "현재 화면에서 첫 라인으로 이동
M "현재 화면에서 중간 라인으로 이동
L "현재 화면에서 마지막 라인으로 이동
~ "현재 커서 대문자 -> 소문자, 소문자 -> 대문자 변환
J 또는 블럭 선택 후 :join "현재 라인의 맨끝에서 라인 2개를 1개로 합친다. 합쳐진 라인의 indent 는 삭제되고 공백이 추간된다. 블럭으로 멀티 라인을 선택해서 합칠 수도 있다.
u "최근 편집명령 하나 취소
u "visual 모드, 선택한 블럭 소문자로 변환
U "visual 모드, 선택한 블럭 대문자로 변환
r "현재 커서 글자 하나 수정
R "Replace mode, 모든 문자위에 덮어 쓰기 할 수 있는 상태가 된다.
I "insert 모드, 현재줄 맨 앞에 추가
A "insert 모드, 현재줄 맨 끝에 추가
i "insert 모드, 커서 앞에 추가
a "insert 모드, 커서 뒤에 추가
v "visual 모드, 블럭 문자 단위 지정, :로 명령모드에서 :'<,'> 로 자동 입력
V "visual 모드, 블럭 라인 단위 지정, :로 명령모드에서 :'<,'> 로 자동 입력
y "visual 모드에서 지정한 블럭 register 로 복사
yy "커서가 있는 라인을 복사
yb "커서부터 단어의 앞까지 복사
yw "커서부터 단어의 뒤까지 복사
p "커서 뒤에 1번 붙여넣기, np 하면 n번 반복
P "커서 앞에 1번 붙여넣기, nP 하면 n번 반복
n| "현재라인에서 n컬럼으로 이동
f문자 "현재라인에서 오른쪽방향으로 문자가 있는곳으로 이동
F문자 "현재라인에서 왼쪽방향으로 문자가 있는곳으로 이동
t문자 "현재라인에서 오른쪽방향으로 문자가 있는곳 한칸 전으로 이동
T문자 "현재라인에서 왼쪽방향으로 문자가 있는곳 한칸 전으로 이동
; "f,F,t,T문자 이동 반복
n% "파일의 n%퍼센트 라인으로 이동
x "한글자 삭제
ggdG "전체 삭제, 파일 처음 위치로 가서 파일 끝까지 삭제
횟수dw "횟수만큼 dw 수행
횟수dd "횟수만큼 dd 수행
dw "커서가 있는 단어 삭제
dd "커서가 있는 라인 삭제
d^ "커서 부터 라인 시작까지 삭제
d$ 또는 D "커서 부터 라인 끝까지 삭제
diw "delete inner word, 현재 커서가 있는 단어 하나 삭제, 커서가 공백 위라면 공백만 삭제
daw "delete a word, 현재 커서가 있는 단어 하나 삭제
dis "delete inner sentence, 현재 커서가 있는 문장(. ! ? 공백 탭등으로 구분) 삭제, 커서가 문장 사이에 공백 위라면 공백만 삭제
das "delete a sentence, 현재 커서가 있는 문장((. ! ? 공백 탭등으로 구분) 삭제
dt문자 "현재 커서에서 문자 전 까지 삭제
df문자 "현재 커서에서 문자 까지 삭제
d/스트링 "현재 커서에서 스트링이 있는 곳까지 삭제
cb "현재 커서 이전부터 단어 시작까지 삭제(register 에 저장)하고 insert 시작
cw 또는 ce "현재 커서부터 단어까지 삭제(register 에 저장)하고 insert 시작
cc 또는 S "현재 라인 삭제(register 에 저장함)하고 insert 시작
ciw "현재 커서가 있는 단어 하나 삭제(공백 미포함, 커서가 공백 위라면 공백만 삭제) 후 insert 모드
caw "현재 커서가 있는 단어 하나 삭제(공백 포함) 후 insert 모드
ci( 또는 ci) "현재 커서에서 가장 가까운 () 내용 삭제 후 insert 모드
ca( 또는 ca) "현재 커서에서 가장 가까운 ()과 () 내용 삭제 후 insert 모드
ci{ 또는 ci} "현재 커서에서 가장 가까운 {} 내용 삭제 후 insert 모드
ca{ 또는 ca} "현재 커서에서 가장 가까운 {}과 {} 내용 삭제 후 insert 모드
s "현재 문자 삭제(register 에 저장함)하고 insert 시작
. "마지막 명령 반복 수행
qa "a 이름의 매크로 기록 시작
q "매크로 기록 종료
@a "a 매크로 실행
@@ "이전 실행한 매크로 실행
10@a "a 매크로 10번 실행
$ "현재 라인의 끝으로 이동
0 "현재 라인의 시작으로 이동
^ 또는 _ "현재 라인의 공백아닌 첫문자로 이동
+ 또는 ctrl+m "다음 라인의 공백아닌 첫문자로 이동
- "이전 라인의 공백아닌 첫문자로 이동
w "다음 단어의 첫문자로 커서이동
W "공백으로 구분되는 다음 단어의 첫문자로 커서이동
e "다음 단어의 마지막 문자로 커서이동
E "공백으로 구분되는 다음 단어의 마지막 문자로 커서이동
b "한단어 뒤로 단어의 첫문자로 커서 이동
B "공백으로 구분되는 한단어 뒤로 단어의 첫문자로 커서이동
t문자 "현재 라인에서 오른쪽 방향으로 문자 위치 바로전으로 커서 이동
f문자 "현재 라인에서 오른쪽 방향으로 문자 위치로 커서이동
T문자 "현재 라인에서 왼쪽 방향으로 문자 위치 바로전으로 커서 이동
F문자 "현재 라인에서 왼쪽 방향으로 문자 위치로 커서이동
V(비주얼모드로 블럭선택후) > "sw 크기 만큼 오른쪽으로 이동, indent
V(비주얼모드로 블럭선택후) < "sw 크기 만큼 왼쪽으로 이동
>> "sw 크기 만큼 오른쪽으로 이동, indent
<< "sw 크기 만큼 왼쪽으로 이동
{ "이전 문단으로 이동
} "다음 문단으로 이동
[[ "이전 섹션으로 이동
]] "다음 섹션으로 이동
% "현재 커컷상의 ([{}]) 에 짝이 되는 곳으로 이동
# "현재 커서상의 워드 문자열 찾고 이전으로 이동
* "현재 커서상의 워드 문자열 찾고 다음으로 이동
/string "문자열 앞으로 찾기, n 으로 다음찾기
/\cstring 또는 /string\c "\c로 주면 대소문자 구분없이 찾기
/\Cstring 또는 /string\C "\C로 주면 대소문자 구분해서 찾기
/\<word\> \< 는 단어 시작, \> 는 단어 끝으로 word 길이도 일치해 찾기
/대상1\|대상2\|대상3"\| 구분으로 여러개 한번에 찾기
?string "문자열 뒤로 찾기, n 으로 이전찾기
n "찾은 문자열들 중에서 다음으로 이동
N "찾은 문장열들 중에서 이전으로 이동
gf "명시된 파일로 바로가기
gd "현재 단어(변수) 현재 파일내에서 정의 위치로 가기
gD "현재 단어(변수) 현재 함수내에서 정의 위치로 가기
gt "다음 탭으로 이동 :tabn
gT "이전 탭으로 이동 :tabp
m{a-z} "ma 하면 a이름으로 마크, 현재 버퍼내에서만 마크됨, 다른 파일에선 마크로 이동 못함
m{A-Z0-9} "mA 하면 A이름으로 마크, 파일까지 마크됨, 다른 파일에서도 마크로 이동 가능
'마크이름 "마크 위치의 라인 첫위치로 이동
`마크이름 "마크 정확한 위치로 이동
ctrl+6 "이전 파일 열기
ctrl+o "이전 위치로 점프
ctrl+i "앞 위치로 점프
v zf "블럭 선택 후 블럭 폴딩/닫기
za "현재 커서 위치에서 폴딩 토글
zo "폴딩된 라인에서 폴딩 열기
zc "폴딩된 라인에서 폴딩(닫기)
zd "폴딩 삭제
zk "이전 폴딩으로 이동
zj "다음 폴딩으로 이동
zm "(깊은 폴딩 부터,foldlevel 1개 감소) 폴딩 닫기
zM "모든 폴딩 닫기
zr "(깊은 폴딩 부터,foldlevel1개 증가) 폴딩 열기
zR "모든 폴딩 열기
= "프로그램 소스코드에서 v 로 영역을 선택하고 = 누르면 선택된 영역들의 줄들이 알맞게 들여쓰기됨
== "현재 라인 들여쓰기
gg=G "파일 처음부터 끝까지 알맞게 들여쓰기됨
=% "프로그램 소스코드에서 시작블럭{ 이나 끝블럭} 에서 =% 누르면 블럭내의 줄들이 알맞게 들여쓰기됨
K "현재 커서에 대한 대문자 메뉴얼 페이지 보기
ctrl+r "최근 취소된 편집명령 복구
ctrl+g "현재 파일이름과 라인수 보기
ctrl+n "자동완성 리스트에서 다음 항목
ctrl+p "자동완성 리스트에서 이전 항목, 프로그래밍시 함수,변수에서 ctrl+p 하면 자동완성, 예를 들어 int YoonByoungHon = 0; 후 다음 줄에서 Yo부분에서 ctrl+p 하면 YoonByoungHoon 이 바로 입력되거나 Yo 로 시작하는 리스트중에서 선택가능
"레스트터이름명y "레지스터에 내용 복사
"레스트터이름명p "레지스터의 내용 붙여넣기
"+y "+는 CLIPBOARD, vim -> CLIPBOARD 으로 복사
"+p "+는 CLIPBOARD, CLIPBOARD -> vim 으로 붙여 넣기
:reg "레지스터 내용 보기, type -> c:characterwise, l:linewise, b:blockwise-visual
:help 또는 :h "도움말 보기
:help i "i 도움말보기
:help :e ":e 도움말보기
:help ctrl-r "ctr+r 도움말보기
:messages "vim 이 출력하는 메시지 보기
:stop 또는 :suspend "suspend vim 로 ctrl+z 와 같다.
:color 또는 colo 또는 colorschem "현재 설정된 컬러 스킵 보기, 공백 후 tab, shift-tab 을 누르면 사용 가능한 컬러 스킴이름이 표시된다.
:intro "인트로 화면 보기
:print "현재 커서 위치의 라인 내용 출력
:language 또는 lang "현재 언어 설정 보기
:!외부명령 "외부명령실행, 예를 들어 !ls -ahl 하면 는 ls -ahl 실행
:f "현재 파일이름과 라인 수 보기
:n "n라인으로 이동
:% "%는 현재파일을 의미한다. 파일 전체 범위 지정, :1,$ 와 같다.
:0 또는 gg "파일의 첫번째 행으로 이동
:$ 또는 G "파일의 마지막 행으로 이동
:e filename "파일 새로 열기(버퍼), :e filename 입력시 ctrl+d 하면 현재 위치의 파일 리스트 표시
:e ++enc=cp949 "cp949 인코딩으로 다시 열기, 참고로 .vimrc 에서 set fencs=utf-8,cp949 하면 알맞은 인코딩을 파일을 연다
:w ++enc=utf-8 filename "명시한 파일을 utf-8 로 인코딩해서 저장
:w ++enc=utf-8 % "현재 파일을 utf-8 로 인코딩해서 저장
:e! "파일 다시 읽기
:noau e filename.gz 또는 vi -c "noau e filename.gz" "gzip 파일 압축해서해서 열지 않기, vim 은 기본적으로 gzip 파일은 압축해서 연다.
:bp 또는 bprevious "이전 버퍼로 이동, 버퍼는 메모리에 올라가 있는 파일로 vim a.txt b.txt 했을때 2개의 텍스트 버퍼가 생성된다. 화면 위에 버퍼 내용들이 표시된다.
:echo 표현 "뒤 오는 표현 내용 출력
:echo winnr() "현재 창 번호 출력
:echo winnr('$') "마지막 현재 창 번호 = 창 개수 출력
:echo bufnr() "현재 버퍼 번호 출력
:echo bufnr('$') "마지막 버퍼 번호 출력
:bn 또는 :bnext "다음 버퍼로 이동
:bd 또는 :bdel "현재 버퍼 삭제/닫기
:buffers 또는 :ls 또는 :files "버퍼 리스트 보기
:%bwipeout 또는 :%bw "모든 버퍼 삭제/닫기
:tabs "탭 리스트 정보
:tabe 또는 :tabnew "새탭열기) 또는 :tabe 파일명
:tabc 또는 :tabclose "현재 탭닫기, tabc! 저장하지 않고 닫기
:tabo "모든 탭 닫기, tabo! 저장하지 않고 닫기
:tabp 또는 :tabprevious 또는 gT "이전 탭으로 이동, vim -p a.txt b.txt 했을때 2개의 탭으로 열린다.
:tabn 또는 :tabnext 또는 gt "다음 탭으로 이동, tabn3 3번 탭으로 이동
:marks "마크 리스트
:delmarks 마크이름 ":delmarks a b 하면 a와 b 마크 지우기, :delmarks \" 하면 " 마크 지우기, delmarks 0-9 a-z A-Z 숫자,영문자 마크 모두 삭제, ' 이름의 마크는 바로 이전 위치에 대한 마크로 삭제할 수 없다.
:new "새창 만들기
:sp "수평으로 창을 나누기
:vs "수직으로 창을 나누기
:sp 파일명 "수평으로 창을 나누고 파일 열기
:vs 파일명 "수직으로 창을 나누고 파일을 열기
:Explore "현재 파일 탐색 표시, 탐색창에서 o 는 파일 열기, p 는 파일 프리뷰
:Sexplore "수평으로 창을 나누고 탐색 표시
:Vexplore "수직으로 창을 나누고 탐색 표시
:ju 또는 :jumps "점프 리스트 표시
:clearjumps "현재 윈도우 점프 리스트 지우기
:sh "잠시 쉘로 나가기, 쉘에서 exit 하면 vi로 복귀
:copen "quickfix list 창 열기
:ccl 또는 :cclose "quickfix list 창 닫기
:cw 또는 :cwindow "에러 있으면 quickfix list 창 열기
:cl 또는 :clist "quickfix list 보기
:cn "quickfix list 중 다음 항목
:cp "quickfix list 중 이전 항목
:cfirst "quickfix list 중 첫번째 항목
:clast "quickfix list 중 마지막 항목
:cfdo 명령 "quickfix list 항목별 명령 실행
:lopen "location list 창 열기
:lcl 또는 :lclose "location list 창 닫기
:lnext "location list 중 다음 항목
:lprev "location list 중 이전 항목
:lfirst "location list 중 첫번째 항목
:llast "location list 중 마지막 항목
:retab "set expandtab 으로 탭입력이 스페이스로 변경되는 상태에서, 모든 tab 을 space 로 변경
:retab! "set noexpandtab 으로 탭입력이 스페이스로 변경되지 않는 상태에서, 모든 space 를 tab 으로 변경
:set spell 스펠링 체크 활성화(스펠이 이상한 경우 밑줄 표시)
:set nospell 스펠링 체크 비활성화
:set all "모든 설정 보기
:set 설정명 "설정 값 보기
:set enc=utf-8 "인코딩 utf-8 로 사용
:set visualbell t_vb= "beep 대신 t_vb 로 설정된 문자로 표시하는데 설정 문자가 없어 visual bell 도 사용하지 않게 된다.
:set hidden "버퍼 숨김 활성화, 버퍼를 수정 후 파일로 저장하지 않아도 다른 버퍼로 이동 :bn 할 수 있다. 숨김이 비활성화되어 있으면, 버퍼를 수정 후 저장해야 다른 버퍼로 이동 할 수 있다.
:set autoread "파일 자동 refresh
:set updatetime=1000 "화면 갱신 주기(default: 4000ms), 커서 사용중일때는 갱신 않함
:set laststatus=2 "상태바 활성 0:비활성 1:윈도우가2개이상일때(디폴트) 2:항상
:set showtabline=2 "탭바 활성 0:비활성 1:탭이2개이상일때(디폴트) 2:항상
:set mouse=a "gui 환경에서 마우스 사용 가능, 기본 mouse=""
:set number 또는 :set nu "라인 번호 표시, 끝에 !붙이면 토글
:set nonumber 또는 :set nonu "라인 번호 표시 안하기
:set relativenumber 또는 :set rnu "라인 번호 표시, 끝에 !붙이면 토글
:set incsearch 또는 :set is "키 입력 마다 찾기 결과 표시
:set noincsearch 또는 :set nois "키 입력 후 엔터시에만 찾기 결과 표시
:set hlsearch "검색결과 하이라이트
:nohl "하이라이트 제거
:highlight "하이라이트 색설정 상태
:set showcmd "명령모드에서 명령 표시, 비주얼 모드에서 선택크기 표시
:set cursorline 또는 :set cul "현재 커서 라인 하이라이팅 활성화
:set nocursorline 또는 :set nocul "현재 커서 라인 하이라이팅 비활성화
:set cursorcolumn 또는 :set cuc "현재 커서 컬럼 하이라이팅 활성화
:set nocursorcolumn 또는 :set nocuc "현재 커서 컬럼 하이라이팅 비활성화
:set colorcolumn=100 "컬럼 가이드 라인 컬러로 보이기
:set syntax=sh "파일 타입을 .sh 로 설정
:set autoindent "자동들여 쓰기 활성화
:set noautoindent "자동들여 쓰기 비활성화
:set cindent "C 프로그래밍용 들여쓰기 활성화
:set nocindent "C 프로그래밍용 들여쓰기 비활성화
:set wrap "자동 줄 바꿈
:set nowrap "자동 줄 바꿈 안하기
:set textwidth=n "n만큼 텍스길이기 넘으면 다음줄로 이동, 0이면 다음줄 이동 제한 없음
:set ignorecase 또는 :set ic "찾기시 대소문자 무시
:set noignorecase 또는 :set noic "찾기시 대소문자 구분
:set lines "라인 크기 설정보기
:set lines=80 "라인 80 로 설정
:set iskeyword=@,48-57,_,-,192-255,# "설정된 문자로 연결되면 하나의 워드로 취급
:set iskeyword+=- "워드로 취급문자에 - 도 추가
:set list "탭,스페이스,엔터 등의 기호 표시
:set listchars=tab:→\ ,space:·,trail:·,precedes:«,extends:»,eol:↵ "탭,공백,라인끝공백,접기,펼치기,엔터 문자 설정
:set nolist "탭,스페이스,엔터 등의 기호 표시 안하기
:set ts=n 또는 :set tabstop=n "탭크기를 n으로 설정
:set sw=n 또는 :set shiftwidth=n "들여쓰기 >>, 내여쓰기 <<, 될때 또는 엔터등으로 자동 들여쓰기 될때 이동 크기
:set et 또는 :set expandtab "탭키 입력시 탭 대신 tabstop=n 만큼의 스페이스 사용
:set noet 또는 :set noexpandtab "et 비활성화, 탭키 입력시 탭 사용
:set esckeys "insert 모드에서 방향키 제대로 작동시키기
:set backspace=indent,eol,start "insert 모드에서 백스페이스 제대로 작동시키기
:set paste "붙여넣기모드,텍스트를 복사 후 vim 에 붙여넣기하면 autoindent, textwidth 등의 값이 설정 되어 있는 경우 계단처럼 들여쓰기 되는 현상이 발생한다. set paste 를 수행하면 autoindent, textwidth 등의 값을 리셋하거나 비활성하여 있는 그대로 붙여넣을 수 있다.
:set shellcmdflag=-ic "vim 에서는 .bashrc 를 로딩하지 않아 :!alias명령을 실행 할 수 없는데 shell 에 -i inertactive 모드로 .bashrc 을 로딩하는 새로운 쉘 생성, -c 뒤에 오는 스트링을 명령으로 처리한다. 옵션을 주어 alias 명령도 실행하도록 한다.
:set tm=1000 또는 :set timeoutlen=1000 "맵핑키 입력 완료까지의 대기시간ms, 기본 1000, ttm<0 이면 키코드(<esc><up><enter>등)도 tm 값으로 대기한다.
:set ttm=50 또는 :set ttimeoutlen=50 "ttm>=0 일때 키코드의 입력 후 대기시간ms, 기본:-1
:set foldmethod=syntax "폴딩시 syntax(기본은 manual)기준으로 하기, syntax 방법은 블럭 지정(수동)으로 폴딩이 안되고, synatx 에 맞게만 폴딩한다.
:set foldenable "파일 오픈시 폴딩
:set nofoldenable "파일 오픈시 폴딩 하지 않기
:let "변수 설정 모두 보기
:let 변수명 또는 :echo 변수명 "변수 값 보기
:let 변수명=값 "내부 변수 설정, g:변수명 전역변수, b:변수명 버퍼변수
:let mapleader="," "leader 키 , 로 설정, 디폴트는 \ => "\\" 로 설정
:verbose set "설정된 모든 옵션 보기
:verbose set 옵션이름 "옵션에 대한 상태 보기, tabstop 옵션 상태 보기 예) :verbose set tabstop
:10, 100 d "10~100번재 행 삭제
:w "저장
:w 파일명 "파일명으로 저장
:w! "강제로 저장
:q! "저장하지 않고 종료
:qall! "저장하지 않고 모든 열려있는 창 종료
:wq "저장하고 종료
:wa "변경파일 모두 저장
:xa "변경파일 모두 저장 후 종료
:%!xxd "%파일전체, !외부명령, xxd 명령 실행, hex 모드) 또는 :%!hexdump -C "hexdump 명령 실행, -C(canonical hex+ASCII) hex 모드
:%!xxd -r "xxd 명령 실행, hex 모드 해제
:g/문자/d "파일 전체에서 문자가 포함된 라인들 모두 삭제
:g/문자/m 0 "파일 전체에서 문자가 포함된 라인들 모두 0번째 아래로 이동
:g/문자/m -2 "파일 전체에서 문자가 포함된 라인들 한줄 위로 이동
:g/문자/m +1 "파일 전체에서 문자가 포함된 라인들 한줄 아래로 이동
:%s/문자//gn "파일전체에서 문자 개수 파악
:s/문자1/문자2/ "현재라인에서 문자1을 문자2로 바꾼다.
:s#문자2#문자2# "구분자를 # 로 사용할 수도 있다.
:s/문자1/문자2/i "대소문자 무시한 문자1을 문자2로 바꾼다.
:%s/문자1/문자2/gc "파일전체범위(%), g 옵션이 없으면 각 라인에서 첫번째로 매칭된는것 하나만 변경된다. c를 붙이면 바꿀때 물어본다.
:%s/\<문자1\>/문자2/ "파일 전체에서 문자1(길이까지 일치)을 문자2로 바꾼다.
:%s/\//문자2/ "/ 자체를 문자2로 변경하기
:%s#/#문자2# "/ 자체를 문자2로 변경하기
:%s/\n/\r\r/ 또는 :%s/\n/ctrl+v 후 엔터입력/ "2줄씩 줄바꿈, 줄바꿈 문자변경시 검색부분은 \n 변경부분 \r 를 사용해야 한다.
:라인번호1,라인번호2s/문자1/문자2/ "라인번1~2 사이에서 문자1 문자2로 바꾼다.
:'<,'>s/.\{2}$// "블록지정 후 :s/.\{2}$//) "블럭지정된 영역의 마직막 2글자 삭제
:map 매핑키 매핑내용 "Normal, Visual, Seclt 모드에서 동작하는 키 매핑, 재귀적 매핑, map a b 과 map b c 로 하면 a -> c 로 매핑될 수 있다. map, noremap 은 Normal, Visual, Select, Operator-pending 모드에서 키 매핑을 사용할 수 있다. :h map-table 참고
:noremap 매핑키 매핑내용 "Normal, Visual, Select 모드에서 동작하는 키 매핑, 비재귀적 매핑
:nmap 매핑키 매핑내용 "Normal 모드에서만 동작하는 키 매핑
:nnoremap 매핑키 매핑내용 "Normal 모드에서만 동작하는 키 매핑, 비재귀
:vmap 매핑키 매핑내용 "Visual, Select 모드에서만 동작하는 키 매핑
:vnoremap 매핑키 매핑내용 "Visual, Select 모드에서만 동작하는 키 매핑, 비재귀
:imap 매핑키 매핑내용 "Insert 모드에서만 동작하는 키 매핑
:inoremap 매핑키 매핑내용 "Insert 모드에서만 동작하는 키 매핑, 비재귀
:cnoreabbrev 매핑키 매핑내용 "Command 모드에서 축약어 매핑, 비재귀
:function 설정된 함수리스트 보기
:scriptnames 설치된 플러그인 리스트 보기
:so ~/.vimrc 또는 :source ~/.vimrc "수정된 vimrc 설정 반영

[profiling]
:profile start vim-profile.log
:profile func *
:profile file *
이제 성능이 느린 액션 수행
:profile pause "잠시 멈춤
:profile continue "다시 시작
:profile stop "stop 해야 파일에 써진다.(또는 vim 종료하면 파일에 써진다.)

[diff 사용]
vimdiff 사용시: vimdiff a.txt b.txt
neovim 사용시: nvim -d a.txt b.txt
vim 에서는 창을 수직 분할 후 각 창에 파일을 로딩 한 다음 :windo difft 로 창들을 diff 윈도우에 포함
:diffget 현재 버퍼 커서의 차이부분 가져오기(대체)
:diffput 현재 버퍼 커서의 차이부분 다른 버퍼에 넣기(대체) 

[mac option(alt,meta) 키 동작 안되는 문제 해결하기]
mac 에선 기본적으로 option 키가 조합되면 특정 문자로 취급된다.
option+a == å
option+d == ∂
option+p == π
사실 option 는 alt 와 다르고, 각 터미널에 따른 설정이 필요하다.
iterm --> option 키 normal --> esc+
kitty --> macos_option_as_alt no
alacritty
--> alt_send_esc: true 는0.12.0 에서 디폴트로 설정에서 제거됨
--> windows > option_as_alt: Both 로 설정함
:h key-notation 참고

[remove trailing whitespace, 라인끝 공백 제거]
% 파일전체범위, s 바꾸기, \s\+ 공백1개이상, $ 끝에서, // 빈값으로, e 에러 메시지 표시하지 않기
:%s/\s\+$//e

[블럭내 변경]
visual 모드에서 v 로 블럭 지정
:입력(자동으로 :'<,'> 로 변경)s/대상문자/변경될문자/g

[블럭내 정렬]
visual 모드에서 v 로 블럭 지정
:입력(자동으로 :'<,'> 로 변경)sort  "정렬
:입력(자동으로 :'<,'> 로 변경)sort! "reverse 정렬
:입력(자동으로 :'<,'> 로 변경)sort u "unique 정렬(중복제거)

[멀티라인 수정]
1. 라인 처음으로 커서를 위치 시키고 블록 모드로 변경 ctrl+v
2. 커서로 아래(또는 j)로 멀티 라인 선택
3. 블럭 첫음에 추가시: I(shift+i)로 첫번째 라인 처음에 문자 insert
또는
블럭 수정(삭제하고 입력모드)시: c 로 수정
또는
블럭 끝에 추가시: $로 모든 라인의 끝까지 선택 후 A(shift+a)로 문자 append
4. esc 하면 선택한 전체 라인 반영
참고로 c로 수정하는것 외 insert/append 시 삭제만 하면 멀티 라인으로 반영되지 않는다.

[멀티 커서(선택)로 리팩토리링(변경)하기]
1. v로 검색할 부분 지정 후 ctrl+n 로 선택하고 다음 찾기, ctrl+x는 스킵, ctrl+p는 현재 선택해제 후 이전 선택으로 이동
2. I 로 insert 모드 시작 또는 c 로 삭제 후 insert 모드 시작
3. 수정 후 esc 로 종료

[블럭단위 찾기]
1. v 로 블록지정
2. y 로 디폴트 레지스터에 저장
3. / 찾기모드 변경
4. ctrl+r " 로 디폴트 레지스터의 내용 붙여넣기

[파일들에서 찾아 변경하기]
1. :Rg ysoftman-apple
2. ysoftman-apple 포함된파일들이 보이고, tab또는ctrl+i 으로 선택/해제(alt+a전체선택, alt+d전체해제)후 엔터치면 quickfix 창이 생기고 선택한 목록들이 보인다.
3. quickfix 내 항목들에 대해 변경 명령을 수행, update 변경된 버퍼 저장
cfdo %s/ysoftman-apple/ysoftman-lemon/gc | update