установка типа файла со ссылкой / переменной в vim - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь улучшить команду из справки neovim, которая показывает разницу между буфером и исходным файлом.

проблема в том, что новый буфер открывается без выделения синтаксиса, потому что у него нет типа файла. поэтому я попытался сохранить тип файла в переменных и регистрах, но я не могу использовать его в команде setf позже (даже вручную)

Вот моя последняя попытка:

command! DiffOrig call setreg('f', &filetype) | vert new | set buftype=nofile | read ++edit # | 0d_
    \ | diffthis | setf @f | wincmd p | diffthis

В этом попытка Мне удается сохранить исходный тип файла для регистрации, но мне не удается использовать его в качестве аргумента для setf.

Как я могу заставить его работать?

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

VimScript устанавливает сильную разницу между «командами» и «выражениями» (включая «переменные»). Только некоторые команды принимают выражения, в то время как другие, например set или setfiletype, принимают только строки. Вот почему нужно так часто использовать execute. Но в данном случае простого let более чем достаточно. Вот полная реализация DiffOrig с набором filetype:

command! -bar DiffOrig
    \   vnew +setlocal\ buftype=nofile
    \ | let &filetype = getbufvar(0, '&filetype')
    \ | read ++edit #
    \ | 1delete_
    \ | diffthis
    \ | wincmd p
    \ | diffthis
1 голос
/ 07 августа 2020

Вы можете сделать это, используя let: let &ft=@f. :setf принимает только буквальные строки.

Это также может быть более аккуратным в функции, где вы можете использовать локальную переменную вместо регистра. Если вы хотите сделать это, вы можете определить частную функцию, поставив перед именем функции префикс s:, а затем сославшись на нее с помощью <SID>. Так примерно так:

function! s:DoDiffOrig()
  let oldft=&ft
  " ...
  let &ft=oldft
  wincmd p
  diffthis
endfunction

command! DiffOrig call <SID>DoDiffOrig()<CR>
...