efm 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 465dbfb923181c04737ab073f4a93786bec4c75a791d548e2a03e95fb4376535
4
+ data.tar.gz: 574bd009ac693baa7012acb8431694bb8d923a96803184a4d4c9675d255fa4d2
5
+ SHA512:
6
+ metadata.gz: 6e64a99f847d71b68890e8392609f7a695a6836dc7d1ac9448b168cb1af089ae78180ff757f8e2dc67fd505bce75ddefc98babfe1052ecc071739af0fcdb6681
7
+ data.tar.gz: 1b4bf091b3aee4435bc6fb27aaa2d293ef04a374978d14ecbf3eb0000be313defa6b6083d79403c5f870fc6ff1655af29e0a5ea827008aced3e9e5ff45999514
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in efm.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
9
+ gem "rspec", "~> 3.0"
@@ -0,0 +1,36 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ efm (0.1.0)
5
+ curses (~> 1.4.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ curses (1.4.0)
11
+ diff-lcs (1.4.4)
12
+ rake (13.0.3)
13
+ rspec (3.10.0)
14
+ rspec-core (~> 3.10.0)
15
+ rspec-expectations (~> 3.10.0)
16
+ rspec-mocks (~> 3.10.0)
17
+ rspec-core (3.10.1)
18
+ rspec-support (~> 3.10.0)
19
+ rspec-expectations (3.10.1)
20
+ diff-lcs (>= 1.2.0, < 2.0)
21
+ rspec-support (~> 3.10.0)
22
+ rspec-mocks (3.10.1)
23
+ diff-lcs (>= 1.2.0, < 2.0)
24
+ rspec-support (~> 3.10.0)
25
+ rspec-support (3.10.1)
26
+
27
+ PLATFORMS
28
+ x86_64-darwin-20
29
+
30
+ DEPENDENCIES
31
+ efm!
32
+ rake (~> 13.0)
33
+ rspec (~> 3.0)
34
+
35
+ BUNDLED WITH
36
+ 2.2.3
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 iavivai
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,23 @@
1
+ # efm: Emacs-like File Manager
2
+
3
+ efm is a small Emacs-like file manager written in Ruby.
4
+
5
+ ![screenshot](https://raw.githubusercontent.com/iavivai/efm/master/basic.gif)
6
+
7
+ ## Installation
8
+
9
+ install it yourself as:
10
+
11
+ $ gem install efm
12
+
13
+ ## Usage
14
+
15
+ TODO: Write usage instructions here
16
+
17
+ ## Contributing
18
+
19
+ Bug reports and pull requests are welcome on GitHub at https://github.com/iavivai/efm.
20
+
21
+ ## License
22
+
23
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
Binary file
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/efm/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "efm"
7
+ spec.version = Efm::VERSION
8
+ spec.authors = ["iavivai"]
9
+ spec.email = ["hello@yukitakaiha.com"]
10
+
11
+ spec.summary = "Emacs-like File Manager"
12
+ spec.description = "efm is a small Emacs-like file manager written in Ruby."
13
+ spec.homepage = "https://github.com/iavivai/efm"
14
+ spec.license = "MIT"
15
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = spec.homepage
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_dependency 'curses', '~> 1.4.0'
30
+ end
data/exe/efm ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'efm'
7
+ require 'curses'
8
+
9
+ manager = Efm::Manager.init_screen
10
+ manager.run
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "efm/version"
4
+ require_relative 'efm/manager'
5
+
6
+ module Efm; end
@@ -0,0 +1,26 @@
1
+ require 'curses'
2
+
3
+ module Efm
4
+ class Item
5
+ def self.all
6
+ Dir
7
+ .glob('*')
8
+ .map { |name| new(name: name, dir: Dir.exist?(name)) }
9
+ .partition(&:dir?)
10
+ .flat_map { |items| items.sort_by(&:name) }
11
+ end
12
+
13
+ def initialize(name:, dir: false)
14
+ @name = name
15
+ @width = Curses.cols
16
+ @dir = dir
17
+ @color = dir ? Curses.color_pair(Curses::COLOR_GREEN) : Curses.color_pair(Curses::COLOR_WHITE)
18
+ end
19
+
20
+ attr_reader :name, :width, :color
21
+
22
+ def dir?
23
+ @dir
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,177 @@
1
+ require 'curses'
2
+ require_relative 'item'
3
+
4
+ module Efm
5
+ class Manager
6
+ FIRST_LINE = 0
7
+
8
+ def self.init_screen
9
+ Curses.init_screen
10
+ Curses.noecho
11
+ Curses.curs_set(0)
12
+ Curses.start_color
13
+ [Curses::COLOR_GREEN, Curses::COLOR_WHITE].each do |c|
14
+ Curses.init_pair c, c, Curses::COLOR_BLACK
15
+ end
16
+
17
+ new
18
+ end
19
+
20
+ def initialize
21
+ @header = Curses::Window.new(1, Curses.cols, 0, 0)
22
+ @main = Curses::Window.new(Curses.lines - 1, Curses.cols, 1, 0)
23
+ end
24
+
25
+ def run
26
+ init_position
27
+ cd
28
+ ls
29
+ update_header
30
+
31
+ begin
32
+ loop do
33
+ case c = @main.getch
34
+ when Curses::KEY_CTRL_N
35
+ down
36
+ when Curses::KEY_CTRL_P
37
+ up
38
+ when Curses::KEY_CTRL_H, Curses::KEY_CTRL_B, 127
39
+ left
40
+ ls
41
+ when Curses::KEY_CTRL_F, 10, 13
42
+ if @current_item.dir?
43
+ cd(@current_item.name)
44
+ else
45
+ open
46
+ end
47
+ ls
48
+ when 'q'
49
+ break
50
+ end
51
+
52
+ update_header
53
+ end
54
+ ensure
55
+ Curses.close_screen
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def update_header
62
+ @header.setpos(0, 0)
63
+ @header.clrtoeol
64
+ @header.attron(Curses.color_pair(Curses::COLOR_GREEN) | Curses::A_NORMAL) do
65
+ @header.addstr(File.expand_path(@current_item.name))
66
+ end
67
+ @header.refresh
68
+ end
69
+
70
+ def clear_screen
71
+ @main.clear
72
+ end
73
+
74
+ def init_position
75
+ @x = 0
76
+ @y = 0
77
+
78
+ @main.setpos(@y, @x)
79
+ end
80
+
81
+ def up
82
+ if @y <= FIRST_LINE && 0 == @page
83
+ @page = @items.count / (maxy + 1)
84
+ ls
85
+ init_prev_item
86
+ @y = (@items.count - 1) % maxy
87
+ elsif @y <= FIRST_LINE && 0 < @page
88
+ @page = @page - 1
89
+ ls
90
+ init_prev_item
91
+ @y = maxy - 1
92
+ else
93
+ init_prev_item
94
+ @y = @y - 1
95
+ end
96
+
97
+ @current_item = @display_items[@y]
98
+ @main.setpos(@y, @x)
99
+ decorate_current_item
100
+ end
101
+
102
+ def down
103
+ if @y >= @last_line && @page != @last_page
104
+ @page = @page + 1
105
+ ls
106
+ elsif @y >= @last_line && @page == @last_page
107
+ @page = 0
108
+ ls
109
+ else
110
+ init_prev_item
111
+ @y = @y + 1
112
+ end
113
+
114
+ @current_item = @display_items[@y]
115
+ @main.setpos(@y, @x)
116
+ decorate_current_item
117
+ end
118
+
119
+ def left
120
+ cd('..')
121
+ end
122
+
123
+ def open
124
+ editor = ENV['EDITOR'] || 'vi'
125
+ system "#{editor} #{@current_item.name}"
126
+ end
127
+
128
+ def init_prev_item
129
+ @main.setpos(@y, @x)
130
+ display_line(@current_item)
131
+ end
132
+
133
+ def decorate_current_item
134
+ @main.clrtoeol
135
+ @main.attron(@current_item.color | Curses::A_STANDOUT) do
136
+ @main.addstr(@current_item.name)
137
+ end
138
+ end
139
+
140
+ def display_line(item)
141
+ @main.attron(item.color | Curses::A_NORMAL) do
142
+ @main.addstr(item.name)
143
+ end
144
+ end
145
+
146
+ def maxy
147
+ @main.maxy
148
+ end
149
+
150
+ def cd(dir = '.')
151
+ Dir.chdir(dir)
152
+ @items = Item.all
153
+ @page = 0
154
+ @last_page = @items.count / maxy
155
+ end
156
+
157
+ def ls
158
+ clear_screen
159
+ init_position
160
+
161
+ @display_items = @items[@page * maxy, maxy]
162
+ @current_item = @display_items.first
163
+
164
+ @display_items.each do |item|
165
+ @main.setpos(@y, @x)
166
+ display_line(item)
167
+ @y = @y + 1
168
+ end
169
+
170
+ init_position
171
+ decorate_current_item
172
+ @main.refresh
173
+
174
+ @last_line = @display_items.count - 1
175
+ end
176
+ end
177
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Efm
4
+ VERSION = "0.1.0"
5
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: efm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - iavivai
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-01-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: curses
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.4.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.4.0
27
+ description: efm is a small Emacs-like file manager written in Ruby.
28
+ email:
29
+ - hello@yukitakaiha.com
30
+ executables:
31
+ - efm
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - ".gitignore"
36
+ - ".rspec"
37
+ - Gemfile
38
+ - Gemfile.lock
39
+ - LICENSE.txt
40
+ - README.md
41
+ - Rakefile
42
+ - basic.gif
43
+ - efm.gemspec
44
+ - exe/efm
45
+ - lib/efm.rb
46
+ - lib/efm/item.rb
47
+ - lib/efm/manager.rb
48
+ - lib/efm/version.rb
49
+ homepage: https://github.com/iavivai/efm
50
+ licenses:
51
+ - MIT
52
+ metadata:
53
+ homepage_uri: https://github.com/iavivai/efm
54
+ source_code_uri: https://github.com/iavivai/efm
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 2.3.0
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubygems_version: 3.2.3
71
+ signing_key:
72
+ specification_version: 4
73
+ summary: Emacs-like File Manager
74
+ test_files: []