Dans vim, comment appliquer des autocommandes pour un type de fichier à une région d'un fichier ?

StackOverflow https://stackoverflow.com//questions/25086204

  •  02-01-2020
  •  | 
  •  

Question

J'ai une sorte de type de fichier polyglotte qui peut contenir du C, du python, du ruby, etc. (pensez à la « page wiki » si cela peut aider).Existe-t-il un moyen d'exécuter les autocommandes pour un type de fichier connu sur une région du fichier ?

Par exemple, je pourrais avoir :

#!bash
if [ a = b ]; then
   echo 'equal'
fi

#!python
if a = b:
    print('equal')

Et je souhaite appliquer les autocommandes de type de fichier bash à la première partie et les autocommandes de type de fichier python à la dernière partie.

Je peux obtenir simplement une mise en évidence de la syntaxe en définissant une région à l'aide de ce méthode, mais je ne comprends pas suffisamment les autocommandes pour pouvoir les appliquer de la même manière.

Était-ce utile?

La solution

Faire cela automatiquement est un défi, car les paramètres de type de fichier sont locaux au tampon ;Vim n'a aucune notion de régions, donc :autocmds doivent être utilisés, comme vous l'avez correctement indiqué.

Rapide et facile

Avec un plugin comme NrrwRgn - Un plugin de région étroite similaire à Emacs, vous pouvez cloner des régions pour séparer les tampons de travail ;le plugin les synchronise automatiquement lors de l'écriture.Chaque tampon peut recevoir un type de fichier distinct via :setf.

Une approche encore plus simple consiste à définir certains mappages pour changer rapidement de type de fichier :

:nnoremap <Leader>fp :setf python<CR>
:nnoremap <Leader>fs :setf sh<CR>

Des régions vraiment séparées dans un seul tampon

Le schéma est simple :

:autocmd CursorMoved,CursorMovedI <buffer> if line('.') >= 6 | setf python | else | setf sh | endif

Cela dépend du fait que chaque plugin de type de fichier effectue un nettoyage approprié (ou remplace toutes les options pertinentes).

Comment déterminer les régions

Vous ne souhaitez certainement pas spécifier explicitement les numéros de ligne comme dans le croquis ci-dessus.Mon Plugin OnSyntaxChange pourrait aider, au cas où vous auriez/pouvez définir des régions de syntaxe appropriées pour chaque bloc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top