macOS: vim 으로 plist 편집.

macOS 에서 한/영 전환을 Shift-Space 로 변환하고 싶을 땐, 몇가지 방법이 있지만, ~/Library/Preferences/com.apple.symbolichotkeys.plist 를 살짝 바꿔주는 방법이 제일 편하다.

그런데, macOS 의 plist 는, 평범한 텍스트파일인 경우도 있지만, 이진파일인 경우도 있다. 이진 plist 를 편집하려면, 당연히 일반 편집기로는 안되고 전용도구를 써야 한다.

  • xcode : Apple 에서 제공하고, 무료이지만, 무려 10GB 정도나 자리를 차지한다.
  • TextWrangler : 개발 중지되었고, BBEdit 가 계승했다. 다만, 무료는 아니다.
  • PlistEdit Pro : 역시나 무료가 아님.
  • Xplist : 이게 괜찮아 보이네! 오픈 소스!

이런 와중에, 혹시나 Vim 으로 Plist 편집이 가능하지 않을까하는 생각이 들었고, 즉각 검색에 나섰다.

어허.. 왜 없겠나. 다소 오래되긴 했지만 vim-plist 라는 게 있었다. (찾아보면 더 있을 지도 모르겠으나, 그냥 눈에 띄는 걸로 골라 잡았다.)
설치를 위해선 vim-pathogen 이란게 또 필요하다.

다 합하면 이렇다.

# Pathogen 설치
$ mkdir -p ~/.vim/autoload ~/.vim/bundle
$ curl -LSso ~/.vim/autoload/pathogen.vim  https://tpo.pe/pathogen.vim

# ~/.vimrc 에 다음 내용 추가
execute pathogen#infect()
syntax on
filetype plugin indent on

# vim-plist 설치
$ git clone git://github.com/darfink/vim-plist.git ~/.vim/bundle/vim-plist

끝. 자세한 사용법은 모르겠고, 그냥 내가 대충 쓰기엔 전혀 불편함이 없다.


별 문제가 없겠거니.. 했는데, 사용한지 얼마되지 않아 문제가 발생했다.

이미 있는 plist 를 불러오고 고치는데는 문제가 없다. 그 plist 가 텍스트(xml) 형식이든, 이진형식이든.
다만, 새 plist(당연히 텍스트 형식)를 만들 경우, 오류가 발생한다.

예를 들어, Info.plist 를 만든다고 했을 때.. vim Info.plist 후에 내용을 작성하고 저장하면, 이런 오류가 발생한다.

Error detected while processing function plist#Write:
line    7:
E121: Undefined variable: b:plist_original_format
E15: Invalid expression: !len(g:plist_save_format) ? b:plist_original_format : g:plist_save_format
line   12:
E121: Undefined variable: save_format
E15: Invalid expression: "silent '[,']write !plutil -convert " . s:mapping[save_format] . ' - -o ' . shellescape(fil
ename, 1)
line   23:
E121: Undefined variable: save_format
E116: Invalid arguments for function plist#DisplayInfo

개발자 Github 에 보면, 이런 문제 해결을 위하여 ‘ToDo’ 항목을 만들어 놓기는 했으나.. 4년 전이 마지막 흔적임을 보면, 해결될 가능성은 요원한 듯 하다.
대신 이 문제를 돌아갈 수 있는 방법을 찾았다.

다만.. Vim 문법에 익숙하질 못해서, 뜻하는 바를 정확하겐 알지 못하겠다.
어쨌든, ~/.vimrc 에 해당 내용을 넣어놓으면, 새로 plist 를 만들어도 오류가 발생하진 않는다.

function! s:ConvertBinaryPlist()
  silent! execute '%d'
  call plist#Read(1)
  call plist#ReadPost()
  set fileencoding=utf-8
  autocmd! BufWriteCmd,FileWriteCmd 
  autocmd BufWriteCmd,FileWriteCmd 
        \ call plist#Write()
endfunction
autocmd BufRead *
      \ if getline(1) =~# '^bplist' |
      \   call s:ConvertBinaryPlist() |
      \ endif
autocmd BufNewFile *.plist
      \ if !get(b:, 'plist_original_format') |
      \   let b:plist_original_format = 'xml' |
      \ endif

또는, .vimrc 를 수정하지 않고, 이렇게 할 수도 있다. vim aaa.plist 등으로 파일을 만들지 말고, 확장자 plist 를 주지 않고 파일을 만든다. 즉, vim aaa 등으로 만든 후 일단 작업을 한 뒤에, 나중에 파일명을 바꾸면 되긴 된다.

vim aaa.plist # 이렇게 생성하고 저장하면 오류가 발생한다.
vim aaa # 이렇게 만들고, 저장한 뒤, 나중에 aaa.plist 로 바꾼다.

뭘 택하든.. 어차피 자주 쓸 기능은 아니므로.. (과연 그럴까…?)

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.