volted.net

A blog about being free, as in free speech

Afficher le virtualenv Python dans son prompt ZSH

08 décembre, 2018 — sogal

Voici une petite astuce bien pratique lorsqu'on utilise des virtualenv Python. C'est quand même assez pratique, quand on a plusieurs terminaux ouverts, de savoir si oui ou non on se trouve dans un virtualenv et si oui, lequel. Ça peut éviter des bêtises aussi.

Pour ce faire, j'ai ajouter les éléments suivants à mon $HOME/.zshrc:

function virtualenv_info () {
    [ $VIRTUAL_ENV ] && echo "($(basename $VIRTUAL_ENV)) "
}

export VIRTUAL_ENV_DISABLE_PROMPT=0

Puis dans mon prompt, j'ai ajouté $(virtualenv_info) comme suit:

LPROMPT='$(virtualenv_info)$(pwd_icon) %F{yellow}%2c%f %F{magenta}❱%f '

Ce qui donne, dans mon prompt complet:

ZSH virtualenv

Tags: terminal, tips

Un .vimrc remis au propre

02 décembre, 2018 — sogal

Les utilisateurs de Vim seront possiblement intéressés, les autres pourraient avoir envie de s'y mettre. J'ai mis au propre et à jour ma configuration de Vim (~/.vimrc), après notamment des ajouts de plugins et d'une configuration en mode "IDE pour Python", langage que je me suis mis en tête d'apprendre. Je le partage donc sur le blog en espérant que ça puisse être utile et en guise d'archive personnelle :

" | ---------------------------------------------------------------------------
" | File    : ~/.vimrc
" | By      : sogal
" | ---------------------------------------------------------------------------

" GENERAL OPTIONS :
" -----------------------------------------------------------------------------
set nocompatible     " Ne pas assurer la compatibilité avec l'ancien Vi
set encoding=utf8    " Encodage en utf-8
set mouse=a          " Sélection à la souris
set history=50       " Nombre de commandes dans l'historique

" Montrer les tabulations, espaces insécables et de fin (eol:¶)
set list listchars=nbsp:¤,tab:··,trail:¤,extends:▶,precedes:◀

set viminfo='20,\"50 " Options du fichier ~/.viminfo
set backspace=2      " Active la touche Backspace
set wrap
" Wrappe et justifie à 79 caractères avec la touche '@'
map @ {v}! par 79j
" Autorise le passage d'une ligne à l'autre avec les flèches gauche et droite
set whichwrap=<,>,[,]
" Essaye de garder le curseur dans la même colonne quand on change de ligne
set nostartofline
" Option de la complétion automatique
set wildmode=list:full
set wildchar=<Tab>
set wildmenu         " Meilleur complétion des commandes dans la ligne de status
set tabstop=4 shiftwidth=4 expandtab " Pas de vraies tabulations
set softtabstop=4    " Backspace supprime 4 espace d'un coup
set ignorecase       " Les recherches ne sont pas 'case sensitives'...
set smartcase        " ... sauf si le pattern recherché contient des majuscules
" Le pliage se base sur l'indentation du fichier
set foldmethod=indent
set foldnestmax=3    " 3 niveaux de pliage maxi
set nofoldenable     " Ne pas plier par défaut
set incsearch        " Recherches incrémentalees
set hlsearch         " Mettre en surbrillance le mot cherché
set autoread         " Auto lecture si le fichier a été modifié depuis l'extérieur

" UI :
" -----------------------------------------------------------------------------
colorscheme molokai  " Thème de couleur
syntax enable        " Active la coloration syntaxique
" Contenu de la barre de status
set statusline=%F\ Type=%y\ %=Pos=%l,%c\ (%p%%)\ SLOC=%L\ %P
set laststatus=2     " Barre de status toujours visible
set t_Co=256         " Utiliser 256 couleurs
set textwidth=78     " Largeur maxi du texte inséré
set colorcolumn=80   " Mise en couleur colonne n°80
set showcmd          " Affiche les commandes dans la barre de status
set showmatch        " Affiche la paire de parenthèses
set number           " Afficher les numéros de ligne
set splitright
" set relativenumber   " Mode numérotation des lignes relative

" INDENT :
" -----------------------------------------------------------------------------
set smartindent
" Options d'indentation pour un fichier C
set cinoptions=(0
set shiftwidth=4     " Nombre d'espace dans l'indentation

" MAPPING :
" -----------------------------------------------------------------------------
" Remapper pour conserver la sélection
vnoremap < <gv
vnoremap > >gv
" Mapper Y pour copie jusqu'à fin de ligne
map Y y$
" U n'est pas utile, en faire un redo (Ctrl - R)
map U <C-r>
" kj est plus rapide à atteindre que <Esc>
inoremap kj <Esc>
cnoremap kj <Esc>
" L sépare une ligne à la position du curseur (inverse de J)
nnoremap L i<Enter><Esc>
" Mapper pour split navigation
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>
" Mapper leader key
let mapleader = ","
" ,r passe en mode num ligne relatives
map <leader>r :set relativenumber<CR>
" Folding avec espace
nnoremap <space> za

" POWERLINE :
" -----------------------------------------------------------------------------
" set rtp+=/usr/share/vim/vimfiles/plugin/powerline.vim
" python from powerline.vim import setup as powerline_setup
" python powerline_setup()
" python del powerline_setup
" set laststatus=2
" set t_Co=256

" SCROLLING :
" -----------------------------------------------------------------------------
set scrolloff=8         " Conserver 8 lignes visibles en scrollant verticalement
set sidescrolloff=15    " Conserver 15 colonnes visibles en scrollant horizontalement
set sidescroll=1

" ASTUCES :
" -----------------------------------------------------------------------------
" Rouvrir le fichier là où on l'a quitté
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
" :set scrollbind    " Scroller syncro entre 2 fenêtres

" WRAPPING INTELLIGENT EN FONCTION DU TYPE DE FICHIERS :
" -----------------------------------------------------------------------------
" Définir wrap et textwidth en fonction du fichier ou de son emplacement
function! SetupEnvironment()
  let l:path = expand('%:p')
  if l:path =~ '/home/sogal/.*'
    setlocal textwidth=0
  elseif (&ft == 'c' || &ft == 'html' || &ft == 'sh' || &ft == 'txt2tags')
    setlocal textwidth=0
  elseif (&ft == 'mail')
  " Largeur à 72 car. pour les mails
    setlocal textwidth=72
  else
  " Le défaut est à 78 car.
    setlocal textwidth=78
  endif
endfunction
au BufReadPost,BufNewFile * call SetupEnvironment()

" txt2tags
au BufNewFile,BufRead *.t2t map 2l :w<CR>:!txt2tags -t html "%" ; unoconv -f odt "%:r.html" <CR>
au BufNewFile,BufRead *.t2t map 2h :w<CR>:!txt2tags -t html -o /tmp/txt2tags_apercu.html "%" ; firefox "file:///tmp/txt2tags_apercu.html" <CR>
au BufRead,BufNewFile *.t2t set tw=78
au BufNewFile,BufRead *.t2t set spell
au BufNewFile,BufRead *.t2t setlocal spell spelllang=fr
au BufNewFile,BufRead *.t2t set ft=txt2tags
au BufNewFile,BufRead *.t2t set noexpandtab

" PYTHON IDE :
" -----------------------------------------------------------------------------
" Exécuter le script avec '2p'
au BufNewFile,BufRead *.py map 2p :w<CR>:!python3 "%"<CR>
" Vérifier conformité du script à la PEP8 avec '2P'
au BufNewFile,BufRead *.py map 2P :w<CR>:!python3-pep8 '%'<CR>
" Paraméter le fichier pour conformité à la PEP8
au BufNewFile,BufRead *.py
    \ set tabstop=4 |
    \ set softtabstop=4 |
    \ set shiftwidth=4 |
    \ set textwidth=79 |
    \ set expandtab |
    \ set autoindent |
    \ set fileformat=unix |

let python_highlight_all=1                  " Highlight du code

" VUNDLE ET CONFIGURATION DES PLUGINS ET DE LEUR ENVIRONNEMENT :
" -----------------------------------------------------------------------------
set rtp+=~/.vim/bundle/Vundle.vim
" L'environnement Vim inclus Vundle et l'exécute au lancement
call vundle#begin()
Plugin 'gmarik/Vundle.vim'

" Ajouter les plugins ci-dessous :
" (note older versions of Vundle used Bundle instead of Plugin)
" -----------------------------------------------------------------------------
Plugin 'tmhedberg/SimpylFold'               " Meilleur folding
let g:SimpylFold_docstring_preview=1        " Voir la docstring du code foldé

" Indentation conforme PEP8
Plugin 'vim-scripts/indentpython.vim'

" Meilleur autocomplétion Python
Bundle 'Valloric/YouCompleteMe'

" Fermer la fenêtre d'autocomplétion après usage
let g:ycm_autoclose_preview_window_after_completion=1

" ,g amène vers la définition de l'élément complété
map <leader>g  :YcmCompleter GoToDefinitionElseDeclaration<CR>

" Python avec support virtualenv (pour PATH plugin YoukCompleteMe):
" -----------------------------------------------------------------------------
py << EOF
import os
import sys
if 'VIRTUAL_ENV' in os.environ:
  project_base_dir = os.environ['VIRTUAL_ENV']
  activate_this = os.path.join(project_base_dir, 'bin/activate_this.py')
  execfile(activate_this, dict(__file__=activate_this))
EOF

Plugin 'scrooloose/syntastic'               " Vérif syntaxe Python
Plugin 'nvie/vim-flake8'                    " Ajout check conformité PEP8

" Navigateur de fichiers dans une side-bar
Plugin 'scrooloose/nerdtree'
map <leader>t :NERDTreeToggle<CR>           " ,t affiche l'arborescence
let NERDTreeIgnore=['\.pyc$', '\~$']        " Ignorer fichier .pyc in NERDTree

" Barre de status (+ light que powerline)
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'

" *TOUS* les plugins sont à ajouter et configurer avant cette ligne !
call vundle#end()                           " Requis
filetype plugin indent on                   " Requis

" DEMARRAGE AUTO DES PLUGINS :
" -----------------------------------------------------------------------------
autocmd VimEnter * NERDTree

Tags: terminal, tips

Tilix : l'ami des administrateurs système

01 décembre, 2018 — sogal

Il y a quelques mois, je présentais Tilix , un émulateur de terminal scindable. Après plusieurs mois d'utilisation, je souhaite partager quelques astuces qui font de ce terminal un excellent outil pour les administrat{rices,eurs} système. Pour rappel, Tilix (anciennement Terminix) est un émulateur de terminal utilisant la libvte et écrit en D avec interface GTK3+. À ce titre, il est donc particulièrement conçu pour s'intégrer avec GNOME.

À l'instar de Terminator, il est scindable, ce qui permet d'avoir de nombreux terminaux dans une seule fenêtre :

Tilix

Il peut être également un remplaçant de Guake, dans la mesure où il fonctionne aussi en tant que « dropdown terminal » (terminal déroulant dit à la Quake) :

Tilix

Bref, il est mignon mais tout ça c'est du classique, pas de quoi justifier un deuxième article. Non, ce qui va nous intéresser aujourd'hui, ce sont les fonctionnalités avancées de Tilix, à savoir :

  • Gestion de signets, locaux ou distants ;
  • Liens personnalisés (liens cliquables sur la base d'expressions rationnelles) ;
  • Changement de profil automatique selon l'emplacement (local ou distant (SSH)) ;
  • Gestion des mots de passe ;
  • Lancement d'actions en interne ;
  • Gestion avancée du presse-papier.

Gestion des signets :

Tilix permet d'enregistrer et gérer une liste de « signets », c'est-à-dire des emplacements locaux ou distants. Il suffira ensuite d'ouvrir cette liste, de sélectionner le signet voulu pour se rendre immédiatement dans le dossier ou ouvrir la session SSH vers un hôte distant.

Note : les signets sont enregistrés dans $HOME/.config/tilix/bookmarks.json, je vous recommande de créer ce fichier à la main au préalable si vous constatez que vos signets ne sont pas enregistrés correctement après avoir quitté Tilix.

Dossier :

Tilix vous permet d'organiser vos signets en créant un simple dossier dans lequel vous allez pouvoir les créer, afin qu'ils soient bien organisés. C'est utile pour, par exemple, regrouper des connexions SSH vers un même groupe de machines :

Tilix

Cliquer sur le dossier puis sur le « + » pour y ajouter des signets.

Signets locaux :

Pour ajouter des signets, ouvrir les préférences de Tilix, puis aller dans la section Signets pour cliquer sur le « + ».

Ici, je vais ajouter un signet vers la copie local de mon projet sur l'Open Build Service.

Tilix

Signets distants :

La procédure est la même, mais choisir « Distant » puis renseigner les paramètres du signet :

  • Nom : la référence de votre signet ;
  • Protocole : au choix : SSH, SFTP, TELNET, FTP ;
  • Hôte : le nom d'hôte de la cible suivi du numéro de port ;
  • Utilisateur : l'utilisateur de la connexion ;
  • Paramètres : les options de SSH par exemple ;
  • Commande : si c'est une connexion SSH, la commande à lancer sur l'hôte distant.

Tilix

Un bon exemple de « Don't drink and root » !

Commande :

Même procédure que les autres, mais là on saisit simplement une commande à lancer, le signet est donc ici un simple alias.

Tilix

Ma commande pour mettre à jour la copie locale de mon dépôt OBS.

Utiliser les signets :

Vous pouvez accéder à vos signets via « Ctrl + Maj + B », vous n'avez plus qu'à le sélectionner et la commande correspondante est lancée :

Tilix

Liens personnalisés :

Tilix vous permet de définir une liste de liens (URI vers une page web ou un emplacement file:// local ou distant) qui vont être rendus cliquables sur la base d'une expression rationnelle ou d'un simple mot. Pour ce faire, ouvrir les préférences puis la section Avancé. Pour l'exemple, je vais ajouter un lien pour me rendre d'un clic sur le forum d'obsd4a.net (OpenBSD For All), celui d'Alionet (communauté openSUSE francophone), celui de Debian-Facile ou encore ma copie locale de la doc Python :

Tilix

Le terme d'expression rationnelle est devenu cliquable, soit par « Ctrl + clic », soit par un clic-droit :

Tilix

Changement de profil automatique :

On arrive là dans une fonctionnalité de Tilix que j'apprécie beaucoup et qui peut permettre d'éviter de faire des bêtises en tapant une commande dans le mauvais répertoire ou dans une connexion distante : il s'agît du changement de profil automatique. Tilix, comme beaucoup d'émulateurs de terminal modernes, vous permet de créer plusieurs profils (couleurs, shell utilisé, police de caractères etc...) mais en plus, il permet de passer automatiquement de l'un à l'autre en fonction de l'emplacement actif, que ce soit un dossier local ou, plus intéressant mais nécessitant un poil plus de manipulation, une connexion SSH.

En local :

Tilix

Pour l'exemple j'ai créé un profil appelé « Root » qui sera activé automatiquement lorsque je serais dans un des dossiers suivants :

/etc
/usr
/root

Maintenant, dans l'onglet « Avancé » du profil, je vais définir la condition nécessaire à son activation.

Comme il est précisé, les valeurs doivent être au format « hôte:dossier » ou « hote: » ou « :dossier », les « : » sont obligatoires, ainsi « hôte » ou « dossier » seuls ne sont pas permis.

Et maintenant, si je me rends dans /etc :

Tilix

La bascule s'est faite automatiquement et dès que je quitte /etc Tilix me remet mon profil par défault :

Tilix

Lors d'une connexion distante :

Tilix nous permet de faire la même chose lors d'une connexion SSH. Mais cela nécessite un brin de configuration sur l'hôte distant :

Copie du script sur l'hôte distant :

Il faut pousser le script /usr/share/tilix/scripts/tilix_int.sh dans le $HOME de l'utilisateur distant :

scp /usr/share/tilix/scripts/tilix_int.sh user@hostname:/home/user

Puis s'y connecter au préalable pour ajouter le lancement du script à la connexion, via son .bashrc par exemple :

[sogal@host ~]$ cat .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
. ./tilix_int.sh

Configuration de la condition :

Puis définir, là aussi, la condition de bascule de profil comme précédemment mais en précisant l'hôte (celui fournit par la commande hostname sur laquelle Tilix se base) cette fois-ci :

Tilix

Puis se connecter :

Tilix On voit à gauche que le profil a changé dès l'établissement de la connexion SSH.

Puis qu'il rebascule vers le profil par défaut dès que je me déconnecte. Tilix

Gestion des mots de passe :

Tilix permet également de conserver en mémoire des mots de passe. Pour cela, cliquez sur le menu du terminal actif et choisir « Mots de passe... » :

Tilix

Et renseignez le :

Tilix

Tilix

Tilix conserve les mots de passe enregistrés dans le trousseau de gnome-keyring.

C'est une fonction très intéressante couplée aux précédentes :

  • à l'aide des signets vous lancez une connexion distante ;
  • grâce aux mots de passe enregistrés vous déverrouillez votre clé SSH par exemple ;
  • puis Tilix vous bascule immédiatement dans le profil de votre choix le cas échéant.

Lancement d'actions en interne :

Au sein d'un session Tilix en cours, ce dernier permet de lancer des actions internes pouvant être utiles pour, par exemple, scinder la fenêtre en deux puis ouvrir un programme X dans la tuile créée :

tilix -a session-add-right -e htop

Tilix

Fonctionnalité utile lorsque couplée à un alias.

Gestion avancée du presse-papier :

Tilix nous offre des options intéressantes du copier-coller. Elles sont à activer dans les préférences :

Tilix

Dialogue avancé :

Vous pouvez configurer un raccourci pour l'afficher ou bien choisir de toujours l'afficher. Ce dialogue permet par exemple de configurer le nombre d'espaces dans les tabulations lors du collage :

Tilix

Avertissement en cas de collage dangereux :

Une fonctionnalité parfaite pour les utilisateurs étourdis !

Tilix dispose d'une fonctionnalité qui vous averti lors du collage d'une commande potentiellement dangereuse (exécutée avec sudo par exemple). Ceci est utile lorsqu'on suit un peu bêtement un tutoriel depuis le Web mais ne fonctionne que lorsque la commande est suivie d'un retour à la ligne qui entraînera son exécution immédiate :

Tilix

En conclusion :

Voilà, j'espère que cette revue des fonctionnalités avancées de Tilix vous aura convaincu, ou du moins donné envie, de l'adopter pour vos travaux. Tilix est développé activement, de nouvelles versions voient le jour environ tous les deux mois et apportent leur lot de nouveautés intéressantes, donc n'hésitez pas à les suivre s'il vous intéresse. Je continuerai à publier des infos sur son développement et les sorties des nouvelles versions stables.

À bientôt, enjoy !

Tags: terminal