2010-11-10 22 views
5

Je édite des fichiers dans Vim où je consigne les lignes de commande du terminal avec des descriptions de ce que j'ai fait. Toutes mes lignes de commande commencent par $, de sorte que mes fichiers ressemblent à ceci:Comment définir une exception pour les sauts de ligne dans Vim?

This is a description of what this 
command does, it can be quite long and 
should have line breaks. 

$ ./the_command.sh 

Ce sont en fait Viki fichiers, mais je suppose que cette question devrait appliquer à tout type de fichier. J'ai la détection de filetype sur et les fichiers sont correctement identifiés.

La question est maintenant:

Je veux ligne (dur) se casse à insérer dans tout le texte à l'exception des copies réelles des lignes de commande, qui pourrait être facilement identifiés par les principaux $.

Est-il possible dans Vim de définir une exception pour l'application de la règle de saut de ligne basée sur un modèle? Est-ce que je ferais cela dans le fichier de syntaxe pour les fichiers viki?

MISE À JOUR En utilisant une combinaison de ce que Herbert et Jefromi suggéré, aurais-je encore dans mon .vimrc:

au CursorMovedI *.viki call SetTextWidth() 

function! SetTextWidth() 
    if getline(".")=~'^\$' 
     set textwidth=1000 
    else 
     set textwidth=80 
    endif 
endfunction 

Il fait exactement ce que je veux. Merci les gars!

+0

Juste pour clarifier: Je veux que les sauts de ligne à insérer automatiquement type I. Dans mon .vimrc j'ai une ligne "autocmd FileType viki setlocal textwidth = 80" pour définir la largeur de texte spécifiquement pour les fichiers viki, ce qui fonctionne bien sauf qu'il casse mes lignes "$ COMMAND" ainsi. – tospo

Répondre

3

Je crois quand vous dites que vous voulez « casse la ligne dure », vous voulez dire que vous voulez que Vim briser une ligne automatiquement, lorsqu'il atteint une colonne de textwidth. La meilleure façon de le faire, je pense, est de définir une commande 'au' qui définit la largeur du texte à un nombre élevé (plus élevé que la ligne la plus longue possible) quand il est sur une ligne qui commence par un "$".

donc quelque chose comme ça changerait textwidth chaque fois que vous entrez ou en mode d'insertion de sortie sur une ligne:

au InsertEnter call SetTextWidth() 
au InsertLeave call SetTextWidth() 

function! SetTextWidth() 
    if getline(line('.')) =~ '^\$' 
     " [edit: 'set textwidth = 0' is preferable to line below] 
     set textwidth =1000 
    else 
     set textwidth=78 
    endif 
endfunction 

Vous pouvez utiliser les groupes CursorMoved/CursorMovedI au lieu de InsertEnter/Laissez car ils sont plus fines -à grain. Ils sont déclenchés chaque fois que vous déplacez le curseur, ainsi la fonction finit par être appelée beaucoup plus de fois, mais la fonction est assez simple pour qu'elle n'introduise probablement aucune dégradation notable des performances.

Pour faire sans fonction à tout ce que vous pourriez probablement utiliser quelque chose comme ceci:

au InsertEnter exec "set tw=" . getline(line('.'))=~'^\$' ? 1000 : 78 
au InsertLeave exec "set tw=" . getline(line('.'))=~'^\$' ? 1000 : 78 
+0

Vous pouvez probablement utiliser 'CursorMovedI' pour implémenter manuellement le retour à la ligne et laisser le texte seul. – Cascabel

+0

Merci beaucoup pour cette solution. Ne devrait-il pas être simplement "getline ('.)" À la place de getline (line ('.))? Le problème avec cette approche est que cela ne fonctionne que si vous commencez à éditer une ligne, tapez le "$" et ensuite sortir et revenir en mode insertion. Sinon, il n'y a pas de "$" au début de la ligne lorsque vous entrez INSERT, ce qui signifie que les sauts de ligne seront insérés et qu'il n'y aura donc pas de "$" en tête lorsque vous quittez le mode INSERT. Je dois essayer avec CursorMovedI maintenant, je suppose que cela devrait fonctionner. – tospo

+0

OK, ça fonctionne très bien avec CursorMovedI - merci beaucoup! – tospo

0

Bien que je ne suis pas sûr de ce que vous voulez (vous devriez être un peu plus précis sur l'endroit où (pourquoi, comment) vous voulez insérer les sauts de ligne), mais vous pouvez utiliser une commande comme

:v:^\s*$: <Your command to insert line break, e.g. s/something/\r/ > 

La commande ci-dessus recherche toute ligne qui ne commence par aucun espace suivi d'un $, puis exécute la commande que vous spécifiez.

HTH

+0

comme je l'ai dit, je veux que la ligne dure casse partout dans le fichier, sauf pour les lignes commençant par $ (copies de lignes de commande). Je souhaite que ces sauts de ligne soient insérés à la volée, c'est-à-dire en définissant la largeur de texte vairable (ce que j'ai fait spécifiquement pour le filetype viki). Donc ce que vous suggérez n'est pas tout à fait ce que je cherchais, merci quand même! – tospo

+0

OK, maintenant je comprends. Dans ce cas, vous devriez considérer les autres réponses. –

2

Je crois que ce serait répondre à vos critères:

set textwidth=78 
v/^$/normal gq/^$\|\%$^M 

^M est-ctrl-v suivie enter

Permet de décomposer en petits morceaux

/^$\|\%$ est un motif qui correspond à chaque ligne ne commençant pas par $. Le \%$ inclura les lignes entre la dernière ligne $ démarrée et la fin du fichier.

gq/^$\|\%$ formats de la ligne courante jusqu'à la configuration /^$\|\%$

:normal {cmd} exécute une commande en mode normal sur la ligne courante.

:v/pattern/ est équivalent à :g!/pattern/ qui exécute une commande sur chaque lot de ligne correspondant/modèle/

Cette solution ne formate pas que vous tapez comme solution @Herbert Sitz fait. Au lieu de cela, le texte est formaté d'un seul coup à la fin.

Vous pouvez bien appliquer ce cours avant chaque écriture avec

au BufWritePre filename-pattern-here set textwidth=78 | v/^$/normal gq/^$\|\%$^M 
au BufWritePost filename-pattern-here set textwidth=0 
+0

merci pour la solution. Je vais aller avec Herbert simplement parce que je préfère avoir ces sauts de ligne appliqués pendant que je tape mais merci pour l'explication !! – tospo