하나의 명령으로 Vim 및 Tmux에서 밝은 모드와 어두운 모드를 전환하시겠습니까?

하나의 명령으로 Vim 및 Tmux에서 밝은 모드와 어두운 모드를 전환하시겠습니까?

하나의 명령으로 tmux 세션 전체에서 배경색 모드를 변경할 수 있기를 원합니다. 쉘 기능이 있고 bgl배경 bgd/색 구성표를 밝고 어둡게 설정하고 유사한 vim키 바인딩을 설정합니다.

여러 개의 창이 열려 있으면 각 창을 다른 색상 모드로 전환하는 것이 지루해집니다.

vim을 실행할 때 해야 하는 tmux send-keys것처럼 각 창에 적절한 명령을 보내는 스크립트를 작성할 수 있습니까 ? 그렇다면...(하나님)...제게 방향을 알려주실 수 있나요?escape<leader>bgd<enter>

답변1

이 답변 에서 추출했습니다.내 블로그

하나의 명령으로 Vim 및 Tmux에서 밝은 모드와 어두운 모드를 전환하세요

나는 당신과 똑같은 문제가 있었고 다음과 같이 설정했습니다.

Tmux 창에서:

1a) 별칭 'ol'은 Vim과 Tmux를 조명 모드로 전환합니다.

1b) 별칭 'od'는 Vim과 Tmux를 어두운 모드로 전환합니다.

Wim에서 :

2) 'Leader-o'는 Vim과 Tmux를 밝은 색과 어두운 색 구성표 간에 전환합니다.

어두운 테마

밝은 테마

작동 방식은 Tmux 환경 변수를 정의하여 밝은 색 구성표인지 어두운 색 구성표인지 추적하는 것입니다. Vim 창에서든 Tmux 창에서든 전환할 때마다 변수가 업데이트됩니다. 기존 및 새 Tmux 창과 Vim의 기존 및 새 인스턴스는 이 변수를 확인하고 이 구성표를 따릅니다.

암호

1단계: Tmux 창 내에서 색상 전환

이 가이드에서는 다양한 도트 파일이 홈 디렉터리에 있다고 가정합니다. 위에서 언급한 것처럼 작업 환경을 컴퓨터 간에 동기화된 상태로 유지할 수 있도록 실제로 홈 디렉터리의 심볼릭 링크가 있는 git 저장소에 모두 보관합니다.이 자식환매.

먼저 ~/.bashrc를 구성하여 자동으로 Tmux를 시작하고 "main"이라는 세션에 연결을 시도하여 존재하지 않는 경우 세션을 생성하도록 했습니다. 나는 이것이 나에게 효과적이라고 생각했지만 이 단계를 변경하고 싶을 수도 있습니다.

Tmux를 시작한 후 "THEME"이라는 환경 변수를 쿼리하고 "THEME=light"와 같지 않으면(또는 존재하지 않는 경우) 어두운 테마를 사용하고 이에 따라 THEME 변수를 설정합니다. 즉, Tmux 세션을 처음 시작할 때 기본적으로 어두운 테마가 사용됩니다.

if command -v tmux>/dev/null; then
    [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux new-session -A -s main

    # check if we have been switched to light, else go dark
    [[ ! $(tmux show-environment | grep THEME) =~ 'THEME=light' ]] && 
    tmux set-environment THEME dark
fi

~/tmux.conf 파일 시작 부분에서 먼저 내가 선택한 어두운 색상이 포함된 보조 Tmux 파일을 얻습니다. 이러한 값은 나중에 경량 구성표에 의해 재정의될 수 있습니다.

# source colorscheme
set -g default-terminal 'screen-256color'
source-file ~/.tmux_dark.conf

내 어두운 테마 색상은 다음과 같습니다.

# dark colours
# fg = thin line
set -g pane-border-style "bg=colour234 fg=colour244"
set -g pane-active-border-style "bg=colour234 fg=colour208"
# fg = text
set -g window-style 'fg=colour248,bg=colour234'
set -g window-active-style 'fg=colour252,bg=colour235'
# Customize the status line
set -g status-fg colour208
set -g status-bg colour234

~/.tmux_dark.conf 외에도 ~/.tmux_light.conf도 있습니다.

# light colours
# fg = thin line
set -g pane-border-style "bg=colour253 fg=colour244"
set -g pane-active-border-style "bg=colour253 fg=colour208"
# fg = text
set -g window-style 'fg=colour238,bg=colour253'
set -g window-active-style 'fg=colour238,bg=colour231'
# Customize the status line
set -g status-fg colour208
set -g status-bg colour253

Tmux 창에 있고 색 구성표를 전환하려면 관련 파일을 가져와서 THEME 변수를 업데이트하면 됩니다. 이 작업을 수행하기 위해 ~/.bashrc에 두 개의 별칭이 있습니다. ol은 "ON/Light"를 나타내고 od는 "OFF/Dark"를 의미하는 것으로 기억합니다.

# switch between light and dark themes
alias ol="tmux source-file ~/.tmux_light.conf; tmux set-environment THEME 'light'"
alias od="tmux source-file ~/.tmux_dark.conf; tmux set-environment THEME 'dark'"

2단계: Vim 내에서 색상 전환

내 ~/.vimrc에서 두 가지 함수를 정의했습니다. 첫 번째 함수는 Tmux THEME 변수 업데이트와 Tmux 색상 전환을 처리하고 두 번째 함수는 Vim 색상을 설정합니다.

Tmux에 대한 시스템 호출을 통해 Tmux THEME 변수를 읽습니다. 그러면 "계속하려면 Enter 키를 누르거나 명령을 입력하세요."라는 메시지와 함께 THEME 변수가 반환됩니다. 분명히 우리는 변수에만 관심이 있습니다. 중요한 점은 "THEME=dark"와의 일치 여부를 확인하고 있으므로 시스템 호출에서 반환된 메시지의 처음 10자만 가져와야 한다는 것입니다. 변수가 우리가 사용하고 있음을 나타내는 시나리오에 관계없이 대체 테마를 얻고 THEME 변수를 업데이트합니다. THEME 변수가 업데이트되면 SetColorScheme 함수를 호출하여 Vim의 색상을 변경합니다.

function! Toggle_Light_Dark_Colorscheme()
    if system('tmux show-environment THEME')[0:9] == 'THEME=dark'
        :silent :!tmux set-environment THEME 'light'
        :silent :!tmux source-file ~/.tmux_light.conf
    else
        :silent :!tmux set-environment THEME 'dark'
        :silent :!tmux source-file ~/.tmux_dark.conf
    endif
    :call SetColorScheme()
endfunction

우리가 선택하는 색 구성표는 Tmux THEME 변수에 의해 결정됩니다. 테마가 "THEME=dark"이면 어두운 색상 구성표(제 경우에는 zenburn)를 선택하고, 그렇지 않으면 밝은 색상 구성표(제 경우에는 seoul256-light)를 선택합니다.

function! SetColorScheme()
    " check if tmux colorsheme is light or dark, and pick for vim accordingly
    if system('tmux show-environment THEME')[0:9] == 'THEME=dark'
        colorscheme zenburn
    else
        colorscheme seoul256-light
    endif
endfunction

다음과 같이 색 구성표를 빠르게 전환하는 맵(또는 명령)을 만들 수 있습니다.

nnoremap <Leader>o :call Toggle_Light_Dark_Colorscheme()<cr>

Vim의 새 인스턴스를 열면 Tmux THEME 변수가 이미 정의되어 있으므로 SetColorScheme 함수를 사용하여 색 구성표를 선택합니다(이 함수는 ~/.vimrc의 SetColorScheme 함수 뒤에 위치해야 합니다).

call SetColorScheme()

여기서 멈출 수도 있지만 Vim 인스턴스가 실행 중이고 Tmux 창에서 별칭 중 하나를 사용하여 구성표를 변경하면 Vim은 SetColorScheme 함수를 자동으로 다시 실행하지 않습니다.

tmux로 전환하고 vim을 엽니다.

Vim이 다시 초점을 맞출 때마다 autocmd를 사용하여 색 구성표를 확인하고 재설정할 수 있습니다. 불행하게도 이것은 터미널의 Vim에서는 작동하지 않습니다. 하지만 다행히도 이 문제를 해결해주는 플러그인이 있습니다:

Plugin 'tmux-plugins/vim-tmux-focus-events'

플러그인을 사용하려면 ~/.tmux.conf에 다음 줄이 필요합니다(또는 이미 tmux-sensible 플러그인이 설치되어 있음).

set -g focus-events on

위 옵션 중 하나를 사용하면(~/.tmux.conf에 이 줄만 있음) ~/.vimrc에서 FocusGained 이벤트를 사용할 수 있습니다.

autocmd FocusGained * :call SetColorScheme()

이는 Tmux 창에서 vim으로 돌아올 때마다 Vim의 색 구성표가 자동으로 업데이트된다는 것을 의미합니다.

밝은 테마

Vim이 Tmux THEME 변수를 지속적으로 확인하도록 하는 것은 쉬울 수 있지만 저는 밤에만 밝은 곳에서 어두운 곳으로 전환하므로(예: 하루에 한 번) Vim이 그런 일을 위해 백그라운드에서 백만 번 확인하도록 하고 싶지 않습니다. 드문 현상:

마지막으로 두 가지 색 구성표 모두에서 표시되도록 명령 프롬프트의 색을 변경하기로 결정했습니다. 내 ~/.bashrc에는 굵은 글꼴로 보라색을 지정하기 위해 35m를 입력했습니다. 이 숫자가 색상을 지정하는 방법은 나에게 신비스러워서 방금 검색했습니다.

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;35m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$ '

그러나 다음 코드를 사용하여 ~/.tmux.conf 파일에서 색상을 선택하는 것은 쉽습니다. 이 코드를 터미널에 붙여넣어 0-255 범위의 색상 그리드를 표시할 수 있습니다.

for i in {0..255} ; do \
printf "\x1b[48;5;%sm%3d\e[0m " "$i" "$i"; \
if (( i == 15 )) || (( i > 15 )) && (( (i-15) % 6 == 0 )); then \
printf "\n"; \
fi; done

관련 정보