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/11/12 06:29] – [Chaîner des substitutions] alexisinformatique:vim [2022/09/28 04:21] (Version actuelle) – [Convertir en HTML] alexis
Ligne 27: Ligne 27:
   - [[https://thevaluable.dev/vim-intermediate/|Vim for intermediate users]]   - [[https://thevaluable.dev/vim-intermediate/|Vim for intermediate users]]
   - [[https://thevaluable.dev/vim-advanced/|A Vim Guide for Advanced Users]]   - [[https://thevaluable.dev/vim-advanced/|A Vim Guide for Advanced Users]]
-  - [[https://vim.fandom.com/wiki/Using_an_expression_in_substitute_command|Using an expression in substitute command | Vim Tips Wiki | Fandom]] 
-  - [[https://vim.fandom.com/wiki/Search_and_replace|Search and replace | Vim Tips Wiki | Fandom]] 
 </WRAP> </WRAP>
  
Ligne 34: 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 48: 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 =====
Ligne 113: Ligne 126:
 ==== Utiliser des regexp ==== ==== 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 ==== ==== Changer de casse ====
Ligne 125: Ligne 140:
   * Mettre en minuscule la première lettre du texte qui suit : ''\l''.   * Mettre en minuscule la première lettre du texte qui suit : ''\l''.
  
 +<WRAP prewrap>
 <code bash> <code bash>
 :%s/Test \(TeSt\) Test/Test \U\1 Test/ # Affiche "Test TEST TEST" :%s/Test \(TeSt\) Test/Test \U\1 Test/ # Affiche "Test TEST TEST"
Ligne 133: Ligne 149:
 :%s/Test \(TeSt\) Test/Test \l\1 Test/ # Affiche "Test teSt Test" :%s/Test \(TeSt\) Test/Test \l\1 Test/ # Affiche "Test teSt Test"
 </code> </code>
 +</WRAP>
  
 ==== Chaîner des substitutions ==== ==== 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. 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> <code bash>
 :%s/htm/html/ | %s/JPEG/jpg/ | %s/GIF/gif/ :%s/htm/html/ | %s/JPEG/jpg/ | %s/GIF/gif/
 </code> </code>
 +</WRAP>
  
 ==== Utiliser une expression ==== ==== 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 ''\=''. 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> <code bash>
 # Ajouter le numéro de chaque ligne # Ajouter le numéro de chaque ligne
Ligne 151: Ligne 171:
 :%s/'\(.*\)'/\='"'.submatch(1).'" => "'.substitute(submatch(1),'_',' ', 'g').'",'/g :%s/'\(.*\)'/\='"'.submatch(1).'" => "'.substitute(submatch(1),'_',' ', 'g').'",'/g
 </code> </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 165: 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.1636727363.txt.gz · Dernière modification : 2021/11/12 06:29 de alexis