Xavier Nayrac

Rubyiste accro au TDD, serial blogger, apprenti data scientist, heureux utilisateur de Vim, accordéoniste.
Si vous vous sentez particulièrement généreux, suivez moi sur Twitter.

Écrire un éditeur pour le terminal - partie 7

| Comments

Niveau : intermédiaire

Notre futur éditeur aura un certain nombre de fenêtre (au sens de curses) et pour les gérer, on sera bien inspiré d’utiliser un peu de POO. Voici donc une réécriture du programme vu ici.

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
#!/usr/bin/env ruby

require 'curses'
include Curses

class StatusWindow
  def initialize(filename)
    @filename = filename
    @win = Window.new(1, cols, 0, 0)
  end

  def display
    @win.setpos(0, (@win.maxx - @filename.size) / 2)
    @win.addstr(@filename)
    @win.refresh
  end

  def close
    @win.close
  end
end

class FileWindow
  def initialize(filename)
    @filename = filename
    @win = Window.new(lines - 2, cols, 2, 0)
  end

  def display
    @win.setpos(0, 0)
    File.open(@filename).each {|line| @win.addstr(line) }
    @win.refresh
  end

  def close
    @win.close
  end
end

begin
  init_screen
  refresh
  status_window = StatusWindow.new(ARGV[0])
  file_window = FileWindow.new(ARGV[0])
  status_window.display
  file_window.display
  getch
  status_window.close
  file_window.close
ensure
  close_screen
end

Le code est plus conséquent, c’est vrai, mais la structure sera plus claire, surtout quand on coupera le code en plusieurs fichiers, et qu’on utilisera un peu, ou plutôt beaucoup, d’héritage.

Le détail à retenir, curieusement, est celui-ci:

1
2
3
begin
  init_screen
  refresh

Il faut rafraichir l’écran juste après l’initialisation de curses, sinon aucune fenêtre ne s’affichera…

À demain.

Articles connexes

Commentaires