<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://www.momh.fr/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>momh</title>
	<link>https://momh.fr/</link>
	<description>My Own Memory Hole se veut une sorte de &#171;&#160;vitrine&#160;&#187; de mon parcours et de mon exp&#233;rience mais aussi de mes centres d'int&#233;r&#234;t et constitue donc en quelque sorte ma m&#233;moire en ligne, m&#233;moire virtuelle d&#233;localis&#233;e mais ordonn&#233;e et index&#233;e&#8230;</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://www.momh.fr/spip.php?page=backend" rel="self" type="application/rss+xml" />




<item xml:lang="fr">
		<title>Du nouveau dans mon terminal</title>
		<link>https://www.momh.fr/du-nouveau-dans-mon-terminal</link>
		<guid isPermaLink="true">https://www.momh.fr/du-nouveau-dans-mon-terminal</guid>
		<dc:date>2026-09-12T19:59:02Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>bricebou@momh.fr</dc:creator>


		<dc:subject>terminal</dc:subject>
		<dc:subject>Linux</dc:subject>

		<description>
&lt;p&gt;Apr&#232;s avoir exp&#233;riment&#233; divers terminaux, jongl&#233; entre &lt;span class=&#034;caps&#034;&gt;ZSH&lt;/span&gt; et Fish sur plusieurs ordinateurs, test&#233; Oh My Posh puis Starship comme &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;d&#233;corateur&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; de prompt, me voil&#224; je crois d&#233;sormais bien satisfait de ma configuration actuelle. &lt;br class='autobr' /&gt; Ainsi, j'ai fini par d&#233;finitivement opter pour Alacritty comme terminal, pr&#233;f&#233;rant &#224; des solutions plus riches en fonctionnalit&#233;s mais aussi plus &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;lourdes&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; &#224; l'usage sa simplicit&#233; et sa r&#233;activit&#233;, ce que les d&#233;veloppeur&#8901;euses r&#233;sument tr&#232;s bien ainsi sur le&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/terminal" rel="tag"&gt;terminal&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Apr&#232;s avoir exp&#233;riment&#233; divers terminaux, jongl&#233; entre &lt;span class=&#034;caps&#034;&gt;ZSH&lt;/span&gt; et Fish sur plusieurs ordinateurs, test&#233; &lt;a href=&#034;https://ohmyposh.dev/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Oh My Posh&lt;/a&gt; puis &lt;a href=&#034;https://starship.rs/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Starship&lt;/a&gt; comme &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;d&#233;corateur&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; de prompt, me voil&#224; je crois d&#233;sormais bien satisfait de ma configuration actuelle.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Ainsi, j'ai fini par d&#233;finitivement opter pour &lt;a href=&#034;https://alacritty.org/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Alacritty&lt;/a&gt; comme terminal, pr&#233;f&#233;rant &#224; des solutions plus riches en fonctionnalit&#233;s mais aussi plus &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;lourdes&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; &#224; l'usage sa simplicit&#233; et sa r&#233;activit&#233;, ce que les d&#233;veloppeur&#8901;euses r&#233;sument tr&#232;s bien ainsi sur le &lt;a href=&#034;https://github.com/alacritty/alacritty#faq&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Github du projet&lt;/a&gt;&#160;:&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;This means you won't find things like tabs or splits (which are best left to a window manager or terminal multiplexer) nor niceties like a &lt;span class=&#034;caps&#034;&gt;GUI&lt;/span&gt; config editor.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Et je me suis alors lanc&#233; &#224; la recherche d'un multiplexeur de terminal, m'&#233;tant lass&#233; si l'on peut dire de tmux que j'ai utilis&#233; durant de longues ann&#233;es&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; et c'est ainsi que j'ai d&#233;couvert &lt;a href=&#034;https://zellij.dev/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Zellij&lt;/a&gt; qui m'a v&#233;ritablement s&#233;duit par sa simplicit&#233; (dans sa gestion des onglets et des panneaux), par la possibilit&#233; de faire flotter un panneau, par l'affichage permanent des raccourcis...&lt;/p&gt;
&lt;p&gt;Pour ce qui est du shell, je suis revenu finalement &#224; &lt;span class=&#034;caps&#034;&gt;ZSH&lt;/span&gt;, d&#233;laissant Oh My Posh ou Starship pour retourner au premier th&#232;me que j'avais utilis&#233; lors de ma d&#233;couverte de &lt;span class=&#034;caps&#034;&gt;ZSH&lt;/span&gt;, &lt;a href=&#034;https://github.com/romkatv/powerlevel10k&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Powerlevel10k&lt;/a&gt;, celui-ci g&#233;rant beaucoup mieux les gros d&#233;p&#244;ts &lt;span class=&#034;caps&#034;&gt;GIT&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Voici pour ma configuration de &lt;span class=&#034;caps&#034;&gt;ZSH&lt;/span&gt;&#160;:&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.zshrc&lt;/code&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# ## Powerlevel10k instant prompt &#8212; DOIT rester tout en haut du fichier, ## avant tout le reste (compinit, antidote, etc.). C'est ce qui permet ## d'afficher un prompt instantan&#233;ment pendant que le reste se charge ## en arri&#232;re-plan. # if [[ -r &#034;${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh&#034; ]]; then source &#034;${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh&#034; fi # ## Compl&#233;tion &#8212; mise en cache pour &#233;viter de refaire l'audit de s&#233;curit&#233; ## &#224; chaque lancement # zstyle ':completion:*' use-cache on zstyle ':completion:*' cache-path &#034;${XDG_CACHE_HOME:-$HOME/.cache}/zsh/compcache&#034; autoload -Uz compinit zcd=&#034;${ZDOTDIR:-$HOME}/.zcompdump&#034; if [[ -n ${zcd}(#qN.mh+24) ]]; then compinit else compinit -C fi unset zcd # ## Historique &#8212; absent par d&#233;faut en zsh nu (contrairement &#224; bash), ## n&#233;cessaire pour la persistance entre sessions et pour que ## zsh-autosuggestions ait quelque chose &#224; sugg&#233;rer. # HISTFILE=&#034;${ZDOTDIR:-$HOME}/.zsh_history&#034; HISTSIZE=50000 SAVEHIST=50000 setopt EXTENDED_HISTORY # horodatage de chaque commande setopt HIST_EXPIRE_DUPS_FIRST # purge les doublons en premier si besoin de place setopt HIST_IGNORE_DUPS # ignore les doublons cons&#233;cutifs imm&#233;diats setopt HIST_IGNORE_ALL_DUPS # supprime l'ancienne occurrence d'un doublon setopt HIST_FIND_NO_DUPS setopt HIST_IGNORE_SPACE # une commande pr&#233;c&#233;d&#233;e d'un espace n'est pas enregistr&#233;e setopt HIST_SAVE_NO_DUPS setopt HIST_VERIFY setopt SHARE_HISTORY # historique partag&#233; en temps r&#233;el entre tous les panes/onglets ouverts setopt APPEND_HISTORY setopt INC_APPEND_HISTORY_TIME # ## D&#233;sactive le check de mise &#224; jour d'Oh My Zsh (on utilise juste sa ## couche de compatibilit&#233; via getantidote/use-omz, pas le framework ## complet &#8212; ce check tournait &#224; chaque d&#233;marrage pour rien). # zstyle ':omz:update' mode disabled # ## Lazy-load antidote and generate the static load file only when needed # zsh_plugins=${ZDOTDIR:-$HOME}/.zsh_plugins if [[ ! ${zsh_plugins}.zsh -nt ${zsh_plugins}.txt ]]; then ( source &#034;/usr/share/zsh-antidote/antidote.zsh&#034; antidote bundle &lt;${zsh_plugins}.txt &gt;${zsh_plugins}.zsh ) fi source ${zsh_plugins}.zsh # ## fzf-tab &#8212; r&#233;glages recommand&#233;s # zstyle ':completion:*:git-checkout:*' sort false zstyle ':completion:*:descriptions' format '[%d]' zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} zstyle ':completion:*' menu no zstyle ':fzf-tab:complete:cd:*' fzf-preview 'ls --color $realpath' zstyle ':fzf-tab:*' switch-group ',' '.' # ## Paths # path=( $path &#034;${ZDOTDIR:-$HOME}/bin/&#034; &#034;${ZDOTDIR:-$HOME}/.composer/vendor/bin/&#034; &#034;${ZDOTDIR:-$HOME}/.local/bin/&#034; ) # ## Lazy load SSH agent # function _load_ssh_agent() { if [ -z &#034;$SSH_AUTH_SOCK&#034; ]; then eval &#034;$(ssh-agent -s)&#034; &gt; /dev/null fi } autoload -U add-zsh-hook add-zsh-hook precmd _load_ssh_agent # # Load other dotfiles # declare -a DOTFILES_TO_LOAD=( &#034;${ZDOTDIR:-$HOME}/.zaliases&#034; &#034;${ZDOTDIR:-$HOME}/spip-cli/bin/spip_console_autocomplete&#034; ) for i in ${DOTFILES_TO_LOAD[*]}; do if [ -f &#034;$i&#034; ]; then source &#034;$i&#034; &amp;&gt; /dev/null fi done # ## Titre du terminal &#8212; &#233;quivalent l&#233;ger de zsh-tab-title, sans le co&#251;t ## mesur&#233; au zprof. Snippet officiel de l'auteur de Powerlevel10k (MIT), ## voir https://github.com/romkatv/powerlevel10k/issues/1092 # function set-term-title() { emulate -L zsh if [[ -t 1 ]]; then print -rn -- $'\e]0;'${(V)1}$'\a' elif [[ -w $TTY ]]; then print -rn -- $'\e]0;'${(V)1}$'\a' &gt;$TTY fi } function set-term-title-preexec() { set-term-title $1 } function _term_title_path() { emulate -L zsh local path=&#034;${PWD/#$HOME/~}&#034; local -a parts parts=(&#034;${(s:/:)path}&#034;) if (( ${#parts} &gt; 3 )); then print -rn -- &#034;&#8230;/${(j:/:)parts[-3,-1]}&#034; else print -rn -- &#034;$path&#034; fi } function set-term-title-precmd() { set-term-title &#034;$(_term_title_path)&#034; } add-zsh-hook preexec set-term-title-preexec add-zsh-hook precmd set-term-title-precmd # # https://github.com/voronkovich/symfony-complete.plugin.zsh # compdef _symfony_complete symfony compdef _symfony_complete console compdef _symfony_complete artisan compdef _symfony_complete phpstan # ## Powerlevel10k &#8212; config g&#233;n&#233;r&#233;e/personnalis&#233;e # [[ ! -f ${ZDOTDIR:-$HOME}/.p10k.zsh ]] || source ${ZDOTDIR:-$HOME}/.p10k.zsh &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.p10k.zsh&lt;/code&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# Config Powerlevel10k &#8212; palette gruvbox dark, sans modules de langage. # Ce fichier ne couvre que l'essentiel ; lancez `p10k configure` &#224; tout # moment pour ouvrir l'assistant interactif et affiner ic&#244;nes/s&#233;parateurs # au-del&#224; de ce qui est fix&#233; ici &#8212; il r&#233;g&#233;n&#233;rera ce fichier en conservant # la structure ci-dessous si vous relancez ensuite ce script par-dessus. 'builtin' 'local' '-a' 'p10k_config_opts' [[ ! -o 'aliases' ]] || p10k_config_opts+=('aliases') [[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob') [[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand') 'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand' () { emulate -L zsh -o extended_glob # Segments affich&#233;s &#224; gauche, dans l'ordre. typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon dir vcs) # Segments affich&#233;s &#224; droite. typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status command_execution_time time) typeset -g POWERLEVEL9K_MODE=nerdfont-complete typeset -g POWERLEVEL9K_ICON_PADDING=moderate typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true # Style powerline avec s&#233;parateurs en chevrons (angles), comme oh-my-posh. typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL=$'\uE0B0' typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR=$'\uE0B0' typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR=$'\uE0B1' typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL=$'\uE0B2' typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR=$'\uE0B2' typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR=$'\uE0B3' # ## Palette gruvbox dark (m&#234;mes couleurs que votre starship.toml) # local fg0='#fbf1c7' local bg1='#3c3836' local bg3='#665c54' local blue='#458588' local aqua='#689d6a' local green='#98971a' local orange='#d65d0e' local red='#cc241d' local yellow='#d79921' # OS icon typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_OS_ICON_BACKGROUND=$orange # Directory typeset -g POWERLEVEL9K_DIR_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_DIR_BACKGROUND=$yellow typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_last typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=3 typeset -g POWERLEVEL9K_SHORTEN_DELIMITER='&#8230;/' # Git (vcs) &#8212; couleur unique quel que soit l'&#233;tat, comme votre config # Starship actuelle (aqua). Changez *_BACKGROUND ci-dessous si vous # pr&#233;f&#233;rez une couleur diff&#233;rente pour &#034;propre&#034; vs &#034;modifi&#233;&#034;. typeset -g POWERLEVEL9K_VCS_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_VCS_CLEAN_BACKGROUND=$aqua typeset -g POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=$aqua typeset -g POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=$aqua typeset -g POWERLEVEL9K_VCS_BRANCH_ICON=$'\uf126 ' typeset -g POWERLEVEL9K_VCS_GIT_ICON='' # Filet de s&#233;curit&#233; pour les tr&#232;s gros repos (le souci qu'on avait avec # Starship/libgit2) : au-del&#224; de ce nombre de fichiers modifi&#233;s, affiche # un indicateur approximatif plut&#244;t que de tout compter pr&#233;cis&#233;ment. typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=4000 # Indicateurs d'&#233;tat en caract&#232;res simples plut&#244;t qu'en ic&#244;nes rondes # qui se ressemblent trop entre elles. typeset -g POWERLEVEL9K_VCS_STAGED_ICON='+' typeset -g POWERLEVEL9K_VCS_UNSTAGED_ICON='!' typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?' typeset -g POWERLEVEL9K_VCS_CONFLICTED_ICON='&#10008;' typeset -g POWERLEVEL9K_VCS_COMMITS_AHEAD_ICON='&#8673;' typeset -g POWERLEVEL9K_VCS_COMMITS_BEHIND_ICON='&#8675;' typeset -g POWERLEVEL9K_VCS_STASH_ICON='*' typeset -g POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON='' typeset -g POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON='' # Status (code de sortie de la derni&#232;re commande) typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=$green typeset -g POWERLEVEL9K_STATUS_OK_BACKGROUND=$bg1 typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=$red typeset -g POWERLEVEL9K_STATUS_ERROR_BACKGROUND=$bg1 typeset -g POWERLEVEL9K_STATUS_OK=false typeset -g POWERLEVEL9K_STATUS_ERROR=true # Dur&#233;e de la derni&#232;re commande (n'appara&#238;t que si &gt; 3s) typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3 typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND=$bg3 # Heure typeset -g POWERLEVEL9K_TIME_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_TIME_BACKGROUND=$bg1 typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M}' # Caract&#232;re de prompt (&#233;quivalent du [character] Starship) typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=$green typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=$red typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='&#10095;' typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='&#10094;' # R&#233;duit le bruit affich&#233; par le mode &#034;instant prompt&#034; au d&#233;marrage typeset -g POWERLEVEL9K_INSTANT_PROMPT=quiet typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true } (( ${#p10k_config_opts} )) &amp;&amp; setopt ${p10k_config_opts[@]} 'builtin' 'unset' 'p10k_config_opts' &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.zsh_plugins.txt&lt;/code&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# Th&#232;me &#8212; doit &#234;tre charg&#233; t&#244;t, avant les autres plugins romkatv/powerlevel10k # ## Using Oh My Zsh plugins # getantidote/use-omz # https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/aliases ohmyzsh/ohmyzsh path:plugins/aliases # https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/fzf ohmyzsh/ohmyzsh path:plugins/fzf # https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git ohmyzsh/ohmyzsh path:plugins/git # https://github.com/unixorn/git-extra-commands?tab=readme-ov-file#antigen unixorn/git-extra-commands # https://github.com/MichaelAquilina/zsh-you-should-use &#034;MichaelAquilina/zsh-you-should-use&#034; # https://github.com/wintermi/zsh-lsd wintermi/zsh-lsd # https://github.com/voronkovich/symfony-complete.plugin.zsh voronkovich/symfony-complete.plugin.zsh # fzf-tab &#8212; remplace le menu de compl&#233;tion standard par une interface fzf. # Doit &#234;tre charg&#233; apr&#232;s compinit (d&#233;j&#224; le cas, compinit tourne en tout # d&#233;but de .zshrc) et AVANT les plugins qui enveloppent les widgets ZLE # ci-dessous. Aloxaf/fzf-tab # Ces trois-l&#224; doivent &#234;tre charg&#233;s en dernier : ils enveloppent les # widgets ZLE d&#233;finis par les plugins pr&#233;c&#233;dents. zdharma-continuum/fast-syntax-highlighting kind:defer zsh-users/zsh-autosuggestions kind:defer zsh-users/zsh-history-substring-search kind:defer &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.config/zellij/config.kdl&lt;/code&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// // THIS FILE WAS AUTOGENERATED BY ZELLIJ, THE PREVIOUS FILE AT THIS LOCATION WAS COPIED TO: /home/bricebou/.config/zellij/config.kdl.bak.1 // keybinds clear-defaults=true { locked { bind &#034;Ctrl g&#034; { SwitchToMode &#034;normal&#034;; } } pane { bind &#034;left&#034; { MoveFocus &#034;left&#034;; } bind &#034;down&#034; { MoveFocus &#034;down&#034;; } bind &#034;up&#034; { MoveFocus &#034;up&#034;; } bind &#034;right&#034; { MoveFocus &#034;right&#034;; } bind &#034;c&#034; { SwitchToMode &#034;renamepane&#034;; PaneNameInput 0; } bind &#034;d&#034; { NewPane &#034;down&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;e&#034; { TogglePaneEmbedOrFloating; SwitchToMode &#034;locked&#034;; } bind &#034;f&#034; { ToggleFocusFullscreen; SwitchToMode &#034;locked&#034;; } bind &#034;h&#034; { MoveFocus &#034;left&#034;; } bind &#034;i&#034; { TogglePanePinned; SwitchToMode &#034;locked&#034;; } bind &#034;j&#034; { MoveFocus &#034;down&#034;; } bind &#034;k&#034; { MoveFocus &#034;up&#034;; } bind &#034;l&#034; { MoveFocus &#034;right&#034;; } bind &#034;n&#034; { NewPane; SwitchToMode &#034;locked&#034;; } bind &#034;p&#034; { SwitchToMode &#034;normal&#034;; } bind &#034;r&#034; { NewPane &#034;right&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;s&#034; { NewPane &#034;stacked&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;w&#034; { ToggleFloatingPanes; SwitchToMode &#034;locked&#034;; } bind &#034;x&#034; { CloseFocus; SwitchToMode &#034;locked&#034;; } bind &#034;z&#034; { TogglePaneFrames; SwitchToMode &#034;locked&#034;; } bind &#034;tab&#034; { SwitchFocus; } } tab { bind &#034;left&#034; { GoToPreviousTab; } bind &#034;down&#034; { GoToNextTab; } bind &#034;up&#034; { GoToPreviousTab; } bind &#034;right&#034; { GoToNextTab; } bind &#034;1&#034; { GoToTab 1; SwitchToMode &#034;locked&#034;; } bind &#034;2&#034; { GoToTab 2; SwitchToMode &#034;locked&#034;; } bind &#034;3&#034; { GoToTab 3; SwitchToMode &#034;locked&#034;; } bind &#034;4&#034; { GoToTab 4; SwitchToMode &#034;locked&#034;; } bind &#034;5&#034; { GoToTab 5; SwitchToMode &#034;locked&#034;; } bind &#034;6&#034; { GoToTab 6; SwitchToMode &#034;locked&#034;; } bind &#034;7&#034; { GoToTab 7; SwitchToMode &#034;locked&#034;; } bind &#034;8&#034; { GoToTab 8; SwitchToMode &#034;locked&#034;; } bind &#034;9&#034; { GoToTab 9; SwitchToMode &#034;locked&#034;; } bind &#034;[&#034; { BreakPaneLeft; SwitchToMode &#034;locked&#034;; } bind &#034;]&#034; { BreakPaneRight; SwitchToMode &#034;locked&#034;; } bind &#034;b&#034; { BreakPane; SwitchToMode &#034;locked&#034;; } bind &#034;h&#034; { GoToPreviousTab; } bind &#034;j&#034; { GoToNextTab; } bind &#034;k&#034; { GoToPreviousTab; } bind &#034;l&#034; { GoToNextTab; } bind &#034;n&#034; { NewTab; SwitchToMode &#034;locked&#034;; } bind &#034;r&#034; { SwitchToMode &#034;renametab&#034;; TabNameInput 0; } bind &#034;s&#034; { ToggleActiveSyncTab; SwitchToMode &#034;locked&#034;; } bind &#034;t&#034; { SwitchToMode &#034;normal&#034;; } bind &#034;x&#034; { CloseTab; SwitchToMode &#034;locked&#034;; } bind &#034;tab&#034; { ToggleTab; } } resize { bind &#034;left&#034; { Resize &#034;Increase left&#034;; } bind &#034;down&#034; { Resize &#034;Increase down&#034;; } bind &#034;up&#034; { Resize &#034;Increase up&#034;; } bind &#034;right&#034; { Resize &#034;Increase right&#034;; } bind &#034;+&#034; { Resize &#034;Increase&#034;; } bind &#034;-&#034; { Resize &#034;Decrease&#034;; } bind &#034;=&#034; { Resize &#034;Increase&#034;; } bind &#034;H&#034; { Resize &#034;Decrease left&#034;; } bind &#034;J&#034; { Resize &#034;Decrease down&#034;; } bind &#034;K&#034; { Resize &#034;Decrease up&#034;; } bind &#034;L&#034; { Resize &#034;Decrease right&#034;; } bind &#034;h&#034; { Resize &#034;Increase left&#034;; } bind &#034;j&#034; { Resize &#034;Increase down&#034;; } bind &#034;k&#034; { Resize &#034;Increase up&#034;; } bind &#034;l&#034; { Resize &#034;Increase right&#034;; } bind &#034;r&#034; { SwitchToMode &#034;normal&#034;; } } move { bind &#034;left&#034; { MovePane &#034;left&#034;; } bind &#034;down&#034; { MovePane &#034;down&#034;; } bind &#034;up&#034; { MovePane &#034;up&#034;; } bind &#034;right&#034; { MovePane &#034;right&#034;; } bind &#034;h&#034; { MovePane &#034;left&#034;; } bind &#034;j&#034; { MovePane &#034;down&#034;; } bind &#034;k&#034; { MovePane &#034;up&#034;; } bind &#034;l&#034; { MovePane &#034;right&#034;; } bind &#034;m&#034; { SwitchToMode &#034;normal&#034;; } bind &#034;n&#034; { MovePane; } bind &#034;p&#034; { MovePaneBackwards; } bind &#034;tab&#034; { MovePane; } } scroll { bind &#034;Alt left&#034; { MoveFocusOrTab &#034;left&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;Alt down&#034; { MoveFocus &#034;down&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;Alt up&#034; { MoveFocus &#034;up&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;Alt right&#034; { MoveFocusOrTab &#034;right&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;e&#034; { EditScrollback; SwitchToMode &#034;locked&#034;; } bind &#034;f&#034; { SwitchToMode &#034;entersearch&#034;; SearchInput 0; } bind &#034;Alt h&#034; { MoveFocusOrTab &#034;left&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;Alt j&#034; { MoveFocus &#034;down&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;Alt k&#034; { MoveFocus &#034;up&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;Alt l&#034; { MoveFocusOrTab &#034;right&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;s&#034; { SwitchToMode &#034;normal&#034;; } } search { bind &#034;c&#034; { SearchToggleOption &#034;CaseSensitivity&#034;; } bind &#034;n&#034; { Search &#034;down&#034;; } bind &#034;o&#034; { SearchToggleOption &#034;WholeWord&#034;; } bind &#034;p&#034; { Search &#034;up&#034;; } bind &#034;w&#034; { SearchToggleOption &#034;Wrap&#034;; } } session { bind &#034;a&#034; { LaunchOrFocusPlugin &#034;zellij:about&#034; { floating true move_to_focused_tab true } SwitchToMode &#034;locked&#034; } bind &#034;c&#034; { LaunchOrFocusPlugin &#034;configuration&#034; { floating true move_to_focused_tab true } SwitchToMode &#034;locked&#034; } bind &#034;d&#034; { Detach; } bind &#034;l&#034; { LaunchOrFocusPlugin &#034;zellij:layout-manager&#034; { floating true move_to_focused_tab true } SwitchToMode &#034;locked&#034; } bind &#034;o&#034; { SwitchToMode &#034;normal&#034;; } bind &#034;p&#034; { LaunchOrFocusPlugin &#034;plugin-manager&#034; { floating true move_to_focused_tab true } SwitchToMode &#034;locked&#034; } bind &#034;s&#034; { LaunchOrFocusPlugin &#034;zellij:share&#034; { floating true move_to_focused_tab true } SwitchToMode &#034;locked&#034; } bind &#034;w&#034; { LaunchOrFocusPlugin &#034;session-manager&#034; { floating true move_to_focused_tab true } SwitchToMode &#034;locked&#034; } } shared_among &#034;normal&#034; &#034;locked&#034; { bind &#034;Alt left&#034; { MoveFocusOrTab &#034;left&#034;; } bind &#034;Alt down&#034; { MoveFocus &#034;down&#034;; } bind &#034;Alt up&#034; { MoveFocus &#034;up&#034;; } bind &#034;Alt right&#034; { MoveFocusOrTab &#034;right&#034;; } bind &#034;Alt +&#034; { Resize &#034;Increase&#034;; } bind &#034;Alt -&#034; { Resize &#034;Decrease&#034;; } bind &#034;Alt =&#034; { Resize &#034;Increase&#034;; } bind &#034;Alt [&#034; { PreviousSwapLayout; } bind &#034;Alt ]&#034; { NextSwapLayout; } bind &#034;Alt f&#034; { ToggleFloatingPanes; } bind &#034;Alt h&#034; { MoveFocusOrTab &#034;left&#034;; } bind &#034;Alt i&#034; { MoveTab &#034;left&#034;; } bind &#034;Alt j&#034; { MoveFocus &#034;down&#034;; } bind &#034;Alt k&#034; { MoveFocus &#034;up&#034;; } bind &#034;Alt l&#034; { MoveFocusOrTab &#034;right&#034;; } bind &#034;Alt n&#034; { NewPane; } bind &#034;Alt o&#034; { MoveTab &#034;right&#034;; } bind &#034;Alt p&#034; { TogglePaneInGroup; } bind &#034;Alt Shift p&#034; { ToggleGroupMarking; } } shared_except &#034;locked&#034; &#034;renametab&#034; &#034;renamepane&#034; { bind &#034;Ctrl g&#034; { SwitchToMode &#034;locked&#034;; } bind &#034;Ctrl q&#034; { Quit; } } shared_except &#034;locked&#034; &#034;entersearch&#034; { bind &#034;enter&#034; { SwitchToMode &#034;locked&#034;; } } shared_except &#034;locked&#034; &#034;entersearch&#034; &#034;renametab&#034; &#034;renamepane&#034; { bind &#034;esc&#034; { SwitchToMode &#034;locked&#034;; } } shared_except &#034;locked&#034; &#034;entersearch&#034; &#034;renametab&#034; &#034;renamepane&#034; &#034;move&#034; { bind &#034;m&#034; { SwitchToMode &#034;move&#034;; } } shared_except &#034;locked&#034; &#034;entersearch&#034; &#034;search&#034; &#034;renametab&#034; &#034;renamepane&#034; &#034;session&#034; { bind &#034;o&#034; { SwitchToMode &#034;session&#034;; } } shared_except &#034;locked&#034; &#034;tab&#034; &#034;entersearch&#034; &#034;renametab&#034; &#034;renamepane&#034; { bind &#034;t&#034; { SwitchToMode &#034;tab&#034;; } } shared_among &#034;normal&#034; &#034;resize&#034; &#034;tab&#034; &#034;scroll&#034; &#034;prompt&#034; &#034;tmux&#034; { bind &#034;p&#034; { SwitchToMode &#034;pane&#034;; } } shared_among &#034;normal&#034; &#034;resize&#034; &#034;search&#034; &#034;move&#034; &#034;prompt&#034; &#034;tmux&#034; { bind &#034;s&#034; { SwitchToMode &#034;scroll&#034;; } } shared_except &#034;locked&#034; &#034;resize&#034; &#034;pane&#034; &#034;tab&#034; &#034;entersearch&#034; &#034;renametab&#034; &#034;renamepane&#034; { bind &#034;r&#034; { SwitchToMode &#034;resize&#034;; } } shared_among &#034;scroll&#034; &#034;search&#034; { bind &#034;PageDown&#034; { PageScrollDown; } bind &#034;PageUp&#034; { PageScrollUp; } bind &#034;left&#034; { PageScrollUp; } bind &#034;down&#034; { ScrollDown; } bind &#034;up&#034; { ScrollUp; } bind &#034;right&#034; { PageScrollDown; } bind &#034;Ctrl b&#034; { PageScrollUp; } bind &#034;Ctrl c&#034; { ScrollToBottom; SwitchToMode &#034;locked&#034;; } bind &#034;d&#034; { HalfPageScrollDown; } bind &#034;Ctrl f&#034; { PageScrollDown; } bind &#034;h&#034; { PageScrollUp; } bind &#034;j&#034; { ScrollDown; } bind &#034;k&#034; { ScrollUp; } bind &#034;l&#034; { PageScrollDown; } bind &#034;u&#034; { HalfPageScrollUp; } } entersearch { bind &#034;Ctrl c&#034; { SwitchToMode &#034;scroll&#034;; } bind &#034;esc&#034; { SwitchToMode &#034;scroll&#034;; } bind &#034;enter&#034; { SwitchToMode &#034;search&#034;; } } renametab { bind &#034;esc&#034; { UndoRenameTab; SwitchToMode &#034;tab&#034;; } } shared_among &#034;renametab&#034; &#034;renamepane&#034; { bind &#034;Ctrl c&#034; { SwitchToMode &#034;locked&#034;; } } renamepane { bind &#034;esc&#034; { UndoRenamePane; SwitchToMode &#034;pane&#034;; } } } // Plugin aliases - can be used to change the implementation of Zellij // changing these requires a restart to take effect plugins { about location=&#034;zellij:about&#034; compact-bar location=&#034;zellij:compact-bar&#034; configuration location=&#034;zellij:configuration&#034; filepicker location=&#034;zellij:strider&#034; { cwd &#034;/&#034; } plugin-manager location=&#034;zellij:plugin-manager&#034; session-manager location=&#034;zellij:session-manager&#034; status-bar location=&#034;zellij:status-bar&#034; strider location=&#034;zellij:strider&#034; tab-bar location=&#034;zellij:tab-bar&#034; welcome-screen location=&#034;zellij:session-manager&#034; { welcome_screen true } } // Plugins to load in the background when a new session starts // eg. &#034;file:/path/to/my-plugin.wasm&#034; // eg. &#034;https://example.com/my-plugin.wasm&#034; load_plugins { zellij:link } web_client { font &#034;monospace&#034; } // Use a simplified UI without special fonts (arrow glyphs) // Options: // - true // - false (Default) // // simplified_ui true // Enable OSC8 hyperlink output // Options: // - true (Default) // - false // // osc8_hyperlinks true // Choose the theme that is specified in the themes section. // Default: default // theme &#034;gruber-darker&#034; // Theme to use when the host terminal reports a dark color palette. // Requires `theme_light` to also be set; otherwise `theme` is used. // // theme_dark &#034;dracula&#034; // Theme to use when the host terminal reports a light color palette. // Requires `theme_dark` to also be set; otherwise `theme` is used. // // theme_light &#034;solarized-light&#034; // Choose the base input mode of zellij. // Default: normal // default_mode &#034;locked&#034; // Choose the path to the default shell that zellij will use for opening new panes // Default: $SHELL // // default_shell &#034;fish&#034; // Choose the path to override cwd that zellij will use for opening new panes // // default_cwd &#034;/tmp&#034; // The name of the default layout to load on startup // Default: &#034;default&#034; // // default_layout &#034;compact&#034; // The folder in which Zellij will look for layouts // (Requires restart) // // layout_dir &#034;/tmp&#034; // The folder in which Zellij will look for themes // (Requires restart) // // theme_dir &#034;/tmp&#034; // Toggle enabling the mouse mode. // On certain configurations, or terminals this could // potentially interfere with copying text. // Options: // - true (default) // - false // // mouse_mode false // Toggle having pane frames around the panes // Options: // - true (default, enabled) // - false // // pane_frames false // When attaching to an existing session with other users, // should the session be mirrored (true) // or should each user have their own cursor (false) // (Requires restart) // Default: false // // mirror_session true // Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP // eg. when terminal window with an active zellij session is closed // (Requires restart) // Options: // - detach (Default) // - quit // on_force_close &#034;quit&#034; // Configure the scroll back buffer size // This is the number of lines zellij stores for each pane in the scroll back // buffer. Excess number of lines are discarded in a FIFO fashion. // (Requires restart) // Valid values: positive integers // Default value: 10000 // // scroll_buffer_size 10000 // Provide a command to execute when copying text. The text will be piped to // the stdin of the program to perform the copy. This can be used with // terminal emulators which do not support the OSC 52 ANSI control sequence // that will be used by default if this option is not set. // Examples: // // copy_command &#034;xclip -selection clipboard&#034; // x11 // copy_command &#034;wl-copy&#034; // wayland // copy_command &#034;pbcopy&#034; // osx // // copy_command &#034;pbcopy&#034; // Choose the destination for copied text // Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. // Does not apply when using copy_command. // Options: // - system (default) // - primary // // copy_clipboard &#034;primary&#034; // Enable automatic copying (and clearing) of selection when releasing mouse // Default: true // // copy_on_select true // Path to the default editor to use to edit pane scrollbuffer // Default: $EDITOR or $VISUAL // scrollback_editor &#034;/usr/bin/vim&#034; // A fixed name to always give the Zellij session. // Consider also setting `attach_to_session true,` // otherwise this will error if such a session exists. // Default: &lt;RANDOM&gt; // // session_name &#034;My singleton session&#034; // When `session_name` is provided, attaches to that session // if it is already running or creates it otherwise. // Default: false // // attach_to_session true // Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible // Options: // - true (default) // - false // // auto_layout false // Whether sessions should be serialized to the cache folder (including their tabs/panes, cwds and running commands) so that they can later be resurrected // Options: // - true (default) // - false // // session_serialization false // Whether pane viewports are serialized along with the session, default is false // Options: // - true // - false (default) // // serialize_pane_viewport false // Scrollback lines to serialize along with the pane viewport when serializing sessions, 0 // defaults to the scrollback size. If this number is higher than the scrollback size, it will // also default to the scrollback size. This does nothing if `serialize_pane_viewport` is not true. // // scrollback_lines_to_serialize 10000 // Enable or disable the rendering of styled and colored underlines (undercurl). // May need to be disabled for certain unsupported terminals // (Requires restart) // Default: true // // styled_underlines false // How often in seconds sessions are serialized // // serialization_interval 10000 // Enable or disable writing of session metadata to disk (if disabled, other sessions might not know // metadata info on this session) // (Requires restart) // Default: false // // disable_session_metadata false // Enable or disable support for the enhanced Kitty Keyboard Protocol (the host terminal must also support it) // (Requires restart) // Default: true (if the host terminal supports it) // support_kitty_keyboard_protocol false // Whether to make sure a local web server is running when a new Zellij session starts. // This web server will allow creating new sessions and attaching to existing ones that have // opted in to being shared in the browser. // When enabled, navigate to http://127.0.0.1:8082 // (Requires restart) // // Note: a local web server can still be manually started from within a Zellij session or from the CLI. // If this is not desired, one can use a version of Zellij compiled without // `web_server_capability` // // Possible values: // - true // - false // Default: false // // web_server false // Whether to allow sessions started in the terminal to be shared through a local web server, assuming one is // running (see the `web_server` option for more details). // (Requires restart) // // Note: This is an administrative separation and not intended as a security measure. // // Possible values: // - &#034;on&#034; (allow web sharing through the local web server if it // is online) // - &#034;off&#034; (do not allow web sharing unless sessions explicitly opt-in to it) // - &#034;disabled&#034; (do not allow web sharing and do not permit sessions started in the terminal to opt-in to it) // Default: &#034;off&#034; // // web_sharing &#034;off&#034; // A path to a certificate file to be used when setting up the web client to serve the // connection over HTTPs // // web_server_cert &#034;/path/to/cert.pem&#034; // A path to a key file to be used when setting up the web client to serve the // connection over HTTPs // // web_server_key &#034;/path/to/key.pem&#034; /// Whether to enforce https connections to the web server when it is bound to localhost /// (127.0.0.0/8) /// /// Note: https is ALWAYS enforced when bound to non-local interfaces /// /// Default: false // // enforce_https_for_localhost false // Whether to stack panes when resizing beyond a certain size // Default: true // // stacked_resize false // Whether to show tips on startup // Default: true // show_startup_tips false // Whether to show release notes on first version run // Default: true // // show_release_notes false // Whether to enable mouse hover effects and pane grouping functionality // default is true // advanced_mouse_actions false // Whether to enable mouse hover visual effects (frame highlight and help text) // default is true // mouse_hover_effects false // Whether to show visual bell indicators (pane/tab frame flash and [!] suffix) // default is true // visual_bell true // Whether to focus panes on mouse hover // default is false // focus_follows_mouse false // Whether clicking a pane to focus it also sends the click into the pane // default is false // mouse_click_through false // The ip address the web server should listen on when it starts // Default: &#034;127.0.0.1&#034; // (Requires restart) // web_server_ip &#034;127.0.0.1&#034; // The port the web server should listen on when it starts // Default: 8082 // (Requires restart) // web_server_port 8082 // A command to run (will be wrapped with sh -c and provided the RESURRECT_COMMAND env variable) // after Zellij attempts to discover a command inside a pane when resurrecting sessions, the STDOUT // of this command will be used instead of the discovered RESURRECT_COMMAND // can be useful for removing wrappers around commands // Note: be sure to escape backslashes and similar characters properly // post_command_discovery_hook &#034;echo $RESURRECT_COMMAND | sed &lt;your_regex_here&gt;&#034; // Number of async worker tasks to spawn per active client. // // Allocating few tasks may result in resource contention and lags. Small values (around 4) should // typically work best. Set to 0 to use the number of (physical) CPU cores. // Note: This only applies to web clients at the moment. // client_async_worker_tasks 4 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.config/alacritty/alacritty.toml&lt;/code&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[font] size=9.5 [terminal.shell] program = &#034;/usr/bin/zellij&#034; args = [&#034;attach&#034;, &#034;-c&#034;, &#034;main&#034;] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>De Oh my ZSH &#224; Antidote &amp; Oh My Posh</title>
		<link>https://www.momh.fr/de-oh-my-zsh-a-antidote-oh-my-posh</link>
		<guid isPermaLink="true">https://www.momh.fr/de-oh-my-zsh-a-antidote-oh-my-posh</guid>
		<dc:date>2026-02-18T19:36:05Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>bricebou@momh.fr</dc:creator>



		<description>
&lt;p&gt;Un l&#233;ger ennui, une petite lassitude, une impression de lourdeur... Et me voil&#224; donc &#224; rechercher des alternatives &#224; Oh My Zsh que j'utilisais depuis quelques temps, &#224; la fois pour g&#233;rer mes plugins et le th&#232;me de prompt que j'utilisais. &lt;br class='autobr' /&gt; Et j'ai donc d&#233;couvert Antidote https://antidote.sh, un gestionnaire de plugins pour &lt;span class=&#034;caps&#034;&gt;ZSH&lt;/span&gt; l&#233;ger et performant ainsi que Oh My Posh https://ohmyposh.dev. &lt;br class='autobr' /&gt;
Antidote &lt;br class='autobr' /&gt;
Antidote is a Zsh plugin manager made from the ground up thinking about performance. It&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Un l&#233;ger ennui, une petite lassitude, une impression de lourdeur... Et me voil&#224; donc &#224; rechercher des alternatives &#224; Oh My Zsh que j'utilisais depuis quelques temps, &#224; la fois pour g&#233;rer mes plugins et le th&#232;me de prompt que j'utilisais.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Et j'ai donc d&#233;couvert Antidote &lt;a href=&#034;https://antidote.sh/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://antidote.sh&lt;/a&gt;, un gestionnaire de plugins pour &lt;span class=&#034;caps&#034;&gt;ZSH&lt;/span&gt; l&#233;ger et performant ainsi que Oh My Posh &lt;a href=&#034;https://ohmyposh.dev/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://ohmyposh.dev&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Antidote&lt;/h2&gt;&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Antidote is a Zsh plugin manager made from the ground up thinking about performance. &lt;br class='autobr' /&gt;
It is fast because it can do things concurrently, and generates an ultra-fast static plugin file that you can easily load from your Zsh config.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;L'installation peut se faire soit via Git&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;shell&#034; class='spip_code spip_code_block language-shell' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;git clone --depth=1 https://github.com/mattmc3/antidote.git ${ZDOTDIR:-~}/.antidote &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;soit via des gestionnaires de paquets, par exemple avec Brew sous MacOS&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;shell&#034; class='spip_code spip_code_block language-shell' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;brew install antidote &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, il faut &#233;diter notre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.zshrc&lt;/code&gt;de la sorte&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# # Lazy-load antidote and generate the static load file only when needed # # Lazy-load antidote and generate the static load file only when needed zsh_plugins=${ZDOTDIR:-$HOME}/.zsh_plugins if [[ ! ${zsh_plugins}.zsh -nt ${zsh_plugins}.txt ]]; then ( source $HOMEBREW_PREFIX/opt/antidote/share/antidote/antidote.zsh antidote bundle &lt;${zsh_plugins}.txt &gt;${zsh_plugins}.zsh ) fi source ${zsh_plugins}.zshfile. source ${zsh_plugins}.zsh &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Les plugins sont list&#233;s dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.zsh_plugins.txt&lt;/code&gt;, par exemple&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# some plugins support deferred loading zdharma-continuum/fast-syntax-highlighting kind:defer zsh-users/zsh-autosuggestions kind:defer zsh-users/zsh-history-substring-search kind:defer &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il est &#233;galement possible d'appeler des plugins en provenance de Oh My Zsh&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# # Using Oh My Zsh plugins # getantidote/use-omz # https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/eza ohmyzsh/ohmyzsh path:plugins/eza # https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/fzf ohmyzsh/ohmyzsh path:plugins/fzf &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Un coup de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;source ~/.zshrc&lt;/code&gt; et votre terminal devrait donc d&#233;sormais b&#233;n&#233;ficier de ces plugins, avec leurs alias respectifs, etc.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Oh My Posh&lt;/h2&gt;&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;The most customizable and fastest prompt engine for any shell.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oh My Posh (&lt;a href=&#034;https://ohmyposh.dev/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://ohmyposh.dev&lt;/a&gt;) permet donc tr&#232;s ais&#233;ment de configurer son prompt .&lt;br class='autobr' /&gt;
Une fois install&#233;, il suffit d'ajouter une ligne &#224; la fin de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.zshrc&lt;/code&gt; afin de le charger&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;eval &#034;$(oh-my-posh init zsh)&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour utiliser un th&#232;me existant (&lt;a href=&#034;https://ohmyposh.dev/docs/themes&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://ohmyposh.dev/docs/themes&lt;/a&gt;), il suffit de le passer en option &#224; la commande ins&#233;r&#233;e pr&#233;c&#233;demment&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; ainsi par exemple&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;eval &#034;$(oh-my-posh init zsh --config 'quick-term')&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bien s&#251;r, il est possible de configurer son propre th&#232;me (&lt;a href=&#034;https://ohmyposh.dev/docs/configuration/general&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://ohmyposh.dev/docs/configuration/general&lt;/a&gt;).&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SPIPer avec DDEV (bis)</title>
		<link>https://www.momh.fr/spiper-avec-ddev-bis</link>
		<guid isPermaLink="true">https://www.momh.fr/spiper-avec-ddev-bis</guid>
		<dc:date>2024-05-21T04:37:58Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>bricebou@momh.fr</dc:creator>


		<dc:subject>&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;</dc:subject>
		<dc:subject>webdev</dc:subject>

		<description>
&lt;p&gt;Si nous parvenions dans notre premier article &#224; obtenir un environnement de d&#233;veloppement sous &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt; rapidement gr&#226;ce &#224; &lt;span class=&#034;caps&#034;&gt;DDEV&lt;/span&gt;, la m&#233;thode propos&#233;e aboutit &#224; rendre probl&#233;matique l'usage de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; en &lt;span class=&#034;caps&#034;&gt;CLI&lt;/span&gt;. La solution, pour ce qui est de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt; en tout cas&#160;: ne plus utiliser le param&#232;tre &#8212;docroot. &lt;br class='autobr' /&gt; Installer une version 4.3 &lt;br class='autobr' /&gt;
On commence par cloner le d&#233;p&#244;t de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;, puis l'on configure notre environnement &lt;span class=&#034;caps&#034;&gt;DDEV&lt;/span&gt; avant d'utiliser la commande checkout pour basculer sur la branche qui nous int&#233;resse&#160;:&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/spip" rel="tag"&gt;&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/webdev" rel="tag"&gt;webdev&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Si nous parvenions &lt;a href='https://www.momh.fr/spiper-avec-ddev' class=&#034;spip_in&#034;&gt;dans notre premier article&lt;/a&gt; &#224; obtenir un environnement de d&#233;veloppement sous &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt; rapidement gr&#226;ce &#224; &lt;span class=&#034;caps&#034;&gt;DDEV&lt;/span&gt;, la m&#233;thode propos&#233;e aboutit &#224; rendre probl&#233;matique l'usage de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; en &lt;span class=&#034;caps&#034;&gt;CLI&lt;/span&gt;. La solution, pour ce qui est de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt; en tout cas&#160;: ne plus utiliser le param&#232;tre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--docroot&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Installer une version 4.3&lt;/h2&gt;
&lt;p&gt;On commence par cloner le d&#233;p&#244;t de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;, puis l'on configure notre environnement &lt;span class=&#034;caps&#034;&gt;DDEV&lt;/span&gt; avant d'utiliser la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;checkout&lt;/code&gt; pour basculer sur la branche qui nous int&#233;resse&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;git clone https://git.spip.net/spip/spip.git spip43 cd spip43 ddev config --project-type=php --php-version=7.4 ddev checkout ddev checkout spip -b4.3 public &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si vous &#234;tes confront&#233; au message suivant&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;fatal: detected dubious ownership in repository at '/var/www/html' To add an exception for this directory, call: git config --global --add safe.directory /var/www/html &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il suffit d'ex&#233;cuter la commande indiqu&#233;e, au sein du container bien &#233;videmment&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;ddev exec git config --global --add safe.directory /var/www/html &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Installer la branche &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;master&lt;/code&gt;&lt;/h2&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;git clone https://git.spip.net/spip/spip.git master cd master ddev config --project-type=php --php-version=8.2 ddev composer install ddev composer local mode-dev rm -rf web/plugins-dist ddev composer local install &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SPIPer avec DDEV</title>
		<link>https://www.momh.fr/spiper-avec-ddev</link>
		<guid isPermaLink="true">https://www.momh.fr/spiper-avec-ddev</guid>
		<dc:date>2024-03-21T12:26:32Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>bricebou@momh.fr</dc:creator>


		<dc:subject>webdev</dc:subject>
		<dc:subject>&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;</dc:subject>

		<description>
&lt;p&gt;&lt;span class=&#034;caps&#034;&gt;DDEV&lt;/span&gt; est, pour le dire vite, une surcouche &#224; Docker permettant de mettre en place extr&#234;mement rapidement des environnements de d&#233;veloppement Web. Nous allons tenter de d&#233;crire ici comment nous l'utilisons pour nos d&#233;veloppements avec &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;. &lt;br class='autobr' /&gt; Je ne vais pas ici d&#233;crire l'installation de &lt;span class=&#034;caps&#034;&gt;DDEV&lt;/span&gt;, sa documentation se suffisant &#224; elle-m&#234;me plus que largement. &lt;br class='autobr' /&gt;
&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli &amp; checkout &lt;br class='autobr' /&gt;
Ces outils en ligne de commande que sont checkout (m&#233;thode unifi&#233;e d'installation et de mise &#224; jour) et &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/webdev" rel="tag"&gt;webdev&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/spip" rel="tag"&gt;&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;&lt;a href=&#034;https://ddev.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span class=&#034;caps&#034;&gt;DDEV&lt;/span&gt;&lt;/a&gt; est, pour le dire vite, une surcouche &#224; Docker permettant de mettre en place extr&#234;mement rapidement des environnements de d&#233;veloppement Web. Nous allons tenter de d&#233;crire ici comment nous l'utilisons pour nos d&#233;veloppements avec &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Je ne vais pas ici d&#233;crire l'installation de &lt;span class=&#034;caps&#034;&gt;DDEV&lt;/span&gt;, &lt;a href=&#034;https://ddev.readthedocs.io/en/stable/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;sa documentation&lt;/a&gt; se suffisant &#224; elle-m&#234;me plus que largement.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli &amp; checkout&lt;/h2&gt;
&lt;p&gt;Ces outils en ligne de commande que sont &lt;a href=&#034;https://git.spip.net/spip-contrib-outils/checkout&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;checkout&lt;/a&gt; (m&#233;thode unifi&#233;e d'installation et de mise &#224; jour) et &lt;a href=&#034;https://git.spip.net/spip-contrib-outils/spip-cli&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli&lt;/a&gt; (installation, mise &#224; jour, manipulation...) m'apparaissent comme indispensables&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; un grand merci &#224; nicod donc pour en proposer &lt;a href=&#034;https://git.spip.net/spip-contrib-outils/ddev&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;une int&#233;gration &#224; &lt;span class=&#034;caps&#034;&gt;DDEV&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Personnellement, j'ai commenc&#233; par cloner le d&#233;p&#244;t dans un r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/sources&lt;/code&gt; avant de cr&#233;er un lien (non symbolique) pour chacun des deux scripts vers le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.ddev/commands/web/&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;p&gt;Ainsi, pour chacun de nos projets, ces deux commandes seront accessibles une fois le conteneur web lanc&#233; (seul b&#233;mol, il conviendra de r&#233;installer les utilitaires &#224; chaque red&#233;marrage, mais les scripts propos&#233;s par nicod s'en charge tr&#232;s bien).&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installer &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt; dans un environnement &lt;span class=&#034;caps&#034;&gt;DDEV&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Avant d'installer &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;, il convient de pr&#233;parer notre environnement de d&#233;veloppement&#160;: cr&#233;ation d'un r&#233;pertoire, configuration du projet et initialisation&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;shell&#034; class='spip_code spip_code_block language-shell' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mkdir mon_site &amp;&amp; cd mon_site ddev config --project-type=php --webserver-type=apache-fpm --docroot=web --composer-root=web ddev start &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois cela fait, on peut proc&#233;der &#224; l'installation de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt; (sur sa branche master ici) avec &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli (il convient de lancer la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip&lt;/code&gt; une premi&#232;re fois pour proc&#233;der &#224; son installation)&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;ddev spip ddev spip dl git -b master -d web &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L&#224;, on tombe sur ce message, auquel il faut r&#233;pondre par l'affirmative&#160;:&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Le r&#233;pertoire existant web a &#233;t&#233; renomm&#233; en web__OLD. Souhaitez vous le supprimer&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;? (yes/no) [yes]&#160;:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Puis, on peut poursuivre l'installation, comme indiqu&#233; dans le &lt;span class=&#034;caps&#034;&gt;README&lt;/span&gt; de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;, en prenant bien soin de faire pr&#233;c&#233;der certaines commandes de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ddev&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;ddev composer install ddev composer local mode-dev rm -rf web/plugins-dist ddev composer local install &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enfin, il suffit de proc&#233;der &#224; l'installation de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;, en utilisant les informations de connexion &#224; la base de donn&#233;es retourn&#233;es par la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;describe&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;ddev describe &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Eclipse&#160;: bulles contextuelles hors de l'&#233;cran</title>
		<link>https://www.momh.fr/eclipse-bulles-contextuelles-hors-de-l-ecran</link>
		<guid isPermaLink="true">https://www.momh.fr/eclipse-bulles-contextuelles-hors-de-l-ecran</guid>
		<dc:date>2022-10-12T12:13:35Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Linux</dc:subject>

		<description>
&lt;p&gt;Sous Gnome Shell dans sa version 42, sous Wayland, les bulles contextuelles d'Eclipse affichant la JavaDoc associ&#233;e aux m&#233;thodes sugg&#233;r&#233;es lors de la saisie d&#233;passent de l'&#233;cran... &lt;br class='autobr' /&gt; La chose n'est pas extr&#234;mement simple &#224; d&#233;crire et les recherches sont de fait relativement d&#233;licates &#224; mener... Plut&#244;t qu'un long discours, voici une capture d'&#233;cran pr&#233;sentant le souci&#160;: &lt;br class='autobr' /&gt;
Retrouver un Eclipse utilisable &lt;br class='autobr' /&gt;
Je ne saurais expliquer trop pr&#233;cis&#233;ment mais la solution consiste &#224; lancer Eclipse en&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Sous Gnome Shell dans sa version 42, sous Wayland, les bulles contextuelles d'Eclipse affichant la JavaDoc associ&#233;e aux m&#233;thodes sugg&#233;r&#233;es lors de la saisie d&#233;passent de l'&#233;cran...&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;La chose n'est pas extr&#234;mement simple &#224; d&#233;crire et les recherches sont de fait relativement d&#233;licates &#224; mener... Plut&#244;t qu'un long discours, voici une capture d'&#233;cran pr&#233;sentant le souci&#160;:&lt;/p&gt;
&lt;div class='spip_document_116 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;22&#034; data-legende-lenx=&#034;&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.momh.fr/IMG/png/eclipse_wayland.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.momh.fr/local/cache-vignettes/L500xH269/eclipse_wayland-6a06e.png?1788280308' width='500' height='269' alt='La bulle de JavaDoc d'Eclipse sous Wayland d&#233;borde de l'&#233;cran.' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre '&gt;&lt;strong&gt;Eclipse sous Wayland
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Retrouver un Eclipse utilisable&lt;/h2&gt;
&lt;p&gt;Je ne saurais expliquer trop pr&#233;cis&#233;ment mais la solution consiste &#224; lancer Eclipse en utilisant X11 comme backend&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; dans un terminal, il suffit de lancer la commande suivante&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;export GDK_BACKEND=x11; eclipse &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et vous devriez alors non seulement retrouver vos bulles contextuelles correctement positionn&#233;es mais aussi pouvoir utiliser v&#233;ritablement les fen&#234;tres de cr&#233;ation de projet, de g&#233;n&#233;ration de constructeurs ou d'accesseurs... puisqu'elles prennent alors toute la hauteur de l'&#233;cran et n'en d&#233;bordent pas. Ce qu'illustrent les deux captures ci-dessous.&lt;/p&gt;
&lt;div class='spip_document_115 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;32&#034; data-legende-lenx=&#034;x&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.momh.fr/IMG/png/eclipse_x11.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.momh.fr/local/cache-vignettes/L500xH281/eclipse_x11-940e9.png?1788280308' width='500' height='281' alt='Les bulles contextuelles sont alors correctement positionn&#233;es dans la fen&#234;tre et ne d&#233;bordent plus de l'&#233;cran.' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre '&gt;&lt;strong&gt;Eclipse avec X11 comme backend
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&#8203;&lt;/p&gt;
&lt;div class='spip_document_117 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;44&#034; data-legende-lenx=&#034;x&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.momh.fr/IMG/png/eclipse_project.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.momh.fr/local/cache-vignettes/L500xH281/eclipse_project-6d7cc.png?1788280308' width='500' height='281' alt='Avec le backend GTK X11, la fen&#234;tre appara&#238;t dans toute sa hauteur, les boutons d'actions sont visibles et utilisables.' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre '&gt;&lt;strong&gt;Fen&#234;tre de cr&#233;ation de projet sous Eclipse
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Lanceur&lt;/h2&gt;
&lt;p&gt;&#8203;&lt;br class='autobr' /&gt;
J'avais install&#233; Eclipse via Snap&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; pour modifier le lanceur, il convient tout d'abord de copier le lanceur original dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.local/share/applications&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo cp /var/lib/snapd/desktop/applications/eclipse_eclipse.desktop ~/.local/share/applications &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et de modifier la ligne Exec de ce nouveau fichier, afin qu'il ressemble au final &#224; ceci&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[Desktop Entry] X-SnapInstanceName=eclipse Version=1.0 Type=Application Name=Eclipse (X11) Icon=/snap/eclipse/61/icon.xpm Exec=env GDK_BACKEND=x11 /snap/bin/eclipse %f Comment=Eclipse IDE Categories=Development;IDE; Terminal=false StartupWMClass=eclipse &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#8203;&lt;br class='autobr' /&gt;
Il se peut que vous ayez &#224; fermer et r&#233;ouvrir votre session pour que le lanceur soit mis &#224; jour.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Installer Microsoft SQL Server sur Ubuntu 22.04</title>
		<link>https://www.momh.fr/installer-microsoft-sql-server-sur-ubuntu-22-04</link>
		<guid isPermaLink="true">https://www.momh.fr/installer-microsoft-sql-server-sur-ubuntu-22-04</guid>
		<dc:date>2022-09-23T09:42:49Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Ubuntu</dc:subject>

		<description>
&lt;p&gt;Dans le cadre de ma formation de Concepteur d&#233;veloppeur d'application aupr&#232;s de &lt;span class=&#034;caps&#034;&gt;ENI&lt;/span&gt; &#201;cole, je vais &#234;te amen&#233; &#224; &#233;tudier le &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; et &#224; le mettre en pratique sous Microsoft &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; Server. &lt;br class='autobr' /&gt; Microsoft fournit un paquet mssql-server pour Ubuntu 20.04 ainsi qu'une documentation bien faite concernant son installation et les premiers pas sous &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; Server. Cependant, l'installation sous Ubuntu 22.04 se heurte &#224; diff&#233;rents soucis... &lt;br class='autobr' /&gt; Signature du d&#233;p&#244;t &lt;br class='autobr' /&gt;
Pour &#233;viter d'avoir un avertissement concernant&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/ubuntu" rel="tag"&gt;Ubuntu&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Dans le cadre de ma formation de Concepteur d&#233;veloppeur d'application aupr&#232;s de &lt;span class=&#034;caps&#034;&gt;ENI&lt;/span&gt; &#201;cole, je vais &#234;te amen&#233; &#224; &#233;tudier le &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; et &#224; le mettre en pratique sous Microsoft &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; Server.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Microsoft fournit un paquet &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mssql-server&lt;/code&gt; pour Ubuntu 20.04 ainsi qu'&lt;a href=&#034;https://learn.microsoft.com/fr-fr/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-ver15&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;une documentation&lt;/a&gt; bien faite concernant son installation et les premiers pas sous &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; Server. Cependant, l'installation sous Ubuntu 22.04 se heurte &#224; diff&#233;rents soucis...&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt; Signature du d&#233;p&#244;t &lt;/h2&gt;
&lt;p&gt;Pour &#233;viter d'avoir un avertissement concernant l'utilisation de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;apt-key&lt;/code&gt;, il convient de proc&#233;der diff&#233;remment pour importer la cl&#233; du d&#233;p&#244;t. On commence par t&#233;l&#233;charger la cl&#233; fournie, avant de la convertir et de la conserver dans le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/usr/share/keyrings/&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;wget https://packages.microsoft.com/keys/microsoft.asc gpg --dearmor microsoft.asc mv microsoft.asc.gpg /usr/share/keyrings/microsoft.gpg rm microsoft.asc &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, la d&#233;claration du d&#233;p&#244;t diff&#232;re quelque peu&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; dans un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/apt/sources.list.d/mssql-20_04.list&lt;/code&gt;, il convient de lui pr&#233;ciser la cl&#233; &#224; utiliser&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-mssql.gpg] https://packages.microsoft.com/ubuntu/20.04/mssql-server-2019 focal main &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;libldap&lt;/h2&gt;
&lt;p&gt;Le premier souci provient d'une d&#233;pendance &#224; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;libldap&lt;/code&gt; dans sa version 2.4, alors qu'Ubuntu 22.04 ne propose plus que la version 2.5.&lt;/p&gt;
&lt;p&gt;La solution est alors de t&#233;l&#233;charger le paquet d'une version d'Ubuntu pr&#233;c&#233;dente depuis le site &lt;a href=&#034;https://packages.ubuntu.com/focal/libldap-2.4-2&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ubuntu packages&lt;/a&gt; puis de l'installer (la commande ci-dessous peut &#234;tre diff&#233;rente, notamment en cas d'architecture autre que amd64)&#160;:&lt;br class='autobr' /&gt;
&#8203;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt install ./T&#233;l&#233;chargements/libldap-2.4-2_2.4.49+dfsg-2ubuntu1.9_amd64.deb &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le paquet &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mssql-server&lt;/code&gt; devrait d&#233;sormais s'installer sans autre probl&#232;me.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;libcrypto.so &amp; libssl.so&lt;/h2&gt;
&lt;p&gt;Lors de l'installation &#224; proprement parler de &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; Server avec la commande&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo /opt/mssql/bin/mssql-conf setup &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#8203;on se heurte &#224; une erreur puisqu'il ne trouve pas ces deux biblioth&#232;ques &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;libcrypto.so&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;libssl.so&lt;/code&gt; dans le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/opt/mssql/lib/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La solution que j'ai retenue dans mon cas, parmi celles propos&#233;es sur &lt;a href=&#034;https://learn.microsoft.com/en-us/answers/questions/849599/microsoft-sql-is-not-working-on-ubuntu-2204.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ce sujet du forum de learn.microsoft.com&lt;/a&gt;, est d'utiliser celles fournies par les Snap &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;core20&lt;/code&gt; et de cr&#233;er des liens symboliques&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; dans mon cas&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo ln -s /snap/core20/1587/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 libcrypto.so sudo ln -s /snap/core20/1587/usr/lib/x86_64-linux-gnu/libssl.so.1.1 libssl.so &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il suffit de relancer alors l'installation&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo /opt/mssql/bin/mssql-conf setup &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et ce devrait &#234;tre bon&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;!&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Outils en ligne de commande&lt;/h2&gt;
&lt;p&gt;Microsoft propose deux outils en ligne de commande pour interagir avec &lt;span class=&#034;caps&#034;&gt;SQL&lt;/span&gt; Server&#160;: &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sqlcmd&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;bcp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour les installer, il convient de d&#233;finir un nouveau d&#233;p&#244;t, mettons dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/apt/sources.list.d/msprod.list&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-mssql.gpg] https://packages.microsoft.com/ubuntu/20.04/prod focal main &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt update sudo apt install mssql-tools unixodbc-dev &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Plut&#244;t que d'ajouter le r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/opt/mssql-tools/bin&lt;/code&gt; &#224; mon $&lt;span class=&#034;caps&#034;&gt;PATH&lt;/span&gt;, j'ai choisi de me cr&#233;er deux alias.&lt;/p&gt;
&lt;p&gt;Mais l'on peut aussi utiliser l'outil &lt;a href=&#034;https://learn.microsoft.com/en-us/sql/azure-data-studio/download-azure-data-studio?view=sql-server-ver15&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Azure Data Studio&lt;/a&gt; disponible &#233;galement sous Ubuntu.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SPIP-Cli sur serveur mutualis&#233;</title>
		<link>https://www.momh.fr/spip-cli-sur-serveur-mutualise</link>
		<guid isPermaLink="true">https://www.momh.fr/spip-cli-sur-serveur-mutualise</guid>
		<dc:date>2022-04-27T16:24:45Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;</dc:subject>
		<dc:subject>webdev</dc:subject>

		<description>
&lt;p&gt;&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli est &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;une interface en ligne de commande pour &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187;. Sa documentation nous guide parfaitement pour une installation avec un acc&#232;s root ou sudo. Sur un h&#233;bergement mutualis&#233;, avec a minima un acc&#232;s &lt;span class=&#034;caps&#034;&gt;SSH&lt;/span&gt; relativement ouvert, il faut adapter la proc&#233;dure. &lt;br class='autobr' /&gt; Une fois connect&#233; via &lt;span class=&#034;caps&#034;&gt;SSH&lt;/span&gt; &#224; votre serveur, il convient tout d'abord de cr&#233;er un r&#233;pertoire&#160;/.local/bin&#160;: mkdir -p&#160;/.local/bin &lt;br class='autobr' /&gt;
Ensuite, dans ce r&#233;pertoire, on clone le d&#233;p&#244;t de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli et on lance l'installation avec composer&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/spip" rel="tag"&gt;&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/webdev" rel="tag"&gt;webdev&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli est &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&lt;i&gt;une interface en ligne de commande pour &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;&lt;/i&gt;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187;. Sa &lt;a href=&#034;https://contrib.spip.net/SPIP-Cli&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;documentation&lt;/a&gt; nous guide parfaitement pour une installation avec un acc&#232;s root ou sudo. Sur un h&#233;bergement mutualis&#233;, avec a minima un acc&#232;s &lt;span class=&#034;caps&#034;&gt;SSH&lt;/span&gt; relativement ouvert, il faut adapter la proc&#233;dure.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Une fois connect&#233; via &lt;span class=&#034;caps&#034;&gt;SSH&lt;/span&gt; &#224; votre serveur, il convient tout d'abord de cr&#233;er un r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.local/bin&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mkdir -p ~/.local/bin &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, dans ce r&#233;pertoire, on clone le d&#233;p&#244;t de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;-Cli et on lance l'installation avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;composer&lt;/code&gt; (chez alwaysdata, il faut utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;composer2&lt;/code&gt;)&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;cd ~/.local/bin/ git clone https://git.spip.net/spip-contrib-outils/spip-cli.git cd spip-cli/ composer install &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, ne nous reste plus qu'&#224; cr&#233;er un lien symbolique afin de faciliter l'usage de la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;spip&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;ln -s /home/$USER/.local/bin/spip-cli/bin/spip /home/$USER/.local/bin/ &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour ce qui est de l'autocompl&#233;tion, il suffit d'&#233;diter le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.profile&lt;/code&gt; ainsi&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;source ~/.local/bin/spip-cli/bin/spip_console_autocomplete &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois Bash relanc&#233;, la commande devrait &#234;tre disponible et l'autompl&#233;tion de ses options fonctionner.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Installer &#171;&#160;globalement&#160;&#187; PHP_CodeSniffer </title>
		<link>https://www.momh.fr/installer-globalement-php_codesniffer</link>
		<guid isPermaLink="true">https://www.momh.fr/installer-globalement-php_codesniffer</guid>
		<dc:date>2022-04-26T20:05:01Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>webdev</dc:subject>

		<description>
&lt;p&gt;PHP_CodeSniffer est un outil de contr&#244;le de votre code &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; afin d'en garantir la conformit&#233; au standard de votre choix. Plut&#244;t que de l'installer dans chacun de vos projets, il est possible de l'installer &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;globalement&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; et de le configurer pour permettre d'autres standards que ceux fournis de base, ceux de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt; par exemple. &lt;br class='autobr' /&gt; Pr&#233;alables &lt;br class='autobr' /&gt;
Si vous n'avez pas de r&#233;pertoire&#160;/bin/ dans votre /home, on commence par le cr&#233;er&#160;: bash mkdir&#160;/bin &lt;br class='autobr' /&gt;
Puis, on installe composer de fa&#231;on &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;globale&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187;&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/webdev" rel="tag"&gt;webdev&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;PHP_CodeSniffer est un outil de contr&#244;le de votre code &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; afin d'en garantir la conformit&#233; au standard de votre choix.&lt;br class='autobr' /&gt;
Plut&#244;t que de l'installer dans chacun de vos projets, il est possible de l'installer &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;globalement&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; et de le configurer pour permettre d'autres standards que ceux fournis de base, ceux de &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt; par exemple.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;alables&lt;/h2&gt;
&lt;p&gt;Si vous n'avez pas de r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/bin/&lt;/code&gt; dans votre /home, on commence par le cr&#233;er&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mkdir ~/bin &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis, on installe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;composer&lt;/code&gt; de fa&#231;on &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;globale&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; dans ce r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/bin&lt;/code&gt; qui se trouve dans notre $&lt;span class=&#034;caps&#034;&gt;PATH&lt;/span&gt;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; on commence par suivre les instructions de la documentation de &lt;a href=&#034;https://getcomposer.org/download/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Composer&lt;/a&gt; mais la troisi&#232;me commande devient&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;php composer-setup.php --install-dir=~/bin --filename=composer &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Installation de PHP_CodeSniffer&lt;/h2&gt;
&lt;p&gt;Une fois cela fait, on peut installer &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;globalement&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; PHP_CodeSniffer&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;composer global require squizlabs/php_codesniffer composer global require spip/coding-standards &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Par d&#233;faut, chez moi, on retrouve les packages dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.config/composer/vendor/&lt;/code&gt; et les ex&#233;cutables dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.config/composer/vendor/bin/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ne nous reste plus qu'&#224; cr&#233;er des liens symboliques dans notre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/bin/&lt;/code&gt; des ex&#233;cutables de PHP_CodeSniffer&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;ln -s ~/.config/composer/vendor/bin/phpcs ~/bin ln -s ~/.config/composer/vendor/bin/phpcbf ~/bin &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On relance Bash et on peut alors d&#233;clarer le r&#233;pertoire des standards &lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt; &#224; PHP_CodeSniffer&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;phpcs --config-set installed_paths /home/$USER/.config/composer/vendor/spip/coding-standards/src/,/home/$USER/.config/composer/vendor/phpcompatibility/php-compatibility &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vous pouvez v&#233;rifier que la configuration est bien correcte en &#233;ditant le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.config/composer/vendor/squizlabs/php_codesniffer/CodeSniffer.conf&lt;/code&gt;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Utilisation&lt;/h2&gt;
&lt;p&gt;Il est alors possible de lancer les commandes &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;phpcs&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;phpcbf&lt;/code&gt; o&#249; que vous soyez.&lt;br class='autobr' /&gt;
Il peut alors &#234;tre int&#233;ressant de profiter d'une configuration locale, propre &#224; votre projet&#160;: cela se passe dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;phpcs.xml&lt;/code&gt; plac&#233; &#224; la racine de votre projet&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;xml&#034; class='spip_code spip_code_block language-xml' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;?xml version=&#034;1.0&#034;?&gt; &lt;ruleset&gt; &lt;file&gt;./&lt;/file&gt; &lt;exclude-pattern&gt;**/*.js&lt;/exclude-pattern&gt; &lt;exclude-pattern&gt;**/*.css&lt;/exclude-pattern&gt; &lt;exclude-pattern&gt;**/*.scss&lt;/exclude-pattern&gt; &lt;exclude-pattern&gt;node_modules/*&lt;/exclude-pattern&gt; &lt;exclude-pattern&gt;vendor/*&lt;/exclude-pattern&gt; &lt;arg name=&#034;colors&#034;/&gt; &lt;rule ref=&#034;SPIP40&#034;/&gt; &lt;/ruleset&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour d&#233;couvrir plus pr&#233;cis&#233;ment les possibilit&#233;s de configuration, je vous laisse consulter le fichier &lt;a href=&#034;https://github.com/squizlabs/PHP_CodeSniffer/blob/master/phpcs.xml.dist&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;phpcs.xml.dist&lt;/code&gt;&lt;/a&gt; de PHP_CodeSniffer.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Optimisation des images sous SPIP</title>
		<link>https://www.momh.fr/optimisation-des-images-sous-spip</link>
		<guid isPermaLink="true">https://www.momh.fr/optimisation-des-images-sous-spip</guid>
		<dc:date>2022-04-01T08:20:50Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;</dc:subject>

		<description>
&lt;p&gt;Travaillant sur divers sites pr&#233;sentant de nombreux visuels bien souvent extr&#234;mement lourds, je cherchais un moyen d'optimiser ces images afin d'am&#233;liorer les &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;performances&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; de ces sites. &lt;br class='autobr' /&gt; Apr&#232;s une recherche rapide sur contrib.spip.net et sur plugins.spip.net, je n'ai pas trouv&#233; mon bonheur et ai donc d&#233;velopp&#233; un petit plugin, Images optimis&#233;es (optimages), en me basant sur le package image-optimizer propos&#233; par Spatie. &lt;br class='autobr' /&gt;
Le plugin Images optimis&#233;es est installable via &lt;span class=&#034;caps&#034;&gt;SVP&lt;/span&gt; puisque&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/spip" rel="tag"&gt;&lt;span class=&#034;caps&#034;&gt;SPIP&lt;/span&gt;&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Travaillant sur divers sites pr&#233;sentant de nombreux visuels bien souvent extr&#234;mement lourds, je cherchais un moyen d'optimiser ces images afin d'am&#233;liorer les &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;performances&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; de ces sites.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Apr&#232;s une recherche rapide sur &lt;a href=&#034;https://contrib.spip.net/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;contrib.spip.net&lt;/a&gt; et sur &lt;a href=&#034;https://plugins.spip.net/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;plugins.spip.net&lt;/a&gt;, je n'ai pas trouv&#233; mon bonheur&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb1&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;Il s'av&#232;re qu'il existe le plugin SmushIt au fonctionnement quelque peu (&#8230;)&#034; id=&#034;nh1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt; et ai donc d&#233;velopp&#233; un petit plugin, Images optimis&#233;es (optimages), en me basant sur le &lt;a href=&#034;https://github.com/spatie/image-optimizer&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;package image-optimizer propos&#233; par Spatie&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le plugin Images optimis&#233;es est installable via &lt;span class=&#034;caps&#034;&gt;SVP&lt;/span&gt; puisque disponible sur &lt;a href=&#034;https://plugins.spip.net/optimages.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;plugins.spip.net&lt;/a&gt; ou via &lt;a href=&#034;https://git.spip.net/spip-contrib-extensions/optimages.git&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Git&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le fonctionnement de ce plugin se veut tr&#232;s simple&#160;: si leur format est compatible (en l'&#233;tat &lt;span class=&#034;caps&#034;&gt;JPEG&lt;/span&gt;, &lt;span class=&#034;caps&#034;&gt;PNG&lt;/span&gt; et &lt;span class=&#034;caps&#034;&gt;GIF&lt;/span&gt; bien que la librairie prenne &#233;galement en charge les &lt;span class=&#034;caps&#034;&gt;SVG&lt;/span&gt; ou &lt;span class=&#034;caps&#034;&gt;WEBP&lt;/span&gt;), les images sont compress&#233;es d&#232;s leur t&#233;l&#233;versement gr&#226;ce aux utilitaires &lt;i&gt;jpegoptim&lt;/i&gt;, &lt;i&gt;pngquant&lt;/i&gt; et &lt;i&gt;optipng&lt;/i&gt;, ou enfin &lt;i&gt;gifsicle&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Le plugin fournit une interface de configuration permettant de modifier, s'il d&#233;tecte les binaires de ces utilitaires, les arguments pass&#233;s &#224; ceux-ci (par d&#233;faut, ce sont les valeurs utilis&#233;es par la librairie image-optimizer).&lt;/p&gt;
&lt;p&gt;En l'&#233;tat, sur un &#233;chantillon loin d'&#234;tre repr&#233;sentatif, nous obtenons des r&#233;sultats de l'ordre de 60% de r&#233;duction du poids des &lt;span class=&#034;caps&#034;&gt;PNG&lt;/span&gt; et de 40 &#224; 50% pour les &lt;span class=&#034;caps&#034;&gt;JPEG&lt;/span&gt;.&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id=&#034;nb1&#034;&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh1&#034; class=&#034;spip_note&#034; title=&#034;Notes 1&#034; rev=&#034;appendix&#034;&gt;1&lt;/a&gt;] &lt;/span&gt;Il s'av&#232;re qu'il existe le plugin SmushIt au fonctionnement quelque peu diff&#233;rent, puisqu'il n'agit pas sur les images lors de leur t&#233;l&#233;verserment mais seulement lors de leur affichage.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Faire cohabiter plusieurs versions de PHP sous Debian</title>
		<link>https://www.momh.fr/faire-cohabiter-plusieurs-versions-de-php-sous-debian</link>
		<guid isPermaLink="true">https://www.momh.fr/faire-cohabiter-plusieurs-versions-de-php-sous-debian</guid>
		<dc:date>2022-03-12T17:58:39Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Linux</dc:subject>
		<dc:subject>webdev</dc:subject>

		<description>
&lt;p&gt;Surtout par curiosit&#233;, je me suis pench&#233; sur la possibilit&#233; de faire cohabiter plusieurs versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; sur ma Debian Bullseye et surtout sur la fa&#231;on de basculer ais&#233;ment de l'une &#224; l'autre. &lt;br class='autobr' /&gt; Installation &lt;br class='autobr' /&gt;
Pour installer plusieurs versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; conjointement, il faut ajouter le d&#233;p&#244;t Sury&#160;: bash sudo apt update sudo apt -y install apt-transport-https lsb-release ca-certificates curl sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg sudo sh&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/webdev" rel="tag"&gt;webdev&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Surtout par curiosit&#233;, je me suis pench&#233; sur la possibilit&#233; de faire cohabiter plusieurs versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; sur ma Debian Bullseye et surtout sur la fa&#231;on de basculer ais&#233;ment de l'une &#224; l'autre.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Installation&lt;/h2&gt;
&lt;p&gt;Pour installer plusieurs versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; conjointement, il faut ajouter &lt;a href=&#034;https://deb.sury.org/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;le d&#233;p&#244;t Sury&lt;/a&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt update sudo apt -y install apt-transport-https lsb-release ca-certificates curl sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg sudo sh -c 'echo &#034;deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main&#034; &gt; /etc/apt/sources.list.d/php.list' sudo apt update &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;De l&#224;, il est possible d'installer diverses versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; et de ses modules&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; ainsi, sous Bullseye, je me vois proposer les versions 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0 et 8.1&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;apt search php | grep &#034;php[0-9]\.[0-9]/&#034; [...] php5.6/bullseye 5.6.40-57+0~20211119.60+debian11~1.gbp8a9bd1 all php7.0/bullseye 7.0.33-57+0~20211119.61+debian11~1.gbp5d8ba5 all php7.1/bullseye 7.1.33-44+0~20211119.61+debian11~1.gbp448fbe all php7.2/bullseye 7.2.34-28+0~20211119.67+debian11~1.gbpf24e81 all php7.3/bullseye 7.3.33-1+0~20211119.91+debian11~1.gbp618351 all php7.4/stable-security,now 7.4.28-1+deb11u1 all [install&#233;, pouvant &#234;tre supprim&#233; automatiquement] php8.0/bullseye 8.0.16-1+0~20220221.30+debian11~1.gbp8b91a5 all php8.1/bullseye,now 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 all [install&#233;, automatique] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Changer facilement de version de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Afin de faciliter le basculement d'une version &#224; une autre, j'ai compil&#233; diff&#233;rentes sources pour finalement produire un petit script, tr&#232;s certainement imparfait, qui permet de choisir de mani&#232;re interactive parmi les versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; install&#233;es celle &#224; utiliser.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;touch ~/bin/php-switch chmod +x ~/bin/php-switch nano ~/bin/php-switch &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#!/bin/bash # based on https://askubuntu.com/a/883140 # and on https://stackoverflow.com/a/68905711 # D&#233;terminer la version de PHP actuellement utilis&#233;e par Apache VAR=$(ls /etc/apache2/mods-enabled/php*) IFS=' ' read -r -a array &lt;&lt;&lt; &#034;$VAR&#034; array[0]=${array[0]#*php} array[0]=${array[0]%.conf} OLDVERSION=${array[0]} echo &#034;La version de PHP actuellement utilis&#233;e est la&#034; $OLDVERSION. echo &#034;Liste des versions de PHP disponibles :&#034; # Lister les versions de PHP install&#233;es RAWPOSSIBILITIES=$(update-alternatives --list php | sed 's/.*\(...\)/\1/') POSSIBILITIES=($RAWPOSSIBILITIES) # Demander la version de PHP &#224; activer PS3='Choisissez la version de PHP &#224; activer : ' select opt in &#034;${POSSIBILITIES[@]}&#034; &#034;Annuler&#034;; do case &#034;$REPLY&#034; in $((${#POSSIBILITIES[@]}+1))) echo &#034;Salut!&#034;; exit;; esac [ $REPLY -gt $((${#POSSIBILITIES[@]}+1)) -o $REPLY -lt 1 ] &amp;&amp; echo &#034;Choix invalide&#034; || break done echo &#034;Activer la version ${POSSIBILITIES[(($REPLY-1))]} ? Entr&#233;e pour valider, Ctrl-C pour annuler.&#034; read x # On reconfigure Apache sudo a2dismod php${OLDVERSION} sudo a2enmod php${POSSIBILITIES[(($REPLY-1))]} # On met &#224; jour la version par d&#233;faut sudo update-alternatives --set php /usr/bin/php${POSSIBILITIES[(($REPLY-1))]} sudo update-alternatives --set phar /usr/bin/phar${POSSIBILITIES[(($REPLY-1))]} sudo update-alternatives --set phar.phar /usr/bin/phar.phar${POSSIBILITIES[(($REPLY-1))]} # On relance le service Apache sudo systemctl restart apache2 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#8203;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
