mirror of
https://github.com/alacritty/alacritty.git
synced 2024-11-18 13:55:23 -05:00
Change default URL launchers
The default configuration has been altered to use `xdg-open` to launch URLs on linux and `open` to do so on macOS. This should allow clicking on links by default on most systems. Some changes which were made to the reverse grid iterator have also been reverted. Alacritty also doesn't crash anymore when the program specified as `url_launcher` isn't installed on the system. Instead it will print a warning to the log.
This commit is contained in:
parent
078f91b162
commit
958a4326a2
7 changed files with 38 additions and 33 deletions
|
@ -263,10 +263,7 @@ mouse:
|
||||||
#
|
#
|
||||||
# This program is executed when clicking on a text which is recognized as a URL.
|
# This program is executed when clicking on a text which is recognized as a URL.
|
||||||
# The URL is always added to the command as the last parameter.
|
# The URL is always added to the command as the last parameter.
|
||||||
#url_launcher:
|
url_launcher: xdg-open
|
||||||
# program: /usr/bin/firefox
|
|
||||||
# args:
|
|
||||||
# - --new-tab
|
|
||||||
|
|
||||||
selection:
|
selection:
|
||||||
semantic_escape_chars: ",│`|:\"' ()[]{}<>"
|
semantic_escape_chars: ",│`|:\"' ()[]{}<>"
|
||||||
|
|
|
@ -261,10 +261,7 @@ mouse:
|
||||||
#
|
#
|
||||||
# This program is executed when clicking on a text which is recognized as a URL.
|
# This program is executed when clicking on a text which is recognized as a URL.
|
||||||
# The URL is always added to the command as the last parameter.
|
# The URL is always added to the command as the last parameter.
|
||||||
#url_launcher:
|
url_launcher: open
|
||||||
# program: /usr/bin/firefox
|
|
||||||
# args:
|
|
||||||
# - --new-tab
|
|
||||||
|
|
||||||
selection:
|
selection:
|
||||||
semantic_escape_chars: ",│`|:\"' ()[]{}<>"
|
semantic_escape_chars: ",│`|:\"' ()[]{}<>"
|
||||||
|
|
30
src/event.rs
30
src/event.rs
|
@ -13,7 +13,7 @@ use copypasta::{Clipboard, Load, Store, Buffer as ClipboardBuffer};
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
use ansi::{Handler, ClearMode};
|
use ansi::{Handler, ClearMode};
|
||||||
use grid::Scroll;
|
use grid::{Scroll, BidirectionalIterator};
|
||||||
use config::{self, Config};
|
use config::{self, Config};
|
||||||
use cli::Options;
|
use cli::Options;
|
||||||
use display::OnResize;
|
use display::OnResize;
|
||||||
|
@ -21,11 +21,13 @@ use index::{Line, Column, Side, Point};
|
||||||
use input::{self, MouseBinding, KeyBinding};
|
use input::{self, MouseBinding, KeyBinding};
|
||||||
use selection::Selection;
|
use selection::Selection;
|
||||||
use sync::FairMutex;
|
use sync::FairMutex;
|
||||||
use term::{Term, SizeInfo, TermMode, Cell};
|
use term::{Term, SizeInfo, TermMode};
|
||||||
use util::limit;
|
use util::limit;
|
||||||
use util::fmt::Red;
|
use util::fmt::Red;
|
||||||
use window::Window;
|
use window::Window;
|
||||||
|
|
||||||
|
const URL_SEPARATOR_CHARS: [char; 3] = [' ', '"', '\''];
|
||||||
|
|
||||||
/// Byte sequences are sent to a `Notify` in response to some events
|
/// Byte sequences are sent to a `Notify` in response to some events
|
||||||
pub trait Notify {
|
pub trait Notify {
|
||||||
/// Notify that an escape sequence should be written to the pty
|
/// Notify that an escape sequence should be written to the pty
|
||||||
|
@ -116,18 +118,22 @@ impl<'a, N: Notify + 'a> input::ActionContext for ActionContext<'a, N> {
|
||||||
// Create forwards and backwards iterators
|
// Create forwards and backwards iterators
|
||||||
let iterf = grid.iter_from(point);
|
let iterf = grid.iter_from(point);
|
||||||
point.col += 1;
|
point.col += 1;
|
||||||
let iterb = grid.iter_from(point);
|
let mut iterb = grid.iter_from(point);
|
||||||
|
|
||||||
// Put all characters until separators into a String
|
|
||||||
let url_char = |cell: &&Cell| {
|
|
||||||
cell.c != ' ' && cell.c != '\'' && cell.c != '"'
|
|
||||||
};
|
|
||||||
|
|
||||||
|
// Put all characters until separators into a string
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
|
while let Some(cell) = iterb.prev() {
|
||||||
iterb.rev().take_while(url_char).for_each(|cell| buf.push(cell.c));
|
if URL_SEPARATOR_CHARS.contains(&cell.c) {
|
||||||
buf = buf.chars().rev().collect();
|
break;
|
||||||
iterf.take_while(url_char).for_each(|cell| buf.push(cell.c));
|
}
|
||||||
|
buf.insert(0, cell.c);
|
||||||
|
}
|
||||||
|
for cell in iterf {
|
||||||
|
if URL_SEPARATOR_CHARS.contains(&cell.c) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
buf.push(cell.c);
|
||||||
|
}
|
||||||
|
|
||||||
// Check if string is valid url
|
// Check if string is valid url
|
||||||
match Url::parse(&buf) {
|
match Url::parse(&buf) {
|
||||||
|
|
|
@ -31,6 +31,11 @@ use self::storage::Storage;
|
||||||
|
|
||||||
const MIN_INIT_SIZE: usize = 1_000;
|
const MIN_INIT_SIZE: usize = 1_000;
|
||||||
|
|
||||||
|
/// Bidirection iterator
|
||||||
|
pub trait BidirectionalIterator: Iterator {
|
||||||
|
fn prev(&mut self) -> Option<Self::Item>;
|
||||||
|
}
|
||||||
|
|
||||||
/// An item in the grid along with its Line and Column.
|
/// An item in the grid along with its Line and Column.
|
||||||
pub struct Indexed<T> {
|
pub struct Indexed<T> {
|
||||||
pub inner: T,
|
pub inner: T,
|
||||||
|
@ -469,8 +474,8 @@ impl<'a, T> Iterator for GridIterator<'a, T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T> DoubleEndedIterator for GridIterator<'a, T> {
|
impl<'a, T> BidirectionalIterator for GridIterator<'a, T> {
|
||||||
fn next_back(&mut self) -> Option<Self::Item> {
|
fn prev(&mut self) -> Option<Self::Item> {
|
||||||
let num_cols = self.grid.num_cols();
|
let num_cols = self.grid.num_cols();
|
||||||
|
|
||||||
match self.cur {
|
match self.cur {
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
//! Tests for the Gird
|
//! Tests for the Gird
|
||||||
|
|
||||||
use super::{Grid};
|
use super::{Grid, BidirectionalIterator};
|
||||||
use index::{Point, Line, Column};
|
use index::{Point, Line, Column};
|
||||||
|
|
||||||
// Scroll up moves lines upwards
|
// Scroll up moves lines upwards
|
||||||
|
@ -112,7 +112,7 @@ fn test_iter() {
|
||||||
col: Column(0),
|
col: Column(0),
|
||||||
});
|
});
|
||||||
|
|
||||||
assert_eq!(None, iter.next_back());
|
assert_eq!(None, iter.prev());
|
||||||
assert_eq!(Some(&1), iter.next());
|
assert_eq!(Some(&1), iter.next());
|
||||||
assert_eq!(Column(1), iter.cur.col);
|
assert_eq!(Column(1), iter.cur.col);
|
||||||
assert_eq!(4, iter.cur.line);
|
assert_eq!(4, iter.cur.line);
|
||||||
|
@ -126,7 +126,7 @@ fn test_iter() {
|
||||||
assert_eq!(Column(0), iter.cur.col);
|
assert_eq!(Column(0), iter.cur.col);
|
||||||
assert_eq!(3, iter.cur.line);
|
assert_eq!(3, iter.cur.line);
|
||||||
|
|
||||||
assert_eq!(Some(&4), iter.next_back());
|
assert_eq!(Some(&4), iter.prev());
|
||||||
assert_eq!(Column(4), iter.cur.col);
|
assert_eq!(Column(4), iter.cur.col);
|
||||||
assert_eq!(4, iter.cur.line);
|
assert_eq!(4, iter.cur.line);
|
||||||
|
|
||||||
|
@ -137,5 +137,5 @@ fn test_iter() {
|
||||||
col: Column(4),
|
col: Column(4),
|
||||||
});
|
});
|
||||||
assert_eq!(None, final_iter.next());
|
assert_eq!(None, final_iter.next());
|
||||||
assert_eq!(Some(&23), final_iter.next_back());
|
assert_eq!(Some(&23), final_iter.prev());
|
||||||
}
|
}
|
||||||
|
|
10
src/input.rs
10
src/input.rs
|
@ -494,11 +494,11 @@ impl<'a, A: ActionContext + 'a> Processor<'a, A> {
|
||||||
if let Some(text) = self.ctx.url(Point::new(point.line.0, point.col)) {
|
if let Some(text) = self.ctx.url(Point::new(point.line.0, point.col)) {
|
||||||
let mut args = launcher.args().to_vec();
|
let mut args = launcher.args().to_vec();
|
||||||
args.push(text);
|
args.push(text);
|
||||||
debug!("Launching: {} {:?}", launcher.program(), args);
|
match Command::new(launcher.program()).args(&args).spawn() {
|
||||||
Command::new(launcher.program())
|
Ok(_) => debug!("Launching: {} {:?}", launcher.program(), args),
|
||||||
.args(&args)
|
Err(_) => warn!("Unable to launch: {} {:?}", launcher.program(), args),
|
||||||
.spawn()
|
}
|
||||||
.expect("url launcher error");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ use unicode_width::UnicodeWidthChar;
|
||||||
|
|
||||||
use font::{self, Size};
|
use font::{self, Size};
|
||||||
use ansi::{self, Color, NamedColor, Attr, Handler, CharsetIndex, StandardCharset, CursorStyle};
|
use ansi::{self, Color, NamedColor, Attr, Handler, CharsetIndex, StandardCharset, CursorStyle};
|
||||||
use grid::{Grid, Indexed, IndexRegion, DisplayIter, Scroll, ViewportPosition};
|
use grid::{BidirectionalIterator, Grid, Indexed, IndexRegion, DisplayIter, Scroll, ViewportPosition};
|
||||||
use index::{self, Point, Column, Line, IndexRange, Contains, RangeInclusive, Linear};
|
use index::{self, Point, Column, Line, IndexRange, Contains, RangeInclusive, Linear};
|
||||||
use selection::{self, Selection, Locations};
|
use selection::{self, Selection, Locations};
|
||||||
use config::{Config, VisualBellAnimation};
|
use config::{Config, VisualBellAnimation};
|
||||||
|
@ -44,7 +44,7 @@ impl selection::SemanticSearch for Term {
|
||||||
let mut iter = self.grid.iter_from(point);
|
let mut iter = self.grid.iter_from(point);
|
||||||
let last_col = self.grid.num_cols() - Column(1);
|
let last_col = self.grid.num_cols() - Column(1);
|
||||||
|
|
||||||
while let Some(cell) = iter.next_back() {
|
while let Some(cell) = iter.prev() {
|
||||||
if self.semantic_escape_chars.contains(cell.c) {
|
if self.semantic_escape_chars.contains(cell.c) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue