efm 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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: []