Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédenteProchaine révisionLes deux révisions suivantes |
informatique:vim [2016/02/16 02:52] – [Appliquer une commande sur un ensemble de ligne] alexis | informatique:vim [2021/11/30 05:23] – [Convertir en HTML] alexis |
---|
====== Vim ====== | ====== Vim ====== |
| <WRAP todo> |
| - [[https://swordandsignals.com/2020/12/13/5-lines-in-vimrc.html|5 lines I put in a blank .vimrc | Sword and Signals]] |
| - [[http://vim.wikia.com/wiki/Append_output_of_an_external_command|Append output of an external command - Vim Tips Wiki - Wikia]] |
| - [[http://www.rayninfo.co.uk/vimtips.html|Best of VIM Tips, gVIM's Key Features zzapper]] |
| - [[http://www.mon-code.net/article/39/comment-mettre-en-couleur-son-code-php-js-html-dans-vim|Configuration de Vim pour ajouter de la couleur au code PHP]] |
| - [[http://vim.wikia.com/wiki/Delete_all_lines_containing_a_pattern|Delete all lines containing a pattern - Vim Tips Wiki]] |
| - [[http://mwop.net/blog/134-exuberant-ctags-with-PHP-in-Vim.html|exuberant ctags with PHP in Vim :: phly, boy, phly]] |
| - [[http://artisan.karma-lab.net/configurer-vim|http://artisan.karma-lab.net/configurer-vim]] |
| - [[http://artisan.karma-lab.net/vim-et-feuilles-style|http://artisan.karma-lab.net/vim-et-feuilles-style]] |
| - [[http://artisan.karma-lab.net/vim-pliage-et-masquage|http://artisan.karma-lab.net/vim-pliage-et-masquage]] |
| - [[http://www.openvim.com/tutorial.html|Interactive Vim tutorial]] |
| - [[http://forum.ubuntu-fr.org/viewtopic.php?pid=828609|La coloration syntaxique dans Vi / Vim (Page 1) / Trucs, astuces et scripts utiles / Forum Ubuntu-fr.org]] |
| - [[http://www.askapache.com/linux/fast-vimrc.html|Optimized Vimrc with 256 Colorscheme]] |
| - [[http://vim.spf13.com/|spf13-vim - The Ultimate Vim Distribution]] |
| - [[http://vimcasts.org/episodes/the-file-explorer/|The file explorer]] |
| - [[http://thomer.com/vi/vi.html|Vi Lovers Home Page]] |
| - [[http://www.catonmat.net/blog/vim-plugins-surround-vim/|Vim Plugins You Should Know About, Part I: surround.vim - good coders code, great reuse]] |
| - [[http://www.catonmat.net/blog/vim-plugins-matchit-vim/|Vim Plugins You Should Know About, Part III: matchit.vim - good coders code, great reuse]] |
| - [[http://www.catonmat.net/blog/vim-plugins-snipmate-vim/|Vim Plugins You Should Know About, Part IV: snipmate.vim - good coders code, great reuse]] |
| - [[http://www.catonmat.net/blog/vim-plugins-a-vim/|Vim Plugins You Should Know About, Part V: a.vim - good coders code, great reuse]] |
| - [[http://www.catonmat.net/blog/vim-plugins-ragtag-allml-vim/|Vim Plugins You Should Know About, Part VII: ragtag.vim (formerly allml.vim) - good coders code, great reuse]] |
| - [[http://stackoverflow.com/questions/1946738/vim-how-to-delete-every-second-row|Vim: how to delete every second row? - Stack Overflow]] |
| - [[http://linux-attitude.fr/post/Vimrc-collaboratif|Vimrc collaboratif - Linux Attitude]] |
| - [[http://www.vim.org/|welcome home : vim online]] |
| - [[https://thevaluable.dev/vim-beginner/|Vim for beginners]] |
| - [[https://thevaluable.dev/vim-intermediate/|Vim for intermediate users]] |
| - [[https://thevaluable.dev/vim-advanced/|A Vim Guide for Advanced Users]] |
| </WRAP> |
| |
===== Ouvrir un fichier ===== | ===== Ouvrir un fichier ===== |
| |
===== Saisir des caractères de contrôle ===== | ===== Saisir des caractères de contrôle ===== |
Il peut être nécessaire de saisir ce type de caractères lors de l'utilisation de VI. Pour cela, il faut utiliser la combinaison suivante ''Ctrl+V'' puis ''Ctrl+<caractère>''. Par exemple : | Il peut être nécessaire de saisir ce type de caractères lors de l'utilisation de //vim//. |
* Il ne faut pas saisir ''^M'' mais ''Ctrl+V Ctrl+M''<code>:%s/^M//g</code> | Pour cela, il faut utiliser la combinaison <key>Ctrl+V</key> qui indique à //vim// de prendre le caractère qui suit tel quel. |
* Il ne faut pas saisir ''^@'' mais ''Ctrl+V Ctrl+2''<code>:%s/^@//g</code> | Certains caractères peuvent être insérés directement (la tabulation par exemple) ou en utilisant un code de contrôle (voir la [[https://en.wikipedia.org/wiki/C0_and_C1_control_codes|liste complète]]). |
| |
Pour certain caractères, il est possible de se passer de ''Ctrl+V'' | |
| |
Ces caractères sont encodés affichés selon la //caret notation//. Voir les [[https://en.wikipedia.org/wiki/C0_and_C1_control_codes|codes de contrôle C0 et C1]] pour la liste complète. Par exemple, ''^M'' correspond au caractère de retour chariot (//CR//) et ''^@'' correspond au caractère null (//NUL//). | ^ Caractère ^ Notation ^ Séquence ^ |
| | Nul | ''^@'' | <key>Ctrl+V</key> suivi de <key>Ctrl+2</key> | |
| | Retour chariot | ''^M'' | <key>Ctrl+V</key> suivi de <key>Ctrl+M</key> | |
| | Tabulation | ''^I'' | <key>Ctrl+V</key> suivi de <key>Tab</key> | |
| |
| <WRAP info> |
| Certain caractères peuvent être saisis sans utiliser la combinaison <key>Ctrl+V</key>. |
| </WRAP> |
| |
===== Appliquer une commande sur un ensemble de ligne ===== | ===== Appliquer une commande sur un ensemble de ligne ===== |
Si on ne veut pas conserver le contenu modifié localement, il suffit de lancer la commande '':edit!'' ('':e!'' en notation courte). | Si on ne veut pas conserver le contenu modifié localement, il suffit de lancer la commande '':edit!'' ('':e!'' en notation courte). |
| |
| ===== Substitution de texte ===== |
| |
| ==== Utiliser des regexp ==== |
| Le fonctionnement des regexp est inversé par rapport à d'autre logiciel. Pour activer certains motifs, il faut utiliser le caractère d'échappement alors que d'habitude, il faut l'utiliser pour les désactiver. |
| <code bash> |
| # Pour supprimer ''n'' espaces suivi de ''|'' suivi de ''n'' chiffres |
| :%s/\s\+|\d\+// |
| </code> |
| |
| ==== Changer de casse ==== |
| Le changement de casse ne peut se faire qu'avec l'utilisation de références arrières. Il est possible de : |
| * Mettre en majuscule tout le texte qui suit : ''\U''. ((le changement s'effectue jusqu'à la fin de la ligne ou jusqu'au délimiteur (''\E'' ou ''\e'').)) |
| * Mettre en minuscule tout le texte qui suit : ''\L''. ((le changement s'effectue jusqu'à la fin de la ligne ou jusqu'au délimiteur (''\E'' ou ''\e'').)) |
| * Mettre en majuscule la première lettre du texte qui suit : ''\u''. |
| * Mettre en minuscule la première lettre du texte qui suit : ''\l''. |
| |
| <code bash> |
| :%s/Test \(TeSt\) Test/Test \U\1 Test/ # Affiche "Test TEST TEST" |
| :%s/Test \(TeSt\) Test/Test \U\1\E Test/ # Affiche "Test TEST Test" |
| :%s/Test \(TeSt\) Test/Test \L\1 Test/ # Affiche "Test test test" |
| :%s/Test \(TeSt\) Test/Test \L\1\E Test/ # Affiche "Test test Test" |
| :%s/Test \(TeSt\) Test/Test \u\1 Test/ # Affiche "Test TeSt Test" |
| :%s/Test \(TeSt\) Test/Test \l\1 Test/ # Affiche "Test teSt Test" |
| </code> |
| |
| ==== Chaîner des substitutions ==== |
| Pour cela, il suffit juste d'utiliser ''|'' entre chaque commande de substitution. Si une erreur survient, les substitutions suivantes ne seront pas appliquées. |
| |
| <code bash> |
| :%s/htm/html/ | %s/JPEG/jpg/ | %s/GIF/gif/ |
| </code> |
| |
| ==== Utiliser une expression ==== |
| Il est possible d'utiliser une expression comme chaîne de remplacement. Pour cela, la chaîne de remplacement doit commencer par ''\=''. |
| |
| <code bash> |
| # Ajouter le numéro de chaque ligne |
| :%s/^/\=line('.')."\t"/ |
| |
| # Dupliquer la référence arrière en la modifiant |
| :%s/'\(.*\)'/\='"'.submatch(1).'" => "'.substitute(submatch(1),'_',' ', 'g').'",'/g |
| </code> |
| |
| ===== Copier du texte dans le presse-papier ===== |
| Voici une solution qui ne nécessite aucun programme supplémentaire : |
| <code bash> |
| :%w !xclip -in -selection clipboard |
| </code> |
| Pour d'autres méthodes, il suffit de faire un tour sur [[https://stackoverflow.com/questions/3961859/how-to-copy-to-clipboard-in-vim|Stack Overflow]] |
| |
| ===== Convertir les fins de ligne ===== |
| <code bash> |
| :set ff=dos |
| :set ff=unix |
| :set ff=mac |
| </code> |
| [[https://stackoverflow.com/questions/82726/convert-dos-line-endings-to-linux-line-endings-in-vim|Convert DOS line endings to Linux line endings in vim - Stack Overflow]] |
| |
| ===== Convertir en HTML ===== |
| Il est possible de convertir le contenu d'un fichier en HTML en utilisant ''TOhtml'' en mode visuel. |
| Il est possible de le faire également en mode CLI de la manière suivante : |
| <code bash> |
| # Convertir tout le fichier |
| vim -e <filename> -c "set nobackup" -c :TOhtml -c wq -c :q |
| |
| # Convertir une partie du fichier (de la ligne 10 à la ligne 20 incluse) |
| vim -e <filename> -c "set nobackup" -c :10,20TOhtml -c wq -c :q |
| </code> |
| |
| Avec l'utilisation du thème [[https://www.vim.org/scripts/script.php?script_id=1464|moria]], il est possible de changer la coloration syntaxique de base : |
| <code bash> |
| # Avec un arrière plan foncé |
| vim -e <filename> -c "set nobackup" -c "let moria_style='dark'" -c ":colorscheme moria" -c :TOhtml -c wq -c :q |
| |
| # Avec un arrière plan clair |
| vim -e <filename> -c "set nobackup" -c "let moria_style='light'" -c ":colorscheme moria" -c :TOhtml -c wq -c :q |
| </code> |
| |
| <WRAP tip> |
| Il est intéressant de pouvoir convertir le fichier HTML généré en image pour pouvoir l'inclure dans une documentation. Pour cela, il est possible d'utiliser ''wkhtmltoimage'', ''firefox'' en mode //headless// ou encore ''Puppeteer''. |
| </WRAP> |
| |
| <code python event.py> |
| class Card: |
| def __init__(self, event, person): |
| self.event=event |
| self.person=person |
| |
| def message(self): |
| print(f"Happy {self.event} {self.person}!") |
| |
| card = Card('birthday', 'Charles') |
| card.message() |
| </code> |
| |
| <WRAP group> |
| <WRAP half column> |
| <code html event.py.dark.html> |
| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta charset="UTF-8"> |
| <title>~/event.py.html</title> |
| <meta name="Generator" content="Vim/8.2"> |
| <meta name="plugin-version" content="vim8.1_v2"> |
| <meta name="syntax" content="python"> |
| <meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=,use_input_for_pc=fallback"> |
| <meta name="colorscheme" content="moria"> |
| <style> |
| <!-- |
| pre { white-space: pre-wrap; font-family: monospace; color: #c0c0c0; background-color: #000000; } |
| body { font-family: monospace; color: #c0c0c0; background-color: #000000; } |
| * { font-size: 1em; } |
| .LineNr { color: #ffff00; } |
| .Constant { color: #ff40ff; } |
| .Identifier { color: #00ffff; font-weight: bold; } |
| .Statement { color: #ffff00; } |
| --> |
| </style> |
| |
| <script> |
| <!-- |
| |
| /* function to open any folds containing a jumped-to line before jumping to it */ |
| function JumpToLine() |
| { |
| var lineNum; |
| lineNum = window.location.hash; |
| lineNum = lineNum.substr(1); /* strip off '#' */ |
| |
| if (lineNum.indexOf('L') == -1) { |
| lineNum = 'L'+lineNum; |
| } |
| var lineElem = document.getElementById(lineNum); |
| /* Always jump to new location even if the line was hidden inside a fold, or |
| * we corrected the raw number to a line ID. |
| */ |
| if (lineElem) { |
| lineElem.scrollIntoView(true); |
| } |
| return true; |
| } |
| if ('onhashchange' in window) { |
| window.onhashchange = JumpToLine; |
| } |
| |
| --> |
| </script> |
| </head> |
| <body onload='JumpToLine();'> |
| <pre id='vimCodeElement'> |
| <span id="L1" class="LineNr"> 1 </span><span class="Statement">class</span> <span class="Identifier">Card</span>: |
| <span id="L2" class="LineNr"> 2 </span> <span class="Statement">def</span> <span class="Identifier">__init__</span>(self, event, person): |
| <span id="L3" class="LineNr"> 3 </span> self.event=event |
| <span id="L4" class="LineNr"> 4 </span> self.person=person |
| <span id="L5" class="LineNr"> 5 </span> |
| <span id="L6" class="LineNr"> 6 </span> <span class="Statement">def</span> <span class="Identifier">message</span>(self): |
| <span id="L7" class="LineNr"> 7 </span> <span class="Identifier">print</span>(f<span class="Constant">"</span><span class="Constant">Happy {self.event} {self.person}!</span><span class="Constant">"</span>) |
| <span id="L8" class="LineNr"> 8 </span> |
| <span id="L9" class="LineNr"> 9 </span>card = Card(<span class="Constant">'</span><span class="Constant">birthday</span><span class="Constant">'</span>, <span class="Constant">'</span><span class="Constant">Charles</span><span class="Constant">'</span>) |
| <span id="L10" class="LineNr">10 </span>card.message() |
| </pre> |
| </body> |
| </html> |
| <!-- vim: set foldmethod=manual : --> |
| |
| </code> |
| {{:informatique:vim:event.py.dark.jpg}} |
| </WRAP> |
| <WRAP half column> |
| <code html event.py.light.html> |
| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta charset="UTF-8"> |
| <title>~/event.py.html</title> |
| <meta name="Generator" content="Vim/8.2"> |
| <meta name="plugin-version" content="vim8.1_v2"> |
| <meta name="syntax" content="python"> |
| <meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=,use_input_for_pc=fallback"> |
| <meta name="colorscheme" content="moria"> |
| <style> |
| <!-- |
| pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #ffffff; } |
| body { font-family: monospace; color: #000000; background-color: #ffffff; } |
| * { font-size: 1em; } |
| .LineNr { color: #af5f00; } |
| .Constant { color: #c00000; } |
| .Identifier { color: #008080; } |
| .Statement { color: #af5f00; } |
| --> |
| </style> |
| |
| <script> |
| <!-- |
| |
| /* function to open any folds containing a jumped-to line before jumping to it */ |
| function JumpToLine() |
| { |
| var lineNum; |
| lineNum = window.location.hash; |
| lineNum = lineNum.substr(1); /* strip off '#' */ |
| |
| if (lineNum.indexOf('L') == -1) { |
| lineNum = 'L'+lineNum; |
| } |
| var lineElem = document.getElementById(lineNum); |
| /* Always jump to new location even if the line was hidden inside a fold, or |
| * we corrected the raw number to a line ID. |
| */ |
| if (lineElem) { |
| lineElem.scrollIntoView(true); |
| } |
| return true; |
| } |
| if ('onhashchange' in window) { |
| window.onhashchange = JumpToLine; |
| } |
| |
| --> |
| </script> |
| </head> |
| <body onload='JumpToLine();'> |
| <pre id='vimCodeElement'> |
| <span id="L1" class="LineNr"> 1 </span><span class="Statement">class</span> <span class="Identifier">Card</span>: |
| <span id="L2" class="LineNr"> 2 </span> <span class="Statement">def</span> <span class="Identifier">__init__</span>(self, event, person): |
| <span id="L3" class="LineNr"> 3 </span> self.event=event |
| <span id="L4" class="LineNr"> 4 </span> self.person=person |
| <span id="L5" class="LineNr"> 5 </span> |
| <span id="L6" class="LineNr"> 6 </span> <span class="Statement">def</span> <span class="Identifier">message</span>(self): |
| <span id="L7" class="LineNr"> 7 </span> <span class="Identifier">print</span>(f<span class="Constant">"</span><span class="Constant">Happy {self.event} {self.person}!</span><span class="Constant">"</span>) |
| <span id="L8" class="LineNr"> 8 </span> |
| <span id="L9" class="LineNr"> 9 </span>card = Card(<span class="Constant">'</span><span class="Constant">birthday</span><span class="Constant">'</span>, <span class="Constant">'</span><span class="Constant">Charles</span><span class="Constant">'</span>) |
| <span id="L10" class="LineNr">10 </span>card.message() |
| </pre> |
| </body> |
| </html> |
| <!-- vim: set foldmethod=manual : --> |
| </code> |
| {{:informatique:vim:event.py.light.jpg}} |
| </WRAP> |
| </WRAP> |
| |