Outils pour utilisateurs

Outils du site


informatique:vim

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
informatique:vim [2021/02/27 08:03] – [Vim] alexisinformatique:vim [2022/09/28 04:21] (Version actuelle) – [Convertir en HTML] alexis
Ligne 7: Ligne 7:
   - [[http://vim.wikia.com/wiki/Delete_all_lines_containing_a_pattern|Delete all lines containing a pattern - Vim Tips Wiki]]   - [[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://mwop.net/blog/134-exuberant-ctags-with-PHP-in-Vim.html|exuberant ctags with PHP in Vim :: phly, boy, phly]]
-  - [[http://superuser.com/questions/75130/how-to-remove-this-symbol-with-vim#75159|gvim - How to remove this symbol "^@" with vim? - Super User]] 
   - [[http://artisan.karma-lab.net/configurer-vim|http://artisan.karma-lab.net/configurer-vim]]   - [[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-et-feuilles-style|http://artisan.karma-lab.net/vim-et-feuilles-style]]
Ligne 33: Ligne 32:
  
 La manière la plus simple d'ouvrir un fichier est de le fournir comme paramètre lors du lancement du programme : La manière la plus simple d'ouvrir un fichier est de le fournir comme paramètre lors du lancement du programme :
 +<WRAP prewrap>
 <code bash> <code bash>
 vim <fichier> vim <fichier>
 </code> </code>
 +</WRAP>
 Dans ce cas, le curseur se positionnera sur le premier caractère du fichier. Il est possible d'ajouter des options lors de l'ouverture pour se positionner ailleurs dans le fichier : Dans ce cas, le curseur se positionnera sur le premier caractère du fichier. Il est possible d'ajouter des options lors de l'ouverture pour se positionner ailleurs dans le fichier :
 +<WRAP prewrap>
 <code bash> <code bash>
 # Pour positionner le curseur sur une ligne sélectionnée par son numéro # Pour positionner le curseur sur une ligne sélectionnée par son numéro
Ligne 47: Ligne 49:
 vim +$ <fichier> vim +$ <fichier>
 </code> </code>
 +</WRAP>
  
 Il est également possible d'ouvrir un fichier à partir d'un répertoire. Dans ce cas, le contenu du répertoire sera listé et il suffira de sélectionner le fichier ou le répertoire désiré en appuyant sur la touche //Enter//. Il est également possible d'ouvrir un fichier à partir d'un répertoire. Dans ce cas, le contenu du répertoire sera listé et il suffira de sélectionner le fichier ou le répertoire désiré en appuyant sur la touche //Enter//.
 +<WRAP prewrap>
 <code bash> <code bash>
 vim <répertoire> vim <répertoire>
 </code> </code>
 +</WRAP>
  
 Enfin, il est possible d'ouvrir un fichier une fois que vim est ouvert en saisissant la commande suivante : Enfin, il est possible d'ouvrir un fichier une fois que vim est ouvert en saisissant la commande suivante :
 +<WRAP prewrap>
 <code bash> <code bash>
 :open <fichier> :open <fichier>
 </code> </code>
 +</WRAP>
 +
 ===== Enregistrer un fichier en lecture seule ===== ===== Enregistrer un fichier en lecture seule =====
 On oublie tous un jour ou l'autre d'ouvrir un fichier avec les droits appropriés. Quand on se retrouve dans cette situation, on sauve les modifications dans un fichier temporaire puis on applique les modifications dans le fichier original avec les droits appropriés. On oublie tous un jour ou l'autre d'ouvrir un fichier avec les droits appropriés. Quand on se retrouve dans cette situation, on sauve les modifications dans un fichier temporaire puis on applique les modifications dans le fichier original avec les droits appropriés.
  
 Il est possible de ne plus faire ça en utilisant la commande suivante : Il est possible de ne plus faire ça en utilisant la commande suivante :
 +<WRAP prewrap>
 <code vim> <code vim>
 :w !sudo tee % >/dev/null :w !sudo tee % >/dev/null
 </code> </code>
 +</WRAP>
 Cette commande lance la commande //sudo tee <fichier>// et transfère le contenu du fichier sur son entrée standard. La commande //tee// s'exécute avec les droits appropriés et transfère le contenu de son entrée standard sur le fichier. Cette commande lance la commande //sudo tee <fichier>// et transfère le contenu du fichier sur son entrée standard. La commande //tee// s'exécute avec les droits appropriés et transfère le contenu de son entrée standard sur le fichier.
  
 On peut même se passer de cette commande en ajoutant l'alias suivant dans le fichier //~/.vimrc// : On peut même se passer de cette commande en ajoutant l'alias suivant dans le fichier //~/.vimrc// :
 +<WRAP prewrap>
 <code vim> <code vim>
 cnoremap sudow w !sudo tee % >/dev/null cnoremap sudow w !sudo tee % >/dev/null
 </code> </code>
 +</WRAP>
 Il suffit ensuite d'appeler l'alias de la manière suivante : Il suffit ensuite d'appeler l'alias de la manière suivante :
 +<WRAP prewrap>
 <code vim> <code vim>
 :sudow :sudow
 </code> </code>
 +</WRAP>
  
 ===== 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</keyqui 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 =====
Ligne 101: Ligne 122:
 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).
  
-===== Utiliser des regexp pour faire de la substitution =====+===== 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. 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.
 +<WRAP prewrap>
 <code bash> <code bash>
 # Pour supprimer ''n'' espaces suivi de ''|'' suivi de ''n'' chiffres # Pour supprimer ''n'' espaces suivi de ''|'' suivi de ''n'' chiffres
 :%s/\s\+|\d\+// :%s/\s\+|\d\+//
 </code> </code>
 +</WRAP>
 +
 +==== 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''.
 +
 +<WRAP prewrap>
 +<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>
 +</WRAP>
 +
 +==== 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.
 +
 +<WRAP prewrap>
 +<code bash>
 +:%s/htm/html/ | %s/JPEG/jpg/ | %s/GIF/gif/
 +</code>
 +</WRAP>
 +
 +==== 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 ''\=''.
 +
 +<WRAP prewrap>
 +<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>
 +</WRAP>
  
 ===== Copier du texte dans le presse-papier ===== ===== Copier du texte dans le presse-papier =====
 Voici une solution qui ne nécessite aucun programme supplémentaire : Voici une solution qui ne nécessite aucun programme supplémentaire :
 +<WRAP prewrap>
 <code bash> <code bash>
 :%w !xclip -in -selection clipboard :%w !xclip -in -selection clipboard
 </code> </code>
 +</WRAP>
 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]] 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 ===== ===== Convertir les fins de ligne =====
 +<WRAP prewrap>
 <code bash> <code bash>
 :set ff=dos :set ff=dos
Ligne 121: Ligne 189:
 :set ff=mac :set ff=mac
 </code> </code>
 +</WRAP>
 [[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]] [[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 :
 +<WRAP prewrap>
 +<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>
 +</WRAP>
 +
 +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 :
 +<WRAP prewrap>
 +<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>
 +
 +<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>
 +
 +==== Exemple ====
 +=== Fichier source ===
 +<WRAP prewrap>
 +<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>
 +
 +<WRAP group>
 +<WRAP half column>
 +=== Résultat avec le thème sombre ===
 +<WRAP prewrap>
 +<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">&quot;</span><span class="Constant">Happy {self.event} {self.person}!</span><span class="Constant">&quot;</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>
 +</WRAP>
 +{{:informatique:vim:event.py.dark.jpg}}
 +</WRAP>
 +<WRAP half column>
 +=== Résultat avec le thème clair ===
 +<WRAP prewrap>
 +<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">&quot;</span><span class="Constant">Happy {self.event} {self.person}!</span><span class="Constant">&quot;</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>
 +</WRAP>
 +{{:informatique:vim:event.py.light.jpg}}
 +</WRAP>
 +</WRAP>
  
informatique/vim.1614441802.txt.gz · Dernière modification : 2021/02/27 08:03 de alexis