colorls 1.2.1.pre.600 → 1.2.1.pre.603

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1cce6a6d2fc6e45ce4fcc87135a13edc7442ab041475339d2b89b1e14c3bce94
4
- data.tar.gz: 954dccdc0786131ceb3fc23d70679bafd7877868344a516ed9d00a897afb0883
3
+ metadata.gz: fbb7f4f4123aa809327372636d3def2506fd78446e4177d8b2ba401aa93a6cc7
4
+ data.tar.gz: f24be4a1bf2306e84b2dd247eb4dba5b6a8a227c65b525cc9ddae4d4272da3d2
5
5
  SHA512:
6
- metadata.gz: f8409394b3bb49344b1231a671966be47dc97deef8909bbac0611db39e83475574288e14f539a9f11bdd995008e7569fa3df51b885ee12fc2ec92f325e843a30
7
- data.tar.gz: 22987f1296da307242ca4b9709345c9c64979f3a2f59feb1d6e238a2afdc2372f00a2a2f2e04a68fe25419b4676c977d64ab8929d9f60386d339d6a799c2c4cf
6
+ metadata.gz: 1ab762d41a7d746ffe9e992c7cf432577f8901d50fae7080446654eba5ad9c2a694158f4f3c3b63d073c2aa87c94f923024239f7ac6f13c47563f793da5a83cf
7
+ data.tar.gz: fb3563bb2a6da81520b6775518302a73ffcc46c1bbe36fa7b047431f64365a05ba9b032d8d27627257173a23f3cdb70bb30044335736ac38c1f1d4ea6f2143ab
data/lib/colorls.rb CHANGED
@@ -11,6 +11,7 @@ require 'clocale'
11
11
  require 'colorls/core'
12
12
  require 'colorls/fileinfo'
13
13
  require 'colorls/flags'
14
+ require 'colorls/layout'
14
15
  require 'colorls/yaml'
15
16
  require 'colorls/monkeys'
16
17
  require 'colorls/git'
data/lib/colorls/core.rb CHANGED
@@ -18,6 +18,7 @@ module ColorLS
18
18
  @one_per_line = mode == :one_per_line
19
19
  @long = mode == :long
20
20
  @tree = {mode: mode == :tree, depth: tree_depth}
21
+ @horizontal = mode == :horizontal
21
22
  process_git_status_details(git_status)
22
23
 
23
24
  @screen_width = IO.console.winsize[1]
@@ -26,20 +27,28 @@ module ColorLS
26
27
  init_colors colors
27
28
 
28
29
  @contents = init_contents(input)
29
- @max_widths = @contents.map { |c| c.name.length }
30
30
  init_icons
31
31
  end
32
32
 
33
33
  def ls
34
34
  return print "\n Nothing to show here\n".colorize(@colors[:empty]) if @contents.empty?
35
35
 
36
- if @tree[:mode]
37
- print "\n"
38
- tree_traverse(@input, 0, 1, 2)
39
- else
40
- @contents = chunkify
41
- @contents.each { |chunk| ls_line(chunk) }
36
+ layout = case
37
+ when @tree[:mode] then
38
+ print "\n"
39
+ return tree_traverse(@input, 0, 1, 2)
40
+ when @horizontal then
41
+ HorizontalLayout.new(@contents, item_widths, @screen_width)
42
+ when @one_per_line || @long then
43
+ SingleColumnLayout.new(@contents)
44
+ else
45
+ VerticalLayout.new(@contents, item_widths, @screen_width)
46
+ end
47
+
48
+ layout.each_line do |line, widths|
49
+ ls_line(line, widths)
42
50
  end
51
+
43
52
  display_report if @report
44
53
  true
45
54
  end
@@ -59,6 +68,13 @@ module ColorLS
59
68
  end
60
69
  end
61
70
 
71
+ # how much characters an item occupies besides its name
72
+ CHARS_PER_ITEM = 12
73
+
74
+ def item_widths
75
+ @contents.map { |item| item.name.size + CHARS_PER_ITEM }
76
+ end
77
+
62
78
  def init_contents(path)
63
79
  info = FileInfo.new(path, link_info = @long)
64
80
 
@@ -144,30 +160,6 @@ module ColorLS
144
160
  @folder_aliases = ColorLS::Yaml.new('folder_aliases.yaml').load(aliase: true)
145
161
  end
146
162
 
147
- def chunkify
148
- return @contents.zip if @one_per_line || @long
149
-
150
- chunk_size = @contents.size
151
- max_widths = @max_widths
152
-
153
- until in_line(chunk_size, max_widths) || chunk_size <= 1
154
- chunk_size -= 1
155
- max_widths = @max_widths.each_slice(chunk_size).to_a
156
- max_widths[-1] += [0] * (chunk_size - max_widths.last.size)
157
- max_widths = max_widths.transpose.map(&:max)
158
- end
159
- @max_widths = max_widths
160
- @contents = get_chunk(chunk_size)
161
- end
162
-
163
- def get_chunk(chunk_size)
164
- @contents.each_slice(chunk_size).to_a
165
- end
166
-
167
- def in_line(chunk_size, max_widths)
168
- (max_widths.sum + 12 * chunk_size <= @screen_width)
169
- end
170
-
171
163
  def display_report
172
164
  print "\n Found #{@total_content_length} contents in directory "
173
165
  .colorize(@colors[:report])
@@ -280,33 +272,27 @@ module ColorLS
280
272
  end
281
273
  end
282
274
 
283
- def slash?(content)
284
- content.directory? ? '/'.colorize(@colors[:dir]) : ' '
285
- end
286
-
287
275
  def fetch_string(path, content, key, color, increment)
288
276
  @count[increment] += 1
289
277
  value = increment == :folders ? @folders[key] : @files[key]
290
278
  logo = value.gsub(/\\u[\da-f]{4}/i) { |m| [m[-4..-1].to_i(16)].pack('U') }
291
279
  name = content.name
292
280
  name = make_link(path, name) if @hyperlink
281
+ name += content.directory? ? '/' : ' '
282
+ entry = logo + ' ' + name
293
283
 
294
- [
295
- long_info(content),
296
- " #{git_info(content)} ",
297
- logo.colorize(color),
298
- " #{name.colorize(color)}#{slash?(content)}#{symlink_info(content)}"
299
- ].join
284
+ "#{long_info(content)} #{git_info(content)} #{entry.colorize(color)}#{symlink_info(content)}"
300
285
  end
301
286
 
302
- def ls_line(chunk)
287
+ def ls_line(chunk, widths)
288
+ padding = 0
289
+ line = +''
303
290
  chunk.each_with_index do |content, i|
304
- break if content.name.empty?
305
-
306
- print " #{fetch_string(@input, content, *options(content))}"
307
- print ' ' * (@max_widths[i] - content.name.length) unless @one_per_line || @long
291
+ line << ' ' * padding
292
+ line << ' ' << fetch_string(@input, content, *options(content))
293
+ padding = widths[i] - content.name.length - CHARS_PER_ITEM
308
294
  end
309
- print "\n"
295
+ print line << "\n"
310
296
  end
311
297
 
312
298
  def file_color(file, key)
data/lib/colorls/flags.rb CHANGED
@@ -15,7 +15,7 @@ module ColorLS
15
15
  sort: true,
16
16
  reverse: false,
17
17
  group: nil,
18
- mode: STDOUT.tty? || :one_per_line,
18
+ mode: STDOUT.tty? ? :vertical : :one_per_line,
19
19
  all: false,
20
20
  almost_all: false,
21
21
  report: false,
@@ -106,22 +106,24 @@ module ColorLS
106
106
 
107
107
  def add_format_options(options)
108
108
  options.on(
109
- '--format=WORD', %w[accross horizontal long single-column],
110
- 'use format: accross (-x), horizontal (-x), long (-l), single-column (-1)'
109
+ '--format=WORD', %w[across horizontal long single-column],
110
+ 'use format: across (-x), horizontal (-x), long (-l), single-column (-1), vertical (-C)'
111
111
  ) do |word|
112
112
  case word
113
- when 'accross', 'horizontal' then @opts[:mode] = true
113
+ when 'across', 'horizontal' then @opts[:mode] = :horizontal
114
+ when 'vertical' then @opts[:mode] = :vertical
114
115
  when 'long' then @opts[:mode] = :long
115
116
  when 'single-column' then @opts[:mode] = :one_per_line
116
117
  end
117
118
  end
118
119
  options.on('-1', 'list one file per line') { @opts[:mode] = :one_per_line }
119
120
  options.on('-l', '--long', 'use a long listing format') { @opts[:mode] = :long }
120
- options.on('-x', 'list entries by lines instead of by columns') { @opts[:mode] = true }
121
121
  options.on('--tree=[DEPTH]', Integer, 'shows tree view of the directory') do |depth|
122
122
  @opts[:tree_depth] = depth
123
123
  @opts[:mode] = :tree
124
124
  end
125
+ options.on('-x', 'list entries by lines instead of by columns') { @opts[:mode] = :horizontal }
126
+ options.on('-C', 'list entries by columns instead of by lines') { @opts[:mode] = :vertical }
125
127
  end
126
128
 
127
129
  def add_general_options(options)
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ColorLS
4
+ class Layout
5
+ def initialize(contents, widths, line_size)
6
+ @max_widths = widths
7
+ @contents = contents
8
+ @screen_width = line_size
9
+ end
10
+
11
+ def each_line
12
+ return if @contents.empty?
13
+
14
+ get_chunks(chunk_size).each { |line| yield(line.compact, @max_widths) }
15
+ end
16
+
17
+ private
18
+
19
+ def chunk_size
20
+ min_size = @max_widths.min
21
+ max_chunks = [1, @screen_width / min_size].max
22
+ max_chunks = [max_chunks, @max_widths.size].min
23
+ min_chunks = 1
24
+
25
+ loop do
26
+ mid = ((max_chunks + min_chunks).to_f / 2).ceil
27
+
28
+ size, max_widths = column_widths(mid)
29
+
30
+ if min_chunks < max_chunks && not_in_line(max_widths)
31
+ max_chunks = mid - 1
32
+ elsif min_chunks < mid
33
+ min_chunks = mid
34
+ else
35
+ @max_widths = max_widths
36
+ return size
37
+ end
38
+ end
39
+ end
40
+
41
+ def not_in_line(max_widths)
42
+ max_widths.sum > @screen_width
43
+ end
44
+ end
45
+
46
+ class SingleColumnLayout < Layout
47
+ def initialize(contents)
48
+ super(contents, [1], 1)
49
+ end
50
+
51
+ private
52
+
53
+ def chunk_size
54
+ 1
55
+ end
56
+
57
+ def get_chunks(_chunk_size)
58
+ @contents.each_slice(1)
59
+ end
60
+ end
61
+
62
+ class HorizontalLayout < Layout
63
+ private
64
+
65
+ def column_widths(mid)
66
+ max_widths = @max_widths.each_slice(mid).to_a
67
+ last_size = max_widths.last.size
68
+ max_widths.last.fill(0, last_size, max_widths.first.size - last_size)
69
+ [mid, max_widths.transpose.map!(&:max)]
70
+ end
71
+
72
+ def get_chunks(chunk_size)
73
+ @contents.each_slice(chunk_size)
74
+ end
75
+ end
76
+
77
+ class VerticalLayout < Layout
78
+ private
79
+
80
+ def column_widths(mid)
81
+ chunk_size = (@max_widths.size.to_f / mid).ceil
82
+ [chunk_size, @max_widths.each_slice(chunk_size).map(&:max).to_a]
83
+ end
84
+
85
+ def get_chunks(chunk_size)
86
+ columns = @contents.each_slice(chunk_size).to_a
87
+ columns.last[chunk_size - 1] = nil if columns.last.size < chunk_size
88
+ columns.transpose
89
+ end
90
+ end
91
+ end
data/man/colorls.1 CHANGED
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "COLORLS" "1" "March 2019" "colorls 1.2.0" "colorls Manual"
4
+ .TH "COLORLS" "1" "July 2019" "colorls 1.2.0" "colorls Manual"
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBcolorls\fR \- list directory contents with colors and icons
@@ -48,7 +48,7 @@ show brief report
48
48
  .
49
49
  .TP
50
50
  \fB\-\-format\fR
51
- use format: accross (\-x), horizontal (\-x), long (\-l), single\-column (\-1)
51
+ use format: across (\-x), horizontal (\-x), long (\-l), single\-column (\-1), vertical (\-C)
52
52
  .
53
53
  .TP
54
54
  \fB\-1\fR
@@ -59,12 +59,16 @@ list one file per line
59
59
  use a long listing format
60
60
  .
61
61
  .TP
62
+ \fB\-\-tree\fR
63
+ shows tree view of the directory
64
+ .
65
+ .TP
62
66
  \fB\-x\fR
63
67
  list entries by lines instead of by columns
64
68
  .
65
69
  .TP
66
- \fB\-\-tree\fR
67
- shows tree view of the directory
70
+ \fB\-C\fR
71
+ list entries by columns instead of by lines
68
72
  .
69
73
  .TP
70
74
  \fB\-\-sd\fR, \fB\-\-sort\-dirs\fR, \fB\-\-group\-directories\-first\fR
data/zsh/_colorls CHANGED
@@ -15,12 +15,13 @@ _arguments -s -S \
15
15
  "--gs[show git status for each file]" \
16
16
  "--git-status[show git status for each file]" \
17
17
  "--report[show brief report]" \
18
- "--format[use format: accross (-x), horizontal (-x), long (-l), single-column (-1)]" \
18
+ "--format[use format: across (-x), horizontal (-x), long (-l), single-column (-1), vertical (-C)]" \
19
19
  "-1[list one file per line]" \
20
20
  "-l[use a long listing format]" \
21
21
  "--long[use a long listing format]" \
22
- "-x[list entries by lines instead of by columns]" \
23
22
  "--tree[shows tree view of the directory]" \
23
+ "-x[list entries by lines instead of by columns]" \
24
+ "-C[list entries by columns instead of by lines]" \
24
25
  "--sd[sort directories first]" \
25
26
  "--sort-dirs[sort directories first]" \
26
27
  "--group-directories-first[sort directories first]" \
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: colorls
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1.pre.600
4
+ version: 1.2.1.pre.603
5
5
  platform: ruby
6
6
  authors:
7
7
  - Athitya Kumar
@@ -283,6 +283,7 @@ files:
283
283
  - lib/colorls/fileinfo.rb
284
284
  - lib/colorls/flags.rb
285
285
  - lib/colorls/git.rb
286
+ - lib/colorls/layout.rb
286
287
  - lib/colorls/monkeys.rb
287
288
  - lib/colorls/version.rb
288
289
  - lib/colorls/yaml.rb