나는 사용하고있다zsh, tmux 및 vim그리고 단 하나의 명령으로 터미널, vim, vim-airline 및 tmux 상태 줄에서 태양광 조명/어두움 사이를 전환하는 방법을 알고 싶습니다.
답변1
Vim 내에서 단일 명령을 사용하여 iTerm2, tmux 및 Vim에 대해 Solarized를 밝은 것과 어두운 것 사이에서 동시에 전환하는 방법을 알아냈습니다.
iTerm2의 기본 설정에서 두 개의 프로필을 설정합니다. 하나는 Solarized Dark 색상 구성표이고 다른 하나는 Solarized Light 색상 구성표입니다. 색상 사전 설정은 두 버전의 Solarized를 모두 포함하므로 여기서 매우 유용합니다.
각 프로필에 키보드 단축키를 추가하여 다른 프로필로 전환합니다(어두운 스위치는 밝은 스위치로, 밝은 스위치는 어두운 스위치로). 두 가지 모두에 동일한 단축키를 사용했기 때문에 둘 사이를 전환하기만 하면 됩니다. 원하는 경우 다른 단축키를 사용할 수 있으며 이후 단계에서 약간만 수정하면 됩니다.
글리프에 익숙하지 않은 경우에는 Control- Option- Shift- 입니다 s. 다른 것을 자유롭게 선택하세요. 하지만 나중에 필요하므로 기억해 두세요. 여기서는 Solarized Dark만 표시하고 있지만 설정하는 것을 잊지 마세요.둘 다프로필.
tmux 색상 구성표를 직접 얻으십시오. 나는 다음의 것을 사용했다.이 저장소Github에서. 귀하의 컴퓨터에서 해당 위치를 이라고 지칭하겠습니다
~/tmux-colors-solarized
.설치하다Vim용으로 Solarized됨원하는 방법을 통해. iTerm2 프로필에서 16가지 ANSI 색상을 Solarized 값으로 설정했으므로 다음을 사용할 수 있습니다.품질이 저하된 256 색상 버전이 아닌 표준 Solarized 색상 구성표.
에 함수를 추가
.vimrc
하고 선택적으로 명령을 추가합니다.function! Solar_swap() if &background ==? 'dark' set background=light execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-light.conf')) else set background=dark execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-dark.conf')) endif silent !osascript -e 'tell app "System Events" to keystroke "s" using {shift down, option down, control down}' endfunction command! SolarSwap call Solar_swap()
한 줄씩... 같은 설명:
function! Solar_swap()
매개변수를 사용하지 않는
function
명명된 이름을 정의합니다 . 끝에는 동일한 이름 의 기존 기능을 자동으로 대체하므로 다시 소싱하는 경우 편리합니다.Solar_swap
()
!
function
.vimrc
if &background ==? 'dark'
Vim의 배경이 현재 어두운지 간단히 확인해보세요.
==?
대소문자를 구분하지 않고 비교합니다. 표현식에서&
설정(예: )을 사용하려면 가 필요합니다.background
set background=light
Vim의 배경을 밝게 설정하면 됩니다.
execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-light.conf'))
execute
다음 문자열을 Ex(즉:
) 명령으로 사용합니다. 매번silent
누르지 않아도 됩니다 . 외부(Vim에 대한) 명령을 실행합니다. 이 경우에는 . 확장 되고 이스케이프된 경로를 명령 문자열의 나머지 부분에 연결합니다.return!
tmux source-file [path]
.
else set background=dark execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-dark.conf')) endif
이 청크는 기본적으로 위 줄의 밝은 부분에서 어두운 부분으로의 버전입니다.
silent !osascript -e 'tell app "System Events" to keystroke "s" using {shift down, option down, control down}'
silent !
이전과 동일합니다.osascript
우리를 위해 일부 AppleScript를 실행하겠습니다.-e
다음 인수를 스크립트의 한 줄로 실행하는 것을 의미합니다. 우리가 실행 중인 라인은 2단계의 키보드 단축키를 활성 애플리케이션(운영 체제에 관한 한 iTerm2)으로 보내는 라인입니다. 1 선택한 단축키에 맞게 선을 수정해야 할 수도 있습니다. iTerm2를 전환하는 두 가지 다른 단축키가 있는 경우 이 줄을 ' 분기로 이동if
하고 일치하도록 키 입력을 변경해야 합니다.endfunction command! SolarSwap call Solar_swap()
마지막으로 함수를 닫고 방금 만든 함수를 호출하는
command
Called 를 정의합니다. 동일한 이름의 기존 명령을 자동으로 대체합니다.SolarSwap
!
이제 Vim 내에서 실행하기만
:SolarSwap
하면 Vim, tmux 및 iTerm2가 모두 Solarized Light와 Dark 사이를 전환합니다. 물론 매핑을 추가하면.vimrc
더욱 쉽게 전환할 수 있습니다.
1 iTerm2에는 적절한 AppleScript API가 있습니다.그러나 그 자체로는 현재 탭의 프로필을 직접 변경할 수 있는 방법을 찾을 수 없었습니다. 그냥 만드는 방법새로운지정된 프로필을 사용하여 탭, 창 또는 분할을 수행하거나 현재 세션 프로필의 (읽기 전용) 이름을 가져옵니다. 따라서 키보드 단축키를 설정하고 이를 사용하여 프로필을 전환하는 우회 경로입니다.
답변2
나는이 문제로 어려움을 겪고 있습니다. 나는 불완전하고 해킹된 반 솔루션에 도달했지만 내가 수집한 내용에 따르면 최종 색상을 길들이는 것은 그다지 사소한 문제가 아닙니다.
내가 찾은 것은 tmux와 vim 모두 터미널 색상 구성표(검은색, 빨간색, 녹색, 노란색, 파란색, 마젠타색, 청록색, 흰색 및 모든 '밝은' 변형)에 정의된 16가지 ANSI 색상 값을 차용한다는 것입니다. 당신의 경우빛터미널 색 구성표, 당신ANSI 흑백의 정의를 뒤집습니다.(즉,검정색/밝은 검정색을 밝은 배경색으로 설정하고 흰색/밝은 흰색을 어두운 전경색으로 설정), tmux 및 vim이 이에 따릅니다. 단일 색상 구성표의 밝은/어두운 변형만 사용하는 한 제대로 작동합니다.
이 스크린샷에서 볼 수 있듯이 완벽하지는 않습니다(전면은 터미널, 후면은 MacVim입니다. 항공사 텍스트의 차이점과 가운데 근처에 읽을 수 없는 검은색 블록이 있는데, 이는 어두운 바탕에 밝은 텍스트로 간주됩니다) 배경), vim/tmux/vim-airline 설정을 건드리지 않고도 99%의 경로를 얻을 수 있습니다.
답변3
저는 간단한 단축키(Vim 또는 Tmux에 입력)를 사용하여 Vim과 Tmux 모두에 대해 밝은 색 구성표와 어두운 색 구성표 사이를 한 번에 전환하는 방법을 구현했습니다. 저는 Zsh가 아닌 Bash를 사용하지만 누군가에게 도움이 되기를 바랍니다. 이미지를 보여줄 담당자는 없지만 갖고 있어요여기 블로그 게시물에 모두 나와 있습니다.
내 경우에는 다음 중 하나를 수행할 수 있습니다.
Tmux 창에서: 1a) 별칭 'ol'은 Vim과 Tmux를 모두 조명 모드로 전환합니다. 1b) 별칭 'od'는 Vim과 Tmux를 모두 어두운 모드로 전환합니다.
Vim에서: 2) 'Leader-o'는 Vim과 Tmux를 모두 밝은 색상과 어두운 색상 구성으로 전환합니다. 어두운 예 가벼운 예
작동 방식은 밝은 색 구성표인지 어두운 색 구성표인지 추적하는 Tmux 환경 변수를 정의하는 것입니다. Vim이나 Tmux 창에서 전환할 때마다 변수가 업데이트됩니다. 기존 및 새 Tmux 창과 Vim의 기존 및 새 인스턴스는 이 변수를 확인하고 구성표를 따릅니다.
코드 구현
1단계: Tmux 창에서 전환
먼저 ~/.bashrc를 구성하여 자동으로 Tmux를 시작하고 'main'이라는 세션에 연결을 시도하거나 세션이 없으면 생성을 시도합니다. 나는 이것이 나에게 효과적이라고 생각하지만 이 단계를 변경하고 싶을 수도 있습니다.
Tmux를 시작한 후 'THEME'이라는 환경 변수를 쿼리합니다. 'THEME=light'와 같지 않으면(또는 존재하지 않는 경우) 어두운 테마를 사용합니다. 즉, 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에 두 개의 별칭이 있습니다. 'ON/Light'는 ol로, 'OFF/Dark'는 od로 기억합니다.
# 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에 대한 시스템 호출로 읽는 Tmux THEME 변수에 의해 결정됩니다. 그러면 THEME 변수와 '계속하려면 Enter 키를 누르거나 명령을 입력하세요'라는 메시지가 반환됩니다. 분명히 우리는 변수에만 관심이 있습니다. 변수가 우리가 어두워야 한다는 것을 나타내면 어두운 색 구성표(제 경우에는 zenburn)를 선택하고, 그렇지 않으면 밝은 색상 구성표(제 경우에는 seoul256-light)를 선택합니다. 중요한 점은 'THEME=dark'와의 일치 여부를 확인하고 있으므로 시스템 호출에서 반환된 메시지의 처음 10자만 가져와야 한다는 것입니다.
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
밝은 색과 어두운 색 사이의 색 구성표 전환은 다른 함수를 호출하여 수행됩니다. 이 함수는 또한 적절한 Tmux 색 구성표를 리소스로 사용하고 THEME 변수를 업데이트합니다. THEME 변수가 업데이트되면 위의 SetColorScheme 함수를 호출하여 Vim의 색상을 변경합니다.
function! Toggle_Light_Dark_Colorscheme()
if system('tmux show-environment THEME')[0:9] == 'THEME=dark'
:silent :!tmux source-file ~/.tmux_light.conf
:silent :!tmux set-environment THEME 'light'
else
:silent :!tmux source-file ~/.tmux_dark.conf
:silent :!tmux set-environment THEME 'dark'
endif
:call SetColorScheme()
endfunction
다음과 같이 색 구성표를 빠르게 전환하는 매핑(또는 명령)을 만들 수 있습니다.
nnoremap <Leader>o :call Toggle_Light_Dark_Colorscheme()<cr>
Vim의 새 인스턴스를 열면 Tmux THEME 변수가 이미 전송되었으므로 SetColorScheme 함수를 사용하여 색 구성표를 선택합니다(이 함수는 ~/.vimrc에서 SetColorScheme 함수 뒤에 와야 합니다).
call SetColorScheme()
여기서 멈출 수도 있지만 Vim 인스턴스가 실행 중이고 Tmux 창 내에서 별칭 중 하나를 사용하여 구성표를 변경하는 경우 Vim은 SetColorScheme 기능을 자동으로 다시 실행하지 않습니다.
Vim이 다시 초점을 맞출 때마다 autocmd를 사용하여 색 구성표를 확인하고 재설정할 수 있습니다. 불행하게도 이것은 터미널의 Vim에서는 작동하지 않습니다. 하지만 다행히도 이 문제를 해결해 주는 플러그인이 있습니다:
Plugin 'tmux-plugins/vim-tmux-focus-events'
이 플러그인을 사용하려면 ~/.tmux.conf에 다음 줄이 필요합니다(또는tmux에 민감한플러그인):
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
답변4
vim 외부에서 구성표를 변경하고 vim의 인터페이스를 자동으로 업데이트하는 방법을 찾고 있다면 을 참조하세요 :h t_RB
.이 답변vim 버전 8.0.1129, 2017의 터미널 쿼리 메커니즘 업데이트를 참조합니다.
v0.4.0-239-g36378c33c
네오빔을 사용하신 후 사용하시고 싶으시다면새로운 "신호" autocmd: autocmd Main Signal * call Solar_swap()
. 그런 다음 SIGUSR1
쉘 스크립트에서 neovim 인스턴스를 보내 autocmd를 실행하십시오. Linux에서 사용하려면 다음을 참조하세요.내 대답은 여기.