navtor 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8edaf937f4e8a82b52a7d476376a68b63db29b09
4
+ data.tar.gz: f414b0b417b9d4415aa29241400725d1f6746768
5
+ SHA512:
6
+ metadata.gz: c69364c7c54c4899c09d570b0962bcb32912b97f0b51b0f3e2fcef6cde0041a9225f269b26bb0194f2abc262cbd94f34bd1a0b81793db5571d7d04f928b131ac
7
+ data.tar.gz: 0bb734bc3d44c9b581801e8b70fe31b5c7378f7d72ce12cbe292581e88baa59c25a62dda806338eb04cf3179369a23be88a9b27fc6916c8bc9269735a0e9c64d
@@ -0,0 +1 @@
1
+ rfm is a Ruby-based clone of [fff](https://github.com/dylanaraps/fff/).
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env ruby
2
+ # This is a clone of fff written in Bash
3
+ # Things learned:
4
+ # * Need to remember to init_color
5
+ # * `Curses.init_pair(1, -1, -1)` can be used to get default colors
6
+ # * `stdscr.scrollok(false)` need to be used to avoid new line created at the bottom
7
+ require 'curses'
8
+
9
+ class FileManager
10
+ attr_accessor :entries, :current_pos
11
+
12
+ def initialize
13
+ @entries = []
14
+ @current_pos = 0
15
+ @ui = UI.new(self)
16
+ ls
17
+ end
18
+
19
+ def run
20
+ @ui.run
21
+ end
22
+
23
+ def ls
24
+ @entries = (Dir.entries('.') - ['.', '..']).sort
25
+ @entries.each.with_index do |entry, index|
26
+ if File.directory?(entry)
27
+ @entries[index] = "[#{entry}]"
28
+ end
29
+ end
30
+ @ui.calculate_lines
31
+ end
32
+
33
+ def current_entry
34
+ @entries[@current_pos]
35
+ end
36
+
37
+ def to_parent_dir
38
+ Dir.chdir('..')
39
+ ls
40
+ @ui.reset
41
+ end
42
+
43
+ def open_current
44
+ return if current_entry.nil?
45
+ is_file = current_entry.match('\[(.+)\]').nil?
46
+ if !is_file
47
+ Dir.chdir(current_entry.match('\[(.+)\]')[1])
48
+ ls
49
+ @ui.reset
50
+ else
51
+ @ui.close_screen
52
+ #Curses.def_prog_mode
53
+ system("vim #{Dir.pwd}/#{current_entry}")
54
+ #Curses.reset_prog_mode
55
+ @ui.init_screen
56
+ @ui.refresh
57
+ end
58
+ end
59
+ end
60
+
61
+ class UI
62
+ attr_accessor :start_line, :end_line
63
+ def initialize(fm)
64
+ @fm = fm
65
+ Curses.noecho
66
+ Curses.nonl
67
+ Curses.stdscr.keypad(true)
68
+ Curses.raw
69
+ Curses.stdscr.nodelay = 1
70
+ self.init_screen
71
+ @lines = Curses.lines
72
+ @cols = Curses.cols
73
+ @offset = 0 # Offset within current directory's entries
74
+
75
+ @start_line = 0 # Start line of file list on screen, should be 0
76
+ @end_line = @lines - 1 # End line of file list on screen
77
+ @current_line = 0
78
+
79
+ @input = nil
80
+ stdscr.timeout = -1
81
+ stdscr.scrollok(false) # Avoid scrolling
82
+ stdscr.idlok(true)
83
+ end
84
+
85
+ def init_screen
86
+ Curses.init_screen
87
+ Curses.start_color
88
+ Curses.use_default_colors
89
+ Curses.init_pair(1, -1, -1) # Get defautl colors
90
+ Curses.init_pair(2, Curses::COLOR_GREEN, -1)
91
+ Curses.curs_set(0)
92
+ end
93
+
94
+ def close_screen
95
+ Curses.close_screen
96
+ end
97
+
98
+ def calculate_lines
99
+ @end_line = [@lines - 2, @fm.entries.size-1].min
100
+ end
101
+
102
+ def page_size
103
+ @end_line - @start_line
104
+ end
105
+
106
+ def stdscr
107
+ Curses.stdscr
108
+ end
109
+
110
+ def reset
111
+ @current_line = 0
112
+ @offset = 0
113
+ end
114
+
115
+ def refresh
116
+ Curses.clear
117
+ stdscr.refresh
118
+ end
119
+
120
+ def print_entries
121
+ visible_entries = @fm.entries[@offset + @start_line, @end_line - @start_line + 1]
122
+ visible_entries.each.with_index do |line, index|
123
+ if index == @current_line
124
+ @fm.current_pos = index + @offset
125
+ stdscr.attron(Curses.color_pair(1) | Curses::A_REVERSE) {
126
+ stdscr.addstr("#{line}")
127
+ }
128
+ else
129
+ stdscr.addstr("#{line}")
130
+ end
131
+ stdscr.setpos(stdscr.cury + 1, 0)
132
+ end
133
+ stdscr.addstr("(empty)") if visible_entries.empty?
134
+ stdscr.refresh
135
+ end
136
+
137
+ def status_line(str="", clear = true)
138
+ curx, cury = stdscr.curx, stdscr.cury
139
+ str = "#{Dir.pwd} (#{@fm.current_pos + 1}/#{@fm.entries.size}) off=#{@offset} cur=#{@current_line} end=#{@end_line} w=#{@cols} h=#{@lines} input=#{@input}" + str
140
+ if clear
141
+ stdscr.setpos(@lines - 1, 0)
142
+ stdscr.addstr(' ' * @cols)
143
+ end
144
+ stdscr.setpos(@lines - 1, 0)
145
+ stdscr.attron(Curses.color_pair(2) | Curses::A_NORMAL) {
146
+ stdscr.addstr(str)
147
+ }
148
+ stdscr.setpos(cury, curx)
149
+ stdscr.refresh
150
+ end
151
+
152
+ def run
153
+ refresh
154
+ print_entries
155
+ status_line
156
+ until (@input = stdscr.getch) == 'q'
157
+ refresh
158
+ handle(@input)
159
+ print_entries
160
+ status_line
161
+ end
162
+ ensure
163
+ self.exit
164
+ end
165
+
166
+ def handle(input)
167
+ if input == 'j' || input == 258
168
+ @current_line = (@current_line == @end_line) ? @current_line : @current_line + 1
169
+ @offset += 1 if @current_line == @end_line && @offset + page_size < @fm.entries.size - 1
170
+ elsif input == 'k' || input == 259
171
+ @current_line = (@current_line == @start_line) ? @current_line : @current_line - 1
172
+ @offset -=1 if @current_line == @start_line && @offset > 0
173
+ elsif input == 'g'
174
+ @offset = 0
175
+ @current_line = 0
176
+ elsif input == 'G'
177
+ @offset = @fm.entries.size - 1 - page_size
178
+ @current_line = @end_line
179
+ elsif input == 'h' || input == 260
180
+ @offset = 0
181
+ @fm.to_parent_dir
182
+ elsif input == 'l' || input == 261
183
+ @fm.open_current
184
+ end
185
+ end
186
+
187
+ def exit
188
+ Curses.clear
189
+ Curses.close_screen
190
+ end
191
+ end
192
+
193
+ def main
194
+ fm = FileManager.new
195
+ fm.run
196
+ end
197
+
198
+ main
@@ -0,0 +1,4 @@
1
+ module Navtor
2
+ VERSION = '0.0.1'
3
+ DATE = '2018-10-29'
4
+ end
@@ -0,0 +1,26 @@
1
+ $LOAD_PATH << File.expand_path('../lib', __FILE__)
2
+ require 'navtor/version'
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = 'navtor'
6
+ spec.version = Navtor::VERSION
7
+ spec.date = Navtor::DATE
8
+ spec.description = 'Vi-like file manager'
9
+ spec.summary = spec.description
10
+
11
+ spec.authors = ['Thanh Dinh Khac']
12
+ spec.email = 'thanhdk@gmail.com'
13
+
14
+ spec.homepage = 'http://rubygems.org/gems/navtor'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = %w[navtor.gemspec] + Dir['*.md', 'bin/*', 'lib/*', 'lib/**/*.rb']
18
+ spec.require_paths << 'lib'
19
+ spec.executables = ['navtor']
20
+
21
+ spec.required_ruby_version = '>= 2.0'
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.0"
24
+
25
+ spec.add_dependency 'curses', '~> 1.2'
26
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: navtor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Thanh Dinh Khac
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-10-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: curses
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.2'
41
+ description: Vi-like file manager
42
+ email: thanhdk@gmail.com
43
+ executables:
44
+ - navtor
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - README.md
49
+ - bin/navtor
50
+ - lib/navtor/version.rb
51
+ - navtor.gemspec
52
+ homepage: http://rubygems.org/gems/navtor
53
+ licenses:
54
+ - MIT
55
+ metadata: {}
56
+ post_install_message:
57
+ rdoc_options: []
58
+ require_paths:
59
+ - lib
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: '2.0'
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubyforge_project:
73
+ rubygems_version: 2.5.1
74
+ signing_key:
75
+ specification_version: 4
76
+ summary: Vi-like file manager
77
+ test_files: []