IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Applications et environnements graphiques Discussion :

[Vim] mark ring


Sujet :

Applications et environnements graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut [Vim] mark ring
    Salut,

    Je cherche depuis pas mal de temps une fonctionnalité (ou un plug-in si cela n'existe pas par défaut) dans vim. Je ne trouve nulle part de solutions, vous éte ma dernière chance :p
    Je cherche à faire un "mark ring" à la emacs, j'explique :
    Quand on fait par exemple "C-SPC", on empile une marque de la position actuelle, et quand on fait "C-x C-SPC" on va à la position de la dernière marque ajoutée, et on la retire de la file.

    J'ai presque trouvé une fonction vim qui fait ca (tagstack), mais cela ne marche que pour la navigation dans des fonctions taguées (le seul moyen de rajouter une position dans la pile est de sauter vers une fonction taguée).

    Voyez vous une solution pour faire cela ?

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Cela ne doit pas être compliqué à implémenter.
    Je ne serai pas surpris qu'un tel truc existe déjà, et avec plus de fonctionnalités comme montrer où se trouvent les marques, la possibilité de ne pas les retirer de la pile, etc.
    Code vim : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    "=============================================================================
    " $Id$
    " File:         plugin/markring.vim                               {{{1
    " Author:       Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
    "		<URL:http://code.google.com/p/lh-vim/>
    " Version:      0.0.1
    " Created:      19th May 2010
    " Last Update:  $Date$
    "------------------------------------------------------------------------
    " Description:
    "       «description»
    " 
    "------------------------------------------------------------------------
    " Installation:
    "       Drop this file into {rtp}/plugin
    "       Requires Vim7+
    "       «install details»
    " History:      «history»
    " TODO:         «missing features»
    " }}}1
    "=============================================================================
     
    " Avoid global reinclusion {{{1
    let s:k_version = 001
    if &cp || (exists("g:loaded_markring")
          \ && (g:loaded_markring >= s:k_version)
          \ && !exists('g:force_reload_markring'))
      finish
    endif
    let g:loaded_markring = s:k_version
    let s:cpo_save=&cpo
    set cpo&vim
    " Avoid global reinclusion }}}1
    "------------------------------------------------------------------------
    " Commands and Mappings {{{1
     
    nnoremap <silent> <Plug>PushMark :call <sid>PushMark()<cr>
    if !hasmapto('<Plug>PushMark', '')
      nmap <silent> <c-space> <Plug>PushMark
    endif
    nnoremap <silent> <Plug>PopMark :call <sid>PopMark()<cr>
    if !hasmapto('<Plug>PopMark', '')
      nmap <silent> <c-x><c-space> <Plug>PopMark
    endif
     
    " Commands and Mappings }}}1
    "------------------------------------------------------------------------
    " Functions {{{1
    " Note: most functions are best placed into
    " autoload/«your-initials»/«markring».vim
    " Keep here only the functions are are required when the plugin is loaded,
    " like functions that help building a vim-menu for this plugin.
     
    let s:marks = []
     
    function! s:PushMark() " {{{2
      let m = getpos('.')
      call add(s:marks, m)
      echo "mark pushed"
    endfunction
     
    function! s:PopMark() " {{{2
      if empty(s:marks) 
        throw "MarkRing: no mark left in the stack"
      endif
      let m = remove(s:marks, -1)
      call setpos('.', m)
    endfunction
     
    function! s:ClearRing() " {{{2
      let s:marks = []
    endfunction
     
    " Functions }}}1
    "------------------------------------------------------------------------
    let &cpo=s:cpo_save
    "=============================================================================
    " vim600: set fdm=marker:
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Whouahou !!! je suis impressionné !!
    Je ne pensais pas que ça pouvait ce faire aussi facilement O_O

    Ca ma convaincu d'apprendre le langage script de vim, je vais commencer par essayer de comprendre ce code là ^^

    Un grand merci pour ton aide Luc

  4. #4
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Ah, en fait, apres utilisation il y a un problème dans la solution proposé :^/

    En effet, si on met une marque à la ligne 100, et que l'on rajoute 10 ligne en début de fichier par exemple, la marque reste à la ligne 100 et ne ce déplace pas en ligne 110...
    Les marks font ça automatiquement mais ils semble être limités en nombres et sont nominatives.

    Vois-tu une solution pour prendre ce cas en compte ?

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    En effet. Je vois le problème.
    Une autre solution serait à la place de travailler avec les 26 marques usuelles. Et de shifter au fur et à mesure.
    Cette fois-ci, il faut jouer avec :exe+:normal
    Code vim : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    let s:crt_mark = 'a'
    ...
    " push
    let s:crt_mark =nr2char(char2nr(s:crt_mark)+1) " += 1 ne marche pas sur les caractères... :(
    " + penser au côté z + 1 = a
    exe ":normal! m".s:crt_mark
     
    " pop
    exe ":normal! '".s:crt_mark
    let s:crt_mark =nr2char(char2nr(s:crt_mark)-1)

    Seulement, il y a beaucoup de plugins et autres macros qui trainent le net qui bidouillent les marques au lieu de les laisser tranquilles. Donc, tu aurais vite fait d'être parasité par l'extérieur.
    Je ne peux que te conseiller de faire une recherche sur "mark" sur vim.org, ou sur vim.wikia.org. Ce que tu cherches me dit quelque chose.


    PS: sinon, le Viml est un langage assez simple. Il faut juste savoir comment gérer les changements de modes et les formes nominales des fonctions en fonction des modes dans lesquels elles sont sensées pouvoir s'exécuter (cf le :exe+:normal), ou depuis quoi (commande, menu/map, abbr, ...).
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    tiens c'est pratique ça
    merci du tuyau

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Executer un script sous vim
    Par chaval dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 24/01/2006, 00h35
  2. Comment insérer le résultat d'une commande avec vim
    Par zelda dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 28/12/2005, 09h32
  3. Comment personnaliser un Tchart.Series.Mark ?
    Par Homer dans le forum Composants VCL
    Réponses: 1
    Dernier message: 08/12/2005, 10h21
  4. [Vim] et C++ ; Réponses à des questions de Richard
    Par Luc Hermitte dans le forum Autres éditeurs
    Réponses: 13
    Dernier message: 19/01/2004, 23h32
  5. Les interruptions + ring 0 ?
    Par MonsieurAk dans le forum x86 32-bits / 64-bits
    Réponses: 12
    Dernier message: 29/09/2003, 08h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo